/**
******************************************************************************
* @file modbus_data.h
* @brief Определения структур данных Modbus устройства
******************************************************************************
@defgroup MODBUS_DATA Modbus Registers Map
@ingroup MODBUS
@brief Определение карты регистров и коилов
******************************************************************************
* @details
Файл содержит объявления структур данных, доступных через Modbus:
- Holding Registers (R/W) - регистры хранения
- Input Registers (R/O) - входные регистры  
- Coils (R/W) - дискретные выходы

@section datinit Базовая настройка под устройство:
1. Настроить диапазоны адресов
  - @ref R_INPUT_ADDR и @ref R_INPUT_QNT для входных регистров
  - @ref R_HOLDING_ADDR и @ref R_HOLDING_QNT для регистров хранения
  - @ref C_COILS_ADDR и @ref C_COILS_ADDR для коилов
3. Настроить структуры данных:
  - @ref MB_DataInRegsTypeDef
  - @ref MB_DataHoldRegsTypeDef
  - @ref MB_DataCoilsTypeDef
    

@section datexpert Расширенная настройка под устройство:
1. Добавить новый массив с нужными данными.
2. Добавить дефайны для определения его начального адреса и количества элементов
3. Добавить проверку адресов в MB_DefineRegistersAddress/MB_DefineCoilsAddress. 

   Пример:
   @code
    #define   R_USER_ADDR        555
    #define   R_USER_QNT         16
    uint16_t  user_regs[16];

    //...
    else if(MB_Check_Address_For_Arr(Addr, Qnt, R_USER_ADDR, R_USER_QNT) == ET_NO_ERRORS)
    {
      *pRegs = MB_Set_Register_Ptr(&user_regs, Addr-R_USER_ADDR); // ВАЖНО!
      // -R_USER_ADDR нужен чтобы взять адрес относительно начала массива
    }
    else  
    {
      return ET_ILLEGAL_DATA_ADDRESS;
    }
   @endcode
******************************************************************************/

#ifndef _MODBUS_DATA_H_
#define _MODBUS_DATA_H_
  
#include "stdint.h"



//--------------SIZES OF DATA---------------

// DEFINES FOR INPUT REGISTERS ARRAYS
#define   R_INPUT_ADDR        0   ///< Начальный адрес входных регистров
#define   R_INPUT_QNT         16  ///< Количество входных регистров

// DEFINES FOR HOLDING REGISTERS ARRAYS
#define   R_HOLDING_ADDR      0   ///< Начальный адрес регистров хранения
#define   R_HOLDING_QNT       16  ///< Количество регистров хранения

// DEFINES FOR COIL ARRAYS
#define   C_COILS_ADDR        0   ///< Начальный адрес коилов
#define   C_COILS_QNT         16  ///< Количество регистров коилов

//--------------DEFINES FOR REGISTERS---------------
// DEFINES FOR ARRAYS
/** 
  * @addtogroup MODBUS_DATA_RERISTERS_DEFINES Registers structures
  * @ingroup    MODBUS_DATA
  * @brief      Стуруктура регистров (входных и хранения)
  @code    
  Для массивов регистров:
    R_<NAME_ARRAY>_ADDR   -  модбас адресс первого регистра в массиве
    R_<NAME_ARRAY>_QNT    -  количество регистров в массиве
  @endcode
  * @{
  */
  
  
/** 
  * @brief Регистры хранения
  */
typedef struct //MB_DataInRegsTypeDef
{
  uint16_t in[16];
}MB_DataInRegsTypeDef;


/** 
  * @brief Входные регистры 
  */
typedef struct //MB_DataInRegsTypeDef
{
  uint16_t out[16];
}MB_DataHoldRegsTypeDef;


/** MODBUS_DATA_RERISTERS_DEFINES
  * @} 
  */

//----------------DEFINES FOR COILS-----------------
/** 
  * @addtogroup MODBUS_DATA_COILS_DEFINES Coils Structure
  * @ingroup    MODBUS_DATA
  * @brief      Структура коилов
  @code    
  Структура дефайна
  Для массивов коилов:
    C_<NAME_ARRAY>_ADDR   - модбас адресс первого коила в массиве
    C_<NAME_ARRAY>_QNT    - количество коилов в массиве (минимум 16)
  @endcode
  * @{
  */
  
  
  
/** 
  * @brief     Коилы
  * @details   Желательно с помощью reserved делать стркутуру кратной 16-битам
  */
typedef struct //MB_DataCoilsTypeDef
{
  unsigned reserved:16;
}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////////////////////
