<commit_before>/* $Id: SharedMemory.h,v 1.2 2009/01/22 02:11:24 vpashka Exp $ */
// -----------------------------------------------------------------------------
#ifndef SharedMemory_H_
#define SharedMemory_H_
// -----------------------------------------------------------------------------
#include <string>
#include <list>
#include "IONotifyController_LT.h"
#include "Mutex.h"
#include "PassiveTimer.h"
#include "NCRestorer.h"
#include "WDTInterface.h"
// -----------------------------------------------------------------------------

/*! \page page_SharedMemory Реализация разделямой между процессами памяти (SharedMemory)


      \section sec_SM_Common Задачи решаемые объектом SharedMemory
      
	Класс SharedMemory расширяет набор задач класса IONotifyController.
	Для ознакомления с базовыми функциями см. \ref page_IONotifyController

	Задачи решаемые SM:
	- \ref sec_SM_Conf
	- \ref sec_SM_Event
	- \ref sec_SM_HeartBeat
	- \ref sec_SM_History
	- \ref sec_SM_Pulsar
	- \ref sec_SM_DBLog

	\section sec_SM_Conf Определение списка регистрируемых датчиков
	  SM позволяет определять список датчиков, которые он будет предоставлять
	  для работы другим объектам. Помимо этого можно задавать фильтрующие поля
	  для списка "заказчиков"(consumer) по каждому датчику, а также
	  поля для фильтрования списка зависимостей(depends) по датчикам.
	  Все эти параметры задаются в командной строке

	 \par Фильтрование списка регистрируемых датчиков
	  \code
	    --s-filter-field   - задаёт фильтрующее поле для датчиков
	    --s-filter-value   - задаёт значение фильтрующего поля. Необязательный параметр.
	  \endcode
	Пример файла настроек:
	\code
	  <sensors>
	    ...
	    <item id="12" name="Sensor12" textname="xxx" .... myfilter="m1" ...>
	      <consumers>
		    <item name="Consumer1" type="object" mycfilter="c1" .../>
	      </consumers>
	    </item>  
	    ...
	    <item id="121" name="Sensor121" textname="xxx" .... myfilter="m1" ...>
	      <consumers>
		    <item name="Consumer1" type="object" mycfilter="c1" .../>
	      </consumers>
	    </item>  
	    ...
	  </sensors>
	\endcode
	Для того, чтобы SM зарегистрировало на себя датчики 12 и 121 необходимо
	указать \b --s-filter-field myfilter \b --s-filter-value m1.
	
	\par Фильтрование заказчиков (consumer)
	  \code
	    --с-filter-field   - задаёт фильтрующее поле для заказчиков (consumer)
	    --с-filter-value   - задаёт значение фильтрующего поля. Необязательный параметр.
	  \endcode
	Если задать \b --c-filter-field mycfilter \b --c-filter-value c1, то при загрузке
	SM внесёт в список заказчиков, только те объекты, у которых будет указан параметрах
	\a mycfilter="c1".
	
	\par Фильтрование зависимостей (depends)
	  \code
	    --d-filter-field   - задаёт фильтрующее поле для "зависимостей" (depends)
	    --d-filter-value   - задаёт значение фильтрующего поля. Необязательный параметр.
	  \endcode
	В SM реализован механизм позволяющий задавать зависимости между датчиками. Т.е. датчик
	будет равен "0" пока разрешающий датчик не будет равено "1". Ниже показан пример конфигурирования
	зависимости.
	\code
	  <item id="20050" iotype="AI" name="Sensor1"" textname="Зависящий датчик 1">
		<consumers>
			<consumer name="Consumer1" type="objects"/>
		</consumers>
		<depends>
			<depend block_invert="1" name="Node_Not_Respond_FS"/>
		</depends>
	</item>
	\endcode
	В данном примере Sensor1 зависит от значения датчика Node_Not_Respond_FS. При этом значение блокировки
	инвертировано (block_invert=1). Т.е. если Node_Not_Respond=0, то Sensor1 - будет равен своему реальному
	значению. Как только Node_Not_Respond_FS станет равен 1, зависящий от него датчик Sensor1 сбросится в "0".
    Описание зависимости производится в секции <depends>. Возможные поля:
    \code
	  block_invert - инвертировать "разрешающий" датчик
    \endcode
    На данный момент зависиомсть можно устанавливать только на дискретные датчики.
	
		
	\note Если поле \b --X-filter-value не указано будут загружены все датчики(заказчики,зависимости)
	у которых поле \b --X-filter-field не пустое.
	\note Если не указывать параметры \b --X-filter-field - то в SM будут загружен ВЕСЬ список 
	датчиков(заказчиков, зависимостей) из секции <sensors>.
	
	
	\section sec_SM_Event Уведомление о рестарте SM
	В SM реализован механизм позволяющий задавать список объетов,
	которым присылается уведомление о старте/рестарте SM.
	Параметр определяющий фильтр, по которому формируется список объектов
	задаётся из командной строки \b --e-filter. 
	Параметр \b --e-startup-pause msec - задаёт паузу после старта SM,
	после которой заданным объектам посылается уведомление.
	Чтобы указать объект которому необходимо присылать уведомление,
	необходимо для него в конфигурайионном файле указать поле 
	\b evnt_xxx="1", где \b xxx - имя заданное в качестве параметра 
	\b --e-filter.
	Пример:
	\code
	<objects>
	  ...
	  <item id="2342" name="MyObject" ... evnt_myfilter="1" ../>
	</objects>
	\endcode
	При это в параметрах старта SM должно быть указано \b --e-filter myfilter.
	Тогда при своём старте SM пришлёт объекту с идентификатором 2342 уведомление.
	
	В качестве уведомления объектам рассылается сообщение \b SystemMessage::WatchDog.

		
	\section sec_SM_HeartBeat Слежение за "живостью" объектов
	
	  Слежение за специальными датчиками (инкремент специальных датчиков),
	  а также выставление дискретных датчиков "живости" процессов.
	  ...
	  ...
	  

	\section sec_SM_History Механизм аварийного дампа
	"Аварийный дамп" представляет из себя набор циклических буферов
	(размер в количестве точек хранения задаётся через конф. файл),
	в которых сохраняется история изменения заданного набора датчиков.
	В качестве "детонатора" задаётся идентификатор датчика (если
	это аналоговый датчик, то задаётся значение) при котором накопленный аварийный
	дамп должен "сбрасываться". За сохранение накопленного дампа (при "сбросе")
	отвечает разработчик, который может обрабатывать это событие подключившись
	к сигналу SharedMemory::signal_history(). Количество циклических буферов
	не ограничено, размер, а также список датчиков по которым ведётся "история"
	также не ограничены.
	Настройка параметров дампа осуществляется через конф. файл. Для этого<commit_msg>чуть подправил описание зависимостей<commit_after>/* $Id: SharedMemory.h,v 1.2 2009/01/22 02:11:24 vpashka Exp $ */
