#include <linux/kernel.h>
#include <linux/module.h>

#include <native/sem.h>
#include <rtdm/rtdm_driver.h>


#define SEM_NAME  "SEMTIM"

#define TIMER_PERIOD_NSEC	1000000

#define PERIODIC_TASK_PRIO	RTDM_TASK_HIGHEST_PRIORITY
#define PERIODIC_TASK_NAME	"T_PER"
#define PERIODIC_STACK_SIZE	8192

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Timer module");

static rtdm_task_t tPeriodicTask;

RT_SEM sSchedSem;

static void SwTimerHandler(void* dummy)
{
	
	printk(KERN_INFO "Starting %s\n", __FUNCTION__);
	
	while (1)
	{
	    if( rtdm_task_wait_period() == -ETIMEDOUT ) printk(KERN_WARNING "schedule overrun detected!\n");
		rt_sem_v(&sSchedSem);
	}
}


int init_module (void)
{
	int ErrCode;

	ErrCode = rt_sem_create(&sSchedSem, SEM_NAME, 0, S_FIFO);
	if ( ErrCode != 0)
	{
		printk(KERN_ERR "Error creating main semaphore %d!\n",ErrCode);
	}

	if (rtdm_task_init(&tPeriodicTask, PERIODIC_TASK_NAME, &SwTimerHandler, NULL, PERIODIC_TASK_PRIO, TIMER_PERIOD_NSEC) == 0)
	{
		printk(KERN_INFO "Periodic Thread created!");
	}

	return 0;
}

void cleanup_module (void)
{
	rtdm_task_destroy(&tPeriodicTask);

	rt_sem_delete(&sSchedSem);
	
	printk (KERN_INFO "Timer removed\n" );
}

