NbusCommunicator.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * @file NbusCommunicator.cpp
  3. * @brief Implemetnácia komunikačnej vrstvy: 1) internej 2) externej
  4. * @date Mar 7, 2025
  5. * @author Juraj Dudak
  6. */
  7. #include "NbusCommunicator.h"
  8. NbusCommunicator::NbusCommunicator(UART_HandleTypeDef* uartUbus, UART_HandleTypeDef *uartMaster) {
  9. _packet_tx = new DataFrame(_data_packet_tx, sizeof(_data_packet_tx), TYPE_PLAIN, CRC_ON);
  10. if(_packet_tx == NULL)
  11. {
  12. while(1){
  13. __NOP();
  14. }
  15. }
  16. _packet_rx = new DataFrame(_data_packet_rx, sizeof(_data_packet_rx), TYPE_PLAIN, CRC_OFF);\
  17. if(_packet_rx == NULL)
  18. {
  19. while(1){
  20. __NOP();
  21. }
  22. }
  23. if(uartUbus == NULL)
  24. {
  25. while(1){
  26. __NOP();
  27. }
  28. }
  29. _uart_nbus = uartUbus;
  30. if(uartMaster == NULL)
  31. {
  32. while(1){
  33. __NOP();
  34. }
  35. }
  36. _uart_master = uartMaster;
  37. }
  38. NbusCommunicator::~NbusCommunicator() {
  39. // empty
  40. }
  41. void NbusCommunicator::_receive(){
  42. uint16_t received_size;
  43. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  44. // komunikacia v DMA musi byt spracovana aj tak ako blokujuca
  45. // takto je tu menej rezie. Timeout je 2ms
  46. HAL_UARTEx_ReceiveToIdle(_uart_nbus, _data_packet_comm, NBUS_MAX_FRAME_SIZE, &received_size, 2);
  47. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  48. _packet_rx->Init();
  49. if(received_size > 0){
  50. _packet_rx->FromArray(_data_packet_comm, received_size);
  51. }
  52. _packet_rx->Commit();
  53. }
  54. //void NbusCommunicator::transmit(uint8_t *frame, uint8_t length){
  55. // HAL_UART_Transmit(_uart_nbus, frame, length, 100);
  56. //
  57. // HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_rx, 64);
  58. //}
  59. DataFrame* NbusCommunicator::sendAndReceive(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
  60. this->send(pdu, data, data_len);
  61. this->_receive();
  62. return _packet_rx;
  63. }
  64. void NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
  65. _packet_tx->Init();
  66. _packet_tx->AddInt8(pdu->ma); // Module address
  67. _packet_tx->AddInt8(pdu->sa); // Slave address
  68. _packet_tx->AddInt8(pdu->fc); // Function Code
  69. for(int i = 0 ; i< data_len ; i++){
  70. _packet_tx->AddInt8(data[i]);
  71. }
  72. int length = _packet_tx->Commit();
  73. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  74. HAL_UART_Transmit_DMA(_uart_nbus, _packet_tx->GetFrame(), length);
  75. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  76. }
  77. void NbusCommunicator::sendToMaster(DataFrame *master_frame){
  78. while (_uart_master->gState != HAL_UART_STATE_READY) {
  79. __NOP(); // cakanie na ukoncenie prebiehajuceho odosielania
  80. // tu to moze byt vcelku tesno odoslany dalsi paket. je tam pauza o dlzke 1.2bit
  81. }
  82. HAL_UART_Transmit_DMA(_uart_master, master_frame->GetFrame(), master_frame->GetLength());
  83. }