NbusCommunicator.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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) {
  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_ON);\
  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. }
  32. NbusCommunicator::~NbusCommunicator() {
  33. // TODO Auto-generated destructor stub
  34. }
  35. void NbusCommunicator::_receive(){
  36. flag_data_received = -1;
  37. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  38. HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_comm, NBUS_MAX_FRAME_SIZE);
  39. uint32_t stop_receive = HAL_GetTick() + 2;
  40. while(flag_data_received < 0 && HAL_GetTick() < stop_receive);
  41. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  42. _packet_rx->Init();
  43. if(flag_data_received > 0){
  44. _packet_rx->AddArray(_data_packet_comm, flag_data_received);
  45. }
  46. _packet_rx->Commit();
  47. flag_data_received = 0;
  48. }
  49. void NbusCommunicator::transmit(uint8_t *frame, uint8_t length){
  50. HAL_UART_Transmit(_uart_nbus, frame, length, 100);
  51. HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_rx, 64);
  52. }
  53. DataFrame* NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
  54. _packet_tx->Init();
  55. _packet_tx->AddInt8(pdu->ma); // Module address
  56. _packet_tx->AddInt8(pdu->sa); // Slave address
  57. _packet_tx->AddInt8(pdu->fc); // ECHO
  58. for(int i = 0 ; i< data_len ; i++){
  59. _packet_tx->AddInt8(data[i]);
  60. }
  61. int length = _packet_tx->Commit();
  62. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  63. HAL_UART_Transmit(_uart_nbus, _packet_tx->GetFrame(), length, 100);
  64. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  65. this->_receive();
  66. return _packet_rx;
  67. }
  68. // Application callbacks
  69. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
  70. flag_data_received = Size;
  71. }