|
|
@@ -7,7 +7,6 @@
|
|
|
|
|
|
#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);
|
|
|
@@ -50,22 +49,21 @@ NbusCommunicator::~NbusCommunicator() {
|
|
|
|
|
|
|
|
|
void NbusCommunicator::_receive(){
|
|
|
- flag_data_received = -1;
|
|
|
+ uint16_t received_size;
|
|
|
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);
|
|
|
+ // komunikacia v DMA musi byt spracovana aj tak ako blokujuca
|
|
|
+ // takto je tu menej rezie
|
|
|
+ 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(flag_data_received > 0){
|
|
|
-// _packet_rx->AddArray(_data_packet_comm, flag_data_received);
|
|
|
- _packet_rx->FromArray(_data_packet_comm, flag_data_received);
|
|
|
+ if(received_size > 0){
|
|
|
+ _packet_rx->FromArray(_data_packet_comm, received_size);
|
|
|
}
|
|
|
_packet_rx->Commit();
|
|
|
|
|
|
- flag_data_received = 0;
|
|
|
}
|
|
|
|
|
|
void NbusCommunicator::transmit(uint8_t *frame, uint8_t length){
|
|
|
@@ -78,7 +76,7 @@ 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
|
|
|
+ _packet_tx->AddInt8(pdu->fc); // Function Code
|
|
|
for(int i = 0 ; i< data_len ; i++){
|
|
|
_packet_tx->AddInt8(data[i]);
|
|
|
}
|
|
|
@@ -94,11 +92,22 @@ DataFrame* NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len
|
|
|
}
|
|
|
|
|
|
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());
|
|
|
}
|
|
|
|
|
|
|
|
|
+/*
|
|
|
// Application callbacks
|
|
|
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
|
|
|
- flag_data_received = Size;
|
|
|
+ if(huart == &huart1) {
|
|
|
+// if(huart->RxEventType != HAL_UART_RXEVENT_HT){
|
|
|
+ flag_nbus_received = Size;
|
|
|
+// }
|
|
|
+ }
|
|
|
}
|
|
|
+*/
|