comparison src/g23m-aci/aci/ati_ss.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
comparison
equal deleted inserted replaced
0:4e78acac3d88 1:fa8dc04885d8
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-F&D (8411)
4 | Modul : ATI
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : AT Command Interpreter: Supplementary Service related commands.
18 +-----------------------------------------------------------------------------
19 */
20
21 #ifndef ATI_SS_C
22 #define ATI_SS_C
23
24 #undef DUMMY_ATI_STRINGS
25
26 #include "aci_all.h"
27
28 #include "aci_lst.h"
29 #include "aci_cmh.h"
30 #include "ati_cmd.h"
31 #include "aci_io.h"
32 #include "aci_cmd.h"
33 #include "l4_tim.h"
34
35 #include "aci_mem.h"
36 #include "aci_prs.h"
37
38 #include "ati_int.h"
39
40 #ifdef FF_ATI_BAT
41
42 #include "typedefs.h"
43 #include "gdd.h"
44 #include "bat.h"
45
46 #include "ati_bat.h"
47
48 #endif /*FF_ATI_BAT*/
49
50 typedef struct
51 {
52 char *name;
53 T_ACI_FAC fac;
54 } net_fac;
55
56 const net_fac fac[] =
57 {
58 {"SC", FAC_Sc},
59 {"AO", FAC_Ao},
60 {"OI", FAC_Oi},
61 {"OX", FAC_Ox},
62 {"AI", FAC_Ai},
63 {"IR", FAC_Ir},
64 {"AB", FAC_Ab},
65 {"AG", FAC_Ag},
66 {"AC", FAC_Ac},
67 {"FD", FAC_Fd},
68 {"PN", FAC_Pn}, /* Network personalisation of the ME */
69 {"PU", FAC_Pu}, /* Network subset personalisation of the ME */
70 {"PP", FAC_Pp}, /* Service provider personalisation of the ME */
71 {"PC", FAC_Pc}, /* Corporate personalisation of the ME */
72 {"PS", FAC_Ps}, /* SIM personalisation */
73 {"PF", FAC_Pf}, /* Personalisation on first inserted SIM */
74 {"AL", FAC_Al}, /* ALS settings locked by CHV2 */
75 {"P2", FAC_P2},
76 #ifdef SIM_PERS
77 {"BP", FAC_Bl}, /* Blocked Network personalisation of the ME */
78 {"FC", FAC_Fc},
79 {"FM", FAC_Fcm},
80 {"MU", FAC_Mu},
81 {"MM", FAC_Mum},
82 #endif
83 #ifdef FF_PHONE_LOCK
84 {"PL", FAC_Pl},
85 {"LA", FAC_Apl},
86 #endif
87 {0, FAC_NotPresent}
88
89 };
90
91 #ifdef SIM_PERS
92
93 typedef struct
94 {
95 char *name;
96 T_SUP_INFO_TYPE sup_info;
97 } net_mepd_sup_info;
98
99 const net_mepd_sup_info mepd_sup_info[] =
100 {
101 {"MAX", FCMAX},
102 {"ALE", FCATTEMPTSLEFT},
103 {"RFM", FCRESETFAILMAX},
104 {"RFA", FCRESETFAILATTEMPTSLEFT},
105 {"RSM", FCRESETSUCCESSMAX},
106 {"RSA", FCRESETSUCCESSATTEMPTSLEFT},
107 {"TMF", TIMERFLAG},
108 {"ETF", ETSIFLAG},
109 {"AIF", AIRTELINDFLAG},
110 {0, CMEPD_SUP_INFO_NotPresent}
111 };
112
113 #endif
114 GLOBAL char dialBuf[MAX_DIAL_LEN];
115 GLOBAL char subBuf[MAX_SUBADDR_LEN];
116
117 /*
118 +--------------------------------------------------------------------+
119 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
120 | STATE : code ROUTINE : setatPlusCTFR |
121 +--------------------------------------------------------------------+
122
123 PURPOSE : +CTFR command (Call TRansfer, Call Deflection)
124 */
125 GLOBAL T_ATI_RSLT setatPlusCTFR (char * cl, UBYTE srcId)
126 {
127 T_ACI_RETURN ret = AT_FAIL;
128 T_ACI_TOA type;
129 T_ACI_TOA *p_type;
130 T_ACI_TOS satype;
131 T_ACI_TOS *p_satype;
132 CHAR *subadr = subBuf;
133 SHORT toa_oct = 0;
134 SHORT tos_oct = 0;
135 CHAR numBuf[MAX_B_SUBSCR_NUM_LEN];
136
137 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
138
139 src_params->curAtCmd = AT_CMD_CTFR;
140
141 /* init */
142 p_type = &type;
143 p_satype = &satype;
144 memset( numBuf, 0, sizeof(numBuf));
145 memset( subadr, 0, MAX_SUBADDR_LEN);
146
147 cl = parse(cl,"srsr",(LONG)MAX_B_SUBSCR_NUM_LEN, numBuf, &toa_oct,
148 (LONG)MAX_SUBADDR_LEN, subadr, &tos_oct);
149
150 /* Process number parameter (mandatory) */
151 if(!cl OR numBuf[0] EQ '\0')
152 {
153 /* Number is mandatory. No number parameter => error */
154 cmdCmeError (CME_ERR_OpNotAllow);
155 return (ATI_FAIL);
156 }
157
158 /* Process Type Of Address (optional) */
159 if(toa_oct EQ 0)
160 {
161 /* Type Of Address not present */
162 p_type = NULL;
163 }
164 else
165 {
166 /* Type Of Address present */
167 type = toa_demerge (toa_oct);
168 if (type.ton < 0 OR type.npi < 0)
169 {
170 cmdCmeError (CME_ERR_OpNotAllow);
171 return (ATI_FAIL);
172 }
173 }
174
175 /* Process subadr (optional) */
176 if( subadr[0] EQ 0 )
177 {
178 /* subadr not present */
179 subadr = NULL;
180 }
181
182 /* Process Type Of Subaddress (optional) */
183 if(tos_oct EQ 0)
184 {
185 /* Type Of Subaddress not present */
186 p_satype = NULL;
187 }
188 else
189 {
190 satype = tos_demerge (tos_oct);
191 if (satype.tos < 0 OR satype.oe < 0)
192 {
193 cmdCmeError (CME_ERR_OpNotAllow);
194 return (ATI_FAIL);
195 }
196 }
197
198 #ifdef FF_ATI_BAT
199 {
200 T_BAT_cmd_send cmd;
201 T_BAT_cmd_set_plus_ctfr my_bat_set_plus_ctfr;
202
203 TRACE_FUNCTION("setatPlusCTFR() calls bat_send() <=== as APPLICATION");
204
205 memset(&my_bat_set_plus_ctfr, 0, sizeof(my_bat_set_plus_ctfr));
206 cmd.ctrl_params = BAT_CMD_SET_PLUS_CTFR;
207 cmd.params.ptr_set_plus_ctfr = &my_bat_set_plus_ctfr;
208
209 my_bat_set_plus_ctfr.c_number = strlen(numBuf);
210 memcpy(my_bat_set_plus_ctfr.number, numBuf, my_bat_set_plus_ctfr.c_number);
211 my_bat_set_plus_ctfr.type = (S16)p_type;
212 my_bat_set_plus_ctfr.v_subaddr = 0; /*??? */
213 my_bat_set_plus_ctfr.c_subaddr = strlen(subadr);
214 memcpy(my_bat_set_plus_ctfr.subaddr, subadr, my_bat_set_plus_ctfr.c_subaddr);
215 my_bat_set_plus_ctfr.satype = (S16)p_satype;
216
217 bat_send(ati_bat_get_client(srcId), &cmd);
218
219 return ATI_EXCT; /* executing, because response is passed by callback function */
220 }
221 #else /* OLD FUNCTION BODY */
222
223 TRACE_FUNCTION("setatPlusCTFR()");
224
225 ret = sAT_PlusCTFR ((T_ACI_CMD_SRC)srcId, numBuf, p_type, subadr, p_satype);
226
227 if (ret NEQ AT_EXCT)
228 {
229 cmdCmeError(CME_ERR_Unknown);
230 }
231 return (map_aci_2_ati_rslt(ret));
232
233 #endif /* no FF_ATI_BAT*/
234 }
235
236 /*
237 +--------------------------------------------------------------------+
238 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
239 | STATE : code ROUTINE : atiSShandleCSSN |
240 +--------------------------------------------------------------------+
241
242 PURPOSE : Handles the +CSSN and %CSSN set commands.*/
243
244 GLOBAL T_ATI_RSLT atiSShandleCSSN (char* cl, UBYTE srcId)
245 {
246 int cssiMode = ati_user_output_cfg[srcId].CSSI_stat, cssuMode = ati_user_output_cfg[srcId].CSSU_stat;
247
248 TRACE_FUNCTION("atiSShandleCSSN()");
249
250 if (*cl EQ 0 OR *cl EQ ';')
251 {
252 cmdCmeError(CME_ERR_OpNotAllow);
253 return (ATI_FAIL);
254 }
255 cl = parse(cl,"dd",&cssiMode,&cssuMode);
256 /* A value of 2 for cssiMode is now accepted. This value will only be set by %CSSN */
257 if(!cl OR cssiMode > 2 OR cssiMode < 0 OR
258 cssuMode > 1 OR cssuMode < 0 )
259 {
260 cmdCmeError(CME_ERR_OpNotAllow);
261 return (ATI_FAIL);
262 }
263 ati_user_output_cfg[srcId].CSSI_stat=(UBYTE)cssiMode;
264 ati_user_output_cfg[srcId].CSSU_stat=(UBYTE)cssuMode;
265
266 if (*cl NEQ '\0' AND *cl NEQ ';')
267 {
268 cmdCmeError(CME_ERR_OpNotAllow);
269 return (ATI_FAIL);
270 }
271 return (ATI_CMPL);
272
273 }
274
275
276 /*
277 +--------------------------------------------------------------------+
278 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
279 | STATE : code ROUTINE : atPlusCSSN |
280 +--------------------------------------------------------------------+
281
282 PURPOSE : +CSSN command (supplementary service notifications)
283 */
284 GLOBAL T_ATI_RSLT setatPlusCSSN (char* cl, UBYTE srcId)
285 {
286 TRACE_FUNCTION("setatPLusCSSN()");
287
288 /*Check that the range of the first parameter "CSSI mode" is valid (0 or 1).Further parameters are
289 checked in the function atiSShandleCSSN()*/
290 if ((*cl EQ '0') OR (*cl EQ '1') OR (*cl EQ ','))
291 return atiSShandleCSSN(cl,srcId);
292 else
293 {
294 cmdCmeError(CME_ERR_OpNotAllow);
295 return (ATI_FAIL);
296 }
297 }
298
299
300 /*
301 +--------------------------------------------------------------------+
302 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
303 | STATE : code ROUTINE : atPercentCSSN |
304 +--------------------------------------------------------------------+
305
306 PURPOSE : %CSSN command (supplementary service notifications extension)
307 */
308 GLOBAL T_ATI_RSLT setatPercentCSSN (char* cl, UBYTE srcId)
309 {
310 TRACE_FUNCTION("setatPercentCSSN()");
311
312 return atiSShandleCSSN(cl,srcId);
313 }
314
315
316
317 GLOBAL T_ATI_RSLT queatPlusCSSN (char* cl, UBYTE srcId)
318 {
319 TRACE_FUNCTION("queatPLusCSSN()");
320
321 resp_disp(srcId, cl,"bb",&ati_user_output_cfg[srcId].CSSI_stat,&ati_user_output_cfg[srcId].CSSU_stat);
322 return (ATI_CMPL);
323 }
324
325 /*
326 +--------------------------------------------------------------------+
327 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
328 | STATE : code ROUTINE : queatPercentCSSN |
329 +--------------------------------------------------------------------+
330
331 PURPOSE : Handles the %CSSN query command.*/
332
333
334 GLOBAL T_ATI_RSLT queatPercentCSSN (char* cl, UBYTE srcId)
335 {
336 TRACE_FUNCTION("queatPercentCSSN()");
337
338 resp_disp(srcId, cl,"bb",&ati_user_output_cfg[srcId].CSSI_stat,&ati_user_output_cfg[srcId].CSSU_stat);
339 return (ATI_CMPL);
340 }
341
342
343
344 /*
345 +--------------------------------------------------------------------+
346 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
347 | STATE : code ROUTINE : atPlusCCFC |
348 +--------------------------------------------------------------------+
349
350 PURPOSE : +CCFC call forwarding
351 */
352
353 GLOBAL T_ATI_RSLT setatPlusCCFC(char *cl, UBYTE srcId)
354 {
355 T_ACI_RETURN ret = AT_FAIL;
356 T_ACI_CCFC_RSN reason=CCFC_RSN_NotPresent;
357 T_ACI_CCFC_MOD mode=CCFC_MOD_NotPresent;
358 T_ACI_TOA type;
359 T_ACI_TOA *p_type;
360 T_ACI_TOS satype;
361 T_ACI_TOS *p_satype;
362 T_ACI_CLASS class_type=CLASS_NotPresent;
363 CHAR *subadr = subBuf;
364 SHORT time=-1;
365 SHORT toa_oct=0;
366 SHORT tos_oct=0;
367 CHAR numBuf[MAX_B_SUBSCR_NUM_LEN];
368 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
369
370 /* init */
371 memset( numBuf, 0, sizeof(numBuf));
372 memset( subadr, 0, MAX_SUBADDR_LEN);
373
374 TRACE_FUNCTION("setatPLusCCFC()");
375
376 p_type=&type;
377 p_satype=&satype;
378
379 cl = parse(cl,"ddsrdsrr",&reason,&mode,
380 (LONG)MAX_B_SUBSCR_NUM_LEN,numBuf,&toa_oct,&class_type,
381 (LONG)MAX_SUBADDR_LEN,subadr,&tos_oct,&time);
382
383 if(!cl)
384 {
385 cmdCmeError(CME_ERR_OpNotAllow);
386 return (ATI_FAIL);
387 }
388 if (mode EQ 2) /*query mode*/
389 {
390 #ifdef FF_ATI_BAT
391 {
392 T_BAT_cmd_send cmd;
393 T_BAT_cmd_set_plus_ccfc my_bat_set_plus_ccfc = {0};
394
395 TRACE_FUNCTION("setatPlusCCFC() {Query mode=2} calls bat_send() <=== as APPLICATION");
396
397 cmd.ctrl_params = BAT_CMD_SET_PLUS_CCFC;
398 cmd.params.ptr_set_plus_ccfc = &my_bat_set_plus_ccfc;
399
400 my_bat_set_plus_ccfc.reason = (T_BAT_plus_ccfc_reason)reason;
401 my_bat_set_plus_ccfc.mode = (T_BAT_plus_ccfc_mode)mode;
402 my_bat_set_plus_ccfc.bearer_class = (T_BAT_plus_ccfc_bearer_class)class_type;
403 src_params->curAtCmd = AT_CMD_CCFC;
404
405 bat_send(ati_bat_get_client(srcId), &cmd);
406 return ATI_EXCT; /* executing, because response is passed by callback function */
407 }
408 #else /* no FF_ATI_BAT */
409 ret = qAT_PlusCCFC((T_ACI_CMD_SRC)srcId,reason,class_type);
410 switch (ret)
411 {
412 case AT_EXCT:
413 {
414 src_params->curAtCmd = AT_CMD_CCFC;
415 return (ATI_EXCT);
416 }
417 case AT_BUSY:
418 {
419 TRACE_EVENT("setatPLusCCFC(): qAT_PlusCCFC returns BUSY");
420 return (ATI_BUSY);
421 }
422 case AT_FAIL:
423 {
424 TRACE_EVENT("setatPLusCCFC(): qAT_PlusCCFC returns FAIL");
425 cmdCmeError(CME_ERR_Unknown); /* Extended error returned by qAT_PlusCCFC */
426 return (ATI_FAIL);
427 }
428 default:
429 {
430 cmdCmeError(CME_ERR_Unknown);
431 return (ATI_FAIL);
432 }
433 }
434 #endif /* no FF_ATI_BAT */
435 }
436 else /*set mode*/
437 {
438 if( subadr[0] EQ 0 )
439 {
440 /* subadr has been omitted in command */
441 subadr = NULL;
442 }
443
444 if(toa_oct EQ 0)
445 p_type=NULL;
446 else
447 {
448 type=toa_demerge(toa_oct);
449 if (type.ton < 0 OR type.npi < 0)
450 {
451 cmdCmeError(CME_ERR_OpNotAllow);
452 return (ATI_FAIL);
453 }
454 }
455 if(tos_oct EQ 0)
456 p_satype=NULL;
457 else
458 {
459 satype=tos_demerge(tos_oct);
460 if(satype.tos < 0 OR satype.oe < 0)
461 {
462 cmdCmeError(CME_ERR_OpNotAllow);
463 return (ATI_FAIL);
464 }
465 }
466 #ifdef FF_ATI_BAT
467 {
468 T_BAT_cmd_send cmd;
469 T_BAT_cmd_set_plus_ccfc my_bat_set_plus_ccfc = {0};
470
471 TRACE_FUNCTION("setatPlusCCFC() calls bat_send() <=== as APPLICATION");
472
473 cmd.ctrl_params = BAT_CMD_SET_PLUS_CCFC;
474 cmd.params.ptr_set_plus_ccfc = &my_bat_set_plus_ccfc;
475
476 my_bat_set_plus_ccfc.reason = (T_BAT_plus_ccfc_reason)reason;
477 my_bat_set_plus_ccfc.mode = (T_BAT_plus_ccfc_mode)mode;
478
479 /* check for number string and store for BAT send */
480 if (my_bat_set_plus_ccfc.c_number = strlen(numBuf))
481 {
482 my_bat_set_plus_ccfc.v_number = TRUE;
483 memcpy(my_bat_set_plus_ccfc.number, numBuf, my_bat_set_plus_ccfc.c_number);
484 }
485
486 my_bat_set_plus_ccfc.type = (S16)toa_oct;
487
488 /* check for subaddr string and store for BAT send */
489 if (subadr NEQ NULL AND
490 (my_bat_set_plus_ccfc.c_subaddr = strlen(subadr)))
491 {
492 my_bat_set_plus_ccfc.v_subaddr = TRUE;
493 memcpy(my_bat_set_plus_ccfc.subaddr, subadr, my_bat_set_plus_ccfc.c_subaddr);
494 }
495
496 my_bat_set_plus_ccfc.satype = (S16)tos_oct;
497 my_bat_set_plus_ccfc.bearer_class = (T_BAT_plus_ccfc_bearer_class)class_type;
498 my_bat_set_plus_ccfc.time = (T_BAT_plus_ccfc_time)time;
499
500 src_params->curAtCmd = AT_CMD_CCFC;
501
502 bat_send(ati_bat_get_client(srcId), &cmd);
503 return ATI_EXCT; /* executing, because response is passed by callback function */
504 }
505 #else /* no FF_ATI_BAT */
506 if( numBuf[0] EQ '\0' )
507 {
508 /* number has been omitted in command */
509 ret = sAT_PlusCCFC((T_ACI_CMD_SRC)srcId,reason,mode,NULL,p_type,class_type,subadr,p_satype,time);
510 }
511 else
512 {
513 ret = sAT_PlusCCFC((T_ACI_CMD_SRC)srcId,reason,mode,numBuf,p_type,class_type,subadr,p_satype,time);
514 }
515 if (ret EQ AT_EXCT)
516 {
517 src_params->curAtCmd = AT_CMD_CCFC;
518 }
519 else
520 {
521 cmdCmeError(CME_ERR_Unknown);
522 }
523 #endif /* no FF_ATI_BAT */
524 }
525 return (map_aci_2_ati_rslt(ret));
526 }
527
528 /*
529 +--------------------------------------------------------------------+
530 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
531 | STATE : code ROUTINE : atPlusCLCK |
532 +--------------------------------------------------------------------+
533
534 PURPOSE : +CLCK command (Select facility lock settings)
535 */
536
537 GLOBAL T_ATI_RSLT setatPlusCLCK(char *cl, UBYTE srcId)
538 {
539 T_ACI_RETURN ret = AT_FAIL;
540 T_ACI_FAC fac_num = FAC_NotPresent;
541 T_ACI_CLCK_MOD mod = CLCK_MOD_NotPresent;
542 T_ACI_CLASS class_type = CLASS_NotPresent;
543 char passwd[MAX_PWD_LENGTH] = {0};
544 char fac_str[3] = {0,0,0};
545 USHORT i;
546
547 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
548
549 src_params->curAtCmd = AT_CMD_CLCK;
550 TRACE_FUNCTION("setatPLusCLCK() ");
551
552 cl = parse(cl, "sdnd", (LONG)3, fac_str, &mod, (LONG)MAX_PWD_LENGTH, passwd, &class_type);
553
554 if (!cl OR *fac_str EQ 0)
555 {
556 cmdCmeError(CME_ERR_OpNotAllow);
557 return (ATI_FAIL);
558 }
559 strcpy(fac_str, strupper(fac_str));
560 for (i=0;fac[i].name NEQ 0; i++)
561 {
562 if (strcmp(fac[i].name, fac_str) EQ 0 )
563 {
564 fac_num = fac[i].fac; /*translates facility string in facility number */
565 break;
566 }
567 }
568 if (fac_num EQ FAC_NotPresent) /* facility non existent*/
569 {
570 cmdCmeError(CME_ERR_OpNotAllow);
571 return (ATI_FAIL);
572 }
573
574 #ifdef FF_ATI_BAT
575 {
576 T_BAT_cmd_send cmd;
577 T_BAT_cmd_set_plus_clck my_bat_set_plus_clck;
578
579 TRACE_FUNCTION("setatPLusCLCK() calls bat_send() <=== as APPLICATION");
580
581 memset(&my_bat_set_plus_clck, 0, sizeof(my_bat_set_plus_clck));
582 cmd.ctrl_params = BAT_CMD_SET_PLUS_CLCK;
583 cmd.params.ptr_set_plus_clck = &my_bat_set_plus_clck;
584
585 my_bat_set_plus_clck.fac = fac_num;
586 my_bat_set_plus_clck.mode = mod;
587 if(mod NEQ CLCK_MODE_QUERY) /*query mode*/
588 {
589 my_bat_set_plus_clck.v_passwd = 1;
590 my_bat_set_plus_clck.c_passwd = strlen(passwd);
591 memcpy(my_bat_set_plus_clck.passwd, passwd, my_bat_set_plus_clck.c_passwd);
592 }
593
594 my_bat_set_plus_clck.bearer_class = class_type;
595
596 bat_send(ati_bat_get_client(srcId), &cmd);
597
598 return ATI_EXCT; /* executing, because response is passed by callback function */
599 }
600 #else /* OLD FUNCTION BODY */
601 {
602 T_ACI_CLSSTAT clsStat;
603 SHORT pos;
604
605 TRACE_FUNCTION("setatPLusCLCK()");
606
607 if (mod EQ CLCK_MOD_NotPresent) /* mode non existent*/
608 {
609 cmdCmeError(CME_ERR_OpNotAllow);
610 return(ATI_FAIL);
611 }
612 if (mod EQ CLCK_MODE_QUERY) /*query mode*/
613 {
614 ret = qAT_PlusCLCK((T_ACI_CMD_SRC)srcId, fac_num, class_type, &clsStat);
615
616 if(ret EQ AT_CMPL)
617 {
618 pos = sprintf(g_sa,"+CLCK: ");
619
620 if (clsStat.status NEQ STATUS_NotPresent)
621 {
622 pos += sprintf(g_sa+pos,"%d,",clsStat.status);
623 }
624 else
625 {
626 pos += sprintf(g_sa+pos,",");
627 }
628 if (clsStat.class_type NEQ CLASS_NotPresent)
629 {
630 pos += sprintf(g_sa+pos,"%d,",clsStat.class_type);
631 }
632 ci_remTrailCom(g_sa, pos);
633 io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
634 return (ATI_CMPL);
635 }
636 }
637 else /*set mode*/
638 {
639 ret = sAT_PlusCLCK((T_ACI_CMD_SRC)srcId, fac_num, mod, passwd, class_type);
640 }
641
642 switch(ret)
643 {
644 case(AT_EXCT):
645 break;
646
647 case(AT_BUSY):
648 cmdCmeError(CME_ERR_Unknown);
649 TRACE_EVENT("ME is busy");
650 break;
651
652 case(AT_FAIL):
653 cmdCmeError(CME_ERR_Unknown);
654 break;
655 }
656 return (map_aci_2_ati_rslt(ret));
657 }
658 #endif /* no FF_ATI_BAT*/
659 }
660
661 /*
662 +--------------------------------------------------------------------+
663 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
664 | STATE : code ROUTINE : atPlusCPWD |
665 +--------------------------------------------------------------------+
666
667 PURPOSE : +CPWD command (changes password)
668 */
669
670 GLOBAL T_ATI_RSLT setatPlusCPWD(char *cl, UBYTE srcId)
671 {
672 T_ACI_RETURN ret = AT_FAIL;
673 T_ACI_FAC fac_num = FAC_NotPresent;
674 CHAR oldpwd[MAX_PWD_LENGTH]={0};
675 CHAR newpwd[MAX_PWD_LENGTH]={0};
676 CHAR fac_str[3]={0};
677 USHORT i;
678
679 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
680
681 src_params->curAtCmd = AT_CMD_CPWD;
682
683 cl = parse(cl, "snn", (LONG)3, fac_str, (LONG)MAX_PWD_LENGTH, oldpwd, (LONG)MAX_PWD_LENGTH, newpwd);
684 strcpy(fac_str, (char *)strupper(fac_str));
685 if(!cl OR *fac_str EQ 0 OR *oldpwd EQ 0 OR *newpwd EQ 0)
686 {
687 cmdCmeError(CME_ERR_OpNotAllow);
688 return (ATI_FAIL);
689 }
690 for (i = 0; fac[i].name NEQ 0; i++)
691 {
692 if (strcmp(fac[i].name,fac_str) EQ 0 )
693 {
694 fac_num=fac[i].fac; /*translates facility string in facility number */
695 break;
696 }
697 }
698 if (fac[i].name EQ 0) /* facility non existent*/
699 {
700 cmdCmeError(CME_ERR_OpNotAllow);
701 return (ATI_FAIL);
702 }
703 #ifdef FF_ATI_BAT
704 {
705 T_BAT_cmd_send cmd;
706 T_BAT_cmd_set_plus_cpwd my_bat_set_plus_cpwd;
707
708 TRACE_FUNCTION("setatPLusCPWD() calls bat_send() <=== as APPLICATION");
709
710 memset(&my_bat_set_plus_cpwd, 0, sizeof(my_bat_set_plus_cpwd));
711 cmd.ctrl_params = BAT_CMD_SET_PLUS_CPWD;
712 cmd.params.ptr_set_plus_cpwd = &my_bat_set_plus_cpwd;
713
714 my_bat_set_plus_cpwd.fac = fac_num;
715 my_bat_set_plus_cpwd.c_oldpwd = strlen(oldpwd);
716 memcpy(my_bat_set_plus_cpwd.oldpwd, oldpwd, my_bat_set_plus_cpwd.c_oldpwd);
717 my_bat_set_plus_cpwd.c_newpwd = strlen(newpwd);
718 memcpy(my_bat_set_plus_cpwd.newpwd, newpwd, my_bat_set_plus_cpwd.c_newpwd);
719
720 bat_send(ati_bat_get_client(srcId), &cmd);
721
722 return ATI_EXCT; /* executing, because response is passed by callback function */
723 }
724 #else /* OLD FUNCTION BODY */
725
726 TRACE_FUNCTION("setatPLusCPWD()");
727
728 ret = sAT_PlusCPWD((T_ACI_CMD_SRC)srcId, fac_num, oldpwd, newpwd);
729 if (ret EQ AT_CMPL)
730 {
731 return (ATI_CMPL);
732 }
733 else if (ret EQ AT_EXCT)
734 {
735 src_params->curAtCmd = AT_CMD_CPWD;
736 }
737 else
738 {
739 cmdCmeError(CME_ERR_Unknown);
740 }
741 return (map_aci_2_ati_rslt(ret));
742
743 #endif /* no FF_ATI_BAT*/
744 }
745
746 /*
747 +--------------------------------------------------------------------+
748 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
749 | STATE : code ROUTINE : atPlusCUSD |
750 +--------------------------------------------------------------------+
751
752 PURPOSE : +CUSD Unstructured supplementary data
753 */
754 GLOBAL T_ATI_RSLT setatPlusCUSD(char *cl, UBYTE srcId)
755 {
756 T_ACI_RETURN ret = AT_FAIL;
757 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
758 CHAR ussd [MAX_USSD_LEN] = {0x00};
759 USHORT lenUssd = 0;
760
761 #ifndef FF_ATI_BAT
762 T_ACI_USSD_DATA cvtdUssd;
763 T_ACI_USSD_DATA* p_cvtdUssd = NULL;
764 USHORT lenCvtdUssd = 0;
765 #endif
766
767 SHORT dcs = ACI_NumParmNotPresent,
768 stat = ACI_NumParmNotPresent;
769 BOOL status_changed = FALSE;
770
771 TRACE_FUNCTION("setatPlusCUSD()");
772
773 cl = parse(cl,"rzr",
774 &stat,
775 (LONG)MAX_USSD_LEN,
776 strlen(cl),
777 cl,
778 &lenUssd,
779 ussd,
780 &dcs);
781
782 if(cl EQ NULL OR
783 stat > 2)
784 {
785 cmdCmeError(CME_ERR_OpNotAllow);
786 return (ATI_FAIL);
787 }
788
789 if(stat EQ 2)
790 {
791 /* CANCEL ONGOING USSD OPERATION */
792 ret = sAT_end_ussd((T_ACI_CMD_SRC)srcId);
793 }
794 else
795 {
796 if (dcs EQ 17 AND ati_user_output_cfg[srcId].cscsChset NEQ CSCS_CHSET_Ucs2)
797 {
798 cmdCmeError(CME_ERR_OpNotAllow); /* it makes no sense if TE<->MS is GSM7 but we talk to the Network
799 in UCS2 since afterwards we need to convert it back to GSM7 and
800 we will loose some characters */
801 return (ATI_FAIL);
802 }
803
804 if (stat NEQ ACI_NumParmNotPresent )
805 {
806 /* SET CUSD Presentation Flag only for values stat 0 and 1 */
807 ati_user_output_cfg[srcId].CUSD_stat = (UBYTE)stat;
808 status_changed = TRUE;
809 }
810
811 if (dcs EQ ACI_NumParmNotPresent )
812 {
813 /* GSM 03.38 [25] Cell Broadcast Data Coding Scheme in integer format (default 0) */
814 dcs = 0;
815 }
816
817 srcId_cb = srcId;
818
819 #ifdef FF_ATI_BAT
820
821 {
822 T_BAT_cmd_send cmd;
823 T_BAT_cmd_set_plus_cusd cusd;
824
825 cmd.ctrl_params=BAT_CMD_SET_PLUS_CUSD;
826 cmd.params.ptr_set_plus_cusd=&cusd;
827
828 /*
829 * This is the only possible value for 'n', as the other is
830 * dealt with further up this function.
831 */
832 cusd.n=BAT_CUSD_N_NOT_PRESENT;
833
834 /*
835 * Simplest thing to do is copy in as much data as the BAT
836 * structure can handle. If there is too much we won't
837 * overwrite memory.
838 */
839 memcpy(cusd.str,ussd,BAT_MAX_USSD_LEN);
840
841 /*
842 * Set the length. If there is too much data it will
843 * effectively be truncated.
844 */
845 cusd.c_str=(U8)((lenUssd>BAT_MAX_USSD_LEN) ? BAT_MAX_USSD_LEN:lenUssd);
846 cusd.v_str=TRUE;
847
848 cusd.dcs=(S16)dcs;
849
850 bat_send(ati_bat_get_client(srcId), &cmd);
851
852 src_params->curAtCmd=AT_CMD_CUSD;
853
854 return(ATI_EXCT);
855 }
856
857 #else /* no FF_ATI_BAT */
858
859 utl_ussdDtaFromTe ((UBYTE*)ussd,
860 lenUssd,
861 (UBYTE*)cvtdUssd.data,
862 &lenCvtdUssd,
863 #ifdef REL99
864 sizeof(cvtdUssd.data),
865 #endif /* REL99 */
866 (UBYTE)dcs);
867
868 cvtdUssd.len = (UBYTE)lenCvtdUssd;
869
870 if (cvtdUssd.len NEQ 0)
871 {
872 p_cvtdUssd=&cvtdUssd;
873 }
874
875 if( p_cvtdUssd NEQ NULL )
876 {
877 ret = sAT_PlusCUSD((T_ACI_CMD_SRC)srcId, p_cvtdUssd, dcs);
878 }
879 else
880 {
881 if (lenUssd NEQ 0)
882 {
883 cmdCmeError(CME_ERR_Unknown);
884 return (ATI_FAIL);
885 }
886 }
887 #endif /* no FF_ATI_BAT */
888
889 }
890
891 if (ret EQ AT_CMPL)
892 {
893 return (ATI_CMPL);
894 }
895 else if (ret EQ AT_EXCT)
896 {
897 src_params->curAtCmd = AT_CMD_CUSD;
898 return (ATI_EXCT);
899 }
900 else if(status_changed)
901 {
902 return (ATI_CMPL);
903 }
904
905 cmdCmeError(CME_ERR_Unknown);
906 return (ATI_FAIL);
907 }
908
909 GLOBAL T_ATI_RSLT queatPlusCUSD(char *cl, UBYTE srcId)
910 {
911 TRACE_FUNCTION("queatPlusCUSD()");
912
913 resp_disp(srcId, cl,"b",&ati_user_output_cfg[srcId].CUSD_stat);
914 return (ATI_CMPL);
915 }
916
917 #ifdef TI_PS_FF_AT_P_CMD_CSCN
918 /*
919 +--------------------------------------------------------------------+
920 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
921 | STATE : code ROUTINE : atPercentCSCN |
922 +--------------------------------------------------------------------+
923
924 PURPOSE : %CSCN - network service change notifications
925 */
926 GLOBAL T_ATI_RSLT setatPercentCSCN (char *cl, UBYTE srcId)
927 {
928 T_ACI_SS_CSCN_MOD_STATE ss_switch = SS_CSCN_MOD_STATE_INVALID;
929 T_ACI_SS_CSCN_MOD_DIRECTION ss_direction = SS_CSCN_MOD_DIR_INVALID;
930 T_ACI_CC_CSCN_MOD_STATE cc_switch = CC_CSCN_MOD_STATE_INVALID;
931 T_ACI_CC_CSCN_MOD_DIRECTION cc_direction = CC_CSCN_MOD_DIR_INVALID;
932
933 TRACE_FUNCTION("setatPercentCSCN()");
934
935 if((cl EQ NULL) OR (*cl EQ '\0')) /* No parameter passed ?? */
936 {
937 cmdCmeError(CME_ERR_OpNotAllow);
938 return (ATI_FAIL);
939 }
940
941 cl = parse(cl,"dddd", &ss_switch, &ss_direction, &cc_switch, &cc_direction);
942
943 /* valid parameter ?? */
944 if( (ss_switch >= SS_CSCN_MOD_STATE_MAX) OR
945 (ss_direction >= SS_CSCN_MOD_DIR_MAX) OR
946 (cc_switch >= CC_CSCN_MOD_STATE_MAX) OR
947 (cc_direction >= CC_CSCN_MOD_DIR_MAX) )
948 {
949 cmdCmeError(CME_ERR_OpNotAllow);
950 return (ATI_FAIL);
951 }
952
953 if (sAT_PercentCSCN( (T_ACI_CMD_SRC)srcId, ss_switch, ss_direction, cc_switch, cc_direction ) NEQ AT_CMPL)
954 return (ATI_FAIL);
955
956 return (ATI_CMPL);
957 }
958
959 /* ------------------------------------------------------------------------- */
960 GLOBAL T_ATI_RSLT queatPercentCSCN (char* cl, UBYTE srcId)
961 /* ------------------------------------------------------------------------- */
962 {
963 T_ACI_SS_CSCN_MOD_STATE ss_switch;
964 T_ACI_SS_CSCN_MOD_DIRECTION ss_direction;
965 T_ACI_CC_CSCN_MOD_STATE cc_switch;
966 T_ACI_CC_CSCN_MOD_DIRECTION cc_direction;
967
968 TRACE_FUNCTION("queatPercentCSCN()");
969
970 if (qAT_PercentCSCN( (T_ACI_CMD_SRC)srcId, &ss_switch, &ss_direction, &cc_switch, &cc_direction ) NEQ AT_CMPL)
971 return (ATI_FAIL);
972
973 if( ss_switch EQ SS_CSCN_MOD_STATE_INVALID ) ss_switch = SS_CSCN_MOD_STATE_OFF;
974 if( ss_direction EQ SS_CSCN_MOD_DIR_INVALID ) ss_direction = SS_CSCN_MOD_DIR_IN;
975 if( cc_switch EQ CC_CSCN_MOD_STATE_INVALID ) cc_switch = CC_CSCN_MOD_STATE_OFF;
976 if( cc_direction EQ CC_CSCN_MOD_DIR_INVALID ) cc_direction = CC_CSCN_MOD_DIR_IN;
977
978 resp_disp(srcId, cl, "ssss", &ss_switch, &ss_direction, &cc_switch, &cc_direction);
979 return (ATI_CMPL);
980 }
981 #endif /* TI_PS_FF_AT_P_CMD_CSCN */
982
983 #ifdef TI_PS_FF_AT_P_CMD_CUSDR
984 /*
985 +--------------------------------------------------------------------+
986 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
987 | STATE : code ROUTINE : setatPercentCUSDR |
988 +--------------------------------------------------------------------+
989
990 PURPOSE : %CUSDR - Extended response for n/w initiated USSD.
991 */
992 GLOBAL T_ATI_RSLT setatPercentCUSDR(char* cl, UBYTE srcId)
993 {
994 T_ACI_CUSDR_RES response;
995 T_ACI_RETURN ret = AT_FAIL;
996
997 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
998
999 TRACE_FUNCTION("setatPercentCUSDR()");
1000
1001 cl = parse(cl,"d",&response);
1002
1003 if(!cl)
1004 {
1005 cmdCmeError(CME_ERR_OpNotAllow);
1006 return (ATI_FAIL);
1007 }
1008
1009 ret = sAT_PercentCUSDR((T_ACI_CMD_SRC)srcId, response);
1010
1011 return (map_aci_2_ati_rslt(ret));
1012
1013 }
1014 #endif /* TI_PS_FF_AT_P_CMD_CUSDR */
1015
1016
1017 #ifdef SIM_PERS
1018
1019 /* ----------Added on 11/03/2005--------------------*/
1020 /*-------------For %MEPD AT comand----------------- */
1021 /* ------------------------------------------------------------------------- */
1022 /*
1023 +------------------------------------------------------------------------------
1024 | Function : setatPercentMEPD
1025 +------------------------------------------------------------------------------
1026 | Description : For %MEPD= AT comand
1027 |
1028 | Parameters :char* cl
1029 | UBYTE srcId
1030 |
1031 | Return : ATI_FAIL - at command failed
1032 | ATI_FAIL_NO_OUTPUT - at command failed with no output
1033 | ATI_BUSY - ATI busy
1034 | ATI_EXCT - ATI is executing the command
1035 | ATI_CMPL - at command successfully executed
1036 | ATI_CMPL_NO_OUTPUT - at command successfully executed with no output
1037 |
1038 +------------------------------------------------------------------------------
1039 */
1040 GLOBAL T_ATI_RSLT setatPercentMEPD (char* cl, UBYTE srcId)
1041 {
1042 T_ACI_RETURN ret = AT_FAIL;
1043 char sup_info_str[4] = {0,0,0,0};
1044 T_SUP_INFO_TYPE sup_info_num = CMEPD_SUP_INFO_NotPresent;
1045 T_SUP_INFO sup_info; /*return Value of MEPD CFG Data */
1046 USHORT i;
1047 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1048
1049 src_params->curAtCmd = AT_CMD_MEPD;
1050 TRACE_FUNCTION("setatPercentMEPD()");
1051
1052 /*input functionality*/
1053 cl = parse (cl,"s",(LONG)4, sup_info_str);
1054
1055 if ( !cl OR (sup_info_str[0] EQ 0))
1056 {
1057 cmdCmeError (CME_ERR_OpNotAllow);
1058 return (ATI_FAIL);
1059 }
1060
1061 strcpy(sup_info_str, strupper(sup_info_str));
1062 for (i=0;mepd_sup_info[i].name NEQ 0; i++)
1063 {
1064 if (strcmp(mepd_sup_info[i].name, sup_info_str) EQ 0 )
1065 {
1066 sup_info_num = mepd_sup_info[i].sup_info; /*translates facility string in facility number */
1067 break;
1068 }
1069 }
1070 if (sup_info_num EQ CMEPD_SUP_INFO_NotPresent) /* facility non existent*/
1071 {
1072 cmdCmeError(CME_ERR_OpNotAllow);
1073 return (ATI_FAIL);
1074 }
1075
1076 sup_info.infoType=sup_info_num;
1077
1078 #ifdef FF_ATI_BAT
1079 {
1080 T_BAT_cmd_send cmd;
1081 T_BAT_cmd_set_percent_mepd mepd;
1082
1083 memset(&mepd, 0, sizeof(mepd));
1084 cmd.ctrl_params = BAT_CMD_SET_PERCENT_MEPD;
1085 cmd.params.ptr_set_percent_mepd = &mepd;
1086 mepd.sup_info_type = (T_BAT_percent_mepd_sup_info)sup_info_num;
1087
1088 bat_send(ati_bat_get_client(srcId), &cmd);
1089
1090 return ATI_EXCT; /* executing, because response is passed by callback function */
1091 }
1092 #else
1093 ret = qAT_PercentMEPD((T_ACI_CMD_SRC)srcId, &sup_info);
1094 if (ret EQ AT_CMPL)
1095 {
1096 resp_disp(srcId,cl,"b", &sup_info.datavalue);
1097 return (ATI_CMPL);
1098 }
1099 else
1100 {
1101 cmdCmeError(CME_ERR_OpNotAllow);
1102 return (ATI_FAIL);
1103 }
1104 #endif /* FF_ATI_BAT */
1105 }
1106
1107 #endif /* SIM_PERS */
1108 #endif /* ATI_SS_C */