|
|
@@ -7,9 +7,8 @@
|
|
|
|
|
|
#include "NbusBridge.h"
|
|
|
|
|
|
-volatile uint8_t scan_request = 0;
|
|
|
|
|
|
-static uint8_t const crc8x_table[] = {
|
|
|
+static const uint8_t __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,
|
|
|
0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8,
|
|
|
@@ -25,32 +24,21 @@ static uint8_t const crc8x_table[] = {
|
|
|
0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC,
|
|
|
0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3};
|
|
|
|
|
|
-static uint8_t crc8x_fast(void const *mem, uint16_t len)
|
|
|
+uint8_t NbusBridge::_crc8x_fast(void const *mem, uint16_t len)
|
|
|
{
|
|
|
uint8_t crc = 0;
|
|
|
uint8_t const *data = (uint8_t *)mem;
|
|
|
- if (data == NULL)
|
|
|
+ if (data == nullptr)
|
|
|
return 0xff;
|
|
|
crc &= 0xff;
|
|
|
while (len--)
|
|
|
- crc = crc8x_table[crc ^ *data++];
|
|
|
+ crc = __crc8x_table[crc ^ *data++];
|
|
|
return crc;
|
|
|
}
|
|
|
|
|
|
-NbusBridge::NbusBridge()
|
|
|
-: _raw_data_frame(_data_packet, DATAPACKET_SIZE, TYPE_RAW, CRC_OFF),
|
|
|
- _master_frame(_data_packet, DATAPACKET_SIZE, TYPE_PLAIN, CRC_ON)
|
|
|
-{
|
|
|
-
|
|
|
- _communicator = NULL;
|
|
|
- _num_slaves = 0;
|
|
|
- _run_state = STATE_STOPPED;
|
|
|
- _pdu.sa = BROADCAST_ADDRESS;
|
|
|
-}
|
|
|
-
|
|
|
void NbusBridge::setCommunicator(NbusCommunicator *nc)
|
|
|
{
|
|
|
- if (nc == NULL)
|
|
|
+ if (nc == nullptr)
|
|
|
{
|
|
|
while (1)
|
|
|
{
|
|
|
@@ -64,10 +52,6 @@ void NbusBridge::setCommunicator(NbusCommunicator *nc)
|
|
|
_pdu.sa = BROADCAST_ADDRESS;
|
|
|
}
|
|
|
|
|
|
-NbusBridge::~NbusBridge()
|
|
|
-{
|
|
|
- // empty
|
|
|
-}
|
|
|
|
|
|
/**
|
|
|
* Spustí scan internej nbus siete.
|
|
|
@@ -77,17 +61,14 @@ NbusBridge::~NbusBridge()
|
|
|
void NbusBridge::scan()
|
|
|
{
|
|
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
|
|
|
+
|
|
|
_num_slaves = 0;
|
|
|
|
|
|
- DataFrame *frame;
|
|
|
- uint8_t *response;
|
|
|
- Nbus_pdu pdu;
|
|
|
- pdu.fc = FC_ECHO;
|
|
|
- pdu.sa = SLAVE_ADDRESS_MODULE;
|
|
|
- _pdu.ma = SLAVE_ADDRESS_MODULE;
|
|
|
- uint8_t data[4] = {110, 66, 117, 115}; // nBus
|
|
|
- const uint8_t data_offset = 4;
|
|
|
- uint8_t slave_index = 0;
|
|
|
+ DataFrame *response_frame;
|
|
|
+ uint8_t *response_raw;
|
|
|
+ Nbus_PDU_t pdu = {SLAVE_ADDRESS_MODULE, SLAVE_ADDRESS_MODULE, FC_ECHO};
|
|
|
+ uint8_t data[] = ECHO_SCAN_DATA;
|
|
|
+ uint8_t slave_index = 0;
|
|
|
|
|
|
for (uint32_t i = 1; i < MAX_SLAVES; i++)
|
|
|
{
|
|
|
@@ -98,17 +79,20 @@ void NbusBridge::scan()
|
|
|
{
|
|
|
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
|
|
|
pdu.ma = i;
|
|
|
- frame = _communicator->sendAndReceive(&pdu, data, 4);
|
|
|
- if (!frame->IsEmpty())
|
|
|
+ response_frame = _communicator->sendAndReceive(&pdu, data, ECHO_SCAN_LENGTH);
|
|
|
+
|
|
|
+ if (!response_frame->IsEmpty())
|
|
|
{
|
|
|
- response = frame->GetFrame();
|
|
|
- if (response[0 + data_offset] == 110 && response[1 + data_offset] == 66 &&
|
|
|
- response[2 + data_offset] == 117 && response[3 + data_offset] == 115)
|
|
|
+ response_raw = response_frame->GetFrame();
|
|
|
+
|
|
|
+ if (DATA0_TX_ADDRESS(response_raw + 0) == ECHO_SCAN_CHAR0 && DATA0_TX_ADDRESS(response_raw + 1) == ECHO_SCAN_CHAR1 &&
|
|
|
+ DATA0_TX_ADDRESS(response_raw + 2) == ECHO_SCAN_CHAR2 && DATA0_TX_ADDRESS(response_raw + 3) == ECHO_SCAN_CHAR3)
|
|
|
{
|
|
|
_num_slaves++;
|
|
|
_slaves[i].setAddress(i);
|
|
|
_slaves[i].setCommunicator(_communicator);
|
|
|
_slave_adress[slave_index++] = i;
|
|
|
+ _slaves[i].nbusSlaveCmd_getSensorCnt(true); // retrieve sensor count for each slave
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -129,7 +113,8 @@ NbusSlave *NbusBridge::getSlave(uint8_t index)
|
|
|
return &_slaves[index];
|
|
|
}
|
|
|
}
|
|
|
- return NULL;
|
|
|
+
|
|
|
+ return nullptr;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -148,7 +133,7 @@ void NbusBridge::broadcastStart()
|
|
|
{
|
|
|
_pdu.fc = FC_START;
|
|
|
_pdu.ma = BROADCAST_ADDRESS;
|
|
|
- _communicator->send(&_pdu, NULL, 0);
|
|
|
+ _communicator->send(&_pdu, nullptr, 0);
|
|
|
_run_state = STATE_RUNNING;
|
|
|
}
|
|
|
|
|
|
@@ -159,7 +144,7 @@ void NbusBridge::broadcastStop()
|
|
|
{
|
|
|
_pdu.fc = FC_STOP;
|
|
|
_pdu.ma = BROADCAST_ADDRESS;
|
|
|
- _communicator->send(&_pdu, NULL, 0);
|
|
|
+ _communicator->send(&_pdu, nullptr, 0);
|
|
|
_run_state = STATE_TO_STOP;
|
|
|
}
|
|
|
|
|
|
@@ -171,7 +156,7 @@ void NbusBridge::broadcastStop()
|
|
|
*/
|
|
|
void NbusBridge::process_broadcast(uint8_t *rxFrame)
|
|
|
{
|
|
|
- switch (FUNCTION_CODE(rxFrame))
|
|
|
+ switch (FUNCTION_RX_CODE(rxFrame))
|
|
|
{
|
|
|
|
|
|
case FC_STOP: /* 2 */
|
|
|
@@ -200,166 +185,136 @@ void NbusBridge::process_broadcast(uint8_t *rxFrame)
|
|
|
*/
|
|
|
void NbusBridge::process_bridge_request(uint8_t *rxFrame, uint8_t size)
|
|
|
{
|
|
|
- _master_frame.Init();
|
|
|
- _master_frame.AddArray(rxFrame, PDU_SIZE);
|
|
|
-
|
|
|
- switch (FUNCTION_CODE(rxFrame))
|
|
|
+ switch (FUNCTION_RX_CODE(rxFrame))
|
|
|
{
|
|
|
case FC_ECHO: /* 1 */
|
|
|
- _master_frame.AddArray(&DATA0_ADDRESS(rxFrame), size - RX_META);
|
|
|
+ _master_frame.AddArray(&DATA0_RX_ADDRESS(rxFrame), size - RX_META_SIZE);
|
|
|
break;
|
|
|
|
|
|
case FC_RESET: /* 9 */
|
|
|
- {
|
|
|
- scan_request = 1;
|
|
|
+ {
|
|
|
+ _scan_request = 1;
|
|
|
// send same frame back
|
|
|
- _master_frame.AddArray(&DATA0_ADDRESS(rxFrame), size - RX_META);
|
|
|
+ _master_frame.AddArray(&DATA0_RX_ADDRESS(rxFrame), size - RX_META_SIZE);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case FC_DATA: /* 11 */
|
|
|
+ _worker_frame_ptr = bridge_getData();
|
|
|
+ break;
|
|
|
+
|
|
|
case FC_INFO: /* 0xE => 15 */
|
|
|
- _master_frame.AddArray((uint8_t *)BRIDGE_INFO_VERSION, 3);
|
|
|
- _master_frame.AddArray((uint8_t *)BRIDGE_INFO_HW_FAMILY, 3);
|
|
|
- _master_frame.AddArray((uint8_t *)BRIDGE_INFO_HW_VERSION, 3);
|
|
|
+ _worker_frame_ptr = bridge_getInfo();
|
|
|
break;
|
|
|
|
|
|
case FC_SLAVES: /* 0x10 => 16 */
|
|
|
- for (uint8_t i = 0; i < _num_slaves; i++)
|
|
|
- {
|
|
|
- _master_frame.AddInt8(i + 1);
|
|
|
- _master_frame.AddInt8(_slave_adress[i]);
|
|
|
- }
|
|
|
+ _worker_frame_ptr = bridge_getSlaves();
|
|
|
break;
|
|
|
|
|
|
- default:; // nothing
|
|
|
+ default:
|
|
|
+ _worker_frame_ptr = bridge_setErrResponse(ILLEGAL_FUNCTION);
|
|
|
}
|
|
|
|
|
|
- _master_frame.Commit();
|
|
|
- _communicator->sendToMaster(&_master_frame);
|
|
|
+ _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
}
|
|
|
|
|
|
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_RX_ADDRESS(rxFrame));
|
|
|
|
|
|
- if (!selected_slave->isActive())
|
|
|
+ if (selected_slave == nullptr)
|
|
|
{
|
|
|
- return;
|
|
|
+ _worker_frame_ptr = bridge_setErrResponse(ILLEGAL_DEVICE_ADDRESS);
|
|
|
}
|
|
|
|
|
|
- switch (FUNCTION_CODE(rxFrame))
|
|
|
- {
|
|
|
-
|
|
|
- case FC_FIND: /* 0 */
|
|
|
- _worker_frame_ptr = selected_slave->nbus_module_find();
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_ECHO: /* 1 */
|
|
|
- _worker_frame_ptr = selected_slave->nbus_echo(&DATA0_ADDRESS(rxFrame), size - RX_META);
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_PARAM: /* 4 */
|
|
|
- if (size == RX_META)
|
|
|
- {
|
|
|
- _worker_frame_ptr = selected_slave->nbus_sensor_parameters(SENSOR_ADDRESS(rxFrame));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _worker_frame_ptr = selected_slave->nbus_sensor_parameter(SENSOR_ADDRESS(rxFrame), rxFrame[RX_META - 1]);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_SENSOR_CNT: /* 5 */
|
|
|
- _worker_frame_ptr = selected_slave->nbus_sensor_count();
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_SLEEP: /* 6 */
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_WAKEUP: /* 7 */
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_CALIBRATE: /* 8 */
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_RESET: /* 9 */
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_STORE: /* 0xA => 10 */
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_DATA: /* 0xB => 11 Get data from specific slave, Unicast mode */
|
|
|
- _worker_frame_ptr = selected_slave->nbus_sensor_getData(SENSOR_ADDRESS(rxFrame));
|
|
|
- break;
|
|
|
+ _raw_data_frame.Init();
|
|
|
+ _raw_data_frame.AddUint8(size);
|
|
|
+ _raw_data_frame.AddArray(rxFrame, size);
|
|
|
+ _raw_data_frame.Commit();
|
|
|
|
|
|
- case FC_SYNC: /* 0xC => 12 */
|
|
|
- break;
|
|
|
+ _worker_frame_ptr = selected_slave->nbusSlaveCmd_processRequest(&_raw_data_frame);
|
|
|
+ _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
+}
|
|
|
|
|
|
- case FC_SENSOR_TYPE: /* 0xD => 13 */
|
|
|
- _worker_frame_ptr = selected_slave->nbus_sensor_type(SENSOR_ADDRESS(rxFrame));
|
|
|
- break;
|
|
|
+/**
|
|
|
+ * Pripraví informáciu o všetkcýh nBus slave moduloch
|
|
|
+ */
|
|
|
+DataFrame* NbusBridge::bridge_getSlaves()
|
|
|
+{
|
|
|
+ _master_frame.Init();
|
|
|
+ _master_frame.AddUint8(BROADCAST_ADDRESS);
|
|
|
+ _master_frame.AddUint8(BRIDGE_ADDRESS);
|
|
|
+ _master_frame.AddUint8(FC_SLAVES);
|
|
|
|
|
|
- case FC_INFO: /* 0xE => 14 */
|
|
|
- _worker_frame_ptr = selected_slave->nbus_module_info();
|
|
|
- break;
|
|
|
+ for (uint8_t i = 0; i < _num_slaves; i++)
|
|
|
+ {
|
|
|
+ _master_frame.AddInt8(i + 1);
|
|
|
+ _master_frame.AddInt8(_slave_adress[i]);
|
|
|
+ }
|
|
|
|
|
|
- case FC_SENSOR_FORMAT: /* 0xF => 15 */
|
|
|
- _worker_frame_ptr = selected_slave->nbus_sensor_format(SENSOR_ADDRESS(rxFrame));
|
|
|
- break;
|
|
|
+ _master_frame.Commit();
|
|
|
|
|
|
- default:
|
|
|
- send_reponse = 0;
|
|
|
- }
|
|
|
+ return &_master_frame;
|
|
|
+}
|
|
|
|
|
|
- if (send_reponse == 1)
|
|
|
- {
|
|
|
- _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
- }
|
|
|
+DataFrame * NbusBridge::bridge_getInfo()
|
|
|
+{
|
|
|
+ _master_frame.Init();
|
|
|
+ _master_frame.AddUint8(BROADCAST_ADDRESS);
|
|
|
+ _master_frame.AddUint8(BRIDGE_ADDRESS);
|
|
|
+ _master_frame.AddUint8(FC_INFO);
|
|
|
+ _master_frame.AddArray((uint8_t *)BRIDGE_INFO_VERSION, 3);
|
|
|
+ _master_frame.AddArray((uint8_t *)BRIDGE_INFO_HW_FAMILY, 3);
|
|
|
+ _master_frame.AddArray((uint8_t *)BRIDGE_INFO_HW_VERSION, 3);
|
|
|
+ _master_frame.Commit();
|
|
|
+
|
|
|
+ return &_master_frame;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Pripraví informáciu o všetkcýh nBus slave moduloch
|
|
|
- */
|
|
|
-DataFrame* NbusBridge::getBridgeSlaves()
|
|
|
+DataFrame * NbusBridge::bridge_getData()
|
|
|
{
|
|
|
+ NbusSlave * slave_ptr = nullptr;
|
|
|
+
|
|
|
_raw_data_frame.Init();
|
|
|
+ _raw_data_frame.AddHeader(TYPE_HEADER_2B);
|
|
|
+ _raw_data_frame.AddInt32(HAL_GetTick());
|
|
|
|
|
|
- for (uint8_t i = 0; i < _num_slaves; i++)
|
|
|
+ for (uint32_t i = 0; i < _num_slaves; i++)
|
|
|
{
|
|
|
- _raw_data_frame.AddInt8(i + 1);
|
|
|
- _raw_data_frame.AddInt8(_slave_adress[i]);
|
|
|
+ slave_ptr = getSlave(_slave_adress[i]);
|
|
|
+ if (slave_ptr != nullptr)
|
|
|
+ {
|
|
|
+ _raw_data_frame.AddInt8(slave_ptr->getModuleAddress());
|
|
|
+ _worker_frame_ptr = slave_ptr->nbusSlaveCmd_getData();
|
|
|
+ _raw_data_frame.AddArray(&DATA0_RX_ADDRESS(_worker_frame_ptr->GetFrame() + 1), _worker_frame_ptr->GetLength() - (RX_META_SIZE + 1));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ _raw_data_frame.AddInt8(BRIDGE_TERMINATOR);
|
|
|
+ _raw_data_frame.AddInt8(BRIDGE_TERMINATOR);
|
|
|
_raw_data_frame.Commit();
|
|
|
|
|
|
return &_raw_data_frame;
|
|
|
}
|
|
|
|
|
|
-DataFrame * NbusBridge::getBridgeInfo()
|
|
|
+DataFrame * NbusBridge::bridge_setErrResponse(Nbus_EC_e ec)
|
|
|
{
|
|
|
- _raw_data_frame.Init();
|
|
|
- _raw_data_frame.AddArray((uint8_t *)BRIDGE_INFO_VERSION, 3);
|
|
|
- _raw_data_frame.AddArray((uint8_t *)BRIDGE_INFO_HW_FAMILY, 3);
|
|
|
- _raw_data_frame.AddArray((uint8_t *)BRIDGE_INFO_HW_VERSION, 3);
|
|
|
- _raw_data_frame.Commit();
|
|
|
+ _master_frame.Init();
|
|
|
+ _master_frame.AddUint8(_pdu.ma);
|
|
|
+ _master_frame.AddUint8(_pdu.sa);
|
|
|
+ _master_frame.AddUint8(SET_ERR_RESPONSE(_pdu.fc));
|
|
|
+ _master_frame.AddUint8(ec);
|
|
|
+ _master_frame.Commit();
|
|
|
|
|
|
- return &_raw_data_frame;
|
|
|
+ return &_master_frame;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
/**
|
|
|
* Implementácia rozhrania nBus.
|
|
|
*/
|
|
|
void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
|
|
|
{
|
|
|
- uint8_t crcC = crc8x_fast(rxFrame, size - 1);
|
|
|
+ uint8_t crcC = _crc8x_fast(rxFrame, size - 1);
|
|
|
|
|
|
if (crcC != rxFrame[size - 1])
|
|
|
{
|
|
|
@@ -395,9 +350,9 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
|
|
|
void NbusBridge::processRunningState()
|
|
|
{
|
|
|
|
|
|
- if (scan_request == 1)
|
|
|
+ if (_scan_request == 1)
|
|
|
{
|
|
|
- scan_request = 0;
|
|
|
+ _scan_request = 0;
|
|
|
this->scan();
|
|
|
}
|
|
|
|
|
|
@@ -414,35 +369,13 @@ void NbusBridge::processRunningState()
|
|
|
}
|
|
|
|
|
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
|
|
|
- NbusSlave *slave = NULL;
|
|
|
- uint8_t *slaveFrameResponse;
|
|
|
- _raw_data_frame.Init();
|
|
|
- _raw_data_frame.AddHeader(TYPE_HEADER_2B);
|
|
|
- _raw_data_frame.AddInt32(HAL_GetTick());
|
|
|
|
|
|
- for (uint32_t i = 0; i < _num_slaves; i++)
|
|
|
- {
|
|
|
- slave = getSlave(_slave_adress[i]);
|
|
|
- if (slave != NULL && slave->isActive())
|
|
|
- {
|
|
|
- for (uint32_t k = 1; k <= slave->nbus_get_sensor_count(false); k++)
|
|
|
- {
|
|
|
- _raw_data_frame.AddInt8(slave->getModuleAddress());
|
|
|
- _worker_frame_ptr = slave->nbus_sensor_getData(k);
|
|
|
- slaveFrameResponse = _worker_frame_ptr->GetFrame();
|
|
|
- _raw_data_frame.AddInt8(slave->getSensorAddress());
|
|
|
- _raw_data_frame.AddArray(&slaveFrameResponse[3], _worker_frame_ptr->GetLength() - 3);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ _worker_frame_ptr = bridge_getData();
|
|
|
|
|
|
- _raw_data_frame.AddInt8(0xFF);
|
|
|
- _raw_data_frame.AddInt8(0xFF);
|
|
|
- _raw_data_frame.Commit();
|
|
|
// TODO problem: v stavi RUNNING pride STOP prikaz, ale ten sa nespracuje, pretoze bezi obsluha tejto funkcie.
|
|
|
if (_run_state == STATE_RUNNING)
|
|
|
{
|
|
|
- _communicator->sendToMaster(&_raw_data_frame);
|
|
|
+ _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
}
|
|
|
|
|
|
/// TODO toto sa MI NEPACI, TREBA VYRIESIT INAK!!!!!!
|