|
|
@@ -38,6 +38,8 @@ static uint8_t crc8x_fast(void const *mem, uint16_t len)
|
|
|
}
|
|
|
|
|
|
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;
|
|
|
@@ -60,7 +62,6 @@ void NbusBridge::setCommunicator(NbusCommunicator *nc)
|
|
|
_num_slaves = 0;
|
|
|
_run_state = STATE_STOPPED;
|
|
|
_pdu.sa = BROADCAST_ADDRESS;
|
|
|
- _dataFrame = new DataFrame(_dataPacket, sizeof(_dataPacket), TYPE_RAW, CRC_OFF);
|
|
|
}
|
|
|
|
|
|
NbusBridge::~NbusBridge()
|
|
|
@@ -140,17 +141,6 @@ uint8_t NbusBridge::getNumSlaves()
|
|
|
return _num_slaves;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Odošle odpoveď uzlu Master (PC)
|
|
|
- */
|
|
|
-void NbusBridge::sendResponseToMaster(DataFrame *response_frame)
|
|
|
-{
|
|
|
- if (response_frame != NULL && response_frame->IsEmpty() == false)
|
|
|
- {
|
|
|
- _communicator->sendToMaster(response_frame);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* Na internú zbernicu odošle Broadcast request "START"
|
|
|
*/
|
|
|
@@ -210,41 +200,42 @@ void NbusBridge::process_broadcast(uint8_t *rxFrame)
|
|
|
*/
|
|
|
void NbusBridge::process_bridge_request(uint8_t *rxFrame, uint8_t size)
|
|
|
{
|
|
|
- switch (FUNCTION_CODE(rxFrame))
|
|
|
- {
|
|
|
+ _master_frame.Init();
|
|
|
+ _master_frame.AddArray(rxFrame, PDU_SIZE);
|
|
|
|
|
|
+ switch (FUNCTION_CODE(rxFrame))
|
|
|
+ {
|
|
|
case FC_ECHO: /* 1 */
|
|
|
- _frame_nbus_internal = _communicator->formatPacket(rxFrame, size);
|
|
|
+ _master_frame.AddArray(&DATA0_ADDRESS(rxFrame), size - RX_META);
|
|
|
break;
|
|
|
|
|
|
case FC_RESET: /* 9 */
|
|
|
{
|
|
|
scan_request = 1;
|
|
|
// send same frame back
|
|
|
- _frame_nbus_internal = _communicator->formatPacket(rxFrame, size);
|
|
|
+ _master_frame.AddArray(&DATA0_ADDRESS(rxFrame), size - RX_META);
|
|
|
}
|
|
|
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();
|
|
|
+ _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);
|
|
|
break;
|
|
|
|
|
|
case FC_SLAVES: /* 0x10 => 16 */
|
|
|
- _frame_nbus_internal = getSlavesInfo(rxFrame);
|
|
|
+ for (uint8_t i = 0; i < _num_slaves; i++)
|
|
|
+ {
|
|
|
+ _master_frame.AddInt8(i + 1);
|
|
|
+ _master_frame.AddInt8(_slave_adress[i]);
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
default:; // nothing
|
|
|
}
|
|
|
+
|
|
|
+ _master_frame.Commit();
|
|
|
+ _communicator->sendToMaster(&_master_frame);
|
|
|
}
|
|
|
|
|
|
void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
|
|
|
@@ -266,26 +257,26 @@ void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
|
|
|
{
|
|
|
|
|
|
case FC_FIND: /* 0 */
|
|
|
- _frame_nbus_internal = selected_slave->nbus_module_find();
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_module_find();
|
|
|
break;
|
|
|
|
|
|
case FC_ECHO: /* 1 */
|
|
|
- _frame_nbus_internal = selected_slave->nbus_echo(&rxFrame[3], size - 4);
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_echo(&DATA0_ADDRESS(rxFrame), size - RX_META);
|
|
|
break;
|
|
|
|
|
|
case FC_PARAM: /* 4 */
|
|
|
if (size == RX_META)
|
|
|
{
|
|
|
- _frame_nbus_internal = selected_slave->nbus_sensor_parameters(SENSOR_ADDRESS(rxFrame));
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_sensor_parameters(SENSOR_ADDRESS(rxFrame));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- _frame_nbus_internal = selected_slave->nbus_sensor_parameter(SENSOR_ADDRESS(rxFrame), rxFrame[RX_META - 1]);
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_sensor_parameter(SENSOR_ADDRESS(rxFrame), rxFrame[RX_META - 1]);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case FC_SENSOR_CNT: /* 5 */
|
|
|
- _frame_nbus_internal = selected_slave->nbus_sensor_count();
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_sensor_count();
|
|
|
break;
|
|
|
|
|
|
case FC_SLEEP: /* 6 */
|
|
|
@@ -304,22 +295,22 @@ void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
|
|
|
break;
|
|
|
|
|
|
case FC_DATA: /* 0xB => 11 Get data from specific slave, Unicast mode */
|
|
|
- _frame_nbus_internal = selected_slave->nbus_sensor_getData(SENSOR_ADDRESS(rxFrame));
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_sensor_getData(SENSOR_ADDRESS(rxFrame));
|
|
|
break;
|
|
|
|
|
|
case FC_SYNC: /* 0xC => 12 */
|
|
|
break;
|
|
|
|
|
|
case FC_SENSOR_TYPE: /* 0xD => 13 */
|
|
|
- _frame_nbus_internal = selected_slave->nbus_sensor_type(SENSOR_ADDRESS(rxFrame));
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_sensor_type(SENSOR_ADDRESS(rxFrame));
|
|
|
break;
|
|
|
|
|
|
case FC_INFO: /* 0xE => 14 */
|
|
|
- _frame_nbus_internal = selected_slave->nbus_module_info();
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_module_info();
|
|
|
break;
|
|
|
|
|
|
case FC_SENSOR_FORMAT: /* 0xF => 15 */
|
|
|
- _frame_nbus_internal = selected_slave->nbus_sensor_format(SENSOR_ADDRESS(rxFrame));
|
|
|
+ _worker_frame_ptr = selected_slave->nbus_sensor_format(SENSOR_ADDRESS(rxFrame));
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
@@ -328,18 +319,41 @@ void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
|
|
|
|
|
|
if (send_reponse == 1)
|
|
|
{
|
|
|
- sendResponseToMaster(_frame_nbus_internal);
|
|
|
+ _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Pripraví informáciu o všetkcýh nBus slave moduloch
|
|
|
*/
|
|
|
-DataFrame *NbusBridge::getSlavesInfo(uint8_t *rx_frame)
|
|
|
+DataFrame* NbusBridge::getBridgeSlaves()
|
|
|
{
|
|
|
- return _communicator->formatSlaveInfo(rx_frame, _slave_adress, _num_slaves);
|
|
|
+ _raw_data_frame.Init();
|
|
|
+
|
|
|
+ for (uint8_t i = 0; i < _num_slaves; i++)
|
|
|
+ {
|
|
|
+ _raw_data_frame.AddInt8(i + 1);
|
|
|
+ _raw_data_frame.AddInt8(_slave_adress[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ _raw_data_frame.Commit();
|
|
|
+
|
|
|
+ return &_raw_data_frame;
|
|
|
+}
|
|
|
+
|
|
|
+DataFrame * NbusBridge::getBridgeInfo()
|
|
|
+{
|
|
|
+ _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();
|
|
|
+
|
|
|
+ return &_raw_data_frame;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* Implementácia rozhrania nBus.
|
|
|
*/
|
|
|
@@ -352,12 +366,15 @@ void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (MODULE_ADDRESS(rxFrame) == BROADCAST_ADDRESS)
|
|
|
+ _pdu.ma = rxFrame[0];
|
|
|
+ _pdu.sa = rxFrame[1];
|
|
|
+ _pdu.fc = (Nbus_FC_e)rxFrame[2];
|
|
|
+
|
|
|
+ if (_pdu.ma == BROADCAST_ADDRESS)
|
|
|
{
|
|
|
- if (SENSOR_ADDRESS(rxFrame) == BRIDGE_ADDRESS)
|
|
|
+ if (_pdu.sa == BRIDGE_ADDRESS)
|
|
|
{
|
|
|
process_bridge_request(rxFrame, size);
|
|
|
- sendResponseToMaster(_frame_nbus_internal);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -399,9 +416,9 @@ void NbusBridge::processRunningState()
|
|
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
|
|
|
NbusSlave *slave = NULL;
|
|
|
uint8_t *slaveFrameResponse;
|
|
|
- _dataFrame->Init();
|
|
|
- _dataFrame->AddHeader(TYPE_HEADER_2B);
|
|
|
- _dataFrame->AddInt32(HAL_GetTick());
|
|
|
+ _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++)
|
|
|
{
|
|
|
@@ -410,22 +427,22 @@ void NbusBridge::processRunningState()
|
|
|
{
|
|
|
for (uint32_t k = 1; k <= slave->nbus_get_sensor_count(false); k++)
|
|
|
{
|
|
|
- _dataFrame->AddInt8(slave->getModuleAddress());
|
|
|
- _workerFrame = slave->nbus_sensor_getData(k);
|
|
|
- slaveFrameResponse = _workerFrame->GetFrame();
|
|
|
- _dataFrame->AddInt8(slave->getSensorAddress());
|
|
|
- _dataFrame->AddArray(&slaveFrameResponse[3], _workerFrame->GetLength() - 3);
|
|
|
+ _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);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- _dataFrame->AddInt8(0xFF);
|
|
|
- _dataFrame->AddInt8(0xFF);
|
|
|
- _dataFrame->Commit();
|
|
|
+ _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)
|
|
|
{
|
|
|
- sendResponseToMaster(_dataFrame);
|
|
|
+ _communicator->sendToMaster(&_raw_data_frame);
|
|
|
}
|
|
|
|
|
|
/// TODO toto sa MI NEPACI, TREBA VYRIESIT INAK!!!!!!
|