#include "rtapi.h"
#include "rtapi_app.h"
#include "common.h"
static int module;
static int fifo_task;
static int fifo;
enum { TIMER_PERIOD_NSEC = 10000000 };
enum { FIFO_PERIOD_NSEC = 1000000000 };
enum { FIFO_STACKSIZE = 2048 };
static int count = 0;
static int len = 0;
static int total = 0;
void fifo_code(void *arg)
{
int n, tmp;
char buffer[FIFO_SIZE + 1] = { '\n' };
while (1) {
tmp = count;
for (n = 0; n < 3; n++) {
buffer[2 - n] = (char) ('0' + (tmp % 10));
tmp /= 10;
}
buffer[3] = ':';
for (n = 0; n < len; n++) {
buffer[4 + n] = (char) ('0' + len);
}
rtapi_fifo_write(fifo, buffer, len + 4);
total += len + 4;
buffer[4 + n] = (char) '\0';
rtapi_print_msg(2, "fifotask: total %d, wrote '%s'\n", total, buffer);
count++;
len++;
if (len > 9)
len = 0;
rtapi_wait();
}
return;
}
int rtapi_app_main(void)
{
int retval;
int fifo_prio;
long period;
module = rtapi_init("FIFOTASK");
if (module < 0) {
rtapi_print("fifotask init: rtapi_init failed with %d\n", module);
return -1;
}
fifo = rtapi_fifo_new(FIFO_KEY, module, FIFO_SIZE, 'W');
if (fifo < 0) {
rtapi_print("fifotask init: rtapi_fifo_new failed with %d\n", fifo);
rtapi_exit(module);
return -1;
}
rtapi_print("fifotask: created fifo\n");
period = rtapi_clock_set_period(0);
if (period == 0) {
rtapi_print("fifotask init: starting timer with period %ld\n",
TIMER_PERIOD_NSEC);
period = rtapi_clock_set_period(TIMER_PERIOD_NSEC);
if (period < 0) {
rtapi_print
("fifotask 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("fifotask init: clock period too long: %ld\n", period);
rtapi_exit(module);
return -1;
}
rtapi_print("fifotask init: desired clock %ld, actual %ld\n",
TIMER_PERIOD_NSEC, period);
fifo_prio = rtapi_prio_lowest();
fifo_task = rtapi_task_new(fifo_code, 0 , fifo_prio, module,
FIFO_STACKSIZE, RTAPI_NO_FP);
if (fifo_task < 0) {
rtapi_print("fifotask init: rtapi_task_new failed with %d\n",
fifo_task);
rtapi_exit(module);
return -1;
}
retval = rtapi_task_start(fifo_task, FIFO_PERIOD_NSEC);
if (retval < 0) {
rtapi_print("fifotask init: rtapi_task_start failed with %d\n",
retval);
rtapi_exit(module);
return -1;
}
rtapi_print("fifotask: started fifo task\n");
return 0;
}
void rtapi_app_exit(void)
{
int retval;
retval = rtapi_task_pause(fifo_task);
if (retval < 0) {
rtapi_print("fifotask exit: rtapi_task_stop failed with %d\n",
retval);
}
retval = rtapi_task_delete(fifo_task);
if (retval < 0) {
rtapi_print("fifotask exit: rtapi_task_delete failed with %d\n",
retval);
}
retval = rtapi_fifo_delete(fifo, module);
if (retval < 0) {
rtapi_print("fifotask exit: rtapi_fifo_delete failed with %d\n",
retval);
}
rtapi_print("fifotask exit: done\n");
rtapi_exit(module);
}