Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: modem_ref_helper_for_v5_3_217
Diff: modem_ref.cpp
- 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;