comparison src/g23m-aci/aci/ati_pdu.c @ 162:53929b40109c

src/g23m-aci: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 11 Oct 2016 02:02:43 +0000
parents
children
comparison
equal deleted inserted replaced
161:4557e2a9c18e 162:53929b40109c
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 Extension for SMS PDU mode
18 +-----------------------------------------------------------------------------
19 */
20
21 #ifndef ATI_PDU_C
22 #define ATI_PDU_C
23
24 #undef DUMMY_ATI_STRINGS
25
26 #include "aci_all.h"
27
28 #include "aci_cmh.h"
29 #include "ati_cmd.h"
30 #include "aci_io.h"
31 #include "aci_cmd.h"
32 #include "aci.h"
33 #include "psa.h"
34 #include "psa_sms.h"
35 #include "aci_lst.h"
36
37 #include "cmh.h"
38 #include "cmh_sms.h"
39 #include "gdi.h"
40 #include "audio.h"
41 #include "p_sim.h"
42 #include "p_aci.h"
43 #include "aoc.h"
44 #include "aci.h"
45 #include "pcm.h"
46 #include "rx.h"
47 #include "pwr.h"
48
49 #include "aci_cmd.h"
50 #include "aci_mem.h"
51 #include "aci_prs.h"
52
53 #include "ati_int.h"
54
55 #ifdef FF_ATI_BAT
56
57 #include "typedefs.h"
58 #include "gdd.h"
59 #include "bat.h"
60
61 #include "ati_bat.h"
62
63 #endif /*FF_ATI_BAT*/
64
65 GLOBAL USHORT GsmToHex (UBYTE in, char * buffer, USHORT pos);
66 // GLOBAL USHORT HexAdress (CHAR * adress, UBYTE ton, UBYTE npi, char * buffer, USHORT pos);
67 // GLOBAL USHORT HexAdressTP (CHAR * adress, UBYTE ton, UBYTE npi, char * buffer, USHORT pos);
68 // GLOBAL USHORT HexScts (T_ACI_VP_ABS * scts, char * buffer, USHORT pos);
69 // GLOBAL USHORT HexMessage (T_ACI_SM_DATA * data, UBYTE length, char * buffer, USHORT pos);
70 // GLOBAL char * GSMAddress (char * cl, char * address, T_ACI_TOA *tosca);
71 GLOBAL char * HexToGsm (char * cl, UBYTE * value);
72
73 #ifdef WIN32
74 EXTERN T_ACI_SMS_READ smsReadMode;
75 #endif
76
77 LOCAL SHORT length_of_pdu_message = 0;
78 LOCAL UBYTE pdu_error_detected = FALSE;
79
80
81 /*
82 +--------------------------------------------------------------------+
83 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
84 | STATE : code ROUTINE : atPlusCMGSPdu |
85 +--------------------------------------------------------------------+
86
87 PURPOSE : +CMGS command (SEND Message) in PDU mode.
88 */
89
90 #if defined (SMS_PDU_SUPPORT)
91
92 GLOBAL T_ATI_RSLT atPlusCMGSPdu (char *cl, UBYTE srcId)
93 {
94 T_ACI_RETURN ret = AT_FAIL;
95 T_ACI_SM_DATA pdu;
96 T_SMS_SET_PRM * pSMSSetPrm; /* points to SMS parameter set */
97
98 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
99
100 pdu.len = 0;
101
102 pSMSSetPrm = smsShrdPrm.pSetPrm[srcId];
103
104 TRACE_FUNCTION("atPlusCMGSPdu()");
105
106 if (src_params->text_mode EQ CMD_MODE)
107 {
108 /*
109 * Extract the length (excluding SCA octets) outto be parsed from
110 * the input pointer cl
111 */
112 cl = parse (cl,"r",&length_of_pdu_message);
113 if ( !cl OR length_of_pdu_message EQ 0)
114 {
115 cmdCmsError(CMS_ERR_OpNotAllowed);
116 return (ATI_FAIL);
117 }
118 src_params->text_mode = TXT_MODE;
119 return (ATI_EXCT);
120 } /* end of if (src_params->text_mode EQ CMD_MODE) */
121 else
122 {
123 UBYTE i = 0;
124 UBYTE sca_len = 0;
125 UBYTE offset = 0;
126 UBYTE pdu_message_octets_lenth = 0;
127
128 src_params->text_mode = CMD_MODE;
129 /*
130 * Input line with pdu is given
131 */
132 pdu_error_detected = FALSE;
133
134 HexToGsm (cl, &sca_len);
135
136 TRACE_EVENT_P1("%d",sca_len);
137
138 if (sca_len > ((MAX_SMS_ADDR_DIG+1)/2) + 1)
139 {
140 TRACE_ERROR("SCA too long !!!");
141 cmdCmsError(CMS_ERR_OpNotAllowed);
142 return (ATI_FAIL);
143 }
144
145 /*
146 calculation of the real length of PDU string
147
148 The first octet in the input is an indicator of the length of the SMSC information supplied.
149
150 And this Octet and the SMSC content do not count in the real length of PDU string.
151
152 so here, the length of the input needs to minus 2 + sca_len*2 and then divide 2.
153 */
154 pdu_message_octets_lenth = (strlen(cl)-2-sca_len*2)/2;
155
156 TRACE_EVENT_P1("pdu_message_octets_lenth == %d",pdu_message_octets_lenth);
157
158 if(pdu_message_octets_lenth NEQ length_of_pdu_message)
159 {
160 cmdCmsError (CMS_ERR_OpNotAllowed);
161 TRACE_EVENT("ERROR: input pdu message length do not match the real length!");
162 return (ATI_FAIL);
163 }
164
165 if (sca_len EQ 0) /* no SCA given */
166 {
167 offset = CodeRPAddress(pdu.data,
168 pSMSSetPrm -> sca.c_num,
169 pSMSSetPrm -> sca.ton,
170 pSMSSetPrm -> sca.npi,
171 pSMSSetPrm -> sca.num);
172
173 pdu.len = length_of_pdu_message + offset;
174 cl += 2;
175 }
176 else
177 {
178 pdu.len = length_of_pdu_message + sca_len + 1;
179 }
180
181 for (i=offset; i<pdu.len AND *cl NEQ '\0' AND i<MAX_SM_LEN; i++)
182 {
183 cl = HexToGsm (cl, &pdu.data[i]);
184 }
185
186 #ifdef FF_ATI_BAT
187 {
188 T_BAT_cmd_send cmd;
189 T_BAT_cmd_set_plus_cmgs cmgs;
190
191 /*
192 * Check that BAT can handle this size of PDU.
193 */
194 if (pdu.len>BAT_MAX_SM_LEN)
195 {
196 TRACE_EVENT("ERROR: PDU too big for BAT");
197 cmdCmsError(CMS_ERR_UnknownErr);
198 return (ATI_FAIL);
199 }
200
201 cmd.ctrl_params=BAT_CMD_SET_PLUS_CMGS;
202 cmd.params.ptr_set_plus_cmgs=&cmgs;
203
204 /*
205 * Copy in the PDU data, secure in the knowledge that we have
206 * enough room for it.
207 */
208 memcpy(&cmgs.pdu,pdu.data,BAT_MAX_SM_LEN);
209
210 cmgs.length=(U8)pdu.len;
211 cmgs.c_pdu=(U8)pdu.len;
212
213 bat_send(ati_bat_get_client(srcId), &cmd);
214 }
215
216 #else /* no FF_ATI_BAT */
217
218 /*
219 * send the SMS message using extracted values
220 */
221 ret = sAT_PlusCMGSPdu ( (T_ACI_CMD_SRC)srcId, &pdu );
222
223 if ( ret NEQ AT_EXCT )
224 {
225 cmdCmsError (CMS_ERR_NotPresent); // use aciErrDesc
226 return (ATI_FAIL);
227 }
228
229 #endif /* no FF_ATI_BAT */
230
231 /*
232 * rCI_OK will emitting +CMGS: <mr>[,<ackpdu>]
233 */
234 src_params->curAtCmd = AT_CMD_CMGS;
235 return ATI_EXCT;
236 }
237 }
238
239
240 #endif
241
242 /*
243 +--------------------------------------------------------------------+
244 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
245 | STATE : code ROUTINE : atPlusCNMAPdu |
246 +--------------------------------------------------------------------+
247
248 PURPOSE : +CNMA command (new message acknowledgement) in PDU mode
249 */
250
251 #if defined (SMS_PDU_SUPPORT)
252
253 GLOBAL T_ATI_RSLT atPlusCNMAPdu (char *cl, UBYTE srcId)
254 {
255 UBYTE msg_type;
256 static SHORT n = -1;
257 T_ACI_SM_DATA pdu = {0};
258 T_ACI_RETURN ret = AT_FAIL;
259 UBYTE pdu_message_octets_lenth = 0;
260 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
261
262
263
264
265 TRACE_FUNCTION("atPlusCNMAPdu()");
266
267
268
269 if (src_params->text_mode EQ CMD_MODE)
270 {
271 /*
272 * normal command line
273 */
274 if (*cl EQ '\0')
275 {
276 /*
277 * no parameters, like text mode
278 */
279 n = 1;
280 }
281 else
282 {
283 /*
284 * Extract the acknowledge parameter n
285 */
286 length_of_pdu_message = 0;
287 cl = parse(cl,"rr",&n, &length_of_pdu_message);
288 if ( !cl)
289 {
290 cmdCmsError(CMS_ERR_OpNotAllowed);
291 return (ATI_FAIL);
292 }
293
294
295
296 switch (n)
297 {
298 case -1:
299 case 0:
300 case 1:
301 n = 1;
302 if (length_of_pdu_message)
303 {
304 src_params->text_mode = TXT_MODE;
305 return (ATI_EXCT);
306 }
307 break;
308 case 2:
309 if (length_of_pdu_message)
310 {
311 src_params->text_mode = TXT_MODE;
312 return (ATI_EXCT);
313 }
314 break;
315 default:
316 cmdCmsError(CMS_ERR_OpNotAllowed);
317 return (ATI_FAIL);
318 }
319 }
320 } /* end of if (src_params->text_mode EQ CMD_MODE) */
321 else
322 {
323 src_params->text_mode = CMD_MODE;
324
325 /*
326 calculation of the real length of PDU string
327
328 The entering of PDU is done similarly as specified in command Send Message +CMGS,
329 except that the format of <ackpdu> is used instead of <pdu>
330 (i.e. SMSC address field is not present).
331
332 so here, the length of the input needs to divide 2.
333 */
334
335
336 pdu_message_octets_lenth = strlen(cl)/2;
337
338 TRACE_EVENT_P1("pdu_message_octets_lenth == %d",pdu_message_octets_lenth);
339
340 if(pdu_message_octets_lenth NEQ length_of_pdu_message)
341 {
342 cmdCmsError (CMS_ERR_OpNotAllowed);
343 TRACE_EVENT("ERROR: input pdu message length do not match the real length!");
344 return (ATI_FAIL);
345 }
346
347 /*
348 * Input line with pdu is given
349 */
350 pdu_error_detected = FALSE;
351 /*
352 * get the message type
353 */
354 HexToGsm (cl, &msg_type);
355
356 if ((msg_type & 3) EQ 0) // SMS_DELIVER_REPORT
357 {
358 int i;
359 pdu.len = (UBYTE)length_of_pdu_message;
360 for (i=0; i<length_of_pdu_message; i++)
361 {
362 cl = HexToGsm (cl, &pdu.data[i]);
363 }
364 }
365 else
366 pdu_error_detected = TRUE;
367
368 if (pdu_error_detected)
369 {
370 cmdCmsError ( CMS_ERR_InValPduMod );
371 return (ATI_FAIL);
372 }
373 }
374
375
376
377 /*
378 * send the SMS command using extracted values
379 */
380 ret = sAT_PlusCNMAPdu ((T_ACI_CMD_SRC)srcId, n, &pdu);
381 switch(ret)
382 {
383 case AT_FAIL:
384 cmdCmsError (CMS_ERR_NotPresent); // use aciErrDesc
385 /*
386 * no break
387 */
388 /*lint -fallthrough */
389 case AT_CMPL:
390 break;
391 default:
392 TRACE_EVENT("atPlusCNMAPdu() : Error !! Not AT_FAIL or AT_COMPL");
393 break;
394 }
395 return (map_aci_2_ati_rslt(ret));
396 }
397 #endif
398
399
400 /*
401 +--------------------------------------------------------------------+
402 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
403 | STATE : code ROUTINE : atPlusCMGWPdu |
404 +--------------------------------------------------------------------+
405
406 PURPOSE : +CMGW command (Write message to memory) in PDU mode.
407 */
408
409 #if defined (SMS_PDU_SUPPORT)
410
411 GLOBAL T_ATI_RSLT atPlusCMGWPdu (char *cl, UBYTE srcId)
412 {
413 T_ACI_SMS_STAT stat;
414 T_ACI_RETURN ret = AT_FAIL;
415 static UBYTE message_status = NOT_PRESENT_8BIT;
416 T_SMS_SET_PRM *pSMSSetPrm; /* points to SMS parameter set */
417 T_ACI_SM_DATA pdu;
418 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
419
420 pSMSSetPrm = smsShrdPrm.pSetPrm[srcId];
421
422 TRACE_FUNCTION("atPlusCMGWPdu()");
423
424 if (src_params->text_mode EQ CMD_MODE)
425 {
426 /*
427 * normal command line
428 */
429 stat = SMS_STAT_StoUnsent; /* STO UNSENT as default */
430 /*
431 * Extract the length and status to be parsed from the input pointer cl
432 */
433 cl = parse(cl,"rd",&length_of_pdu_message,&stat);
434 if ( !cl OR length_of_pdu_message EQ 0)
435 {
436 cmdCmsError(CMS_ERR_OpNotAllowed);
437 return (ATI_FAIL);
438 }
439
440 if (stat < SMS_STAT_RecUnread OR stat > SMS_STAT_All)
441 {
442 cmdCmsError(CMS_ERR_OpNotAllowed);
443 return (ATI_FAIL);
444 }
445 else
446 {
447 message_status = (UBYTE)stat;
448 }
449 /*
450 * wait for next input containing the PDU_is_given
451 */
452 src_params->text_mode = TXT_MODE;
453 return (ATI_EXCT);
454 } /* end of if (src_params->text_mode EQ CMD_MODE) */
455 else
456 {
457 UBYTE offset = 0;
458 UBYTE sca_len;
459 UBYTE i;
460 UBYTE pdu_message_octets_lenth = 0;
461
462 src_params->text_mode = CMD_MODE;
463 /*
464 * Input line with pdu is given
465 */
466
467 /* if the character sent is ESC, then abort command CLB 16.11.00 */
468 if (*cl EQ 0x1B)
469 {
470 TRACE_EVENT("Send message command cancelled by user");
471
472 return ATI_CMPL_NO_OUTPUT;
473 }
474
475 pdu_error_detected = FALSE;
476
477 HexToGsm (cl, &sca_len);
478
479 if (sca_len > ((MAX_SMS_ADDR_DIG+1)/2) + 1)
480 {
481 TRACE_ERROR("SCA too long !!!");
482 cmdCmsError(CMS_ERR_OpNotAllowed);
483 return (ATI_FAIL);
484 }
485
486 /*
487 calculation of the real length of PDU string
488
489 The first octet in the input is an indicator of the length of the SMSC information supplied.
490
491 And this Octet and the SMSC content do not count in the real length of PDU string.
492
493 so here, the length of the input needs to minus 2 + sca_len*2 and then divide 2.
494 */
495 pdu_message_octets_lenth = (strlen(cl)-2-sca_len*2)/2;
496
497 TRACE_EVENT_P1("pdu_message_octets_lenth == %d",pdu_message_octets_lenth);
498
499 if(pdu_message_octets_lenth NEQ length_of_pdu_message)
500 {
501 cmdCmsError (CMS_ERR_OpNotAllowed);
502 TRACE_EVENT("ERROR: input pdu message length do not match the real length!");
503 return (ATI_FAIL);
504 }
505
506
507 if (sca_len EQ 0) /* no SCA given */
508 {
509 offset = CodeRPAddress(pdu.data,
510 pSMSSetPrm -> sca.c_num,
511 pSMSSetPrm -> sca.ton,
512 pSMSSetPrm -> sca.npi,
513 pSMSSetPrm -> sca.num);
514 cl += 2;
515 pdu.len = length_of_pdu_message + offset;
516 }
517 else
518 {
519 pdu.len = length_of_pdu_message + sca_len + 1;
520 }
521
522 for (i=offset; i<pdu.len AND *cl NEQ '\0' AND i<MAX_SM_LEN; i++)
523 {
524 cl = HexToGsm (cl, &pdu.data[i]);
525 }
526
527 ret = sAT_PlusCMGWPdu ( (T_ACI_CMD_SRC)srcId, message_status, &pdu);
528
529 if ( ret NEQ AT_EXCT )
530 {
531 cmdCmsError (CMS_ERR_NotPresent); // use aciErrDesc
532 return (ATI_FAIL);
533 }
534 /*
535 * rCI_OK will emitting +CMGW: <index>
536 */
537 src_params->curAtCmd = AT_CMD_CMGW;
538 return ATI_EXCT;
539 }
540 }
541 #endif
542
543 /*
544 +--------------------------------------------------------------------+
545 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
546 | STATE : code ROUTINE : atPlusCMGCPdu |
547 +--------------------------------------------------------------------+
548
549 PURPOSE : +CMGC command (Send SMS command) in PDU mode
550 */
551
552 #if defined (SMS_PDU_SUPPORT)
553
554 GLOBAL T_ATI_RSLT atPlusCMGCPdu (char *cl, UBYTE srcId)
555 {
556 T_ACI_RETURN ret = AT_FAIL;
557 T_ACI_SM_DATA pdu;
558 T_SMS_SET_PRM *pSMSSetPrm; /* points to SMS parameter set */
559 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
560
561 pSMSSetPrm = smsShrdPrm.pSetPrm[srcId];
562
563 pdu.len = 0;
564
565 TRACE_FUNCTION("atPlusCMGCPdu()");
566
567 if (src_params->text_mode EQ CMD_MODE)
568 {
569 /*
570 * normal command line
571 */
572 /*
573 * Extract the length to be parsed from the input pointer cl
574 */
575 cl = parse(cl,"r",&length_of_pdu_message);
576 if ( !cl OR length_of_pdu_message EQ 0)
577 {
578 cmdCmsError(CMS_ERR_OpNotAllowed);
579 return (ATI_FAIL);
580 }
581 /*
582 * wait for next input containing the PDU_is_given
583 */
584 src_params->text_mode = TXT_MODE;
585 return (ATI_EXCT);
586 } /* end of if (src_params->text_mode EQ CMD_MODE) */
587 else
588 {
589 UBYTE offset = 0;
590 UBYTE sca_len;
591 UBYTE i;
592 UBYTE pdu_message_octets_lenth = 0;
593
594 src_params->text_mode = CMD_MODE;
595 /*
596 * Input line with pdu is given
597 */
598
599 pdu_error_detected = FALSE;
600
601 HexToGsm (cl, &sca_len);
602
603 if (sca_len > ((MAX_SMS_ADDR_DIG+1)/2) + 1)
604 {
605 TRACE_ERROR("SCA too long !!!");
606 cmdCmsError(CMS_ERR_OpNotAllowed);
607 return (ATI_FAIL);
608 }
609
610 /*
611 calculation of the real length of PDU string
612
613 The first octet in the input is an indicator of the length of the SMSC information supplied.
614
615 And this Octet and the SMSC content do not count in the real length of PDU string.
616
617 so here, the length of the input needs to minus 2 + sca_len*2 and then divide 2.
618 */
619 pdu_message_octets_lenth = (strlen(cl)-2-sca_len*2)/2;
620
621 TRACE_EVENT_P1("pdu_message_octets_lenth == %d",pdu_message_octets_lenth);
622
623 if(pdu_message_octets_lenth NEQ length_of_pdu_message)
624 {
625 cmdCmsError (CMS_ERR_OpNotAllowed);
626 TRACE_EVENT("ERROR: input pdu message length do not match the real length!");
627 return (ATI_FAIL);
628 }
629
630 if (sca_len EQ 0) /* no SCA given */
631 {
632 offset = CodeRPAddress(pdu.data,
633 pSMSSetPrm -> sca.c_num,
634 pSMSSetPrm -> sca.ton,
635 pSMSSetPrm -> sca.npi,
636 pSMSSetPrm -> sca.num);
637 cl += 2;
638 pdu.len = length_of_pdu_message + offset;
639 }
640 else
641 {
642 pdu.len = length_of_pdu_message + sca_len + 1;
643 }
644
645 for (i=offset; i<pdu.len AND *cl NEQ '\0' AND i<MAX_SM_LEN; i++)
646 {
647 cl = HexToGsm (cl, &pdu.data[i]);
648 }
649
650 ret = sAT_PlusCMGCPdu ((T_ACI_CMD_SRC)srcId, &pdu);
651
652 if ( ret NEQ AT_EXCT )
653 {
654 cmdCmsError (CMS_ERR_NotPresent); // use aciErrDesc
655 return (ATI_FAIL);
656 }
657 /*
658 * rCI_OK will emitting +CMGC: <mr>[,<ackpdu>]
659 */
660 src_params->curAtCmd = AT_CMD_CMGC;
661 return ATI_EXCT;
662 }
663 }
664 #endif
665
666 /*
667 +--------------------------------------------------------------------+
668 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
669 | STATE : code ROUTINE : rCI_PlusCMGLPdu |
670 +--------------------------------------------------------------------+
671
672 PURPOSE : handles AT_PlusCMGL call back in PDU mode
673
674 */
675
676 #if defined (SMS_PDU_SUPPORT)
677
678 GLOBAL void rCI_Plus_Percent_CMGLPdu ( T_MNSMS_READ_CNF *mnsms_read_cnf,
679 T_ACI_AT_CMD cmd )
680 {
681 T_ACI_SMS_STAT stat;
682
683 USHORT i = 0;
684 USHORT pos = 0;
685 UBYTE sca_len;
686 UBYTE length_sms, length=0;
687 UBYTE fo, addr_len, dcs, vp_format=TP_VPF_ABSOLUTE;
688 UBYTE *data_ptr;
689
690 UBYTE srcId = srcId_cb;
691
692 #ifndef FF_ATI_BAT
693 CHAR cvtdAlpha[2*MAX_ALPHA_LEN];
694 USHORT lenCvtdAlpha;
695 T_ACI_PB_TEXT alpha;
696 #endif
697
698 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
699
700 TRACE_FUNCTION("rCI_Plus_Percent_CMGLPdu()");
701
702 src_params->curAtCmd = AT_CMD_NONE;
703
704 /* convert status from PSA type to CMH type */
705 cmhSMS_getStatCmh ( mnsms_read_cnf->status, &stat );
706
707 /*
708 * print response and index, status of SMS message
709 */
710 if (cmd EQ AT_CMD_CMGL )
711 {
712 pos = sprintf ( g_sa, "+CMGL: ");
713 }
714 else
715 {
716 pos=sprintf (g_sa, " %s: ", "%CMGL");
717 }
718 pos += sprintf ( g_sa + pos, "%d,%d,", mnsms_read_cnf->rec_num, stat);
719
720 #ifdef FF_ATI_BAT
721
722 /*
723 * Extracting the alphanumeric data from the phonebook at this point
724 * would defeat the object (testing the BAT message). Having this
725 * data stored globally represents an easier solution to the
726 * problem of conveying it here.
727 */
728 if (smsShrdPrm.alpha_len)
729 {
730 pos+=sprints(g_sa+pos,smsShrdPrm.alpha,smsShrdPrm.alpha_len);
731 }
732
733 #else
734
735 cmhSMS_getPhbEntry( mnsms_read_cnf->sms_sdu.buf, &alpha, stat);
736
737 /*
738 * print alpha if available
739 */
740 if ( alpha.len NEQ 0 )
741 {
742 utl_chsetFromGsm ( (UBYTE*)alpha.data,
743 alpha.len,
744 (UBYTE*)cvtdAlpha,
745 sizeof(cvtdAlpha),
746 &lenCvtdAlpha,
747 GSM_ALPHA_Def );
748 pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha );
749 }
750
751 #endif /*FF_ATI_BAT*/
752
753 /* length of SCA including length byte and TOA byte */
754 sca_len = mnsms_read_cnf->sms_sdu.buf[0] + 1;
755
756 data_ptr = &mnsms_read_cnf->sms_sdu.buf[sca_len];
757 fo = *data_ptr++;
758 length++;
759
760 if ((fo & TP_MTI_MASK) NEQ TP_MTI_SMS_STATUS_REP)
761 {
762 if ((fo & TP_MTI_MASK) EQ TP_MTI_SMS_SUBMIT)
763 {
764 /* SMS-SUBMIT */
765 data_ptr++;
766 length++;
767 vp_format = fo & TP_VPF_MASK;
768 }
769
770 addr_len = *data_ptr;
771 length += 4 + (addr_len+1)/2;
772
773 /* data_ptr points to TP-DCS now */
774 data_ptr += 3 + (addr_len+1)/2;
775
776 dcs = *data_ptr++;
777
778 switch (vp_format)
779 {
780 /*
781 * Check validity period format bit 4 and 3
782 */
783 case TP_VPF_NOT_PRESENT: // TP-VP not present
784 break;
785 case TP_VPF_RELATIVE: // TP-VP relative format
786 length++;
787 data_ptr++;
788 break;
789 case TP_VPF_ENHANCED: // TP-VP enhanced format
790 case TP_VPF_ABSOLUTE: // TP-VP absolute format
791 length += 7;
792 data_ptr += 7;
793 break;
794 }
795
796 /* data_ptr points to TP-UDL now,
797 * calculate the length excluding SCA octets
798 */
799 if (cmhSMS_getAlphabetPp (dcs) EQ 0)
800 length_sms = length + (*data_ptr * 7 + 7)/8 + 1; // 7 bit alphabet
801 else
802 length_sms = length + *data_ptr + 1;
803
804 pos += sprintf ( g_sa + pos, ",%d", length_sms );
805 io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT );
806 pos = 0;
807 }
808 else
809 {
810 length_sms=((mnsms_read_cnf->sms_sdu.l_buf+7)/8);
811 pos += sprintf ( g_sa + pos, ",%d,", length_sms-sca_len );
812 sca_len = 0;
813 }
814
815 /*
816 * Print PDU + service centre address
817 */
818 for (i=0;i<(USHORT)(sca_len+length_sms);i++)
819 pos = GsmToHex (mnsms_read_cnf->sms_sdu.buf[i], g_sa, pos);
820
821 /*
822 * Send response
823 */
824 io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT );
825 }
826
827 /*
828 +--------------------------------------------------------------------+
829 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
830 | STATE : code ROUTINE : rCI_PlusCMGRPdu |
831 +--------------------------------------------------------------------+
832
833 PURPOSE : handles AT_PlusCMGR call back in PDU mode
834
835 */
836
837 #if defined (SMS_PDU_SUPPORT)
838
839 GLOBAL void rCI_Plus_Percent_CMGRPdu (T_MNSMS_READ_CNF * mnsms_read_cnf,
840 T_ACI_AT_CMD cmd)
841 {
842 USHORT pos = 0;
843 T_ACI_SMS_STAT stat;
844 USHORT i;
845
846 UBYTE sca_len;
847 UBYTE length_sms, length=0;
848 UBYTE fo, addr_len, dcs, vp_format=TP_VPF_ABSOLUTE;
849 UBYTE *data_ptr;
850
851 UBYTE srcId = srcId_cb;
852
853 #ifndef FF_ATI_BAT
854 CHAR cvtdAlpha[2*MAX_ALPHA_LEN];
855 USHORT lenCvtdAlpha;
856 T_ACI_PB_TEXT alpha;
857 #endif
858
859 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
860
861 TRACE_FUNCTION("rCI_Plus_Percent_CMGRPdu()");
862
863 src_params->curAtCmd = AT_CMD_NONE;
864
865 /*
866 * print response for SMS message
867 */
868 if (cmd EQ AT_CMD_CMGR)
869 {
870 pos = sprintf ( g_sa, "+CMGR: ");
871 }
872 else
873 {
874 pos=sprintf (g_sa, " %s: ", "%CMGR");
875 }
876
877 /* convert status from PSA type to CMH type */
878 cmhSMS_getStatCmh ( mnsms_read_cnf->status, &stat );
879
880 /*
881 * print status of the message
882 */
883 pos += sprintf ( g_sa + pos, "%d,", stat );
884
885 #ifdef FF_ATI_BAT
886
887 /*
888 * Extracting the alphanumeric data from the phonebook at this point
889 * would defeat the object (testing the BAT message). Having this
890 * data stored globally represents a quick and dirty solution to the
891 * problem of conveying it here.
892 */
893 if (smsShrdPrm.alpha_len)
894 {
895 pos+=sprints(g_sa+pos,smsShrdPrm.alpha,smsShrdPrm.alpha_len);
896 }
897
898 #else
899
900 cmhSMS_getPhbEntry( mnsms_read_cnf->sms_sdu.buf, &alpha, stat);
901
902 /*
903 * print alpha if available
904 */
905 if ( alpha.len NEQ 0 )
906 {
907 utl_chsetFromGsm ( (UBYTE*)alpha.data,
908 alpha.len,
909 (UBYTE*)cvtdAlpha,
910 sizeof(cvtdAlpha),
911 &lenCvtdAlpha,
912 GSM_ALPHA_Def );
913 pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha );
914 }
915
916 #endif
917
918 /* length of SCA including length byte and TOA byte */
919 sca_len = mnsms_read_cnf->sms_sdu.buf[0] + 1;
920
921 data_ptr = &mnsms_read_cnf->sms_sdu.buf[sca_len];
922 fo = *data_ptr++;
923 length++;
924
925 if ((fo & TP_MTI_MASK) NEQ TP_MTI_SMS_STATUS_REP)
926 {
927 if ((fo & TP_MTI_MASK) EQ TP_MTI_SMS_SUBMIT)
928 {
929 /* SMS-SUBMIT */
930 data_ptr++;
931 length++;
932 vp_format = fo & TP_VPF_MASK;
933 }
934
935 addr_len = *data_ptr;
936 length += 4 + (addr_len+1)/2;
937
938 /* data_ptr points to TP-DCS now */
939 data_ptr += 3 + (addr_len+1)/2;
940
941 dcs = *data_ptr++;
942
943 switch (vp_format)
944 {
945 /*
946 * Check validity period format bit 4 and 3
947 */
948 case TP_VPF_NOT_PRESENT: // TP-VP not present
949 break;
950 case TP_VPF_RELATIVE: // TP-VP relative format
951 length++;
952 data_ptr++;
953 break;
954 case TP_VPF_ENHANCED: // TP-VP enhanced format
955 case TP_VPF_ABSOLUTE: // TP-VP absolute format
956 length += 7;
957 data_ptr += 7;
958 break;
959 }
960
961 /* data_ptr points to TP-UDL now,
962 * calculate the length excluding SCA octets
963 */
964 if (cmhSMS_getAlphabetPp (dcs) EQ 0)
965 length_sms = length + (*data_ptr * 7 + 7)/8 + 1; // 7 bit alphabet
966 else
967 length_sms = length + *data_ptr + 1;
968
969 pos += sprintf ( g_sa + pos, ",%d", length_sms );
970 io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT );
971 pos = 0;
972 }
973 else
974 {
975 length_sms=((mnsms_read_cnf->sms_sdu.l_buf+7)/8);
976 pos += sprintf ( g_sa + pos, ",%d,", length_sms-sca_len );
977 sca_len = 0;
978 }
979
980 /*
981 * Print PDU + service centre address
982 */
983 /*If the SMS length recevied incorrectly (length_sms > SIM_PDU_LEN)
984 then there is a chance of reading the buf[] beyond SIM_PDU_LEN.
985 By using the MINIMUM macro the max length limit
986 to SIM_PDU_LEN if the length of SMS is greater than SIM_PDU_LEN
987 */
988 length_sms = MINIMUM (sca_len+length_sms, SIM_PDU_LEN);
989 for (i=0;i<(USHORT)length_sms;i++)
990 pos = GsmToHex (mnsms_read_cnf->sms_sdu.buf[i], g_sa, pos);
991
992 /*
993 * Send response
994 */
995 io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT );
996 }
997 #endif
998
999 /*
1000 +--------------------------------------------------------------------+
1001 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1002 | STATE : code ROUTINE : rCI_PlusCMSSPdu |
1003 +--------------------------------------------------------------------+
1004
1005 PURPOSE : handles AT_PlusCMSS call back in PDU mode
1006
1007 */
1008
1009 GLOBAL void rCI_PlusCMSSPdu (T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf)
1010 {
1011 USHORT pos = 0;
1012 UBYTE length;
1013 USHORT i;
1014 UBYTE srcId = srcId_cb;
1015 UBYTE sca_len;
1016 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1017
1018 TRACE_FUNCTION("rCI_PlusCMSSPdu()");
1019
1020 src_params->curAtCmd = AT_CMD_NONE;
1021
1022 pos=sprintf(g_sa,"+CMSS: %d", mnsms_submit_cnf->tp_mr);
1023
1024
1025 if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus)
1026 {
1027 if (mnsms_submit_cnf->sms_sdu.l_buf)
1028 {
1029 pos+=sprintf(g_sa+pos, ",\""); /* parameter shall be bounded by double quote characters, see 07.07 <ackpdu> */
1030 sca_len = mnsms_submit_cnf->sms_sdu.buf[0] + 1;
1031 length = ((mnsms_submit_cnf->sms_sdu.l_buf+7)/8);
1032
1033 /*
1034 * Print ACK PDU (without SCA field)
1035 */
1036 for (i=sca_len; i<length; i++)
1037 pos = GsmToHex (mnsms_submit_cnf->sms_sdu.buf[i], g_sa, pos);
1038
1039 pos+=sprintf(g_sa+pos, "\"");
1040 }
1041 }
1042
1043 /*
1044 * Send response
1045 */
1046 io_sendMessage ( srcId, g_sa, ATI_NORMAL_OUTPUT );
1047 }
1048
1049 /*
1050 +--------------------------------------------------------------------+
1051 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1052 | STATE : code ROUTINE : rCI_PlusCMGSPdu |
1053 +--------------------------------------------------------------------+
1054
1055 PURPOSE : handles AT_PlusCMGS call back in PDU mode
1056
1057 */
1058
1059 GLOBAL void rCI_PlusCMGSPdu (T_MNSMS_SUBMIT_CNF * mnsms_submit_cnf)
1060 {
1061 USHORT pos = 0;
1062 UBYTE length;
1063 UBYTE srcId = srcId_cb;
1064 USHORT i;
1065 UBYTE sca_len;
1066 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1067
1068 TRACE_FUNCTION("rCI_PlusCMGSPdu()");
1069
1070
1071 src_params->curAtCmd = AT_CMD_NONE;
1072
1073 pos=sprintf(g_sa,"+CMGS: %d", mnsms_submit_cnf->tp_mr);
1074
1075
1076 if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus)
1077 {
1078 if (mnsms_submit_cnf->sms_sdu.l_buf)
1079 {
1080 pos+=sprintf(g_sa+pos, ",\""); /* parameter shall be bounded by double quote characters, see 07.07 <ackpdu> */
1081 sca_len = mnsms_submit_cnf->sms_sdu.buf[0] + 1;
1082 length = ((mnsms_submit_cnf->sms_sdu.l_buf+7)/8);
1083
1084 /*
1085 * Print ACK PDU (without SCA field)
1086 */
1087 for (i=sca_len; i<length; i++)
1088 pos = GsmToHex (mnsms_submit_cnf->sms_sdu.buf[i], g_sa, pos);
1089
1090 pos+=sprintf(g_sa+pos, "\"");
1091 }
1092 }
1093
1094 /*
1095 * Send response
1096 */
1097 io_sendMessageEx( srcId, g_sa,
1098 (T_ATI_OUTPUT_TYPE) (ATI_NORMAL_OUTPUT |
1099 ATI_BEGIN_CRLF_OUTPUT |
1100 ATI_END_CRLF_OUTPUT));
1101
1102 }
1103
1104 #ifdef REL99
1105 /*
1106 +--------------------------------------------------------------------+
1107 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1108 | STATE : code ROUTINE : rCI_PercentCMGRSPdu|
1109 +--------------------------------------------------------------------+
1110
1111 PURPOSE : handles AT_PlusCMGRS call back in PDU mode
1112
1113 */
1114
1115 GLOBAL void rCI_PercentCMGRSPdu ( UBYTE mode,
1116 T_MNSMS_RETRANS_CNF * mnsms_retrans_cnf,
1117 T_MNSMS_SEND_PROG_IND * mnsms_send_prog_ind )
1118 {
1119 USHORT pos = 0;
1120 UBYTE length;
1121 UBYTE srcId = srcId_cb;
1122 USHORT i;
1123 UBYTE sca_len = mnsms_retrans_cnf->sms_sdu.buf[0] + 1;
1124 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1125
1126 TRACE_FUNCTION("rCI_PercentCMGRSPdu()");
1127
1128
1129 src_params->curAtCmd = AT_CMD_NONE;
1130
1131 if (mode EQ CMGRS_MODE_MANUAL_RETRANS AND mnsms_retrans_cnf NEQ NULL)
1132 {
1133 pos=sprintf(g_sa,"%s: %d", "%CMGRS", mnsms_retrans_cnf->tp_mr);
1134
1135
1136 if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus)
1137 {
1138 pos+=sprintf(g_sa+pos, ",");
1139 length = ((mnsms_retrans_cnf->sms_sdu.l_buf+7)/8) - sca_len;
1140
1141 /*
1142 * Print ACK PDU (without SCA field)
1143 */
1144 for (i=sca_len;i<length;i++)
1145 pos = GsmToHex (mnsms_retrans_cnf->sms_sdu.buf[i], g_sa, pos);
1146 }
1147 }
1148 else if (mode EQ CMGRS_MODE_ENABLE_AUTO_RETRANS AND mnsms_send_prog_ind NEQ NULL)
1149 {
1150 pos=sprintf(g_sa,"%s: 1,%d,%d", "%CMGRS",
1151 mnsms_send_prog_ind->resend_count,
1152 mnsms_send_prog_ind->max_retrans);
1153 }
1154 else
1155 {
1156 TRACE_ERROR("%CMGRS: wrong combination of parameters");
1157 return;
1158 }
1159
1160 /*
1161 * Send response
1162 */
1163 io_sendMessageEx( srcId, g_sa,
1164 (T_ATI_OUTPUT_TYPE)(ATI_NORMAL_OUTPUT |
1165 ATI_BEGIN_CRLF_OUTPUT |
1166 ATI_END_CRLF_OUTPUT));
1167
1168 }
1169 #endif
1170 /*
1171 +--------------------------------------------------------------------+
1172 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1173 | STATE : code ROUTINE : rCI_PlusCMGCPdu |
1174 +--------------------------------------------------------------------+
1175
1176 PURPOSE : handles AT_PlusCMGC call back in PDU mode
1177
1178 */
1179
1180 GLOBAL void rCI_PlusCMGCPdu (T_MNSMS_COMMAND_CNF * mnsms_command_cnf)
1181 {
1182 USHORT pos = 0;
1183 UBYTE length;
1184 UBYTE srcId = srcId_cb;
1185 USHORT i;
1186 UBYTE sca_len;
1187 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1188
1189 TRACE_FUNCTION("rCI_PlusCMGCPdu()");
1190
1191 src_params->curAtCmd = AT_CMD_NONE;
1192
1193 pos=sprintf(g_sa,"+CMGC: %d", mnsms_command_cnf->tp_mr);
1194
1195 if (smsShrdPrm.CSMSservice EQ CSMS_SERV_GsmPh2Plus)
1196 {
1197 if (mnsms_command_cnf->sms_sdu.l_buf)
1198 {
1199 pos+=sprintf(g_sa+pos, ",\""); /* parameter shall be bounded by double quote characters, see 07.07 <ackpdu> */
1200 sca_len = mnsms_command_cnf->sms_sdu.buf[0] + 1;
1201 length = ((mnsms_command_cnf->sms_sdu.l_buf+7)/8);
1202
1203 /*
1204 * Print ACK PDU (without SCA field)
1205 */
1206 for (i=sca_len; i<length; i++)
1207 pos = GsmToHex (mnsms_command_cnf->sms_sdu.buf[i], g_sa, pos);
1208
1209 pos+=sprintf(g_sa+pos, "\"");
1210 }
1211 }
1212
1213 /*
1214 * Send response
1215 */
1216 io_sendMessageEx( srcId, g_sa,
1217 (T_ATI_OUTPUT_TYPE) (ATI_NORMAL_OUTPUT |
1218 ATI_BEGIN_CRLF_OUTPUT |
1219 ATI_END_CRLF_OUTPUT));
1220 }
1221
1222 /*
1223 +--------------------------------------------------------------------+
1224 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1225 | STATE : code ROUTINE : rCI_PlusCMTPdu |
1226 +--------------------------------------------------------------------+
1227
1228 PURPOSE : handles AT_PlusCMT unsolicited message in PDU mode
1229
1230 */
1231
1232 #if defined (SMS_PDU_SUPPORT)
1233
1234 GLOBAL void rCI_PlusCMTPdu (T_MNSMS_MESSAGE_IND * mnsms_message_ind)
1235 {
1236 USHORT pos = 0;
1237 UBYTE l_sms_with_sca;
1238 UBYTE l_sms_without_sca;
1239 UBYTE srcId = srcId_cb;
1240
1241 #ifndef FF_ATI_BAT
1242 CHAR cvtdAlpha[2*MAX_ALPHA_LEN];
1243 USHORT lenCvtdAlpha;
1244 T_ACI_PB_TEXT alpha;
1245 T_ACI_SMS_STAT stat;
1246 #endif
1247
1248 USHORT i;
1249 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1250
1251 UBYTE sca_len = mnsms_message_ind->sms_sdu.buf[0] + 1;
1252
1253 TRACE_FUNCTION("rCI_PlusCMTPdu()");
1254
1255 src_params->curAtCmd = AT_CMD_NONE;
1256
1257 /*
1258 * print response for SMS message
1259 */
1260 pos = sprintf ( g_sa, "+CMT: ");
1261
1262 /*
1263 * print alpha if available
1264 */
1265 #ifdef FF_ATI_BAT
1266
1267 /*
1268 * Extracting the alphanumeric data from the phonebook at this point
1269 * would defeat the object (testing the BAT message). Having this
1270 * data stored globally represents a quick and dirty solution to the
1271 * problem of conveying it here.
1272 */
1273 if (smsShrdPrm.alpha_len)
1274 {
1275 pos+=sprints(g_sa+pos,smsShrdPrm.alpha,smsShrdPrm.alpha_len);
1276 }
1277
1278 #else
1279
1280 /* convert status from PSA type to CMH type */
1281 cmhSMS_getStatCmh ( mnsms_message_ind->status, &stat );
1282
1283 cmhSMS_getPhbEntry( mnsms_message_ind->sms_sdu.buf, &alpha, stat);
1284
1285
1286 if ( alpha.len NEQ 0 )
1287 {
1288 utl_chsetFromGsm ( (UBYTE*)alpha.data,
1289 alpha.len,
1290 (UBYTE*)cvtdAlpha,
1291 sizeof(cvtdAlpha),
1292 &lenCvtdAlpha,
1293 GSM_ALPHA_Def );
1294 pos += sprints ( g_sa + pos, cvtdAlpha, lenCvtdAlpha );
1295 }
1296
1297 #endif /*FF_ATI_BAT*/
1298
1299 l_sms_with_sca = ((mnsms_message_ind->sms_sdu.l_buf+7)/8);
1300 l_sms_without_sca = l_sms_with_sca - sca_len;
1301
1302 pos += sprintf ( g_sa + pos, ",%d", l_sms_without_sca );
1303 io_sendIndication ( srcId, g_sa, ATI_FORCED_OUTPUT );
1304
1305 pos = 0;
1306
1307 /*
1308 * Print PDU + service centre address field
1309 */
1310 for (i=0;i<(USHORT)l_sms_with_sca;i++)
1311 pos = GsmToHex (mnsms_message_ind->sms_sdu.buf[i], g_sa, pos);
1312
1313 /*
1314 * Send response
1315 */
1316 io_sendIndication ( srcId, g_sa, ATI_FORCED_OUTPUT );
1317
1318 }
1319 #endif
1320
1321 /*
1322 +--------------------------------------------------------------------+
1323 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1324 | STATE : code ROUTINE : rCI_PlusCBMPdu |
1325 +--------------------------------------------------------------------+
1326
1327 PURPOSE : handles Cell Broadcast unsolicited message in PDU mode
1328
1329 */
1330
1331 #if defined (SMS_PDU_SUPPORT)
1332
1333 GLOBAL void rCI_PlusCBMPdu (T_MMI_CBCH_IND * mmi_cbch_ind)
1334 {
1335 int i;
1336 USHORT pos = 0;
1337 UBYTE srcId = srcId_cb;
1338 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1339
1340 TRACE_FUNCTION("rCI_PlusCBMPdu()");
1341
1342 src_params->curAtCmd = AT_CMD_NONE;
1343
1344 /*
1345 * print response for CBM message
1346 */
1347 pos = sprintf ( g_sa, "+CBM: ");
1348 pos += sprintf ( g_sa + pos, "%d", (int)mmi_cbch_ind->cbch_len );
1349
1350 io_sendIndication ( srcId, g_sa, ATI_FORCED_OUTPUT );
1351
1352 pos = 0;
1353
1354 for (i = 0; i < (int)mmi_cbch_ind->cbch_len; i++)
1355 pos = GsmToHex (mmi_cbch_ind->cbch_msg[i], g_sa, pos);
1356
1357 io_sendMessageEx ( srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_INDICATION_OUTPUT +
1358 ATI_FORCED_OUTPUT +
1359 ATI_END_CRLF_OUTPUT ));
1360
1361 }
1362 #endif
1363
1364
1365 #if defined (SMS_PDU_SUPPORT)
1366 /*
1367 +--------------------------------------------------------------------+
1368 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1369 | STATE : code ROUTINE : rCI_PlusCDSPdu |
1370 +--------------------------------------------------------------------+
1371
1372 PURPOSE : handles Status Indication unsolicited message in PDU mode
1373
1374 */
1375 GLOBAL void rCI_PlusCDSPdu (T_MNSMS_STATUS_IND * mnsms_status_ind)
1376 {
1377 USHORT pos = 0;
1378 UBYTE l_sms_with_sca;
1379 UBYTE l_sms_without_sca;
1380 UBYTE sca_len = mnsms_status_ind->sms_sdu.buf[0] + 1;
1381 USHORT i;
1382 UBYTE srcId = srcId_cb;
1383 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, srcId, search_ati_src_id);
1384
1385
1386 TRACE_FUNCTION("rCI_PlusCDSPdu()");
1387
1388 src_params->curAtCmd = AT_CMD_NONE;
1389
1390 /*
1391 * print response for SMS message
1392 */
1393 pos = sprintf ( g_sa, "+CDS: ");
1394
1395 l_sms_with_sca = ((mnsms_status_ind->sms_sdu.l_buf+7)/8);
1396 l_sms_without_sca = l_sms_with_sca - sca_len;
1397
1398 pos += sprintf ( g_sa + pos, "%d", l_sms_without_sca );
1399
1400 io_sendIndication ( srcId, g_sa, ATI_FORCED_OUTPUT );
1401
1402 pos = 0;
1403
1404 /*
1405 * Print PDU + service centre address field
1406 */
1407 for (i=0;i<(USHORT)l_sms_with_sca;i++)
1408 pos = GsmToHex (mnsms_status_ind->sms_sdu.buf[i], g_sa, pos);
1409
1410 /*
1411 * Send response
1412 */
1413 io_sendMessageEx ( srcId, g_sa, (T_ATI_OUTPUT_TYPE)(ATI_INDICATION_OUTPUT +
1414 ATI_FORCED_OUTPUT +
1415 ATI_END_CRLF_OUTPUT) );
1416
1417 }
1418 #endif /* SMS_PDU_SUPPORT */
1419
1420
1421
1422 /*
1423 +--------------------------------------------------------------------+
1424 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1425 | STATE : code ROUTINE : HexMessage |
1426 +--------------------------------------------------------------------+
1427
1428 PURPOSE : converts a sms message to HEX and fill it into a buffer.
1429
1430 */
1431
1432 /* does not seem to be used */
1433 /*GLOBAL USHORT HexMessage (T_ACI_SM_DATA * data, UBYTE length, char * buffer, USHORT pos)
1434 {
1435 int i;
1436
1437 pos = GsmToHex (data->len, buffer, pos);
1438
1439 for (i=0;i<(int)length;i++)
1440 pos = GsmToHex (data->data[i], buffer, pos);
1441
1442 return pos;
1443 } */
1444
1445
1446 /*
1447 +--------------------------------------------------------------------+
1448 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1449 | STATE : code ROUTINE : HexScts |
1450 +--------------------------------------------------------------------+
1451
1452 PURPOSE : converts a service centre timestamp to HEX and fill it into a buffer.
1453
1454 */
1455
1456 /* doesn't seem to be used... */
1457 /*GLOBAL USHORT HexScts (T_ACI_VP_ABS * scts, char * buffer, USHORT pos)
1458 {
1459 UBYTE tz;
1460
1461 TRACE_EVENT_P1("TZ =%x", scts->timezone);
1462
1463 pos = GsmToHex ((UBYTE)((scts->year[1]<<4)+scts->year[0]),
1464 buffer, pos);
1465 pos = GsmToHex ((UBYTE)((scts->month[1]<<4)+scts->month[0]),
1466 buffer, pos);
1467 pos = GsmToHex ((UBYTE)((scts->day[1]<<4)+scts->day[0]),
1468 buffer, pos);
1469 pos = GsmToHex ((UBYTE)((scts->hour[1]<<4)+scts->hour[0]),
1470 buffer, pos);
1471 pos = GsmToHex ((UBYTE)((scts->minute[1]<<4)+scts->minute[0]),
1472 buffer, pos);
1473 pos = GsmToHex ((UBYTE)((scts->second[1]<<4)+scts->second[0]),
1474 buffer, pos);
1475
1476 tz = cmhSMS_setTimezone(scts->timezone);
1477 pos = GsmToHex (tz, buffer, pos);
1478
1479 return pos;
1480 }*/
1481
1482
1483 /*
1484 +--------------------------------------------------------------------+
1485 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1486 | STATE : code ROUTINE : GsmToHex |
1487 +--------------------------------------------------------------------+
1488
1489 PURPOSE : converts a GSM character to HEX and fill it into a buffer.
1490
1491 */
1492
1493 GLOBAL USHORT GsmToHex (UBYTE in, char * buffer, USHORT pos)
1494 {
1495 const UBYTE hexVal[17] = {"0123456789ABCDEF"};
1496
1497 buffer[pos] = hexVal[ in >> 4 ];
1498 buffer[pos+1] = hexVal[ in & 0x0F ];
1499 buffer[pos+2] = '\0';
1500 return pos+2;
1501 }
1502
1503 /*
1504 +--------------------------------------------------------------------+
1505 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1506 | STATE : code ROUTINE : HexAdress |
1507 +--------------------------------------------------------------------+
1508
1509 PURPOSE : converts a adress to HEX and fill it into a buffer.
1510
1511 */
1512
1513 #if 0
1514 GLOBAL USHORT HexAdress (CHAR * adress, UBYTE ton, UBYTE npi, char * buffer, USHORT pos)
1515 {
1516 int i;
1517 int len;
1518
1519 len = (strlen (adress)+1)/2;
1520
1521 pos = GsmToHex ((UBYTE)(len+1), buffer, pos);
1522
1523 pos = GsmToHex ((UBYTE)(0x80 + (ton<<4) + npi), buffer, pos);
1524
1525 for (i=0;i<len;i++)
1526 {
1527 if (i EQ len-1)
1528 {
1529 /*
1530 * last two digits
1531 */
1532 if (strlen(adress) & 1)
1533 {
1534 pos = GsmToHex ((UBYTE)(0xF0 + (adress[2*i] - 0x30)), buffer, pos);
1535 continue;
1536 }
1537 }
1538 pos = GsmToHex ((UBYTE)(((adress [2*i+1]-0x30) << 4) +
1539 (adress [2*i] - 0x30)), buffer, pos);
1540 }
1541 return pos;
1542 }
1543 #endif /* 0 */
1544
1545 /*
1546 +--------------------------------------------------------------------+
1547 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1548 | STATE : code ROUTINE : HexAdressTP |
1549 +--------------------------------------------------------------------+
1550
1551 PURPOSE : converts a adress to HEX and fill it into a buffer for TP-adresses.
1552
1553 */
1554
1555 #if 0
1556 GLOBAL USHORT HexAdressTP (CHAR * adress, UBYTE ton, UBYTE npi, char * buffer, USHORT pos)
1557 {
1558 int i;
1559 int len;
1560
1561 len = (strlen (adress)+1)/2;
1562
1563 if ( ton EQ 0x05 AND strlen (adress) NEQ 4 ) /* PATCH VO - if (patch) else ... */
1564 pos = GsmToHex ((UBYTE)(strlen (adress) * 2), g_sa, pos);
1565 else
1566 pos = GsmToHex ((UBYTE)strlen(adress), g_sa, pos);
1567
1568 pos = GsmToHex ((UBYTE)(0x80 + (ton<<4) + npi), g_sa, pos);
1569
1570 if ( ton EQ 0x05 AND strlen (adress) NEQ 4 ) /* PATCH VO - if (patch) else ... */
1571 {
1572 for (i=0;i<(int)strlen (adress);i++)
1573 pos = GsmToHex ((UBYTE)adress[i], g_sa, pos);
1574 }
1575 else
1576 {
1577 for (i=0;i<len;i++)
1578 {
1579 if (i EQ len-1)
1580 {
1581 /*
1582 * last two digits
1583 */
1584 if (strlen(adress) & 1)
1585 {
1586 pos = GsmToHex ((UBYTE)(0xF0 + (adress[2*i] - 0x30)), g_sa, pos);
1587 continue;
1588 }
1589 }
1590 pos = GsmToHex ((UBYTE)(((adress [2*i+1]-0x30) << 4) + (adress [2*i] - 0x30)),
1591 g_sa, pos);
1592 }
1593 }
1594 return pos;
1595 }
1596 #endif /* 0 */
1597 /*
1598 +--------------------------------------------------------------------+
1599 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1600 | STATE : code ROUTINE : HexToGsm |
1601 +--------------------------------------------------------------------+
1602
1603 PURPOSE : converts a HEX value to the GSM character.
1604
1605 */
1606
1607 GLOBAL char * HexToGsm (char * cl, UBYTE * value)
1608 {
1609 int i;
1610 UBYTE character;
1611
1612 /*
1613 * initialise the output value
1614 */
1615 *value = 0;
1616
1617 /*
1618 * for both nibbles
1619 */
1620 for (i=0;i<2;i++)
1621 {
1622 /*
1623 * shift the result of the last loop
1624 */
1625 *value = (*value) << 4;
1626
1627 /*
1628 * Isolate next nibble in ASCII
1629 */
1630 character = toupper(*cl++);
1631
1632 /*
1633 * convert Nibble character to value
1634 */
1635 switch (character)
1636 {
1637 case 'A':
1638 case 'B':
1639 case 'C':
1640 case 'D':
1641 case 'E':
1642 case 'F':
1643 *value = *value + (character - 'A' + 10);
1644 break;
1645 default:
1646 /*
1647 * 0-9
1648 */
1649 *value = *value + (character - '0');
1650 break;
1651 }
1652 }
1653
1654 /*
1655 * return pointer to the rest of PDU
1656 */
1657 return cl;
1658 }
1659
1660 /*
1661 +--------------------------------------------------------------------+
1662 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1663 | STATE : code ROUTINE : GSMAddress |
1664 +--------------------------------------------------------------------+
1665
1666 PURPOSE : converts a adress coded with HEX values to the internal
1667 data structures.
1668
1669 */
1670
1671 /* does not seem to be used */
1672 #if 0
1673 GLOBAL char * GSMAddress (char * cl, char * address, T_ACI_TOA *tosca)
1674 {
1675 int i, j;
1676 UBYTE value;
1677 UBYTE len;
1678 UBYTE digit;
1679
1680 /*
1681 * calculate the number of octets which are used for the address
1682 */
1683
1684 cl = HexToGsm (cl, &value);
1685 if (value EQ 0) /* SCA not given */
1686 {
1687 address[0] = 0;
1688 return cl;
1689 }
1690 len = value - 1;
1691
1692 /*
1693 * check against maximum value
1694 */
1695 if (len > MAX_SMS_ADDR_DIG/2)
1696 {
1697 pdu_error_detected = TRUE;
1698 return cl;
1699 }
1700
1701 /*
1702 * calculate the type of number and numbering plan identification
1703 */
1704 cl = HexToGsm (cl, &value);
1705
1706 tosca->ton = (value >> 4) & 7;
1707 tosca->npi = value & 0x0F;
1708
1709
1710 /*
1711 * convert the digits
1712 */
1713 j = 0;
1714 for (i = 0; i < (int)len; i++)
1715 {
1716 cl = HexToGsm (cl, &value);
1717
1718 /*
1719 * check digit n
1720 */
1721 address[j++] = (value & 0x0F) + 0x30;
1722 /*
1723 * check digit n+1
1724 */
1725 digit = (value >> 4) & 0x0F;
1726 if (digit < 10)
1727 address[j++] = digit + 0x30;
1728 }
1729 /*
1730 * string termination
1731 */
1732 address[j] = 0;
1733
1734 /*
1735 * return pointer to the rest of the PDU
1736 */
1737 return cl;
1738 }
1739 #endif /* 0 */
1740 /*
1741 +--------------------------------------------------------------------+
1742 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1743 | STATE : code ROUTINE : GSMAddressTP |
1744 +--------------------------------------------------------------------+
1745
1746 PURPOSE : converts a TP-adress coded with HEX values to the internal
1747 data structures.
1748
1749 */
1750
1751 /* does not seem to be used */
1752 #if 0
1753 GLOBAL char * GSMAddressTP (char * cl, char * address, T_ACI_TOA *toda)
1754 {
1755 int i, j;
1756 UBYTE value;
1757 UBYTE len;
1758 UBYTE digit;
1759
1760 /*
1761 * calculate the number of octets which are used for the address
1762 */
1763 cl = HexToGsm (cl, &value);
1764 len = (value + 1)/2;
1765
1766 /*
1767 * check against maximum value
1768 */
1769 if (len > MAX_SMS_ADDR_DIG/2)
1770 {
1771 pdu_error_detected = TRUE;
1772 return cl;
1773 }
1774 /*
1775 * calculate the type of number and numbering plan identification
1776 */
1777 cl = HexToGsm (cl, &value);
1778
1779 toda->ton = (value >> 4) & 7;
1780 toda->npi = value & 0x0F;
1781
1782 /*
1783 * convert the digits
1784 */
1785 j = 0;
1786 for (i=0;i<(int)len;i++)
1787 {
1788 cl = HexToGsm (cl, &value);
1789
1790 /*
1791 * check digit n
1792 */
1793 address[j++] = (value & 0x0F) + 0x30;
1794 /*
1795 * check digit n+1
1796 */
1797 digit = (value >> 4) & 0x0F;
1798 if (digit < 10)
1799 address[j++] = digit + 0x30;
1800 }
1801 /*
1802 * string termination
1803 */
1804 address[j] = 0;
1805
1806 /*
1807 * return pointer to the rest of the PDU
1808 */
1809 return cl;
1810 }
1811 #endif /* 0 */
1812
1813 /*
1814 +--------------------------------------------------------------------+
1815 | PROJECT : GSM-F&D (8411) MODULE : ACI_PDU |
1816 | STATE : code ROUTINE : GSMMessage |
1817 +--------------------------------------------------------------------+
1818
1819 PURPOSE : converts a sms message from HEX and fill it into a buffer.
1820
1821 */
1822
1823 #if 0
1824 GLOBAL char *GSMMessage (char *cl, UBYTE *data, SHORT oct_length, SHORT max_length)
1825 {
1826 SHORT i;
1827
1828 /*
1829 * check against maximum value
1830 */
1831 if (oct_length > max_length)
1832 {
1833 pdu_error_detected = TRUE;
1834 return cl;
1835 }
1836 memset (data, 0, max_length);
1837
1838 /*
1839 * copy message
1840 */
1841 for (i = 0; i < oct_length; i++)
1842 cl = HexToGsm (cl, &data[i]);
1843
1844 return cl;
1845 }
1846 #endif /* 0 */
1847
1848 #endif
1849
1850 #endif /* ATI_PDU_C */