/**
******************************************************************************
* @file modbus_inputregs.c
* @brief Реализация работы с входными регистрами Modbus
******************************************************************************
* @details
Модуль обработки команды чтения input registers (0x04):
- Чтение множественных входных регистров
Копирование данных из структур устройства в буфер ответа
- Поддержка знаковых и беззнаковых значений
******************************************************************************/
#include "modbus_inputregs.h"


#ifdef MODBUS_ENABLE_INPUTS

/**
  * @brief    Обработать функцию Read Input Registers (04 - 0x04).
  * @param    modbus_msg        Указатель на структуру собщения modbus.
  * @return   fMessageHandled   Статус о результате обработки комманды.
  * @details  Обработка команды Read Input Registers.
  */
uint8_t MB_Process_Read_Input_Regs(RS_MsgTypeDef *modbus_msg)
{
  //---------CHECK FOR ERRORS---------- 
  // get origin address for data
  uint16_t *pInRegs;      
  modbus_msg->Except_Code = MB_DefineRegistersAddress(&pInRegs, modbus_msg->Addr, modbus_msg->Qnt, RegisterType_Input); // определение адреса регистров
  if(modbus_msg->Except_Code != NO_ERRORS)
    return 0;
  

  //-----------READING REGS------------
  // setup output message data size 
  modbus_msg->ByteCnt = modbus_msg->Qnt*2; // *2 because we transmit 8 bits, not 16 bits
  // read data
  int i;
  for (i = 0; i<modbus_msg->Qnt; i++)
  {
    if(*((int16_t *)pInRegs) > 0)
      modbus_msg->DATA[i] = (*pInRegs++);
    else
      modbus_msg->DATA[i] = (*pInRegs++);
  } 
  return 1;
}

#else //MODBUS_ENABLE_INPUTS

uint8_t MB_Process_Read_Input_Regs(RS_MsgTypeDef *modbus_msg) {return 0;}

#endif