NbusBridge.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /**
  2. * @file NbusBridge.h
  3. * @brief Deklarácia modulu nBus Bridge
  4. * @date Mar 7, 2025
  5. * @author Juraj Dudak
  6. */
  7. #ifndef SRC_NBUSBRIDGE_H_
  8. #define SRC_NBUSBRIDGE_H_
  9. #include "NbusSlave.h"
  10. /* DEFINES BEGIN */
  11. /** Maximálny počet zariadení slave na internej zbernici.
  12. * Pozor, súvisí to s alokáciou prostriedkov na MCU.
  13. */
  14. #define MAX_SLAVES 16
  15. #define ECHO_SCAN_LENGTH 4
  16. #define ECHO_SCAN_DATA {110, 66, 117, 115} // nBus
  17. #define ECHO_SCAN_CHAR0 110
  18. #define ECHO_SCAN_CHAR1 66
  19. #define ECHO_SCAN_CHAR2 117
  20. #define ECHO_SCAN_CHAR3 115
  21. /** Adresa broadcastu */
  22. #define BROADCAST_ADDRESS 0
  23. /** Virtuálna adresa modulu nBus Bridge */
  24. #define BRIDGE_ADDRESS 0xFF
  25. /** Macro for bridge terminator **/
  26. #define BRIDGE_TERMINATOR 0xFF
  27. #define BRIDGE_INFO_VERSION "1.0"
  28. #define BRIDGE_INFO_HW_FAMILY "STM"
  29. #define BRIDGE_INFO_HW_VERSION "0.5"
  30. #define DATAPACKET_SIZE (NBUS_MAX_FRAME_SIZE*MAX_SLAVES)
  31. /* DEFINES END */
  32. typedef enum {
  33. STATE_STOPPED,
  34. STATE_TO_STOP,
  35. STATE_RUNNING,
  36. }RunState_e;
  37. /**
  38. * @brief Trieda zabezpečujúca interpretáciu príkazov protokolu nBus.
  39. */
  40. class NbusBridge {
  41. private:
  42. uint8_t _crc8x_fast(void const *mem, uint16_t len);
  43. /** Objekt zabezpečujúci komunikáciu na internej aj externej zbernici nBus */
  44. NbusCommunicator *_communicator{nullptr};
  45. /** Statické pole objektov nBus slave */
  46. NbusSlave _slaves[MAX_SLAVES];
  47. /** Pole detegovaných adries modulov slave. Pole sa naplní pri automatickom skene internej zbernice */
  48. uint8_t _slave_adress[MAX_SLAVES]{0};
  49. /** Počet detegovaných slave zariadení. */
  50. uint8_t _num_slaves{0};
  51. /** Príznak indikuje, či je modul Bridge v stave RUN */
  52. RunState_e _run_state{STATE_STOPPED};
  53. /** Interný buffer */
  54. DataFrame *_worker_frame_ptr{nullptr};
  55. /** Pole bajtov použité pre generovanie odpovede pomocou triedy DataFrame */
  56. uint8_t _data_packet[DATAPACKET_SIZE]{0};
  57. /** Dataframe (wrapper nad _dataPacket), do ktorého za vygeneruje odsielaný packet.*/
  58. DataFrame _raw_data_frame{_data_packet, DATAPACKET_SIZE, TYPE_RAW, CRC_OFF};
  59. DataFrame _master_frame{_data_packet, DATAPACKET_SIZE, TYPE_PLAIN, CRC_ON};
  60. uint8_t _scan_request{0};
  61. Nbus_PDU_t _pdu{BROADCAST_ADDRESS, BROADCAST_ADDRESS, FC_ECHO};
  62. public:
  63. /** Nastaví komunikačný modul */
  64. void setCommunicator(NbusCommunicator *nc);
  65. void scan();
  66. uint8_t getNumSlaves();
  67. NbusSlave * getSlave(uint8_t index);
  68. DataFrame * bridge_getSlaves();
  69. DataFrame * bridge_getInfo();
  70. DataFrame * bridge_getData();
  71. DataFrame * bridge_setErrResponse(Nbus_EC_e ec);
  72. void processRequest(uint8_t *rxFrame, uint8_t size);
  73. void process_broadcast(uint8_t *rxFrame);
  74. void process_bridge_request(uint8_t *rxFrame, uint8_t size);
  75. void process_slave_request(uint8_t *rxFrame, uint8_t size);
  76. void broadcastStart();
  77. void broadcastStop();
  78. void processRunningState();
  79. };
  80. #endif /* SRC_NBUSBRIDGE_H_ */