WizziLab's serial protocol library
Dependents: modem_ref_helper_for_v5_3_217 modem_ref_helper
WizziCom.h@13:a3997e6aea6e, 2021-09-24 (annotated)
- Committer:
- Jeej
- Date:
- Fri Sep 24 12:36:06 2021 +0000
- Revision:
- 13:a3997e6aea6e
- Parent:
- 9:0140247bab90
- Child:
- 15:173bac57aede
- Child:
- 16:32c006e829df
Added names to threads
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jeej | 5:a06d239f3b3e | 1 | #ifndef _WIZZICOM_H_ |
Jeej | 5:a06d239f3b3e | 2 | #define _WIZZICOM_H_ |
Jeej | 0:95b73d0b37b7 | 3 | |
Jeej | 0:95b73d0b37b7 | 4 | #include "mbed.h" |
Jeej | 0:95b73d0b37b7 | 5 | #include "rtos.h" |
Jeej | 9:0140247bab90 | 6 | #include "kal_buf_circ.h" |
Jeej | 0:95b73d0b37b7 | 7 | #include "WizziDebug.h" |
Jeej | 0:95b73d0b37b7 | 8 | |
Jeej | 8:42e00820df36 | 9 | // message header length in byte |
Jeej | 9:0140247bab90 | 10 | #define KAL_COM_HEADER_LEN 5 |
Jeej | 9:0140247bab90 | 11 | #define RX_BUF_SIZE 512 |
Jeej | 0:95b73d0b37b7 | 12 | |
Jeej | 0:95b73d0b37b7 | 13 | typedef enum |
Jeej | 0:95b73d0b37b7 | 14 | { |
Jeej | 0:95b73d0b37b7 | 15 | HAL_ERROR_NONE = 0, |
Jeej | 0:95b73d0b37b7 | 16 | HAL_ERROR_DEFAULT = -1, |
Jeej | 0:95b73d0b37b7 | 17 | HAL_ERROR_MEM_FULL = -2, |
Jeej | 0:95b73d0b37b7 | 18 | HAL_ERROR_MEM_EMPTY = -3, |
Jeej | 0:95b73d0b37b7 | 19 | HAL_ERROR_MODULE_BUSY = -4, |
Jeej | 0:95b73d0b37b7 | 20 | HAL_ERROR_MODULE_OFF = -5, |
Jeej | 0:95b73d0b37b7 | 21 | HAL_ERROR_SERIAL_BAD_SYNC = -100, |
Jeej | 0:95b73d0b37b7 | 22 | HAL_ERROR_SERIAL_BAD_SEQ = -101, |
Jeej | 0:95b73d0b37b7 | 23 | HAL_ERROR_I2C_BAD_DEVID = -200, |
Jeej | 0:95b73d0b37b7 | 24 | HAL_ERROR_I2C_NACK = -201, |
Jeej | 0:95b73d0b37b7 | 25 | HAL_ERROR_I2C_ARB_LOST = -202, |
Jeej | 0:95b73d0b37b7 | 26 | |
Jeej | 0:95b73d0b37b7 | 27 | } hal_error_t; |
Jeej | 0:95b73d0b37b7 | 28 | |
Jeej | 0:95b73d0b37b7 | 29 | |
Jeej | 0:95b73d0b37b7 | 30 | typedef enum { |
Jeej | 0:95b73d0b37b7 | 31 | // Default printf type |
Jeej | 0:95b73d0b37b7 | 32 | WizziComPacketPrintf, |
Jeej | 0:95b73d0b37b7 | 33 | // Substitute the string by a codeword |
Jeej | 0:95b73d0b37b7 | 34 | // interpreted by the PC com tool |
Jeej | 0:95b73d0b37b7 | 35 | WizziComPacketPrintfCompressed, |
Jeej | 0:95b73d0b37b7 | 36 | // Display the payload as hex data |
Jeej | 0:95b73d0b37b7 | 37 | WizziComPacketPrintHex, |
Jeej | 0:95b73d0b37b7 | 38 | |
Jeej | 0:95b73d0b37b7 | 39 | // AT command |
Jeej | 0:95b73d0b37b7 | 40 | WizziComPacketAlpCmd, |
Jeej | 0:95b73d0b37b7 | 41 | // AT command response |
Jeej | 0:95b73d0b37b7 | 42 | WizziComPacketAlpResp, |
Jeej | 0:95b73d0b37b7 | 43 | // AT unsolicited message |
Jeej | 0:95b73d0b37b7 | 44 | WizziComPacketAlpUns, |
Jeej | 0:95b73d0b37b7 | 45 | // AT unsolicited error |
Jeej | 0:95b73d0b37b7 | 46 | WizziComPacketAlpErr, |
Jeej | 0:95b73d0b37b7 | 47 | |
Jeej | 0:95b73d0b37b7 | 48 | // Remote Commands |
Jeej | 0:95b73d0b37b7 | 49 | WizziComPacketCmd, |
Jeej | 0:95b73d0b37b7 | 50 | |
Jeej | 0:95b73d0b37b7 | 51 | // Remote System reset |
Jeej | 0:95b73d0b37b7 | 52 | WizziComPacketSysReset, |
Jeej | 0:95b73d0b37b7 | 53 | // Button Emulator |
Jeej | 0:95b73d0b37b7 | 54 | WizziComPacketSysButton, |
Jeej | 0:95b73d0b37b7 | 55 | // Dump Debug parameters |
Jeej | 0:95b73d0b37b7 | 56 | WizziComPacketSysInfo, |
Jeej | 0:95b73d0b37b7 | 57 | // CUP signalisation |
Jeej | 0:95b73d0b37b7 | 58 | WizziComPacketSysCup, |
Jeej | 0:95b73d0b37b7 | 59 | // Ping distant COM |
Jeej | 0:95b73d0b37b7 | 60 | WizziComPacketSysPing, |
Jeej | 0:95b73d0b37b7 | 61 | // Pong from distant COM |
Jeej | 0:95b73d0b37b7 | 62 | WizziComPacketSysPong, |
Jeej | 0:95b73d0b37b7 | 63 | // Enable system config from distant COM |
Jeej | 0:95b73d0b37b7 | 64 | WizziComPacketSysConfig, |
Jeej | 0:95b73d0b37b7 | 65 | // Configure Output Trace level from distant COM |
Jeej | 0:95b73d0b37b7 | 66 | WizziComPacketSysTlev, |
Jeej | 0:95b73d0b37b7 | 67 | // Configure COM port redirection |
Jeej | 0:95b73d0b37b7 | 68 | WizziComPacketSysRedir, |
Jeej | 0:95b73d0b37b7 | 69 | // Flow control signalling |
Jeej | 0:95b73d0b37b7 | 70 | WizziComPacketSysXon, |
Jeej | 0:95b73d0b37b7 | 71 | WizziComPacketSysXoff, |
Jeej | 0:95b73d0b37b7 | 72 | WizziComPacketSysXack, |
Jeej | 0:95b73d0b37b7 | 73 | |
Jeej | 0:95b73d0b37b7 | 74 | // File System Command/Response |
Jeej | 0:95b73d0b37b7 | 75 | WizziComPacketFsCmd, |
Jeej | 0:95b73d0b37b7 | 76 | WizziComPacketFsResp, |
Jeej | 0:95b73d0b37b7 | 77 | |
Jeej | 0:95b73d0b37b7 | 78 | WIZZICOM_PKT_QTY, |
Jeej | 0:95b73d0b37b7 | 79 | |
Jeej | 0:95b73d0b37b7 | 80 | // Special flag to redirect all undirected packets to this callback |
Jeej | 4:a37e42de1ba7 | 81 | WizziComPacketUntreated = WIZZICOM_PKT_QTY, |
Jeej | 0:95b73d0b37b7 | 82 | } WizziComPacketType; |
Jeej | 0:95b73d0b37b7 | 83 | |
Jeej | 0:95b73d0b37b7 | 84 | typedef struct { |
Jeej | 0:95b73d0b37b7 | 85 | uint8_t type; |
Jeej | 0:95b73d0b37b7 | 86 | uint8_t length; |
Jeej | 0:95b73d0b37b7 | 87 | uint8_t data[1]; |
Jeej | 0:95b73d0b37b7 | 88 | } WizziComPacket_t; |
Jeej | 0:95b73d0b37b7 | 89 | |
Jeej | 0:95b73d0b37b7 | 90 | //====================================================================== |
Jeej | 0:95b73d0b37b7 | 91 | // wizzi_com_tx_msg_t |
Jeej | 0:95b73d0b37b7 | 92 | //---------------------------------------------------------------------- |
Jeej | 0:95b73d0b37b7 | 93 | // Transmit message structure |
Jeej | 0:95b73d0b37b7 | 94 | //====================================================================== |
Jeej | 0:95b73d0b37b7 | 95 | typedef struct |
Jeej | 0:95b73d0b37b7 | 96 | { |
Jeej | 0:95b73d0b37b7 | 97 | // identifier wizzi_com_flow_t |
Jeej | 0:95b73d0b37b7 | 98 | uint8_t id; |
Jeej | 0:95b73d0b37b7 | 99 | // length of the string buffer defined by a pointer |
Jeej | 0:95b73d0b37b7 | 100 | uint8_t plen; |
Jeej | 0:95b73d0b37b7 | 101 | // length of the allocated buffer |
Jeej | 0:95b73d0b37b7 | 102 | uint8_t alen; |
Jeej | 0:95b73d0b37b7 | 103 | // pointer to a string buffer that does not need to be freed |
Jeej | 0:95b73d0b37b7 | 104 | uint8_t* pbuf; |
Jeej | 0:95b73d0b37b7 | 105 | // pointer to argument that does not need to be freed |
Jeej | 0:95b73d0b37b7 | 106 | uint8_t* abuf; |
Jeej | 0:95b73d0b37b7 | 107 | |
Jeej | 0:95b73d0b37b7 | 108 | } wizzi_com_tx_msg_t; |
Jeej | 0:95b73d0b37b7 | 109 | |
Jeej | 0:95b73d0b37b7 | 110 | //====================================================================== |
Jeej | 0:95b73d0b37b7 | 111 | // wizzi_com_rx_msg_t |
Jeej | 0:95b73d0b37b7 | 112 | //---------------------------------------------------------------------- |
Jeej | 0:95b73d0b37b7 | 113 | // Receive message structure |
Jeej | 0:95b73d0b37b7 | 114 | //====================================================================== |
Jeej | 0:95b73d0b37b7 | 115 | typedef struct |
Jeej | 0:95b73d0b37b7 | 116 | { |
Jeej | 0:95b73d0b37b7 | 117 | // error message |
Jeej | 0:95b73d0b37b7 | 118 | hal_error_t err; |
Jeej | 0:95b73d0b37b7 | 119 | // length of the log (string) buffer |
Jeej | 0:95b73d0b37b7 | 120 | uint8_t blen; |
Jeej | 0:95b73d0b37b7 | 121 | // identifier wizzi_com_flow_t |
Jeej | 0:95b73d0b37b7 | 122 | uint8_t id; |
Jeej | 0:95b73d0b37b7 | 123 | // Com port where the message came from |
Jeej | 0:95b73d0b37b7 | 124 | uint8_t com_id; |
Jeej | 0:95b73d0b37b7 | 125 | // pointer to the log buffer |
Jeej | 0:95b73d0b37b7 | 126 | uint8_t buffer[1]; |
Jeej | 0:95b73d0b37b7 | 127 | |
Jeej | 0:95b73d0b37b7 | 128 | } wizzi_com_rx_msg_t; |
Jeej | 0:95b73d0b37b7 | 129 | |
Jeej | 0:95b73d0b37b7 | 130 | typedef struct { |
Jeej | 0:95b73d0b37b7 | 131 | uint32_t len; |
Jeej | 0:95b73d0b37b7 | 132 | uint8_t buf[1]; |
Jeej | 0:95b73d0b37b7 | 133 | } wizzi_com_tx_buf_t; |
Jeej | 0:95b73d0b37b7 | 134 | |
Jeej | 1:ca1c9bfb1cf4 | 135 | uint8_t wizzicom_type_to_flow(uint8_t packet_type); |
Jeej | 1:ca1c9bfb1cf4 | 136 | uint8_t wizzicom_flow_to_type(uint8_t flow_id); |
Jeej | 0:95b73d0b37b7 | 137 | |
Jeej | 0:95b73d0b37b7 | 138 | class WizziCom { |
Jeej | 1:ca1c9bfb1cf4 | 139 | typedef void (*WizziComCallback)(WizziCom*, WizziComPacket_t*); |
Jeej | 0:95b73d0b37b7 | 140 | |
Jeej | 0:95b73d0b37b7 | 141 | private: |
Jeej | 1:ca1c9bfb1cf4 | 142 | volatile uint8_t _state; |
Jeej | 0:95b73d0b37b7 | 143 | wizzi_com_rx_msg_t _msg; |
Jeej | 0:95b73d0b37b7 | 144 | uint8_t _tx_seq; |
Jeej | 0:95b73d0b37b7 | 145 | uint8_t _rx_seq; |
Jeej | 0:95b73d0b37b7 | 146 | |
Jeej | 0:95b73d0b37b7 | 147 | DigitalOut* _irq_out; |
Jeej | 0:95b73d0b37b7 | 148 | InterruptIn* _irq_in; |
Jeej | 0:95b73d0b37b7 | 149 | RawSerial* _serial; |
Jeej | 9:0140247bab90 | 150 | uint8_t _rx_byte; |
Jeej | 0:95b73d0b37b7 | 151 | |
Jeej | 9:0140247bab90 | 152 | kal_buf_circ_handle_t _cbuf; |
Jeej | 9:0140247bab90 | 153 | kal_buf_circ_static_handle_t _cbuf_h; |
Jeej | 9:0140247bab90 | 154 | kal_buf_circ_static_buffer_t(_cbuf_b, RX_BUF_SIZE, sizeof(uint8_t)); |
Jeej | 0:95b73d0b37b7 | 155 | |
Jeej | 8:42e00820df36 | 156 | Semaphore _tx_done; |
Jeej | 8:42e00820df36 | 157 | Semaphore _rx_done; |
Jeej | 0:95b73d0b37b7 | 158 | Semaphore _irq_in_int; |
Jeej | 0:95b73d0b37b7 | 159 | Thread _rx_thread; |
Jeej | 0:95b73d0b37b7 | 160 | Thread _tx_thread; |
Jeej | 13:a3997e6aea6e | 161 | Thread _cb_thread; |
Jeej | 0:95b73d0b37b7 | 162 | Queue<wizzi_com_tx_buf_t, 8> _tx_queue; |
Jeej | 0:95b73d0b37b7 | 163 | Queue<WizziComPacket_t, 8> _rx_queue; |
Jeej | 0:95b73d0b37b7 | 164 | |
Jeej | 1:ca1c9bfb1cf4 | 165 | Callback<void(WizziCom*, WizziComPacket_t*)> _callback[WIZZICOM_PKT_QTY+1]; |
Jeej | 0:95b73d0b37b7 | 166 | |
Jeej | 8:42e00820df36 | 167 | void _get_header(uint8_t length); |
Jeej | 8:42e00820df36 | 168 | void _get_body(uint8_t length); |
Jeej | 8:42e00820df36 | 169 | void _tx_done_isr(int event); |
Jeej | 9:0140247bab90 | 170 | void _rx_isr(void); |
Jeej | 8:42e00820df36 | 171 | void _rx_done_isr(int event); |
Jeej | 0:95b73d0b37b7 | 172 | void _irq_in_isr(); |
Jeej | 5:a06d239f3b3e | 173 | void _send_raw(uint8_t* data, uint32_t len); |
Jeej | 0:95b73d0b37b7 | 174 | void _sys_xack(void); |
Jeej | 0:95b73d0b37b7 | 175 | wizzi_com_tx_buf_t* _new_msg(wizzi_com_tx_msg_t* msg); |
Jeej | 0:95b73d0b37b7 | 176 | void _post_msg(wizzi_com_tx_msg_t* msg); |
Jeej | 0:95b73d0b37b7 | 177 | void _new_pkt(WizziComPacket_t* pkt); |
Jeej | 8:42e00820df36 | 178 | void _parse_packet(void); |
Jeej | 0:95b73d0b37b7 | 179 | void _thread_rx(void); |
Jeej | 0:95b73d0b37b7 | 180 | void _thread_tx(void); |
Jeej | 0:95b73d0b37b7 | 181 | void _thread_callback(void); |
Jeej | 0:95b73d0b37b7 | 182 | |
Jeej | 0:95b73d0b37b7 | 183 | public: |
Jeej | 0:95b73d0b37b7 | 184 | WizziCom(PinName tx, PinName rx, PinName irq_out = NC, PinName irq_in = NC); |
Jeej | 0:95b73d0b37b7 | 185 | ~WizziCom(); |
Jeej | 0:95b73d0b37b7 | 186 | |
Jeej | 0:95b73d0b37b7 | 187 | void attach(WizziComCallback function, WizziComPacketType packet_type); |
Jeej | 0:95b73d0b37b7 | 188 | |
Jeej | 0:95b73d0b37b7 | 189 | template<class T> |
Jeej | 0:95b73d0b37b7 | 190 | void attach(T* object, void (T::*member)(WizziCom*, WizziComPacket_t*), WizziComPacketType packet_type) |
Jeej | 0:95b73d0b37b7 | 191 | { |
Jeej | 0:95b73d0b37b7 | 192 | _callback[packet_type] = callback(object, member); |
Jeej | 0:95b73d0b37b7 | 193 | } |
Jeej | 0:95b73d0b37b7 | 194 | |
Jeej | 0:95b73d0b37b7 | 195 | void reset(void); |
Jeej | 0:95b73d0b37b7 | 196 | void send(WizziComPacketType type, uint8_t length, uint8_t* data); |
Jeej | 0:95b73d0b37b7 | 197 | void send(WizziComPacket_t* packet); |
Jeej | 5:a06d239f3b3e | 198 | void print_raw(char* str); |
Jeej | 5:a06d239f3b3e | 199 | void send_raw(uint8_t* data, uint32_t len); |
Jeej | 1:ca1c9bfb1cf4 | 200 | |
Jeej | 1:ca1c9bfb1cf4 | 201 | uint8_t type_to_flow(WizziComPacketType packet_type); |
Jeej | 0:95b73d0b37b7 | 202 | }; |
Jeej | 0:95b73d0b37b7 | 203 | |
Jeej | 5:a06d239f3b3e | 204 | #endif // _WIZZICOM_H_ |