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:
- 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];