/** * @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 /** Makro zistí adresu modulu z RX paketu */ #define MODULE_ADDRESS(packet) packet[0] /** Makro zistí adresu seznora z RX paketu */ #define SENSOR_ADDRESS(packet) packet[1] /** Makro zistí kód funkcie z RX paketu */ #define FUNCTION_CODE(packet) packet[2] /** Adresa broadcastu */ #define BROADCAST_ADDRESS 0 /** Virtuálna adresa modulu nBus Bridge */ #define BRIDGE_ADDRESS 0xFF #define BRIDGE_INFO_VERSION "1.0" #define BRIDGE_INFO_HW_FAMILY "STM" #define BRIDGE_INFO_HW_VERSION "0.5" #define RX_META 4 #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: /** Objekt zabezpečujúci komunikáciu na internej aj externej zbernici nBus */ NbusCommunicator *_communicator; /** 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]; /** Počet detegovaných slave zariadení. */ uint8_t _num_slaves; /** Príznak indikuje, či je modul Bridge v stave RUN */ RunState_e _run_state; /** Interný buffer */ DataFrame *_workerFrame; /** Pole bajtov použité pre generovanie odpovede pomocou triedy DataFrame */ uint8_t _dataPacket[DATAPACKET_SIZE]; /** Dataframe (wrapper nad _dataPacket), do ktorého za vygeneruje odsielaný packet.*/ DataFrame *_dataFrame; void transmit(DataFrame *packet); DataFrame *_frame_nbus_internal; Nbus_pdu _pdu; public: NbusBridge(); /** Nastaví komunikačný modul */ void setCommunicator(NbusCommunicator *nc); virtual ~NbusBridge(); void scan(); uint8_t getNumSlaves(); NbusSlave * getSlave(uint8_t index); DataFrame * getSlavesInfo(); void sendResponseToMaster(DataFrame *response_frame); void processRequest(uint8_t *rxFrame, uint8_t size); 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(); void process_broadcast(uint8_t *rxFrame); }; #endif /* SRC_NBUSBRIDGE_H_ */