Browse Source

okamzity broadcast STOP

Juraj Ďuďák 3 months ago
parent
commit
ef6bff619b
4 changed files with 55 additions and 29 deletions
  1. 7 4
      Core/Inc/NbusBridge.h
  2. 8 1
      Core/Src/AppBridge.cpp
  3. 29 13
      Core/Src/NbusBridge.cpp
  4. 11 11
      Core/Src/NbusCommunicator.cpp

+ 7 - 4
Core/Inc/NbusBridge.h

@@ -21,6 +21,8 @@
 #define BROADCAST_ADDRESS	0
 #define RX_META	4
 
+#define DATAPACKET_SIZE  (NBUS_MAX_FRAME_SIZE*MAX_SLAVES)
+
 /* DEFINES END */
 
 typedef enum {
@@ -38,27 +40,28 @@ private:
 	uint8_t _num_slaves;
 	RunState_e _run_state;
 	DataFrame *_workerFrame;
-	uint8_t _dataPacket[NBUS_MAX_FRAME_SIZE*MAX_SLAVES];
+	uint8_t _dataPacket[DATAPACKET_SIZE];
 	DataFrame *_dataFrame;
 
 	void transmit(DataFrame *packet);
-	void process_broadcast(uint8_t *rxFrame);
 	DataFrame *_frame_nbus_internal;
 	Nbus_pdu _pdu;
 
 public:
-	NbusBridge(NbusCommunicator *);
+	NbusBridge();
+	void setCommunicator(NbusCommunicator *nc);
 	virtual ~NbusBridge();
 
 	void scan();
 	uint8_t getNumSlaves();
-	bool call_echo(uint8_t slave);
+	//bool call_echo(uint8_t slave);
 	NbusSlave * getSlave(uint8_t index);
 	void sendResponseToMaster(DataFrame *response_frame);
 	void processRequest(uint8_t *rxFrame, uint8_t size);
 	void broadcastStart();
 	void broadcastStop();
 	void processRunningState();
+	void process_broadcast(uint8_t *rxFrame);
 
 };
 

+ 8 - 1
Core/Src/AppBridge.cpp

@@ -19,6 +19,8 @@ uint8_t pMasterUartFrame[64];
 volatile uint8_t vMasterUartIndex;
 volatile uint8_t vMasterUartSize;
 
+NbusBridge bridge;
+
 static void init_app(){
 	HAL_UARTEx_ReceiveToIdle_DMA(pUartMasterGlobal, pMasterUartRx, 64);
 	flagUartMasterDataReady = 0;
@@ -38,7 +40,7 @@ void app(UART_HandleTypeDef *uartNbus, UART_HandleTypeDef *uartMaster){
 	init_app();
 
 	NbusCommunicator nc(uartNbus, uartMaster);
-	NbusBridge bridge(&nc);
+	bridge.setCommunicator(&nc);
 	bridge.scan();
 
 
@@ -76,6 +78,11 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
 			vMasterUartSize = 0;
 			vMasterUartIndex = 0;
 			pMasterUartRx[0] = 0;
+			if (MODULE_ADDRESS(pMasterUartFrame) == 0){
+				bridge.process_broadcast(pMasterUartFrame);
+				// TODO tu este mozno deaktivovat spracovanie nroadcast paketu
+				// flagUartMasterDataReady = 0;
+			}
 		}
 	}
 }

+ 29 - 13
Core/Src/NbusBridge.cpp

@@ -36,7 +36,16 @@ static uint8_t crc8x_fast(void const *mem, uint16_t len)
     return crc;
 }
 
