/**
*******************************************************************************
* @file modbus_devid.h
* @brief Идентификаторы устройства Modbus
*******************************************************************************
@addtogroup MODBUS_DEVID Device Identifications Tools
@ingroup MODBUS_INTERNAL
@brief Функции для работы с идентификаторами устройства
*******************************************************************************
* @details
Модуль реализации функции Read Device Identifications (0x2B):
- Базовая идентификация (Vendor, Product, Revision)
- Расширенная идентификация (URL, Model, User fields)
- Поддержка потоковой передачи больших объектов

@section devobj Объекты идентификации:
- VendorName, ProductCode, Revision - обязательные
- VendorUrl, ProductName, ModelName - опциональные
- User objects - пользовательские поля
- Поддержка до 128 пользовательских объектов
******************************************************************************/
#ifndef __MODBUS_DEVID_H_
#define __MODBUS_DEVID_H_ 
#include "modbus_core.h"
#ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATIONS


/////////////////////////////////////////////////////////////////////
///////////////---DEVICE IDENTIVICATIONS DEFINES---//////////////////

/**
  * @addtogroup MODBUS_DEVID
  * @{
  */
  
#if MODBUS_NUMB_OF_USEROBJECTS > 0
#define MODBUS_DEVICE_CONFORMITY 0x83
#else
#define MODBUS_DEVICE_CONFORMITY 0x82
#endif

/** @brief Структура для объекта (идентификатора устройства модбас) */
typedef struct
{
  unsigned  length;
  char      *name;
}MB_DeviceObjectTypeDef;

/** @brief Структура со идентификаторами устройства модбас */
typedef struct
{
  MB_DeviceObjectTypeDef  VendorName;
  MB_DeviceObjectTypeDef  ProductCode;
  MB_DeviceObjectTypeDef  Revision;
  MB_DeviceObjectTypeDef  VendorUrl;
  MB_DeviceObjectTypeDef  ProductName;
  MB_DeviceObjectTypeDef  ModelName;
  MB_DeviceObjectTypeDef  UserApplicationName;
  
  MB_DeviceObjectTypeDef  Reserved[0x79];
  
  MB_DeviceObjectTypeDef  User[MODBUS_NUMB_OF_USEROBJECTS];
}MB_DeviceIdentificationsTypeDef;
extern MB_DeviceIdentificationsTypeDef MB_DEVID;
void MB_DeviceInentificationInit(void);
///////////////---DEVICE IDENTIVICATIONS DEFINES---//////////////////


/////////////////////////////////////////////////////////////////////
////////////////////---MODBUS FUNCTION DEFINES---////////////////////

/**
  * @brief    Инициализация объектов
  * @details  С помозью этого дефайна инициализируются объекты в @ref MB_DeviceInentificationInit
  */
#define MB_ObjectInit(_p_obj_, _userstring_) \
(_p_obj_)->length  = sizeof(_userstring_);\
(_p_obj_)->name    = _userstring_;
/**
  * @brief    Инициализация пользовательских объектов
  * @details  С помозью этого дефайна инициализируются пользовательские объекты в MB_DeviceInentificationInit
  */
#define MB_UserObjectInit(_pinfostruct_, _user_numb_)   MB_ObjectInit(&(_pinfostruct_)->User[_user_numb_], MODBUS_USEROBJECT##_user_numb_##_NAME)


    
/** MODBUS_DEVID
* @} 
*/
////////////////////---MODBUS MESSAGE DEFINES---/////////////////////



/////////////////////////////////////////////////////////////////////
/////////////////////////---FUNCTIONS---/////////////////////////////
  
/**
  * @addtogroup MODBUS_DEVID
  * @{
  */
  
/* Записать Один Объект Идентификатора в массив данных */
void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj);
/* Записать Массив Объектов Идентификатора в массив данных */
void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj);

/** MODBUS_DEVID
  * @} 
  */
 
/** 
  * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS
  * @{
  */
  
/* Обработать функцию Read Device Identifications (43/14 - 0x2B/0E) */
uint8_t MB_Process_Read_Device_Identifications(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS
  * @} 
  */
/////////////////////////---FUNCTIONS---/////////////////////////////

#endif //MODBUS_ENABLE_DEVICE_IDENTIFICATIONS
#endif //__MODBUS_DEVID_H_

