/** 
**************************************************************************
* @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_
  
#include "stdint.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 Регистры хранения
  */
typedef struct //MB_DataInRegsTypeDef
{
  uint16_t RESERVED;
}MB_DataInRegsTypeDef;


/** 
  * @brief Входные регистры 
  */
typedef struct //MB_DataInRegsTypeDef
{                             // Адрес:
  uint16_t CAN_BITRATE_KBPS;  // 0
  uint16_t CAN_PERIOD;        // 1
  
  uint16_t CAN_ID_HI;         // 2
  uint16_t CAN_ID_LO;         // 3
  uint16_t CAN_DLC;           // 4
  
  uint16_t reserved[11];      // ... 5-15 
  
  uint16_t CAN_DATA_0;        // 16
  uint16_t CAN_DATA_1;        // 17
  uint16_t CAN_DATA_2;        // 18
  uint16_t CAN_DATA_3;        // 19
  uint16_t CAN_DATA_4;        // 20
  uint16_t CAN_DATA_5;        // 21
  uint16_t CAN_DATA_6;        // 22
  uint16_t CAN_DATA_7;        // 23
  
  uint16_t reserved2[8];      // ... 24-31 
  uint16_t reserved3[16*2];   // ... 32-63
  
  uint16_t DATA_UNIX_HI;      // 64
  uint16_t DATA_UNIX_LO;      // 65
}MB_DataHoldRegsTypeDef;


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

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

 
/** 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 struct //MB_DataCoilsTypeDef
{                                 // Адрес:
  unsigned START_POLLING:1;       // 0
  unsigned START_SINGLE_FRAME:1;  // 1
  
  unsigned HEADER_IDE:1;          // 2
  unsigned HEADER_RTR:1;          // 3
  
  unsigned reserved:12;           // ...
  
  unsigned FLIP_SRS:1;            // 16
  unsigned FLIP_IDE:1;            // 17
  unsigned FLIP_RTR:1;            // 18
  unsigned FLIP_R1:1;             // 19
  unsigned FLIP_R0:1;             // 20
  unsigned FLIP_MSGID_BIT:1;      // 21
  unsigned FLIP_DATA_BIT:1;       // 22
  unsigned FLIP_CRC_BIT:1;        // 23
  unsigned DISABLE_STUFF_BITS:1;  // 24
}MB_DataCoilsTypeDef;

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

/** 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;


/** 
  * @brief Структура для объекта Modbus 
  * @ingroup  MODBUS_DATA
  */
typedef struct
{
  unsigned  length;
  char      *name;
}MB_DeviceObjectTypeDef;
/** 
  * @brief Структура для объектов Modbus
  * @ingroup  MODBUS_DATA
  */
typedef struct
{
  MB_DeviceObjectTypeDef VendorName;
  MB_DeviceObjectTypeDef ProductCode;
  MB_DeviceObjectTypeDef Revision;
  MB_DeviceObjectTypeDef VendorUrl;
  MB_DeviceObjectTypeDef ProductName;
  MB_DeviceObjectTypeDef ModelName;
  MB_DeviceObjectTypeDef UserApplicationName;
}MB_DeviceIdentificationTypeDef;
void MB_DevoceInentificationInit(void);


#endif //_MODBUS_DATA_H_

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