/** 
**************************************************************************
* @file   modbus_data.h
* @brief    Заголовочный файл с описанием даты MODBUS.
* @details  Данный файл необходимо подключается в rs_message.h. После rs_message.h 
* подключается к основному проекту.
* 
* @defgroup MODBUS_DATA
* @ingroup  MODBUS
* @brief    Modbus data description
*
*************************************************************************/




#ifndef _MODBUS_DATA_H_
#define _MODBUS_DATA_H_


// DEFINES FOR INPUT REGISTERS ARRAYS
#define   R_INPUT_ADDR               					 	 0
#define   R_INPUT_QNT               		 				 2000

// DEFINES FOR HOLDING REGISTERS ARRAYS
#define   R_HOLDING_ADDR                  			 0
#define   R_HOLDING_QNT                  		  	 2000

// DEFINES FOR COIL ARRAYS
#define C_CONTROL_ADDR             			  			 0
#define C_CONTROL_QNT             			   			 1000



#include "stdint.h"
#include "ds18b20_driver.h"
#include "PROJ_setup.h"


//--------------DEFINES FOR REGISTERS---------------
// DEFINES FOR ARRAYS
/** 
  * @addtogroup MODBUS_DATA_RERISTERS_DEFINES
  * @ingroup    MODBUS_DATA
  * @brief      Defines for registers
  Структура дефайна адресов
  @verbatim    
  Для массивов регистров:
    R_<NAME_ARRAY>_ADDR   -  модбас адресс первого регистра в массиве
    R_<NAME_ARRAY>_QNT    -  количество регистров в массиве
  
  При добавлении новых массивов регистров, необходимо их добавить в функцию MB_DefineRegistersAddress

		if(MB_Check_Address_For_Arr(Addr, Qnt, R_<NEW_ARRAY>_ADDR, R_<NEW_ARRAY>_QNT) == NO_ERRORS)
		{
			*pRegs = MB_Set_Register_Ptr(&<NEW_ARRAY>, Addr);	// начало регистров хранения/входных
		}
  @endverbatim
  * @{
  */
  
  
/** 
  * @brief Регистры хранения
  */

	
/**
 * @brief Определить размер структуры в регистрах модбас (16-бит слова)
 */
#define mb_sizeof(_struct_)   (sizeof(_struct_)/sizeof(uint16_t)) 
/**
 * @brief Определить количество резервных байт для выравнивания
 * @details   Выравнивает так, чтобы количество регистров в  _struct_ и reserved равнялось _align_.
 * 
 */
#define mb_fill_rsv(_align_, _struct_)  ((_align_ > mb_sizeof(_struct_)) ? (_align_ - mb_sizeof(_struct_)) : 0) 







typedef 	__PACKED_STRUCT//MB_DataInRegsTypeDef
{
	
	uint16_t sens_Temp[MAX_SENSE];	
	
	uint16_t reserve[mb_fill_rsv(1000, uint16_t[MAX_SENSE])];	
	
	DS18B20_Drv_t ID;
	uint16_t reserve1[mb_fill_rsv(200, DS18B20_Drv_t)];	
	uint16_t num_Tsens;

	
}MB_DataInRegsTypeDef;


/** 
  * @brief Входные регистры 
  */
typedef 	__PACKED_STRUCT //MB_DataInRegsTypeDef
{
	uint16_t set_Temp[MAX_SENSE];
	uint16_t reserve[mb_fill_rsv(100, uint16_t[MAX_SENSE])];	
	uint16_t set_hyst[MAX_SENSE];
	uint16_t reserve1[mb_fill_rsv(100, uint16_t[MAX_SENSE])];	
}MB_DataHoldRegsTypeDef;




 
/** MODBUS_DATA_RERISTERS_DEFINES
  * @} 
  */

//----------------DEFINES FOR COILS-----------------
/** 
  * @addtogroup MODBUS_DATA_COILS_DEFINES
  * @ingroup    MODBUS_DATA
  * @brief      Defines for coils
  @verbatim    
  Структура дефайна
  Для массивов коилов:
    C_<NAME_ARRAY>_ADDR   - модбас адресс первого коила в массиве
    C_<NAME_ARRAY>_QNT    - количество коилов в массиве (минимум 16)

  При добавлении новых массивов коилов, необходимо их добавить в функцию MB_DefineCoilsAddress

    if(MB_Check_Address_For_Arr(Addr, Qnt, C_<NEW_ARRAY>_ADDR, C_<NEW_ARRAY>_QNT) == NO_ERRORS)
    {
      *pCoils = MB_Set_Coil_Reg_Ptr(&<NEW_ARRAY>, Addr);
    }

  @endverbatim
  * @{
  */
  
  
  
/** 
  * @brief     Коилы
  * @details   Желательно с помощью reserved делать стркутуру кратной 16-битам
  */
