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

/** 
  * @brief Скорость обмена 
  */
typedef enum //MB_SpeedTypeDef
{
  MB_9600bs     = 0x0000,   ///< Скорость 9600 б/с
  MB_14400bs    = 0x0001,   ///< Скорость 14400 б/с
  MB_19200bs    = 0x0002,   ///< Скорость 19200 б/с
  MB_31250bs    = 0x0003,   ///< Скорость 31250 б/с
  MB_38400bs    = 0x0004,   ///< Скорость 38400 б/с
  MB_56000bs    = 0x0005,   ///< Скорость 56000 б/с
  MB_57600bs    = 0x0006,   ///< Скорость 57600 б/с
  MB_115200bs   = 0x0007,   ///< Скорость 115200 б/с
  mb16bit = 0x1000, ///< костыль чтобы enum был 16-битный... или забить на enum, пока не определился
}MB_SpeedTypeDef;

/** 
  * @brief Контроль четности 
  */
typedef enum //MB_ParityCtrlTypeDef
{
  NoParityCtrl    = 0x0000,  ///< контроля нет
  EvenParityCtrl  = 0x0400,  ///< четный контроль
  OddParityCtrl   = 0x0600,  ///< нечетый контроль  
}MB_ParityCtrlTypeDef;
  
  
/** 
  * @brief Регистры хранения для уставок параметров МКЗТЭ
  */
typedef struct //MB_DataHoldRegsTypeDef
{
  
  uint16_t              Warning_Setpoints[85];  /*!<  @brief    Адреса 0-84: Уставки «Предупреждение»
                                                      @details  Задает пороговое напряжение, при достижении которого будет сформирован сигнал «Предупреждение». 
                                                  
                                                      Максимальное значение (записываемое в регистр)  -  1100 (1,1 В *1000) */
  
  uint16_t              Errors_Setpoints[85];   /*!<  @brief    Адреса 85-169: Уставки «Авария»
                                                      @details  Задает пороговое напряжение, при достижении которого будет сформирован сигнал «Авария».
                                                  
                                                      Максимальное значение (записываемое в регистр)  -  1100 (1,1 В *1000) */
  
  uint16_t              Commands_Mode;          /*!<  @brief    Адрес 170: Уставка «Команды»
                                                      @details  Принимаемые значения: 
                                                                - 0x0000 – стандартная работа
                                                                - 0x0001 – запрет опроса ТЭ (активен только обмен с ЛСУ ЭС, ТЭ не контролируются) */
  
  uint16_t              reserved;               ///<  Адрес 171 зарезервирован
  
  uint16_t              MZKTE_Network_Adress;   /*!<  @brief    Адрес 172: Уставка «Сетевой адрес МЗКТЭ»
                                                      @details  При удачной записи этого регистра ответный фрейм не отправляется */
  
  MB_SpeedTypeDef       Modbus_Speed:16;        /*!<  @brief    Адрес 173: Уставка «Скорость обмена»
                                                      @details  Принимаемые значения описаны в @ref MB_SpeedTypeDef.
                                                   
                                                      При удачной записи этого регистра ответный фрейм не отправляется */
  
  MB_ParityCtrlTypeDef  Parity_Control:16;      /*!<  @brief    Адрес 174: Уставка «Команды»
                                                      @details  Принимаемые значения описаны в @ref MB_ParityCtrlTypeDef.
                                                  
                                                      При удачной записи этого регистра ответный фрейм не отправляется */
}MB_DataHoldRegsTypeDef;



/**
  * @brief  Номер неисправности МЗКТЭ
  */
typedef enum //MB_MZKTEErrorsTypeDef
{
  No_Err                      = 0x00, ///< Неисправность отсутствует
  Err_Digit_5V_Power          = 0x01, ///< Неисправность цифрового источника питания +5 В
  Err_Analog_15V_5V_3V_Power  = 0x02, ///< Неисправность аналогового источника питания (±15 В/+5 В/+3,3 В)
  Err_SCI_5V_Power            = 0x03, ///< Неисправность источника питания последовательных интерфейсов микроконтроллера +5 В
  Err_24V_Power               = 0x04, ///< Неисправность источника питания +24 В
  Program_Err_1               = 0x05, ///< Программная ошибка 1
  Program_Err_2               = 0x06, ///< Программная ошибка 2
  Program_Err_3               = 0x07, ///< Программная ошибка 3
  Program_Err_4               = 0x08, ///< Программная ошибка 4
  Program_Err_5               = 0x09, ///< Программная ошибка 5
  Program_Err_6               = 0x0A, ///< Программная ошибка 6
  Program_Err_7               = 0x0B, ///< Программная ошибка 7
  Program_Err_8               = 0x0C, ///< Программная ошибка 8
}MB_MZKTEErrorsTypeDef;


/** 
  * @brief Сборный параметр 
  * @details Информация о состоянии МЗКТЭ
  */
