Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Revision:
46:9b83866cef2c
Parent:
45:6a4c373e1178
Child:
50:9eb5eed8b014
--- a/src/modem_ref.cpp	Wed Feb 20 13:43:19 2019 +0000
+++ b/src/modem_ref.cpp	Wed Jul 31 16:48:48 2019 +0000
@@ -41,12 +41,6 @@
 
 #define ROOT_KEY_SIZE   16
 
-#define SERIAL_SEND(_flow,_data,_size)  do { \
-    ASSERT(_size<256, "SERIAL_SEND too big for serial protocol (%d/%dmax)", _size, 255);\
-    u8 wch[WC_HEADER_SIZE] = {WC_SYNC_BYTE_0,WC_SYNC_BYTE_1,_size,g_modem.tx_sequ++,_flow};\
-    g_modem.send(wch,WC_HEADER_SIZE,_data,_size);\
-}while(0)
-
 // Flows
 #define WC_FLOWID_CMD       0x10
 #define WC_FLOWID_ALP       0x20
@@ -67,6 +61,21 @@
 // Misc CMD...
 #define WM_BOOT             0x81
 
+static void serial_send(u8 flowid, u8* data, int size)
+{
+    u8 len = (u8)size;
+    u8 wch[WC_HEADER_SIZE] = {
+        WC_SYNC_BYTE_0,
+        WC_SYNC_BYTE_1,
+        len,
+        g_modem.tx_sequ++,
+        flowid
+        };
+
+    ASSERT(size < 256, "serial_send too big for serial protocol (%d/%dmax)", size, 255);
+    
+    g_modem.send(wch, WC_HEADER_SIZE, data, len);
+}
 
 protected void modem_input(u8 flowid,u8* payload,u8 size)
 {
@@ -423,7 +432,7 @@
 
 public void modem_reset(void)
 {
-    SERIAL_SEND(WC_FLOW_SYS_RST,NULL,0);
+    serial_send(WC_FLOW_SYS_RST,NULL,0);
 }
 
 public void modem_read_file(u8 fid, void *data, u32 offset, u32 length, u8 id)
@@ -434,7 +443,7 @@
     g_modem.user[id].data = (u8*)data;
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_read_fprop(u8 fid, alp_file_header_t* data, u8 id)
@@ -445,7 +454,7 @@
     g_modem.user[id].data = (u8*)data;
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_RD_PROP(p,true,fid);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_read_fprop_root(u8 fid, alp_file_header_t* data, u8* root_key, u8 id)
@@ -464,7 +473,7 @@
     modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
             &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
             ALP_ACTION_F_RD_PROP_SIZE);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp));
 }
 
 public void modem_write_fprop(u8 fid, alp_file_header_t* data, u8 id)
@@ -474,7 +483,7 @@
     DPRINT(L_API, "WR PROPS[%d]\n",fid);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_WR_PROP(p,true,fid,0,sizeof(alp_file_header_t),data);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_write_fprop_root(u8 fid, alp_file_header_t* data, u8* root_key, u8 id)
@@ -492,24 +501,24 @@
     modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
             &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
             ALP_ACTION_F_WR_PROP_SIZE_MAX);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp));
 }
 
 public void modem_write_file(u8 fid, void *data, u32 offset, u32 length, u8 id)
 {
-    ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_DATA_SIZE_MAX(length)));
+    ALLOC_BUFFER(u8, tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_DATA_SIZE_MAX(length)));
 
     u8* p = tmp;
     REF_PRINT("WR[%d]@%d %d Bytes\n",fid,offset,length);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
     DEALLOC_BUFFER(tmp);
 }
 
 public void modem_write_file_root(u8 fid, void *data, u32 offset, u32 length, u8* root_key, u8 id)
 {
-    ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_WR_DATA_SIZE_MAX(length))));
+    ALLOC_BUFFER(u8, tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_WR_DATA_SIZE_MAX(length))));
 
     u8* p = tmp;
     u8* lastp;
@@ -523,7 +532,7 @@
     modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
             &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
             ALP_ACTION_F_WR_DATA_SIZE(offset,length));
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp));
     DEALLOC_BUFFER(tmp);
 }
 
@@ -534,7 +543,7 @@
     REF_PRINT("FLUSH[%d]\n",fid);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_FLUSH(p,true,fid);
-    SERIAL_SEND(WC_FLOW_ALP_UNS, tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_flush_file_root(u8 fid, u8* root_key, u8 id)
@@ -552,7 +561,7 @@
     modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
             &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
             ALP_ACTION_F_FLUSH_SIZE);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp));
 }
 
 public void modem_declare_file(u8 fid, alp_file_header_t* hdr, u8 local, u8 id)
