NbusCommunicator.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * @file NbusCommunicator.cpp
  3. *
  4. * @date: Mar 7, 2025
  5. * @author: juraj
  6. */
  7. #include "NbusCommunicator.h"
  8. volatile int32_t flag_data_received = -1;
  9. NbusCommunicator::NbusCommunicator(UART_HandleTypeDef* uartUbus, UART_HandleTypeDef *uartMaster) {
  10. _packet_tx = new DataFrame(_data_packet_tx, sizeof(_data_packet_tx), TYPE_PLAIN, CRC_ON);
  11. if(_packet_tx == NULL)
  12. {
  13. while(1){
  14. __NOP();
  15. }
  16. }
  17. _packet_rx = new DataFrame(_data_packet_rx, sizeof(_data_packet_rx), TYPE_PLAIN, CRC_OFF);\
  18. if(_packet_rx == NULL)
  19. {
  20. while(1){
  21. __NOP();
  22. }
  23. }
  24. if(uartUbus == NULL)
  25. {
  26. while(1){
  27. __NOP();
  28. }
  29. }
  30. _uart_nbus = uartUbus;
  31. if(uartMaster == NULL)
  32. {
  33. while(1){
  34. __NOP();
  35. }
  36. }
  37. _uart_master = uartMaster;
  38. }
  39. NbusCommunicator::~NbusCommunicator() {
  40. // TODO Auto-generated destructor stub
  41. }
  42. void NbusCommunicator::_receive(){
  43. flag_data_received = -1;
  44. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  45. HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_comm, NBUS_MAX_FRAME_SIZE);
  46. uint32_t stop_receive = HAL_GetTick() + 2;
  47. while(flag_data_received < 0 && HAL_GetTick() < stop_receive);
  48. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  49. _packet_rx->Init();
  50. if(flag_data_received > 0){
  51. // _packet_rx->AddArray(_data_packet_comm, flag_data_received);
  52. _packet_rx->FromArray(_data_packet_comm, flag_data_received);
  53. }
  54. _packet_rx->Commit();
  55. flag_data_received = 0;
  56. }
  57. void NbusCommunicator::transmit(uint8_t *frame, uint8_t length){
  58. HAL_UART_Transmit(_uart_nbus, frame, length, 100);
  59. HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_rx, 64);
  60. }
  61. DataFrame* NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
  62. _packet_tx->Init();
  63. _packet_tx->AddInt8(pdu->ma); // Module address
  64. _packet_tx->AddInt8(pdu->sa); // Slave address
  65. _packet_tx->AddInt8(pdu->fc); // ECHO
  66. for(int i = 0 ; i< data_len ; i++){
  67. _packet_tx->AddInt8(data[i]);
  68. }
  69. int length = _packet_tx->Commit();
  70. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  71. HAL_UART_Transmit_DMA(_uart_nbus, _packet_tx->GetFrame(), length);
  72. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  73. this->_receive();
  74. return _packet_rx;
  75. }
  76. void NbusCommunicator::sendToMaster(DataFrame *master_frame){
  77. HAL_UART_Transmit_DMA(_uart_master, master_frame->GetFrame(), master_frame->GetLength());
  78. }
  79. // Application callbacks
  80. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
  81. flag_data_received = Size;
  82. }