WizziLab / modem_ref_v5_3_217

Dependents:   modem_ref_helper_for_v5_3_217

Revision:
8:97875739f11a
Parent:
6:581caeee80e8
Child:
9:2f921fe9c519
--- a/modem_ref.cpp	Mon May 15 12:43:42 2017 +0000
+++ b/modem_ref.cpp	Tue May 16 10:24:52 2017 +0000
@@ -16,9 +16,16 @@
 } modem_user_t;
 
 typedef struct {
+    u8*                     data;
+    u8                      type;
+    u8                      length;
+} modem_istatus_t;
+
+typedef struct {
     fx_serial_send_t*   send;
     modem_callbacks_t*  cb;
     modem_user_t        user[MAX_USER_NB];
+    modem_istatus_t     istatus;
     u8                  state;
     u8                  tx_sequ;
 } modem_ctx_t;
@@ -71,52 +78,79 @@
             if (r.type == ALP_OPCODE_TAG)
             {
                 id = r.meta.tag.id;
-                // Parse File Operation
-                rem -= alp_parse_chunk(&p, &r);
-                REF_PRINT("ALP OP[%d]\n",r.type);
-                switch (r.type)
+                while(rem>0)
                 {
-                    case ALP_OPCODE_F_RD_DATA:
-                        g_modem.cb->read(r.meta.f_data.fid,r.meta.f_data.offset,r.meta.f_data.length,id);
-                        break;
-                    case ALP_OPCODE_F_WR_DATA:
-                        g_modem.cb->write(r.meta.f_data.fid,r.data,r.meta.f_data.offset,r.meta.f_data.length,id);
-                        break;
-                    case ALP_OPCODE_F_RD_PROP:
-                        g_modem.cb->read_fprop(r.meta.f_data.fid,id);
-                        break;
-                    case ALP_OPCODE_F_DELETE:
-                        g_modem.cb->remove(r.meta.f_data.fid,id);
-                        break;
-                    case ALP_OPCODE_F_FLUSH:
-                        g_modem.cb->flush(r.meta.f_data.fid,id);
-                        break;
-                    default:
-                        ASSERT(false,"ASSERT: Unsupported ALP File Operation: %d\n",r.type);
-                        break;
+                    // Parse File Operation
+                    rem -= alp_parse_chunk(&p, &r);
+                    //DPRINT(L_API, "ALP OP[%d]\n",r.type);
+                    switch (r.type)
+                    {
+                        case ALP_OPCODE_F_RD_DATA:
+                            g_modem.cb->read(r.meta.f_data.fid,r.meta.f_data.offset,r.meta.f_data.length,id);
+                            break;
+                        case ALP_OPCODE_F_WR_DATA:
+                            g_modem.cb->write(r.meta.f_data.fid,r.data,r.meta.f_data.offset,r.meta.f_data.length,id);
+                            break;
+                        case ALP_OPCODE_F_RD_PROP:
+                            g_modem.cb->read_fprop(r.meta.f_data.fid,id);
+                            break;
+                        case ALP_OPCODE_F_DELETE:
+                            g_modem.cb->remove(r.meta.f_data.fid,id);
+                            break;
+                        case ALP_OPCODE_F_FLUSH:
+                            g_modem.cb->flush(r.meta.f_data.fid,id);
+                            break;
+                        default:
+                            ASSERT(false,"ASSERT: Unsupported ALP File Operation: %d\n",r.type);
+                            break;
+                    }
                 }
             }
             else
             {
                 // ... or a 'real' URC (or ISTATUS if enabled on modem)
-                switch (r.type)
+                g_modem.istatus = (modem_istatus_t){0};
+                while(rem>0)
                 {
-                    case ALP_OPCODE_RSP_ISTATUS:
-                        // TODO
-                        REF_PRINT("Got ISTATUS[%x] %d Bytes\n",r.meta.itf.type,r.meta.itf.length);
-                        //g_modem.cb->istatus(r.meta.itf.type,r.meta.itf.length,r.data);
-                        break;
-                    case ALP_OPCODE_RSP_URC:
-                        if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
-                            g_modem.cb->lqual(r.meta.urc.ifid,r.meta.urc.per);
-                        else if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
-                            g_modem.cb->ldown(r.meta.urc.ifid);
-                        else
-                            ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.meta.urc.type);
-                        break;
-                    default:
-                        ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.type);
-                        break;
+                    rem -= alp_parse_chunk(&p, &r);
+                    switch (r.type)
+                    {
+                        case ALP_OPCODE_RSP_ISTATUS:
+                            // ISTATUS can come either alone or together with ALP_OPCODE_RSP_F_DATA
+                            // but there should be only one per payload, moreover it will come first
+                            REF_PRINT("Got ISTATUS[%x] %d Bytes\n",r.meta.itf.type,r.meta.itf.length);
+                            g_modem.istatus.type    = r.meta.itf.type;
+                            g_modem.istatus.length  = r.meta.itf.length;
+                            g_modem.istatus.data    = r.data;
+                            if (0)// (!rem) // TODO : do we really want this ?
+                            {
+                                g_modem.cb->udata(  0, NULL, 0, 0,
+                                                    g_modem.istatus.type,
+                                                    g_modem.istatus.length,
+                                                    g_modem.istatus.data);
+                            }
+                            break;
+                        case ALP_OPCODE_RSP_F_DATA:
+                            // RSP_F_DATA can come either alone or together with ISTATUS
+                            g_modem.cb->udata(  r.meta.f_data.fid,
+                                                r.data,
+                                                r.meta.f_data.offset,
+                                                r.meta.f_data.length,
+                                                g_modem.istatus.type,
+                                                g_modem.istatus.length,
+                                                g_modem.istatus.data);
+                        case ALP_OPCODE_RSP_URC:
+                            if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
+                                g_modem.cb->lqual(r.meta.urc.ifid,r.meta.urc.per);
+                            else if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
+                                g_modem.cb->ldown(r.meta.urc.ifid);
+                            else
+                                ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.meta.urc.type);
+                            break;
+                        default:
+                            ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.type);
+                            break;
+                    }
                 }
             }
             break;