Exportable version of WizziLab's modem driver.
src/wc_deserializer.cpp@46:9b83866cef2c, 2019-07-31 (annotated)
- Committer:
- Jeej
- Date:
- Wed Jul 31 16:48:48 2019 +0000
- Revision:
- 46:9b83866cef2c
- Parent:
- 19:701d5669f2e9
- Child:
- 36:ac99535c4843
Updated for mbed-os 5.13
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jeej | 12:848b813aae99 | 1 | /// @copyright |
Jeej | 12:848b813aae99 | 2 | /// ========================================================================={{{ |
Jeej | 12:848b813aae99 | 3 | /// Copyright (c) 2013-2016 WizziLab / |
Jeej | 12:848b813aae99 | 4 | /// All rights reserved / |
Jeej | 12:848b813aae99 | 5 | /// =========================================================================}}} |
Jeej | 12:848b813aae99 | 6 | /// @endcopyright |
Jeej | 12:848b813aae99 | 7 | |
Jeej | 12:848b813aae99 | 8 | // ======================================================================= |
Jeej | 12:848b813aae99 | 9 | /// @file wc_deserializer.c |
Jeej | 12:848b813aae99 | 10 | /// @brief Exemple of WizziCom serial transport layer parser. |
Jeej | 12:848b813aae99 | 11 | /// Can be used as entry-point/scheduler for modem_ref |
Jeej | 12:848b813aae99 | 12 | // ======================================================================= |
Jeej | 12:848b813aae99 | 13 | #include "modem_ref.h" |
Jeej | 12:848b813aae99 | 14 | |
Jeej | 12:848b813aae99 | 15 | // Depending on Host needs/capacities, choose variable-size buffer allocation style |
Jeej | 12:848b813aae99 | 16 | #if 1 // static buffer alloc |
Jeej | 12:848b813aae99 | 17 | #define MAX_RX_BUFFER_SIZE (256) |
Jeej | 12:848b813aae99 | 18 | #define GET_BUFFER(_s) rxbuf |
Jeej | 12:848b813aae99 | 19 | #define FREE_BUFFER(_b) |
Jeej | 12:848b813aae99 | 20 | static u8 rxbuf[MAX_RX_BUFFER_SIZE]; |
Jeej | 12:848b813aae99 | 21 | #else // Dynamic alloc |
Jeej | 12:848b813aae99 | 22 | #define GET_BUFFER(_s) MALLOC(_s); |
Jeej | 12:848b813aae99 | 23 | #define FREE_BUFFER(_b) FREE(_b); |
Jeej | 12:848b813aae99 | 24 | #endif |
Jeej | 12:848b813aae99 | 25 | |
Jeej | 12:848b813aae99 | 26 | enum { S_SYNC0, S_SYNC1, S_SIZE, S_SEQU, S_FLOWID, S_DATA }; |
Jeej | 12:848b813aae99 | 27 | |
Jeej | 12:848b813aae99 | 28 | //====================================================================== |
Jeej | 12:848b813aae99 | 29 | // wc_deserializer |
Jeej | 12:848b813aae99 | 30 | //---------------------------------------------------------------------- |
Jeej | 12:848b813aae99 | 31 | /// @brief Parse serial flow character-wise and extract packets from |
Jeej | 12:848b813aae99 | 32 | /// WizziCom serial transport layer (WC). |
Jeej | 12:848b813aae99 | 33 | /// It calls modem_input on complete payloads. |
Jeej | 12:848b813aae99 | 34 | /// @param c : received character. |
Jeej | 12:848b813aae99 | 35 | /// @param init : 0 when parsing, 1 to init/reinit parser. |
Jeej | 12:848b813aae99 | 36 | /// @return flowid of successfuly parsed packet, 0 otherwise. |
Jeej | 12:848b813aae99 | 37 | /// @note This function must be called on every received character on |
Jeej | 12:848b813aae99 | 38 | /// modem serial link |
Jeej | 12:848b813aae99 | 39 | /// @note This function should not be directly called from (serial) |
Jeej | 12:848b813aae99 | 40 | /// ISR as it is the entry point for all driver/callback execution. |
Jeej | 12:848b813aae99 | 41 | /// @note If WC deserialization is performed by other means, and that |
Jeej | 12:848b813aae99 | 42 | /// full packets are available, one should do direct calls to |
Jeej | 12:848b813aae99 | 43 | /// modem_input |
Jeej | 12:848b813aae99 | 44 | //====================================================================== |
Jeej | 12:848b813aae99 | 45 | public int wc_deserializer(char c, u8 init) |
Jeej | 12:848b813aae99 | 46 | { |
Jeej | 12:848b813aae99 | 47 | static u8 state,rx_ptr,rx_size,rx_flowid; |
Jeej | 12:848b813aae99 | 48 | static u8* rx_data; |
Jeej | 12:848b813aae99 | 49 | |
Jeej | 12:848b813aae99 | 50 | if (init) { state = S_SYNC0; } |
Jeej | 12:848b813aae99 | 51 | // WC Packet decap' |
Jeej | 12:848b813aae99 | 52 | switch(state) |
Jeej | 12:848b813aae99 | 53 | { |
Jeej | 12:848b813aae99 | 54 | case S_SYNC0: |
Jeej | 12:848b813aae99 | 55 | state = (c == WC_SYNC_BYTE_0)?S_SYNC1:S_SYNC0; |
Jeej | 12:848b813aae99 | 56 | rx_ptr = 0; |
Jeej | 12:848b813aae99 | 57 | rx_data = (u8*)NULL; |
Jeej | 12:848b813aae99 | 58 | return 0; |
Jeej | 12:848b813aae99 | 59 | case S_SYNC1: |
Jeej | 12:848b813aae99 | 60 | state = (c == WC_SYNC_BYTE_1)?S_SIZE: |
Jeej | 12:848b813aae99 | 61 | (c == WC_SYNC_BYTE_0)?S_SYNC1:S_SYNC0; |
Jeej | 12:848b813aae99 | 62 | return 0; |
Jeej | 12:848b813aae99 | 63 | case S_SIZE: |
Jeej | 12:848b813aae99 | 64 | state = S_SEQU; |
Jeej | 12:848b813aae99 | 65 | rx_size = (u8)c; |
Jeej | 12:848b813aae99 | 66 | if (rx_size) rx_data = GET_BUFFER(rx_size); |
Jeej | 12:848b813aae99 | 67 | return 0; |
Jeej | 12:848b813aae99 | 68 | case S_SEQU: |
Jeej | 12:848b813aae99 | 69 | state = S_FLOWID; |
Jeej | 12:848b813aae99 | 70 | //rx_sequ = (u8)c; |
Jeej | 12:848b813aae99 | 71 | return 0; |
Jeej | 12:848b813aae99 | 72 | case S_FLOWID: |
Jeej | 12:848b813aae99 | 73 | state = (rx_size!=0)?S_DATA:S_SYNC0; |
Jeej | 12:848b813aae99 | 74 | rx_flowid = (u8)c; |
Jeej | 12:848b813aae99 | 75 | break; |
Jeej | 12:848b813aae99 | 76 | case S_DATA: |
Jeej | 12:848b813aae99 | 77 | state = (rx_ptr >= rx_size)?S_SYNC0:S_DATA; |
Jeej | 12:848b813aae99 | 78 | rx_data[rx_ptr++] = (u8)c; |
Jeej | 12:848b813aae99 | 79 | break; |
Jeej | 12:848b813aae99 | 80 | default: |
Jeej | 12:848b813aae99 | 81 | break; |
Jeej | 12:848b813aae99 | 82 | } |
Jeej | 12:848b813aae99 | 83 | |
Jeej | 12:848b813aae99 | 84 | if (rx_size == rx_ptr) |
Jeej | 12:848b813aae99 | 85 | { |
Jeej | 12:848b813aae99 | 86 | modem_input(rx_flowid,rx_data,rx_size); |
Jeej | 12:848b813aae99 | 87 | if (rx_data) { FREE_BUFFER(rx_data); } |
Jeej | 12:848b813aae99 | 88 | } |
Jeej | 12:848b813aae99 | 89 | return rx_flowid; |
Jeej | 12:848b813aae99 | 90 | } |