typedef union //MB_MZKTEStatusTypeDef
{
  uint16_t all; ///< Доступ к регистру целиком
  struct         
  {
    unsigned                  TE_ErrActive:1;     /*!<  @brief    Бит [0]: Авария на ТЭ
                                                        @details  Состояния:
                                                                  - 0 - напряжения на всех ТЭ выше аварийных порогов, задаваемых уставками «Авария»
                                                                  - 1 - напряжение на одном или нескольких ТЭ достигло или ниже аварийного порога, задаваемого уставкой «Авария» */
    
    unsigned                  TE_WarnActive:1;    /*!<  @brief    Бит [1]: Предупреждения на ТЭ
                                                        @details  Состояния:
                                                                  - 0 - напряжения на всех ТЭ выше предупредительных порогов, задаваемых уставкой «Предупреждение»
                                                                  - 1 - напряжение на одном или нескольких ТЭ достигло или ниже предупредительного порога, задаваемого уставкой «Предупреждение» */
    
    unsigned                  Opros_TE:1;         /*!<  @brief    Бит [2]: Разрешение опроса ТЭ
                                                        @details  Состояния:
                                                                  - 0 – опрос ТЭ разрешен
                                                                  - 1 – опрос ТЭ запрещен */
    
    unsigned                  MZKTE_ErrStatus:2;  /*!<  @brief    Биты [4:3]: Состояние МЗКТЭ
                                                        @details  Состояния:
                                                                  - 0 - МЗКТЭ функционирует нормально. Идет опрос ТЭ.
                                                                  - 1 - неисправность МЗКТЭ, при которой МЗКТЭ может выполнять свои основные функции 
                                                                      (некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef)
                                                                  - 2 - Неисправность МЗКТЭ, при которой выполнение основных функций не представляется возможным 
                                                                      (ошибки 1-3 и  некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef) */
    
    unsigned                  reserved:3;         ///<  Биты [7:5] зарезервированны
    
    MB_MZKTEErrorsTypeDef     MZKTE_Error:8;      /*!<  @brief     Биты [15:8]: Номер неисправности МЗКТЭ
                                                        @details   Номера неисправностей описаны в @ref MB_MZKTEErrorsTypeDef */
  }param; ///< Доступ к регистру по параметрам
}MB_MZKTEStatusTypeDef;



/** 
  * @brief Входные регистры для контроля состояния МЗКТЭ 
  */
typedef struct //MB_DataInRegsTypeDef
{
  
  uint16_t U_TE[85];            /*!<  @brief Адреса 0-84: Текущие значения напряжения ТЭ 
                                      @details Значения передаются умноженными на 1000 (т.е. если Uтэ = 0,625 В, то будет передано число 625) */
  
  MB_MZKTEStatusTypeDef Status; /*!<  @brief Адрес 85: Сборный параметр 
                                      @details Информация о состоянии МЗКТЭ @ref MB_MZKTEStatusTypeDef */
}MB_DataInRegsTypeDef;


// DEFINES FOR REGISTERS ARRAYS
#define R_INREG_ADDR                  0
#define  R_INREG_QNT                  86

#define R_HOLDREG_ADDR                0
#define  R_HOLDREG_QNT                175


