Ver código fonte

bridge cmd: DATA, RESET, SLAVES

Juraj Ďuďák 3 semanas atrás
pai
commit
b9cd9a418b

+ 1 - 1
Core/Inc/NbusBridge.h

@@ -82,7 +82,7 @@ public:
 	void scan();
 	uint8_t getNumSlaves();
 	NbusSlave * getSlave(uint8_t index);
-	DataFrame * getSlavesInfo();
+	DataFrame * getSlavesInfo(uint8_t *rxFrame);
 	void sendResponseToMaster(DataFrame *response_frame);
 	void processRequest(uint8_t *rxFrame, uint8_t size);
 	void process_bridge_request(uint8_t *rxFrame, uint8_t size);

+ 1 - 1
Core/Inc/NbusCommunicator.h

@@ -40,7 +40,7 @@ public:
 	virtual ~NbusCommunicator();
 
 	DataFrame* sendAndReceive(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len);
-	DataFrame* formatSlaveInfo(uint8_t slave_address[], uint8_t num);
+	DataFrame* formatSlaveInfo(uint8_t rx_frame[], uint8_t slave_address[], uint8_t num);
 	void send(Nbus_pdu *pdu, uint8_t *data, uint8_t data_len);
 
 	DataFrame *formatPacket(uint8_t *rxFrame, uint8_t size);

+ 1 - 0
Core/Inc/NbusSlave.h

@@ -41,6 +41,7 @@ public:
 	DataFrame* nbus_sensor_getData(uint8_t sensor_address);
 	DataFrame* nbus_sensor_parameter(uint8_t, uint8_t);
 	DataFrame* nbus_sensor_parameters(uint8_t);
+	DataFrame* nbus_module_find(void);
 
 	uint8_t nbus_get_sensor_count(bool check_hw = false);
 

+ 2 - 3
Core/Src/AppBridge.cpp

@@ -6,7 +6,6 @@
  * @author Juraj Dudak
  */
 
-
 #include "AppBridge.h"
 #include "NbusBridge.h"
 
@@ -36,10 +35,10 @@ static void init_app()
     vMasterUartSize = 0;
 
     // boot long blink
-    for (uint32_t i = 0; i < 64; i++)
+    for (uint32_t i = 0; i < 10; i++)
     {
         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
-        HAL_Delay(25);
+        HAL_Delay(50);
     }
 }
 

+ 73 - 40
Core/Src/NbusBridge.cpp

@@ -7,6 +7,8 @@
 
 #include "NbusBridge.h"
 
+volatile uint8_t scan_request = 0;
+
 static uint8_t const crc8x_table[] = {
     0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, 0x70, 0x77, 0x7E,
     0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB,
@@ -73,6 +75,7 @@ NbusBridge::~NbusBridge()
  */
 void NbusBridge::scan()
 {
+    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
     _num_slaves = 0;
 
     DataFrame *frame;
@@ -87,6 +90,12 @@ void NbusBridge::scan()
 
     for (uint32_t i = 1; i < MAX_SLAVES; i++)
     {
+        _slave_adress[i] = 0;
+    }
+
+    for (uint32_t i = 1; i < MAX_SLAVES; i++)
+    {
+        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
         pdu.ma = i;
         frame = _communicator->sendAndReceive(&pdu, data, 4);
         if (!frame->IsEmpty())
@@ -102,6 +111,8 @@ void NbusBridge::scan()
             }
         }
     }
