/*
   Project  : Приём данных по радио-каналу
	 Version  : 1
	 Date     : 16.10.2023
	 Author   : Sergey
	 Chip     : AVR
	 Comments : 
	 						InitRTOS
	 						Функция инициализации RTOS должна быть вызвана до остальных функций.
	 						
	 						TaskManager
	 						Функция диспетчер задач
	 						Вызывать в функции main в бесконечном цикле.
	 						
	 						TimerService
	 						Функция таймерная служба. Обслуживает очередь таймеров. 
	 						Вызывать в прерывании каждую 1 миллисекунду.
	 						
	 						SetTask
	 						Функция постановщик в очередь задач.
	 						Если очередь переполнена то это фиксируется в EEPROM памяти.
	 						Входные параметры:
	 							TPTR Task - Задача (любая пользовательская функция)
	 						
	 						SetTimerTask
	 						Функция устанавливающая задачу в очередь по таймеру.
							Входные параметры:
								TPTR         Task    - Задача (любая пользовательская функция)
							  unsigned int NewTime - Новое время, которое нужно отсчитать
							Описание:
		 						На входе адрес перехода (имя задачи) и время в тиках службы 
		 						таймера — миллисекундах.
		 						Если в очереди таймеров уже есть таймер с такой задачей, 
		 						то происходит апдейт времени.
		 						Если не находим, то втыкаем данные в первую свободную ячейку. 
		 						Две одинаковых задачи в очереди таймеров не возможны. 
		 						Если очередь переполнена то это фиксируется в EEPROM памяти.  
							
						  DeleteTask
						  Функция отмены задачи
						  Входные параметры:
	 	 						TPTR Task - Задача (функция) которую нужно отменить
	 	 					Описание:
	 	 					Функция отменяет задачу из очереди задач и таймеров
	 
*/

#ifndef RTOS_INCLUDED
#define RTOS_INCLUDED

// Функции управления питанием
#include <sleep.h> 

// Здесь можно менять значения настроек ----------------------------------------------------
// Предельное число задач в очереди
#define TASK_QUEUE_SIZE        2
// Предельное число таймеров в очереди
#define SOFT_TIMER_QUEUE_SIZE  2
//------------------------------------------------------------------------------------------  

typedef void (*TPTR)(void); // Указатель без типа. Просто адрес
/*
   Эта директива запрещает компилятору выдавать предупреждения о том, 
    что функция объявлена, но в программе не используется.
*/
#pragma used+

// Прототипы функций --------------------------------
void InitRTOS(void);
void TaskManager(void);
void TimerService(void);
void SetTask(TPTR Task);
void SetTimerTask(TPTR Task, unsigned int NewTime); 
void DeleteTask(TPTR Task);                        
//---------------------------------------------------

/* 
   Эта директива разрешает компилятору выдавать предупреждения о том, 
    что функция объявлена, но в программе не используется.
*/
#pragma used-
#endif 