comparison src/aci2/aci/ati_ss.c @ 3:93999a60b835

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