nbus_types.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. /**
  2. * @file nbus_types.h
  3. *
  4. * @brief Definícia dátových štruktúr v protokolu nBUS
  5. * @author Juraj Dudak
  6. */
  7. #ifndef __NBUS_TYPES_H
  8. #define __NBUS_TYPES_H
  9. #include "app_bridge.h"
  10. #include "nbus_config.h"
  11. #include "nbus_memory.h"
  12. #include <stdint.h>
  13. /**
  14. * @brief Počet bajtov v pakete, ktoré tvoria réžiu.
  15. */
  16. #define META_SIZE 5
  17. #define RX_META 4
  18. /**
  19. * @brief Index Module Address v RX pakete.
  20. */
  21. #define RX_MA 0
  22. /**
  23. * @brief Index Sensor Address v RX pakete.
  24. */
  25. #define RX_SA 1
  26. /**
  27. * @brief Index Function Code v RX pakete.
  28. */
  29. #define RX_FC 2
  30. /**
  31. * @brief Index Data v RX pakete.
  32. */
  33. #define RX_DT 3
  34. /**
  35. * @brief Index Data v TX pakete.
  36. */
  37. #define TX_DT 4
  38. /**
  39. * @brief Sensor Read-Only Address offset.
  40. */
  41. #define SENSOR_RO_ADDR 1
  42. /**
  43. * @brief Sensor Read-Write Address offset.
  44. */
  45. #define SENSOR_RW_ADDR 129
  46. /**
  47. * @brief Maximálna veľkosť dátovej časti v pakete.
  48. */
  49. #define PAYLOAD_SIZE 128
  50. /**
  51. * @brief Maximálna veľkosť komunikačného bufferu.
  52. */
  53. #define BUFF_SIZE (PAYLOAD_SIZE + META_SIZE)
  54. /**
  55. * @brief Symbolické konštanty pre príznak pripravenosti dát
  56. */
  57. typedef enum
  58. {
  59. /** Dáta nie sú pripravené. */
  60. DATA_EMPTY,
  61. /** Dáta sú pripravené. */
  62. DATA_READY,
  63. /** Dáta sú chybné. */
  64. DATA_ERROR,
  65. } DataReadyTypedef;
  66. /**
  67. * @brief Definuje význam bytu FC v požiadavke. Bajt FC má index 2 v RX bufferi.
  68. * bit 7: príznak chyby
  69. * bit 6: rezervovaný
  70. * bit 5: ~r/w príznak pr zápis údajov
  71. * bt 4-0: kód funkcie.
  72. */
  73. typedef struct __attribute__((packed))
  74. {
  75. /** Kód funkcie. Bit 0..4 */
  76. uint8_t function : 5;
  77. /** Príznak pre zápis údajov. Bit 5 */
  78. uint8_t notReadWrite : 1;
  79. /** Rezervoané. Bit 6 */
  80. uint8_t reserve : 1;
  81. /** Príznak chyby. Bit 7 */
  82. uint8_t error : 1;
  83. } nBus_functionCode_t;
  84. #define REQUEST_GET 0
  85. #define REQUEST_SET 1
  86. /**
  87. * @brief Definuje význam bytu ADR v požiadavke. Bajt ADR má index 0 v RX
  88. * bufferi. Baj obsahuje adresu koncového senzora (bit 0..4) a typ senzora (bit
  89. * 5-7)
  90. */
  91. typedef struct __attribute__((packed))
  92. {
  93. /** Adresa pripojeného senzora. Povolené adresy 1..31. Pozícia v ADR byte:
  94. * 0..4*/
  95. uint8_t address : 5;
  96. /** Definuje typ senora: vstup/výstup.
  97. * bit 7: 0-výstupné zariadenia, 1-vstupné zariadenia
  98. */
  99. uint8_t type : 3;
  100. } nBus_sensorByte_t;
  101. /**
  102. * @brief Stavy komunikačného rozhrania počas behu programu.
  103. */
  104. typedef enum
  105. {
  106. /** Čaká sa na príjem dát. Nasledujúci stav: UART_RX_RECEIVING */
  107. UART_RX_WAIT,
  108. /** Dáta sa prijímajú. Nasledujúci stav: UART_RX_RECEIVED */
  109. UART_RX_RECEIVING,
  110. /** Dáta sú prijané, v ďašom cykle sa budú spracovať. Nasledujúci stav:
  111. UART_RX_WAIT*/
  112. UART_RX_RECEIVED
  113. } nBus_Uart_RX_state;
  114. /**
  115. * @brief Určuje typ nBUS príkazu.
  116. */
  117. typedef enum
  118. {
  119. /**
  120. * Funckia, resp. príkaz určený konkrétny koncový senzor.
  121. */
  122. UNICAST_TO_SENSOR,
  123. /**
  124. * Funckia, resp. príkaz určený konkrétny koncový senzor.
  125. */
  126. UNICAST_TO_MODULE,
  127. /**
  128. * Funckia, resp. príkaz určený špecifické senzory.
  129. */
  130. BROADCAST_SPECIFIC_SENSORS,
  131. /**
  132. * Funckia, resp. príkaz určený pre všetky moduly.
  133. */
  134. BROADCAST_GLOBAL
  135. } nBusCommandType_t;
  136. /**
  137. * @brief Určuje typ odpovede na požiadavku.
  138. */
  139. typedef enum
  140. {
  141. /** Na požiadavku sa nebude odpovedať. Zvyčajte pri BROADCAST požiadavke. */
  142. NO_RESPONSE,
  143. /** Na požiadavku sa bude odpovedať. Zvyčajte pri UNICAST požiadavke. */
  144. SEND_RESPONSE
  145. } nBus_response_t;
  146. typedef enum
  147. {
  148. MEASURE_STOPPED,
  149. MEASURE_RUNNING,
  150. } nBusMeasurementActive_t;
  151. typedef enum
  152. {
  153. CallbackType_UART,
  154. CallbackType_SENSOR,
  155. } nBusStateCallbackType_t;
  156. /**
  157. * @brief Dátová štruktúra pre implementáciu základných funkcií na aplikačnej
  158. * úrovni. Komunikačný zásobník nBus je HW nezávislá implementácia komunikačného
  159. * protokolu. Pre zabezpečenie elementárnych akcií je potrebné tieto akcie
  160. * implementovať na konkrétnej hardvérovej platforme. Jedná sa o:
  161. * - uart_receive: naštartovanie procesu prijímania dát s uvedením max dĺžky
  162. * - uart_transmit: odoslaneie odpovede
  163. * - led_on/led_off/led_toggle: ovládani dignalizačnej LED diódy
  164. * - delay_ms: blokujúca pauza
  165. * - loop_callback: interný callback pre signalizáciu externých udalostí z
  166. * aplikácie.
  167. */
  168. typedef struct
  169. {
  170. /**
  171. * @brief Spustenie príjmu dát na vstunom komunikačnom rozhraní (UART, ..).
  172. * 1 parameter: pointer na pole, kde sa uložia načítané dáta.
  173. * 2 parameter: maximálna dĺžka načítaných dát.
  174. * @note Načíranie dát musí byť asynchrónne. Celé načítanie musí manažovať
  175. * aplikácia. Po úspešnom načítaní musí aplikácia zavolať funkciu
  176. * nbus_cb_UART_RX(dataI); @see nbus_cb_UART_RX
  177. */
  178. void (*uart_receive)(uint8_t *, int);
  179. /**
  180. * @brief Odoslanie odpovede cez komunikačné rozhranie.
  181. * 1 parameter: dáta na odoslanie
  182. * 2 parameter: počet abjtov na odoslanie
  183. */
  184. void (*uart_transmit)(uint8_t *, int);
  185. /**
  186. * @brief Zapnutie signalizácie
  187. */
  188. void (*led_on)(void);
  189. /**
  190. * @brief Vypnutie signalizácie
  191. */
  192. void (*led_off)(void);
  193. /**
  194. * @brief Zmena stavu signalizácie
  195. */
  196. void (*led_toggle)(void);
  197. /**
  198. * @brief Blokujúca pauza [ms].
  199. */
  200. void (*delay_ms)(uint8_t);
  201. /**
  202. * Callback protokolu nBus pre signalizáciu udalostí. Tento callback sa v
  203. * protokole nBus spúšťa každú iteráciu v hlavnej slučke. Stav aplikácie uruje
  204. * návratová hodnota tohto callbacku: 0 - žiadna udalosť nenastala 1 - signál
  205. * pre pripravenosť dát z pripojených senzorov. Hodnota 1 spôsobí prečítanie
  206. * dát z pripojeného sensora (nBus.interface->read()) 2 - signál oznamujúci
  207. * ukončenie načítania vstupných dát cez komunikačné rozhranie. Je to signál
  208. * pre ukočenie načítania, ktoré bolo sputené cez uart_receive
  209. */
  210. uint8_t (*loop_callback)(nBusStateCallbackType_t);
  211. } nBusPlatformInterface_t;
  212. /**
  213. * @brief Základná štruktúra protokolu nBUS.
  214. *
  215. * Obsahuje stavové a funkčné premenné zabezpečujúce správnu implementáciu
  216. * komunikácie.
  217. */
  218. typedef struct
  219. {
  220. /**
  221. * @brief Prijímací buffer nBUS.
  222. */
  223. uint8_t rx_buffer[BUFF_SIZE]; // buffer prijatych znakov
  224. /**
  225. * @brief Odosielací buffer uBUS.
  226. */
  227. uint8_t tx_buffer[BUFF_SIZE]; // buffer odosielanych znakov
  228. /**
  229. * @brief Dĺžka prijatej správy
  230. */
  231. uint8_t volatile rx_length; // usart flag - obsahuje pocet prijatych byte
  232. /**
  233. * @brief Dĺžka odosielanej správy
  234. */
  235. uint16_t volatile tx_length; // usart flag - obsahuje pocet vysielanych byte
  236. /**
  237. * @brief Prvy bajt adresy zariadenia slave
  238. */
  239. volatile uint8_t addressModule;
  240. /**
  241. * @brief Druhy bajt adresy zariadenia slave
  242. */
  243. volatile nBus_sensorByte_t sensorInfo;
  244. nBus_functionCode_t function_code;
  245. volatile nBusCommandType_t request_type;
  246. /** @brief Flag pre signalizaciu ukoncenia primu dat cez UART. */
  247. volatile nBus_Uart_RX_state uart_state;
  248. nBus_response_t send_response;
  249. /** @brief CRC8 sucet pre datovy ramec */
  250. volatile uint8_t CRC8;
  251. volatile nBusMeasurementActive_t measure_active;
  252. volatile uint32_t data_timebase;
  253. nBusAppInterface_t *interface;
  254. nBus_memoryInterface_t *memoryInterface;
  255. #if USE_USART_DMA_TX == 1
  256. /**
  257. * @brief Príznak ukončenia odoslania dát cez DMA
  258. *
  259. * Vlastnosť existuje, len ak má makro USE_USART_DMA_TX hodnotu 1
  260. */
  261. volatile uint8_t flag_UartTxCplt_DMA;
  262. #endif
  263. nBusPlatformInterface_t *hw_platform;
  264. } nBus_TypeDef;
  265. /**
  266. * @brief Určuje typ uBUS príkazu pre koncove slave zariadenie.
  267. */
  268. typedef enum
  269. {
  270. /**
  271. * všeobecný príkaz, dáta sú uložené v konfigurácii (FLASH)
  272. */
  273. COMMAND_SLAVE_GENERAL,
  274. /**
  275. * špecifický príkaz (state, reset, set/get value/param). Pracuje sa s
  276. * koncovým senzorom. Obsluja poziadavky je v module pre daný senzor.
  277. */
  278. COMMAND_SLAVE_SPECIFIC,
  279. } UnicastSlaveCommandType;
  280. /**
  281. * @brief Určuje stav komunikačnej vrstvy
  282. */
  283. typedef enum
  284. {
  285. /**
  286. * Dáta sú prijaté a pripravené na spracovanie.
  287. */
  288. UART_DATA_READY,
  289. /**
  290. * Nie je prijatý žiadny príkaz na spracovanie.
  291. */
  292. UART_DATA_EMPTY,
  293. } UART_DataState;
  294. /**
  295. * @TODO prerobit na nBUS
  296. * @brief Pripraví chybovú odpoveď prorokolu nBus.
  297. *
  298. * Vo funkcii sa nastaví aj správna dĺžka odpovede.
  299. * @param error_code chybový kód odpovede
  300. */
  301. #define error_response(error_code) \
  302. { \
  303. uBus.sb_length = META_SIZE + 1; \
  304. uBus.send_buff[2] = uBus.send_buff[2] | FLAG_ERROR; \
  305. uBus.send_buff[3] = error_code; \
  306. }
  307. #endif
  308. /**
  309. * @}
  310. */
  311. /**
  312. * @}
  313. */
  314. /**
  315. * @}
  316. */