|
|
@@ -1,8 +1,8 @@
|
|
|
/*
|
|
|
- * NbusBridge.cpp
|
|
|
- *
|
|
|
- * Created on: Mar 7, 2025
|
|
|
- * Author: juraj
|
|
|
+ * @file NbusBridge.cpp
|
|
|
+ * @brief Implemetnácia modulu nBus Brige
|
|
|
+ * @date Mar 7, 2025
|
|
|
+ * @author Juraj Dudak
|
|
|
*/
|
|
|
|
|
|
#include "NbusBridge.h"
|
|
|
@@ -17,23 +17,12 @@ NbusBridge::NbusBridge(NbusCommunicator *nc) {
|
|
|
}
|
|
|
_communicator = nc;
|
|
|
_num_slaves = 0;
|
|
|
- for(uint32_t i = 0 ; i<MAX_SLAVES ; i++){
|
|
|
- _slaves[i] = NULL;
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
|
|
|
NbusBridge::~NbusBridge() {
|
|
|
- // TODO Auto-generated destructor stub
|
|
|
+ // empty
|
|
|
}
|
|
|
|
|
|
-bool NbusBridge::addSlave(NbusSlave *slave){
|
|
|
- if(_num_slaves >= MAX_SLAVES){
|
|
|
- return false;
|
|
|
- }
|
|
|
- _slaves[_num_slaves++] = slave;
|
|
|
- return true;
|
|
|
-}
|
|
|
|
|
|
void NbusBridge::scan(){
|
|
|
_num_slaves = 0;
|
|
|
@@ -44,7 +33,6 @@ void NbusBridge::scan(){
|
|
|
pdu.fc = FC_ECHO;
|
|
|
pdu.sa = SLAVE_ADDRESS_MODULE;
|
|
|
uint8_t data[4] = {110, 66, 117, 115}; // nBus
|
|
|
- uint8_t detected_slaves[MAX_SLAVES];
|
|
|
const uint8_t data_offset = 4;
|
|
|
|
|
|
for(uint32_t i = 1 ; i < MAX_SLAVES; i++){
|
|
|
@@ -53,24 +41,19 @@ void NbusBridge::scan(){
|
|
|
if (!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) {
|
|
|
- detected_slaves[_num_slaves] = i;
|
|
|
_num_slaves++;
|
|
|
+ _slaves[i].setAddress(i);
|
|
|
+ _slaves[i].setCommunicator(_communicator);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- NbusSlave *slave;
|
|
|
- for(uint32_t i = 0 ; i < _num_slaves; i++){
|
|
|
- slave = new NbusSlave(detected_slaves[i], _communicator);
|
|
|
- if (slave != NULL){
|
|
|
- _slaves[i] = slave;
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
NbusSlave * NbusBridge::getSlave(uint8_t index){
|
|
|
- if(index >= 0 && index<_num_slaves){
|
|
|
- return _slaves[index];
|
|
|
+ if(index >= 0 && index < MAX_SLAVES){
|
|
|
+ if (_slaves[index].isActive()) {
|
|
|
+ return &_slaves[index];
|
|
|
+ }
|
|
|
}
|
|
|
return NULL;
|
|
|
}
|
|
|
@@ -85,11 +68,11 @@ bool NbusBridge::call_echo(uint8_t slave){
|
|
|
}
|
|
|
if(slave == 0){
|
|
|
for(uint32_t i = 0 ; i<_num_slaves ; i++){
|
|
|
- _slaves[i]->nbus_echo();
|
|
|
+ getSlave(i)->nbus_echo();
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
- _slaves[slave]->nbus_echo();
|
|
|
+ getSlave(slave)->nbus_echo();
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -98,3 +81,79 @@ void NbusBridge::sendResponseToMaster(DataFrame *response_frame){
|
|
|
_communicator->sendToMaster(response_frame);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+void NbusBridge::processRequest(uint8_t *rxFrame){
|
|
|
+ uint8_t send_reponse = 1;
|
|
|
+ NbusSlave *selected_slave = getSlave(MODULE_ADDRESS(rxFrame));
|
|
|
+ if (selected_slave == NULL){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!selected_slave->isActive()){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch(FUNCTION_CODE(rxFrame)) {
|
|
|
+
|
|
|
+ case FC_FIND: /* 0 */
|
|
|
+ // Not implemented yet
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_ECHO: /* 1 */
|
|
|
+ _frame_nbus_internal = selected_slave->nbus_echo();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_STOP: /* 2 */
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_START: /* 3 */
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_PARAM: /* 4 */
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_SENSOR_CNT: /* 5 */
|
|
|
+ _frame_nbus_internal = 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 */
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_SYNC: /* 0xC => 12 */
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_SENSOR_TYPE: /* 0xD => 13 */
|
|
|
+ _frame_nbus_internal = selected_slave->nbus_sensor_type(SENSOR_ADDRESS(rxFrame));
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_INFO: /* 0xE => 14 */
|
|
|
+ _frame_nbus_internal = selected_slave->nbus_module_info();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case FC_SENSOR_FORMAT: /* 0xF => 15 */
|
|
|
+ _frame_nbus_internal = selected_slave->nbus_sensor_parameters(SENSOR_ADDRESS(rxFrame));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ send_reponse = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (send_reponse == 1){
|
|
|
+ sendResponseToMaster(_frame_nbus_internal);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|