/* * @file NbusBridge.cpp * @brief Implemetnácia modulu nBus Brige * @date Mar 7, 2025 * @author Juraj Dudak */ #include "NbusBridge.h" #include "dataframe.h" NbusBridge::NbusBridge(NbusCommunicator *nc) { if(nc == NULL) { while(1){ __NOP(); } } _communicator = nc; _num_slaves = 0; } NbusBridge::~NbusBridge() { // empty } void NbusBridge::scan(){ _num_slaves = 0; DataFrame *frame; uint8_t *response; Nbus_pdu pdu; pdu.fc = FC_ECHO; pdu.sa = SLAVE_ADDRESS_MODULE; uint8_t data[4] = {110, 66, 117, 115}; // nBus const uint8_t data_offset = 4; for(uint32_t i = 1 ; i < MAX_SLAVES; i++){ pdu.ma = i; frame = _communicator->send(&pdu, data, 4); 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) { _num_slaves++; _slaves[i].setAddress(i); _slaves[i].setCommunicator(_communicator); } } } } NbusSlave * NbusBridge::getSlave(uint8_t index){ if(index >= 0 && index < MAX_SLAVES){ if (_slaves[index].isActive()) { return &_slaves[index]; } } return NULL; } uint8_t NbusBridge::getNumSlaves(){ return _num_slaves; } bool NbusBridge::call_echo(uint8_t slave){ if(slave >= _num_slaves){ return false; } if(slave == 0){ for(uint32_t i = 0 ; i<_num_slaves ; i++){ getSlave(i)->nbus_echo(); } return true; } getSlave(slave)->nbus_echo(); return true; } void NbusBridge::sendResponseToMaster(DataFrame *response_frame){ if(response_frame !=NULL && response_frame->IsEmpty() == false) { _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); } }