#include "rtapi.h"
#include "rtapi_app.h"
#include "common.h"
static int module;
static int master_sem;
static int master_task;
static unsigned int master_count = 0;
enum { TIMER_PERIOD_NSEC = 10000000 };
enum { MASTER_PERIOD_NSEC = 1000000000 };
enum { MASTER_STACKSIZE = 1024 };
void master_code(void *arg)
{
while (1) {
rtapi_print("master: giving semaphore, count = %d\n", master_count);
rtapi_sem_give(master_sem);
rtapi_print("master: gave semaphore, count = %d\n", master_count);
master_count++;
rtapi_wait();
}
return;
}
int rtapi_app_main(void)
{
int retval;
int master_prio;
long period;
module = rtapi_init("SEM_MASTER");
if (module < 0) {
rtapi_print("sem master init: rtapi_init returned %d\n", module);
return -1;
}
master_sem = rtapi_sem_new(SEM_KEY, module);
if (master_sem < 0) {
rtapi_print("sem master init: rtapi_sem_new returned %d\n",
master_sem);
rtapi_exit(module);
return -1;
}
period = rtapi_clock_set_period(0);
if (period == 0) {
rtapi_print("sem master init: starting timer with period %ld\n",
TIMER_PERIOD_NSEC);
period = rtapi_clock_set_period(TIMER_PERIOD_NSEC);
if (period < 0) {
rtapi_print
("sem master 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("sem master init: clock period too long: %ld\n", period);
rtapi_exit(module);
return -1;
}
rtapi_print("sem master init: desired clock %ld, actual %ld\n",
TIMER_PERIOD_NSEC, period);
master_prio = rtapi_prio_next_higher(rtapi_prio_lowest());
master_task =
rtapi_task_new(master_code, 0 , master_prio, module,
MASTER_STACKSIZE, RTAPI_NO_FP);
if (master_task < 0) {
rtapi_print("sem master init: rtapi_task_new returned %d\n",
master_task);
rtapi_exit(module);
return -1;
}
retval = rtapi_task_start(master_task, MASTER_PERIOD_NSEC);
if (retval < 0) {
rtapi_print("sem master init: rtapi_task_start returned %d\n",
retval);
rtapi_exit(module);
return -1;
}
rtapi_print("sem master init: started master task\n");
return 0;
}
void rtapi_app_exit(void)
{
int retval;
retval = rtapi_task_pause(master_task);
if (retval < 0) {
rtapi_print("sem master exit: rtapi_task_stop returned %d\n", retval);
}
retval = rtapi_task_delete(master_task);
if (retval < 0) {
rtapi_print("sem master exit: rtapi_task_delete returned %d\n",
retval);
}
retval = rtapi_sem_delete(master_sem, module);
if (retval < 0) {
rtapi_print("sem master exit: rtapi_sem_delete returned %d\n",
retval);
}
rtapi_print("sem master exit: master count is %d\n", master_count);
rtapi_exit(module);
}