#include <sys/mman.h>
#include <fcntl.h>
#define HARD_LXRT
#define KEEP_STATIC_INLINE
#include <rtai_lxrt_user.h>
#include <rtai_lxrt.h>

#include <sys/mman.h>
#include "lxrt_wrapper.h"

int
create_ui_task(void)
{
  RT_TASK *mytask;
  
  //mytask= rt_task_init_schmod(nam2num(UI_TASK), 1, 0, 0, SCHED_FIFO, 0);
  mytask= rt_task_init(nam2num(UI_TASK), 1, 0, 0);
  if(!mytask)
  {
    printf("No se puede crear el task de interfaz\n");
    return 1;
  }
  //mlockall(MCL_CURRENT | MCL_FUTURE);
  return 0;
}

int
create_mbxs(void)
{
  MBX *period_mbx;
  MBX *data_mbx;
  MBX *stop_mbx;
  MBX *input_mbx;
  
  period_mbx= rt_mbx_init(nam2num(PERIOD_MBX), MBX_SIZE);
  if(!period_mbx)
  {
    printf("No se puede crear mailbox PERIOD_MBX\n");
    return 1;
  }
  input_mbx= rt_mbx_init(nam2num(INPUT_MBX), MBX_SIZE);
  if(!input_mbx)
  {
    printf("No se puede crear mailbox INPUT_MBX\n");
    rt_mbx_delete(period_mbx);
    return 1;
  }
  stop_mbx= rt_mbx_init(nam2num(STOP_MBX), MBX_SIZE);
  if(!stop_mbx)
  {
    printf("No se puede crear mailbox STOP_MBX\n");
    rt_mbx_delete(period_mbx);
    rt_mbx_delete(input_mbx);
    return 1;
  }
  data_mbx= rt_mbx_init(nam2num(DATA_MBX), MBX_SIZE);
  if(!data_mbx)
  {
    printf("No se puede crear mailbox DATA_MBX\n");
    rt_mbx_delete(period_mbx);
    rt_mbx_delete(input_mbx);
    rt_mbx_delete(stop_mbx);
    return 1;
  }
  return 0;
}

void
start_timer(void)
{
  rt_set_oneshot_mode();
  start_rt_timer(0);
}

int
wait_control_task(void)
{
  int cnt= 0, msg;
  
  while(!exist(CONTROL_TASK) && cnt < 500)
  {
    rt_sleep(nano2count(20000000));
    ++cnt;
  }
  if(!exist(CONTROL_TASK))
    return 1;
  rt_receive(exist(CONTROL_TASK), &msg);
  return 0;
}

unsigned char
exist_control(void)
{
  return exist(CONTROL_TASK)? 1: 0;
}

int
mbx_receive(const char* mbx, void *data, int size)
{
  return rt_mbx_receive(exist(mbx), data, size);
}

int
mbx_send(const char* mbx, void *data, int size)
{
  return rt_mbx_send(exist(mbx), data, size);
}

void
stop_timer(void)
{
  stop_rt_timer();
}

void
delete_task(void)
{
  if(exist(PERIOD_MBX))
    rt_mbx_delete(exist(PERIOD_MBX));
  if(exist(INPUT_MBX))
    rt_mbx_delete(exist(INPUT_MBX));
  if(exist(STOP_MBX))
    rt_mbx_delete(exist(STOP_MBX));
  if(exist(DATA_MBX))
    rt_mbx_delete(exist(DATA_MBX));
  rt_task_delete(exist(UI_TASK));
}

void
task_sleep(unsigned int ns)
{
  rt_sleep(ns);
}
     

void
set_nonroot_mode()
{
  rt_allow_nonroot_hrt();
}
