WizziLab's serial protocol library

Dependents:   modem_ref_helper_for_v5_3_217 modem_ref_helper

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?

UserRevisionLine numberNew 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_