+
+    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
 }
 
 /**
@@ -185,38 +196,51 @@ void NbusBridge::process_broadcast(uint8_t *rxFrame)
     }
 }
 
-
 /**
  * Spracovanie requestu pre bridge.
  * Implementované funkcie:
  * - FC_SLAVES
+ *   Formát odpovede: [senzor_idenx:sensor_address,]
+ * - FC_RESET
+ * 	 Odpoveď: kópia požiadavky
  * - FC_INFO
+ * 	 Odpoved: XXXYYYZZZ, kde X-verzia FW, Y-použitá platfoma MCU, Z-verzia HW (formát: ASCII)
  * - FC_ECHO
+ * 	 Odpoveď: kópia požiadavky
  */
 void NbusBridge::process_bridge_request(uint8_t *rxFrame, uint8_t size)
 {
     switch (FUNCTION_CODE(rxFrame))
     {
 
-    case FC_ECHO: 		/* 1 */
-    	_frame_nbus_internal = _communicator->formatPacket(rxFrame, size);
+    case FC_ECHO: /* 1 */
+        _frame_nbus_internal = _communicator->formatPacket(rxFrame, size);
         break;
 
-    case FC_INFO: 		/* 0xE => 15 */
-    	/*
-    	 * verzia
-    	 * HW
-    	 * HW.verzia
-    	 */
-    	_frame_nbus_internal->Init();
-    	_frame_nbus_internal->AddArray((uint8_t*)BRIDGE_INFO_VERSION, 3);
-    	_frame_nbus_internal->AddArray((uint8_t*)BRIDGE_INFO_HW_FAMILY, 3);
-    	_frame_nbus_internal->AddArray((uint8_t*)BRIDGE_INFO_HW_VERSION, 3);
-    	_frame_nbus_internal->Commit();
+    case FC_RESET: /* 9 */
+    {
+        scan_request = 1;
+        // send same frame back
+        _frame_nbus_internal = _communicator->formatPacket(rxFrame, size);
+    }
+    break;
+
+    case FC_INFO: /* 0xE => 15 */
+        /*
+         * verzia
+         * HW
+         * HW.verzia
+         */
+        _frame_nbus_internal->Init();
+        _frame_nbus_internal->AddArray(rxFrame, 3); // addheader
+        _frame_nbus_internal->AddArray((uint8_t *)BRIDGE_INFO_VERSION, 3);
+        _frame_nbus_internal->AddArray((uint8_t *)BRIDGE_INFO_HW_FAMILY, 3);
+        _frame_nbus_internal->AddArray((uint8_t *)BRIDGE_INFO_HW_VERSION, 3);
+        _frame_nbus_internal->Commit();
         break;
 
-    case FC_SLAVES: 	/* 0x10 => 16 */
-        _frame_nbus_internal = getSlavesInfo();
+    case FC_SLAVES: /* 0x10 => 16 */
+        _frame_nbus_internal = getSlavesInfo(rxFrame);
         break;
 
     default:; // nothing
@@ -227,22 +251,22 @@ void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
 {
     uint8_t send_reponse = 1;
 
-    NbusSlave * selected_slave = getSlave(MODULE_ADDRESS(rxFrame));
-	if (selected_slave == NULL)
-	{
-		return;
-	}
+    NbusSlave *selected_slave = getSlave(MODULE_ADDRESS(rxFrame));
+    if (selected_slave == NULL)
+    {
+        return;
+    }
 
-	if (!selected_slave->isActive())
-	{
-		return;
-	}
+    if (!selected_slave->isActive())
+    {
+        return;
+    }
 
     switch (FUNCTION_CODE(rxFrame))
     {
 
     case FC_FIND: /* 0 */
-                  // Not implemented yet
+        _frame_nbus_internal = selected_slave->nbus_module_find();
         break;
 
     case FC_ECHO: /* 1 */
@@ -279,8 +303,8 @@ void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
     case FC_STORE: /* 0xA => 10 */
         break;
 
-    case FC_DATA: /* 0xB => 11 */
-        // NO NEED TO IMPLEMENT on NBUS BRIDGE
+    case FC_DATA: /* 0xB => 11  Get data from specific slave, Unicast mode */
+        _frame_nbus_internal = selected_slave->nbus_sensor_getData(SENSOR_ADDRESS(rxFrame));
         break;
 
     case FC_SYNC: /* 0xC => 12 */
@@ -311,9 +335,9 @@ void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
 /**
  * Pripraví informáciu o všetkcýh nBus slave moduloch
  */
-DataFrame *NbusBridge::getSlavesInfo()
+DataFrame *NbusBridge::getSlavesInfo(uint8_t *rx_frame)
 {
-    return _communicator->formatSlaveInfo(_slave_adress, _num_slaves);
+    return _communicator->formatSlaveInfo(rx_frame, _slave_adress, _num_slaves);
 }
 
 /**
@@ -330,17 +354,20 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
 
     if (MODULE_ADDRESS(rxFrame) == BROADCAST_ADDRESS)
     {
-    	if (SENSOR_ADDRESS(rxFrame) == BRIDGE_ADDRESS) {
-    		process_bridge_request(rxFrame, size);
-    		sendResponseToMaster(_frame_nbus_internal);
-    	} else {
-    		process_broadcast(rxFrame);
-    	}
-
-    } else {
-    	process_slave_request(rxFrame, size);
+        if (SENSOR_ADDRESS(rxFrame) == BRIDGE_ADDRESS)
+        {
+            process_bridge_request(rxFrame, size);
+            sendResponseToMaster(_frame_nbus_internal);
+        }
+        else
+        {
+            process_broadcast(rxFrame);
+        }
+    }
+    else
+    {
+        process_slave_request(rxFrame, size);
     }
-
 }
 
 /**
@@ -351,6 +378,12 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
 void NbusBridge::processRunningState()
 {
 
+    if (scan_request == 1)
+    {
+        scan_request = 0;
+        this->scan();
+    }
+
     if (_run_state == STATE_STOPPED)
     {
         return;

+ 2 - 3
Core/Src/NbusCommunicator.cpp

@@ -104,7 +104,6 @@ void 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
@@ -118,10 +117,11 @@ void NbusCommunicator::sendToMaster(DataFrame *master_frame)
  * Informácia o existujúcih moduloch nBus Slave.
  * Formát: [index1 adresa1 index2 adresa2 ...  indexN andresaN]
  */
-DataFrame *NbusCommunicator::formatSlaveInfo(uint8_t slave_address[], uint8_t num)
+DataFrame *NbusCommunicator::formatSlaveInfo(uint8_t rx_frame[], uint8_t slave_address[], uint8_t num)
 {
     _packet_rx->Init();
 
+    _packet_rx->AddArray(rx_frame, 3);
     for (uint8_t i = 0; i < num; i++)
     {
         _packet_rx->AddInt8(i + 1);
@@ -132,7 +132,6 @@ DataFrame *NbusCommunicator::formatSlaveInfo(uint8_t slave_address[], uint8_t nu
     return _packet_rx;
 }
 
-
 /**
  * Informácia o existujúcih moduloch nBus Slave.
  * Formát: [index1 adresa1 index2 adresa2 ...  indexN andresaN]

+ 7 - 0
Core/Src/NbusSlave.cpp

@@ -124,3 +124,10 @@ DataFrame *NbusSlave::nbus_sensor_parameters(uint8_t sensor_address)
     _pdu.fc = FC_PARAM;
     return _communicator->sendAndReceive(&_pdu, _sensor_cache, 0);
 }
+
+DataFrame *NbusSlave::nbus_module_find(void)
+{
+    _pdu.sa = SLAVE_ADDRESS_MODULE;
+    _pdu.fc = FC_FIND;
+    return _communicator->sendAndReceive(&_pdu, _sensor_cache, 0);
+}

+ 2 - 1
nbus-bridge.launch

@@ -11,6 +11,7 @@
     <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_live_expr" value="true"/>
     <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_swv" value="false"/>
     <intAttribute key="com.st.stm32cube.ide.mcu.debug.launch.formatVersion" value="2"/>
+    <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.incremental_flashing" value="false"/>
     <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.ip_address_local" value="localhost"/>
     <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.enabled" value="false"/>
     <stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.value" value=""/>
@@ -37,7 +38,7 @@
     <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="/home/juraj/Programming/gogs/nbus-bridge/Debug/st-link_gdbserver_log.txt"/>
     <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.low_power_debug" value="enable"/>
     <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.max_halt_delay" value="2"/>
-    <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.reset_strategy" value="connect_under_reset"/>
+    <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.reset_strategy" value="system_reset"/>
     <booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_check_serial_number" value="false"/>
     <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_txt_serial_number" value=""/>
     <stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.watchdog_config" value="none"/>