// -----------------------------------------------------------------------------
#ifndef SharedMemory_H_
#define SharedMemory_H_
// -----------------------------------------------------------------------------
#include <string>
#include <list>
#include "IONotifyController_LT.h"
#include "Mutex.h"
#include "PassiveTimer.h"
#include "NCRestorer.h"
#include "WDTInterface.h"
// -----------------------------------------------------------------------------

/*! \page page_SharedMemory Реализация разделямой между процессами памяти (SharedMemory)


      \section sec_SM_Common Задачи решаемые объектом SharedMemory
      
	Класс SharedMemory расширяет набор задач класса IONotifyController.
	Для ознакомления с базовыми функциями см. \ref page_IONotifyController

	Задачи решаемые SM:
	- \ref sec_SM_Conf
	- \ref sec_SM_Event
	- \ref sec_SM_Depends
	- \ref sec_SM_HeartBeat
	- \ref sec_SM_History
	- \ref sec_SM_Pulsar
	- \ref sec_SM_DBLog

	\section sec_SM_Conf Определение списка регистрируемых датчиков
	  SM позволяет определять список датчиков, которые он будет предоставлять
	  для работы другим объектам. Помимо этого можно задавать фильтрующие поля
	  для списка "заказчиков"(consumer) по каждому датчику, а также
	  поля для фильтрования списка зависимостей(depends) по датчикам.
	  Все эти параметры задаются в командной строке

	 \par Фильтрование списка регистрируемых датчиков
	  \code
	    --s-filter-field   - задаёт фильтрующее поле для датчиков
	    --s-filter-value   - задаёт значение фильтрующего поля. Необязательный параметр.
	  \endcode
	Пример файла настроек:
	\code
	  <sensors>
	    ...
	    <item id="12" name="Sensor12" textname="xxx" .... myfilter="m1" ...>
	      <consumers>
		    <item name="Consumer1" type="object" mycfilter="c1" .../>
	      </consumers>
	    </item>  
	    ...
	    <item id="121" name="Sensor121" textname="xxx" .... myfilter="m1" ...>
	      <consumers>
		    <item name="Consumer1" type="object" mycfilter="c1" .../>
	      </consumers>
	    </item>  
	    ...
	  </sensors>
	\endcode
	Для того, чтобы SM зарегистрировало на себя датчики 12 и 121 необходимо
	указать \b --s-filter-field myfilter \b --s-filter-value m1.
	
	\par Фильтрование заказчиков (consumer)
	  \code
	    --с-filter-field   - задаёт фильтрующее поле для заказчиков (consumer)
	    --с-filter-value   - задаёт значение фильтрующего поля. Необязательный параметр.
	  \endcode
	Если задать \b --c-filter-field mycfilter \b --c-filter-value c1, то при загрузке
	SM внесёт в список заказчиков, только те объекты, у которых будет указан параметрах
	\a mycfilter="c1".
	
	\par Фильтрование зависимостей (depends)
	  \code
	    --d-filter-field   - задаёт фильтрующее поле для "зависимостей" (depends)
	    --d-filter-value   - задаёт значение фильтрующего поля. Необязательный параметр.
	  \endcode
		
	\note Если поле \b --X-filter-value не указано будут загружены все датчики(заказчики,зависимости)
	у которых поле \b --X-filter-field не пустое.
	\note Если не указывать параметры \b --X-filter-field - то в SM будут загружен ВЕСЬ список 
	датчиков(заказчиков, зависимостей) из секции <sensors>.
	
	
	\section sec_SM_Event Уведомление о рестарте SM
	В SM реализован механизм позволяющий задавать список объетов,
	которым присылается уведомление о старте/рестарте SM.
	Параметр определяющий фильтр, по которому формируется список объектов
	задаётся из командной строки \b --e-filter. 
	Параметр \b --e-startup-pause msec - задаёт паузу после старта SM,
	после которой заданным объектам посылается уведомление.
	Чтобы указать объект которому необходимо присылать уведомление,
	необходимо для него в конфигурайионном файле указать поле 
	\b evnt_xxx="1", где \b xxx - имя заданное в качестве параметра 
	\b --e-filter.
	Пример:
	\code
	<objects>
	  ...
	  <item id="2342" name="MyObject" ... evnt_myfilter="1" ../>
	</objects>
	\endcode
	При это в параметрах старта SM должно быть указано \b --e-filter myfilter.
	Тогда при своём старте SM пришлёт объекту с идентификатором 2342 уведомление.
	
	В качестве уведомления объектам рассылается сообщение \b SystemMessage::WatchDog.

	\section sec_SM_Depends Механизм зависимостей между датчиками
	В SM реализован механизм позволяющий задавать зависимости между датчиками. Т.е. датчик
	будет равен "0" пока разрешающий датчик не будет равено "1". Ниже показан пример конфигурирования
	зависимости.
	\code
	  <item id="20050" iotype="AI" name="Sensor1"" textname="Зависящий датчик 1">
		<consumers>
			<consumer name="Consumer1" type="objects"/>
		</consumers>
		<depends>
			<depend block_invert="1" name="Node_Not_Respond_FS"/>
		</depends>
	</item>
	\endcode
	В данном примере Sensor1 зависит от значения датчика Node_Not_Respond_FS. При этом значение блокировки
	инвертировано (block_invert=1). Т.е. если Node_Not_Respond=0, то Sensor1 - будет равен своему реальному
	значению. Как только Node_Not_Respond_FS станет равен 1, зависящий от него датчик Sensor1 сбросится в "0".
    Описание зависимости производится в секции <depends>. Возможные поля:
    \code
	  block_invert - инвертировать "разрешающий" датчик
    \endcode
    На данный момент зависимость можно устанавливать только на дискретные датчики.
	

		
	\section sec_SM_HeartBeat Слежение за "живостью" объектов
	
	  Слежение за специальными датчиками (инкремент специальных датчиков),
	  а также выставление дискретных датчиков "живости" процессов.
	  ...
	  ...
	  

	\section sec_SM_History Механизм аварийного дампа
	"Аварийный дамп" представляет из себя набор циклических буферов
	(размер в количестве точек хранения задаётся через конф. файл),
	в которых сохраняется история изменения заданного набора датчиков.
	В качестве "детонатора" задаётся идентификатор датчика (если
	это аналоговый датчик, то задаётся значение) при котором накопленный аварийный
	дамп должен "сбрасываться". За сохранение накопленного дампа (при "сбросе")
	отвечает разработчик, который может обрабатывать это событие подключившись
	к сигналу SharedMemory::signal_history(). Количество циклических буферов
	не ограничено, размер, а также список датчиков по которым ведётся "история"
	также не ограничены.
	Настройка параметров дампа осуществляется через конф. файл. Для этого
{'fraction_non_alphanumeric': 0.11763292761050609, 'fraction_numerical': 0.010890454836643177, 'mean_word_length': 3.206466823846413, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 57, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5699888', 'n_tokens_mistral': 5115, 'n_tokens_neox': 5605, 'n_words': 1266}