/* * @file NbusCommunicator.cpp * * @date: Mar 7, 2025 * @author: juraj */ #include "NbusCommunicator.h" volatile int32_t flag_data_received = -1; NbusCommunicator::NbusCommunicator(UART_HandleTypeDef* uartUbus, UART_HandleTypeDef *uartMaster) { _packet_tx = new DataFrame(_data_packet_tx, sizeof(_data_packet_tx), TYPE_PLAIN, CRC_ON); if(_packet_tx == NULL) { while(1){ __NOP(); } } _packet_rx = new DataFrame(_data_packet_rx, sizeof(_data_packet_rx), TYPE_PLAIN, CRC_OFF);\ if(_packet_rx == NULL) { while(1){ __NOP(); } } if(uartUbus == NULL) { while(1){ __NOP(); } } _uart_nbus = uartUbus; if(uartMaster == NULL) { while(1){ __NOP(); } } _uart_master = uartMaster; } NbusCommunicator::~NbusCommunicator() { // TODO Auto-generated destructor stub } void NbusCommunicator::_receive(){ flag_data_received = -1; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_comm, NBUS_MAX_FRAME_SIZE); uint32_t stop_receive = HAL_GetTick() + 2; while(flag_data_received < 0 && HAL_GetTick() < stop_receive); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); _packet_rx->Init(); if(flag_data_received > 0){ // _packet_rx->AddArray(_data_packet_comm, flag_data_received); _packet_rx->FromArray(_data_packet_comm, flag_data_received); } _packet_rx->Commit(); flag_data_received = 0; } void NbusCommunicator::transmit(uint8_t *frame, uint8_t length){ HAL_UART_Transmit(_uart_nbus, frame, length, 100); HAL_UARTEx_ReceiveToIdle_DMA(_uart_nbus, _data_packet_rx, 64); } DataFrame* NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){ _packet_tx->Init(); _packet_tx->AddInt8(pdu->ma); // Module address _packet_tx->AddInt8(pdu->sa); // Slave address _packet_tx->AddInt8(pdu->fc); // ECHO for(int i = 0 ; i< data_len ; i++){ _packet_tx->AddInt8(data[i]); } int length = _packet_tx->Commit(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); HAL_UART_Transmit_DMA(_uart_nbus, _packet_tx->GetFrame(), length); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); this->_receive(); return _packet_rx; } void NbusCommunicator::sendToMaster(DataFrame *master_frame){ HAL_UART_Transmit_DMA(_uart_master, master_frame->GetFrame(), master_frame->GetLength()); } // Application callbacks void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){ flag_data_received = Size; }