/******************************************************************************************
 * За основу взят планировщик задач с сайта ChipEnable.ru                                 *
 * http://chipenable.ru/index.php/programming-avr/item/110-planirovschik.html             *
 *                                                                                        *
 * Доработал Шибанов Владимир aka KontAr                                                  *
 * Дата: 26.03.2014                                                                       *
 *                                                                                        *
 * Изменения:                                                                             *
 * - добавлен однократный вызов задачи                                                    *
 * - добавлено удаление задачи по имени                                                   *
 * - при повторном добавлении задачи обновляются ее переменные                            *
 * - добавлен указатель на "хвост" списка                                                 *
 * - функции РТОС скорректированы с учетом "хвоста"                                       *
 ******************************************************************************************
 * shilov, 2015.04.07									  *
 * совместил с модулем милисекундных задержек на таймере				  *
 ******************************************************************************************/

#ifndef __RTOS_H
#define __RTOS_H

#include <ioavr.h>
#include <intrinsics.h>
#include <stdint.h>

// Количество задач
#define MAX_TASKS               10

/**
 * Будем использовать второй таймер, период -- 1 мсек
 */
#define TIMER_HZ		1000
#define TIMER_PRESCALER         64
#define	TIMER_CNT		(0x100 - (F_CPU / TIMER_PRESCALER / TIMER_HZ))

#define TIMER_TCCR		TCCR2
#define TIMER_TCNT		TCNT2
#define TIMER_TIMSK		TIMSK
#define TIMER_CSB		(1<<CS22)
#define TIMER_INT		(1<<TOV2)
#define TIMER_OVF_VECT          TIMER2_OVF_vect

/**
 * Структура задачи
 */
typedef struct task
{
   void (*pFunc) (void); // указатель на функцию
   uint16_t delay;       // задержка перед первым запуском задачи
   uint16_t period;      // период запуска задачи
   uint8_t run;          // флаг готовности задачи к запуску
} task;

/**
 * Прототипы фукнций
 */
void RTOS_Init (void);
void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod);
void RTOS_DeleteTask (void (*taskFunc)(void));
void RTOS_DispatchTask (void);
void RTOS_Timer (void);

void tdelay_ms(uint16_t msek);

#endif // __RTOS_H
