WizziLab / modem_ref_v5_3_217

Dependents:   modem_ref_helper_for_v5_3_217

Committer:
Jeej
Date:
Tue Jul 18 15:16:18 2017 +0000
Revision:
11:a077da5fe68f
Parent:
10:24878b4c3cee
Child:
13:10589aaf8853
Update to 4.9.124

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 1:40ead20ecb14 1 #include "mbed.h"
Jeej 1:40ead20ecb14 2 #include "WizziDebug.h"
Jeej 1:40ead20ecb14 3
Jeej 0:027760f45e2c 4 #include "modem_ref.h"
Jeej 0:027760f45e2c 5
Jeej 5:32ccddf80952 6 #if 0
Jeej 4:8f031be3ff7d 7 #define REF_PRINT(...) PRINT(__VA_ARGS__)
Jeej 4:8f031be3ff7d 8 #else
Jeej 4:8f031be3ff7d 9 #define REF_PRINT(...);
Jeej 4:8f031be3ff7d 10 #endif
Jeej 4:8f031be3ff7d 11
Jeej 0:027760f45e2c 12 typedef struct {
Jeej 0:027760f45e2c 13 action_callback_t* cb;
Jeej 0:027760f45e2c 14 u8* data;
Jeej 1:40ead20ecb14 15 u8* istatus;
Jeej 0:027760f45e2c 16 } modem_user_t;
Jeej 0:027760f45e2c 17
Jeej 0:027760f45e2c 18 typedef struct {
Jeej 8:97875739f11a 19 u8* data;
Jeej 8:97875739f11a 20 u8 type;
Jeej 8:97875739f11a 21 u8 length;
Jeej 8:97875739f11a 22 } modem_istatus_t;
Jeej 8:97875739f11a 23
Jeej 8:97875739f11a 24 typedef struct {
Jeej 0:027760f45e2c 25 fx_serial_send_t* send;
Jeej 0:027760f45e2c 26 modem_callbacks_t* cb;
Jeej 0:027760f45e2c 27 modem_user_t user[MAX_USER_NB];
Jeej 8:97875739f11a 28 modem_istatus_t istatus;
Jeej 0:027760f45e2c 29 u8 state;
Jeej 0:027760f45e2c 30 u8 tx_sequ;
Jeej 0:027760f45e2c 31 } modem_ctx_t;
Jeej 0:027760f45e2c 32 static modem_ctx_t g_modem;
Jeej 0:027760f45e2c 33
Jeej 0:027760f45e2c 34 #define STATE_OPEN 0xab
Jeej 0:027760f45e2c 35 #define STATE_CLOSED 0
Jeej 0:027760f45e2c 36
Jeej 0:027760f45e2c 37 #define SERIAL_SEND(_flow,_data,_size) do { \
Jeej 0:027760f45e2c 38 u8 wch[WC_HEADER_SIZE] = {WC_SYNC_BYTE_0,WC_SYNC_BYTE_1,_size,g_modem.tx_sequ++,_flow};\
Jeej 0:027760f45e2c 39 g_modem.send(wch,WC_HEADER_SIZE,_data,_size);\
Jeej 0:027760f45e2c 40 }while(0)
Jeej 0:027760f45e2c 41
Jeej 0:027760f45e2c 42 // Flows
Jeej 0:027760f45e2c 43 #define WC_FLOWID_CMD 0x10
Jeej 0:027760f45e2c 44 #define WC_FLOWID_ALP 0x20
Jeej 0:027760f45e2c 45 #define WC_FLOWID_SYS 0x30
Jeej 0:027760f45e2c 46
Jeej 0:027760f45e2c 47 // Sub-Flows
Jeej 0:027760f45e2c 48 #define WC_FLOW_ALP_CMD 0x20
Jeej 0:027760f45e2c 49 #define WC_FLOW_ALP_RESP 0x21
Jeej 0:027760f45e2c 50 #define WC_FLOW_ALP_UNS 0x22
Jeej 0:027760f45e2c 51 #define WC_FLOW_SYS_RST 0x30
Jeej 0:027760f45e2c 52 #define WC_FLOW_SYS_PING 0x34
Jeej 0:027760f45e2c 53 #define WC_FLOW_SYS_PONG 0x35
Jeej 0:027760f45e2c 54 #define WC_FLOW_SYS_CFG 0x36
Jeej 0:027760f45e2c 55 #define WC_FLOW_SYS_XON 0x39
Jeej 0:027760f45e2c 56 #define WC_FLOW_SYS_XOFF 0x3a
Jeej 0:027760f45e2c 57 #define WC_FLOW_SYS_XACK 0x3b
Jeej 0:027760f45e2c 58
Jeej 0:027760f45e2c 59 // Misc CMD...
Jeej 0:027760f45e2c 60 #define WM_BOOT 0x81
Jeej 0:027760f45e2c 61
Jeej 0:027760f45e2c 62
Jeej 0:027760f45e2c 63 protected void modem_input(u8 flowid,u8* payload,u8 size)
Jeej 0:027760f45e2c 64 {
Jeej 0:027760f45e2c 65 int rem =size;
Jeej 0:027760f45e2c 66 u8* p = payload;
Jeej 0:027760f45e2c 67 alp_parsed_chunk_t r;
Jeej 0:027760f45e2c 68 int id = -1;
Jeej 0:027760f45e2c 69 s8 err = ALP_ERR_NONE;
Jeej 1:40ead20ecb14 70 u8 eop;
Jeej 4:8f031be3ff7d 71 REF_PRINT("input 0x%x/%d Bytes\n",flowid,size);
Jeej 0:027760f45e2c 72 switch (flowid)
Jeej 0:027760f45e2c 73 {
Jeej 0:027760f45e2c 74 case WC_FLOW_ALP_UNS:
Jeej 0:027760f45e2c 75 case WC_FLOW_ALP_CMD:
Jeej 0:027760f45e2c 76 rem -= alp_parse_chunk(&p, &r);
Jeej 9:2f921fe9c519 77 REF_PRINT("Rem %d Bytes\n", rem);
Jeej 0:027760f45e2c 78 // This should always be a TAG'ed request in case of FS access...
Jeej 0:027760f45e2c 79 if (r.type == ALP_OPCODE_TAG)
Jeej 0:027760f45e2c 80 {
Jeej 0:027760f45e2c 81 id = r.meta.tag.id;
Jeej 8:97875739f11a 82 while(rem>0)
Jeej 0:027760f45e2c 83 {
Jeej 8:97875739f11a 84 // Parse File Operation
Jeej 8:97875739f11a 85 rem -= alp_parse_chunk(&p, &r);
Jeej 11:a077da5fe68f 86 //REF_PRINT("ALP OP[%d]\n",r.type);
Jeej 8:97875739f11a 87 switch (r.type)
Jeej 8:97875739f11a 88 {
Jeej 8:97875739f11a 89 case ALP_OPCODE_F_RD_DATA:
Jeej 8:97875739f11a 90 g_modem.cb->read(r.meta.f_data.fid,r.meta.f_data.offset,r.meta.f_data.length,id);
Jeej 8:97875739f11a 91 break;
Jeej 8:97875739f11a 92 case ALP_OPCODE_F_WR_DATA:
Jeej 8:97875739f11a 93 g_modem.cb->write(r.meta.f_data.fid,r.data,r.meta.f_data.offset,r.meta.f_data.length,id);
Jeej 8:97875739f11a 94 break;
Jeej 8:97875739f11a 95 case ALP_OPCODE_F_RD_PROP:
Jeej 8:97875739f11a 96 g_modem.cb->read_fprop(r.meta.f_data.fid,id);
Jeej 8:97875739f11a 97 break;
Jeej 8:97875739f11a 98 case ALP_OPCODE_F_DELETE:
Jeej 8:97875739f11a 99 g_modem.cb->remove(r.meta.f_data.fid,id);
Jeej 8:97875739f11a 100 break;
Jeej 8:97875739f11a 101 case ALP_OPCODE_F_FLUSH:
Jeej 8:97875739f11a 102 g_modem.cb->flush(r.meta.f_data.fid,id);
Jeej 8:97875739f11a 103 break;
Jeej 8:97875739f11a 104 default:
Jeej 8:97875739f11a 105 ASSERT(false,"ASSERT: Unsupported ALP File Operation: %d\n",r.type);
Jeej 8:97875739f11a 106 break;
Jeej 8:97875739f11a 107 }
Jeej 0:027760f45e2c 108 }
Jeej 0:027760f45e2c 109 }
Jeej 0:027760f45e2c 110 else
Jeej 0:027760f45e2c 111 {
Jeej 0:027760f45e2c 112 // ... or a 'real' URC (or ISTATUS if enabled on modem)
Jeej 8:97875739f11a 113 g_modem.istatus = (modem_istatus_t){0};
Jeej 9:2f921fe9c519 114 do
Jeej 0:027760f45e2c 115 {
Jeej 9:2f921fe9c519 116
Jeej 9:2f921fe9c519 117
Jeej 8:97875739f11a 118 switch (r.type)
Jeej 8:97875739f11a 119 {
Jeej 8:97875739f11a 120 case ALP_OPCODE_RSP_ISTATUS:
Jeej 8:97875739f11a 121 // ISTATUS can come either alone or together with ALP_OPCODE_RSP_F_DATA
Jeej 8:97875739f11a 122 // but there should be only one per payload, moreover it will come first
Jeej 8:97875739f11a 123 REF_PRINT("Got ISTATUS[%x] %d Bytes\n",r.meta.itf.type,r.meta.itf.length);
Jeej 8:97875739f11a 124 g_modem.istatus.type = r.meta.itf.type;
Jeej 8:97875739f11a 125 g_modem.istatus.length = r.meta.itf.length;
Jeej 8:97875739f11a 126 g_modem.istatus.data = r.data;
Jeej 8:97875739f11a 127 if (0)// (!rem) // TODO : do we really want this ?
Jeej 8:97875739f11a 128 {
Jeej 8:97875739f11a 129 g_modem.cb->udata( 0, NULL, 0, 0,
Jeej 8:97875739f11a 130 g_modem.istatus.type,
Jeej 8:97875739f11a 131 g_modem.istatus.length,
Jeej 8:97875739f11a 132 g_modem.istatus.data);
Jeej 8:97875739f11a 133 }
Jeej 8:97875739f11a 134 break;
Jeej 8:97875739f11a 135 case ALP_OPCODE_RSP_F_DATA:
Jeej 8:97875739f11a 136 // RSP_F_DATA can come either alone or together with ISTATUS
Jeej 8:97875739f11a 137 g_modem.cb->udata( r.meta.f_data.fid,
Jeej 8:97875739f11a 138 r.data,
Jeej 8:97875739f11a 139 r.meta.f_data.offset,
Jeej 8:97875739f11a 140 r.meta.f_data.length,
Jeej 8:97875739f11a 141 g_modem.istatus.type,
Jeej 8:97875739f11a 142 g_modem.istatus.length,
Jeej 8:97875739f11a 143 g_modem.istatus.data);
Jeej 9:2f921fe9c519 144 break;
Jeej 8:97875739f11a 145 case ALP_OPCODE_RSP_URC:
Jeej 8:97875739f11a 146 if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
Jeej 8:97875739f11a 147 g_modem.cb->lqual(r.meta.urc.ifid,r.meta.urc.per);
Jeej 8:97875739f11a 148 else if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
Jeej 8:97875739f11a 149 g_modem.cb->ldown(r.meta.urc.ifid);
Jeej 8:97875739f11a 150 else
Jeej 8:97875739f11a 151 ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.meta.urc.type);
Jeej 8:97875739f11a 152 break;
Jeej 8:97875739f11a 153 default:
Jeej 8:97875739f11a 154 ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.type);
Jeej 8:97875739f11a 155 break;
Jeej 8:97875739f11a 156 }
Jeej 9:2f921fe9c519 157
Jeej 9:2f921fe9c519 158 int tem = alp_parse_chunk(&p, &r);
Jeej 9:2f921fe9c519 159 if (!tem)
Jeej 9:2f921fe9c519 160 {
Jeej 9:2f921fe9c519 161 break;
Jeej 9:2f921fe9c519 162 }
Jeej 9:2f921fe9c519 163 rem -= tem;
Jeej 9:2f921fe9c519 164 } while (rem>=0);
Jeej 9:2f921fe9c519 165
Jeej 0:027760f45e2c 166 }
Jeej 0:027760f45e2c 167 break;
Jeej 0:027760f45e2c 168 case WC_FLOW_ALP_RESP:
Jeej 0:027760f45e2c 169 // This should always be a TAG'ed response as we tag our requests
Jeej 0:027760f45e2c 170 rem -= alp_parse_chunk(&p, &r);
Jeej 0:027760f45e2c 171 ASSERT((r.type == ALP_OPCODE_RSP_TAG),"ASSERT: expecting RESP_TAG got %d\n",r.type);
Jeej 1:40ead20ecb14 172 id = r.meta.tag.id;
Jeej 1:40ead20ecb14 173 eop = r.meta.tag.eop;
Jeej 0:027760f45e2c 174 ASSERT(g_modem.user[id].cb != NULL,"ASSERT: NULL Callback for ID %d\n",id);
Jeej 0:027760f45e2c 175 // Empty response
Jeej 0:027760f45e2c 176 if (rem <= 0)
Jeej 0:027760f45e2c 177 {
Jeej 0:027760f45e2c 178 // TODO: still no info on error...
Jeej 0:027760f45e2c 179 err = r.meta.tag.err ? ALP_ERR_UNKNOWN : ALP_ERR_NONE;
Jeej 1:40ead20ecb14 180 g_modem.user[id].cb(eop,err,id);
Jeej 0:027760f45e2c 181 return;
Jeej 0:027760f45e2c 182 }
Jeej 0:027760f45e2c 183
Jeej 1:40ead20ecb14 184 // Actual response(s)
Jeej 1:40ead20ecb14 185 while(rem>0)
Jeej 0:027760f45e2c 186 {
Jeej 1:40ead20ecb14 187 rem -= alp_parse_chunk(&p, &r);
Jeej 1:40ead20ecb14 188 switch (r.type)
Jeej 1:40ead20ecb14 189 {
Jeej 1:40ead20ecb14 190 case ALP_OPCODE_RSP_F_DATA:
Jeej 6:581caeee80e8 191 case ALP_OPCODE_RSP_F_PROP:
Jeej 1:40ead20ecb14 192 ASSERT(g_modem.user[id].data != NULL,"ASSERT: NULL Data Buffer for RD on ID %d\n",id);
Jeej 1:40ead20ecb14 193 memcpy(g_modem.user[id].data,r.data,r.meta.f_data.length);
Jeej 1:40ead20ecb14 194 break;
Jeej 1:40ead20ecb14 195 case ALP_OPCODE_RSP_STATUS:
Jeej 1:40ead20ecb14 196 err = r.meta.status.code;
Jeej 1:40ead20ecb14 197 break;
Jeej 1:40ead20ecb14 198 case ALP_OPCODE_RSP_ISTATUS:
Jeej 1:40ead20ecb14 199 ASSERT(g_modem.user[id].istatus != NULL,"ASSERT: NULL ISTAT Buffer for RD on ID %d\n",id);
Jeej 1:40ead20ecb14 200 memcpy(g_modem.user[id].istatus,r.data,r.meta.itf.length);
Jeej 1:40ead20ecb14 201 break;
Jeej 1:40ead20ecb14 202 default:
Jeej 1:40ead20ecb14 203 ASSERT(false,"ASSERT: Unsupported ALP Response: %d\n",r.type);
Jeej 1:40ead20ecb14 204 break;
Jeej 1:40ead20ecb14 205 }
Jeej 0:027760f45e2c 206 }
Jeej 1:40ead20ecb14 207 if(eop)
Jeej 1:40ead20ecb14 208 { // This is mainly for debug, catch old pointers
Jeej 2:bcf269540633 209 //g_modem.user[id].data = NULL;
Jeej 2:bcf269540633 210 //g_modem.user[id].istatus= NULL;
Jeej 1:40ead20ecb14 211 }
Jeej 6:581caeee80e8 212 // User Callback
Jeej 6:581caeee80e8 213 g_modem.user[id].cb(eop,err,id);
Jeej 0:027760f45e2c 214 break;
Jeej 0:027760f45e2c 215 case WC_FLOW_SYS_RST:
Jeej 0:027760f45e2c 216 // 'Software' reset request
Jeej 0:027760f45e2c 217 g_modem.cb->reset();
Jeej 0:027760f45e2c 218 break;
Jeej 0:027760f45e2c 219 case WC_FLOWID_CMD:
Jeej 0:027760f45e2c 220 if (*p == WM_BOOT)
Jeej 0:027760f45e2c 221 {
Jeej 0:027760f45e2c 222 u16 nb_boot;
Jeej 0:027760f45e2c 223 u8 cause;
Jeej 0:027760f45e2c 224 p++;
Jeej 0:027760f45e2c 225 cause = p[0];
Jeej 0:027760f45e2c 226 nb_boot = HAL_TO_U16(p[3],p[2]);
Jeej 0:027760f45e2c 227 g_modem.cb->boot(cause,nb_boot);
Jeej 0:027760f45e2c 228 }
Jeej 0:027760f45e2c 229 else
Jeej 0:027760f45e2c 230 {
Jeej 4:8f031be3ff7d 231 REF_PRINT("Unsupported CMD :0x%x\n",*p);
Jeej 0:027760f45e2c 232 }
Jeej 0:027760f45e2c 233 break;
Jeej 0:027760f45e2c 234 default:
Jeej 4:8f031be3ff7d 235 REF_PRINT("Unsupported WC Flowid:0x%x / %d Bytes\n",flowid,size);
Jeej 0:027760f45e2c 236 break;
Jeej 0:027760f45e2c 237 }
Jeej 0:027760f45e2c 238 }
Jeej 0:027760f45e2c 239
Jeej 0:027760f45e2c 240 public int modem_get_id(action_callback_t* cb)
Jeej 0:027760f45e2c 241 {
Jeej 0:027760f45e2c 242 int i;
Jeej 0:027760f45e2c 243 for(i=0;i<MAX_USER_NB;i++)
Jeej 0:027760f45e2c 244 {
Jeej 0:027760f45e2c 245 if (g_modem.user[i].cb == NULL)
Jeej 0:027760f45e2c 246 {
Jeej 0:027760f45e2c 247 g_modem.user[i].cb = cb;
Jeej 4:8f031be3ff7d 248 REF_PRINT("Get ID:%d/0x%08x\n",i,cb);
Jeej 0:027760f45e2c 249 return i;
Jeej 0:027760f45e2c 250 }
Jeej 0:027760f45e2c 251 }
Jeej 0:027760f45e2c 252 ASSERT(i < MAX_USER_NB,"ASSERT: out of users\n");
Jeej 0:027760f45e2c 253 return -1;
Jeej 0:027760f45e2c 254 }
Jeej 0:027760f45e2c 255
Jeej 0:027760f45e2c 256 public int modem_free_id(u8 id)
Jeej 0:027760f45e2c 257 {
Jeej 0:027760f45e2c 258 if (id < MAX_USER_NB)
Jeej 0:027760f45e2c 259 {
Jeej 0:027760f45e2c 260 g_modem.user[id].cb = NULL;
Jeej 0:027760f45e2c 261 g_modem.user[id].data = NULL;
Jeej 1:40ead20ecb14 262 g_modem.user[id].istatus= NULL;
Jeej 4:8f031be3ff7d 263 REF_PRINT("Free ID:%d\n",id);
Jeej 0:027760f45e2c 264 return id;
Jeej 0:027760f45e2c 265 }
Jeej 0:027760f45e2c 266 return -1;
Jeej 0:027760f45e2c 267 }
Jeej 0:027760f45e2c 268
Jeej 0:027760f45e2c 269 public void modem_open(fx_serial_send_t* send,modem_callbacks_t* callbacks)
Jeej 0:027760f45e2c 270 {
Jeej 0:027760f45e2c 271 if (g_modem.state != STATE_OPEN)
Jeej 0:027760f45e2c 272 {
Jeej 0:027760f45e2c 273 g_modem.send= send;
Jeej 0:027760f45e2c 274 g_modem.cb = callbacks;
Jeej 0:027760f45e2c 275 memset(g_modem.user,0,(MAX_USER_NB * sizeof(modem_user_t)));
Jeej 0:027760f45e2c 276
Jeej 4:8f031be3ff7d 277 REF_PRINT("Open Modem - Max users:%d\n",MAX_USER_NB);
Jeej 0:027760f45e2c 278
Jeej 0:027760f45e2c 279 g_modem.state = STATE_OPEN;
Jeej 0:027760f45e2c 280 }
Jeej 0:027760f45e2c 281 }
Jeej 0:027760f45e2c 282
Jeej 0:027760f45e2c 283 public void modem_close(void)
Jeej 0:027760f45e2c 284 {
Jeej 0:027760f45e2c 285 if (g_modem.state == STATE_OPEN)
Jeej 0:027760f45e2c 286 {
Jeej 0:027760f45e2c 287 g_modem.state = STATE_CLOSED;
Jeej 0:027760f45e2c 288 }
Jeej 0:027760f45e2c 289 }
Jeej 0:027760f45e2c 290
Jeej 0:027760f45e2c 291 public void modem_reset(void)
Jeej 0:027760f45e2c 292 {
Jeej 0:027760f45e2c 293 SERIAL_SEND(WC_FLOW_SYS_RST,NULL,0);
Jeej 0:027760f45e2c 294 }
Jeej 0:027760f45e2c 295
Jeej 0:027760f45e2c 296 public void modem_read_file(u8 fid,void *data,u32 offset,u32 length, u8 id)
Jeej 0:027760f45e2c 297 {
Jeej 0:027760f45e2c 298 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_RD_DATA_SIZE_MAX];
Jeej 0:027760f45e2c 299 u8* p = tmp;
Jeej 4:8f031be3ff7d 300 REF_PRINT("RD[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 301 g_modem.user[id].data = (u8*)data;
Jeej 0:027760f45e2c 302 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 303 ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
Jeej 0:027760f45e2c 304 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 305 }
Jeej 0:027760f45e2c 306
Jeej 6:581caeee80e8 307 public void modem_read_fprop(u8 fid, alp_file_header_t* data, u8 id)
Jeej 6:581caeee80e8 308 {
Jeej 6:581caeee80e8 309 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_RD_PROP_SIZE];
Jeej 6:581caeee80e8 310 u8* p = tmp;
Jeej 11:a077da5fe68f 311 REF_PRINT("RD PROPS[%d]\n",fid);
Jeej 6:581caeee80e8 312 g_modem.user[id].data = (u8*)data;
Jeej 6:581caeee80e8 313 ALP_ACTION_TAG(p,id,true);
Jeej 6:581caeee80e8 314 ALP_ACTION_F_RD_PROP(p,true,fid);
Jeej 6:581caeee80e8 315 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 6:581caeee80e8 316 }
Jeej 6:581caeee80e8 317
Jeej 0:027760f45e2c 318 public void modem_write_file(u8 fid,void *data,u32 offset,u32 length, u8 id)
Jeej 0:027760f45e2c 319 {
Jeej 0:027760f45e2c 320 ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_DATA_SIZE_MAX(length)));
Jeej 0:027760f45e2c 321
Jeej 0:027760f45e2c 322 u8* p = tmp;
Jeej 4:8f031be3ff7d 323 REF_PRINT("WR[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 324 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 325 ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data);
Jeej 0:027760f45e2c 326 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 327 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 328 }
Jeej 0:027760f45e2c 329
Jeej 11:a077da5fe68f 330 public void modem_declare_file(u8 fid, alp_file_header_t* hdr, u8 local, u8 id)
Jeej 0:027760f45e2c 331 {
Jeej 0:027760f45e2c 332 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_DECLARE_SIZE];
Jeej 0:027760f45e2c 333 u8* p = tmp;
Jeej 0:027760f45e2c 334
Jeej 4:8f031be3ff7d 335 REF_PRINT("DECLARE[%d]\n",fid);
Jeej 0:027760f45e2c 336 ALP_ACTION_TAG(p,id,true);
Jeej 11:a077da5fe68f 337 ALP_ACTION_F_DECLARE(p,true,fid,hdr,local);
Jeej 0:027760f45e2c 338 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 339 }
Jeej 0:027760f45e2c 340
Jeej 0:027760f45e2c 341 public void modem_create_file(u8 fid, alp_file_header_t* hdr, u8 id)
Jeej 0:027760f45e2c 342 {
Jeej 0:027760f45e2c 343 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_CREATE_SIZE];
Jeej 0:027760f45e2c 344 u8* p = tmp;
Jeej 0:027760f45e2c 345
Jeej 4:8f031be3ff7d 346 REF_PRINT("CREATE[%d]\n",fid);
Jeej 0:027760f45e2c 347 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 348 ALP_ACTION_F_CREATE(p,true,fid,hdr);
Jeej 0:027760f45e2c 349 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 350 }
Jeej 0:027760f45e2c 351
Jeej 0:027760f45e2c 352 public void modem_notify_file(u8 fid,u32 offset,u32 length,u8 id)
Jeej 0:027760f45e2c 353 {
Jeej 0:027760f45e2c 354 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_TOUCH_SIZE_MAX];
Jeej 0:027760f45e2c 355 u8* p = tmp;
Jeej 0:027760f45e2c 356
Jeej 4:8f031be3ff7d 357 REF_PRINT("NOTIFY[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 358 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 359 ALP_ACTION_F_TOUCH(p,true,fid,offset,length);
Jeej 0:027760f45e2c 360 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 361 }
Jeej 0:027760f45e2c 362
Jeej 0:027760f45e2c 363 public void modem_delete_file(u8 fid,u8 id)
Jeej 0:027760f45e2c 364 {
Jeej 0:027760f45e2c 365 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_DELETE_SIZE];
Jeej 0:027760f45e2c 366 u8* p = tmp;
Jeej 0:027760f45e2c 367
Jeej 4:8f031be3ff7d 368 REF_PRINT("DELETE[%d]\n",fid);
Jeej 0:027760f45e2c 369 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 370 ALP_ACTION_F_DELETE(p,true,fid);
Jeej 0:027760f45e2c 371 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 372 }
Jeej 0:027760f45e2c 373
Jeej 0:027760f45e2c 374 public void modem_send_raw_alp(u8* payload, u32 length, u8 id)
Jeej 0:027760f45e2c 375 {
Jeej 0:027760f45e2c 376 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + length);
Jeej 0:027760f45e2c 377 u8* p = tmp;
Jeej 0:027760f45e2c 378
Jeej 4:8f031be3ff7d 379 REF_PRINT("ALP RAW %d Bytes\n",length);
Jeej 0:027760f45e2c 380 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 381 // User Payload
Jeej 0:027760f45e2c 382 memcpy(p,payload,length);p+=length;
Jeej 0:027760f45e2c 383 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 384 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 385 }
Jeej 0:027760f45e2c 386
Jeej 6:581caeee80e8 387 public void modem_send_file_content(u8* itf, u8 itf_length, void *istatus, u8 fid,void *data,u32 offset,u32 length, u8 id)
Jeej 0:027760f45e2c 388 {
Jeej 0:027760f45e2c 389 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
Jeej 0:027760f45e2c 390 u8* p = tmp;
Jeej 6:581caeee80e8 391 g_modem.user[id].istatus= (u8*)istatus;
Jeej 0:027760f45e2c 392
Jeej 4:8f031be3ff7d 393 REF_PRINT("SEND FILE[%d] CONTENTS @%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 0:027760f45e2c 394 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 395 ALP_ACTION_FORWARD(p,itf,itf_length);
Jeej 0:027760f45e2c 396 ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
Jeej 0:027760f45e2c 397 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 398 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 399 }
Jeej 0:027760f45e2c 400
Jeej 1:40ead20ecb14 401 public void modem_remote_read_file(u8* itf, u8 itf_length,void *istatus ,u8 fid,void *data, u32 offset, u32 length, u8 id)
Jeej 1:40ead20ecb14 402 {
Jeej 1:40ead20ecb14 403 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX);
Jeej 1:40ead20ecb14 404 u8* p = tmp;
Jeej 1:40ead20ecb14 405 g_modem.user[id].data = (u8*)data;
Jeej 1:40ead20ecb14 406 g_modem.user[id].istatus= (u8*)istatus;
Jeej 1:40ead20ecb14 407
Jeej 4:8f031be3ff7d 408 REF_PRINT("RMT RD FILE[%d]@%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 1:40ead20ecb14 409 ALP_ACTION_TAG(p,id,true);
Jeej 1:40ead20ecb14 410 ALP_ACTION_FORWARD(p,itf,itf_length);
Jeej 1:40ead20ecb14 411 ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
Jeej 1:40ead20ecb14 412 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 1:40ead20ecb14 413 DEALLOC_BUFFER(tmp);
Jeej 1:40ead20ecb14 414 }
Jeej 1:40ead20ecb14 415
Jeej 0:027760f45e2c 416 public void modem_enable_urc(u8 type, u8 ifid, u8 val, u8 enable, u8 id)
Jeej 0:027760f45e2c 417 {
Jeej 0:027760f45e2c 418 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_URCC_SIZE(ALP_URC_TYPE_LQUAL)];
Jeej 0:027760f45e2c 419 u8* p = tmp;
Jeej 4:8f031be3ff7d 420 REF_PRINT("URC[%d] Type %d ifid %d\n",enable,type,ifid);
Jeej 0:027760f45e2c 421
Jeej 0:027760f45e2c 422 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 423 // Actual Operation
Jeej 0:027760f45e2c 424 if (enable)
Jeej 0:027760f45e2c 425 {
Jeej 0:027760f45e2c 426 ALP_ACTION_URCC_EN(p,true,type,ifid,val);
Jeej 0:027760f45e2c 427 }
Jeej 0:027760f45e2c 428 else
Jeej 0:027760f45e2c 429 {
Jeej 0:027760f45e2c 430 ALP_ACTION_URCC_DIS(p,true,type,ifid,val);
Jeej 0:027760f45e2c 431 }
Jeej 0:027760f45e2c 432 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 433 }
Jeej 0:027760f45e2c 434
Jeej 1:40ead20ecb14 435 public void modem_activate_itf(u8 type, u8 nb_dev, u8 ifid, u8 flags, u8 enable, u8 id)
Jeej 1:40ead20ecb14 436 {
Jeej 1:40ead20ecb14 437 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_ACTIVATE_ITF_SIZE];
Jeej 1:40ead20ecb14 438 u8* p = tmp;
Jeej 1:40ead20ecb14 439
Jeej 4:8f031be3ff7d 440 REF_PRINT("ACTIVATE ITFTYPE[%x]:%d\n",type,enable);
Jeej 1:40ead20ecb14 441 ALP_ACTION_TAG(p,id,true);
Jeej 11:a077da5fe68f 442 ALP_ACTION_ACTIVATE_ITF(p,true,enable,type,nb_dev,ifid,flags);
Jeej 1:40ead20ecb14 443 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 1:40ead20ecb14 444 }
Jeej 1:40ead20ecb14 445
Jeej 0:027760f45e2c 446 public void modem_respond(u8 action, s8 status, int id)
Jeej 0:027760f45e2c 447 {
Jeej 0:027760f45e2c 448 u8 tmp[ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_STATUS_SIZE];
Jeej 0:027760f45e2c 449 u8* p = tmp;
Jeej 4:8f031be3ff7d 450 REF_PRINT("RESP[%d]:%d\n",action,status);
Jeej 0:027760f45e2c 451
Jeej 0:027760f45e2c 452 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,(status<0)?true:false); }
Jeej 0:027760f45e2c 453 ALP_ACTION_RSP_STATUS(p,action,status);
Jeej 0:027760f45e2c 454 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 455 }
Jeej 0:027760f45e2c 456
Jeej 0:027760f45e2c 457 public void modem_respond_fprop(u8 fid, u8* hdr, int id)
Jeej 0:027760f45e2c 458 {
Jeej 0:027760f45e2c 459 u8 tmp[ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_PROP_SIZE];
Jeej 0:027760f45e2c 460 u8* p = tmp;
Jeej 4:8f031be3ff7d 461 REF_PRINT("RESP FPROP[%d]\n",fid);
Jeej 0:027760f45e2c 462
Jeej 0:027760f45e2c 463 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
Jeej 0:027760f45e2c 464 ALP_ACTION_RSP_F_PROP(p,fid,hdr);
Jeej 0:027760f45e2c 465 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 466 }
Jeej 0:027760f45e2c 467
Jeej 0:027760f45e2c 468 public void modem_respond_read(u8 fid,void *data,u32 offset,u32 length, int id)
Jeej 0:027760f45e2c 469 {
Jeej 0:027760f45e2c 470 ALLOC_BUFFER(u8,tmp,ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
Jeej 0:027760f45e2c 471 u8* p = tmp;
Jeej 4:8f031be3ff7d 472 REF_PRINT("F_DATA[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 473 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
Jeej 0:027760f45e2c 474 ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
Jeej 0:027760f45e2c 475 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 476 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 477 }
Jeej 0:027760f45e2c 478
Jeej 0:027760f45e2c 479