Browse Source

Bgidge cast bug fix and added data format.

xnecas 1 week ago
parent
commit
235523c7ae
4 changed files with 61 additions and 15 deletions
  1. 12 7
      Core/Inc/NbusBridge.h
  2. 7 2
      Core/Inc/NbusSlave.h
  3. 37 6
      Core/Src/NbusBridge.cpp
  4. 5 0
      Core/Src/NbusSlave.cpp

+ 12 - 7
Core/Inc/NbusBridge.h

@@ -82,6 +82,11 @@ private:
 	 */
 	DataFrame * _cmdGetInfo();
 
+	/** Implementation of CMD_GET_FORMAT for bridge.
+	 * @return: response to master
+	 */
+	DataFrame * _cmdGetFormat();
+
 	/** Implementation of CMD_GET_SLAVES for bridge.
 	 * @return: response to master
 	 */
@@ -124,17 +129,17 @@ private:
 
 
 	NbusCommunicator *_communicator{nullptr};													///< nBus HW communicator
-	NbusSlave _slaves[NBUS_BRIDGE_MAX_SLAVES];                                                              ///< array of nBus slaves
-	uint8_t _slave_adress[NBUS_BRIDGE_MAX_SLAVES]{0};                                                       ///< array of slave addresses
+	NbusSlave _slaves[NBUS_BRIDGE_MAX_SLAVES];                                                  ///< array of nBus slaves
+	uint8_t _slave_adress[NBUS_BRIDGE_MAX_SLAVES]{0};                                           ///< array of slave addresses
 	uint8_t _num_slaves{0};                                                                     ///< number of slaves
 	Nbus_RunState_e _run_state{STATE_STOPPED};                                                  ///< running state flag
 	DataFrame *_worker_frame_ptr{nullptr};														///< pointer to actual data frame
-	uint8_t _data_packet[NBUS_BRIDGE_DATAPACKET_SIZE]{0};                                                   ///< data packet buffer
-	DataFrame _bridge_cast_frame{_data_packet, NBUS_BRIDGE_DATAPACKET_SIZE, TYPE_HEADER_2B, CRC_OFF};		///< data frame for bridge cast
-	DataFrame _default_frame{_data_packet, NBUS_BRIDGE_DATAPACKET_SIZE, TYPE_PLAIN, CRC_ON};                ///< data frame for default operation
-	DataFrame _raw_data_frame{_data_packet, NBUS_BRIDGE_DATAPACKET_SIZE, TYPE_RAW, CRC_OFF};                ///< raw data frame for copying
+	uint8_t _data_packet[NBUS_BRIDGE_DATAPACKET_SIZE]{0};                                       ///< data packet buffer
+	DataFrame _bridge_cast_frame{_data_packet, NBUS_BRIDGE_DATAPACKET_SIZE, TYPE_RAW, CRC_OFF}; ///< data frame for bridge cast
+	DataFrame _default_frame{_data_packet, NBUS_BRIDGE_DATAPACKET_SIZE, TYPE_PLAIN, CRC_ON};    ///< data frame for default operation
+	DataFrame _raw_data_frame{_data_packet, NBUS_BRIDGE_DATAPACKET_SIZE, TYPE_RAW, CRC_OFF};    ///< raw data frame for copying
 	uint8_t _scan_request{0};																	///< flag if scan request is necessary
-	Nbus_PDU_t _pdu{NBUS_BROADCAST_ADDRESS, NBUS_BROADCAST_ADDRESS, FC_ECHO};                             ///< nBus actual PDU
+	Nbus_PDU_t _pdu{NBUS_BROADCAST_ADDRESS, NBUS_BROADCAST_ADDRESS, FC_ECHO};                   ///< nBus actual PDU
 };
 
 #endif /* SRC_NBUSBRIDGE_H_ */

+ 7 - 2
Core/Inc/NbusSlave.h

@@ -40,12 +40,17 @@ public:
 	 * @param slave_frame: data to send
 	 * @return: response data frame
 	 */
-	DataFrame * cmdProcessAnyRequest(DataFrame *slave_frame);
+	DataFrame* cmdProcessAnyRequest(DataFrame *slave_frame);
 
 	/** Send nBus request and get sensor data.
 	 * @return: response data frame
 	 */