typedef union
	{	
		__PACKED_STRUCT
		{
			unsigned state_val_01:1;
			unsigned state_val_02:1;
			unsigned state_val_03:1;
			unsigned state_val_04:1;
			unsigned state_val_05:1;
			unsigned state_val_06:1;
			unsigned state_val_07:1;
			unsigned state_val_08:1;
			unsigned state_val_09:1;
			unsigned state_val_10:1;
			unsigned state_val_11:1;
			unsigned state_val_12:1;
			unsigned state_val_13:1;
			unsigned state_val_14:1;
			unsigned state_val_15:1;
			unsigned state_val_16:1;
		} state_val_bit;
		uint16_t all;
		
		
	}word;
	typedef union
	{
		__PACKED_STRUCT
		{
			unsigned Temp1_relay_isOn	:1;
			unsigned Temp2_relay_isOn	:1;
			unsigned Temp3_relay_isOn	:1;
			unsigned Temp4_relay_isOn	:1;
			unsigned Temp5_relay_isOn	:1;
			unsigned Temp6_relay_isOn	:1;
			unsigned Temp7_relay_isOn	:1;
			unsigned Temp8_relay_isOn	:1;
			unsigned Temp9_relay_isOn	:1;
			unsigned Temp10_relay_isOn	:1;
			unsigned Temp11_relay_isOn	:1;
			unsigned Temp12_relay_isOn	:1;
			unsigned Temp13_relay_isOn	:1;
			unsigned Temp14_relay_isOn	:1;
			unsigned Temp15_relay_isOn	:1;
			unsigned Temp16_relay_isOn	:1;
	
			
		} state_val_bit;
		uint16_t all;
		
		
	}RELAY_Struct;
	
	typedef union
	{
		__PACKED_STRUCT
		{
			unsigned Temp1_isConnected	:1;
			unsigned Temp2_isConnected	:1;
			unsigned Temp3_isConnected	:1;
			unsigned Temp4_isConnected	:1;
			unsigned Temp5_isConnected	:1;
			unsigned Temp6_isConnected	:1;
			unsigned Temp7_isConnected	:1;
			unsigned Temp8_isConnected	:1;
			unsigned Temp9_isConnected	:1;
			unsigned Temp10_isConnected	:1;
			unsigned Temp11_isConnected	:1;
			unsigned Temp12_isConnected	:1;
			unsigned Temp13_isConnected	:1;
			unsigned Temp14_isConnected	:1;
			unsigned Temp15_isConnected	:1;
			unsigned Temp16_isConnected	:1;
	
		} state_val_bit;
		uint16_t all;
		
		
	}STATUS_TSENS;
	
	
typedef 	__PACKED_STRUCT
	{
		int temp ;			
		unsigned Temp_relay_on	:1;
		unsigned Temp_relay_off	:1;
		unsigned is_connect:1;	
		
	}Temp_sens;
	extern Temp_sens temp_sens ;
	
typedef 	__PACKED_STRUCT
{
	
	
	
	word coils[3];                            //48
	uint16_t reserve1[mb_fill_rsv(128/16, word[3])];	
	STATUS_TSENS status_tSens[MAX_SENSE/16];  //32
	uint16_t reserve2[mb_fill_rsv(128/16, STATUS_TSENS[MAX_SENSE/16])];	
	RELAY_Struct relay_struct[MAX_SENSE/16*2];//16 2 реле на 1 датчик
	uint16_t reserve3[mb_fill_rsv(128/16, RELAY_Struct[MAX_SENSE/16*2])];	

	unsigned init_param:1; 					//384
	unsigned init_Tsens:1; 					//385
	unsigned Save_Param_to_Flash:1;	//386
	unsigned reserved2:13;
	
}MB_DataCoilsTypeDef;



/** MODBUS_DATA_COILS_DEFINES
  * @} 
  */
  
  
//-----------MODBUS DEVICE DATA SETTING-------------
// MODBUS DATA STRUCTTURE
/** 
  * @brief Структура со всеми регистрами и коилами модбас 
  * @ingroup  MODBUS_DATA
  */
typedef struct // tester modbus data
{
  MB_DataInRegsTypeDef      InRegs;     ///< Modbus input registers @ref MB_DataInRegsTypeDef

  MB_DataCoilsTypeDef       Coils;      ///< Modbus coils @ref MB_DataCoilsTypeDef
  
  MB_DataHoldRegsTypeDef    HoldRegs;   ///< Modbus holding registers @ref MB_DataHoldRegsTypeDef
}MB_DataStructureTypeDef;
extern MB_DataStructureTypeDef MB_DATA;

#endif //_MODBUS_DATA_H_

/////////////////////////////////////////////////////////////
///////////////////////TEMP/OUTDATE/OTHER////////////////////