NbusCommunicator.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * @file NbusCommunicator.cpp
  3. * @brief Implementation of hardware communication interface.
  4. * @date Nov 27, 2025
  5. * @author Juraj Dudak, Matus Necas
  6. */
  7. #include "NbusCommunicator.h"
  8. NbusCommunicator::NbusCommunicator(UART_HandleTypeDef *uartNbus, UART_HandleTypeDef *uartMaster)
  9. : _uart_nbus{uartNbus}, _uart_master{uartMaster}
  10. {
  11. }
  12. void NbusCommunicator::sendToMaster(DataFrame *master_frame)
  13. {
  14. if (master_frame == nullptr || master_frame->IsEmpty())
  15. return;
  16. while (_uart_master->gState != HAL_UART_STATE_READY)
  17. {
  18. __NOP(); // cakanie na ukoncenie prebiehajuceho odosielania
  19. // tu to moze byt vcelku tesno odoslany dalsi paket. je tam pauza o dlzke 1.2bit
  20. }
  21. HAL_UART_Transmit_DMA(_uart_master, master_frame->GetFrame(), master_frame->GetLength());
  22. }
  23. void NbusCommunicator::sendToSlave(DataFrame *slaveFrame)
  24. {
  25. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  26. HAL_UART_Transmit(_uart_nbus, slaveFrame->GetFrame(), slaveFrame->GetLength(), NBUS_COMM_UART_TX_TIMEOUT);
  27. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  28. }
  29. DataFrame* NbusCommunicator::sendAndReceiveSlave(DataFrame *slave_frame)
  30. {
  31. this->sendToSlave(slave_frame);
  32. this->_receiveFromSlave();
  33. return &_packet_rx;
  34. }
  35. void NbusCommunicator::_receiveFromSlave()
  36. {
  37. uint16_t received_size;
  38. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  39. memset(_data_packet_comm, 0, NBUS_COMM_MAX_FRAME_SIZE);
  40. // DMA communication must be in blocking mode for less overhead
  41. HAL_StatusTypeDef status = HAL_UARTEx_ReceiveToIdle(_uart_nbus, _data_packet_comm, NBUS_COMM_MAX_FRAME_SIZE,
  42. &received_size, NBUS_COMM_UART_RX_TIMEOUT);
  43. _packet_rx.Init();
  44. if (status == HAL_OK)
  45. {
  46. if (received_size > 0)
  47. {
  48. _packet_rx.FromArray(_data_packet_comm, received_size);
  49. }
  50. }
  51. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  52. _packet_rx.Commit();
  53. }