// DEFINES FOR REGISTERS LOCAL ADDRESSES
//#define R_SET_ERROR(_te_num_)          0

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

  @endverbatim
  * @{
  */
  
  
  
/** 
  * @brief     Флаги исключения ТЭ из алгоритма формирования сигналов «Предупреждение» и «Авария» 
  * @details   В случае установки нулевого значения конкретной ячейки значение напряжения ТЭ, 
  *            связанного с этой ячейкой, не будет учитываться при формировании сигналов «Предупреждение» и «Авария» 
  */
typedef struct //MB_DataCoilsTypeDef
{
  union
  { 
    struct
    {
      uint64_t TE0_63;      ///< Ячейки ТЭ №0-63
      uint32_t TE64_84:21;  ///< Ячейки ТЭ №64-84
    }all;
    struct
    {
      unsigned TE0_Exclude:1;
      unsigned TE1_Exclude:1;
      unsigned TE2_Exclude:1;
      unsigned TE3_Exclude:1;
      unsigned TE4_Exclude:1;
      unsigned TE5_Exclude:1;
      unsigned TE6_Exclude:1;
      unsigned TE7_Exclude:1;
      unsigned TE8_Exclude:1;
      unsigned TE9_Exclude:1;
      unsigned TE10_Exclude:1;
      unsigned TE11_Exclude:1;
      unsigned TE12_Exclude:1;
      unsigned TE13_Exclude:1;
      unsigned TE14_Exclude:1;
      unsigned TE15_Exclude:1;
      unsigned TE16_Exclude:1;
      unsigned TE17_Exclude:1;
      unsigned TE18_Exclude:1;
      unsigned TE19_Exclude:1;
      unsigned TE20_Exclude:1;
      unsigned TE21_Exclude:1;
      unsigned TE22_Exclude:1;
      unsigned TE23_Exclude:1;
      unsigned TE24_Exclude:1;
      unsigned TE25_Exclude:1;
      unsigned TE26_Exclude:1;
      unsigned TE27_Exclude:1;
      unsigned TE28_Exclude:1;
      unsigned TE29_Exclude:1;
      unsigned TE30_Exclude:1;
      unsigned TE31_Exclude:1;
      unsigned TE32_Exclude:1;
      unsigned TE33_Exclude:1;
      unsigned TE34_Exclude:1;
      unsigned TE35_Exclude:1;
      unsigned TE36_Exclude:1;
      unsigned TE37_Exclude:1;
      unsigned TE38_Exclude:1;
      unsigned TE39_Exclude:1;
      unsigned TE40_Exclude:1;
      unsigned TE41_Exclude:1;
      unsigned TE42_Exclude:1;
      unsigned TE43_Exclude:1;
      unsigned TE44_Exclude:1;
      unsigned TE45_Exclude:1;
      unsigned TE46_Exclude:1;
      unsigned TE47_Exclude:1;
      unsigned TE48_Exclude:1;
      unsigned TE49_Exclude:1;
      unsigned TE50_Exclude:1;
      unsigned TE51_Exclude:1;
      unsigned TE52_Exclude:1;
      unsigned TE53_Exclude:1;
      unsigned TE54_Exclude:1;
      unsigned TE55_Exclude:1;
      unsigned TE56_Exclude:1;
      unsigned TE57_Exclude:1;
      unsigned TE58_Exclude:1;
      unsigned TE59_Exclude:1;
      unsigned TE60_Exclude:1;
      unsigned TE61_Exclude:1;
      unsigned TE62_Exclude:1;
      unsigned TE63_Exclude:1;
      unsigned TE64_Exclude:1;
      unsigned TE65_Exclude:1;
      unsigned TE66_Exclude:1;
      unsigned TE67_Exclude:1;
      unsigned TE68_Exclude:1;
      unsigned TE69_Exclude:1;
      unsigned TE70_Exclude:1;
      unsigned TE71_Exclude:1;
      unsigned TE72_Exclude:1;
      unsigned TE73_Exclude:1;
      unsigned TE74_Exclude:1;
      unsigned TE75_Exclude:1;
      unsigned TE76_Exclude:1;
      unsigned TE77_Exclude:1;
      unsigned TE78_Exclude:1;
      unsigned TE79_Exclude:1;
      unsigned TE80_Exclude:1;
      unsigned TE81_Exclude:1;
      unsigned TE82_Exclude:1;
      unsigned TE83_Exclude:1;
      unsigned TE84_Exclude:1;
    }bit;  ///< Биты для доступа к каждой ячейке ТЭ
  }Exclude; ///< Юнион для исключения ТЭ
}MB_DataCoilsTypeDef;

// DEFINES FOR COIL ARRAYS
#define C_TE_EXCLUDE_ADDR              0
#define C_TE_EXCLUDE_QNT              84

/** MODBUS_DATA_COILS_DEFINES
  * @} 
  */
  
  
//-----------MODBUS DEVICE DATA SETTING-------------
// MODBUS DATA STRUCTTURE
/** 
  * @brief Структура со всеми регистрами и коилами модбас 
  * @ingroup  MODBUS_DATA
  */
typedef struct // mzkt 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;





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

//typedef enum //MB_MZKTECommandsTypeDef
//{
//  StandartMode       = 0x00, ///< Стандартная работа
//  Opros_TE_Disable   = 0x01, ///< Запрет опроса ТЭ (активен только обмен с ЛСУ ЭС, ТЭ не контролируются)
//}MB_MZKTECommandsTypeDef;

///**
//  * @brief     Состояние МЗКТЭ
//  */
//typedef enum //MB_MZKTEErrStatusTypeDef
//{
//  MZKTE_OK           = 0x0,   ///< МЗКТЭ функционирует нормально. Идет опрос ТЭ.
//  NonCritical_Err    = 0x1,  ///< Неисправность МЗКТЭ, при которой МЗКТЭ может выполнять свои основные функции (некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef).
//  Critical_Err       = 0x2,  ///< Неисправность МЗКТЭ, при которой выполнение основных функций не представляется возможным (ошибки 1-3 и  некоторые программные ошибки из @ref MB_MZKTEErrorsTypeDef)
//  
//}MB_MZKTEErrStatusTypeDef;
//typedef enum
//{
//  TE_No_Err   = 0x0,   ///< Напряжения на всех ТЭ выше аварийных порогов, задаваемых уставками «Авария»
//  TE_Err      = 0x1,  ///< Напряжение на одном или нескольких ТЭ достигло или ниже аварийного порога, задаваемого уставкой «Авария»
//}MB_TEErrActiveTypeDef;
//typedef enum
//{
//  TE_No_Warn   = 0x0,   ///< Напряжения на всех ТЭ выше предупредительных порогов, задаваемых уставкой «Предупреждение»
//  TE_Warn      = 0x1,  ///< Напряжение на одном или нескольких ТЭ достигло или ниже предупредительного порога, задаваемого уставкой «Предупреждение»
//}MB_TEWarnActiveTypeDef;
//typedef enum
//{
//  OprosTE_Enable   = 0x0,   ///< Опрос ТЭ разрешен
//  OprosTE_Disable      = 0x1,  ///< Опрос ТЭ запрещен  (см. регистр хранения 170)
//}MB_OprosTETypeDef;