-	DataFrame * cmdGetData();
+	DataFrame* cmdGetData();
+
+	/** Send nBus request and get sensor format.
+	 * @return: response data frame
+	 */
+	DataFrame* cmdGetFormat();
 
 	/** Send nBus request and get sensor count.
 	 * @param check_hw: 1 = load from bus, 0 = use local cache

+ 37 - 6
Core/Src/NbusBridge.cpp

@@ -172,7 +172,7 @@ void NbusBridge::_processBridgeRequest(uint8_t *rx_frame, uint8_t size)
 {
 	switch (NBUS_RX_FUNCTION_CODE(rx_frame))
     {
-    case FC_ECHO:			/* GET 1 */
+    case FC_ECHO:				/* GET 1 */
     	_worker_frame_ptr = _forwardPacket(rx_frame, size);
     	break;
 
@@ -189,15 +189,19 @@ void NbusBridge::_processBridgeRequest(uint8_t *rx_frame, uint8_t size)
         _worker_frame_ptr = _rspSetStatus(STATUS_SUCCESS);
         break;
 
-    case FC_DATA:           /* GET 11 */
+    case FC_DATA:           	/* GET 11 */
     	_worker_frame_ptr = _cmdGetData();
     	break;
 
-    case FC_INFO:           /* GET 0xE => 15 */
+    case FC_INFO:           	/* GET 14 */
     	_worker_frame_ptr = _cmdGetInfo();
         break;
 
-    case FC_SLAVES:         /* GET 0x10 => 16 */
+    case FC_SENSOR_FORMAT: 		/* GET 15 */
+       	_worker_frame_ptr = _cmdGetFormat();
+        break;
+
+    case FC_SLAVES: 			/* GET 16 */
        	_worker_frame_ptr = _cmdGetSlaves();
         break;
 
@@ -229,8 +233,10 @@ DataFrame* NbusBridge::_cmdGetData()
 	NbusSlave * slave_ptr = nullptr;
 
 	_bridge_cast_frame.Init();
+	_bridge_cast_frame.AddHeader(TYPE_HEADER_2B);
 	_bridge_cast_frame.AddInt32(HAL_GetTick());
 
+
 	for (uint32_t i = 0; i < _num_slaves; i++)
 	{
 		slave_ptr = _getSlave(_slave_adress[i]);
@@ -242,8 +248,8 @@ DataFrame* NbusBridge::_cmdGetData()
 		}
 	}
 
-	_bridge_cast_frame.AddInt8(NBUS_BRIDGE_TERMINATOR);
-	_bridge_cast_frame.AddInt8(NBUS_BRIDGE_TERMINATOR);
+	_bridge_cast_frame.AddInt8(NBUS_BRIDGE_FOOTER_BYTE0);
+	_bridge_cast_frame.AddInt8(NBUS_BRIDGE_FOOTER_BYTE1);
 	_bridge_cast_frame.Commit();
 
 	return &_bridge_cast_frame;
@@ -263,6 +269,31 @@ DataFrame * NbusBridge::_cmdGetInfo()
 	return &_default_frame;
 }
 
+DataFrame * NbusBridge::_cmdGetFormat()
+{
+	NbusSlave * slave_ptr = nullptr;
+
+	_default_frame.Init();
+	_default_frame.AddUint8(NBUS_BROADCAST_ADDRESS);
+	_default_frame.AddUint8(NBUS_BRIDGE_ADDRESS);
+	_default_frame.AddUint8(FC_SENSOR_FORMAT);
+
+	for (uint32_t i = 0; i < _num_slaves; i++)
+	{
+		slave_ptr = _getSlave(_slave_adress[i]);
+		if (slave_ptr != nullptr)
+		{
+			_default_frame.AddInt8(slave_ptr->getModuleAddress());
+			_worker_frame_ptr = slave_ptr->cmdGetFormat();
+			_default_frame.AddArray(&NBUS_RX_DATA0(_worker_frame_ptr->GetFrame() + 1), _worker_frame_ptr->GetLength() - (NBUS_RX_META_SIZE + 1)); // add without length byte
+		}
+	}
+
+	_default_frame.Commit();
+
+	return &_default_frame;
+}
+
 DataFrame* NbusBridge::_cmdGetSlaves()
 {
 	_default_frame.Init();

+ 5 - 0
Core/Src/NbusSlave.cpp

@@ -37,6 +37,11 @@ DataFrame *NbusSlave::cmdGetData()
 	return _communicator->sendAndReceiveSlave(_makePacket(FC_DATA));
 }
 
+DataFrame *NbusSlave::cmdGetFormat()
+{
+	return _communicator->sendAndReceiveSlave(_makePacket(FC_SENSOR_FORMAT));
+}
+
 uint8_t NbusSlave::nbusSlaveCmd_getSensorCnt(bool check_hw)
 {
     if (_sensor_count == 0 || check_hw == true)