浏览代码

Bridge cast bug fix

xnecas 2 天之前
父节点
当前提交
33e11ac6da
共有 3 个文件被更改,包括 57 次插入29 次删除
  1. 6 0
      Core/Inc/NbusBridge.h
  2. 2 0
      Core/Inc/nbus_defines.h
  3. 49 29
      Core/Src/NbusBridge.cpp

+ 6 - 0
Core/Inc/NbusBridge.h

@@ -120,6 +120,8 @@ private:
 	 */
 	DataFrame * _makePacket(Nbus_PDU_t pdu, uint8_t *data, uint8_t size);
 
+	DataFrame * _makeBridgeDataPacket();
+
 	/** Make raw packet (just copy whole input frame).
 	 * @param daa: application data
 	 * @param size: application data size
@@ -127,6 +129,10 @@ private:
 	 */
 	DataFrame * _forwardPacket(uint8_t *data, uint8_t size);
 
+	void _addDataPayload(DataFrame * data_frame);
+
+
+
 
 	NbusCommunicator *_communicator{nullptr};													///< nBus HW communicator
 	NbusSlave _slaves[NBUS_BRIDGE_MAX_SLAVES];                                                  ///< array of nBus slaves

+ 2 - 0
Core/Inc/nbus_defines.h

@@ -52,6 +52,8 @@
 /** @brief Macro to set error response. */
 #define NBUS_SET_ERR_RESPONSE(fc)		((fc) | 0x80)
 
+#define NBUS_CHECK_ERR_RESPONSE(packet)	((packet)[2] & 0x80)
+
 /* END GENERAL NBUS DEFINES */
 
 

+ 49 - 29
Core/Src/NbusBridge.cpp

@@ -105,13 +105,6 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
 
 void NbusBridge::processRunningState()
 {
-
-    if (_scan_request == 1)
-    {
-        _scan_request = 0;
-        this->scanNetwork();
-    }
-
     if (_run_state == STATE_STOPPED)
     {
         return;
@@ -126,7 +119,7 @@ void NbusBridge::processRunningState()
 
     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
 
-    _worker_frame_ptr = _cmdGetData();
+    _worker_frame_ptr = _makeBridgeDataPacket();
 
     // TODO problem: v stavi RUNNING pride STOP prikaz, ale ten sa nespracuje, pretoze bezi obsluha tejto funkcie.
     if (_run_state == STATE_RUNNING)
@@ -178,14 +171,16 @@ void NbusBridge::_processBridgeRequest(uint8_t *rx_frame, uint8_t size)
 
     case NBUS_SET_CMD(FC_STOP):  /* SET 2 */
     	_cmdSetStop();
+    	_worker_frame_ptr = nullptr;
     	break;
 
     case NBUS_SET_CMD(FC_START): /* SET 3 */
     	_cmdSetStart();
+  		_worker_frame_ptr = nullptr;
     	break;
 
     case NBUS_SET_CMD(FC_RESET): /* SET 9 */
-        _scan_request = 1;
+		scanNetwork();
         _worker_frame_ptr = _rspSetStatus(STATUS_SUCCESS);
         break;
 
@@ -230,27 +225,14 @@ void NbusBridge::_processSlaveRequest(uint8_t *rx_frame, uint8_t size)
 
 DataFrame* NbusBridge::_cmdGetData()
 {
-	NbusSlave * slave_ptr = nullptr;
-
-	_bridge_cast_frame.Init();
-	_bridge_cast_frame.AddArray(_bridge_cast_header, NBUS_BRIDGE_HEADER_SIZE);		// add header
-	_bridge_cast_frame.AddUint32(HAL_GetTick());
-
-
-	for (uint32_t i = 0; i < _num_slaves; i++)
-	{
-		slave_ptr = _getSlave(_slave_adress[i]);
-		if (slave_ptr != nullptr)
-		{
-			_bridge_cast_frame.AddUint8(slave_ptr->getModuleAddress());
-			_worker_frame_ptr = slave_ptr->cmdGetData();
-			_bridge_cast_frame.AddArray(&NBUS_RX_DATA0(_worker_frame_ptr->GetFrame() + 1), _worker_frame_ptr->GetLength() - (NBUS_RX_META_SIZE + 1)); // add without length byte
-		}
-	}
-
-	_bridge_cast_frame.AddUint8(_crc8x_fast(_bridge_cast_frame.GetFrame(), _bridge_cast_frame.GetLength())); // add crc8
+	_default_frame.Init();
+	_default_frame.AddUint8(NBUS_BROADCAST_ADDRESS);
+	_default_frame.AddUint8(NBUS_BRIDGE_ADDRESS);
+	_default_frame.AddUint8((Nbus_FC_e)FC_DATA);
+	_addDataPayload(&_default_frame);
+	_default_frame.Commit();
 
-	return &_bridge_cast_frame;
+	return &_default_frame;
 }
 
 DataFrame * NbusBridge::_cmdGetInfo()
@@ -372,6 +354,18 @@ DataFrame* NbusBridge::_makePacket(Nbus_PDU_t pdu, uint8_t *data, uint8_t size)
 	return &_default_frame;
 }
 
+DataFrame* NbusBridge::_makeBridgeDataPacket()
+{
+
+	_bridge_cast_frame.Init();
+	_bridge_cast_frame.AddArray(_bridge_cast_header, NBUS_BRIDGE_HEADER_SIZE);		// add header
+	_addDataPayload(&_bridge_cast_frame);
+	_bridge_cast_frame.AddUint8(_crc8x_fast(_bridge_cast_frame.GetFrame() + NBUS_BRIDGE_HEADER_SIZE, _bridge_cast_frame.GetLength() - NBUS_BRIDGE_HEADER_SIZE)); // add crc8
+
+	return &_bridge_cast_frame;
+}
+
+
 DataFrame* NbusBridge::_forwardPacket(uint8_t *data, uint8_t size)
 {
 	_raw_data_frame.Init();
@@ -380,3 +374,29 @@ DataFrame* NbusBridge::_forwardPacket(uint8_t *data, uint8_t size)
 
 	return &_raw_data_frame;
 }
+
+void NbusBridge::_addDataPayload(DataFrame * data_frame)
+{
+	NbusSlave *slave_ptr = nullptr;
+
+	data_frame->AddUint32(HAL_GetTick());
+
+	for (uint32_t i = 0; i < _num_slaves; i++)
+	{
+		slave_ptr = _getSlave(_slave_adress[i]);
+
+		if (slave_ptr != nullptr)
+		{
+			data_frame->AddUint8(slave_ptr->getModuleAddress());
+			_worker_frame_ptr = slave_ptr->cmdGetData();
+
+			// check error state
+			if (_worker_frame_ptr->GetLength() < (NBUS_RX_META_SIZE + 1) || NBUS_CHECK_ERR_RESPONSE(_worker_frame_ptr->GetFrame() + 1))
+			{
+				continue;
+			}
+
+			data_frame->AddArray(&NBUS_RX_DATA0(_worker_frame_ptr->GetFrame() + 1), _worker_frame_ptr->GetLength() - (NBUS_RX_META_SIZE + 1)); // add without length byte
+		}
+	}
+}