/** * @file NbusBridge.h * @brief Deklarácia modulu nBus Bridge * @date Mar 7, 2025 * @author Juraj Dudak */ #ifndef SRC_NBUSBRIDGE_H_ #define SRC_NBUSBRIDGE_H_ #include "NbusSlave.h" /* DEFINES BEGIN */ /** Maximálny počet zariadení slave na internej zbernici. * Pozor, súvisí to s alokáciou prostriedkov na MCU. */ #define MAX_SLAVES 16 #define ECHO_SCAN_LENGTH 4 #define ECHO_SCAN_DATA {110, 66, 117, 115} // nBus #define ECHO_SCAN_CHAR0 110 #define ECHO_SCAN_CHAR1 66 #define ECHO_SCAN_CHAR2 117 #define ECHO_SCAN_CHAR3 115 /** Adresa broadcastu */ #define BROADCAST_ADDRESS 0 /** Virtuálna adresa modulu nBus Bridge */ #define BRIDGE_ADDRESS 0xFF /** Macro for bridge terminator **/ #define BRIDGE_TERMINATOR 0xFF #define BRIDGE_INFO_VERSION "1.0" #define BRIDGE_INFO_HW_FAMILY "STM" #define BRIDGE_INFO_HW_VERSION "0.5" #define DATAPACKET_SIZE (NBUS_MAX_FRAME_SIZE*MAX_SLAVES) /* DEFINES END */ typedef enum { STATE_STOPPED, STATE_TO_STOP, STATE_RUNNING, }RunState_e; /** * @brief Trieda zabezpečujúca interpretáciu príkazov protokolu nBus. */ class NbusBridge { private: uint8_t _crc8x_fast(void const *mem, uint16_t len); /** Objekt zabezpečujúci komunikáciu na internej aj externej zbernici nBus */ NbusCommunicator *_communicator{nullptr}; /** Statické pole objektov nBus slave */ NbusSlave _slaves[MAX_SLAVES]; /** Pole detegovaných adries modulov slave. Pole sa naplní pri automatickom skene internej zbernice */ uint8_t _slave_adress[MAX_SLAVES]{0}; /** Počet detegovaných slave zariadení. */ uint8_t _num_slaves{0}; /** Príznak indikuje, či je modul Bridge v stave RUN */ RunState_e _run_state{STATE_STOPPED}; /** Interný buffer */ DataFrame *_worker_frame_ptr{nullptr}; /** Pole bajtov použité pre generovanie odpovede pomocou triedy DataFrame */ uint8_t _data_packet[DATAPACKET_SIZE]{0}; /** Dataframe (wrapper nad _dataPacket), do ktorého za vygeneruje odsielaný packet.*/ DataFrame _raw_data_frame{_data_packet, DATAPACKET_SIZE, TYPE_RAW, CRC_OFF}; DataFrame _master_frame{_data_packet, DATAPACKET_SIZE, TYPE_PLAIN, CRC_ON}; uint8_t _scan_request{0}; Nbus_PDU_t _pdu{BROADCAST_ADDRESS, BROADCAST_ADDRESS, FC_ECHO}; public: /** Nastaví komunikačný modul */ void setCommunicator(NbusCommunicator *nc); void scan(); uint8_t getNumSlaves(); NbusSlave * getSlave(uint8_t index); DataFrame * bridge_getSlaves(); DataFrame * bridge_getInfo(); DataFrame * bridge_getData(); DataFrame * bridge_setErrResponse(Nbus_EC_e ec); void processRequest(uint8_t *rxFrame, uint8_t size); void process_broadcast(uint8_t *rxFrame); void process_bridge_request(uint8_t *rxFrame, uint8_t size); void process_slave_request(uint8_t *rxFrame, uint8_t size); void broadcastStart(); void broadcastStop(); void processRunningState(); }; #endif /* SRC_NBUSBRIDGE_H_ */