NbusCommunicator.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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
  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. HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_rx, 64);
  57. }
  58. DataFrame* NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
  59. _packet_tx->Init();
  60. _packet_tx->AddInt8(pdu->ma); // Module address
  61. _packet_tx->AddInt8(pdu->sa); // Slave address
  62. _packet_tx->AddInt8(pdu->fc); // Function Code
  63. for(int i = 0 ; i< data_len ; i++){
  64. _packet_tx->AddInt8(data[i]);
  65. }
  66. int length = _packet_tx->Commit();
  67. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
  68. HAL_UART_Transmit_DMA(_uart_nbus, _packet_tx->GetFrame(), length);
  69. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
  70. this->_receive();
  71. return _packet_rx;
  72. }
  73. void NbusCommunicator::sendToMaster(DataFrame *master_frame){
  74. while (_uart_master->gState != HAL_UART_STATE_READY) {
  75. __NOP(); // cakanie na ukoncenie prebiehajuceho odosielania
  76. // tu to moze byt vcelku tesno odoslany dalsi paket. je tam pauza o dlzke 1.2bit
  77. }
  78. HAL_UART_Transmit_DMA(_uart_master, master_frame->GetFrame(), master_frame->GetLength());
  79. }