/** * @file nbus_types.h * * @brief Definícia dátových štruktúr v protokolu nBUS * @author Juraj Dudak */ #ifndef __NBUS_TYPES_H #define __NBUS_TYPES_H #include "app_bridge.h" #include "nbus_config.h" #include "nbus_memory.h" #include /** * @brief Počet bajtov v pakete, ktoré tvoria réžiu. */ #define META_SIZE 5 /** * @brief Maximálna veľkosť dátovej časti v pakete. */ #define PAYLOAD_SIZE 128 /** * @brief Maximálna veľkosť komunikačného bufferu. */ #define BUFF_SIZE (PAYLOAD_SIZE + META_SIZE) /** * @brief Symbolické konštanty pre príznak pripravenosti dát */ typedef enum { /** Dáta nie sú pripravené. */ DATA_EMPTY, /** Dáta sú pripravené. */ DATA_READY, /** Dáta sú chybné. */ DATA_ERROR, } DataReadyTypedef; /** * @brief Definuje význam bytu FC v požiadavke. Bajt FC má index 2 v RX bufferi. * bit 7: príznak chyby * bit 6: rezervovaný * bit 5: ~r/w príznak pr zápis údajov * bt 4-0: kód funkcie. */ typedef struct __attribute__((packed)) { /** Kód funkcie. Bit 0..4 */ uint8_t function : 5; /** Príznak pre zápis údajov. Bit 5 */ uint8_t notReadWrite : 1; /** Rezervoané. Bit 6 */ uint8_t reserve : 1; /** Príznak chyby. Bit 7 */ uint8_t error : 1; } nBus_functionCode_t; #define REQUEST_GET 0 #define REQUEST_SET 1 /** * @brief Definuje význam bytu ADR v požiadavke. Bajt ADR má index 0 v RX * bufferi. Baj obsahuje adresu koncového senzora (bit 0..4) a typ senzora (bit * 5-7) */ typedef struct __attribute__((packed)) { /** Adresa pripojeného senzora. Povolené adresy 1..31. Pozícia v ADR byte: * 0..4*/ uint8_t address : 5; /** Definuje typ senora: vstup/výstup. * bit 7: 0-výstupné zariadenia, 1-vstupné zariadenia */ uint8_t type : 3; } nBus_sensorByte_t; /** * @brief Stavy komunikačného rozhrania počas behu programu. */ typedef enum { /** Čaká sa na príjem dát. Nasledujúci stav: UART_RX_RECEIVING */ UART_RX_WAIT, /** Dáta sa prijímajú. Nasledujúci stav: UART_RX_RECEIVED */ UART_RX_RECEIVING, /** Dáta sú prijané, v ďašom cykle sa budú spracovať. Nasledujúci stav: UART_RX_WAIT*/ UART_RX_RECEIVED } nBus_Uart_RX_state; /** * @brief Určuje typ nBUS príkazu. */ typedef enum { /** * Funckia, resp. príkaz určený konkrétny koncový senzor. */ UNICAST_TO_SENSOR, /** * Funckia, resp. príkaz určený konkrétny koncový senzor. */ UNICAST_TO_MODULE, /** * Funckia, resp. príkaz určený špecifické senzory. */ BROADCAST_SPECIFIC_SENSORS, /** * Funckia, resp. príkaz určený pre všetky moduly. */ BROADCAST_GLOBAL } nBusCommandType_t; /** * @brief Určuje typ odpovede na požiadavku. */ typedef enum { /** Na požiadavku sa nebude odpovedať. Zvyčajte pri BROADCAST požiadavke. */ NO_RESPONSE, /** Na požiadavku sa bude odpovedať. Zvyčajte pri UNICAST požiadavke. */ SEND_RESPONSE } nBus_response_t; typedef enum { MEASURE_STOPPED, MEASURE_RUNNING, } nBusMeasurementActive_t; /** * @brief Dátová štruktúra pre implementáciu základných funkcií na aplikačnej * úrovni. Komunikačný zásobník nBus je HW nezávislá implementácia komunikačného * protokolu. Pre zabezpečenie elementárnych akcií je potrebné tieto akcie * implementovať na konkrétnej hardvérovej platforme. Jedná sa o: * - uart_receive: naštartovanie procesu prijímania dát s uvedením max dĺžky * - uart_transmit: odoslaneie odpovede * - led_on/led_off/led_toggle: ovládani dignalizačnej LED diódy * - delay_ms: blokujúca pauza * - loop_callback: interný callback pre signalizáciu externých udalostí z * aplikácie. */ typedef struct { /** * @brief Spustenie príjmu dát na vstunom komunikačnom rozhraní (UART, ..). * 1 parameter: pointer na pole, kde sa uložia načítané dáta. * 2 parameter: maximálna dĺžka načítaných dát. * @note Načíranie dát musí byť asynchrónne. Celé načítanie musí manažovať * aplikácia. Po úspešnom načítaní musí aplikácia zavolať funkciu * nbus_cb_UART_RX(dataI); @see nbus_cb_UART_RX */ void (*uart_receive)(uint8_t *, int); /** * @brief Odoslanie odpovede cez komunikačné rozhranie. * 1 parameter: dáta na odoslanie * 2 parameter: počet abjtov na odoslanie */ void (*uart_transmit)(uint8_t *, int); /** * @brief Zapnutie signalizácie */ void (*led_on)(void); /** * @brief Vypnutie signalizácie */ void (*led_off)(void); /** * @brief Zmena stavu signalizácie */ void (*led_toggle)(void); /** * @brief Blokujúca pauza [ms]. */ void (*delay_ms)(uint8_t); /** * Callback protokolu nBus pre signalizáciu udalostí. Tento callback sa v * protokole nBus spúšťa každú iteráciu v hlavnej slučke. Stav aplikácie uruje * návratová hodnota tohto callbacku: 0 - žiadna udalosť nenastala 1 - signál * pre pripravenosť dát z pripojených senzorov. Hodnota 1 spôsobí prečítanie * dát z pripojeného sensora (nBus.interface->read()) 2 - signál oznamujúci * ukončenie načítania vstupných dát cez komunikačné rozhranie. Je to signál * pre ukočenie načítania, ktoré bolo sputené cez uart_receive */ uint8_t (*loop_callback)(void); } nBusPlatformInterface_t; /** * @brief Základná štruktúra protokolu nBUS. * * Obsahuje stavové a funkčné premenné zabezpečujúce správnu implementáciu * komunikácie. */ typedef struct { /** * @brief Prijímací buffer nBUS. */ uint8_t rx_buffer[BUFF_SIZE]; // buffer prijatych znakov /** * @brief Odosielací buffer uBUS. */ uint8_t tx_buffer[BUFF_SIZE]; // buffer odosielanych znakov /** * @brief Dĺžka prijatej správy */ uint8_t volatile rx_length; // usart flag - obsahuje pocet prijatych byte /** * @brief Dĺžka odosielanej správy */ uint16_t volatile tx_length; // usart flag - obsahuje pocet vysielanych byte /** * @brief Prvy bajt adresy zariadenia slave */ volatile uint8_t addressModule; /** * @brief Druhy bajt adresy zariadenia slave */ volatile nBus_sensorByte_t sensorInfo; nBus_functionCode_t function_code; volatile nBusCommandType_t request_type; /** @brief Flag pre signalizaciu ukoncenia primu dat cez UART. */ volatile nBus_Uart_RX_state uart_state; nBus_response_t send_response; /** @brief CRC8 sucet pre datovy ramec */ volatile uint8_t CRC8; volatile nBusMeasurementActive_t measure_active; volatile uint32_t data_timebase; nBusAppInterface_t *interface; nBus_memoryInterface_t *memoryInterface; #if USE_USART_DMA_TX == 1 /** * @brief Príznak ukončenia odoslania dát cez DMA * * Vlastnosť existuje, len ak má makro USE_USART_DMA_TX hodnotu 1 */ volatile uint8_t flag_UartTxCplt_DMA; #endif nBusPlatformInterface_t *hw_platform; } nBus_TypeDef; /** * @brief Určuje typ uBUS príkazu pre koncove slave zariadenie. */ typedef enum { /** * všeobecný príkaz, dáta sú uložené v konfigurácii (FLASH) */ COMMAND_SLAVE_GENERAL, /** * špecifický príkaz (state, reset, set/get value/param). Pracuje sa s * koncovým senzorom. Obsluja poziadavky je v module pre daný senzor. */ COMMAND_SLAVE_SPECIFIC, } UnicastSlaveCommandType; /** * @brief Určuje stav komunikačnej vrstvy */ typedef enum { /** * Dáta sú prijaté a pripravené na spracovanie. */ UART_DATA_READY, /** * Nie je prijatý žiadny príkaz na spracovanie. */ UART_DATA_EMPTY, } UART_DataState; /** * @TODO prerobit na nBUS * @brief Pripraví chybovú odpoveď prorokolu nBus. * * Vo funkcii sa nastaví aj správna dĺžka odpovede. * @param error_code chybový kód odpovede */ #define error_response(error_code) \ { \ uBus.sb_length = META_SIZE + 1; \ uBus.send_buff[2] = uBus.send_buff[2] | FLAG_ERROR; \ uBus.send_buff[3] = error_code; \ } #endif /** * @} */ /** * @} */ /** * @} */