#ifndef _LIBRARIES_H_
#define _LIBRARIES_H_

#include <stddef.h>

/*****************************************************************************************************

	isObjectInit			Флаг инициализации объекта унаследованного класса.

	isLibrarieInit			Флаг инициализации библиотеки (наследника базового класса)

	Librarie_Init()	-		Функция инициализации всех классов наследников.
							Для каждого унаследованного класса перебирает все виртуальные методы его объектов Init()
	Librarie_Timer1ms()	-	Функция привязки к времени для всех классов наследников.
	 	 	 	 	 	 	Для каждого унаследованного класса перебирает все виртуальные методы его объектов Timer1ms()
	Librarie_Main()	-		Функция выполнения кода основного тела программы для всех классов наследников.
	 	 	 	 	 	 	Для каждого унаследованного класса перебирает все виртуальные методы его объектов Timer1ms()

	Init()			- 		Размещения исполняемого кода обработки объектов унаследованных классов в зоне инициализации
	Main()			- 		Размещения исполняемого кода обработки объектов унаследованных классов в основном цикле программы
	Timer1ms()		- 		Размещения исполняемого кода обработки объектов унаследованных классов в таймере 1ms
	AdcIsr()		- 		Размещения исполняемого кода обработки объектов унаследованных классов в прерывании АЦП

							Все виртуальные функции являются уникальными для любых объектов наследованных классов,
							однако интерфейс вызова у все один через указатель на родительский класс

	isPointersSet - 		Является статическим, тоесть одним на все объкты класса наследника.
							Устанавливается в единицу после привязки переменных класса к таблицам ModBus

	GlobalData 	- 			Является статическим, тоесть одним на все объкты класса наследника.
							Для родительского класса хранит глобальные указатели на начала областей данных ModBus
							При наследовании класса хранит в классе потомке его адреса привязки к областям данных ModBus
							Необходимо в статическом методе менять GlobalData родительского объекта для последующего
							корректного наследования другими библиотеками.

	Count				-	Является статическим, тоесть одним на все объкты класса наследника.
							Для родительского класса

	PreviousObject_ptr -   	Хранит в себе указатель на предыдущий созданный объект конкретного наследованного класса

	Data				-	Набор указателей на пямть ModBus для конкретного обхекта класса

	PointersSet			- 	Является статическим, тоесть одним на все объкты класса наследника.
							Процедура задания адресов для привязки библиотеки к регистрам ModBus.
							Вызываясь из родительской библиотеки - задает шлобальное адресное пространство для всех библиотек
							Вызываясь из класса наследника - переопределяет автоматически выделенные адреса родительским классом

 *****************************************************************************************************/

#ifdef __cplusplus

			//TODO Для каждой библиотеки задавать адреса их областей данных в ModBus и создавать свой собственный массив данных
			//TODO Создать отдельную область в памяти где храняться значения по умолчанию
			//TODO Для каждого наследника в библиотеке задавать определенный адрес

class Libraries
{
	protected:
	static bool				isLibrarieInit;
	static Libraries		*FirstObject_ptr;
	static Libraries		*NextLibrarie_ptr;

	virtual	void Init(void);
	virtual void Main(void);
	virtual void Timer1ms(void);
	virtual void AdcIsr(void);

	Libraries		*NextObject_ptr;

	private:
	static void Librarie_Init();
	static void Librarie_Timer1ms();
	static void Librarie_Main();
	static void Librarie_AdcIsr();

	public:
	Libraries();
};


#endif

#endif /* SOURCE_FILES_LIBRARIES_H_ */