@@ -563,7 +572,7 @@
     REF_PRINT("DECLARE[%d]\n",fid);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_DECLARE(p,true,fid,hdr,local);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_create_file(u8 fid, alp_file_header_t* hdr, u8 id)
@@ -574,7 +583,7 @@
     REF_PRINT("CREATE[%d]\n",fid);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_CREATE(p,true,fid,hdr);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_notify_file(u8 fid, u32 offset, u32 length, u8 id)
@@ -585,7 +594,7 @@
     REF_PRINT("NOTIFY[%d]@%d %d Bytes\n",fid,offset,length);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_TOUCH(p,true,fid,offset,length);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_delete_file(u8 fid, u8 id)
@@ -596,7 +605,7 @@
     REF_PRINT("DELETE[%d]\n",fid);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_F_DELETE(p,true,fid);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_delete_file_root(u8 fid, u8* root_key, u8 id)
@@ -614,25 +623,25 @@
     modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
             &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
             ALP_ACTION_F_DELETE_SIZE);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp));
 }
 
 public void modem_send_raw_alp(u8* payload, u32 length, u8 id)
 {
-    ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + length);
+    ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + length);
     u8* p = tmp;
 
     REF_PRINT("ALP RAW %d Bytes\n",length);
     ALP_ACTION_TAG(p,id,true);
     // User Payload
     memcpy(p,payload,length);p+=length;
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
     DEALLOC_BUFFER(tmp);
 }
 
 public void modem_send_file_content(u8* itf, u8 itf_length, void *istatus, u8 fid, void *data, u32 offset, u32 length, u8 id)
 {
-    ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
+    ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
     u8* p = tmp;
     g_modem.user[id].istatus= (u8*)istatus;
 
@@ -645,13 +654,13 @@
         ALP_ACTION_NOP(p,true);
     }
     ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
     DEALLOC_BUFFER(tmp);
 }
 
 public void modem_remote_read_file(u8* itf, u8 itf_length, void *istatus , u8 fid, void *data, u32 offset, u32 length, u8 id)
 {
-    ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX);
+    ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX);
     u8* p = tmp;
     g_modem.user[id].data    = (u8*)data;
     g_modem.user[id].istatus = (u8*)istatus;
@@ -660,13 +669,13 @@
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_FORWARD(p,itf,itf_length);
     ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
     DEALLOC_BUFFER(tmp);
 }
 
 public void modem_remote_write_file(u8* itf, u8 itf_length, void *istatus, u8 fid, void *data, u32 offset, u32 length, u8 id)
 {
-    ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_WR_DATA_SIZE_MAX(length));
+    ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_WR_DATA_SIZE_MAX(length));
     u8* p = tmp;
     g_modem.user[id].istatus = (u8*)istatus;
 
@@ -674,7 +683,7 @@
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_FORWARD(p,itf,itf_length);
     ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
     DEALLOC_BUFFER(tmp);
 }
 
@@ -715,7 +724,7 @@
         ALP_ACTION_F_WR_DATA_SIZE(offset,length)
     );
     
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
     DEALLOC_BUFFER(tmp);
 }
 
@@ -735,7 +744,7 @@
     {
         ALP_ACTION_URCC_DIS(p,true,type,ifid,val);
     }
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_activate_itf(u8 type, u8 nb_dev, u8 ifid, u8 flags, u8 enable, u8 id)
@@ -746,7 +755,7 @@
     REF_PRINT("ACTIVATE ITFTYPE[%x]:%d\n",type,enable);
     ALP_ACTION_TAG(p,id,true);
     ALP_ACTION_ACTIVATE_ITF(p,true,enable,type,nb_dev,ifid,flags);
-    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp));
 }
 
 public void modem_respond(s8 status, int id)
@@ -757,7 +766,7 @@
 
     if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,(status<0)?true:false); }
     ALP_ACTION_RSP_STATUS(p, g_modem.action, status);
-    SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_RESP, tmp, (p-tmp));
 }
 
 public void modem_respond_fprop(u8 fid, u8* hdr, int id)
@@ -768,16 +777,16 @@
 
     if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
     ALP_ACTION_RSP_F_PROP(p,fid,hdr);
-    SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_RESP, tmp, (p-tmp));
 }
 
 public void modem_respond_read(u8 fid,void *data, u32 offset, u32 length, int id)
 {
-    ALLOC_BUFFER(u8,tmp,ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
+    ALLOC_BUFFER(u8, tmp,ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
     u8* p = tmp;
     REF_PRINT("F_DATA[%d]@%d %d Bytes\n",fid,offset,length);
     if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
     ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
-    SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
+    serial_send(WC_FLOW_ALP_RESP, tmp, (p-tmp));
     DEALLOC_BUFFER(tmp);
 }
\ No newline at end of file