#include "rtapi.h"
#include "rtapi_app.h"
#include "common.h"
static int module;
static int shmem_task;
static int shmem_mem;
enum { TIMER_PERIOD_NSEC = 1000000 };
enum { SHMEM_PERIOD_NSEC = 1000000 };
enum { SHMEM_STACKSIZE = 1024 };
static int key = SHMEM_KEY;
static SHMEM_STRUCT *shmem_struct = 0;
void shmem_code(void *arg)
{
while (1) {
if (0 != shmem_struct) {
shmem_struct->heartbeat++;
}
rtapi_wait();
}
return;
}
int rtapi_app_main(void)
{
int retval;
int shmem_prio;
long period;
module = rtapi_init("SHMEMTASK");
if (module < 0) {
rtapi_print("shmemtask init: rtapi_init returned %d\n", module);
return -1;
}
shmem_mem = rtapi_shmem_new(key, module, sizeof(SHMEM_STRUCT));
if (shmem_mem < 0) {
rtapi_print("shmemtask init: rtapi_shmem_new returned %d\n",
shmem_mem);
rtapi_exit(module);
return -1;
}
retval = rtapi_shmem_getptr(shmem_mem, (void **) &shmem_struct);
if (retval < 0) {
rtapi_print("shmemtask init: rtapi_shmem_getptr returned %d\n",
retval);
rtapi_exit(module);
return -1;
}
shmem_struct->heartbeat = 0;
period = rtapi_clock_set_period(0);
if (period == 0) {
rtapi_print("shmemtask init: starting timer with period %ld\n",
TIMER_PERIOD_NSEC);
period = rtapi_clock_set_period(TIMER_PERIOD_NSEC);
if (period < 0) {
rtapi_print
("shmemtask init: rtapi_clock_set_period failed with %ld\n",
period);
rtapi_exit(module);
return -1;
}
}
if (period > (TIMER_PERIOD_NSEC + (TIMER_PERIOD_NSEC / 100))) {
rtapi_print("shmemtask init: clock period too long: %ld\n", period);
rtapi_exit(module);
return -1;
}
rtapi_print("shmemtask init: desired clock %ld, actual %ld\n",
TIMER_PERIOD_NSEC, period);
shmem_prio = rtapi_prio_lowest();
shmem_task = rtapi_task_new(shmem_code, 0 , shmem_prio, module,
SHMEM_STACKSIZE, RTAPI_NO_FP);
if (shmem_task < 0) {
rtapi_print("shmemtask init: rtapi_task_new returned %d\n",
shmem_task);
rtapi_exit(module);
return -1;
}
retval = rtapi_task_start(shmem_task, SHMEM_PERIOD_NSEC);
if (retval < 0) {
rtapi_print("shmemtask init: rtapi_task_start returned %d\n", retval);
rtapi_exit(module);
return -1;
}
rtapi_print("shmemtask init: started shmem task\n");
return 0;
}
void rtapi_app_exit(void)
{
int retval;
if (0 != shmem_struct) {
rtapi_print("shmemtask exit: heartbeat is %u\n",
shmem_struct->heartbeat);
}
retval = rtapi_task_pause(shmem_task);
if (retval < 0) {
rtapi_print("shmemtask exit: rtapi_task_stop returned %d\n", retval);
}
retval = rtapi_task_delete(shmem_task);
if (retval < 0) {
rtapi_print("shmemtask exit: rtapi_task_delete returned %d\n",
retval);
}
retval = rtapi_shmem_delete(shmem_mem, module);
if (retval < 0) {
rtapi_print("shmemtask exit: rtapi_shmem_delete returned %d\n",
retval);
}
rtapi_exit(module);
}