| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- /**
- * @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 <stdint.h>
- /**
- * @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;
- typedef enum
- {
- CallbackType_UART,
- CallbackType_SENSOR,
- } nBusStateCallbackType_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)(nBusStateCallbackType_t);
- } 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
- /**
- * @}
- */
- /**
- * @}
- */
- /**
- * @}
- */
|