|
|
@@ -1,8 +1,8 @@
|
|
|
/**
|
|
|
* @file NbusBridge.cpp
|
|
|
- * @brief Implemetnácia modulu nBus Brige
|
|
|
- * @date Mar 7, 2025
|
|
|
- * @author Juraj Dudak
|
|
|
+ * @brief Implementation of nBus Brige
|
|
|
+ * @date Nov 27, 2025
|
|
|
+ * @author Juraj Dudak, Matus Necas
|
|
|
*/
|
|
|
|
|
|
#include "NbusBridge.h"
|
|
|
@@ -24,49 +24,22 @@ static const uint8_t __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};
|
|
|
|
|
|
-uint8_t NbusBridge::_crc8x_fast(void const *mem, uint16_t len)
|
|
|
-{
|
|
|
- uint8_t crc = 0;
|
|
|
- uint8_t const *data = (uint8_t *)mem;
|
|
|
- if (data == nullptr)
|
|
|
- return 0xff;
|
|
|
- crc &= 0xff;
|
|
|
- while (len--)
|
|
|
- crc = __crc8x_table[crc ^ *data++];
|
|
|
- return crc;
|
|
|
-}
|
|
|
|
|
|
-void NbusBridge::setCommunicator(NbusCommunicator *nc)
|
|
|
+
|
|
|
+NbusBridge::NbusBridge(NbusCommunicator *nbus_communicator)
|
|
|
+: _communicator(nbus_communicator)
|
|
|
{
|
|
|
- if (nc == nullptr)
|
|
|
- {
|
|
|
- while (1)
|
|
|
- {
|
|
|
- __NOP();
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- _communicator = nc;
|
|
|
- _num_slaves = 0;
|
|
|
- _run_state = STATE_STOPPED;
|
|
|
- _pdu.sa = BROADCAST_ADDRESS;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-/**
|
|
|
- * Spustí scan internej nbus siete.
|
|
|
- * Posiela requesty pre celý adresný priestor ako ECHO paket.
|
|
|
- * Výsledok je uložený interne. K jednotlivým slave-om sa dá dostať cez metódu getSlave(index), kde 0<=index<num_slaves
|
|
|
- */
|
|
|
-void NbusBridge::scan()
|
|
|
+void NbusBridge::scanNetwork()
|
|
|
{
|
|
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
|
|
|
|
|
|
_num_slaves = 0;
|
|
|
|
|
|
- DataFrame *response_frame;
|
|
|
uint8_t *response_raw;
|
|
|
- Nbus_PDU_t pdu = {SLAVE_ADDRESS_MODULE, SLAVE_ADDRESS_MODULE, FC_ECHO};
|
|
|
+ Nbus_PDU_t pdu = {NBUS_SLAVE_ADDRESS_MODULE, NBUS_SLAVE_ADDRESS_MODULE, FC_ECHO};
|
|
|
uint8_t data[] = ECHO_SCAN_DATA;
|
|
|
uint8_t slave_index = 0;
|
|
|
|
|
|
@@ -79,11 +52,12 @@ void NbusBridge::scan()
|
|
|
{
|
|
|
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
|
|
|
pdu.ma = i;
|
|
|
- response_frame = _communicator->sendAndReceive(&pdu, data, ECHO_SCAN_LENGTH);
|
|
|
|
|
|
- if (!response_frame->IsEmpty())
|
|
|
+ _worker_frame_ptr = _communicator->sendAndReceiveSlave(_makePacket(pdu, data, ECHO_SCAN_LENGTH));
|
|
|
+
|
|
|
+ if (!_worker_frame_ptr->IsEmpty())
|
|
|
{
|
|
|
- response_raw = response_frame->GetFrame();
|
|
|
+ response_raw = _worker_frame_ptr->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)
|
|
|
@@ -100,284 +74,270 @@ void NbusBridge::scan()
|
|
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * @brief Vráti inštanciu index-teho zdetegovaného nBus slave.
|
|
|
- * @return Smerník na existujúc NbusBridge alebo NULL
|
|
|
- */
|
|
|
-NbusSlave *NbusBridge::getSlave(uint8_t index)
|
|
|
+void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
|
|
|
{
|
|
|
- if (index >= 0 && index < MAX_SLAVES)
|
|
|
+ uint8_t crcC = _crc8x_fast(rxFrame, size - 1);
|
|
|
+
|
|
|
+ if (crcC != CRC8_RX_ADDRESS(rxFrame, size))
|
|
|
{
|
|
|
- if (_slaves[index].isActive())
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ _pdu.ma = rxFrame[0];
|
|
|
+ _pdu.sa = rxFrame[1];
|
|
|
+ _pdu.fc = (Nbus_FC_e)rxFrame[2];
|
|
|
+
|
|
|
+ if (_pdu.ma == BROADCAST_ADDRESS)
|
|
|
+ {
|
|
|
+ if (_pdu.sa == BRIDGE_ADDRESS)
|
|
|
{
|
|
|
- return &_slaves[index];
|
|
|
+ _processBridgeRequest(rxFrame, size);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _processBroadcast(rxFrame, size);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return nullptr;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _processSlaveRequest(rxFrame, size);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Vráti počet detegovaných nBus slave modulov na internej zbernici.
|
|
|
- * @return počet nBus slave zariadení.
|
|
|
- */
|
|
|
-uint8_t NbusBridge::getNumSlaves()
|
|
|
+void NbusBridge::processRunningState()
|
|
|
{
|
|
|
- return _num_slaves;
|
|
|
-}
|
|
|
|
|
|
-/**
|
|
|
- * Na internú zbernicu odošle Broadcast request "START"
|
|
|
- */
|
|
|
-void NbusBridge::broadcastStart()
|
|
|
-{
|
|
|
- _pdu.fc = FC_START;
|
|
|
- _pdu.ma = BROADCAST_ADDRESS;
|
|
|
- _communicator->send(&_pdu, nullptr, 0);
|
|
|
- _run_state = STATE_RUNNING;
|
|
|
+ if (_scan_request == 1)
|
|
|
+ {
|
|
|
+ _scan_request = 0;
|
|
|
+ this->scanNetwork();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_run_state == STATE_STOPPED)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_run_state == STATE_TO_STOP)
|
|
|
+ {
|
|
|
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
|
|
|
+ _run_state = STATE_STOPPED;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
|
|
|
+
|
|
|
+ _worker_frame_ptr = _cmdGetData();
|
|
|
+
|
|
|
+ // TODO problem: v stavi RUNNING pride STOP prikaz, ale ten sa nespracuje, pretoze bezi obsluha tejto funkcie.
|
|
|
+ if (_run_state == STATE_RUNNING)
|
|
|
+ {
|
|
|
+ _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// TODO toto sa MI NEPACI, TREBA VYRIESIT INAK!!!!!!
|
|
|
+ HAL_Delay(BRIDGE_RUNNING_STATE_DELAY); // TREBA VYSKUSAT
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Na internú zbernicu odošle Broadcast request "STOP"
|
|
|
- */
|
|
|
-void NbusBridge::broadcastStop()
|
|
|
+uint8_t NbusBridge::_crc8x_fast(void const *mem, uint16_t len)
|
|
|
{
|
|
|
- _pdu.fc = FC_STOP;
|
|
|
- _pdu.ma = BROADCAST_ADDRESS;
|
|
|
- _communicator->send(&_pdu, nullptr, 0);
|
|
|
- _run_state = STATE_TO_STOP;
|
|
|
+ uint8_t crc = 0;
|
|
|
+ uint8_t const *data = (uint8_t *)mem;
|
|
|
+ if (data == nullptr)
|
|
|
+ return 0xff;
|
|
|
+ crc &= 0xff;
|
|
|
+ while (len--)
|
|
|
+ crc = __crc8x_table[crc ^ *data++];
|
|
|
+ return crc;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Spracovanie broadcast requestu.
|
|
|
- * Inplementované funkcie:
|
|
|
- * - FC_STOP
|
|
|
- * - FC_START
|
|
|
- */
|
|
|
-void NbusBridge::process_broadcast(uint8_t *rxFrame)
|
|
|
+NbusSlave *NbusBridge::_getSlave(uint8_t index)
|
|
|
{
|
|
|
- switch (FUNCTION_RX_CODE(rxFrame))
|
|
|
+ if (index >= 0 && index < MAX_SLAVES)
|
|
|
{
|
|
|
+ if (_slaves[index].isActive())
|
|
|
+ {
|
|
|
+ return &_slaves[index];
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- case FC_STOP: /* 2 */
|
|
|
- this->broadcastStop();
|
|
|
- break;
|
|
|
-
|
|
|
- case FC_START: /* 3 */
|
|
|
- this->broadcastStart();
|
|
|
- break;
|
|
|
+ return nullptr;
|
|
|
+}
|
|
|
|
|
|
- default:; // nothing
|
|
|
- }
|
|
|
+void NbusBridge::_processBroadcast(uint8_t *rx_frame, uint8_t size)
|
|
|
+{
|
|
|
+ _communicator->sendToSlave(_forwardPacket(rx_frame, size));
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * 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)
|
|
|
+void NbusBridge::_processBridgeRequest(uint8_t *rx_frame, uint8_t size)
|
|
|
{
|
|
|
- switch (FUNCTION_RX_CODE(rxFrame))
|
|
|
+ switch (FUNCTION_RX_CODE(rx_frame))
|
|
|
{
|
|
|
- case FC_ECHO: /* 1 */
|
|
|
- _master_frame.AddArray(&DATA0_RX_ADDRESS(rxFrame), size - RX_META_SIZE);
|
|
|
- break;
|
|
|
+ case FC_ECHO: /* GET 1 */
|
|
|
+ _worker_frame_ptr = _forwardPacket(rx_frame, size);
|
|
|
+ break;
|
|
|
|
|
|
- case FC_RESET: /* 9 */
|
|
|
- {
|
|
|
+ case SET_CMD(FC_STOP): /* SET 2 */
|
|
|
+ _cmdSetStop();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SET_CMD(FC_START): /* SET 3 */
|
|
|
+ _cmdSetStart();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SET_CMD(FC_RESET): /* SET 9 */
|
|
|
_scan_request = 1;
|
|
|
- // send same frame back
|
|
|
- _master_frame.AddArray(&DATA0_RX_ADDRESS(rxFrame), size - RX_META_SIZE);
|
|
|
- }
|
|
|
- break;
|
|
|
+ _worker_frame_ptr = _rspSetStatus(STATUS_SUCCESS);
|
|
|
+ break;
|
|
|
|
|
|
- case FC_DATA: /* 11 */
|
|
|
- _worker_frame_ptr = bridge_getData();
|
|
|
+ case FC_DATA: /* GET 11 */
|
|
|
+ _worker_frame_ptr = _cmdGetData();
|
|
|
break;
|
|
|
|
|
|
- case FC_INFO: /* 0xE => 15 */
|
|
|
- _worker_frame_ptr = bridge_getInfo();
|
|
|
+ case FC_INFO: /* GET 0xE => 15 */
|
|
|
+ _worker_frame_ptr = _cmdGetInfo();
|
|
|
break;
|
|
|
|
|
|
- case FC_SLAVES: /* 0x10 => 16 */
|
|
|
- _worker_frame_ptr = bridge_getSlaves();
|
|
|
+ case FC_SLAVES: /* GET 0x10 => 16 */
|
|
|
+ _worker_frame_ptr = _cmdGetSlaves();
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- _worker_frame_ptr = bridge_setErrResponse(ILLEGAL_FUNCTION);
|
|
|
+ _worker_frame_ptr = _rspSetError(ILLEGAL_FUNCTION);
|
|
|
}
|
|
|
|
|
|
_communicator->sendToMaster(_worker_frame_ptr);
|
|
|
}
|
|
|
|
|
|
-void NbusBridge::process_slave_request(uint8_t *rxFrame, uint8_t size)
|
|
|
+void NbusBridge::_processSlaveRequest(uint8_t *rx_frame, uint8_t size)
|
|
|
{
|
|
|
- NbusSlave *selected_slave = getSlave(MODULE_RX_ADDRESS(rxFrame));
|
|
|
+ NbusSlave *selected_slave = _getSlave(MODULE_RX_ADDRESS(rx_frame));
|
|
|
|
|
|
if (selected_slave == nullptr)
|
|
|
{
|
|
|
- _worker_frame_ptr = bridge_setErrResponse(ILLEGAL_DEVICE_ADDRESS);
|
|
|
+ _worker_frame_ptr = _rspSetError(ILLEGAL_DEVICE_ADDRESS);
|
|
|
}
|
|
|
-
|
|
|
- _raw_data_frame.Init();
|
|
|
- _raw_data_frame.AddUint8(size);
|
|
|
- _raw_data_frame.AddArray(rxFrame, size);
|
|
|
- _raw_data_frame.Commit();
|
|
|
-
|
|
|
- _worker_frame_ptr = selected_slave->nbusSlaveCmd_processRequest(&_raw_data_frame);
|
|
|
- _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 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);
|
|
|
-
|
|
|
- for (uint8_t i = 0; i < _num_slaves; i++)
|
|
|
+ else
|
|
|
{
|
|
|
- _master_frame.AddInt8(i + 1);
|
|
|
- _master_frame.AddInt8(_slave_adress[i]);
|
|
|
+ _worker_frame_ptr = _forwardPacket(rx_frame, size);
|
|
|
}
|
|
|
|
|
|
- _master_frame.Commit();
|
|
|
-
|
|
|
- return &_master_frame;
|
|
|
-}
|
|
|
-
|
|
|
-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;
|
|
|
+ _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
}
|
|
|
|
|
|
-DataFrame * NbusBridge::bridge_getData()
|
|
|
+DataFrame* NbusBridge::_cmdGetData()
|
|
|
{
|
|
|
NbusSlave * slave_ptr = nullptr;
|
|
|
|
|
|
- _raw_data_frame.Init();
|
|
|
- _raw_data_frame.AddHeader(TYPE_HEADER_2B);
|
|
|
- _raw_data_frame.AddInt32(HAL_GetTick());
|
|
|
+ _bridge_cast_frame.Init();
|
|
|
+ _bridge_cast_frame.AddInt32(HAL_GetTick());
|
|
|
|
|
|
for (uint32_t i = 0; i < _num_slaves; i++)
|
|
|
{
|
|
|
- slave_ptr = getSlave(_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));
|
|
|
+ _bridge_cast_frame.AddInt8(slave_ptr->getModuleAddress());
|
|
|
+ _worker_frame_ptr = slave_ptr->cmdGetData();
|
|
|
+ _bridge_cast_frame.AddArray(&DATA0_RX_ADDRESS(_worker_frame_ptr->GetFrame() + 1), _worker_frame_ptr->GetLength() - (RX_META_SIZE + 1)); // add without length byte
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- _raw_data_frame.AddInt8(BRIDGE_TERMINATOR);
|
|
|
- _raw_data_frame.AddInt8(BRIDGE_TERMINATOR);
|
|
|
- _raw_data_frame.Commit();
|
|
|
+ _bridge_cast_frame.AddInt8(BRIDGE_TERMINATOR);
|
|
|
+ _bridge_cast_frame.AddInt8(BRIDGE_TERMINATOR);
|
|
|
+ _bridge_cast_frame.Commit();
|
|
|
|
|
|
- return &_raw_data_frame;
|
|
|
+ return &_bridge_cast_frame;
|
|
|
}
|
|
|
|
|
|
-DataFrame * NbusBridge::bridge_setErrResponse(Nbus_EC_e ec)
|
|
|
+DataFrame * NbusBridge::_cmdGetInfo()
|
|
|
{
|
|
|
- _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 &_master_frame;
|
|
|
+ _default_frame.Init();
|
|
|
+ _default_frame.AddUint8(BROADCAST_ADDRESS);
|
|
|
+ _default_frame.AddUint8(BRIDGE_ADDRESS);
|
|
|
+ _default_frame.AddUint8(FC_INFO);
|
|
|
+ _default_frame.AddArray((uint8_t*)BRIDGE_INFO_VERSION, 3);
|
|
|
+ _default_frame.AddArray((uint8_t*)BRIDGE_INFO_HW_FAMILY, 3);
|
|
|
+ _default_frame.AddArray((uint8_t*)BRIDGE_INFO_HW_VERSION, 3);
|
|
|
+ _default_frame.Commit();
|
|
|
+
|
|
|
+ return &_default_frame;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Implementácia rozhrania nBus.
|
|
|
- */
|
|
|
-void NbusBridge::processRequest(uint8_t *rxFrame, uint8_t size)
|
|
|
+DataFrame* NbusBridge::_cmdGetSlaves()
|
|
|
{
|
|
|
- uint8_t crcC = _crc8x_fast(rxFrame, size - 1);
|
|
|
+ _default_frame.Init();
|
|
|
+ _default_frame.AddUint8(BROADCAST_ADDRESS);
|
|
|
+ _default_frame.AddUint8(BRIDGE_ADDRESS);
|
|
|
+ _default_frame.AddUint8(FC_SLAVES);
|
|
|
|
|
|
- if (crcC != rxFrame[size - 1])
|
|
|
+ for (uint8_t i = 0; i < _num_slaves; i++)
|
|
|
{
|
|
|
- return;
|
|
|
+ _default_frame.AddUint8(i + 1);
|
|
|
+ _default_frame.AddUint8(_slave_adress[i]);
|
|
|
}
|
|
|
|
|
|
- _pdu.ma = rxFrame[0];
|
|
|
- _pdu.sa = rxFrame[1];
|
|
|
- _pdu.fc = (Nbus_FC_e)rxFrame[2];
|
|
|
+ _default_frame.Commit();
|
|
|
|
|
|
- if (_pdu.ma == BROADCAST_ADDRESS)
|
|
|
- {
|
|
|
- if (_pdu.sa == BRIDGE_ADDRESS)
|
|
|
- {
|
|
|
- process_bridge_request(rxFrame, size);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- process_broadcast(rxFrame);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- process_slave_request(rxFrame, size);
|
|
|
- }
|
|
|
+ return &_default_frame;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * Implementácia stavu STATE_RUNNING.
|
|
|
- * V tomto stave je spustené automatické odčítanie údajov zo všetkých slave/všetkých senzorov.
|
|
|
- * Dáta sa v dávke (za všetky slavy) odosielajú na Master.
|
|
|
- */
|
|
|
-void NbusBridge::processRunningState()
|
|
|
+void NbusBridge::_cmdSetStop()
|
|
|
{
|
|
|
+ _pdu.sa = BROADCAST_ADDRESS;
|
|
|
+ _communicator->sendToSlave(_makePacket(_pdu, nullptr, 0));
|
|
|
+ _run_state = STATE_TO_STOP;
|
|
|
+}
|
|
|
|
|
|
- if (_scan_request == 1)
|
|
|
- {
|
|
|
- _scan_request = 0;
|
|
|
- this->scan();
|
|
|
- }
|
|
|
-
|
|
|
- if (_run_state == STATE_STOPPED)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
+void NbusBridge::_cmdSetStart()
|
|
|
+{
|
|
|
+ _pdu.sa = BROADCAST_ADDRESS;
|
|
|
+ _communicator->sendToSlave(_makePacket(_pdu, nullptr, 0));
|
|
|
+ _run_state = STATE_RUNNING;
|
|
|
+}
|
|
|
|
|
|
- if (_run_state == STATE_TO_STOP)
|
|
|
- {
|
|
|
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET);
|
|
|
- _run_state = STATE_STOPPED;
|
|
|
- return;
|
|
|
- }
|
|
|
+DataFrame* NbusBridge::_rspSetError(Nbus_EC_e error_code)
|
|
|
+{
|
|
|
+ _default_frame.Init();
|
|
|
+ _default_frame.AddUint8(_pdu.ma);
|
|
|
+ _default_frame.AddUint8(_pdu.sa);
|
|
|
+ _default_frame.AddUint8(SET_ERR_RESPONSE(_pdu.fc));
|
|
|
+ _default_frame.AddUint8(error_code);
|
|
|
+ _default_frame.Commit();
|
|
|
+
|
|
|
+ return &_default_frame;
|
|
|
+}
|
|
|
|
|
|
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET);
|
|
|
+DataFrame* NbusBridge::_rspSetStatus(Nbus_SC_e status_code)
|
|
|
+{
|
|
|
+ _default_frame.Init();
|
|
|
+ _default_frame.AddUint8(_pdu.ma);
|
|
|
+ _default_frame.AddUint8(_pdu.sa);
|
|
|
+ _default_frame.AddUint8(_pdu.fc);
|
|
|
+ _default_frame.AddUint8(status_code);
|
|
|
+ _default_frame.Commit();
|
|
|
+
|
|
|
+ return &_default_frame;
|
|
|
+}
|
|
|
|
|
|
- _worker_frame_ptr = bridge_getData();
|
|
|
+DataFrame* NbusBridge::_makePacket(Nbus_PDU_t pdu, uint8_t *data, uint8_t size)
|
|
|
+{
|
|
|
+ _default_frame.Init();
|
|
|
+ _default_frame.AddUint8(pdu.ma);
|
|
|
+ _default_frame.AddUint8(pdu.sa);
|
|
|
+ _default_frame.AddUint8((Nbus_FC_e)pdu.fc);
|
|
|
+ _default_frame.AddArray(data, size);
|
|
|
+ _default_frame.Commit();
|
|
|
+
|
|
|
+ return &_default_frame;
|
|
|
+}
|
|
|
|
|
|
- // TODO problem: v stavi RUNNING pride STOP prikaz, ale ten sa nespracuje, pretoze bezi obsluha tejto funkcie.
|
|
|
- if (_run_state == STATE_RUNNING)
|
|
|
- {
|
|
|
- _communicator->sendToMaster(_worker_frame_ptr);
|
|
|
- }
|
|
|
+DataFrame* NbusBridge::_forwardPacket(uint8_t *data, uint8_t size)
|
|
|
+{
|
|
|
+ _raw_data_frame.Init();
|
|
|
+ _raw_data_frame.AddUint8(size);
|
|
|
+ _raw_data_frame.AddArray(data, size);
|
|
|
+ _raw_data_frame.Commit();
|
|
|
|
|
|
- /// TODO toto sa MI NEPACI, TREBA VYRIESIT INAK!!!!!!
|
|
|
- HAL_Delay(50); // TREBA VYSKUSAT
|
|
|
+ return &_raw_data_frame;
|
|
|
}
|