/** * @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 #include "nbus_config.h" #include "app_bridge.h" #include "nbus_memory.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) #define CMD_FLAG_GET 1 #define CMD_FLAG_SET 0 /** * @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 Definícia GPIO pinu na platforma STM32. */ typedef struct { /** GPIO port */ GPIO_TypeDef* port; /** číslo pinu na zvolenom porte */ uint16_t pin; } McuPin_typeDef; /** * @brief Definícia periférií pre protokol uBUS. */ typedef struct { /** @brief Handler pre rozhranie UART */ UART_HandleTypeDef* huart; /** * @brief Časovač pre detekciu timeoutu na UART. */ TIM_HandleTypeDef* uart_timer; /** * @brief Časovač časovú značku merania. Rozlíšenie: 0.1ms */ TIM_HandleTypeDef* measure_timer; // doplnkove periferie #if SELF_MONITORING == 1 // in case of error in this place, set the macro SELF_MONITORING to 0 /** * @brief ADC periféria pre monitorovanie vnúterného stavu modulu. * * Táto vlastnosť je aktívna len v prípade ak má makro SELF_MONITORING hodnotu 1 */ ADC_HandleTypeDef* adc; #else void* adc; #endif /** * @brief Definícia pinu pre signalizačnú LED diódu */ McuPin_typeDef* led; RTC_HandleTypeDef *rtc; #if USE_SW_485 == 1 /** * @brief Definícia pinu riadenie smeru komunikácie RS485. * * Táto vlastnosť je aktívna len v prípade ak má makro USE_SW_485 hodnotu 1 */ McuPin_typeDef* rs485De; #else void* rs485De; #endif } Peripheral_typeDef; typedef struct __attribute__((packed)) { uint8_t function : 5; uint8_t notReadWrite : 1; uint8_t reserve : 1; uint8_t error : 1; } nBus_functionCode_t; #define REQUEST_GET 0 #define REQUEST_SET 1 typedef struct __attribute__((packed)) { uint8_t address : 5; uint8_t type : 3; } nBus_sensorByte_t; typedef enum { UART_RX_1B, UART_RX_PAYLOAD, UART_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, BROADCAST_SPECIFIC_SENSORS, BROADCAST_GLOBAL } nBusCommandType_t; typedef enum { NO_RESPONSE, SEND_RESPONSE }nBus_response_t; typedef enum { MEASURE_STOPPED, MEASURE_RUNNING, } nBusMeasurementActive_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; /** * @brief Periférie protokolu uBUS. */ Peripheral_typeDef* periph; 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 } 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 /** * @} */ /** * @} */ /** * @} */