WizziLab / modem_ref_v5_3_217

Dependents:   modem_ref_helper_for_v5_3_217

Revision:
1:40ead20ecb14
Parent:
0:027760f45e2c
Child:
2:bcf269540633
--- a/modem_ref.cpp	Wed May 03 11:29:16 2017 +0000
+++ b/modem_ref.cpp	Fri May 05 14:42:02 2017 +0000
@@ -1,8 +1,12 @@
+#include "mbed.h"
+#include "WizziDebug.h"
+
 #include "modem_ref.h"
 
 typedef struct {
     action_callback_t*      cb;
     u8*                     data;
+    u8*                     istatus;
 } modem_user_t;
 
 typedef struct {
@@ -50,6 +54,7 @@
     alp_parsed_chunk_t r;
     int id = -1;
     s8 err = ALP_ERR_NONE;
+    u8 eop;
     //DPRINT("input 0x%x/%d Bytes\n",flowid,size);
     switch (flowid)
     {
@@ -113,35 +118,47 @@
             // This should always be a TAG'ed response as we tag our requests
             rem -= alp_parse_chunk(&p, &r);
             ASSERT((r.type == ALP_OPCODE_RSP_TAG),"ASSERT: expecting RESP_TAG got %d\n",r.type);
-            id = r.meta.tag.id;
+            id  = r.meta.tag.id;
+            eop = r.meta.tag.eop;
             ASSERT(g_modem.user[id].cb != NULL,"ASSERT: NULL Callback for ID %d\n",id);
             // Empty response
             if (rem <= 0)
             {
                 // TODO: still no info on error...
                 err = r.meta.tag.err ? ALP_ERR_UNKNOWN : ALP_ERR_NONE;
-                g_modem.user[id].cb(err,id);
+                g_modem.user[id].cb(eop,err,id);
                 return;
             }
 
-            // Actual response
-            rem -= alp_parse_chunk(&p, &r);
-            switch (r.type)
+            // Actual response(s)
+            while(rem>0)
             {
-                case ALP_OPCODE_RSP_F_DATA:
-                case ALP_OPCODE_RSP_F_PROP: // Not supported but comes for free ...
-                    ASSERT(g_modem.user[id].data != NULL,"ASSERT: NULL Data Buffer for RD on ID %d\n",id);
-                    memcpy(g_modem.user[id].data,r.data,r.meta.f_data.length);
-                    g_modem.user[id].data = NULL; // keep 'data' relevant
-                    break;
-                case ALP_OPCODE_RSP_STATUS:
-                    err = r.meta.status.code;
-                    break;
-                default:
-                    ASSERT(false,"ASSERT: Unsupported ALP Response: %d\n",r.type);
-                break;
+                rem -= alp_parse_chunk(&p, &r);
+                switch (r.type)
+                {
+                    case ALP_OPCODE_RSP_F_DATA:
+                    case ALP_OPCODE_RSP_F_PROP: // Not supported but comes for free ...
+                        ASSERT(g_modem.user[id].data != NULL,"ASSERT: NULL Data Buffer for RD on ID %d\n",id);
+                        memcpy(g_modem.user[id].data,r.data,r.meta.f_data.length);
+                        break;
+                    case ALP_OPCODE_RSP_STATUS:
+                        err = r.meta.status.code;
+                        break;
+                    case ALP_OPCODE_RSP_ISTATUS:
+                        ASSERT(g_modem.user[id].istatus != NULL,"ASSERT: NULL ISTAT Buffer for RD on ID %d\n",id);
+                        memcpy(g_modem.user[id].istatus,r.data,r.meta.itf.length);
+                        break;
+                    default:
+                        ASSERT(false,"ASSERT: Unsupported ALP Response: %d\n",r.type);
+                        break;
+                }
             }
-            g_modem.user[id].cb(err,id);
+            g_modem.user[id].cb(eop,err,id);
+            if(eop)
+            { // This is mainly for debug, catch old pointers
+                g_modem.user[id].data   = NULL;
+                g_modem.user[id].istatus= NULL;
+            }
             break;
         case WC_FLOW_SYS_RST:
             // 'Software' reset request
@@ -190,6 +207,7 @@
     {
         g_modem.user[id].cb     = NULL;
         g_modem.user[id].data   = NULL;
+        g_modem.user[id].istatus= NULL;
         //DPRINT("Free ID:%d\n",id);
         return id;
     }
@@ -316,6 +334,21 @@
     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);
+    u8* p = tmp;
+    g_modem.user[id].data   = (u8*)data;
+    g_modem.user[id].istatus= (u8*)istatus;
+
+    DPRINT("RMT RD FILE[%d]@%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
+    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));
+    DEALLOC_BUFFER(tmp);
+}
+
 public void modem_enable_urc(u8 type, u8 ifid, u8 val, u8 enable, u8 id)
 {
     u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_URCC_SIZE(ALP_URC_TYPE_LQUAL)];
@@ -335,6 +368,17 @@
     SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
 }
 
+public void modem_activate_itf(u8 type, u8 nb_dev, u8 ifid, u8 flags, u8 enable, u8 id)
+{
+    u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_ACTIVATE_ITF_SIZE];
+    u8* p = tmp;
+
+    DPRINT("ACTIVATE ITFTYPE[%x]:%d\n",type,enable);
+    ALP_ACTION_TAG(p,id,true);
+    ALP_ACTION_ACTIVATE_ITF(p,enable,type,nb_dev,ifid,flags);
+    SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
+}
+
 public void modem_respond(u8 action, s8 status, int id)
 {
     u8 tmp[ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_STATUS_SIZE];