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