NbusCommunicator.cpp 2.4 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. memset(_data_packet_comm, 0, NBUS_MAX_FRAME_SIZE);
  45. // komunikacia v DMA musi byt spracovana aj tak ako blokujuca
  46. // takto je tu menej rezie. Timeout je 2ms
  47. HAL_StatusTypeDef status = HAL_UARTEx_ReceiveToIdle(_uart_nbus, _data_packet_comm, NBUS_MAX_FRAME_SIZE, &received_size, 2);
  48. _packet_rx->Init();
  49. if (status == HAL_OK){
  50. if(received_size > 0){
  51. _packet_rx->FromArray(_data_packet_comm, received_size);
  52. }
  53. }
  54. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  55. _packet_rx->Commit();
  56. }
  57. DataFrame* NbusCommunicator::sendAndReceive(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
  58. this->send(pdu, data, data_len);
  59. this->_receive();
  60. return _packet_rx;
  61. }
  62. void NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
  63. _packet_tx->Init();
  64. _packet_tx->AddInt8(pdu->ma); // Module address
  65. _packet_tx->AddInt8(pdu->sa); // Slave address
  66. _packet_tx->AddInt8(pdu->fc); // Function Code
  67. for(int i = 0 ; i< data_len ; i++){
  68. _packet_tx->AddInt8(data[i]);
  69. }
  70. int length = _packet_tx->Commit();
  71. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  72. HAL_UART_Transmit(_uart_nbus, _packet_tx->GetFrame(), length, 10);
  73. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  74. }
  75. void NbusCommunicator::sendToMaster(DataFrame *master_frame){
  76. while (_uart_master->gState != HAL_UART_STATE_READY) {
  77. __NOP(); // cakanie na ukoncenie prebiehajuceho odosielania
  78. // tu to moze byt vcelku tesno odoslany dalsi paket. je tam pauza o dlzke 1.2bit
  79. }
  80. HAL_UART_Transmit_DMA(_uart_master, master_frame->GetFrame(), master_frame->GetLength());
  81. }