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