Exportable version of WizziLab's modem driver.
Diff: src/modem_ref.cpp
- 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);