Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Revision:
62:75d819d68e5f
Parent:
61:820395fc5572
Child:
63:544a488a06d3
--- a/src/modem_ref.cpp	Tue Sep 07 15:58:51 2021 +0000
+++ b/src/modem_ref.cpp	Tue Sep 21 08:47:52 2021 +0000
@@ -57,8 +57,8 @@
 {
     u8 buf[PKT_MAX_SIZE];
     
-    //PRINT("<--\n");
-    //alp_payload_print(alp);
+    PRINT("<--\n");
+    alp_payload_print(alp);
     
     u32 len = alp_payload_to_buf(alp, buf, 0, PKT_MAX_SIZE);
     
@@ -68,173 +68,168 @@
     alp_payload_free(alp);
 }
 
-static void _call_fs_user_cb(alp_payload_t* alp, int id, u32 action)
+static void call_fs_user_cb(alp_payload_t* alp)
 {
     alp_parsed_chunk_t r;
-    u8* p = alp->d;
+    u8* p;
+    int id;
+    u32 action = 0;
     
-    if (NULL == alp)
-    {
-        return;
-    }
-    
-    alp_parse_chunk(&p, &r);
-            
-    switch (r.type)
+    while (alp != NULL)
     {
-        case ALP_OPCODE_TAG:
-            id  = r.meta.tag.id;
-            REF_PRINT("ACT %d: TAG[%d] ID:%d ERR:%d EOP:%d\n", action, id, r.meta.tag.err, r.meta.tag.eop);
-            break;
-        case ALP_OPCODE_F_RD_DATA:
-            REF_PRINT("ACT %d: F_RD_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
-            if (g_modem.cb->read)
-            {
-                g_modem.cb->read(action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length, id);
-            }
-            break;
-        case ALP_OPCODE_F_WR_DATA:
-            REF_PRINT("ACT %d: F_WR_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
-            if (g_modem.cb->write)
-            {
-                g_modem.cb->write(action, 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:
-            REF_PRINT("ACT %d: F_RD_PROP[%d]\n", action, r.meta.f_data.fid);
-            if (g_modem.cb->read_fprop)
-            {
-                g_modem.cb->read_fprop(action, r.meta.f_data.fid, id);
-            }
-            break;
-        case ALP_OPCODE_F_DELETE:
-            REF_PRINT("ACT %d: F_DELETE[%d]\n", action, r.meta.f_data.fid);
-            if (g_modem.cb->remove)
-            {
-                g_modem.cb->remove(action, r.meta.f_data.fid, id);
-            }
-            break;
-        case ALP_OPCODE_F_FLUSH:
-            REF_PRINT("ACT %d: F_FLUSH[%d]\n", action, r.meta.f_data.fid);
-            if (g_modem.cb->flush)
-            {
-                g_modem.cb->flush(action, r.meta.f_data.fid, id);
-            }
-            break;
-        default:
-            ASSERT(false, "ASSERT: Unsupported ALP File Operation: %d\n", r.type);
-            break;
+        p = alp->d;
+        alp_parse_chunk(&p, &r);
+        
+        switch (r.type)
+        {
+            case ALP_OPCODE_TAG:
+                id  = r.meta.tag.id;
+                REF_PRINT("ACT %d: TAG[%d] ID:%d ERR:%d EOP:%d\n", action, id, r.meta.tag.err, r.meta.tag.eop);
+                break;
+            case ALP_OPCODE_F_RD_DATA:
+                REF_PRINT("ACT %d: F_RD_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
+                if (g_modem.cb->read)
+                {
+                    g_modem.cb->read(action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length, id);
+                }
+                break;
+            case ALP_OPCODE_F_WR_DATA:
+                REF_PRINT("ACT %d: F_WR_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
+                if (g_modem.cb->write)
+                {
+                    g_modem.cb->write(action, 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:
+                REF_PRINT("ACT %d: F_RD_PROP[%d]\n", action, r.meta.f_data.fid);
+                if (g_modem.cb->read_fprop)
+                {
+                    g_modem.cb->read_fprop(action, r.meta.f_data.fid, id);
+                }
+                break;
+            case ALP_OPCODE_F_DELETE:
+                REF_PRINT("ACT %d: F_DELETE[%d]\n", action, r.meta.f_data.fid);
+                if (g_modem.cb->remove)
+                {
+                    g_modem.cb->remove(action, r.meta.f_data.fid, id);
+                }
+                break;
+            case ALP_OPCODE_F_FLUSH:
+                REF_PRINT("ACT %d: F_FLUSH[%d]\n", action, r.meta.f_data.fid);
+                if (g_modem.cb->flush)
+                {
+                    g_modem.cb->flush(action, r.meta.f_data.fid, id);
+                }
+                break;
+            default:
+                ASSERT(false, "ASSERT: Unsupported ALP File Operation: %d\n", r.type);
+                break;
+        }
+        
+        ASSERT(id >= 0, "ASSERT: Wrong id %d\n", id);
+                
+        action++;
+        
+        alp = alp->next;
     }
-    
-    ASSERT(id >= 0, "ASSERT: Wrong id %d\n", id);
-    
-    _call_fs_user_cb(alp->next, id, ++action);
-}
-
-static void call_fs_user_cb(alp_payload_t* alp)
-{
-    _call_fs_user_cb(alp, -1, 0);
 }
 
-static void _call_urc_user_cb(alp_payload_t* alp, u32 action)
+static void call_urc_user_cb(alp_payload_t* alp)
 {
     alp_parsed_chunk_t r;
-    u8* p = alp->d;
+    u8* p;
+    u32 action = 0;
     
-    if (NULL == alp)
-    {
-        return;
-    }
-    
-    alp_parse_chunk(&p, &r);
-
-    switch (r.type)
+    while (alp != NULL)
     {
-        case ALP_OPCODE_RSP_URC:
-            if (ALP_URC_TYPE_LQUAL == r.meta.urc.type)
-            {
-                REF_PRINT("ACT %d: RSP_URC: LQUAL[%d] %d\n", action, r.meta.urc.ifid, r.meta.urc.per);
-                if (g_modem.cb->lqual)
+        p = alp->d;
+        alp_parse_chunk(&p, &r);
+    
+        switch (r.type)
+        {
+            case ALP_OPCODE_RSP_URC:
+                if (ALP_URC_TYPE_LQUAL == r.meta.urc.type)
                 {
-                    g_modem.cb->lqual(r.meta.urc.ifid, r.meta.urc.per);
+                    REF_PRINT("ACT %d: RSP_URC: LQUAL[%d] %d\n", action, r.meta.urc.ifid, r.meta.urc.per);
+                    if (g_modem.cb->lqual)
+                    {
+                        g_modem.cb->lqual(r.meta.urc.ifid, r.meta.urc.per);
+                    }
                 }
-            }
-            else if (ALP_URC_TYPE_LDOWN == r.meta.urc.type)
-            {
-                REF_PRINT("ACT %d: RSP_URC: LDOWN[%d]\n", action, r.meta.urc.ifid);
-                if (g_modem.cb->ldown)
+                else if (ALP_URC_TYPE_LDOWN == r.meta.urc.type)
+                {
+                    REF_PRINT("ACT %d: RSP_URC: LDOWN[%d]\n", action, r.meta.urc.ifid);
+                    if (g_modem.cb->ldown)
+                    {
+                        g_modem.cb->ldown(r.meta.urc.ifid);
+                    }
+                }
+                else if (ALP_URC_TYPE_BUSY == r.meta.urc.type)
                 {
-                    g_modem.cb->ldown(r.meta.urc.ifid);
-                }
-            }
-            else if (ALP_URC_TYPE_BUSY == r.meta.urc.type)
-            {
-                REF_PRINT("ACT %d: RSP_URC: BUSY[%d]\n", action, r.meta.urc.ifid);
-                if (g_modem.cb->busy)
-                {
-                    g_modem.cb->busy(r.meta.urc.ifid);
+                    REF_PRINT("ACT %d: RSP_URC: BUSY[%d]\n", action, r.meta.urc.ifid);
+                    if (g_modem.cb->busy)
+                    {
+                        g_modem.cb->busy(r.meta.urc.ifid);
+                    }
                 }
-            }
-            else if (ALP_URC_TYPE_ITF_BUSY == r.meta.urc.type)
-            {
-                REF_PRINT("ACT %d: RSP_URC: ITF_BUSY[%d] for %d seconds\n", action, r.meta.urc.ifid, r.meta.urc.per);
-
-                if (FID_LWAN_ITF == r.meta.urc.ifid)
+                else if (ALP_URC_TYPE_ITF_BUSY == r.meta.urc.type)
                 {
-                    if (g_modem.lwan_cb)
+                    REF_PRINT("ACT %d: RSP_URC: ITF_BUSY[%d] for %d seconds\n", action, r.meta.urc.ifid, r.meta.urc.per);
+    
+                    if (FID_LWAN_ITF == r.meta.urc.ifid)
                     {
-                        if (MAX_U32 == r.meta.urc.per)
+                        if (g_modem.lwan_cb)
                         {
-                            if (g_modem.lwan_cb->join_failed)
+                            if (MAX_U32 == r.meta.urc.per)
+                            {
+                                if (g_modem.lwan_cb->join_failed)
+                                {
+                                    g_modem.lwan_cb->join_failed();
+                                }
+                            }
+                            else if (0 == r.meta.urc.per)
                             {
-                                g_modem.lwan_cb->join_failed();
+                                if (g_modem.lwan_cb->packet_sent)
+                                {
+                                    g_modem.lwan_cb->packet_sent();
+                                }
+                            }
+                            else
+                            {
+                                if (g_modem.lwan_cb->itf_busy)
+                                {
+                                    g_modem.lwan_cb->itf_busy(r.meta.urc.per);
+                                }
                             }
                         }
-                        else if (0 == r.meta.urc.per)
+                    }
+                    else
+                    {
+                        if (g_modem.cb->itf_busy)
                         {
-                            if (g_modem.lwan_cb->packet_sent)
-                            {
-                                g_modem.lwan_cb->packet_sent();
-                            }
-                        }
-                        else
-                        {
-                            if (g_modem.lwan_cb->itf_busy)
-                            {
-                                g_modem.lwan_cb->itf_busy(r.meta.urc.per);
-                            }
+                            g_modem.cb->itf_busy(r.meta.urc.ifid, r.meta.urc.per);
                         }
                     }
                 }
                 else
                 {
-                    if (g_modem.cb->itf_busy)
-                    {
-                        g_modem.cb->itf_busy(r.meta.urc.ifid, r.meta.urc.per);
-                    }
+                    ASSERT(false, "ASSERT: Unsupported ALP URC: %d\n", r.meta.urc.type);
                 }
-            }
-            else
-            {
-                ASSERT(false, "ASSERT: Unsupported ALP URC: %d\n", r.meta.urc.type);
-            }
-            break;
-        default:
-            // This could be anything
-            // Let user deal with the payload
-            if (g_modem.cb->udata)
-            {
-                g_modem.cb->udata(alp);
-            }
-            break;
+                break;
+            default:
+                // This could be anything
+                // Let user deal with the payload
+                if (g_modem.cb->udata)
+                {
+                    g_modem.cb->udata(alp);
+                }
+                break;
+        }
+        
+        action++;
+        
+        alp = alp->next;
     }
-    
-    _call_urc_user_cb(alp->next, ++action);
-}
-
-static void call_urc_user_cb(alp_payload_t* alp)
-{
-    _call_urc_user_cb(alp, 0);
 }
 
 void modem_ref_input(u8 flowid, u8* payload, u8 size)
@@ -257,8 +252,8 @@
             // pre-parse payload
             alp = alp_payload_parse(p, size);
             
-            //PRINT("-->\n");
-            //alp_payload_print(alp);
+            PRINT("-->\n");
+            alp_payload_print(alp);
             
             if (ALP_OPCODE_TAG == (alp->d[0] & 0x3F))
             {
@@ -279,8 +274,8 @@
             // pre-parse payload
             alp = alp_payload_parse(p, size);
             
-            //PRINT("-->\n");
-            //alp_payload_print(alp);
+            PRINT("-->\n");
+            alp_payload_print(alp);
             
             p = alp->d;
             alp_parse_chunk(&p, &r);