| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*
- * @file NbusCommunicator.cpp
- * @brief Implemetnácia komunikačnej vrstvy: 1) internej 2) externej
- * @date Mar 7, 2025
- * @author Juraj Dudak
- */
- #include "NbusCommunicator.h"
- 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() {
- // empty
- }
- void NbusCommunicator::_receive(){
- uint16_t received_size;
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
- // komunikacia v DMA musi byt spracovana aj tak ako blokujuca
- // takto je tu menej rezie. Timeout je 2ms
- HAL_UARTEx_ReceiveToIdle(_uart_nbus, _data_packet_comm, NBUS_MAX_FRAME_SIZE, &received_size, 2);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
- _packet_rx->Init();
- if(received_size > 0){
- _packet_rx->FromArray(_data_packet_comm, received_size);
- }
- _packet_rx->Commit();
- }
- //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::sendAndReceive(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
- this->send(pdu, data, data_len);
- this->_receive();
- return _packet_rx;
- }
- void 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); // Function Code
- 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);
- }
- void NbusCommunicator::sendToMaster(DataFrame *master_frame){
- while (_uart_master->gState != HAL_UART_STATE_READY) {
- __NOP(); // cakanie na ukoncenie prebiehajuceho odosielania
- // tu to moze byt vcelku tesno odoslany dalsi paket. je tam pauza o dlzke 1.2bit
- }
- HAL_UART_Transmit_DMA(_uart_master, master_frame->GetFrame(), master_frame->GetLength());
- }
|