-NbusBridge::NbusBridge(NbusCommunicator *nc) {
+NbusBridge::NbusBridge() {
+
+	_communicator = NULL;
+	_num_slaves = 0;
+	_run_state = STATE_STOPPED;
+	_pdu.sa = BROADCAST_ADDRESS;
+
+}
+
+void NbusBridge::setCommunicator(NbusCommunicator *nc){
 	if(nc == NULL)
 	{
 		while(1){
@@ -49,7 +58,6 @@ NbusBridge::NbusBridge(NbusCommunicator *nc) {
 	_run_state = STATE_STOPPED;
 	_pdu.sa = BROADCAST_ADDRESS;
 	_dataFrame = new DataFrame(_dataPacket, sizeof(_dataPacket), TYPE_RAW, CRC_OFF);
-
 }
 
 NbusBridge::~NbusBridge() {
@@ -98,6 +106,7 @@ uint8_t NbusBridge::getNumSlaves(){
 	return _num_slaves;
 }
 
+/*
 bool NbusBridge::call_echo(uint8_t slave){
 	if(slave >= _num_slaves){
 			return false;
@@ -111,6 +120,7 @@ bool NbusBridge::call_echo(uint8_t slave){
 	getSlave(slave)->nbus_echo();
 	return true;
 }
+*/
 
 void NbusBridge::sendResponseToMaster(DataFrame *response_frame){
 	if(response_frame !=NULL && response_frame->IsEmpty() == false) {
@@ -147,7 +157,6 @@ void NbusBridge::process_broadcast(uint8_t *rxFrame){
 		;//nothing
 	}
 
-	HAL_Delay(1);	/// send BC and wait TX complete
 }
 
 
@@ -180,7 +189,7 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size){
 	break;
 
 	case FC_ECHO:			/* 1 */
-		_frame_nbus_internal = selected_slave->nbus_echo();
+		_frame_nbus_internal = selected_slave->nbus_echo(&rxFrame[3], size - 4);
 		break;
 
 	case FC_PARAM:			/* 4 */
@@ -239,6 +248,7 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size){
 }
 
 void NbusBridge::processRunningState(){
+
 	if (_run_state == STATE_STOPPED){
 		return;
 	}
@@ -250,14 +260,16 @@ void NbusBridge::processRunningState(){
 	}
 
 	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
-	NbusSlave *slave;
+	NbusSlave *slave = NULL;
 	uint8_t *slaveFrameResponse;
+	_dataFrame->Init();
+	_dataFrame->AddHeader(TYPE_HEADER_2B);
+	_dataFrame->AddInt32(HAL_GetTick());
+
+
 	for(uint32_t i=0; i< _num_slaves; i++){
 		slave = getSlave(_slave_adress[i]);
 		if(slave != NULL && slave->isActive()){
-			_dataFrame->Init();
-			_dataFrame->AddHeader(TYPE_HEADER_2B);
-			_dataFrame->AddInt32(HAL_GetTick());
 			for(uint32_t k = 1 ; k <= slave->nbus_get_sensor_count(false) ; k++){
 				_dataFrame->AddInt8(slave->getModuleAddress());
 				_workerFrame = slave->nbus_sensor_getData(k);
@@ -265,12 +277,16 @@ void NbusBridge::processRunningState(){
 				_dataFrame->AddInt8(slave->getSensorAddress());
 				_dataFrame->AddArray(&slaveFrameResponse[3], _workerFrame->GetLength()-3);
 			}
-			_dataFrame->AddInt8(0xFF);
-			_dataFrame->AddInt8(0xFF);
-			_dataFrame->Commit();
-			sendResponseToMaster(_dataFrame);
 		}
+	}
 
+	_dataFrame->AddInt8(0xFF);
+	_dataFrame->AddInt8(0xFF);
+	_dataFrame->Commit();
+	// TODO problem: v stavi RUNNING pride STOP prikaz, ale ten sa nespracuje, pretoze bezi obsluha tejto funkcie.
+	if(_run_state == STATE_RUNNING){
+		sendResponseToMaster(_dataFrame);
 	}
-	HAL_Delay(1);	// TREBA VYSKUSAT
+
+	HAL_Delay(50);	// TREBA VYSKUSAT
 }

+ 11 - 11
Core/Src/NbusCommunicator.cpp

@@ -51,25 +51,25 @@ void NbusCommunicator::_receive(){
 	uint16_t received_size;
 	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
 
+	memset(_data_packet_comm, 0, NBUS_MAX_FRAME_SIZE);
 	// 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);
+	HAL_StatusTypeDef status = HAL_UARTEx_ReceiveToIdle(_uart_nbus, _data_packet_comm, NBUS_MAX_FRAME_SIZE, &received_size, 2);
 
 	_packet_rx->Init();
-	if(received_size > 0){
-		_packet_rx->FromArray(_data_packet_comm, received_size);
+
+	if (status == HAL_OK){
+		if(received_size > 0){
+			_packet_rx->FromArray(_data_packet_comm, received_size);
+		}
 	}
+
+	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
+
 	_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);
@@ -89,7 +89,7 @@ void NbusCommunicator::send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len){
 	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_UART_Transmit(_uart_nbus, _packet_tx->GetFrame(), length, 10);
 	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
 
 }