Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

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?

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