|
|
@@ -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;
|