FreeCalypso > hg > leo2moko-debug
comparison g23m/condat/ms/src/aci/cmh_ccr.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GSM-PS (6147) | |
4 | Modul : CMH_CCR | |
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 : This module defines the functions which are responsible | |
18 | for the responses of the protocol stack adapter for | |
19 | call control. | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #ifndef CMH_CCR_C | |
24 #define CMH_CCR_C | |
25 #endif | |
26 | |
27 /*==== INCLUDES ===================================================*/ | |
28 | |
29 #include "aci_all.h" | |
30 #include "aci_cmh.h" | |
31 #include "ati_cmd.h" | |
32 #include "aci_cmd.h" | |
33 #include "aci_mem.h" | |
34 #include "phb.h" | |
35 #include "l4_tim.h" | |
36 #include "aci_lst.h" | |
37 | |
38 | |
39 #ifdef FAX_AND_DATA | |
40 #include "aci_fd.h" | |
41 #endif /* of #ifdef FAX_AND_DATA */ | |
42 | |
43 #include "aci.h" | |
44 #include "psa.h" | |
45 #include "ksd.h" | |
46 #include "psa_cc.h" | |
47 #include "psa_ss.h" | |
48 #include "psa_util.h" | |
49 #include "cmh.h" | |
50 #include "cmh_cc.h" | |
51 #include "cmh_ss.h" | |
52 | |
53 #ifdef FF_ATI | |
54 #include "aci_io.h" | |
55 #endif /* of #ifdef FF_ATI */ | |
56 | |
57 #ifdef UART | |
58 #include "dti.h" /* functionality of the dti library */ | |
59 #include "dti_conn_mng.h" | |
60 #include "dti_cntrl_mng.h" | |
61 #endif | |
62 | |
63 #ifdef FAX_AND_DATA | |
64 | |
65 #include "psa_ra.h" | |
66 #include "cmh_ra.h" | |
67 #include "psa_l2r.h" | |
68 #include "cmh_l2r.h" | |
69 #include "psa_tra.h" | |
70 | |
71 #ifdef FF_FAX | |
72 #include "psa_t30.h" | |
73 #include "cmh_t30.h" | |
74 #endif /* FF_FAX */ | |
75 | |
76 #endif /* FAX_AND_DATA */ | |
77 | |
78 #ifdef SIM_TOOLKIT | |
79 #include "psa_sat.h" | |
80 #include "cmh_sat.h" | |
81 #include "psa_sim.h" | |
82 #endif /* of #ifdef SIM_TOOLKIT */ | |
83 | |
84 #include "aoc.h" | |
85 #include "audio.h" | |
86 | |
87 #if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E) | |
88 #include "wap_aci.h" | |
89 #include "psa_ppp_w.h" | |
90 #include "cmh_ppp.h" | |
91 #endif /* of FF_WAP or FF_TCP_IP || FF_GPF_TCPIP FF_SAT_E */ | |
92 | |
93 #if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP) | |
94 #include "psa_tcpip.h" | |
95 #include "cmh_ipa.h" | |
96 #endif /* CO_UDP_IP || FF_GPF_TCPIP */ | |
97 | |
98 #ifdef FF_GPF_TCPIP | |
99 #include "dcm_utils.h" | |
100 #include "dcm_state.h" | |
101 #include "dcm_env.h" | |
102 #endif | |
103 #include "dcm_f.h" | |
104 #ifdef UART | |
105 #include "psa_uart.h" | |
106 #include "cmh_uart.h" | |
107 #endif /*UART*/ | |
108 | |
109 #ifdef FF_PSI | |
110 #include "psa_psi.h" | |
111 #include "cmh_psi.h" | |
112 #endif /*FF_PSI*/ | |
113 | |
114 #include "cmh_phb.h" | |
115 | |
116 #include "psa_sim.h" | |
117 #include "cmh_sim.h" | |
118 | |
119 /*==== CONSTANTS ==================================================*/ | |
120 | |
121 /*==== TYPES ======================================================*/ | |
122 | |
123 /*==== EXPORT =====================================================*/ | |
124 | |
125 /*==== VARIABLES ==================================================*/ | |
126 | |
127 #if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E) | |
128 ULONG ipAddress; | |
129 | |
130 GLOBAL SHORT cmhCC_PPP_Established (ULONG ip_address,USHORT max_receive_unit, | |
131 ULONG dns1, ULONG dns2); | |
132 GLOBAL SHORT cmhCC_PPP_Terminated (void); | |
133 #endif | |
134 | |
135 #ifdef CO_UDP_IP | |
136 GLOBAL SHORT cmhCC_IPA_Configurated (void); | |
137 GLOBAL SHORT cmhCC_UDPA_Configurated (void); | |
138 GLOBAL SHORT cmhCC_UDPA_Deconfigurated (void); | |
139 #endif /* CO_UDP_IP */ | |
140 | |
141 | |
142 /*==== FUNCTIONS ==================================================*/ | |
143 | |
144 /* | |
145 +-------------------------------------------------------------------+ | |
146 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
147 | ROUTINE : cmhCC_CallAlerted | | |
148 +-------------------------------------------------------------------+ | |
149 | |
150 PURPOSE : called party is alerted | |
151 | |
152 */ | |
153 | |
154 GLOBAL void cmhCC_CallAlerted ( SHORT cId ) | |
155 { | |
156 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
157 UBYTE idx; | |
158 | |
159 TRACE_FUNCTION ("cmhCC_CallAlerted()"); | |
160 | |
161 /* | |
162 *------------------------------------------------------------------- | |
163 * process event | |
164 *------------------------------------------------------------------- | |
165 */ | |
166 if (ctb->prgDesc EQ PROG_NOT_PRES) | |
167 { | |
168 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
169 { | |
170 R_AT( RAT_CPI, idx ) | |
171 ( cId+1, | |
172 CPI_MSG_Alert, | |
173 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
174 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
175 ctb->curCs); | |
176 } | |
177 } | |
178 return; | |
179 } | |
180 | |
181 /* | |
182 +-------------------------------------------------------------------+ | |
183 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
184 | ROUTINE : cmhCC_CallProceeding | | |
185 +-------------------------------------------------------------------+ | |
186 | |
187 PURPOSE : call proceed indication | |
188 | |
189 */ | |
190 | |
191 GLOBAL void cmhCC_CallProceeding ( SHORT cId ) | |
192 { | |
193 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
194 T_ACI_CPI_MSG msgType; | |
195 SHORT idx; | |
196 | |
197 TRACE_FUNCTION ("cmhCC_CallProceeding()"); | |
198 | |
199 /* | |
200 *------------------------------------------------------------------- | |
201 * process event | |
202 *------------------------------------------------------------------- | |
203 */ | |
204 switch( ccShrdPrm.msgType ) | |
205 { | |
206 case( MT_SETUP ): msgType = CPI_MSG_Setup; break; | |
207 case( MT_DISC ): | |
208 switch (ctb->calStat) | |
209 { | |
210 case NO_VLD_CS: | |
211 case CS_ACT_REQ: | |
212 case CS_CPL_REQ: | |
213 case CS_DSC_REQ: | |
214 break; | |
215 default: | |
216 return; | |
217 } | |
218 msgType = CPI_MSG_Disc; | |
219 break; | |
220 case( MT_ALRT ): msgType = CPI_MSG_Alert; break; | |
221 case( MT_PROC ): msgType = CPI_MSG_Proc; break; | |
222 case( MT_PROGR ): msgType = CPI_MSG_Progr; break; | |
223 /* case( MT_CONN ): msgType = CPI_MSG_Conn; break; */ | |
224 case( MT_CONN ): return; /* CPI is generated in cmhCC_CallConnected */ | |
225 default: TRACE_EVENT("UNEXP MSG TYPE IN CC SHRD PARM"); | |
226 return; | |
227 } | |
228 | |
229 /* ctb->curCs = MNCC_CAUSE_NO_MS_CAUSE; */ | |
230 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
231 { | |
232 R_AT( RAT_CPI, idx ) | |
233 ( cId+1, | |
234 msgType, | |
235 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
236 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
237 ctb->curCs); | |
238 } | |
239 | |
240 return; | |
241 } | |
242 | |
243 /* | |
244 +-------------------------------------------------------------------+ | |
245 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
246 | ROUTINE : cmhCC_CallConnected | | |
247 +-------------------------------------------------------------------+ | |
248 | |
249 PURPOSE : call is connected | |
250 | |
251 */ | |
252 | |
253 GLOBAL void cmhCC_CallConnected ( SHORT cId ) | |
254 { | |
255 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
256 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
257 CHAR numBuf[MAX_CC_CALLING_NUMBER+1]; /* buffers calling number + '\0' */ | |
258 CHAR subBuf[SUB_LENGTH+1]; /* buffers subaddress 'subaddress\0' */ | |
259 T_ACI_TOA toaBuf; /* buffers type of address */ | |
260 T_ACI_TOS tosBuf; /* buffers type of subaddress */ | |
261 UBYTE cmdBuf; /* buffers current command */ | |
262 UBYTE srcBuf; /* buffers current command source */ | |
263 SHORT idx; | |
264 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
265 | |
266 TRACE_FUNCTION ("cmhCC_CallConnected()"); | |
267 | |
268 /* check for command context */ | |
269 switch(ctb->curCmd) | |
270 { | |
271 case(AT_CMD_D): | |
272 case(AT_CMD_A): | |
273 case(AT_CMD_CHLD): | |
274 break; | |
275 | |
276 default: | |
277 TRACE_EVENT_P1("cmhCC_CallConnected(): wrong command context %d", ctb->curCmd); | |
278 return; | |
279 } | |
280 | |
281 /* call progress information */ | |
282 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
283 { | |
284 R_AT( RAT_CPI, idx ) | |
285 (cId+1, | |
286 CPI_MSG_Conn, | |
287 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
288 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
289 ctb->curCs); | |
290 } | |
291 | |
292 /* process event for D, A and +CHLD command */ | |
293 pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm; | |
294 | |
295 if (ctb->curCmd EQ AT_CMD_D) | |
296 { | |
297 /* Check if user allows Connected Line Presentation: FTA 31.1.3.1 */ | |
298 switch (ctb->clgPty.present) | |
299 { | |
300 case (PRES_PRES_ALLOW): /* presentation allowed FTA 31.1.3.1 */ | |
301 TRACE_EVENT ("cmhCC_CallConnected(): presentation allowed !"); | |
302 break; | |
303 | |
304 case (PRES_NOT_PRES): | |
305 TRACE_EVENT ("cmhCC_CallConnected(): presentation not present !"); | |
306 break; | |
307 | |
308 case (PRES_PRES_REST): /* presentation restricted FTA 31.1.4.2 procedure 1 */ | |
309 TRACE_EVENT ("cmhCC_CallConnected(): presentation restricted !"); | |
310 /* | |
311 * R_AT( RAT_COLR, ccShrdPrm.???.???.??? ) | |
312 * ( COLR_STAT_??? ); | |
313 */ | |
314 break; | |
315 | |
316 case (PRES_NUMB_NOT_AVAIL): /* number not available due to interworking FTA 31.1.4.2 procedure 2 */ | |
317 TRACE_EVENT ("cmhCC_CallConnected(): number not available due to interworking !"); | |
318 /* | |
319 * R_AT( RAT_COLR, ccShrdPrm.???.???.??? ) | |
320 * ( COLR_STAT_??? ); | |
321 */ | |
322 break; | |
323 | |
324 default: | |
325 TRACE_EVENT ("[ERR] cmhCC_CallConnected(): pCtbNtry->clgPty.present = UNKNOWN"); | |
326 return; | |
327 | |
328 } | |
329 | |
330 if ((ctb->clgPty.present NEQ PRES_NOT_PRES) /* any .present indicator received from MSC? */ | |
331 AND (ctb->clgPty.c_num EQ 0) ) /* but no number available? */ | |
332 { | |
333 ; /* do nothig */ | |
334 } | |
335 else | |
336 { | |
337 /* | |
338 * This function call (rAT_PlusCOLP) informs MWF/BMI about | |
339 * presentation of the called number on display. | |
340 * If MFW did not receive this function call, then it should | |
341 * not display the number after querying the call state with | |
342 * qAT_PercentCAL() where it gets the typed in called number, unfortunately | |
343 */ | |
344 R_AT( RAT_COLP, ctb->curSrc ) | |
345 ( COLP_STAT_NotPresent, | |
346 psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ), | |
347 cmhCC_ctbGetClrNumTyp( cId, &toaBuf ), | |
348 psaCC_ctbClrAdr2Sub( cId, subBuf ), | |
349 cmhCC_ctbGetClrSubTyp( cId, &tosBuf ), | |
350 psaCC_ctbGetAlpha( cId) ); | |
351 } | |
352 } | |
353 | |
354 | |
355 /* reset CMOD to single mode */ | |
356 ccShrdPrm.CMODmode = CMOD_MOD_Single; | |
357 | |
358 switch(calltype) | |
359 { | |
360 /* Speech Call */ | |
361 case( VOICE_CALL ): | |
362 cmdBuf = ctb->curCmd; | |
363 srcBuf = ctb->curSrc; | |
364 | |
365 /* reset CMOD to single mode */ | |
366 if( ctb->BC[1].bearer_serv NEQ BEARER_SERV_NOT_PRES ) | |
367 { | |
368 ccShrdPrm.CMODmode = CMOD_MOD_Single; | |
369 } | |
370 | |
371 /* | |
372 * check if connect is expected | |
373 */ | |
374 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
375 { | |
376 if( pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */ | |
377 { | |
378 | |
379 #ifdef SIM_TOOLKIT | |
380 if( ctb->SATinv ) | |
381 { | |
382 cmhSAT_CallCncted(); | |
383 ctb->SATinv = FALSE; /* unsent */ | |
384 } | |
385 #endif /* SIM_TOOLKIT */ | |
386 if(!cmhCC_atdsendok(cId)) /* if OK hasn't been sent right after MNCC_SETUP_REQ, then send it now */ | |
387 { | |
388 /* needed for RAT_OK in MFW... Temp until tasks are separated */ | |
389 cmhCC_PrepareCmdEnd (cId, NULL, NULL); | |
390 | |
391 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
392 } | |
393 | |
394 /* log result */ | |
395 cmh_logRslt ( srcBuf, RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
396 } | |
397 } | |
398 cmhCC_PrepareCmdEnd (cId, NULL, NULL); | |
399 break; | |
400 | |
401 #if defined (FAX_AND_DATA) AND defined (DTI) | |
402 | |
403 /* in case of a supported data call */ | |
404 case(TRANS_CALL): | |
405 case(NON_TRANS_CALL): | |
406 case(FAX_CALL): | |
407 #ifdef FF_TCP_IP | |
408 /* PPP call initialisation (AAA - PPP - L2R) */ | |
409 case(PPP_CALL): | |
410 #endif /* FF_TCP_IP */ | |
411 /* wait for TCH if not assigned */ | |
412 if( ccShrdPrm.TCHasg ) | |
413 { | |
414 /* activate RA connection: in case of failure clear call ! */ | |
415 ccShrdPrm.datStat = DS_ACT_REQ; | |
416 | |
417 if (cmhRA_Activate( ctb->curSrc, ctb->curCmd, cId ) NEQ AT_EXCT) | |
418 { | |
419 TRACE_EVENT("RA ACTIVATION FAILURE -> DISC CALL"); | |
420 ccShrdPrm.datStat = DS_IDL; | |
421 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
422 psaCC_ClearCall (cId); | |
423 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
424 /* check impact for SAT commands */ | |
425 cmhSAT_OpChnCSDDown( cId, TPL_NONE ); | |
426 #endif /* SIM TOOLKIT AND FF_SAT_E */ | |
427 } | |
428 } | |
429 break; | |
430 | |
431 #if defined(CO_UDP_IP) OR defined(FF_GPF_TCPIP) | |
432 #ifdef CO_UDP_IP | |
433 case(UDPIP_CALL): | |
434 #endif | |
435 #ifdef FF_GPF_TCPIP | |
436 case(TCPIP_CALL): | |
437 #endif | |
438 /* wait for TCH if not assigned */ | |
439 if( ccShrdPrm.TCHasg ) | |
440 { | |
441 if (wap_state NEQ Wap_Not_Init) /* release call */ | |
442 { | |
443 TRACE_EVENT("FATAL ERROR in cmhCC_CallConnected: WAP Call already in process"); | |
444 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
445 psaCC_ClearCall (cId); | |
446 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
447 cmhSAT_OpChnCSDDown( cId, UDP ); | |
448 #endif /* SIM TOOLKIT AND FF_SAT_E */ | |
449 break; | |
450 } | |
451 else | |
452 { | |
453 TRACE_EVENT("WAP call initialisation"); | |
454 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
455 if( cmhSAT_OpChnChckCSD(UDP) ) | |
456 { | |
457 psaTCPIP_Activate(ctb->curSrc, 0, | |
458 cId, | |
459 TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP, | |
460 TCPIP_CONNECTION_TYPE_CSD_WAP, | |
461 cmhSAT_OpChnUDPActiveCsd) ; | |
462 } | |
463 else | |
464 #endif /* SIM TOOLKIT AND FF_SAT_E */ | |
465 { | |
466 if(is_gpf_tcpip_call()) | |
467 { | |
468 psaTCPIP_Activate(ctb->curSrc, 0 /* Change this! */, | |
469 cId, | |
470 TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_TCPIP, | |
471 TCPIP_CONNECTION_TYPE_CSD_WAP, | |
472 psaTCPIP_act_csd_callback) ; | |
473 } | |
474 else | |
475 { | |
476 psaTCPIP_Activate(ctb->curSrc, 0 /* Change this! */, | |
477 cId, | |
478 TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP, | |
479 TCPIP_CONNECTION_TYPE_CSD_WAP, | |
480 psaTCPIP_act_csd_callback) ; | |
481 } | |
482 } | |
483 } | |
484 } | |
485 break; | |
486 #endif /* defined(WAP) OR defined(FF_GPF_TCPIP) */ | |
487 | |
488 /* in case of an unsupported data call */ | |
489 case(UNSUP_DATA_CALL): | |
490 TRACE_EVENT("UNSUPPORTED DATA CALL -> DISC CALL"); | |
491 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
492 psaCC_ClearCall (cId); | |
493 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
494 /* check impact for SAT commands */ | |
495 cmhSAT_OpChnCSDDown( cId, TPL_NONE ); | |
496 #endif /* SIM TOOLKIT AND SAT_SAT_E */ | |
497 break; | |
498 | |
499 #endif /* of #ifdef FAX_AND_DATA */ | |
500 | |
501 default: | |
502 TRACE_ERROR("Wrong call type"); | |
503 } | |
504 } | |
505 | |
506 /* | |
507 +-------------------------------------------------------------------+ | |
508 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
509 | ROUTINE : process_CHLDaddInfo | | |
510 +-------------------------------------------------------------------+ | |
511 | |
512 PURPOSE : Local function: processes parameter CHLDaddInfo (continue action that | |
513 had to wait for a call to be connected first). | |
514 */ | |
515 /* Held call is being disconnected */ | |
516 #define DISCONNECT_HELD (0) | |
517 /* Call is being put on hold */ | |
518 #define CALL_HELD (1) | |
519 /* Multyparty call is being put on hold */ | |
520 #define MTPTY_HELD (2) | |
521 | |
522 LOCAL void process_CHLDaddInfo( UBYTE srcId, UBYTE context ) | |
523 { | |
524 /* param context allows to differentiate some special case */ | |
525 SHORT addId; | |
526 T_CC_CMD_PRM *pCCCmdPrm = &cmhPrm[srcId].ccCmdPrm; | |
527 | |
528 TRACE_FUNCTION("process_CHLDaddInfo( )"); | |
529 | |
530 for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ ) | |
531 ; | |
532 | |
533 switch( CHLDaddInfo ) | |
534 { | |
535 case( CHLD_ADD_INFO_ACC_CAL ): | |
536 cmhCC_AcceptCall(addId, srcId, AT_CMD_CHLD); | |
537 return; | |
538 | |
539 case (CHLD_ADD_INFO_DIAL_CAL): | |
540 cmhCC_NewCall(addId, srcId, AT_CMD_D); | |
541 return; | |
542 | |
543 case( CHLD_ADD_INFO_RTV_CAL ): | |
544 if(context NEQ CALL_HELD) | |
545 { | |
546 cmhCC_RetrieveCall(addId, srcId); | |
547 return; | |
548 } | |
549 break; | |
550 | |
551 case (NO_CHLD_ADD_INFO): | |
552 if(context EQ DISCONNECT_HELD) | |
553 { | |
554 return; /* May happen for CCBS recall, disconnecting the active call */ | |
555 } | |
556 break; | |
557 } | |
558 | |
559 TRACE_EVENT("UNEXP ADD CHLD INFO"); | |
560 } | |
561 | |
562 /* | |
563 +-------------------------------------------------------------------+ | |
564 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
565 | ROUTINE : cmhCC_CallDisconnected | | |
566 +-------------------------------------------------------------------+ | |
567 | |
568 PURPOSE : call is disconnected: process event for D and A command, abort command or no command | |
569 */ | |
570 | |
571 #ifdef SIM_TOOLKIT | |
572 LOCAL void cmhCC_CallDisc_whiledialling_sat(SHORT cId, BOOL *send_atresult) | |
573 { | |
574 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
575 UBYTE network_cause; | |
576 | |
577 if( !ctb->SATinv ) | |
578 { | |
579 return; | |
580 } | |
581 | |
582 TRACE_FUNCTION("cmhCC_CallDisc_whiledialling_sat"); | |
583 | |
584 switch(ctb->curCmd) | |
585 { | |
586 case( AT_CMD_A ): | |
587 /* if connect is expected */ | |
588 if( cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg NEQ 0 ) | |
589 { | |
590 if( ctb->SATinv & SAT_REDIAL ) | |
591 { | |
592 ctb->calStat = CS_SAT_REQ; | |
593 return; | |
594 } | |
595 | |
596 /* return network error cause GSM 11.14 / 12.12.3 */ | |
597 if(GET_CAUSE_VALUE(ctb->nrmCs) EQ NOT_PRESENT_8BIT) | |
598 { | |
599 network_cause = ADD_NO_CAUSE; | |
600 } | |
601 else | |
602 network_cause = GET_CAUSE_VALUE(ctb->nrmCs)|0x80; | |
603 | |
604 *send_atresult = cmhSAT_NtwErr(network_cause); | |
605 } | |
606 break; | |
607 | |
608 case( AT_CMD_ABRT ): | |
609 /* if disconnect is expected */ | |
610 if( cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg NEQ 0 ) | |
611 { | |
612 cmhSAT_UserClear(); | |
613 } | |
614 break; | |
615 #ifdef FF_SAT_E | |
616 default: | |
617 cmhSAT_OpChnCSDDown( cId, TPL_DONT_CARE ); | |
618 break; | |
619 #endif /* FF_SAT_E */ | |
620 } | |
621 } | |
622 #endif /*#ifdef SIM_TOOLKIT*/ | |
623 /* | |
624 +------------------------------------------------------------------------------ | |
625 | Function : cmhCC_CallDisc_connectingphase | |
626 +------------------------------------------------------------------------------ | |
627 | Description : This function checks on call type and disconnects the | |
628 | different calltypes. | |
629 | | |
630 | Parameters : call id | |
631 | | |
632 | Return : | |
633 | | |
634 +------------------------------------------------------------------------------ | |
635 */ | |
636 | |
637 LOCAL void cmhCC_CallDisc_connectingphase ( SHORT cId ) | |
638 { | |
639 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
640 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
641 BOOL atRslt = TRUE; /* flags to send a AT result code */ | |
642 | |
643 TRACE_FUNCTION("cmhCC_CallDisc_connectingphase"); | |
644 | |
645 /* reset CMOD to single mode */ | |
646 ccShrdPrm.CMODmode = CMOD_MOD_Single; | |
647 | |
648 #ifdef SIM_TOOLKIT | |
649 /* handling of SAT invoked call */ | |
650 cmhCC_CallDisc_whiledialling_sat(cId, &atRslt); | |
651 #endif /* SIM_TOOLKIT */ | |
652 | |
653 /* Unflag Multiconnect/disconnect Flags */ | |
654 if( ctb->curSrc NEQ CMD_SRC_NONE ) | |
655 { | |
656 cmhCC_tstAndUnflagCall( cId, | |
657 &cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg ); | |
658 cmhCC_tstAndUnflagCall( cId, | |
659 &cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg ); | |
660 } | |
661 | |
662 /* CCBS handling */ | |
663 if( ctb->curCmd EQ AT_CMD_D AND | |
664 ctb->CCBSstat EQ CCBSS_PSSBL ) | |
665 { | |
666 cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_Possible, | |
667 CCBS_STAT_NotPresent, NULL ); | |
668 } | |
669 | |
670 switch( calltype ) | |
671 { | |
672 case( VOICE_CALL ): /* voice call */ | |
673 /* CSSU indications handling */ | |
674 if( ctb->calStat EQ CS_HLD ) | |
675 { | |
676 if( ctb->curCmd NEQ AT_CMD_NONE ) | |
677 { | |
678 send_CSSX_notification(cId, | |
679 CSSX_CODE_HeldCallRel, | |
680 ACI_NumParmNotPresent, | |
681 NULL, NULL, NULL, NULL); | |
682 } | |
683 } | |
684 break; | |
685 | |
686 #if defined (FAX_AND_DATA) AND defined (DTI) | |
687 case(TRANS_CALL): | |
688 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
689 { | |
690 ccShrdPrm.datStat = DS_STOP_REQ; | |
691 cmhTRA_Deactivate (); | |
692 return; | |
693 } | |
694 break; | |
695 | |
696 case(NON_TRANS_CALL): | |
697 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
698 { | |
699 ccShrdPrm.datStat = DS_STOP_REQ; | |
700 cmhL2R_Deactivate (); | |
701 return; | |
702 } | |
703 break; | |
704 | |
705 #ifdef FF_FAX | |
706 case( FAX_CALL ): | |
707 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
708 { | |
709 ccShrdPrm.datStat = DS_STOP_REQ; | |
710 cmhT30_Deactivate (); | |
711 return; | |
712 } | |
713 break; | |
714 #endif /* FF_FAX */ | |
715 | |
716 #ifdef CO_UDP_IP | |
717 case(UDPIP_CALL): | |
718 /* check if a UDP/IP call is in process... If yes then end call */ | |
719 if (ccShrdPrm.datStat NEQ DS_IDL) | |
720 { | |
721 ccShrdPrm.datStat = DS_STOP_REQ; | |
722 | |
723 /* Check command context to know if lower layers of PPP already are down or not */ | |
724 if(ctb->curCmd EQ AT_CMD_NONE OR | |
725 ctb->curCmd EQ AT_CMD_D ) | |
726 { | |
727 /* If PPP connected - send terminate request to PPP */ | |
728 if(pppShrdPrm.state EQ PPP_ESTABLISHED) | |
729 { | |
730 cmhPPP_Terminate(DWN); | |
731 } | |
732 return; | |
733 } | |
734 } | |
735 break; | |
736 #endif /* CO_UDP_IP */ | |
737 | |
738 #endif /* of #ifdef FAX_AND_DATA */ | |
739 } | |
740 | |
741 /* Command is done: send response to user if not suppressed */ | |
742 /* if(atRslt) cmhCC_SndDiscRsn( cId ); */ /* to pass 26.8.1.2.8.1 */ | |
743 } | |
744 | |
745 LOCAL void call_disconnected_data_call(T_CC_CALL_TYPE calltype, SHORT cId) | |
746 { | |
747 TRACE_FUNCTION("call_disconnected_data_call"); | |
748 | |
749 /* Local disconnection for PPP if peer shuts down the line | |
750 instead of normal PPP shutdown */ | |
751 switch( calltype ) | |
752 { | |
753 #if defined (FAX_AND_DATA) AND defined (DTI) | |
754 /* check if a WAP call is in process... If yes then end call */ | |
755 #if defined(CO_UDP_IP) || defined(FF_TCP_IP) | |
756 | |
757 #ifdef CO_UDP_IP | |
758 case(UDPIP_CALL): | |
759 #endif /* CO_UDP_IP */ | |
760 | |
761 #if defined(FF_GPF_TCPIP) | |
762 case (TCPIP_CALL): | |
763 #endif /* FF_GPF_TCPIP */ | |
764 | |
765 #ifdef FF_TCP_IP | |
766 case PPP_CALL: | |
767 pppShrdPrm.is_PPP_CALL = FALSE; | |
768 TRACE_EVENT ("is_PPP_CALL resetted"); | |
769 #endif /* FF_TCP_IP */ | |
770 | |
771 if (ccShrdPrm.datStat NEQ DS_IDL) | |
772 { | |
773 ccShrdPrm.datStat = DS_STOP_REQ; | |
774 | |
775 /* Only local disconnection is possible in this case, the call is already disconnected ! | |
776 if(pppShrdPrm.state EQ PPP_ESTABLISHED) | |
777 cmhPPP_Terminate(UP); */ | |
778 | |
779 if((pppShrdPrm.state EQ PPP_ESTABLISHED) OR | |
780 (pppShrdPrm.state EQ PPP_ESTABLISH) OR | |
781 (pppShrdPrm.state EQ PPP_TERMINATE)) | |
782 { | |
783 cmhPPP_Terminate(DWN); | |
784 } | |
785 else if (wap_state > Wap_Not_Init AND | |
786 wap_state <= UDPA_Deactivation) | |
787 { | |
788 cmhPPP_Terminated(); /* Trigger termination of TCPIP if PPP did not yet start (ACI-FIX-9317)*/ | |
789 } | |
790 } | |
791 break; | |
792 #endif /* of WAP || FF_TCP_IP || SAT E */ | |
793 | |
794 case(TRANS_CALL): | |
795 case(NON_TRANS_CALL): | |
796 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
797 { | |
798 ccShrdPrm.datStat = DS_STOP_REQ; | |
799 if(calltype EQ TRANS_CALL) | |
800 { | |
801 cmhTRA_Deactivate (); | |
802 } | |
803 else | |
804 { | |
805 cmhL2R_Deactivate (); | |
806 } | |
807 } | |
808 break; | |
809 #endif /* FAX_AND_DATA */ | |
810 | |
811 default: | |
812 break; | |
813 } /* end switch */ | |
814 } /* end switch */ | |
815 | |
816 LOCAL void cmhCC_CallDisc_userinitiated ( SHORT cId ) | |
817 { | |
818 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
819 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
820 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
821 #ifdef FF_PSI | |
822 T_ACI_DTI_PRC_PSI *src_infos = NULL; | |
823 #endif /*FF_PSI*/ | |
824 UBYTE cmdBuf; /* buffers current command */ | |
825 UBYTE srcBuf; /* buffers current command source */ | |
826 | |
827 TRACE_FUNCTION("cmhCC_CallDisc_userinitiated"); | |
828 | |
829 /* process event for H and +CHUP command */ | |
830 pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm; | |
831 | |
832 /* reset CMOD to single mode */ | |
833 ccShrdPrm.CMODmode = CMOD_MOD_Single; | |
834 | |
835 call_disconnected_data_call(calltype, cId); | |
836 | |
837 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
838 | |
839 /* if ATH before the call is connected, the flag must be cleared */ | |
840 cmhCC_tstAndUnflagCall (cId, &(pCCCmdPrm -> mltyCncFlg)); | |
841 | |
842 /* check if disconnect is expected */ | |
843 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg))) | |
844 { | |
845 #if defined (FF_WAP) || defined (FF_SAT_E) | |
846 /* Check if the WAP stack is down */ | |
847 if((pCCCmdPrm -> mltyDscFlg EQ 0) AND | |
848 (ccShrdPrm.wapStat EQ CC_WAP_STACK_DOWN)) | |
849 #else | |
850 if( pCCCmdPrm -> mltyDscFlg EQ 0 ) | |
851 #endif /* WAP || SAT E */ | |
852 /****************/ | |
853 /* if last call */ | |
854 /****************/ | |
855 { | |
856 #ifdef SIM_TOOLKIT | |
857 if( ctb->SATinv ) | |
858 { | |
859 cmhSAT_StartPendingCall( ); | |
860 } | |
861 else | |
862 #endif /* SIM_TOOLKIT */ | |
863 { | |
864 if (cmdBuf EQ AT_CMD_Z) | |
865 { | |
866 cmh_Reset ( srcBuf, TRUE ); | |
867 R_AT(RAT_Z, srcBuf)(); | |
868 } | |
869 #if defined (FF_PSI) AND defined (DTI) | |
870 src_infos = find_element (psi_src_params, srcBuf, cmhPSItest_srcId); | |
871 if (src_infos EQ NULL) | |
872 #endif /*FF_PSI*/ | |
873 #ifdef UART | |
874 { | |
875 if (uartShrdPrm.dtr_clearcall EQ TRUE) | |
876 { | |
877 uartShrdPrm.dtr_clearcall = FALSE; | |
878 R_AT( RAT_NO_CARRIER, srcBuf ) ( cmdBuf, cId+1 ); | |
879 cmh_logRslt ( srcBuf, | |
880 RAT_NO_CARRIER, cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
881 } | |
882 else | |
883 { | |
884 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
885 | |
886 /* log result */ | |
887 cmh_logRslt ( srcBuf, | |
888 RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
889 } | |
890 } | |
891 #endif /*UART*/ | |
892 #if defined (FF_PSI) AND defined (DTI) | |
893 else | |
894 { | |
895 if (psiShrdPrm.dtr_clearcall EQ TRUE) | |
896 { | |
897 psiShrdPrm.dtr_clearcall = FALSE; | |
898 R_AT( RAT_NO_CARRIER, srcBuf ) ( cmdBuf, cId+1 ); | |
899 cmh_logRslt ( srcBuf, | |
900 RAT_NO_CARRIER, cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
901 } | |
902 else | |
903 { | |
904 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
905 | |
906 /* log result */ | |
907 cmh_logRslt ( srcBuf, | |
908 RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
909 } | |
910 } | |
911 #endif /*FF_PSI*/ | |
912 } | |
913 } | |
914 } | |
915 | |
916 /* inform call owner about disconnect */ | |
917 if( srcBuf EQ ctb->calOwn | |
918 #ifdef SIM_TOOLKIT | |
919 AND | |
920 !ctb->SATinv ) | |
921 #else | |
922 ) | |
923 #endif | |
924 { | |
925 /* do nothing: owner knows already... */ | |
926 /* EXCEPT if !ctb->SATinv: a SAT call setup has been started, and all previous | |
927 calls had to be disconnected (because of SAT command qualifer) */ | |
928 } | |
929 else | |
930 { | |
931 R_AT( RAT_NO_CARRIER, ctb->calOwn ) ( AT_CMD_NONE, cId+1 ); | |
932 cmh_logRslt ( srcBuf, RAT_NO_CARRIER, cmdBuf, | |
933 (SHORT)(cId+1), -1, -1 ); | |
934 } | |
935 } | |
936 | |
937 /* process disconnection of an held call: +CHLD command context */ | |
938 LOCAL void cmhCC_CallDisc_heldcall ( SHORT cId ) | |
939 { | |
940 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
941 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
942 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
943 UBYTE cmdBuf; /* buffers current command */ | |
944 UBYTE srcBuf; /* buffers current command source */ | |
945 | |
946 TRACE_FUNCTION("cmhCC_CallDisc_heldcall"); | |
947 | |
948 pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm; | |
949 | |
950 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
951 | |
952 if( pCCCmdPrm -> mltyDscFlg EQ 0 AND | |
953 pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */ | |
954 { | |
955 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
956 | |
957 /* log result */ | |
958 cmh_logRslt ( srcBuf, RAT_OK, | |
959 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
960 } | |
961 /* check if disconnect is expected */ | |
962 else if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg))) | |
963 { | |
964 if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_RelActAndAcpt AND | |
965 pCCCmdPrm -> mltyCncFlg AND pCCCmdPrm -> mltyDscFlg EQ 0 ) | |
966 { | |
967 process_CHLDaddInfo( srcBuf, DISCONNECT_HELD ); | |
968 } | |
969 else if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_Ect ) | |
970 { | |
971 cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)); /* now disconnected */ | |
972 } | |
973 | |
974 if( pCCCmdPrm -> mltyDscFlg EQ 0 AND | |
975 pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */ | |
976 { | |
977 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
978 | |
979 /* log result */ | |
980 cmh_logRslt ( srcBuf, RAT_OK, | |
981 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
982 } | |
983 } | |
984 /* check if disconnect is unexpected */ | |
985 else if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
986 { | |
987 pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */ | |
988 | |
989 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent ); | |
990 | |
991 /* log result */ | |
992 cmh_logRslt ( srcBuf, RAT_CME, cmdBuf, | |
993 -1, -1, CME_ERR_NotPresent ); | |
994 } | |
995 | |
996 /* inform call owner about disconnect */ | |
997 if( srcBuf NEQ (UBYTE)CMD_SRC_NONE AND | |
998 srcBuf NEQ ctb->calOwn ) | |
999 { | |
1000 R_AT( RAT_NO_CARRIER, ctb->calOwn ) ( AT_CMD_NONE, cId+1 ); | |
1001 } | |
1002 } | |
1003 | |
1004 /* process event for the +CTFR command.*/ | |
1005 LOCAL void cmhCC_CallDisc_transferedcall ( SHORT cId ) | |
1006 { | |
1007 T_CC_CMD_PRM *pCCCmdPrm; /* points to CC command parameters */ | |
1008 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
1009 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1010 UBYTE cmdBuf; /* buffers current command */ | |
1011 UBYTE srcBuf; /* buffers current command source */ | |
1012 RAT_ID rat_id; | |
1013 T_ACI_CME_ERR cme_err; | |
1014 | |
1015 TRACE_FUNCTION("cmhCC_CallDisc_transferedcall"); | |
1016 | |
1017 /* Get a pointer to the appropriate CC call table entry */ | |
1018 pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm; | |
1019 | |
1020 /* End of command execution here */ | |
1021 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
1022 | |
1023 (void)cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)); | |
1024 | |
1025 switch (ctb->CDStat) | |
1026 { | |
1027 case CD_Succeeded: | |
1028 rat_id = RAT_OK; | |
1029 cme_err = -1; | |
1030 break; | |
1031 | |
1032 case CD_Requested: /* No answer from the network */ | |
1033 rat_id = RAT_CME; | |
1034 cme_err = CME_ERR_Timeout; | |
1035 break; | |
1036 | |
1037 case CD_Failed: /* SS transaction failed */ | |
1038 rat_id = RAT_CME; | |
1039 cme_err = CME_ERR_OpNotSupp; | |
1040 break; | |
1041 | |
1042 default: /* Unexpected here */ | |
1043 rat_id = RAT_CME; | |
1044 cme_err = CME_ERR_Unknown; | |
1045 break; | |
1046 } | |
1047 | |
1048 if(rat_id EQ RAT_OK) | |
1049 { | |
1050 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
1051 } | |
1052 else if(rat_id EQ RAT_CME) | |
1053 { | |
1054 R_AT( RAT_CME, srcBuf ) ( cmdBuf, cme_err ); | |
1055 } | |
1056 cmh_logRslt( srcBuf, rat_id, cmdBuf, | |
1057 (SHORT)(cId+1), -1, cme_err ); | |
1058 | |
1059 ctb->CDStat = NO_VLD_CD; | |
1060 } | |
1061 | |
1062 GLOBAL void cmhCC_CallDisconnected ( SHORT cId ) | |
1063 { | |
1064 UBYTE idx; | |
1065 #if defined(FF_GPF_TCPIP) | |
1066 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
1067 #endif /* FF_GPF_TCPIP */ | |
1068 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1069 UBYTE callId = 0; | |
1070 UBYTE i = 0; | |
1071 UBYTE mptyId = 0; | |
1072 | |
1073 TRACE_FUNCTION ("cmhCC_CallDisconnected()"); | |
1074 | |
1075 /* inform advice of charge module */ | |
1076 aoc_info (cId, AOC_STOP_TIME); | |
1077 | |
1078 #if defined(FF_GPF_TCPIP) | |
1079 /* Needed if user stops call setup before app got connection conf */ | |
1080 if (calltype EQ TCPIP_CALL) | |
1081 { | |
1082 T_DCM_STATUS_IND_MSG msg; | |
1083 msg.hdr.msg_id = DCM_NEXT_CMD_STOP_MSG; | |
1084 msg.result = DCM_PS_CONN_BROKEN; | |
1085 dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF); | |
1086 } | |
1087 #endif /* FF_GPF_TCPIP */ | |
1088 | |
1089 /* | |
1090 *---------------------------------------------------------------- | |
1091 * call progress information | |
1092 *---------------------------------------------------------------- | |
1093 */ | |
1094 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1095 { | |
1096 R_AT( RAT_CPI, idx ) | |
1097 ( cId+1, | |
1098 CPI_MSG_Disc, | |
1099 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
1100 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
1101 ctb->curCs); | |
1102 } | |
1103 | |
1104 /************************* | |
1105 call was not serviced yet | |
1106 ***************************/ | |
1107 if( ctb->calOwn EQ OWN_NONE AND | |
1108 ctb->curCmd EQ AT_CMD_NONE ) | |
1109 { | |
1110 psaCC_phbAddNtry ( LMN, cId, CT_MTC, NULL ); /* add call to LMN PB */ | |
1111 | |
1112 #ifdef FF_ATI | |
1113 io_setRngInd (IO_RING_OFF, CRING_TYP_NotPresent, CRING_TYP_NotPresent ); /* V.24 Ring Indicator Line */ | |
1114 #endif | |
1115 | |
1116 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1117 { | |
1118 R_AT( RAT_CRING_OFF, idx )( cId+1 ); | |
1119 } | |
1120 return; | |
1121 } | |
1122 | |
1123 /************************* | |
1124 check for command context | |
1125 ***************************/ | |
1126 switch( ctb->curCmd ) | |
1127 { | |
1128 case( AT_CMD_NONE ): | |
1129 case( AT_CMD_A ): | |
1130 case( AT_CMD_D ): | |
1131 case( AT_CMD_ABRT ): | |
1132 cmhCC_CallDisc_connectingphase(cId); | |
1133 break; | |
1134 | |
1135 case( AT_CMD_H ): | |
1136 case( AT_CMD_Z ): | |
1137 case( AT_CMD_CHUP ): | |
1138 | |
1139 #ifdef FF_FAX | |
1140 case( AT_CMD_FKS ): | |
1141 case( AT_CMD_FDT ): | |
1142 case( AT_CMD_FDR ): | |
1143 #endif /* FF_FAX */ | |
1144 | |
1145 cmhCC_CallDisc_userinitiated(cId); | |
1146 break; | |
1147 | |
1148 case( AT_CMD_CHLD ): | |
1149 cmhCC_CallDisc_heldcall(cId); | |
1150 break; | |
1151 | |
1152 case( AT_CMD_CTFR ): | |
1153 cmhCC_CallDisc_transferedcall(cId); | |
1154 break; | |
1155 } /* switch */ | |
1156 | |
1157 if ( ctb NEQ NULL AND ctb->mptyStat NEQ CS_IDL) | |
1158 { | |
1159 for(;callId < MAX_CALL_NR; callId++) | |
1160 { | |
1161 if (psaCC_ctb(callId) NEQ NULL AND | |
1162 psaCC_ctb(callId)->mptyStat EQ CS_ACT ) | |
1163 { | |
1164 i++; | |
1165 if (callId NEQ cId) | |
1166 { | |
1167 mptyId = callId; | |
1168 } | |
1169 } | |
1170 } | |
1171 if (i EQ 2) | |
1172 { | |
1173 psaCC_ctb(mptyId)->mptyStat = CS_IDL; | |
1174 } | |
1175 } | |
1176 | |
1177 /* PATCH BE 03.07.00 | |
1178 * DO NOT declare the call table entry as unused: | |
1179 do not free call table at this time then every second MTC will fail if early | |
1180 assignment is used. */ | |
1181 | |
1182 return; | |
1183 } | |
1184 | |
1185 /* | |
1186 +-------------------------------------------------------------------+ | |
1187 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1188 | ROUTINE : cmhCC_CallReleased | | |
1189 +-------------------------------------------------------------------+ | |
1190 | |
1191 PURPOSE : call is released | |
1192 | |
1193 */ | |
1194 | |
1195 GLOBAL void cmhCC_CallReleased ( SHORT cId ) | |
1196 { | |
1197 UBYTE cmdBuf; /* buffers current command */ | |
1198 UBYTE srcBuf; /* buffers current command source */ | |
1199 T_CC_CMD_PRM *pCCCmdPrm; /* points to CC command parameters */ | |
1200 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
1201 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1202 UBYTE idx; | |
1203 UBYTE callId = 0; | |
1204 UBYTE i = 0; | |
1205 UBYTE mptyId = 0; | |
1206 | |
1207 TRACE_FUNCTION ("cmhCC_CallReleased()"); | |
1208 | |
1209 /* inform advice of charge module */ | |
1210 aoc_info (cId, AOC_STOP_TIME); | |
1211 | |
1212 #if defined(FF_GPF_TCPIP) | |
1213 /* This will happen if network got lost during a CSD call */ | |
1214 if (calltype EQ TCPIP_CALL) | |
1215 { | |
1216 T_DCM_STATUS_IND_MSG msg; | |
1217 msg.hdr.msg_id = DCM_ERROR_IND_MSG; | |
1218 msg.result = DCM_PS_CONN_BROKEN; | |
1219 dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF); | |
1220 } | |
1221 #endif /* FF_GPF_TCPIP */ | |
1222 | |
1223 /* check for command context */ | |
1224 switch( ctb->curCmd ) | |
1225 { | |
1226 case( AT_CMD_A ): | |
1227 case( AT_CMD_D ): | |
1228 case( AT_CMD_NONE ): | |
1229 /* process event for A, D or no command */ | |
1230 | |
1231 /* handling for CCBS prolonged session */ | |
1232 | |
1233 if( ctb->curSrc NEQ CMD_SRC_NONE ) | |
1234 { | |
1235 cmhCC_tstAndUnflagCall( cId, &cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg ); | |
1236 cmhCC_tstAndUnflagCall( cId, &cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg ); | |
1237 } | |
1238 | |
1239 if (ctb->CCBSstat EQ CCBSS_PSSBL ) | |
1240 { | |
1241 cmhrat_ccbs (CMD_SRC_MAX, CCBS_IND_PossibilityTimedOut, | |
1242 CCBS_STAT_NotPresent, NULL ); | |
1243 break; /* skip the rest */ | |
1244 } | |
1245 if (ctb->CCBSstat EQ CCBSS_REQ) | |
1246 { | |
1247 break; /* skip the rest */ | |
1248 } | |
1249 if (ctb->calType EQ CT_NI_MOC) | |
1250 { | |
1251 cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_RecallTimedOut, | |
1252 CCBS_STAT_NotPresent, NULL ); | |
1253 break; /* skip the rest */ | |
1254 } | |
1255 | |
1256 /* call clean up */ | |
1257 switch( calltype ) | |
1258 { | |
1259 case( VOICE_CALL ): | |
1260 ; | |
1261 break; | |
1262 | |
1263 #ifdef FF_GPF_TCPIP | |
1264 case( TCPIP_CALL ): | |
1265 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
1266 { | |
1267 ccShrdPrm.datStat = DS_STOP_REQ; | |
1268 pppShrdPrm.state = PPP_UNDEFINED; /* Otherwise PPP and TCPIP doesn't go down well */ | |
1269 cmhPPP_Terminate(DWN); | |
1270 ctb->curCmd = AT_CMD_NONE; | |
1271 } | |
1272 break; | |
1273 #endif /* FF_GPF_TCPIP */ | |
1274 | |
1275 #if defined (FAX_AND_DATA) AND defined (DTI) | |
1276 case( TRANS_CALL ): | |
1277 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
1278 { | |
1279 ccShrdPrm.datStat = DS_STOP_REQ; | |
1280 cmhTRA_Deactivate (); | |
1281 } | |
1282 break; | |
1283 | |
1284 case( NON_TRANS_CALL ): | |
1285 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
1286 { | |
1287 ccShrdPrm.datStat = DS_STOP_REQ; | |
1288 cmhL2R_Deactivate (); | |
1289 } | |
1290 break; | |
1291 | |
1292 #ifdef CO_UDP_IP | |
1293 case( UDPIP_CALL ): | |
1294 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
1295 { | |
1296 ccShrdPrm.datStat = DS_STOP_REQ; | |
1297 cmhPPP_Terminate(DWN); | |
1298 ctb->curCmd = AT_CMD_NONE; | |
1299 } | |
1300 break; | |
1301 #endif /* CO_UDP_IP */ | |
1302 | |
1303 #ifdef FF_FAX | |
1304 case( FAX_CALL ): | |
1305 if( ccShrdPrm.datStat NEQ DS_IDL ) | |
1306 { | |
1307 ccShrdPrm.datStat = DS_STOP_REQ; | |
1308 cmhT30_Deactivate (); | |
1309 } | |
1310 #endif /* FF_FAX */ | |
1311 #endif /* FAX_AND_DATA */ | |
1312 | |
1313 } | |
1314 cmhCC_SndDiscRsn( cId ); | |
1315 break; | |
1316 | |
1317 case( AT_CMD_H ): | |
1318 case( AT_CMD_Z ): | |
1319 case( AT_CMD_CHUP ): | |
1320 case( AT_CMD_ABRT ): | |
1321 case( AT_CMD_CHLD ): | |
1322 | |
1323 #ifdef FF_FAX | |
1324 case( AT_CMD_FKS ): | |
1325 case( AT_CMD_FDT ): | |
1326 case( AT_CMD_FDR ): | |
1327 #endif | |
1328 /* | |
1329 *---------------------------------------------------------------- | |
1330 * process event for H, Z and +CHUP command | |
1331 *---------------------------------------------------------------- | |
1332 */ | |
1333 /* | |
1334 * Bugfix for DISCONNECT_IND in CC U3 with PROGRESS_IND #8 | |
1335 */ | |
1336 cmdBuf = ctb->curCmd; | |
1337 srcBuf = ctb->curSrc; | |
1338 pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm; | |
1339 | |
1340 cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm->mltyCncFlg) ); | |
1341 cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm->mltyDscFlg) ); | |
1342 | |
1343 if ( cmdBuf EQ AT_CMD_Z AND | |
1344 pCCCmdPrm -> mltyDscFlg EQ 0 ) | |
1345 { | |
1346 cmh_Reset ( srcBuf, TRUE ); | |
1347 R_AT( RAT_Z, srcBuf)(); | |
1348 } | |
1349 | |
1350 cmhCC_PrepareCmdEnd (cId, NULL, NULL); | |
1351 | |
1352 if (ctb->curCmd NEQ AT_CMD_CHLD) /* Do not emmit OK for CHLD since this would | |
1353 occour in multiple OKs for a multi-party call */ | |
1354 { | |
1355 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
1356 } | |
1357 | |
1358 /* log result */ | |
1359 cmh_logRslt ( srcBuf, RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
1360 break; | |
1361 } | |
1362 | |
1363 /* call progress information */ | |
1364 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1365 { | |
1366 R_AT(RAT_CPI, idx)( cId+1, | |
1367 CPI_MSG_Rls, | |
1368 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
1369 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
1370 ctb->curCs); | |
1371 } | |
1372 if ( ctb NEQ NULL AND ctb->mptyStat NEQ CS_IDL) | |
1373 { | |
1374 for(;callId < MAX_CALL_NR; callId++) | |
1375 { | |
1376 if (psaCC_ctb(callId) NEQ NULL AND | |
1377 psaCC_ctb(callId)->mptyStat EQ CS_ACT ) | |
1378 { | |
1379 i++; | |
1380 if (callId NEQ cId) | |
1381 { | |
1382 mptyId = callId; | |
1383 } | |
1384 } | |
1385 } | |
1386 if (i EQ 2) | |
1387 { | |
1388 psaCC_ctb(mptyId)->mptyStat = CS_IDL; | |
1389 } | |
1390 } | |
1391 | |
1392 if (rdlPrm.rdlcId NEQ cId) | |
1393 { /* if redialling is active no clean cId entry */ | |
1394 /* declare the call table entry as unused */ | |
1395 psaCC_FreeCtbNtry (cId); | |
1396 } | |
1397 return; | |
1398 } | |
1399 | |
1400 /* | |
1401 +-------------------------------------------------------------------+ | |
1402 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1403 | ROUTINE : cmhCC_CallReleaseIndication | | |
1404 +-------------------------------------------------------------------+ | |
1405 | |
1406 PURPOSE : call release indication to give out correct call process information | |
1407 interface so that psa function can report a release ind | |
1408 */ | |
1409 | |
1410 GLOBAL void cmhCC_CPIReleaseMsg ( SHORT cId ) | |
1411 { | |
1412 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1413 UBYTE idx; | |
1414 | |
1415 TRACE_FUNCTION ("cmhCC_CPIReleaseMsg()"); | |
1416 | |
1417 /* call progress information */ | |
1418 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1419 { | |
1420 R_AT(RAT_CPI, idx)( cId+1, | |
1421 CPI_MSG_Rls, | |
1422 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
1423 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
1424 ctb->curCs); | |
1425 } | |
1426 | |
1427 return; | |
1428 } | |
1429 | |
1430 /* | |
1431 +-------------------------------------------------------------------+ | |
1432 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1433 | ROUTINE : cmhCC_CPIrejectMsg | | |
1434 +-------------------------------------------------------------------+ | |
1435 | |
1436 PURPOSE : interface so that psa function can report a reject ind. | |
1437 | |
1438 */ | |
1439 GLOBAL void cmhCC_CPIrejectMsg ( SHORT cId ) | |
1440 { | |
1441 | |
1442 UBYTE idx; | |
1443 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1444 | |
1445 TRACE_FUNCTION ("cmhCC_CPIrejectMsg()"); | |
1446 | |
1447 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1448 { | |
1449 R_AT(RAT_CPI, idx)( cId+1, | |
1450 CPI_MSG_Rjct, | |
1451 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
1452 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
1453 ctb->curCs); | |
1454 } | |
1455 /************************* | |
1456 call was not serviced yet | |
1457 ***************************/ | |
1458 if( ctb->calOwn EQ OWN_NONE AND | |
1459 ctb->curCmd EQ AT_CMD_NONE ) | |
1460 { | |
1461 psaCC_phbAddNtry ( LMN, cId, CT_MTC, NULL ); /* add call to LMN PB */ | |
1462 | |
1463 #ifdef AT_INTERPRETER | |
1464 io_setRngInd (IO_RING_OFF, CRING_TYP_NotPresent, CRING_TYP_NotPresent ); /* V.24 Ring Indicator Line */ | |
1465 #endif | |
1466 | |
1467 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1468 { | |
1469 R_AT( RAT_CRING_OFF, idx )( cId+1 ); | |
1470 } | |
1471 return; | |
1472 } | |
1473 | |
1474 return; | |
1475 } | |
1476 | |
1477 /* | |
1478 +-------------------------------------------------------------------+ | |
1479 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1480 | ROUTINE : cmhCC_CallModified | | |
1481 +-------------------------------------------------------------------+ | |
1482 | |
1483 PURPOSE : call was modified | |
1484 | |
1485 */ | |
1486 | |
1487 GLOBAL void cmhCC_CallModified ( SHORT cId ) | |
1488 { | |
1489 #if defined (FAX_AND_DATA) | |
1490 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1491 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
1492 UBYTE cmdBuf; /* buffers current command */ | |
1493 UBYTE srcBuf; /* buffers current command source */ | |
1494 | |
1495 TRACE_FUNCTION ("cmhCC_CallModified()"); | |
1496 | |
1497 /* check for command context */ | |
1498 switch (ctb->curCmd ) | |
1499 { | |
1500 case( AT_CMD_D ): | |
1501 case( AT_CMD_A ): | |
1502 case( AT_CMD_H ): | |
1503 /* process event for D, A and H command */ | |
1504 cmdBuf = ctb->curCmd; | |
1505 srcBuf = ctb->curSrc; | |
1506 break; | |
1507 | |
1508 default: | |
1509 cmdBuf = AT_CMD_NONE; | |
1510 srcBuf = ctb->calOwn; | |
1511 break; | |
1512 } | |
1513 | |
1514 /* determine modifaction status */ | |
1515 switch (ctb->rslt) | |
1516 { | |
1517 /* successful modification */ | |
1518 case( MNCC_CAUSE_MODIFY_SUCCESS ): | |
1519 | |
1520 switch( calltype ) | |
1521 { | |
1522 /* modified to speech call */ | |
1523 case( VOICE_CALL ): | |
1524 cmhCC_PrepareCmdEnd (cId, NULL, NULL); | |
1525 | |
1526 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
1527 | |
1528 /* log result */ | |
1529 cmh_logRslt ( srcBuf, RAT_OK, | |
1530 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
1531 break; | |
1532 | |
1533 /* modified to transparent or non-transparent or fax data call */ | |
1534 case( TRANS_CALL ): | |
1535 case( NON_TRANS_CALL ): | |
1536 case( FAX_CALL ): | |
1537 ccShrdPrm.datStat = DS_ACT_REQ; | |
1538 | |
1539 if( cmhRA_Activate ( srcBuf, cmdBuf, cId ) NEQ AT_EXCT ) | |
1540 { | |
1541 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
1542 psaCC_ClearCall (cId); | |
1543 } | |
1544 break; | |
1545 } | |
1546 break; | |
1547 | |
1548 /* unsuccessful modification */ | |
1549 case( MNCC_CAUSE_MS_TIMER ): | |
1550 default: /* network can send any cause */ | |
1551 | |
1552 TRACE_EVENT_P1 ("MODIFICATION FAILURE: cause=%d",ctb->rslt); | |
1553 | |
1554 | |
1555 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent ); | |
1556 | |
1557 /* log result */ | |
1558 cmh_logRslt ( srcBuf, RAT_CME, cmdBuf, -1, -1, | |
1559 CME_ERR_NotPresent ); | |
1560 | |
1561 if( calltype EQ TRANS_CALL OR | |
1562 calltype EQ NON_TRANS_CALL OR | |
1563 calltype EQ FAX_CALL ) | |
1564 { | |
1565 /* back to transparent or non-transparent or fax data call */ | |
1566 ccShrdPrm.datStat = DS_REST_REQ; | |
1567 | |
1568 if( cmhRA_Activate ( srcBuf, cmdBuf, cId ) NEQ AT_EXCT ) | |
1569 { | |
1570 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
1571 psaCC_ClearCall (cId); | |
1572 } | |
1573 } | |
1574 break; | |
1575 } | |
1576 #endif /* FAX_AND_DATA */ | |
1577 } | |
1578 | |
1579 /* | |
1580 +-------------------------------------------------------------------+ | |
1581 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1582 | ROUTINE : cmhCC_DTMFsent | | |
1583 +-------------------------------------------------------------------+ | |
1584 | |
1585 PURPOSE : confirmation for sent DTMF | |
1586 | |
1587 */ | |
1588 | |
1589 LOCAL void dtmf_sent_after_vts ( SHORT cId ) | |
1590 { | |
1591 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1592 UBYTE current_cmd_source = ctb->dtmfSrc; /* buffers current command source */ | |
1593 | |
1594 TRACE_FUNCTION ("dtmf_sent_after_vts()"); | |
1595 | |
1596 ctb->dtmfCmd = AT_CMD_NONE; | |
1597 ctb->dtmfSrc = CMD_SRC_NONE; | |
1598 | |
1599 ccShrdPrm.dtmf.cId = NO_ENTRY; | |
1600 ccShrdPrm.dtmf.cnt = 0; | |
1601 | |
1602 if ((GET_CAUSE_VALUE(ctb->nrmCs) NEQ NOT_PRESENT_8BIT) AND | |
1603 (ctb->nrmCs NEQ MNCC_CAUSE_DTMF_START_SUCCESS) AND | |
1604 (ctb->nrmCs NEQ MNCC_CAUSE_DTMF_STOP_SUCCESS)) | |
1605 { | |
1606 TRACE_EVENT_P1("DTMF response cause value: %d", ctb->nrmCs); | |
1607 R_AT( RAT_CME, current_cmd_source ) ( AT_CMD_VTS, CME_ERR_NotPresent ); | |
1608 return; | |
1609 } | |
1610 | |
1611 R_AT( RAT_OK, current_cmd_source ) ( AT_CMD_VTS ); | |
1612 } | |
1613 | |
1614 LOCAL void dtmf_sent_within_number ( SHORT cId ) | |
1615 { | |
1616 BOOL dtmf_sent; /* result of sending of next DTMF char */ | |
1617 | |
1618 TRACE_FUNCTION ("dtmf_sent_within_number()"); | |
1619 | |
1620 if ((ccShrdPrm.dtmf.cId NEQ cId) OR | |
1621 !is_call_ok_for_dtmf(cId)) | |
1622 { | |
1623 TRACE_EVENT_P2("Wrong cId for send DTMF. ccShrdPrm.dtmf.cId: %d, cId: %d", ccShrdPrm.dtmf.cId, cId); | |
1624 return; | |
1625 } | |
1626 | |
1627 while( ccShrdPrm.dtmf.cnt AND | |
1628 ccShrdPrm.dtmf.cur < ccShrdPrm.dtmf.cnt ) | |
1629 { | |
1630 dtmf_sent = cmhCC_SendDTMFdig ( AT_CMD_NONE, | |
1631 cId, | |
1632 ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur], | |
1633 DTMF_MOD_AUTO ); | |
1634 ccShrdPrm.dtmf.cur++; | |
1635 if( dtmf_sent ) | |
1636 { | |
1637 return; | |
1638 } | |
1639 } | |
1640 | |
1641 TRACE_EVENT_P1("End of sending DTMF tones: %d", ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur]); | |
1642 ccShrdPrm.dtmf.cnt = ccShrdPrm.dtmf.cur = 0; | |
1643 ccShrdPrm.dtmf.cId = NO_ENTRY; | |
1644 } | |
1645 | |
1646 GLOBAL void cmhCC_DTMFsent ( SHORT cId ) | |
1647 { | |
1648 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1649 | |
1650 TRACE_FUNCTION ("cmhCC_DTMFsent()"); | |
1651 | |
1652 switch( ctb->dtmfCmd ) | |
1653 { | |
1654 case( AT_CMD_VTS ): | |
1655 dtmf_sent_after_vts(cId); | |
1656 return; | |
1657 | |
1658 case( AT_CMD_NONE ): | |
1659 dtmf_sent_within_number(cId); | |
1660 return; | |
1661 | |
1662 default: | |
1663 TRACE_EVENT_P1("Unexpected DTMF command value: %d", ctb->dtmfCmd); | |
1664 break; | |
1665 } | |
1666 } | |
1667 | |
1668 | |
1669 /* | |
1670 This will be called when the call was disconnected while sending DTMF tones | |
1671 | |
1672 */ | |
1673 GLOBAL void cmhCC_DTMFstopped ( SHORT cId ) | |
1674 { | |
1675 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1676 | |
1677 TRACE_FUNCTION ("cmhCC_DTMFstopped()"); | |
1678 | |
1679 switch( ctb->dtmfCmd ) | |
1680 { | |
1681 case( AT_CMD_VTS ): | |
1682 TRACE_EVENT ("DTMF stopped within VTS"); | |
1683 R_AT( RAT_CME, ctb->dtmfSrc ) | |
1684 ( AT_CMD_VTS, CME_ERR_Unknown ); | |
1685 return; | |
1686 | |
1687 case( AT_CMD_NONE ): | |
1688 TRACE_EVENT ("DTMF stopped within NONE"); | |
1689 | |
1690 return; | |
1691 | |
1692 default: | |
1693 TRACE_EVENT_P1("Unexpected DTMF command value: %d", ctb->dtmfCmd); | |
1694 break; | |
1695 } | |
1696 } | |
1697 | |
1698 | |
1699 #if 0 // HM 11-May-2005: Dead code | |
1700 /* | |
1701 +-------------------------------------------------------------------+ | |
1702 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1703 | ROUTINE : cmhCC_DisconnectCall | | |
1704 +-------------------------------------------------------------------+ | |
1705 | |
1706 PURPOSE : request to disconnect the call (in-band tones available) | |
1707 | |
1708 */ | |
1709 | |
1710 GLOBAL void cmhCC_DisconnectCall ( SHORT cId ) | |
1711 { | |
1712 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1713 T_CC_CMD_PRM *pCCCmdPrm; /* points to CC command parameters */ | |
1714 UBYTE cmdBuf; /* buffers current command */ | |
1715 UBYTE srcBuf; /* buffers current command source */ | |
1716 | |
1717 TRACE_FUNCTION ("cmhCC_DisconnectCall()"); | |
1718 | |
1719 /* check for command context */ | |
1720 switch (ctb->curCmd) | |
1721 { | |
1722 case( AT_CMD_NONE ): | |
1723 case( AT_CMD_D ): | |
1724 case( AT_CMD_A ): | |
1725 /* | |
1726 *---------------------------------------------------------------- | |
1727 * process event for D, A and no command | |
1728 *---------------------------------------------------------------- | |
1729 */ | |
1730 /* for data calls proceed with call completion */ | |
1731 if( cmhCC_getcalltype(cId) NEQ VOICE_CALL ) | |
1732 { | |
1733 psaCC_ClearCall (cId); | |
1734 } | |
1735 break; | |
1736 | |
1737 case( AT_CMD_H ): | |
1738 case( AT_CMD_Z ): | |
1739 case( AT_CMD_CHUP ): | |
1740 | |
1741 /* | |
1742 *---------------------------------------------------------------- | |
1743 * process event for H, Z and +CHUP command | |
1744 *---------------------------------------------------------------- | |
1745 */ | |
1746 cmdBuf = ctb->curCmd; | |
1747 srcBuf = ctb->curSrc; | |
1748 | |
1749 psaCC_ClearCall (cId); | |
1750 | |
1751 cmhCC_PrepareCmdEnd (cId, NULL, NULL); | |
1752 | |
1753 pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm; | |
1754 | |
1755 if(cmdBuf EQ AT_CMD_Z AND | |
1756 pCCCmdPrm -> mltyDscFlg EQ 0 ) | |
1757 { | |
1758 cmh_Reset ( srcBuf, TRUE ); | |
1759 R_AT( RAT_Z, srcBuf)(); | |
1760 } | |
1761 | |
1762 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
1763 | |
1764 /* log result */ | |
1765 cmh_logRslt ( srcBuf, RAT_OK, | |
1766 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
1767 break; | |
1768 } | |
1769 | |
1770 return; | |
1771 } | |
1772 #endif /* #if 0 */ | |
1773 | |
1774 /* | |
1775 +-------------------------------------------------------------------+ | |
1776 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1777 | ROUTINE : cmhCC_IncomingCall | | |
1778 +-------------------------------------------------------------------+ | |
1779 | |
1780 PURPOSE : indication of a mobile terminated call | |
1781 | |
1782 */ | |
1783 | |
1784 GLOBAL void cmhCC_IncomingCall ( SHORT cId ) | |
1785 { | |
1786 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
1787 SHORT idx; /* holds index counter */ | |
1788 T_ACI_CRING_MOD mode; /* holds mode of call */ | |
1789 T_ACI_CRING_TYP type1, type2; /* holds types of bearer services */ | |
1790 CHAR numBuf[MAXIMUM(MAX_CC_CALLING_NUMBER, MAX_CC_REDIR_NUMBER)+1]; | |
1791 /* buffers calling number + '\0' */ | |
1792 CHAR subBuf[SUB_LENGTH+1]; /* buffers subaddress 'subaddress\0' */ | |
1793 T_ACI_TOA toaBuf; /* buffers type of address */ | |
1794 T_ACI_TOS tosBuf; /* buffers type of subaddress */ | |
1795 USHORT listcounter; | |
1796 T_ACI_LIST *msg2send; | |
1797 | |
1798 TRACE_FUNCTION ("cmhCC_IncomingCall()"); | |
1799 | |
1800 /* | |
1801 *------------------------------------------------------------------- | |
1802 * ring for call, if no call is in use | |
1803 *------------------------------------------------------------------- | |
1804 */ | |
1805 if( ! psaCC_ctbCallInUse() ) | |
1806 { | |
1807 | |
1808 switch (ctb->rptInd) /* determine call mode */ | |
1809 { | |
1810 case( RI_NOT_PRES ): | |
1811 case( RI_SEQUENTIAL ): | |
1812 mode = CRING_MOD_Direct; | |
1813 break; | |
1814 case( RI_CIRCULAR ): | |
1815 mode = CRING_MOD_Alternate; | |
1816 break; | |
1817 | |
1818 default: | |
1819 TRACE_EVENT("UNEXP REPEAT INDICATOR IN CTB"); | |
1820 mode = CRING_MOD_NotPresent; | |
1821 break; | |
1822 } | |
1823 | |
1824 /* determine 1st service */ | |
1825 type1 = cmhCC_GetCallType_from_bearer( &ctb->BC[0] ); | |
1826 | |
1827 /* determine 2nd service */ | |
1828 type2 = cmhCC_GetCallType_from_bearer( &ctb->BC[1] ); | |
1829 | |
1830 #ifdef FF_ATI | |
1831 io_setRngInd (IO_RING_ON, type1, type2); /* V.24 Ring Indicator Line */ | |
1832 #endif | |
1833 | |
1834 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1835 { | |
1836 if (ctb->prgDesc EQ PROG_NOT_PRES) | |
1837 { | |
1838 R_AT( RAT_CPI, idx ) | |
1839 ( cId+1, | |
1840 CPI_MSG_Setup, | |
1841 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
1842 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
1843 ctb->curCs ); | |
1844 } | |
1845 R_AT( RAT_CRING, idx )( mode, type1, type2 ); | |
1846 | |
1847 /* calling line presentation, if no call is in use */ | |
1848 | |
1849 /* check of presentation indicator removed, due to the fact that | |
1850 * other mobiles show the same behaviour. | |
1851 if( ctb->clgPty.present NEQ PRES_NUMB_NOT_AVAIL ){} */ | |
1852 | |
1853 R_AT( RAT_CLIP, idx ) | |
1854 ( CLIP_STAT_NotPresent, | |
1855 psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ), | |
1856 cmhCC_ctbGetClrNumTyp( cId, &toaBuf ), | |
1857 ctb->clgPty.present, | |
1858 psaCC_ctbClrAdr2Sub( cId, subBuf ), | |
1859 cmhCC_ctbGetClrSubTyp( cId, &tosBuf ), | |
1860 psaCC_ctbGetAlpha( cId ) ); | |
1861 | |
1862 R_AT ( RAT_CDIP, idx ) | |
1863 (psaCC_ctbCldAdr2Num( cId, numBuf, sizeof (numBuf) ), | |
1864 cmhCC_ctbGetCldNumTyp( cId, &toaBuf ), | |
1865 psaCC_ctbCldAdr2Sub( cId, subBuf ), | |
1866 cmhCC_ctbGetCldSubTyp( cId, &tosBuf )); | |
1867 | |
1868 } /* for */ | |
1869 | |
1870 if (ctb->CDStat EQ CD_Notified) | |
1871 { | |
1872 send_CSSX_notification(cId, | |
1873 CSSX_CODE_DeflectedCall, | |
1874 ACI_NumParmNotPresent, | |
1875 psaCC_ctbRdrAdr2Num( cId, numBuf, sizeof (numBuf) ), | |
1876 cmhCC_ctbGetRdrNumTyp( cId, &toaBuf ), | |
1877 psaCC_ctbRdrAdr2Sub( cId, subBuf ), | |
1878 cmhCC_ctbGetRdrSubTyp( cId, &tosBuf)); | |
1879 } | |
1880 | |
1881 if (ctb->CDStat EQ CD_Notified) | |
1882 { | |
1883 psaCC_FreeRdrPty (cId); | |
1884 ctb->CDStat = NO_VLD_CD; | |
1885 } | |
1886 /* check for TTY service */ | |
1887 cmhCC_TTY_Control ( cId, TTY_START ); | |
1888 | |
1889 /* Find out if there is any MNCC_FACILITY_IND stored */ | |
1890 listcounter = 0; | |
1891 if ((listcounter = get_list_count(ccShrdPrm.facility_list)) > 0) | |
1892 { | |
1893 for (;listcounter > 0 ; listcounter --) | |
1894 { | |
1895 msg2send = remove_first_element(ccShrdPrm.facility_list); | |
1896 | |
1897 /* Send MNCC_FACILITY_IND */ | |
1898 psa_mncc_facility_ind((T_MNCC_FACILITY_IND *)msg2send); | |
1899 } | |
1900 } | |
1901 | |
1902 } /* endif */ | |
1903 | |
1904 | |
1905 /* | |
1906 *------------------------------------------------------------------- | |
1907 * call waiting indication, if a call is in use | |
1908 *------------------------------------------------------------------- | |
1909 */ | |
1910 else | |
1911 { | |
1912 /* check of presentation indicator removed, due to the fact that | |
1913 other mobiles show the same behaviour. | |
1914 if( ctb->clgPty.present NEQ PRES_NUMB_NOT_AVAIL ) {} */ | |
1915 | |
1916 if (ctb->CDStat EQ CD_Notified) | |
1917 { | |
1918 send_CSSX_notification( cId, | |
1919 CSSX_CODE_DeflectedCall, | |
1920 ACI_NumParmNotPresent, | |
1921 psaCC_ctbRdrAdr2Num( cId, numBuf, sizeof (numBuf) ), | |
1922 cmhCC_ctbGetRdrNumTyp( cId, &toaBuf ), | |
1923 psaCC_ctbRdrAdr2Sub( cId, subBuf ), | |
1924 cmhCC_ctbGetRdrSubTyp( cId, &tosBuf )); | |
1925 } | |
1926 | |
1927 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
1928 { | |
1929 if (ctb->prgDesc EQ PROG_NOT_PRES) | |
1930 { | |
1931 R_AT( RAT_CPI, idx ) | |
1932 ( cId+1, | |
1933 CPI_MSG_Setup, | |
1934 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
1935 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
1936 ctb->curCs ); | |
1937 } | |
1938 | |
1939 R_AT( RAT_CCWA, idx ) | |
1940 ( NULL, | |
1941 psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ), | |
1942 cmhCC_ctbGetClrNumTyp( cId, &toaBuf ), | |
1943 ctb->clgPty.present, | |
1944 cmhCC_GetCallClass( cId ), | |
1945 psaCC_ctbGetAlpha( cId ) ); | |
1946 } | |
1947 if (ctb->CDStat EQ CD_Notified) | |
1948 { | |
1949 psaCC_FreeRdrPty (cId); | |
1950 ctb->CDStat = NO_VLD_CD; | |
1951 } | |
1952 } | |
1953 } | |
1954 | |
1955 /* | |
1956 +-------------------------------------------------------------------+ | |
1957 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
1958 | ROUTINE : psaCC_Synchronized | | |
1959 +-------------------------------------------------------------------+ | |
1960 | |
1961 PURPOSE : channel mode has changed or | |
1962 call reestablishment event received. | |
1963 If a channel mode change is indicated cId needs not | |
1964 to be valid. | |
1965 | |
1966 */ | |
1967 | |
1968 GLOBAL void cmhCC_Synchronized ( SHORT cId ) | |
1969 { | |
1970 SHORT act_cId; /* holds call identifier */ | |
1971 UBYTE idx; /* holds index */ | |
1972 #if defined (FAX_AND_DATA) AND defined (DTI) | |
1973 T_CC_CALL_TYPE calltype; | |
1974 #endif /* of #ifdef FAX_AND_DATA */ | |
1975 | |
1976 TRACE_FUNCTION ("cmhCC_Synchronized()"); | |
1977 | |
1978 /* process event */ | |
1979 switch( ccShrdPrm.syncCs ) | |
1980 { | |
1981 case( MNCC_CAUSE_CHANNEL_SYNC ): /* change of TCH state */ | |
1982 | |
1983 if( ccShrdPrm.TCHasg EQ TRUE ) | |
1984 { | |
1985 /* search for an active call */ | |
1986 if((act_cId = psaCC_ctbFindCall( NO_VLD_OWN, CS_ACT, NO_VLD_CT )) | |
1987 NEQ NO_ENTRY ) | |
1988 { | |
1989 #if defined (FAX_AND_DATA) AND defined (DTI) | |
1990 calltype = cmhCC_getcalltype(act_cId); | |
1991 | |
1992 switch( calltype ) | |
1993 { | |
1994 #ifdef FF_FAX | |
1995 case( FAX_CALL ): | |
1996 switch( ccShrdPrm.datStat ) | |
1997 { | |
1998 case( DS_ACT ): | |
1999 case( DS_TCH_MDF ): | |
2000 ccShrdPrm.datStat = DS_TCH_MDF; | |
2001 /* | |
2002 * use entity owner instead of current source, because | |
2003 * command is out of scope for CC | |
2004 */ | |
2005 if( cmhRA_Modify ( raEntStat.entOwn, act_cId ) NEQ AT_EXCT ) | |
2006 { | |
2007 ccShrdPrm.datStat = DS_IDL; | |
2008 cmhT30_Deactivate(); | |
2009 psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2010 psaCC_ClearCall (act_cId); | |
2011 } | |
2012 break; | |
2013 | |
2014 case( DS_IDL ): | |
2015 ccShrdPrm.datStat = DS_ACT_REQ; | |
2016 if( cmhRA_Activate ( psaCC_ctb(act_cId)->curSrc, | |
2017 psaCC_ctb(act_cId)->curCmd, | |
2018 act_cId ) | |
2019 NEQ AT_EXCT ) | |
2020 { | |
2021 ccShrdPrm.datStat = DS_IDL; | |
2022 psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2023 psaCC_ClearCall (act_cId); | |
2024 } | |
2025 } | |
2026 break; | |
2027 #endif /* FF_FAX */ | |
2028 | |
2029 case( TRANS_CALL ): /* activate RA */ | |
2030 case( NON_TRANS_CALL ): /* activate RA */ | |
2031 switch( ccShrdPrm.datStat ) | |
2032 { | |
2033 case( DS_IDL ): | |
2034 ccShrdPrm.datStat = DS_ACT_REQ; | |
2035 if( cmhRA_Activate ( psaCC_ctb(act_cId)->curSrc, | |
2036 psaCC_ctb(act_cId)->curCmd, | |
2037 act_cId ) | |
2038 NEQ AT_EXCT ) | |
2039 { | |
2040 ccShrdPrm.datStat = DS_IDL; | |
2041 psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2042 psaCC_ClearCall (act_cId); | |
2043 } | |
2044 break; | |
2045 | |
2046 default: | |
2047 TRACE_EVENT("modify data call ignored"); | |
2048 break; | |
2049 } | |
2050 break; | |
2051 | |
2052 case( UNSUP_DATA_CALL ): | |
2053 TRACE_EVENT("UNSUPPORTED DATA CALL -> DISC CALL"); | |
2054 psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2055 psaCC_ClearCall (act_cId); | |
2056 break; | |
2057 } | |
2058 #endif /* FAX_AND_DATA */ | |
2059 } | |
2060 } | |
2061 | |
2062 /* Information about Traffic Channel Assignment should be sent | |
2063 for all existing act_cIds */ | |
2064 for( act_cId = 0; act_cId < MAX_CALL_NR; act_cId++ ) | |
2065 { | |
2066 if (ccShrdPrm.ctb[act_cId] NEQ NULL) | |
2067 { | |
2068 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
2069 { | |
2070 R_AT( RAT_CPI, idx ) | |
2071 ( act_cId+1, | |
2072 CPI_MSG_Sync, | |
2073 (psaCC_ctb(act_cId)->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
2074 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
2075 psaCC_ctb(act_cId)->curCs ); | |
2076 } | |
2077 } | |
2078 } | |
2079 break; | |
2080 | |
2081 case( MNCC_CAUSE_REEST_STARTED ): /* call reestablishment */ | |
2082 case( MNCC_CAUSE_REEST_FINISHED ): | |
2083 TRACE_EVENT_P1("SYNC -> CALL REESTABLISHMENT %s", | |
2084 (ccShrdPrm.syncCs EQ MNCC_CAUSE_REEST_STARTED ? "STARTED" : "FINISHED")); | |
2085 if (psaCC_ctbIsValid (cId)) | |
2086 { | |
2087 /* Send %CPI notification for call reestablishment */ | |
2088 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
2089 { | |
2090 R_AT( RAT_CPI, idx ) | |
2091 ( cId+1, | |
2092 CPI_MSG_Sync, | |
2093 (psaCC_ctb(cId)->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
2094 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
2095 psaCC_ctb(cId)->curCs ); | |
2096 } | |
2097 } | |
2098 else | |
2099 { | |
2100 TRACE_ERROR ("No call table entry"); | |
2101 } | |
2102 break; | |
2103 } | |
2104 } | |
2105 | |
2106 /* | |
2107 +-------------------------------------------------------------------+ | |
2108 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2109 | ROUTINE : psaCC_CallHeld | | |
2110 +-------------------------------------------------------------------+ | |
2111 | |
2112 PURPOSE : call hold result | |
2113 | |
2114 */ | |
2115 | |
2116 GLOBAL void cmhCC_CallHeld ( SHORT cId ) | |
2117 { | |
2118 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
2119 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
2120 UBYTE cmdBuf; /* buffers current command */ | |
2121 UBYTE srcBuf; /* buffers current command source */ | |
2122 SHORT addId; /* holds additional call id */ | |
2123 UBYTE idx; | |
2124 | |
2125 TRACE_FUNCTION ("cmhCC_CallHeld()"); | |
2126 | |
2127 /* check for command context */ | |
2128 switch (ctb->curCmd ) | |
2129 { | |
2130 case( AT_CMD_D ): | |
2131 case( AT_CMD_A ): | |
2132 case( AT_CMD_CHLD ): | |
2133 break; | |
2134 | |
2135 default: | |
2136 TRACE_EVENT_P1("Error: wrong command context: %d", ctb->curCmd); | |
2137 return; /* wrong command context */ | |
2138 } | |
2139 | |
2140 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
2141 pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm; | |
2142 | |
2143 /* check result of hold request */ | |
2144 TRACE_EVENT_P1("Hold CNF cause value: %04X", ctb->rslt); | |
2145 switch( ctb->rslt ) | |
2146 { | |
2147 case( MNCC_CAUSE_HOLD_SUCCESS ): | |
2148 case( MNCC_CAUSE_SUCCESS ): | |
2149 case( MNCC_CAUSE_NO_MS_CAUSE ): | |
2150 | |
2151 /* Held information displayed if call is on hold */ | |
2152 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
2153 { | |
2154 R_AT( RAT_CPI, idx ) | |
2155 ( cId+1, | |
2156 CPI_MSG_Hld, | |
2157 (ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False, | |
2158 (ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False, | |
2159 ctb->rslt); | |
2160 } | |
2161 | |
2162 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
2163 { | |
2164 if((pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActExc OR | |
2165 pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActAndAcpt OR | |
2166 pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial) AND | |
2167 pCCCmdPrm -> mltyCncFlg ) | |
2168 { | |
2169 process_CHLDaddInfo( srcBuf, CALL_HELD ); | |
2170 } | |
2171 | |
2172 if( pCCCmdPrm -> mltyCncFlg EQ 0 AND | |
2173 pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */ | |
2174 { | |
2175 #ifdef SIM_TOOLKIT | |
2176 if (ctb->SATinv ) | |
2177 { | |
2178 cmh_logRslt ( srcBuf, RAT_OK, | |
2179 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
2180 | |
2181 cmhSAT_StartPendingCall( ); | |
2182 } | |
2183 else | |
2184 #endif /* SIM_TOOLKIT */ | |
2185 { | |
2186 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
2187 | |
2188 /* log result */ | |
2189 cmh_logRslt ( srcBuf, RAT_OK, | |
2190 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
2191 } | |
2192 } | |
2193 } | |
2194 break; | |
2195 | |
2196 default: /* no positive result, i.e. negative result of Hold operation */ | |
2197 | |
2198 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
2199 { | |
2200 | |
2201 #ifdef SIM_TOOLKIT | |
2202 if (ctb->SATinv) | |
2203 { | |
2204 psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv = FALSE; | |
2205 /* return network error cause GSM 11.14 / 12.12.3 */ | |
2206 cmhSAT_NtwErr( ADD_NO_CAUSE ); | |
2207 } | |
2208 #endif | |
2209 if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial AND | |
2210 pCCCmdPrm -> mltyCncFlg ) | |
2211 { | |
2212 for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ ) | |
2213 ; | |
2214 | |
2215 if( CHLDaddInfo EQ CHLD_ADD_INFO_DIAL_CAL ) | |
2216 { | |
2217 CHLDaddInfo = NO_CHLD_ADD_INFO; | |
2218 psaCC_FreeCtbNtry (addId); | |
2219 } | |
2220 } | |
2221 | |
2222 pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */ | |
2223 CHLDaddInfo = NO_CHLD_ADD_INFO; | |
2224 | |
2225 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_OpNotAllow ); | |
2226 | |
2227 /* log result */ | |
2228 cmh_logRslt ( srcBuf, RAT_CME, | |
2229 cmdBuf, -1, -1, CME_ERR_OpNotAllow ); | |
2230 } | |
2231 break; | |
2232 } | |
2233 } | |
2234 | |
2235 /* | |
2236 +-------------------------------------------------------------------+ | |
2237 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2238 | ROUTINE : psaCC_CallRetrieved | | |
2239 +-------------------------------------------------------------------+ | |
2240 | |
2241 PURPOSE : call retrieve result | |
2242 | |
2243 */ | |
2244 | |
2245 GLOBAL void cmhCC_CallRetrieved ( SHORT cId ) | |
2246 { | |
2247 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
2248 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
2249 UBYTE cmdBuf; /* buffers current command */ | |
2250 UBYTE srcBuf; /* buffers current command source */ | |
2251 | |
2252 TRACE_FUNCTION ("cmhCC_CallRetrieved()"); | |
2253 | |
2254 /* check for command context */ | |
2255 if (ctb->curCmd NEQ AT_CMD_CHLD) | |
2256 { | |
2257 return; | |
2258 } | |
2259 | |
2260 pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm; | |
2261 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
2262 | |
2263 /* | |
2264 * check result of retrieve request | |
2265 */ | |
2266 switch (ctb->rslt) | |
2267 { | |
2268 case( MNCC_CAUSE_RETRIEVE_SUCCESS ): | |
2269 | |
2270 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
2271 { | |
2272 if( pCCCmdPrm -> mltyCncFlg EQ 0 AND | |
2273 pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */ | |
2274 { | |
2275 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
2276 | |
2277 /* log result */ | |
2278 cmh_logRslt ( srcBuf, RAT_OK, | |
2279 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
2280 } | |
2281 } | |
2282 break; | |
2283 | |
2284 default: /* no positive result of retrieve operation */ | |
2285 | |
2286 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
2287 { | |
2288 pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */ | |
2289 | |
2290 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_OpNotAllow ); | |
2291 | |
2292 /* log result */ | |
2293 cmh_logRslt ( srcBuf, RAT_CME, | |
2294 cmdBuf, -1, -1, CME_ERR_OpNotAllow ); | |
2295 } | |
2296 break; | |
2297 } | |
2298 } | |
2299 | |
2300 /* | |
2301 +-------------------------------------------------------------------+ | |
2302 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2303 | ROUTINE : cmhCC_RA_Activated | | |
2304 +-------------------------------------------------------------------+ | |
2305 | |
2306 PURPOSE : RA entity activated, data path established | |
2307 | |
2308 */ | |
2309 #ifdef DTI | |
2310 GLOBAL void cmhCC_RA_Activated ( SHORT cId ) | |
2311 { | |
2312 #ifdef FAX_AND_DATA | |
2313 | |
2314 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
2315 UBYTE cmdBuf; /* buffers current command */ | |
2316 UBYTE srcBuf; /* buffers current command source */ | |
2317 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
2318 | |
2319 TRACE_FUNCTION ("cmhCC_RA_Activated()"); | |
2320 | |
2321 srcBuf = psaCC_ctb(cId)->curSrc; | |
2322 cmdBuf = psaCC_ctb(cId)->curCmd; | |
2323 pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm; | |
2324 | |
2325 switch( ccShrdPrm.datStat ) | |
2326 { | |
2327 case( DS_ACT_REQ ): | |
2328 case( DS_REST_REQ ): | |
2329 switch( calltype ) | |
2330 { | |
2331 /* transparent data call */ | |
2332 case( TRANS_CALL ): | |
2333 psaTRA_Activate( ); | |
2334 break; | |
2335 | |
2336 /* non-transparent data call */ | |
2337 case( NON_TRANS_CALL ): | |
2338 /* a WAP call is a non-transparent data call */ | |
2339 #ifdef CO_UDP_IP | |
2340 case( UDPIP_CALL ): | |
2341 #endif /* CO_UDP_IP */ | |
2342 | |
2343 #ifdef FF_TCP_IP | |
2344 case( PPP_CALL ): | |
2345 #endif /* FF_TCP_IP */ | |
2346 | |
2347 #if defined(FF_GPF_TCPIP) | |
2348 case (TCPIP_CALL): | |
2349 #endif /* FF_GPF_TCPIP */ | |
2350 | |
2351 if( cmhL2R_Activate(srcBuf, cmdBuf, cId) NEQ AT_EXCT ) | |
2352 { | |
2353 ccShrdPrm.datStat = DS_DSC_REQ; | |
2354 cmhRA_Deactivate (); | |
2355 } | |
2356 break; | |
2357 | |
2358 #ifdef FF_FAX | |
2359 case( FAX_CALL ): | |
2360 if( cmhT30_Activate(srcBuf, cmdBuf, cId) NEQ AT_EXCT ) | |
2361 { | |
2362 ccShrdPrm.datStat = DS_DSC_REQ; | |
2363 cmhRA_Deactivate (); | |
2364 } | |
2365 break; | |
2366 #endif /* FF_FAX */ | |
2367 | |
2368 /* in case of other types of call */ | |
2369 default: | |
2370 ccShrdPrm.datStat = DS_DSC_REQ; | |
2371 cmhRA_Deactivate (); | |
2372 break; | |
2373 } | |
2374 break; | |
2375 } | |
2376 #endif /* of #ifdef FAX_AND_DATA */ | |
2377 } | |
2378 #endif /* DTI */ | |
2379 /* | |
2380 +-------------------------------------------------------------------+ | |
2381 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2382 | ROUTINE : cmhCC_RA_Deactivated | | |
2383 +-------------------------------------------------------------------+ | |
2384 | |
2385 PURPOSE : RA entity deactivated, data path disconnected | |
2386 | |
2387 */ | |
2388 #ifdef DTI | |
2389 GLOBAL void cmhCC_RA_Deactivated ( SHORT cId ) | |
2390 { | |
2391 #ifdef FAX_AND_DATA | |
2392 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
2393 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
2394 UBYTE cmdBuf; /* buffers current command */ | |
2395 | |
2396 TRACE_FUNCTION ("cmhCC_RA_Deactivated()"); | |
2397 | |
2398 cmdBuf = ctb->curCmd; | |
2399 | |
2400 switch( calltype ) | |
2401 { | |
2402 case( TRANS_CALL ): | |
2403 /* transparent data call */ | |
2404 switch( ccShrdPrm.datStat ) | |
2405 { | |
2406 case( DS_ACT ): | |
2407 case( DS_ACT_REQ ): | |
2408 case( DS_DSC_REQ ): | |
2409 case( DS_TCH_MDF ): | |
2410 | |
2411 ccShrdPrm.datStat = DS_IDL; | |
2412 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2413 psaCC_ClearCall (cId); | |
2414 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
2415 /* check impact for SAT commands */ | |
2416 cmhSAT_OpChnCSDDown( cId, TPL_NONE ); | |
2417 #endif /* SIM TOOLKIT AND FF_SAT_E */ | |
2418 break; | |
2419 | |
2420 case( DS_MDF_REQ ): | |
2421 | |
2422 ccShrdPrm.datStat = DS_IDL; | |
2423 psaCC_ModifyCall(cId); | |
2424 break; | |
2425 | |
2426 case( DS_STOP_REQ ): | |
2427 | |
2428 ccShrdPrm.datStat = DS_IDL; | |
2429 cmhCC_CallDisconnected(cId); | |
2430 break; | |
2431 } | |
2432 break; | |
2433 | |
2434 /* non-transparent data call */ | |
2435 case( NON_TRANS_CALL ): | |
2436 #ifdef CO_UDP_IP | |
2437 case( UDPIP_CALL ): | |
2438 #endif /* CO_UDP_IP */ | |
2439 | |
2440 #ifdef FF_TCP_IP | |
2441 case( PPP_CALL ): | |
2442 #endif /* FF_TCP_IP */ | |
2443 | |
2444 #ifdef FF_GPF_TCPIP | |
2445 case (TCPIP_CALL): | |
2446 #endif /* FF_GPF_TCPIP */ | |
2447 | |
2448 switch( ccShrdPrm.datStat ) | |
2449 { | |
2450 case( DS_ACT ): | |
2451 case( DS_ACT_REQ ): | |
2452 case( DS_DSC_REQ ): | |
2453 case( DS_REST_REQ ): | |
2454 case( DS_TCH_MDF ): | |
2455 | |
2456 ccShrdPrm.datStat = DS_IDL; | |
2457 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2458 | |
2459 #if defined(CO_UDP_IP) OR defined(FF_GPF_TCPIP) | |
2460 /* WAP STACK is down */ | |
2461 | |
2462 /* The following statements check which configuration is active, | |
2463 because there are three possibilities: | |
2464 1. UDP/IP only - WAP1.x and SAT_E | |
2465 2. TCP/IP only - WAP2.x and higher and App's | |
2466 3. UDP/IP and TCP/IP - WAP2.x and higher and App's and SAT_E | |
2467 */ | |
2468 #if defined(FF_GPF_TCPIP) AND !defined(CO_UDP_IP) | |
2469 if(calltype EQ TCPIP_CALL) | |
2470 #elif !defined(FF_GPF_TCPIP) AND defined(CO_UDP_IP) | |
2471 if(calltype EQ UDPIP_CALL) | |
2472 #elif defined(FF_GPF_TCPIP) AND defined(CO_UDP_IP) | |
2473 if(calltype == UDPIP_CALL OR calltype == TCPIP_CALL) | |
2474 #endif | |
2475 { | |
2476 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
2477 /* check impact for SAT commands */ | |
2478 cmhSAT_OpChnCSDDown( cId, UDP ); | |
2479 #endif /* SIM TOOLKIT AND FF_SAT_E */ | |
2480 /* Have CC disconnected before ? */ | |
2481 if (ctb->calStat EQ CS_ACT) | |
2482 { | |
2483 psaCC_ClearCall (cId); | |
2484 } | |
2485 else | |
2486 { | |
2487 /* Message to MMI */ | |
2488 R_AT( RAT_OK, ctb->calOwn ) ( AT_CMD_NONE, cId+1 ); | |
2489 | |
2490 #ifdef FF_ATI | |
2491 io_setDCD (ctb->calOwn, IO_DCD_OFF); /* V.24 DCD Line */ | |
2492 #endif | |
2493 /* log result */ | |
2494 cmh_logRslt (ctb->calOwn, RAT_OK, | |
2495 (T_ACI_AT_CMD)cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
2496 } | |
2497 break; | |
2498 } | |
2499 #endif /* CO_UDP_IP || FF_GPF_TCPIP */ | |
2500 | |
2501 psaCC_ClearCall (cId); | |
2502 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
2503 /* check impact for SAT commands */ | |
2504 cmhSAT_OpChnCSDDown( cId, TPL_NONE ); | |
2505 #endif /* SIM TOOLKIT AND FF_SAT_E */ | |
2506 break; | |
2507 | |
2508 case( DS_STOP_REQ ): | |
2509 | |
2510 ccShrdPrm.datStat = DS_IDL; | |
2511 cmhCC_CallDisconnected(cId); | |
2512 #if defined (FF_WAP) || defined (FF_SAT_E) | |
2513 /* WAP STACK is down */ | |
2514 ccShrdPrm.wapStat = CC_WAP_STACK_DOWN; | |
2515 #endif /* FF_WAP || SAT E */ | |
2516 break; | |
2517 | |
2518 case( DS_ABO_REQ ): /* during modification */ | |
2519 switch( ctb->rptInd ) | |
2520 { | |
2521 case( RI_SEQUENTIAL ): /* no way back */ | |
2522 | |
2523 ccShrdPrm.datStat = DS_IDL; | |
2524 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2525 psaCC_ClearCall (cId); | |
2526 break; | |
2527 | |
2528 case( RI_CIRCULAR ): | |
2529 | |
2530 ccShrdPrm.datStat = DS_IDL; | |
2531 psaCC_ModifyCall(cId); /* back to former service */ | |
2532 break; | |
2533 } | |
2534 break; | |
2535 | |
2536 case( DS_MDF_REQ ): | |
2537 ccShrdPrm.datStat = DS_IDL; | |
2538 psaCC_ModifyCall(cId); | |
2539 break; | |
2540 } | |
2541 break; | |
2542 | |
2543 /* in case of a fax call */ | |
2544 case( FAX_CALL ): | |
2545 switch( ccShrdPrm.datStat ) | |
2546 { | |
2547 case( DS_ACT ): | |
2548 case( DS_ACT_REQ ): | |
2549 case( DS_DSC_REQ ): | |
2550 case( DS_REST_REQ ): | |
2551 case( DS_TCH_MDF ): | |
2552 ccShrdPrm.datStat = DS_IDL; | |
2553 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2554 psaCC_ClearCall (cId); | |
2555 break; | |
2556 | |
2557 case( DS_STOP_REQ ): | |
2558 ccShrdPrm.datStat = DS_IDL; | |
2559 cmhCC_CallDisconnected(cId); | |
2560 break; | |
2561 | |
2562 case( DS_ABO_REQ ): /* abort during modification */ | |
2563 switch (ctb->rptInd) | |
2564 { | |
2565 case( RI_SEQUENTIAL ): /* no way back */ | |
2566 | |
2567 ccShrdPrm.datStat = DS_IDL; | |
2568 ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR; | |
2569 psaCC_ClearCall (cId); | |
2570 break; | |
2571 | |
2572 case( RI_CIRCULAR ): | |
2573 | |
2574 ccShrdPrm.datStat = DS_IDL; | |
2575 psaCC_ModifyCall(cId); /* back to former service */ | |
2576 break; | |
2577 } | |
2578 break; | |
2579 | |
2580 case( DS_MDF_REQ ): | |
2581 ccShrdPrm.datStat = DS_IDL; | |
2582 psaCC_ModifyCall(cId); | |
2583 break; | |
2584 } | |
2585 break; | |
2586 } | |
2587 #endif /* of #ifdef FAX_AND_DATA */ | |
2588 } | |
2589 #endif /* DTI */ | |
2590 | |
2591 #ifdef FF_FAX | |
2592 /* | |
2593 +-------------------------------------------------------------------+ | |
2594 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2595 | ROUTINE : cmhCC_RA_Modified | | |
2596 +-------------------------------------------------------------------+ | |
2597 | |
2598 PURPOSE : RA entity modified after CMM | |
2599 | |
2600 */ | |
2601 #ifdef DTI | |
2602 GLOBAL void cmhCC_RA_Modified ( SHORT cId ) | |
2603 { | |
2604 #ifdef FAX_AND_DATA | |
2605 | |
2606 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
2607 | |
2608 TRACE_FUNCTION ("cmhCC_RA_Modified()"); | |
2609 | |
2610 if( calltype EQ FAX_CALL ) | |
2611 { | |
2612 /* only in case of a fax call */ | |
2613 if( ccShrdPrm.datStat EQ DS_TCH_MDF ) | |
2614 { | |
2615 ccShrdPrm.datStat = DS_ACT; | |
2616 | |
2617 if( cmhT30_Modify() NEQ AT_EXCT ) | |
2618 { | |
2619 ccShrdPrm.datStat = DS_DSC_REQ; | |
2620 cmhRA_Deactivate (); | |
2621 } | |
2622 } | |
2623 } | |
2624 #endif /* of #ifdef FAX_AND_DATA */ | |
2625 } | |
2626 #endif /* DTI */ | |
2627 #endif /* FF_FAX */ | |
2628 | |
2629 /* | |
2630 +-------------------------------------------------------------------+ | |
2631 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2632 | ROUTINE : cmhCC_L2R_or_TRA_Activated | | |
2633 +-------------------------------------------------------------------+ | |
2634 | |
2635 PURPOSE : L2R entity activated, data path established | |
2636 | |
2637 */ | |
2638 #ifdef DTI | |
2639 GLOBAL void cmhCC_L2R_or_TRA_Activated ( T_DTI_ENTITY_ID activated_module, SHORT cId ) | |
2640 { | |
2641 #ifdef FAX_AND_DATA | |
2642 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
2643 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
2644 UBYTE cmdBuf; /* buffers current command */ | |
2645 UBYTE srcBuf; /* buffers current command source */ | |
2646 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
2647 | |
2648 TRACE_FUNCTION ("cmhCC_L2R_or_TRA_Activated()"); | |
2649 | |
2650 if (!psaCC_ctbIsValid (cId)) | |
2651 { | |
2652 /* | |
2653 * If for some no good reason we got a L2R_CONNECT_CNF, L2R_CONNECT_IND | |
2654 * or TRA_ACTIVATE_CNF without having a valid entry in the call table, | |
2655 * we do here the same as for the FAX case where those events are also | |
2656 * unexpected. We send the respective deativation request. | |
2657 */ | |
2658 TRACE_ERROR ("Call table entry disappeared"); | |
2659 ccShrdPrm.datStat = DS_DSC_REQ; | |
2660 switch( activated_module ) | |
2661 { | |
2662 case( DTI_ENTITY_TRA ): | |
2663 psaTRA_Deactivate(); | |
2664 break; | |
2665 case( DTI_ENTITY_L2R ): | |
2666 cmhL2R_Deactivate(); | |
2667 break; | |
2668 default: /* Unexpected to happen */ | |
2669 break; | |
2670 } | |
2671 return; | |
2672 } | |
2673 | |
2674 cmdBuf = ctb->curCmd; | |
2675 srcBuf = ctb->curSrc; | |
2676 pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm; | |
2677 | |
2678 switch( calltype ) | |
2679 { | |
2680 case( TRANS_CALL ): | |
2681 case( NON_TRANS_CALL ): | |
2682 | |
2683 #ifdef CO_UDP_IP | |
2684 case( UDPIP_CALL ): | |
2685 #endif /* CO_UDP_IP */ | |
2686 | |
2687 #ifdef FF_TCP_IP | |
2688 case( PPP_CALL ): | |
2689 #endif | |
2690 | |
2691 #if defined(FF_GPF_TCPIP) | |
2692 case (TCPIP_CALL): | |
2693 #endif /* FF_GPF_TCPIP */ | |
2694 | |
2695 switch( ccShrdPrm.datStat ) | |
2696 { | |
2697 case( DS_ACT_REQ ): | |
2698 | |
2699 ccShrdPrm.datStat = DS_ACT; | |
2700 cmhCC_PrepareCmdEnd (cId, NULL, NULL); | |
2701 | |
2702 /* reset CMOD to single mode */ | |
2703 ccShrdPrm.CMODmode = CMOD_MOD_Single; | |
2704 | |
2705 /* check if connect is expected */ | |
2706 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
2707 { | |
2708 if( pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */ | |
2709 { | |
2710 R_AT( RAT_CR, srcBuf ) | |
2711 (cmhCC_GetSrvType (&ctb->BC[ctb->curBC])); | |
2712 | |
2713 R_AT( RAT_ILRR, srcBuf ) | |
2714 (cmhCC_GetDataRate (&ctb->BC[ctb->curBC]), | |
2715 cmhCC_GetFormat (&ctb->BC[ctb->curBC]), | |
2716 cmhCC_GetParity (&ctb->BC[ctb->curBC])); | |
2717 #if defined (CO_UDP_IP) AND defined (FF_GPF_TCPIP) | |
2718 if ( (calltype NEQ UDPIP_CALL) AND (calltype NEQ TCPIP_CALL) ) | |
2719 #endif | |
2720 #if defined (CO_UDP_IP) AND !defined(FF_GPF_TCPIP) | |
2721 if (calltype NEQ UDPIP_CALL) | |
2722 #endif | |
2723 #if defined (FF_GPF_TCPIP) AND !defined(CO_UDP_IP) | |
2724 if (calltype NEQ TCPIP_CALL) | |
2725 #endif | |
2726 | |
2727 #ifdef FF_TCP_IP | |
2728 if (calltype NEQ PPP_CALL) | |
2729 #endif /* FF_TCP_IP */ | |
2730 { | |
2731 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
2732 if (!cmhSAT_OpChnChckCSD( TPL_NONE)) | |
2733 #endif /* of SIM_TOOLKIT AND FF_SAT_E*/ | |
2734 { | |
2735 R_AT( RAT_CONNECT, srcBuf ) | |
2736 (cmdBuf, cmhCC_GetDataRate(&ctb->BC[ctb->curBC]), cId+1, FALSE); | |
2737 } | |
2738 } | |
2739 | |
2740 /* log result */ | |
2741 cmh_logRslt ( srcBuf, RAT_CONNECT, | |
2742 cmdBuf, (SHORT)(cId+1), | |
2743 cmhCC_GetDataRate(&ctb->BC[ctb->curBC]), -1 ); | |
2744 | |
2745 switch( activated_module ) | |
2746 { | |
2747 case( DTI_ENTITY_TRA ): | |
2748 if (IS_SRC_BT(srcBuf)) | |
2749 { | |
2750 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_BLUETOOTH, DTI_ENTITY_TRA}; | |
2751 UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT); | |
2752 dti_cntrl_est_dpath ( dti_id, | |
2753 entity_list, | |
2754 2, | |
2755 SPLIT, | |
2756 TRA_connect_dti_cb); | |
2757 } | |
2758 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
2759 if (cmhSAT_OpChnChckCSD( TPL_NONE)) | |
2760 { | |
2761 cmhSAT_OpChnSIMCnctReq( DTI_ENTITY_TRA ); | |
2762 } | |
2763 #endif /* of SIM_TOOLKIT AND FF_SAT_E */ | |
2764 else | |
2765 { | |
2766 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_TRA}; | |
2767 | |
2768 dti_cntrl_est_dpath_indirect ( srcBuf, | |
2769 entity_list, | |
2770 1, | |
2771 SPLIT, | |
2772 TRA_connect_dti_cb, | |
2773 DTI_CPBLTY_SER, | |
2774 DTI_CID_NOTPRESENT); | |
2775 } | |
2776 break; | |
2777 | |
2778 case( DTI_ENTITY_L2R ): | |
2779 #ifdef CO_UDP_IP | |
2780 if ( calltype EQ UDPIP_CALL ) | |
2781 { | |
2782 UBYTE dti_id; | |
2783 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_IP, DTI_ENTITY_PPPC, DTI_ENTITY_L2R}; | |
2784 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
2785 if ( satShrdPrm.opchStat EQ OPCH_EST_REQ ) | |
2786 dti_id = simShrdPrm.sat_class_e_dti_id; | |
2787 else | |
2788 #endif /* SIM_TOOLKIT AND FF_SAT_E */ | |
2789 dti_id = wap_dti_id; | |
2790 | |
2791 dti_cntrl_est_dpath ( dti_id, | |
2792 entity_list, | |
2793 3, | |
2794 APPEND, | |
2795 IP_UDP_connect_dti_cb); | |
2796 break; | |
2797 } | |
2798 #endif /* CO_UDP_IP */ | |
2799 | |
2800 #if defined (FF_TCP_IP) AND defined (DTI) | |
2801 if ( calltype EQ PPP_CALL ) | |
2802 { | |
2803 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_PPPC, DTI_ENTITY_L2R}; | |
2804 dti_cntrl_est_dpath_indirect ( srcBuf, | |
2805 entity_list, | |
2806 2, | |
2807 SPLIT, | |
2808 L2R_connect_dti_cb, | |
2809 DTI_CPBLTY_PKT, | |
2810 DTI_CID_NOTPRESENT); | |
2811 break; | |
2812 } | |
2813 #endif /* FF_TCP_IP */ | |
2814 | |
2815 #ifdef FF_GPF_TCPIP | |
2816 if ( calltype EQ TCPIP_CALL ) | |
2817 { | |
2818 UBYTE dti_id; | |
2819 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_TCPIP, DTI_ENTITY_PPPC, DTI_ENTITY_L2R}; | |
2820 /* create a WAP DTI if not present */ | |
2821 if (wap_dti_id EQ DTI_DTI_ID_NOTPRESENT) | |
2822 { | |
2823 wap_dti_id = dti_cntrl_new_dti (DTI_DTI_ID_NOTPRESENT); | |
2824 TRACE_EVENT_P1("tcpip_wap_dti_id = %d", wap_dti_id); | |
2825 } | |
2826 dti_id = wap_dti_id; | |
2827 dti_cntrl_est_dpath ( dti_id, | |
2828 entity_list, | |
2829 3, | |
2830 SPLIT, | |
2831 TCPIP_connect_dti_cb); | |
2832 break; | |
2833 } | |
2834 #endif /* FF_GPF_TCPIP */ | |
2835 | |
2836 #if defined (SIM_TOOLKIT) AND defined (FF_SAT_E) | |
2837 if (cmhSAT_OpChnChckCSD( TPL_NONE)) | |
2838 { | |
2839 cmhSAT_OpChnSIMCnctReq( DTI_ENTITY_L2R ); | |
2840 } | |
2841 #endif /* of SIM_TOOLKIT AND FF_SAT_E */ | |
2842 | |
2843 #ifdef DTI | |
2844 if (IS_SRC_BT(srcBuf)) | |
2845 { | |
2846 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_BLUETOOTH, DTI_ENTITY_L2R}; | |
2847 UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT); | |
2848 dti_cntrl_est_dpath ( dti_id, | |
2849 entity_list, | |
2850 2, | |
2851 SPLIT, | |
2852 L2R_connect_dti_cb); | |
2853 } | |
2854 else | |
2855 { | |
2856 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_L2R}; | |
2857 dti_cntrl_est_dpath_indirect ( srcBuf, | |
2858 entity_list, | |
2859 1, | |
2860 SPLIT, | |
2861 L2R_connect_dti_cb, | |
2862 DTI_CPBLTY_SER, | |
2863 DTI_CID_NOTPRESENT); | |
2864 } | |
2865 #endif /* DTI */ | |
2866 break; | |
2867 } /* switch( activated_module ) */ | |
2868 } /* if( pCCCmdPrm -> mltyCncFlg EQ 0 ) */ | |
2869 } /* if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) */ | |
2870 break; | |
2871 | |
2872 case( DS_REST_REQ ): | |
2873 ccShrdPrm.datStat = DS_ACT; | |
2874 break; | |
2875 } | |
2876 break; | |
2877 /* in case of a fax call */ | |
2878 case( FAX_CALL ): | |
2879 | |
2880 TRACE_EVENT( "UNEXP BEARER SERV FAX" ); | |
2881 ccShrdPrm.datStat = DS_DSC_REQ; | |
2882 switch( activated_module ) | |
2883 { | |
2884 case( DTI_ENTITY_TRA ): | |
2885 psaTRA_Deactivate(); | |
2886 break; | |
2887 case( DTI_ENTITY_L2R ): | |
2888 cmhL2R_Deactivate(); | |
2889 break; | |
2890 } | |
2891 break; | |
2892 } | |
2893 #endif /* of #ifdef FAX_AND_DATA */ | |
2894 } | |
2895 #endif /* UART */ | |
2896 | |
2897 /* | |
2898 +-------------------------------------------------------------------+ | |
2899 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2900 | ROUTINE : cmhCC_L2R_or_TRA_Deactivated | | |
2901 +-------------------------------------------------------------------+ | |
2902 | |
2903 PURPOSE : L2R entity deactivated, data path disconnected | |
2904 | |
2905 */ | |
2906 #ifdef UART | |
2907 GLOBAL void cmhCC_L2R_or_TRA_Deactivated ( SHORT cId ) | |
2908 { | |
2909 #ifdef FAX_AND_DATA | |
2910 | |
2911 UBYTE srcBuf; | |
2912 #ifdef DTI | |
2913 T_DTI_CNTRL dti_cntrl_info; | |
2914 #endif /* DTI */ | |
2915 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
2916 | |
2917 /* if there is a redirection get proper source */ | |
2918 #ifdef DTI | |
2919 if (dti_cntrl_get_info_from_dti_id(raShrdPrm.dti_id, &dti_cntrl_info)) | |
2920 { | |
2921 srcBuf = dti_cntrl_info.src_id; | |
2922 } | |
2923 else /* if it is not a valid dti_id - take stored src_id */ | |
2924 { | |
2925 TRACE_EVENT_P2("No valid dti_id:%d taking owner:%d", | |
2926 raShrdPrm.dti_id, | |
2927 raShrdPrm.owner); | |
2928 #endif /* DTI */ | |
2929 srcBuf = raShrdPrm.owner; | |
2930 #ifdef DTI | |
2931 } | |
2932 /* reset ra dti_id storage */ | |
2933 raShrdPrm.dti_id = NOT_PRESENT_8BIT; | |
2934 #endif /* DTI */ | |
2935 | |
2936 TRACE_FUNCTION ("cmhCC_L2R_or_TRA_Deactivated()"); | |
2937 | |
2938 io_setDCD (srcBuf, IO_DCD_OFF); | |
2939 | |
2940 switch( calltype ) | |
2941 { | |
2942 case( TRANS_CALL ): | |
2943 case( NON_TRANS_CALL ): | |
2944 | |
2945 #ifdef CO_UDP_IP | |
2946 case( UDPIP_CALL ): | |
2947 #endif /* CO_UDP_IP */ | |
2948 | |
2949 #ifdef FF_TCP_IP | |
2950 case( PPP_CALL ): | |
2951 #endif | |
2952 | |
2953 #if defined(FF_GPF_TCPIP) | |
2954 case (TCPIP_CALL): | |
2955 #endif /* FF_GPF_TCPIP */ | |
2956 | |
2957 switch( ccShrdPrm.datStat ) | |
2958 { | |
2959 case( DS_ACT ): | |
2960 case( DS_ACT_REQ ): | |
2961 case( DS_DSC_REQ ): | |
2962 case( DS_MDF_REQ ): | |
2963 case( DS_STOP_REQ ): | |
2964 | |
2965 cmhRA_Deactivate (); | |
2966 break; | |
2967 } | |
2968 break; | |
2969 | |
2970 case( FAX_CALL ): | |
2971 TRACE_EVENT( "UNEXP BEARER SERV FAX" ); | |
2972 ccShrdPrm.datStat = DS_DSC_REQ; | |
2973 cmhRA_Deactivate(); | |
2974 break; | |
2975 } | |
2976 #endif /* of #ifdef FAX_AND_DATA */ | |
2977 } | |
2978 #endif /* UART */ | |
2979 | |
2980 /* | |
2981 +-------------------------------------------------------------------+ | |
2982 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
2983 | ROUTINE : cmhCC_L2R_Failed | | |
2984 +-------------------------------------------------------------------+ | |
2985 | |
2986 PURPOSE : L2R entity failure | |
2987 | |
2988 */ | |
2989 | |
2990 GLOBAL void cmhCC_L2R_Failed ( void ) | |
2991 { | |
2992 #ifdef FAX_AND_DATA | |
2993 SHORT cId = raShrdPrm.cId; /* holds call identifier */ | |
2994 T_CC_CALL_TYPE calltype; | |
2995 | |
2996 TRACE_FUNCTION ("cmhCC_L2R_Failed()"); | |
2997 | |
2998 calltype = cmhCC_getcalltype(cId); | |
2999 | |
3000 switch( calltype ) | |
3001 { | |
3002 case( NON_TRANS_CALL ): | |
3003 switch( ccShrdPrm.datStat ) | |
3004 { | |
3005 case( DS_ACT_REQ ): | |
3006 if( psaCC_ctbIsValid (cId) AND | |
3007 psaCC_ctb(cId)->calStat EQ CS_MDF_REQ ) | |
3008 { | |
3009 ccShrdPrm.datStat = DS_ABO_REQ; | |
3010 } | |
3011 /*lint -fallthrough*/ | |
3012 case( DS_ACT ): | |
3013 case( DS_REST_REQ ): | |
3014 cmhL2R_Deactivate (); | |
3015 break; | |
3016 } | |
3017 break; | |
3018 | |
3019 | |
3020 case( FAX_CALL ): | |
3021 | |
3022 TRACE_EVENT( "UNEXP BEARER SERV FAX" ); | |
3023 ccShrdPrm.datStat = DS_DSC_REQ; | |
3024 cmhL2R_Deactivate(); | |
3025 break; | |
3026 } | |
3027 | |
3028 #endif /* of #ifdef FAX_AND_DATA */ | |
3029 } | |
3030 | |
3031 #ifdef FF_FAX | |
3032 /* | |
3033 +-------------------------------------------------------------------+ | |
3034 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3035 | ROUTINE : cmhCC_T30_Activated | | |
3036 +-------------------------------------------------------------------+ | |
3037 | |
3038 PURPOSE : T30 entity activated, data path established | |
3039 | |
3040 */ | |
3041 | |
3042 GLOBAL void cmhCC_T30_Activated ( void ) | |
3043 { | |
3044 #if defined (FAX_AND_DATA) AND defined (DTI) | |
3045 | |
3046 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
3047 UBYTE cmdBuf; /* buffers current command */ | |
3048 SHORT cId = t30ShrdPrm.cId; /* holds call identifier */ | |
3049 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
3050 | |
3051 TRACE_FUNCTION ("cmhCC_T30_Activated()"); | |
3052 | |
3053 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->calOwn].ccCmdPrm; | |
3054 cmdBuf = psaCC_ctb(cId)->curCmd; | |
3055 | |
3056 switch( calltype ) | |
3057 { | |
3058 case( FAX_CALL ): | |
3059 switch( ccShrdPrm.datStat ) | |
3060 { | |
3061 case( DS_ACT_REQ ): | |
3062 | |
3063 ccShrdPrm.datStat = DS_ACT; | |
3064 | |
3065 /* reset CMOD to single mode */ | |
3066 ccShrdPrm.CMODmode = CMOD_MOD_Single; | |
3067 | |
3068 if( psaCC_ctb(cId)->calType EQ CT_MTC ) | |
3069 { | |
3070 cmhT30_SendCaps( psaCC_ctb(cId)->curSrc, FRT_DIS ); | |
3071 } | |
3072 break; | |
3073 } | |
3074 break; | |
3075 | |
3076 /* in case of a asynchronous call */ | |
3077 case( TRANS_CALL ): | |
3078 case( NON_TRANS_CALL ): | |
3079 TRACE_EVENT( "UNEXP BEARER SERV ASYNC" ); | |
3080 ccShrdPrm.datStat = DS_DSC_REQ; | |
3081 cmhT30_Deactivate(); | |
3082 break; | |
3083 } | |
3084 | |
3085 #endif /* of #ifdef FAX_AND_DATA */ | |
3086 } | |
3087 | |
3088 /* | |
3089 +-------------------------------------------------------------------+ | |
3090 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3091 | ROUTINE : cmhCC_T30_Deactivated | | |
3092 +-------------------------------------------------------------------+ | |
3093 | |
3094 PURPOSE : T30 entity deactivated, data path disconnected | |
3095 | |
3096 */ | |
3097 | |
3098 GLOBAL void cmhCC_T30_Deactivated ( void ) | |
3099 { | |
3100 #ifdef FAX_AND_DATA | |
3101 | |
3102 SHORT cId = t30ShrdPrm.cId; /* holds call identifier */ | |
3103 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
3104 | |
3105 TRACE_FUNCTION ("cmhCC_T30_Deactivated()"); | |
3106 | |
3107 switch( calltype ) | |
3108 { | |
3109 case( FAX_CALL ): | |
3110 switch( ccShrdPrm.datStat ) | |
3111 { | |
3112 case( DS_ACT ): | |
3113 case( DS_ACT_REQ ): | |
3114 case( DS_DSC_REQ ): | |
3115 case( DS_MDF_REQ ): | |
3116 case( DS_STOP_REQ ): | |
3117 case( DS_TCH_MDF ): | |
3118 | |
3119 cmhRA_Deactivate (); | |
3120 break; | |
3121 } | |
3122 break; | |
3123 | |
3124 /* in case of a asynchronous data call */ | |
3125 case( TRANS_CALL ): | |
3126 case( NON_TRANS_CALL ): | |
3127 | |
3128 TRACE_EVENT( "UNEXP BEARER SERV ASYNC" ); | |
3129 ccShrdPrm.datStat = DS_DSC_REQ; | |
3130 cmhRA_Deactivate(); | |
3131 break; | |
3132 } | |
3133 | |
3134 #endif /* of #ifdef FAX_AND_DATA */ | |
3135 } | |
3136 | |
3137 /* | |
3138 +-------------------------------------------------------------------+ | |
3139 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3140 | ROUTINE : cmhCC_T30_Failed | | |
3141 +-------------------------------------------------------------------+ | |
3142 | |
3143 PURPOSE : T30 entity failure | |
3144 | |
3145 */ | |
3146 | |
3147 GLOBAL void cmhCC_T30_Failed ( void ) | |
3148 { | |
3149 #if defined FAX_AND_DATA AND defined (DTI) | |
3150 | |
3151 SHORT cId = t30ShrdPrm.cId; /* holds call identifier */ | |
3152 T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId); | |
3153 | |
3154 TRACE_FUNCTION ("cmhCC_T30_Failed()"); | |
3155 | |
3156 switch( calltype ) | |
3157 { | |
3158 case( FAX_CALL ): | |
3159 | |
3160 switch( ccShrdPrm.datStat ) | |
3161 { | |
3162 case( DS_ACT_REQ ): | |
3163 | |
3164 if( psaCC_ctb(cId)->calStat EQ CS_MDF_REQ ) | |
3165 { | |
3166 ccShrdPrm.datStat = DS_ABO_REQ; | |
3167 } | |
3168 /*lint -fallthrough*/ | |
3169 case( DS_ACT ): | |
3170 case( DS_REST_REQ ): | |
3171 case( DS_TCH_MDF ): | |
3172 | |
3173 cmhT30_Deactivate (); | |
3174 break; | |
3175 } | |
3176 break; | |
3177 | |
3178 /* in case of a asynchronous data call */ | |
3179 case( TRANS_CALL ): | |
3180 case( NON_TRANS_CALL ): | |
3181 | |
3182 TRACE_EVENT( "UNEXP BEARER SERV ASYNC" ); | |
3183 ccShrdPrm.datStat = DS_DSC_REQ; | |
3184 cmhT30_Deactivate(); | |
3185 break; | |
3186 } | |
3187 | |
3188 #endif /* of #ifdef FAX_AND_DATA */ | |
3189 } | |
3190 | |
3191 /* | |
3192 +-------------------------------------------------------------------+ | |
3193 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3194 | ROUTINE : cmhCC_T30_RmtCaps | | |
3195 +-------------------------------------------------------------------+ | |
3196 | |
3197 PURPOSE : T30 remote capability indication | |
3198 | |
3199 */ | |
3200 | |
3201 GLOBAL void cmhCC_T30_RmtCaps ( void ) | |
3202 { | |
3203 #ifdef FAX_AND_DATA | |
3204 | |
3205 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
3206 UBYTE cmdBuf; /* buffers current command */ | |
3207 UBYTE srcBuf; /* buffers current command source */ | |
3208 SHORT cId = t30ShrdPrm.cId; /* holds call identifier */ | |
3209 | |
3210 TRACE_FUNCTION ("cmhCC_T30_RmtCaps()"); | |
3211 | |
3212 /* | |
3213 *------------------------------------------------------------------- | |
3214 * check if connect is expected | |
3215 *------------------------------------------------------------------- | |
3216 */ | |
3217 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm; | |
3218 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
3219 | |
3220 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
3221 { | |
3222 if( pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */ | |
3223 { | |
3224 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
3225 | |
3226 /* log result */ | |
3227 cmh_logRslt ( srcBuf, RAT_OK, | |
3228 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
3229 } | |
3230 } | |
3231 | |
3232 #endif /* of #ifdef FAX_AND_DATA */ | |
3233 } | |
3234 | |
3235 #endif /* FF_FAX */ | |
3236 /* | |
3237 +-------------------------------------------------------------------+ | |
3238 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3239 | ROUTINE : cmhCC_MPTYBuild | | |
3240 +-------------------------------------------------------------------+ | |
3241 | |
3242 PURPOSE : Multiparty successful build. | |
3243 | |
3244 */ | |
3245 | |
3246 GLOBAL void cmhCC_MPTYBuild( SHORT cId, | |
3247 T_BUILD_MPTY_RES *bldMPTY ) | |
3248 { | |
3249 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
3250 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
3251 UBYTE ctbIdx; /* holds call table index */ | |
3252 UBYTE cmdBuf; /* buffers command */ | |
3253 UBYTE srcBuf; /* buffers command source */ | |
3254 | |
3255 TRACE_FUNCTION ("cmhCC_MPTYBuild()"); | |
3256 | |
3257 TIMERSTOP( ACI_TMPTY ); | |
3258 | |
3259 if( ctb->curCmd NEQ AT_CMD_CHLD ) | |
3260 return; /* wrong command context */ | |
3261 | |
3262 /* set multiparty status for involved calls */ | |
3263 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
3264 { | |
3265 if (ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
3266 (psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT_REQ OR | |
3267 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT )) | |
3268 { | |
3269 psaCC_ctb(ctbIdx)->mptyStat = CS_ACT; | |
3270 psaCC_ctb(ctbIdx)->calStat = CS_ACT; | |
3271 } | |
3272 } | |
3273 | |
3274 pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm; | |
3275 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
3276 | |
3277 psaCC_MPTY (cId, MPTY_BUILD_SUCCESS); | |
3278 | |
3279 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
3280 { | |
3281 if( pCCCmdPrm -> mltyCncFlg EQ 0 AND | |
3282 pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */ | |
3283 { | |
3284 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
3285 | |
3286 /* log result */ | |
3287 cmh_logRslt ( srcBuf, RAT_OK, | |
3288 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
3289 } | |
3290 } | |
3291 } | |
3292 | |
3293 /* | |
3294 +-------------------------------------------------------------------+ | |
3295 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3296 | ROUTINE : cmhCC_MPTYSplit | | |
3297 +-------------------------------------------------------------------+ | |
3298 | |
3299 PURPOSE : Multiparty successful split. | |
3300 | |
3301 */ | |
3302 | |
3303 GLOBAL void cmhCC_MPTYSplit( SHORT cId, | |
3304 T_SPLIT_MPTY_RES *splMPTY ) | |
3305 { | |
3306 T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId]; | |
3307 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
3308 UBYTE ctbIdx; /* holds call table index */ | |
3309 UBYTE cmdBuf; /* buffers command */ | |
3310 UBYTE srcBuf; /* buffers command source */ | |
3311 UBYTE fndCId; /* holds call id of found call */ | |
3312 UBYTE fndCal; /* holds number of found calls */ | |
3313 | |
3314 TRACE_FUNCTION ("cmhCC_MPTYSplit()"); | |
3315 | |
3316 TIMERSTOP( ACI_TMPTY ); | |
3317 | |
3318 if( ctb->curCmd NEQ AT_CMD_CHLD ) | |
3319 return; /* wrong command context */ | |
3320 | |
3321 /* set status for involved calls */ | |
3322 for( fndCal = 0, ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
3323 { | |
3324 if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
3325 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT AND | |
3326 ctbIdx NEQ cId ) | |
3327 { | |
3328 psaCC_ctb(ctbIdx)->calStat = CS_HLD; | |
3329 fndCal++; | |
3330 fndCId = ctbIdx; | |
3331 } | |
3332 } | |
3333 | |
3334 /* if only one other call is left, reset multiparty status */ | |
3335 /* if only one other call is left, do not reset multiparty status - VO patch | |
3336 if( fndCal EQ 1 ) | |
3337 { | |
3338 psaCC_ctb(fndCId)->mptyStat = CS_IDL; | |
3339 } | |
3340 */ | |
3341 | |
3342 pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm; | |
3343 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
3344 ctb->calStat = CS_ACT; | |
3345 ctb->mptyStat = CS_IDL; | |
3346 | |
3347 psaCC_MPTY (cId, MPTY_SPLIT_SUCCESS); | |
3348 | |
3349 psaCC_setSpeechMode (); /* In case we split from a held mpty */ | |
3350 | |
3351 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
3352 { | |
3353 if( pCCCmdPrm -> mltyCncFlg EQ 0 AND | |
3354 pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */ | |
3355 { | |
3356 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
3357 | |
3358 /* log result */ | |
3359 cmh_logRslt ( srcBuf, RAT_OK, | |
3360 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
3361 } | |
3362 } | |
3363 } | |
3364 | |
3365 /* | |
3366 +-------------------------------------------------------------------+ | |
3367 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3368 | ROUTINE : cmhCC_MPTYHeld | | |
3369 +-------------------------------------------------------------------+ | |
3370 | |
3371 PURPOSE : Multiparty successful held. | |
3372 | |
3373 */ | |
3374 | |
3375 GLOBAL void cmhCC_MPTYHeld( SHORT cId, | |
3376 T_HOLD_MPTY_RES *hldMPTY ) | |
3377 { | |
3378 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
3379 UBYTE ctbIdx; /* holds call table index */ | |
3380 UBYTE cmdBuf; /* buffers command */ | |
3381 UBYTE srcBuf; /* buffers command source */ | |
3382 | |
3383 TRACE_FUNCTION ("cmhCC_MPTYHeld()"); | |
3384 | |
3385 TIMERSTOP( ACI_TMPTY ); | |
3386 | |
3387 /* check for command context */ | |
3388 switch( psaCC_ctb(cId)->curCmd ) | |
3389 { | |
3390 case( AT_CMD_CHLD ): | |
3391 case( AT_CMD_D ): | |
3392 break; | |
3393 | |
3394 default: | |
3395 return; /* wrong command context */ | |
3396 } | |
3397 | |
3398 /* set call status for multiparty call member */ | |
3399 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
3400 { | |
3401 if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
3402 psaCC_ctb(ctbIdx)->calStat EQ CS_HLD_REQ AND | |
3403 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT ) | |
3404 { | |
3405 psaCC_ctb(ctbIdx)->calStat = CS_HLD; | |
3406 } | |
3407 } | |
3408 | |
3409 psaCC_MPTY (cId, MPTY_HOLD_SUCCESS); | |
3410 | |
3411 psaCC_setSpeechMode (); | |
3412 | |
3413 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm; | |
3414 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
3415 | |
3416 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
3417 { | |
3418 if((pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActExc OR | |
3419 pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActAndAcpt OR | |
3420 pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial) AND | |
3421 pCCCmdPrm -> mltyCncFlg ) | |
3422 { | |
3423 process_CHLDaddInfo( srcBuf, MTPTY_HELD ); | |
3424 } | |
3425 | |
3426 if( pCCCmdPrm -> mltyCncFlg EQ 0 AND | |
3427 pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */ | |
3428 { | |
3429 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
3430 | |
3431 /* log result */ | |
3432 cmh_logRslt ( srcBuf, RAT_OK, | |
3433 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
3434 } | |
3435 } | |
3436 } | |
3437 | |
3438 /* | |
3439 +-------------------------------------------------------------------+ | |
3440 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3441 | ROUTINE : cmhCC_MPTYRetrieved | | |
3442 +-------------------------------------------------------------------+ | |
3443 | |
3444 PURPOSE : Multiparty successful retrieved. | |
3445 | |
3446 */ | |
3447 | |
3448 GLOBAL void cmhCC_MPTYRetrieved( SHORT cId, | |
3449 T_RETRIEVE_MPTY_RES *rtvMPTY ) | |
3450 { | |
3451 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
3452 UBYTE ctbIdx; /* holds call table index */ | |
3453 UBYTE cmdBuf; /* buffers command */ | |
3454 UBYTE srcBuf; /* buffers command source */ | |
3455 | |
3456 TRACE_FUNCTION ("cmhCC_MPTYRetrieved()"); | |
3457 | |
3458 TIMERSTOP( ACI_TMPTY ); | |
3459 | |
3460 if( psaCC_ctb(cId)->curCmd NEQ AT_CMD_CHLD ) | |
3461 return; /* wrong command context */ | |
3462 | |
3463 /* set call status for multiparty call member */ | |
3464 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
3465 { | |
3466 if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
3467 psaCC_ctb(ctbIdx)->calStat EQ CS_ACT_REQ AND | |
3468 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT ) | |
3469 { | |
3470 psaCC_ctb(ctbIdx)->calStat = CS_ACT; | |
3471 } | |
3472 } | |
3473 | |
3474 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm; | |
3475 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
3476 | |
3477 psaCC_MPTY (cId, MPTY_RETRIEVE_SUCCESS); | |
3478 | |
3479 psaCC_setSpeechMode (); | |
3480 | |
3481 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
3482 { | |
3483 if( pCCCmdPrm -> mltyCncFlg EQ 0 AND | |
3484 pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */ | |
3485 { | |
3486 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
3487 | |
3488 /* log result */ | |
3489 cmh_logRslt ( srcBuf, RAT_OK, | |
3490 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
3491 } | |
3492 } | |
3493 } | |
3494 | |
3495 /* | |
3496 +-------------------------------------------------------------------+ | |
3497 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
3498 | ROUTINE : cmhCC_NotifySS | | |
3499 +-------------------------------------------------------------------+ | |
3500 | |
3501 PURPOSE : SS notification received: in preamble, some | |
3502 local functions, otherwise, the function would be huge... | |
3503 | |
3504 */ | |
3505 | |
3506 | |
3507 /* | |
3508 +------------------------------------------------------------------------------ | |
3509 | Function : cssx2I_Code_Convert | |
3510 +------------------------------------------------------------------------------ | |
3511 | Description : This function converts CSSX codes to CSSI codes. | |
3512 | | |
3513 | Parameters : cssx_code - CSS(X) code | |
3514 | | |
3515 | Return : CSSI_CODE_ XXX - exit sucessful with CSSI_CODE_ | |
3516 | CSSI_CODE_NotPresent - exit not sueccessful | |
3517 +------------------------------------------------------------------------------ | |
3518 */ | |
3519 | |
3520 LOCAL T_ACI_CSSI_CODE cssx2I_Code_Convert(T_ACI_CSSX_CODE cssx_code) | |
3521 { | |
3522 T_ACI_CSSI_CODE cssi_code; | |
3523 switch (cssx_code) | |
3524 { | |
3525 case( CSSX_CODE_ForwardedCall ): | |
3526 cssi_code = CSSI_CODE_ForwardedCall; | |
3527 break; | |
3528 case( CSSX_CODE_CFUActive ): | |
3529 cssi_code = CSSI_CODE_CFUActive; | |
3530 break; | |
3531 case( CSSX_CODE_SomeCCFActive ): | |
3532 cssi_code = CSSI_CODE_SomeCCFActive; | |
3533 break; | |
3534 case( CSSX_CODE_CallWaiting ): | |
3535 cssi_code = CSSI_CODE_CallWaiting; | |
3536 break; | |
3537 case( CSSX_CODE_OutCallsBarred ): | |
3538 cssi_code = CSSI_CODE_OutCallsBarred; | |
3539 break; | |
3540 case( CSSX_CODE_IncCallsBarred ): | |
3541 cssi_code = CSSI_CODE_IncCallsBarred; | |
3542 break; | |
3543 case( CSSX_CODE_CLIRSupRej ): | |
3544 cssi_code = CSSI_CODE_CLIRSupRej; | |
3545 break; | |
3546 case( CSSX_CODE_DeflectedCall ): | |
3547 cssi_code = CSSI_CODE_DeflectedCall; | |
3548 break; | |
3549 case( CSSX_CODE_CUGCall ): | |
3550 cssi_code = CSSI_CODE_CUGCall; | |
3551 break; | |
3552 | |
3553 default: | |
3554 cssi_code = CSSI_CODE_NotPresent; | |
3555 break; | |
3556 } | |
3557 return cssi_code; | |
3558 } | |
3559 | |
3560 /* | |
3561 +------------------------------------------------------------------------------ | |
3562 | Function : cssx2U_Code_Convert | |
3563 +------------------------------------------------------------------------------ | |
3564 | Description : This function converts CSSX codes to CSSU codes. | |
3565 | | |
3566 | Parameters : cssx_code - CSS(X) code | |
3567 | | |
3568 | Return : CSSU_CODE_ XXX - exit sucessful with CSSU_CODE_ | |
3569 | CSSU_CODE_NotPresent - exit not sueccessful | |
3570 +------------------------------------------------------------------------------ | |
3571 */ | |
3572 | |
3573 LOCAL T_ACI_CSSU_CODE cssx2U_Code_Convert(T_ACI_CSSX_CODE cssx_code) | |
3574 { | |
3575 T_ACI_CSSU_CODE cssu_code; | |
3576 switch (cssx_code) | |
3577 { | |
3578 case( CSSX_CODE_ForwardedCall ): | |
3579 cssu_code = CSSU_CODE_ForwardedCall; | |
3580 break; | |
3581 case( CSSX_CODE_CUGCall ): | |
3582 cssu_code = CSSU_CODE_CUGCall ; | |
3583 break; | |
3584 case( CSSX_CODE_OnHold ): | |
3585 cssu_code = CSSU_CODE_OnHold; | |
3586 break; | |
3587 case( CSSX_CODE_Retrieved ): | |
3588 cssu_code = CSSU_CODE_Retrieved; | |
3589 break; | |
3590 case( CSSX_CODE_Multiparty ): | |
3591 cssu_code = CSSU_CODE_Multiparty; | |
3592 break; | |
3593 case( CSSX_CODE_HeldCallRel ): | |
3594 cssu_code = CSSU_CODE_HeldCallRel; | |
3595 break; | |
3596 case( CSSX_CODE_FwrdCheckSS ): | |
3597 cssu_code = CSSU_CODE_FwrdCheckSS; | |
3598 break; | |
3599 case( CSSX_CODE_ECTAlert ): | |
3600 cssu_code = CSSU_CODE_ECTAlert; | |
3601 break; | |
3602 case( CSSX_CODE_ECTConnect ): | |
3603 cssu_code = CSSU_CODE_ECTConnect; | |
3604 break; | |
3605 case( CSSX_CODE_DeflectedCall ): | |
3606 cssu_code = CSSU_CODE_DeflectedCall; | |
3607 break; | |
3608 | |
3609 default: | |
3610 cssu_code = CSSU_CODE_NotPresent; | |
3611 break; | |
3612 } | |
3613 return cssu_code; | |
3614 } | |
3615 | |
3616 | |
3617 /* | |
3618 +------------------------------------------------------------------------------ | |
3619 | Function : send_CSSX_notification | |
3620 +------------------------------------------------------------------------------ | |
3621 | Description : This function sends CSSU and CSSI. | |
3622 | | |
3623 | Parameters : ctbIdx - call table index | |
3624 | cssx_code - CSS(X) code | |
3625 | index - Index | |
3626 | *number - buffer for number | |
3627 | *toa - buffers type of address | |
3628 | *subaddr - buffer for subaddress | |
3629 | *tos - holds type of subaddress | |
3630 | | |
3631 | Return : | |
3632 +------------------------------------------------------------------------------ | |
3633 */ | |
3634 | |
3635 GLOBAL void send_CSSX_notification(SHORT ctbIdx, | |
3636 T_ACI_CSSX_CODE cssx_code, | |
3637 SHORT index, | |
3638 CHAR *number, | |
3639 T_ACI_TOA *toa, | |
3640 CHAR *subaddr, | |
3641 T_ACI_TOS *tos) | |
3642 | |
3643 { | |
3644 UBYTE idx; /* holds index counter */ | |
3645 | |
3646 /* Check if CC State is CS ACT REQ */ | |
3647 if (ctbIdx > NO_ENTRY AND | |
3648 psaCC_ctb(ctbIdx)->calStat EQ CS_ACT_REQ AND | |
3649 psaCC_ctb(ctbIdx)->calType EQ CT_MOC) | |
3650 { | |
3651 T_ACI_CSSI_CODE cssi_code; | |
3652 cssi_code = cssx2I_Code_Convert(cssx_code); | |
3653 if (cssi_code != CSSI_CODE_NotPresent ) | |
3654 { | |
3655 S8 source = psaCC_ctb(ctbIdx)->curSrc; | |
3656 R_AT( RAT_CSSI, source)( cssi_code, index ); | |
3657 } | |
3658 } | |
3659 else /* (calldirection EQ CT_MTC) */ | |
3660 { | |
3661 /* Sent CSSU TO ALL */ | |
3662 T_ACI_CSSU_CODE cssu_code; | |
3663 cssu_code = cssx2U_Code_Convert(cssx_code); | |
3664 if (cssu_code != CSSU_CODE_NotPresent ) | |
3665 { | |
3666 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
3667 { | |
3668 R_AT( RAT_CSSU, idx )(cssu_code, index, number, toa, subaddr, tos); | |
3669 } | |
3670 } | |
3671 } | |
3672 } | |
3673 | |
3674 | |
3675 | |
3676 LOCAL void cmhCC_NotifySS_v_ssCode( SHORT cId, T_NOTIFY_SS_INV *ntfySS ) | |
3677 { | |
3678 CHAR numBuf[MAX_B_SUBSCR_NUM_LEN]; /* buffer for number */ | |
3679 T_ACI_TOA toa; /* holds type of address */ | |
3680 CHAR subBuf[MAX_SUBADDR_LEN]; /* buffer for subaddress */ | |
3681 T_ACI_TOS tos; /* holds type of subaddress */ | |
3682 | |
3683 TRACE_FUNCTION ("cmhCC_NotifySS_v_ssCode()"); | |
3684 | |
3685 switch( ntfySS -> notifySSArg.ssCode ) | |
3686 { | |
3687 case( SS_CD_ALL_FWSS ): | |
3688 case( SS_CD_CFU ): | |
3689 if( ntfySS -> notifySSArg.v_ssStatus AND | |
3690 ntfySS -> notifySSArg.ssStatus & SSS_A ) | |
3691 { | |
3692 send_CSSX_notification(cId, | |
3693 CSSX_CODE_CFUActive, | |
3694 ACI_NumParmNotPresent, | |
3695 NULL, NULL, NULL, NULL); | |
3696 } | |
3697 break; | |
3698 | |
3699 case( SS_CD_CFB ): | |
3700 case( SS_CD_CFNRY ): | |
3701 case( SS_CD_CFNRC ): | |
3702 case( SS_CD_ALL_CFWSS ): | |
3703 | |
3704 if( ntfySS -> notifySSArg.v_ssStatus AND | |
3705 ntfySS -> notifySSArg.ssStatus & SSS_A ) | |
3706 { | |
3707 | |
3708 send_CSSX_notification(cId, | |
3709 CSSX_CODE_SomeCCFActive, | |
3710 ACI_NumParmNotPresent, | |
3711 NULL, NULL, NULL, NULL); | |
3712 } | |
3713 break; | |
3714 | |
3715 case( SS_CD_ALL_CBSS ): | |
3716 | |
3717 if( ntfySS -> notifySSArg.v_ssStatus AND | |
3718 ntfySS -> notifySSArg.ssStatus & SSS_A ) | |
3719 { | |
3720 /* RAT_CSSI ... outgoing calls are barred */ | |
3721 /* RAT_CSSI ... incoming calls are barred */ | |
3722 send_CSSX_notification(cId, | |
3723 CSSX_CODE_OutCallsBarred, | |
3724 ACI_NumParmNotPresent, | |
3725 NULL, NULL, NULL, NULL); | |
3726 | |
3727 send_CSSX_notification(cId, | |
3728 CSSX_CODE_IncCallsBarred, | |
3729 ACI_NumParmNotPresent, | |
3730 NULL, NULL, NULL, NULL); | |
3731 | |
3732 } | |
3733 break; | |
3734 | |
3735 case( SS_CD_BOC ): | |
3736 case( SS_CD_BAOC ): | |
3737 case( SS_CD_BOIC ): | |
3738 case( SS_CD_BOICXH ): | |
3739 | |
3740 if( ntfySS -> notifySSArg.v_ssStatus AND | |
3741 ntfySS -> notifySSArg.ssStatus & SSS_A ) | |
3742 { | |
3743 /* RAT_CSSI ... outgoing calls are barred */ | |
3744 send_CSSX_notification(cId, | |
3745 CSSX_CODE_OutCallsBarred, | |
3746 ACI_NumParmNotPresent, | |
3747 NULL, NULL, NULL, NULL); | |
3748 | |
3749 } | |
3750 break; | |
3751 | |
3752 case( SS_CD_BIC ): | |
3753 case( SS_CD_BAIC ): | |
3754 case( SS_CD_BICRM ): | |
3755 | |
3756 if( ntfySS -> notifySSArg.v_ssStatus AND | |
3757 ntfySS -> notifySSArg.ssStatus & SSS_A ) | |
3758 { | |
3759 /* RAT_CSSI ... incoming calls are barred */ | |
3760 send_CSSX_notification(cId, | |
3761 CSSX_CODE_IncCallsBarred, | |
3762 ACI_NumParmNotPresent, | |
3763 NULL, NULL, NULL, NULL); | |
3764 | |
3765 } | |
3766 break; | |
3767 | |
3768 case( SS_CD_CD ): | |
3769 if (ntfySS->notifySSArg.v_ssNotification AND | |
3770 ntfySS->notifySSArg.ssNotification.fwdSubscriber EQ | |
3771 FWD_C_INC_CALL_FWD) | |
3772 { | |
3773 /* | |
3774 * If alerting is allowed now, send the CSSU indication. | |
3775 * Otherwise just remember that we got this notification. | |
3776 */ | |
3777 if ((ccShrdPrm.TCHasg EQ TRUE) OR | |
3778 (psaCC_ctb(cId)->sigInf NEQ SIG_NOT_PRES)) | |
3779 | |
3780 { | |
3781 /* | |
3782 * The conditions for user alerting are fulfilled. | |
3783 * Send the +CSSU: unsolicited result code now. | |
3784 */ | |
3785 send_CSSX_notification(cId, | |
3786 CSSX_CODE_DeflectedCall, | |
3787 ACI_NumParmNotPresent, | |
3788 psaCC_ctbRdrAdr2Num (cId, numBuf, sizeof (numBuf)), | |
3789 cmhCC_ctbGetRdrNumTyp (cId, &toa), | |
3790 psaCC_ctbRdrAdr2Sub (cId, subBuf), | |
3791 cmhCC_ctbGetRdrSubTyp (cId, &tos)); | |
3792 | |
3793 psaCC_FreeRdrPty (cId); | |
3794 psaCC_ctb(cId)->CDStat = NO_VLD_CD; | |
3795 } | |
3796 else | |
3797 { | |
3798 /* | |
3799 * Indication of the MT call towards the MMI is deferred until | |
3800 * the alerting conditions are fulfilled (TCH assignment). | |
3801 */ | |
3802 psaCC_ctb(cId)->CDStat = CD_Notified; | |
3803 } | |
3804 return; | |
3805 } | |
3806 | |
3807 if (ntfySS->notifySSArg.v_ssNotification AND | |
3808 ntfySS->notifySSArg.ssNotification.clgSubscriber EQ | |
3809 CLG_A_OUTG_CALL_FWD_C) | |
3810 { | |
3811 /* RAT_CSSI ... outgoing call has been deflected */ | |
3812 send_CSSX_notification(cId, | |
3813 CSSX_CODE_DeflectedCall, | |
3814 ACI_NumParmNotPresent, | |
3815 NULL, NULL, NULL, NULL); | |
3816 | |
3817 } | |
3818 break; | |
3819 | |
3820 default: | |
3821 TRACE_EVENT( "UNHANDLED SS-CODE IN NOTIFY" ); | |
3822 break; | |
3823 } | |
3824 } | |
3825 | |
3826 LOCAL void cmhCC_NotifySS_v_ssNotification( SHORT cId, T_NOTIFY_SS_INV *ntfySS ) | |
3827 { | |
3828 | |
3829 TRACE_FUNCTION ("cmhCC_NotifySS_v_ssNotification()"); | |
3830 | |
3831 if( ntfySS -> notifySSArg.ssNotification.clgSubscriber EQ | |
3832 CLG_A_OUTG_CALL_FWD_C ) | |
3833 { | |
3834 /* RAT_CSSI ... outgoing call has been forwarded */ | |
3835 send_CSSX_notification(cId, | |
3836 CSSX_CODE_ForwardedCall, | |
3837 ACI_NumParmNotPresent, | |
3838 NULL, NULL, NULL, NULL); | |
3839 } | |
3840 | |
3841 if( ntfySS -> notifySSArg.ssNotification.fwgSubscriber EQ | |
3842 FWG_B_INC_CALL_FWD_C ) | |
3843 { | |
3844 /* RAT_CSSU ... this is a forwarded call */ | |
3845 send_CSSX_notification(cId, | |
3846 CSSX_CODE_ForwardedCall, | |
3847 ACI_NumParmNotPresent , | |
3848 NULL, NULL, NULL, NULL); | |
3849 | |
3850 } | |
3851 | |
3852 if( ntfySS -> notifySSArg.ssNotification.fwdSubscriber EQ | |
3853 FWD_C_INC_CALL_FWD ) | |
3854 { | |
3855 /* RAT_CSSU ... this is a forwarded call */ | |
3856 send_CSSX_notification(cId, | |
3857 CSSX_CODE_ForwardedCall, | |
3858 ACI_NumParmNotPresent , | |
3859 NULL, NULL, NULL, NULL); | |
3860 | |
3861 } | |
3862 } | |
3863 | |
3864 | |
3865 | |
3866 | |
3867 LOCAL void cmhCC_NotifySS_v_ectIndicator( SHORT cId, T_NOTIFY_SS_INV *ntfySS ) | |
3868 { | |
3869 CHAR numBuf[MAX_B_SUBSCR_NUM_LEN]; /* buffer for number */ | |
3870 T_ACI_TOA toa; /* holds type of address */ | |
3871 CHAR subBuf[MAX_SUBADDR_LEN]; /* buffer for subaddress */ | |
3872 T_ACI_TOS tos; /* holds type of subaddress */ | |
3873 BOOL numFlg = FALSE; /* flags a present number */ | |
3874 BOOL subFlg = FALSE; /* flags a present subaddress */ | |
3875 | |
3876 TRACE_FUNCTION ("cmhCC_NotifySS_v_ectIndicator()"); | |
3877 | |
3878 /* note that according to GSM 04.91, indications without RDN are | |
3879 possible but not without ectCallState */ | |
3880 if( ntfySS -> notifySSArg.ectIndicator.v_ectCallState ) | |
3881 { | |
3882 /* (G)ACI-FIX-1415 */ | |
3883 if(ntfySS -> notifySSArg.ectIndicator.v_rdn ) | |
3884 { | |
3885 if( ntfySS -> notifySSArg.ectIndicator. | |
3886 rdn.v_presentationAllowedAddress ) | |
3887 { | |
3888 if( ntfySS -> notifySSArg.ectIndicator. | |
3889 rdn.presentationAllowedAddress.v_partyNumber AND | |
3890 ntfySS -> notifySSArg.ectIndicator. | |
3891 rdn.presentationAllowedAddress.partyNumber.c_bcdDigit ) | |
3892 { | |
3893 utl_BCD2DialStr | |
3894 (ntfySS -> notifySSArg.ectIndicator. | |
3895 rdn.presentationAllowedAddress.partyNumber.bcdDigit, | |
3896 numBuf, | |
3897 ntfySS -> notifySSArg.ectIndicator. | |
3898 rdn.presentationAllowedAddress.partyNumber.c_bcdDigit); | |
3899 | |
3900 toa.npi = ntfySS -> notifySSArg.ectIndicator. | |
3901 rdn.presentationAllowedAddress.partyNumber.npi; | |
3902 toa.ton = ntfySS -> notifySSArg.ectIndicator. | |
3903 rdn.presentationAllowedAddress.partyNumber.noa; | |
3904 | |
3905 numFlg = TRUE; | |
3906 } | |
3907 | |
3908 if( ntfySS -> notifySSArg.ectIndicator. | |
3909 rdn.presentationAllowedAddress.v_partySubaddress AND | |
3910 ntfySS -> notifySSArg.ectIndicator. | |
3911 rdn.presentationAllowedAddress.partySubaddress.c_bcdDigit ) | |
3912 { | |
3913 utl_BCD2DialStr | |
3914 (ntfySS -> notifySSArg.ectIndicator. | |
3915 rdn.presentationAllowedAddress.partySubaddress.bcdDigit, | |
3916 subBuf, | |
3917 ntfySS -> notifySSArg.ectIndicator. | |
3918 rdn.presentationAllowedAddress.partySubaddress.c_bcdDigit); | |
3919 | |
3920 tos.tos = ntfySS -> notifySSArg.ectIndicator. | |
3921 rdn.presentationAllowedAddress.partySubaddress.tos; | |
3922 tos.oe = ntfySS -> notifySSArg.ectIndicator. | |
3923 rdn.presentationAllowedAddress.partySubaddress.oei; | |
3924 | |
3925 subFlg = TRUE; | |
3926 } | |
3927 } | |
3928 /* check if the override case occured, do present RDN, (G)ACI-FIX-1434 */ | |
3929 /* if presentationAllowedAddress is present then it is obsolete to look | |
3930 at presentationRestrictedAddress */ | |
3931 else if( ntfySS -> notifySSArg.ectIndicator. | |
3932 rdn.v_presentationRestrictedAddress ) | |
3933 { | |
3934 if( ntfySS -> notifySSArg.ectIndicator. | |
3935 rdn.presentationRestrictedAddress.v_partyNumber AND | |
3936 ntfySS -> notifySSArg.ectIndicator. | |
3937 rdn.presentationRestrictedAddress.partyNumber.c_bcdDigit ) | |
3938 { | |
3939 utl_BCD2DialStr | |
3940 (ntfySS -> notifySSArg.ectIndicator. | |
3941 rdn.presentationRestrictedAddress.partyNumber.bcdDigit, | |
3942 numBuf, | |
3943 ntfySS -> notifySSArg.ectIndicator. | |
3944 rdn.presentationRestrictedAddress.partyNumber.c_bcdDigit); | |
3945 | |
3946 toa.npi = ntfySS -> notifySSArg.ectIndicator. | |
3947 rdn.presentationRestrictedAddress.partyNumber.npi; | |
3948 toa.ton = ntfySS -> notifySSArg.ectIndicator. | |
3949 rdn.presentationRestrictedAddress.partyNumber.noa; | |
3950 | |
3951 numFlg = TRUE; | |
3952 } | |
3953 | |
3954 if( ntfySS -> notifySSArg.ectIndicator. | |
3955 rdn.presentationRestrictedAddress.v_partySubaddress AND | |
3956 ntfySS -> notifySSArg.ectIndicator. | |
3957 rdn.presentationRestrictedAddress.partySubaddress.c_bcdDigit ) | |
3958 { | |
3959 utl_BCD2DialStr | |
3960 (ntfySS -> notifySSArg.ectIndicator. | |
3961 rdn.presentationRestrictedAddress.partySubaddress.bcdDigit, | |
3962 subBuf, | |
3963 ntfySS -> notifySSArg.ectIndicator. | |
3964 rdn.presentationRestrictedAddress.partySubaddress.c_bcdDigit); | |
3965 | |
3966 tos.tos = ntfySS -> notifySSArg.ectIndicator. | |
3967 rdn.presentationRestrictedAddress.partySubaddress.tos; | |
3968 tos.oe = ntfySS -> notifySSArg.ectIndicator. | |
3969 rdn.presentationRestrictedAddress.partySubaddress.oei; | |
3970 | |
3971 subFlg = TRUE; | |
3972 } | |
3973 } | |
3974 } | |
3975 | |
3976 switch( ntfySS -> notifySSArg.ectIndicator.ectCallState ) | |
3977 { | |
3978 case( ECT_CS_ALERTING ): | |
3979 /* RAT_CSSU ... ECT alerting */ | |
3980 send_CSSX_notification(cId, | |
3981 CSSX_CODE_ECTAlert, | |
3982 ACI_NumParmNotPresent, | |
3983 (numFlg)?numBuf:NULL, | |
3984 (numFlg)?&toa:NULL, | |
3985 (subFlg)?subBuf:NULL, | |
3986 (subFlg)?&tos:NULL); | |
3987 break; | |
3988 | |
3989 case( ECT_CS_ACTIVE ): | |
3990 /* RAT_CSSU ... ECT active */ | |
3991 send_CSSX_notification(cId, | |
3992 CSSX_CODE_ECTConnect, | |
3993 ACI_NumParmNotPresent, | |
3994 (numFlg)?numBuf:NULL, | |
3995 (numFlg)?&toa:NULL, | |
3996 (subFlg)?subBuf:NULL, | |
3997 (subFlg)?&tos:NULL); | |
3998 | |
3999 break; | |
4000 } | |
4001 } | |
4002 } | |
4003 | |
4004 LOCAL void cmhCC_NotifySS_v_ccbsf( T_NOTIFY_SS_INV *ntfySS ) | |
4005 { | |
4006 T_ACI_CCBS_SET ccbsSet; /* holds ccbs setting */ | |
4007 | |
4008 TRACE_FUNCTION ("cmhCC_NotifySS_v_ccbsf()"); | |
4009 | |
4010 if( ntfySS -> notifySSArg.ccbsf.v_ccbsIndex ) | |
4011 { | |
4012 ccbsSet.idx = ntfySS -> notifySSArg.ccbsf.ccbsIndex; | |
4013 } | |
4014 else | |
4015 ccbsSet.idx = ACI_NumParmNotPresent; | |
4016 | |
4017 if( ntfySS -> notifySSArg.ccbsf.v_b_subscriberNumber AND | |
4018 ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.c_bcdDigit) | |
4019 { | |
4020 utl_BCD2DialStr | |
4021 (ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.bcdDigit, | |
4022 ccbsSet.number, | |
4023 ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.c_bcdDigit); | |
4024 | |
4025 ccbsSet.type.npi = ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.npi; | |
4026 ccbsSet.type.ton = ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.noa; | |
4027 } | |
4028 else | |
4029 { | |
4030 ccbsSet.number[0] = 0x0; | |
4031 ccbsSet.type.npi = NPI_NotPresent; | |
4032 ccbsSet.type.ton = TON_NotPresent; | |
4033 } | |
4034 | |
4035 if( ntfySS -> notifySSArg.ccbsf.v_b_subscriberSubaddress AND | |
4036 ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.c_bcdDigit) | |
4037 { | |
4038 utl_BCD2DialStr | |
4039 (ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.bcdDigit, | |
4040 ccbsSet.subaddr, | |
4041 ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.c_bcdDigit); | |
4042 | |
4043 ccbsSet.satype.tos = ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.tos; | |
4044 ccbsSet.satype.oe = ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.oei; | |
4045 } | |
4046 else | |
4047 { | |
4048 ccbsSet.subaddr[0] = 0x0; | |
4049 ccbsSet.satype.tos = TOS_NotPresent; | |
4050 ccbsSet.satype.oe = OE_NotPresent; | |
4051 } | |
4052 | |
4053 if( ntfySS -> notifySSArg.ccbsf.v_basicServiceGroup ) | |
4054 ccbsSet.class_type = cmhSS_GetClass( (T_basicService*)&ntfySS -> notifySSArg.ccbsf. | |
4055 basicServiceGroup ); | |
4056 else | |
4057 ccbsSet.class_type = CLASS_NotPresent; | |
4058 | |
4059 if( ntfySS -> notifySSArg.v_alertingPattern ) | |
4060 { | |
4061 ccbsSet.alrtPtn = ntfySS -> notifySSArg.alertingPattern; | |
4062 } | |
4063 else | |
4064 { | |
4065 ccbsSet.alrtPtn = ALPT_NotPresent; | |
4066 } | |
4067 | |
4068 cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_Recall, | |
4069 CCBS_STAT_NotPresent, &ccbsSet ); | |
4070 } | |
4071 | |
4072 | |
4073 GLOBAL void cmhCC_NotifySS( SHORT cId, T_NOTIFY_SS_INV *ntfySS ) | |
4074 { | |
4075 UBYTE idx; /* holds index counter */ | |
4076 T_callingName *NameId; /* holds Name Identifier for CNAP */ | |
4077 | |
4078 TRACE_FUNCTION ("cmhCC_NotifySS()"); | |
4079 | |
4080 /* check SS code */ | |
4081 if( ntfySS -> notifySSArg.v_ssCode ) | |
4082 { | |
4083 cmhCC_NotifySS_v_ssCode( cId, ntfySS ); | |
4084 } | |
4085 | |
4086 /* check SS notification */ | |
4087 if( ntfySS -> notifySSArg.v_ssNotification ) | |
4088 { | |
4089 cmhCC_NotifySS_v_ssNotification( cId, ntfySS ); | |
4090 } | |
4091 | |
4092 /* check call is waiting indicator */ | |
4093 if( ntfySS -> notifySSArg.v_callIsWaitingIndicator ) | |
4094 { | |
4095 /* RAT_CSSI ... call is waiting */ | |
4096 send_CSSX_notification(cId, | |
4097 CSSX_CODE_CallWaiting, | |
4098 ACI_NumParmNotPresent, | |
4099 NULL, NULL, NULL, NULL); | |
4100 | |
4101 } | |
4102 | |
4103 /* check call on hold indicator */ | |
4104 if( ntfySS -> notifySSArg.v_callOnHoldIndicator ) | |
4105 { | |
4106 switch( ntfySS -> notifySSArg.callOnHoldIndicator ) | |
4107 { | |
4108 case( CHLD_CALL_RETRIEVED ): | |
4109 send_CSSX_notification(cId, | |
4110 CSSX_CODE_Retrieved, | |
4111 ACI_NumParmNotPresent , | |
4112 NULL, NULL, NULL, NULL); | |
4113 | |
4114 break; | |
4115 | |
4116 case( CHLD_CALL_ON_HOLD ): | |
4117 /* RAT_CSSU ... call has been put on hold */ | |
4118 send_CSSX_notification(cId, | |
4119 CSSX_CODE_OnHold, | |
4120 ACI_NumParmNotPresent , | |
4121 NULL, NULL, NULL, NULL); | |
4122 | |
4123 break; | |
4124 } | |
4125 } | |
4126 | |
4127 /* check multparty indicator */ | |
4128 if( ntfySS -> notifySSArg.v_mptyIndicator ) | |
4129 { | |
4130 /* If the Call is on hold and a SS_Notify with a MPTY | |
4131 the state shall change from CS_HOLD to CS_ACT */ | |
4132 psaCC_ctb(cId)->calStat = CS_ACT; | |
4133 /* mptyStat equal to CS_ACT_REQ set it to CS_ACT | |
4134 required to place multiparty call on hold */ | |
4135 if(psaCC_ctb(cId)->mptyStat EQ CS_ACT_REQ) | |
4136 { | |
4137 psaCC_ctb(cId)->mptyStat = CS_ACT; | |
4138 } | |
4139 | |
4140 /* RAT_CSSU ... multiparty call entered */ | |
4141 send_CSSX_notification(cId, | |
4142 CSSX_CODE_Multiparty, | |
4143 ACI_NumParmNotPresent , | |
4144 NULL, NULL, NULL, NULL); | |
4145 | |
4146 } | |
4147 | |
4148 /* check CUG index */ | |
4149 if( ntfySS -> notifySSArg.v_cugIndex ) | |
4150 { | |
4151 send_CSSX_notification(cId, | |
4152 CSSX_CODE_CUGCall, | |
4153 ntfySS -> notifySSArg.cugIndex, | |
4154 NULL, NULL, NULL, NULL); | |
4155 } | |
4156 | |
4157 /* check CLIR suppression */ | |
4158 if( ntfySS -> notifySSArg.v_clirSuppressionRejected ) | |
4159 { | |
4160 /* RAT_CSSI ... CLIR suppression rejected */ | |
4161 send_CSSX_notification(cId, | |
4162 CSSX_CODE_CLIRSupRej, | |
4163 ACI_NumParmNotPresent, | |
4164 NULL, NULL, NULL, NULL); | |
4165 | |
4166 } | |
4167 | |
4168 /* check ECT indicator */ | |
4169 if( ntfySS -> notifySSArg.v_ectIndicator ) | |
4170 { | |
4171 cmhCC_NotifySS_v_ectIndicator( cId, ntfySS ); | |
4172 } | |
4173 | |
4174 /* check CNAP indicator */ | |
4175 if( ntfySS -> notifySSArg.v_nameIndicator ) | |
4176 { | |
4177 if ( ntfySS -> notifySSArg.nameIndicator.v_callingName ) | |
4178 { | |
4179 NameId = &(ntfySS -> notifySSArg.nameIndicator.callingName); | |
4180 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
4181 { | |
4182 R_AT( RAT_CNAP, idx ) | |
4183 ( NameId, CNAP_SERVICE_STATUS_NOT_PRESENT); | |
4184 } | |
4185 } | |
4186 } | |
4187 | |
4188 /* check CCBS feature */ | |
4189 if( ntfySS -> notifySSArg.v_ccbsf ) | |
4190 { | |
4191 cmhCC_NotifySS_v_ccbsf( ntfySS ); | |
4192 } | |
4193 } | |
4194 | |
4195 | |
4196 | |
4197 /* | |
4198 +------------------------------------------------------------------------------ | |
4199 | Function : cmhCC_CheckSS | |
4200 +------------------------------------------------------------------------------ | |
4201 | Description : check SS indication received. | |
4202 | | |
4203 | Parameters : cId - | |
4204 | | |
4205 | Return : | |
4206 +------------------------------------------------------------------------------ | |
4207 */ | |
4208 GLOBAL void cmhCC_CheckSS( SHORT cId ) | |
4209 { | |
4210 UBYTE idx; /* holds index counter */ | |
4211 | |
4212 TRACE_FUNCTION ("cmhCC_CheckSS()"); | |
4213 | |
4214 /* | |
4215 *------------------------------------------------------------------- | |
4216 * indicate check SS | |
4217 *------------------------------------------------------------------- | |
4218 */ | |
4219 /* RAT_CSSU ... forward check SS indication */ | |
4220 for( idx = 0; idx < CMD_SRC_MAX; idx++ ) | |
4221 { | |
4222 send_CSSX_notification( cId, | |
4223 CSSX_CODE_FwrdCheckSS, | |
4224 ACI_NumParmNotPresent, | |
4225 NULL, NULL, NULL, NULL); | |
4226 | |
4227 } | |
4228 } | |
4229 | |
4230 /* | |
4231 +-------------------------------------------------------------------+ | |
4232 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4233 | ROUTINE : cmhCC_CCBSRegistered | | |
4234 +-------------------------------------------------------------------+ | |
4235 | |
4236 PURPOSE : call completion to busy subscriber successfully registered. | |
4237 | |
4238 */ | |
4239 | |
4240 GLOBAL void cmhCC_CCBSRegistered( SHORT cId, | |
4241 T_ACC_REGISTER_CC_ENTRY_RES *CCBSreg ) | |
4242 { | |
4243 UBYTE cmdBuf; /* buffers command */ | |
4244 UBYTE srcBuf; /* buffers command source */ | |
4245 T_ACI_CCBS_SET ccbsSet; /* holds ccbs setting */ | |
4246 | |
4247 TRACE_FUNCTION ("cmhCC_CCBSRegistered()"); | |
4248 | |
4249 /* check for command context */ | |
4250 if( psaCC_ctb(cId)->curCmd NEQ AT_CMD_CHLD ) | |
4251 { | |
4252 TRACE_EVENT("cmhCC_CCBSRegistered: wrong command context !"); | |
4253 return; | |
4254 } | |
4255 | |
4256 if( CCBSreg->accRegisterCCEntryRes.v_ccbsf ) | |
4257 { | |
4258 if( CCBSreg->accRegisterCCEntryRes.ccbsf.v_ccbsIndex ) | |
4259 | |
4260 ccbsSet.idx = CCBSreg->accRegisterCCEntryRes.ccbsf.ccbsIndex; | |
4261 else | |
4262 ccbsSet.idx = ACI_NumParmNotPresent; | |
4263 | |
4264 | |
4265 if( CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4266 v_b_subscriberNumber AND | |
4267 CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4268 b_subscriberNumber.c_bcdDigit) | |
4269 { | |
4270 utl_BCD2DialStr | |
4271 (CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberNumber. | |
4272 bcdDigit, | |
4273 ccbsSet.number, | |
4274 CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberNumber. | |
4275 c_bcdDigit); | |
4276 | |
4277 ccbsSet.type.npi = CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4278 b_subscriberNumber.npi; | |
4279 ccbsSet.type.ton = CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4280 b_subscriberNumber.noa; | |
4281 } | |
4282 else | |
4283 { | |
4284 ccbsSet.number[0] = 0x0; | |
4285 ccbsSet.type.npi = NPI_NotPresent; | |
4286 ccbsSet.type.ton = TON_NotPresent; | |
4287 } | |
4288 | |
4289 if( CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4290 v_b_subscriberSubaddress AND | |
4291 CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4292 b_subscriberSubaddress.c_bcdDigit) | |
4293 { | |
4294 utl_BCD2DialStr | |
4295 (CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberSubaddress. | |
4296 bcdDigit, | |
4297 ccbsSet.subaddr, | |
4298 CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberSubaddress. | |
4299 c_bcdDigit); | |
4300 | |
4301 ccbsSet.satype.tos = CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4302 b_subscriberSubaddress.tos; | |
4303 ccbsSet.satype.oe = CCBSreg->accRegisterCCEntryRes.ccbsf. | |
4304 b_subscriberSubaddress.oei; | |
4305 } | |
4306 else | |
4307 { | |
4308 ccbsSet.subaddr[0] = 0x0; | |
4309 ccbsSet.satype.tos = TOS_NotPresent; | |
4310 ccbsSet.satype.oe = OE_NotPresent; | |
4311 } | |
4312 | |
4313 if( CCBSreg->accRegisterCCEntryRes.ccbsf.v_basicServiceGroup ) | |
4314 ccbsSet.class_type = cmhSS_GetClass( (T_basicService*)&CCBSreg->accRegisterCCEntryRes. | |
4315 ccbsf.basicServiceGroup ); | |
4316 else | |
4317 ccbsSet.class_type = CLASS_NotPresent; | |
4318 | |
4319 ccbsSet.alrtPtn = ALPT_NotPresent; | |
4320 } | |
4321 | |
4322 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
4323 cmhCC_tstAndUnflagCall( cId, &(cmhPrm[srcBuf].ccCmdPrm.mltyDscFlg)); | |
4324 psaCC_FreeCtbNtry (cId); | |
4325 | |
4326 cmhrat_ccbs( srcBuf, CCBS_IND_Registered, | |
4327 CCBS_STAT_NotPresent, &ccbsSet ); | |
4328 | |
4329 R_AT( RAT_OK, srcBuf ) ( cmdBuf ); | |
4330 | |
4331 /* log result */ | |
4332 cmh_logRslt ( srcBuf, RAT_OK, | |
4333 cmdBuf, (SHORT)(cId+1), -1, -1 ); | |
4334 } | |
4335 | |
4336 /* sends RAT_CCBS: sometimes it is an intermediate result, and sometimes it is an | |
4337 indication. | |
4338 When srcId = CMD_SRC_MAX, it is an indication and shall go to all sources... | |
4339 Otherwise, only to the source specified... */ | |
4340 GLOBAL void cmhrat_ccbs( UBYTE srcId, | |
4341 T_ACI_CCBS_IND ccbs_ind, | |
4342 T_ACI_CCBS_STAT status, | |
4343 T_ACI_CCBS_SET *setting ) | |
4344 { | |
4345 UBYTE idx; | |
4346 | |
4347 if( srcId EQ CMD_SRC_MAX ) | |
4348 { | |
4349 #if defined MFW || defined SMI OR defined FF_MMI_RIV | |
4350 rAT_PercentCCBS(ccbs_ind, status, setting); | |
4351 #endif | |
4352 | |
4353 #ifdef FF_ATI | |
4354 for( idx = CMD_SRC_ATI_1; idx < CMD_SRC_MAX; idx++ ) | |
4355 { | |
4356 srcId_cb = idx; | |
4357 rCI_PercentCCBS(ccbs_ind, status, setting, FALSE); | |
4358 } | |
4359 #endif /* FF_ATI */ | |
4360 | |
4361 return; | |
4362 } | |
4363 #if defined MFW || defined SMI OR defined FF_MMI_RIV | |
4364 if( srcId EQ CMD_SRC_LCL ) | |
4365 { | |
4366 rAT_PercentCCBS( ccbs_ind, status, setting ); | |
4367 return; | |
4368 } | |
4369 #endif | |
4370 | |
4371 /* else it is an ATI source */ | |
4372 srcId_cb = srcId; | |
4373 | |
4374 #ifdef FF_ATI | |
4375 rCI_PercentCCBS(ccbs_ind, status, setting, TRUE); | |
4376 #endif /* FF_ATI */ | |
4377 } | |
4378 | |
4379 | |
4380 /* | |
4381 +-------------------------------------------------------------------+ | |
4382 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4383 | ROUTINE : cmhCC_CDRegistered | | |
4384 +-------------------------------------------------------------------+ | |
4385 | |
4386 PURPOSE : Call Deflection (CD) successfully registered. | |
4387 | |
4388 */ | |
4389 | |
4390 GLOBAL void cmhCC_CDRegistered( SHORT cId ) | |
4391 { | |
4392 TRACE_FUNCTION ("cmhCC_CDRegistered()"); | |
4393 | |
4394 switch( psaCC_ctb(cId)->curCmd ) | |
4395 { | |
4396 case AT_CMD_CTFR: | |
4397 psaCC_ctb(cId)->CDStat = CD_Succeeded; | |
4398 break; | |
4399 | |
4400 default: /* This is unexpected or network failure, ignore the event */ | |
4401 break; | |
4402 } | |
4403 } | |
4404 | |
4405 | |
4406 /* | |
4407 +-------------------------------------------------------------------+ | |
4408 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4409 | ROUTINE : cmhCC_SSTransFail | | |
4410 +-------------------------------------------------------------------+ | |
4411 | |
4412 PURPOSE : SS transaction failed. | |
4413 | |
4414 */ | |
4415 | |
4416 GLOBAL void cmhCC_SSTransFail ( SHORT cId ) | |
4417 { | |
4418 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
4419 SHORT ctbIdx; /* holds call table index */ | |
4420 SHORT addId; /* holds additional call id */ | |
4421 UBYTE cmdBuf; /* buffers command */ | |
4422 UBYTE srcBuf; /* buffers command source */ | |
4423 | |
4424 TRACE_FUNCTION ("cmhCC_SSTransFail()"); | |
4425 | |
4426 /* | |
4427 *------------------------------------------------------------------- | |
4428 * check for command context | |
4429 *------------------------------------------------------------------- | |
4430 */ | |
4431 switch( psaCC_ctb(cId)->curCmd ) | |
4432 { | |
4433 /* | |
4434 *---------------------------------------------------------------- | |
4435 * process result for D and A command | |
4436 *---------------------------------------------------------------- | |
4437 */ | |
4438 case( AT_CMD_D ): | |
4439 case( AT_CMD_A ): | |
4440 | |
4441 /* restore call status for hold request*/ | |
4442 if( psaCC_ctb(cId)->calStat EQ CS_HLD_REQ ) | |
4443 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
4444 { | |
4445 if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
4446 psaCC_ctb(ctbIdx)->calStat EQ CS_HLD_REQ AND | |
4447 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT ) | |
4448 { | |
4449 psaCC_ctb(ctbIdx)->calStat = CS_ACT; | |
4450 } | |
4451 } | |
4452 | |
4453 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm; | |
4454 | |
4455 cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf); | |
4456 | |
4457 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
4458 { | |
4459 if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial AND | |
4460 pCCCmdPrm -> mltyCncFlg ) | |
4461 { | |
4462 for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ ) | |
4463 ; | |
4464 | |
4465 if( CHLDaddInfo EQ CHLD_ADD_INFO_DIAL_CAL ) | |
4466 { | |
4467 CHLDaddInfo = NO_CHLD_ADD_INFO; | |
4468 psaCC_FreeCtbNtry (addId); /* remove pending call */ | |
4469 } | |
4470 } | |
4471 | |
4472 pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */ | |
4473 | |
4474 R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent ); | |
4475 | |
4476 cmh_logRslt ( srcBuf, RAT_CME, | |
4477 cmdBuf, -1, -1, CME_ERR_NotPresent ); | |
4478 } | |
4479 break; | |
4480 | |
4481 /* | |
4482 *---------------------------------------------------------------- | |
4483 * process result for +CTFR command | |
4484 *---------------------------------------------------------------- | |
4485 */ | |
4486 case( AT_CMD_CTFR ): | |
4487 psaCC_ctb(cId)->CDStat = CD_Failed; | |
4488 break; | |
4489 | |
4490 /* | |
4491 *---------------------------------------------------------------- | |
4492 * process result for +CHLD command | |
4493 *---------------------------------------------------------------- | |
4494 */ | |
4495 case( AT_CMD_CHLD ): | |
4496 | |
4497 /* determine CHLD mode */ | |
4498 switch( cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm.CHLDmode ) | |
4499 { | |
4500 /* | |
4501 *------------------------------------------------------------ | |
4502 * no multiparty relation | |
4503 *------------------------------------------------------------ | |
4504 */ | |
4505 case( CHLD_MOD_NotPresent ): | |
4506 case( CHLD_MOD_RelHldOrUdub ): | |
4507 case( CHLD_MOD_RelActSpec ): | |
4508 | |
4509 TRACE_EVENT( "UNEXP CHLD MODE FOR SS ERROR COMP" ); | |
4510 return; | |
4511 | |
4512 /* | |
4513 *------------------------------------------------------------ | |
4514 * multiparty hold or retrieve | |
4515 *------------------------------------------------------------ | |
4516 */ | |
4517 case( CHLD_MOD_RelActAndAcpt ): | |
4518 case( CHLD_MOD_HldActAndAcpt ): | |
4519 | |
4520 /* restore call status for retrieve request */ | |
4521 if( psaCC_ctb(cId)->calStat EQ CS_ACT_REQ ) | |
4522 { | |
4523 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
4524 { | |
4525 if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
4526 psaCC_ctb(ctbIdx)->calStat EQ CS_ACT_REQ AND | |
4527 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT ) | |
4528 { | |
4529 psaCC_ctb(ctbIdx)->calStat = CS_HLD; | |
4530 } | |
4531 } | |
4532 psaCC_MPTY (cId, MPTY_RETRIEVE_FAIL); | |
4533 } | |
4534 | |
4535 /* restore call status for hold request*/ | |
4536 if( psaCC_ctb(cId)->calStat EQ CS_HLD_REQ ) | |
4537 { | |
4538 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
4539 { | |
4540 if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
4541 psaCC_ctb(ctbIdx)->calStat EQ CS_HLD_REQ AND | |
4542 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT ) | |
4543 { | |
4544 psaCC_ctb(ctbIdx)->calStat = CS_ACT; | |
4545 } | |
4546 } | |
4547 psaCC_MPTY (cId, MPTY_HOLD_FAIL); | |
4548 } | |
4549 | |
4550 break; | |
4551 | |
4552 /* | |
4553 *------------------------------------------------------------ | |
4554 * multiparty split | |
4555 *------------------------------------------------------------ | |
4556 */ | |
4557 case( CHLD_MOD_HldActExc ): | |
4558 | |
4559 psaCC_ctb(cId)->mptyStat = CS_ACT; | |
4560 psaCC_MPTY (cId, MPTY_SPLIT_FAIL); | |
4561 break; | |
4562 | |
4563 /* | |
4564 *------------------------------------------------------------ | |
4565 * multiparty build | |
4566 *------------------------------------------------------------ | |
4567 */ | |
4568 case( CHLD_MOD_AddHld ): | |
4569 | |
4570 /* restore call status for build request */ | |
4571 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
4572 { | |
4573 if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
4574 psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT_REQ AND | |
4575 psaCC_ctb(ctbIdx)->calStat EQ CS_HLD ) | |
4576 { | |
4577 psaCC_ctb(ctbIdx)->mptyStat = CS_IDL; | |
4578 } | |
4579 } | |
4580 | |
4581 if( psaCC_ctb(cId)->mptyStat EQ CS_ACT_REQ ) | |
4582 psaCC_ctb(cId)->mptyStat = CS_IDL; | |
4583 psaCC_MPTY (cId, MPTY_BUILD_FAIL); | |
4584 break; | |
4585 | |
4586 /* | |
4587 *------------------------------------------------------------ | |
4588 * explicit call transfer | |
4589 *------------------------------------------------------------ | |
4590 */ | |
4591 case( CHLD_MOD_Ect ): | |
4592 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm; | |
4593 TRACE_EVENT("ECT failed..."); | |
4594 | |
4595 TIMERSTOP( ACI_TECT ); | |
4596 | |
4597 /* restore call status for other call that was to be transfered */ | |
4598 for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ ) | |
4599 { | |
4600 if( ctbIdx EQ cId ) | |
4601 { | |
4602 continue; | |
4603 } | |
4604 else if (ccShrdPrm.ctb[ctbIdx] NEQ NULL AND | |
4605 cmhCC_tstAndUnflagCall( ctbIdx, &(pCCCmdPrm -> mltyDscFlg)) AND | |
4606 psaCC_ctb(ctbIdx)->curCmd EQ AT_CMD_CHLD ) | |
4607 { | |
4608 /* then it is the second call id */ | |
4609 cmhCC_PrepareCmdEnd (ctbIdx, NULL, NULL); | |
4610 } | |
4611 } | |
4612 | |
4613 /* restore first call id parameters */ | |
4614 cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf); | |
4615 | |
4616 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)) ) | |
4617 { | |
4618 R_AT( RAT_CME, srcBuf ) | |
4619 ( AT_CMD_CHLD, CME_ERR_Unknown ); | |
4620 | |
4621 cmh_logRslt ( srcBuf, RAT_CME, | |
4622 AT_CMD_CHLD, -1, -1, CME_ERR_Unknown ); | |
4623 } | |
4624 return; | |
4625 | |
4626 /* | |
4627 *------------------------------------------------------------ | |
4628 * call completion to busy subscriber | |
4629 *------------------------------------------------------------ | |
4630 */ | |
4631 case( CHLD_MOD_Ccbs ): | |
4632 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm; | |
4633 TRACE_EVENT("CCBS failed..."); | |
4634 | |
4635 /* restore first call id parameters */ | |
4636 cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf); | |
4637 | |
4638 if( psaCC_ctb(cId)->opCode EQ OPC_ACC_REGISTER_CC_ENTRY ) | |
4639 psaCC_FreeCtbNtry (cId); /* remove call table entry */ | |
4640 | |
4641 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)) ) | |
4642 { | |
4643 pCCCmdPrm -> mltyDscFlg = 0; /* unflag calls */ | |
4644 | |
4645 R_AT( RAT_CME, srcBuf ) | |
4646 ( AT_CMD_CHLD, CME_ERR_Unknown ); | |
4647 | |
4648 cmh_logRslt ( srcBuf, RAT_CME, | |
4649 AT_CMD_CHLD, -1, -1, CME_ERR_Unknown ); | |
4650 } | |
4651 return; | |
4652 } | |
4653 | |
4654 pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm; | |
4655 cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf); | |
4656 | |
4657 if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) | |
4658 { | |
4659 pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */ | |
4660 | |
4661 R_AT( RAT_CME, srcBuf ) ( AT_CMD_CHLD, CME_ERR_Unknown ); | |
4662 | |
4663 cmh_logRslt ( srcBuf, RAT_CME, | |
4664 AT_CMD_CHLD, -1, -1, CME_ERR_Unknown ); | |
4665 } | |
4666 | |
4667 break; | |
4668 } | |
4669 | |
4670 return; | |
4671 } | |
4672 | |
4673 /* | |
4674 +-------------------------------------------------------------------+ | |
4675 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4676 | ROUTINE : cmhCC_MPTYTimeout | | |
4677 +-------------------------------------------------------------------+ | |
4678 | |
4679 PURPOSE : handle multiparty timeout | |
4680 | |
4681 */ | |
4682 | |
4683 GLOBAL void cmhCC_MPTYTimeout ( void ) | |
4684 { | |
4685 TRACE_FUNCTION( "cmhCC_MPTYTimeout()" ); | |
4686 | |
4687 if (!psaCC_ctbIsValid (ccShrdPrm.cIdMPTY)) | |
4688 { | |
4689 TRACE_ERROR ("ccShrdPrm.cIdMPTY invalid"); | |
4690 return; | |
4691 } | |
4692 | |
4693 /* | |
4694 *------------------------------------------------------------------- | |
4695 * SS failure | |
4696 *------------------------------------------------------------------- | |
4697 */ | |
4698 #ifdef SIM_TOOLKIT | |
4699 if (psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv ) | |
4700 { | |
4701 psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv = FALSE; | |
4702 /* return network error cause GSM 11.14 / 12.12.3 */ | |
4703 cmhSAT_NtwErr( ADD_NO_CAUSE ); | |
4704 } | |
4705 #endif | |
4706 cmhCC_SSTransFail(ccShrdPrm.cIdMPTY); | |
4707 | |
4708 } | |
4709 | |
4710 /* | |
4711 +-------------------------------------------------------------------+ | |
4712 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4713 | ROUTINE : cmhCC_ECTTimeout | | |
4714 +-------------------------------------------------------------------+ | |
4715 | |
4716 PURPOSE : handle explicit call transfer timeout | |
4717 | |
4718 */ | |
4719 | |
4720 LOCAL SHORT search_ect_call(void) | |
4721 { | |
4722 SHORT idx; | |
4723 UBYTE chld_src; | |
4724 | |
4725 for(idx = 0; idx < MAX_CALL_NR; idx++) | |
4726 { | |
4727 if (ccShrdPrm.ctb[idx] NEQ NULL AND | |
4728 psaCC_ctb(idx)->curCmd EQ AT_CMD_CHLD) | |
4729 { | |
4730 chld_src = psaCC_ctb(idx)->curSrc; | |
4731 | |
4732 if( cmhPrm[chld_src].ccCmdPrm.CHLDmode EQ CHLD_MOD_Ect ) | |
4733 { | |
4734 return(idx); | |
4735 } | |
4736 } | |
4737 } | |
4738 return(NO_ENTRY); | |
4739 } | |
4740 | |
4741 GLOBAL void cmhCC_ECTTimeout ( void ) | |
4742 { | |
4743 SHORT ectId; | |
4744 | |
4745 TRACE_FUNCTION( "cmhCC_ECTTimeout()" ); | |
4746 | |
4747 ectId = search_ect_call( ); | |
4748 | |
4749 if (ectId NEQ NO_ENTRY) | |
4750 cmhCC_SSTransFail(ectId); | |
4751 } | |
4752 | |
4753 #ifdef FF_TTY | |
4754 /* | |
4755 +-------------------------------------------------------------------+ | |
4756 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4757 | ROUTINE : cmhCC_TTY_Control | | |
4758 +-------------------------------------------------------------------+ | |
4759 | |
4760 PURPOSE : Enabling/disabling TTY for the active call | |
4761 | |
4762 */ | |
4763 | |
4764 LOCAL BOOL cmhCC_TTY_Proceed (SHORT cId) | |
4765 { | |
4766 T_TTY_CMD ttyAction = TTY_OFF; | |
4767 T_bcpara *bc; | |
4768 | |
4769 if (ccShrdPrm.ctb[cId] NEQ NULL) | |
4770 { | |
4771 /* Call table entry exists */ | |
4772 bc = &psaCC_ctb(cId)->BC[psaCC_ctb(cId)->curBC]; | |
4773 | |
4774 if ((bc->bearer_serv EQ BEARER_SERV_SPEECH_CTM OR | |
4775 bc->bearer_serv EQ BEARER_SERV_AUX_SPEECH_CTM) AND | |
4776 psaCC_ctb(cId)->calStat NEQ CS_DSC_REQ) | |
4777 { | |
4778 if ((ccShrdPrm.chMod EQ CHM_SPEECH) OR | |
4779 (ccShrdPrm.chMod EQ CHM_SPEECH_V2) OR | |
4780 (ccShrdPrm.chMod EQ CHM_SPEECH_V3)) | |
4781 { | |
4782 audio_set_tty (ttyAction = (T_TTY_CMD)ccShrdPrm.ttyCmd); | |
4783 } | |
4784 else | |
4785 { | |
4786 TRACE_EVENT_P1 ("TTY no speech mode: %d", (int)ccShrdPrm.chMod); | |
4787 } | |
4788 } | |
4789 else | |
4790 { | |
4791 TRACE_EVENT_P1 ("TTY wrong BCAP: %d", (int)bc->bearer_serv); | |
4792 } | |
4793 | |
4794 if (ttyAction NEQ (UBYTE)TTY_OFF) | |
4795 { | |
4796 cmhCC_notifyTTY (CTTY_NEG_Grant, cmhCC_getTTYtrx_state (ttyAction)); | |
4797 return TRUE; | |
4798 } | |
4799 else | |
4800 { | |
4801 cmhCC_notifyTTY (((ccShrdPrm.ctmReq EQ CTM_ENABLED)? | |
4802 CTTY_NEG_Reject: CTTY_NEG_None), | |
4803 CTTY_TRX_Unknown); | |
4804 } | |
4805 } | |
4806 else | |
4807 { | |
4808 TRACE_EVENT ("TTY no call table entry"); | |
4809 } | |
4810 | |
4811 return FALSE; | |
4812 } | |
4813 | |
4814 GLOBAL void cmhCC_TTY_Control (SHORT cId, UBYTE action) | |
4815 { | |
4816 TRACE_EVENT_P3 ("TTY event %d, old state %d, callId %d", | |
4817 action, ccShrdPrm.ctmState, cId); | |
4818 | |
4819 if (!ccShrdPrm.TCHasg) | |
4820 { | |
4821 TRACE_EVENT ("TTY: no TCH"); | |
4822 } | |
4823 switch (action) | |
4824 { | |
4825 case TTY_TCH: | |
4826 if (ccShrdPrm.ctmState EQ TTY_STATE_IDLE) | |
4827 { | |
4828 ccShrdPrm.ctmState = TTY_STATE_SYNC; | |
4829 } | |
4830 else if (ccShrdPrm.ctmState EQ TTY_STATE_BCAP) | |
4831 { | |
4832 if (cmhCC_TTY_Proceed (cId)) | |
4833 ccShrdPrm.ctmState = TTY_STATE_ACTIVE; | |
4834 else | |
4835 ccShrdPrm.ctmState = TTY_STATE_WAIT; | |
4836 } | |
4837 break; | |
4838 | |
4839 case TTY_START: | |
4840 if (ccShrdPrm.ctmState EQ TTY_STATE_IDLE) | |
4841 { | |
4842 ccShrdPrm.ctmState = TTY_STATE_BCAP; | |
4843 } | |
4844 else if (ccShrdPrm.ctmState EQ TTY_STATE_SYNC) | |
4845 { | |
4846 if (cmhCC_TTY_Proceed (cId)) | |
4847 ccShrdPrm.ctmState = TTY_STATE_ACTIVE; | |
4848 else | |
4849 ccShrdPrm.ctmState = TTY_STATE_WAIT; | |
4850 } | |
4851 break; | |
4852 | |
4853 case TTY_PAUSE: | |
4854 if (ccShrdPrm.ctmState EQ TTY_STATE_WAIT) | |
4855 { | |
4856 ccShrdPrm.ctmState = TTY_STATE_SYNC; | |
4857 } | |
4858 else if (ccShrdPrm.ctmState EQ TTY_STATE_ACTIVE) | |
4859 { | |
4860 audio_set_tty (TTY_OFF); | |
4861 ccShrdPrm.ctmState = TTY_STATE_SYNC; | |
4862 } | |
4863 break; | |
4864 | |
4865 case TTY_STOP: | |
4866 if (ccShrdPrm.ctmState EQ TTY_STATE_ACTIVE) | |
4867 { | |
4868 audio_set_tty (TTY_OFF); | |
4869 cmhCC_notifyTTY (CTTY_NEG_None, CTTY_TRX_Off); | |
4870 } | |
4871 ccShrdPrm.ctmState = (ccShrdPrm.ctmReq EQ CTM_ENABLED)? | |
4872 TTY_STATE_IDLE: TTY_STATE_NONE; | |
4873 break; | |
4874 | |
4875 default: | |
4876 break; | |
4877 } | |
4878 TRACE_EVENT_P1 ("TTY new state %d", ccShrdPrm.ctmState); | |
4879 } | |
4880 #endif /* FF_TTY */ | |
4881 | |
4882 #if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E) | |
4883 /* Only for WAP or RNET */ | |
4884 | |
4885 /* | |
4886 +-------------------------------------------------------------------+ | |
4887 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4888 | ROUTINE : cmhCC_PPP_Established | | |
4889 +-------------------------------------------------------------------+ | |
4890 | |
4891 PURPOSE : PPP entity activated, data path established | |
4892 | |
4893 */ | |
4894 | |
4895 GLOBAL SHORT cmhCC_PPP_Established (ULONG ip_address, USHORT max_receive_unit, | |
4896 ULONG dns1, ULONG dns2) | |
4897 { | |
4898 | |
4899 char c_ip_address[16],c_dns1[16],c_dns2[16]; | |
4900 SHORT cId = raShrdPrm.cId; | |
4901 TRACE_FUNCTION ("cmhCC_PPP_Established()"); | |
4902 | |
4903 ipAddress = ip_address; | |
4904 sprintf (c_ip_address, "%03u.%03u.%03u.%03u", (ip_address & 0xff000000) >> 24, | |
4905 (ip_address & 0x00ff0000) >> 16, | |
4906 (ip_address & 0x0000ff00) >> 8 , | |
4907 (ip_address & 0x000000ff) ); | |
4908 | |
4909 sprintf(c_dns1, "%03u.%03u.%03u.%03u", (dns1 & 0xff000000) >> 24, | |
4910 (dns1 & 0x00ff0000) >> 16, | |
4911 (dns1 & 0x0000ff00) >> 8 , | |
4912 (dns1 & 0x000000ff) ); | |
4913 | |
4914 sprintf(c_dns2, "%03u.%03u.%03u.%03u", (dns2 & 0xff000000) >> 24, | |
4915 (dns2 & 0x00ff0000) >> 16, | |
4916 (dns2 & 0x0000ff00) >> 8 , | |
4917 (dns2 & 0x000000ff) ); | |
4918 | |
4919 TRACE_EVENT_P3("addr : %s ,dns1 : %s ,dns2: %s",c_ip_address,c_dns1,c_dns2); | |
4920 | |
4921 if(is_gpf_tcpip_call()) { | |
4922 pppShrdPrm.ipaddr = ip_address ; | |
4923 pppShrdPrm.dns1 = dns1 ; | |
4924 pppShrdPrm.dns2 = dns2 ; | |
4925 } | |
4926 #ifdef FF_TCP_IP | |
4927 if (psaCC_ctbIsValid (cId) AND /* Ensure not to dereferentiate NULL */ | |
4928 pppShrdPrm.is_PPP_CALL EQ TRUE) | |
4929 { | |
4930 pppShrdPrm.ipaddr = ip_address ; | |
4931 pppShrdPrm.dns1 = dns1 ; | |
4932 pppShrdPrm.dns2 = dns2 ; | |
4933 R_AT( RAT_CONNECT, raShrdPrm.owner ) | |
4934 (psaCC_ctb(cId)->curCmd, | |
4935 cmhCC_GetDataRate(&psaCC_ctb(cId)->BC[psaCC_ctb(cId)->curBC]), | |
4936 cId+1, | |
4937 FALSE); | |
4938 return 0; | |
4939 } | |
4940 #endif /*FF_TCP_IP*/ | |
4941 | |
4942 #if defined (FF_SAT_E) | |
4943 if(cmhSAT_OpChnChckCSD(UDP)) | |
4944 { | |
4945 psaTCPIP_Configure((UBYTE*)c_ip_address, NULL, NULL, | |
4946 (UBYTE*)c_dns1, (UBYTE*)c_dns2,max_receive_unit, | |
4947 cmhSAT_OpChnUDPConfCsd) ; | |
4948 } | |
4949 else | |
4950 #endif /* FF_SAT_E */ | |
4951 #if defined (FF_WAP) || defined (FF_GPF_TCPIP) | |
4952 { | |
4953 psaTCPIP_Configure((UBYTE*)c_ip_address, NULL, NULL, | |
4954 (UBYTE*)c_dns1, (UBYTE*)c_dns1,max_receive_unit, | |
4955 psaTCPIP_conf_csd_callback) ; | |
4956 } | |
4957 #endif /* FF_WAP OR FF_GPF_TCPIP */ | |
4958 return 0; | |
4959 } | |
4960 | |
4961 #ifdef CO_UDP_IP | |
4962 /* | |
4963 +-------------------------------------------------------------------+ | |
4964 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4965 | ROUTINE : cmhCC_IPA_Configurated | | |
4966 +-------------------------------------------------------------------+ | |
4967 | |
4968 PURPOSE : IPA entity activated, data path established | |
4969 */ | |
4970 | |
4971 GLOBAL SHORT cmhCC_IPA_Configurated (void) | |
4972 { | |
4973 TRACE_FUNCTION ("cmhCC_IPA_Configurated()"); | |
4974 | |
4975 psaUDPA_Config(UDPA_CONFIG_UP); | |
4976 | |
4977 return 0; | |
4978 } | |
4979 | |
4980 /* | |
4981 +-------------------------------------------------------------------+ | |
4982 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
4983 | ROUTINE : cmhCC_UDPA_Configurated | | |
4984 +-------------------------------------------------------------------+ | |
4985 | |
4986 PURPOSE : IPA entity activated, data path established | |
4987 | |
4988 */ | |
4989 | |
4990 GLOBAL SHORT cmhCC_UDPA_Configurated (void) | |
4991 { | |
4992 TRACE_FUNCTION ("cmhCC_UDPA_Configurated()"); | |
4993 #ifdef FF_WAP | |
4994 if (Wap_Call) | |
4995 { | |
4996 if ( tcpipShrdPrm.connection_type EQ TCPIP_CONNECTION_TYPE_CSD_WAP ) | |
4997 { | |
4998 rAT_WAP_PPP_connected(wapId,ipAddress); | |
4999 } | |
5000 else | |
5001 { | |
5002 TRACE_EVENT_P1 ("IP: %s", tcpipShrdPrm.ipaddr); | |
5003 rAT_WAP_PPP_connected(wapId, psaTCPIP_bytes2ipv4addr(tcpipShrdPrm.ipaddr)); | |
5004 } | |
5005 } | |
5006 #endif | |
5007 psaUDPIP_config_dispatch() ; | |
5008 return 0; | |
5009 } | |
5010 | |
5011 | |
5012 /* | |
5013 +-------------------------------------------------------------------+ | |
5014 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
5015 | ROUTINE : cmhCC_UDPA_Deconfigurated | | |
5016 +-------------------------------------------------------------------+ | |
5017 | |
5018 PURPOSE : | |
5019 | |
5020 */ | |
5021 | |
5022 GLOBAL SHORT cmhCC_UDPA_Deconfigurated (void) | |
5023 { | |
5024 TRACE_FUNCTION ("cmhCC_UDPA_Deconfigurated ()"); | |
5025 | |
5026 cmhUDPA_Deactivate(tcpipShrdPrm.src_id); | |
5027 | |
5028 return 0; | |
5029 } | |
5030 | |
5031 /* | |
5032 +-------------------------------------------------------------------+ | |
5033 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
5034 | ROUTINE : cmhCC_IPA_Deconfigurated | | |
5035 +-------------------------------------------------------------------+ | |
5036 | |
5037 PURPOSE : | |
5038 | |
5039 */ | |
5040 | |
5041 GLOBAL SHORT cmhCC_IPA_Deconfigurated (void) | |
5042 { | |
5043 TRACE_FUNCTION ("cmhCC_IPA_Deconfigurated()"); | |
5044 | |
5045 psaUDPA_Config(UDPA_CONFIG_DOWN); | |
5046 | |
5047 return 0; | |
5048 } | |
5049 | |
5050 #endif /* of WAP || SAT E */ | |
5051 | |
5052 /* | |
5053 +-------------------------------------------------------------------+ | |
5054 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
5055 | ROUTINE : cmhCC_PPP_Terminated | | |
5056 +-------------------------------------------------------------------+ | |
5057 | |
5058 PURPOSE : PPP entity terminated, close connection / update CC parameters | |
5059 | |
5060 */ | |
5061 | |
5062 GLOBAL SHORT cmhCC_PPP_Terminated ( void ) | |
5063 { | |
5064 TRACE_FUNCTION ("cmhCC_PPP_Terminated()"); | |
5065 | |
5066 #ifdef DTI | |
5067 #if defined (FF_WAP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E) | |
5068 if (Wap_Call EQ TRUE) | |
5069 { | |
5070 if(is_gpf_tcpip_call()) { | |
5071 GPF_TCPIP_STATEMENT(dti_cntrl_entity_disconnected(peer_link_id, | |
5072 DTI_ENTITY_TCPIP )); | |
5073 } | |
5074 else { | |
5075 dti_cntrl_entity_disconnected( peer_link_id, DTI_ENTITY_IP ); | |
5076 } | |
5077 dti_cntrl_entity_disconnected( prot_link_id, DTI_ENTITY_L2R ); | |
5078 } | |
5079 #endif /* WAP || defined (FF_GPF_TCPIP) || SAT E */ | |
5080 | |
5081 dti_cntrl_entity_disconnected( peer_link_id, DTI_ENTITY_PPPC ); | |
5082 dti_cntrl_entity_disconnected( prot_link_id, DTI_ENTITY_PPPC ); | |
5083 | |
5084 | |
5085 #if defined (FF_SAT_E) | |
5086 if( cmhSAT_OpChnChckCSD(UDP)) | |
5087 { | |
5088 psaTCPIP_Deactivate(cmhSAT_OpChnUDPDeactCsd) ; | |
5089 } | |
5090 else | |
5091 #endif /* FF_SAT_E */ | |
5092 #if defined (FF_WAP) OR defined (FF_GPF_TCPIP) | |
5093 { | |
5094 psaTCPIP_Deactivate(psaTCPIP_deact_csd_callback) ; | |
5095 } | |
5096 #endif /* defined (WAP) OR defined (FF_GPF_TCPIP) */ | |
5097 #endif /* DTI */ | |
5098 return 0; | |
5099 } | |
5100 | |
5101 | |
5102 #endif /* of WAP or FF_TCP_IP || defined (FF_GPF_TCPIP) or SAT E */ | |
5103 | |
5104 /* | |
5105 +--------------------------------------------------------------------+ | |
5106 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
5107 | STATE : code ROUTINE : cmhCC_checkALS_Support_cb| | |
5108 +--------------------------------------------------------------------+ | |
5109 | |
5110 PURPOSE : Call-backs for ALS support check. | |
5111 */ | |
5112 | |
5113 GLOBAL void cmhCC_checkALS_Support_cb ( SHORT aId ) | |
5114 { | |
5115 TRACE_FUNCTION ("cmhCC_checkALS_Support_cb()"); | |
5116 | |
5117 simShrdPrm.atb[aId].ntryUsdFlg = FALSE; | |
5118 | |
5119 /* Step #1: Reading of CPHS Info */ | |
5120 if (simShrdPrm.atb[aId].errCode NEQ SIM_NO_ERROR OR | |
5121 simShrdPrm.atb[aId].exchData EQ NULL OR | |
5122 simShrdPrm.atb[aId].dataLen < 2) | |
5123 { | |
5124 ; /* CPHS info not supported or invalid */ | |
5125 } | |
5126 else if ((simShrdPrm.atb[aId].exchData[1] & 0x03) EQ ALLOCATED_AND_ACTIVATED) | |
5127 { | |
5128 /* continue with step 2 */ | |
5129 cmhCC_checkALS_Support_2(); | |
5130 return; | |
5131 } | |
5132 | |
5133 cmhCC_checkALS_Support_exec( 0 ); | |
5134 } | |
5135 | |
5136 GLOBAL void cmhCC_checkALS_Support_cb_2 ( SHORT aId ) | |
5137 { | |
5138 int i; | |
5139 | |
5140 TRACE_FUNCTION ("cmhCC_checkALS_Support_cb_2()"); | |
5141 | |
5142 simShrdPrm.atb[aId].ntryUsdFlg = FALSE; | |
5143 | |
5144 if (simShrdPrm.atb[aId].errCode NEQ SIM_NO_ERROR OR | |
5145 simShrdPrm.atb[aId].exchData EQ NULL OR | |
5146 simShrdPrm.atb[aId].dataLen < ACI_CPHS_CSP_SIZE ) | |
5147 { | |
5148 ; /* CSP not supported or invalid */ | |
5149 } | |
5150 else | |
5151 { | |
5152 for (i = 0; i < simShrdPrm.atb[aId].dataLen; i += 2) | |
5153 { | |
5154 if (simShrdPrm.atb[aId].exchData[i] EQ ALS_SERVICE_GROUP_CODE) | |
5155 { | |
5156 if (BITFIELD_CHECK(simShrdPrm.atb[aId].exchData[i+1],ALS_BIT_ON)) | |
5157 { | |
5158 cmhCC_checkALS_Support_exec( 1 ); | |
5159 return; | |
5160 } | |
5161 break; | |
5162 } | |
5163 } | |
5164 } | |
5165 | |
5166 cmhCC_checkALS_Support_exec( 0 ); | |
5167 } | |
5168 | |
5169 | |
5170 GLOBAL void cmhCC_checkALS_Support_exec ( UBYTE flag ) | |
5171 { | |
5172 T_ACI_CMD_SRC ownBuf; /* buffers current owner */ | |
5173 T_ACI_ALS_MOD ALSmode; | |
5174 | |
5175 TRACE_FUNCTION ("cmhCC_checkALS_Support_exec()"); | |
5176 | |
5177 ownBuf = simEntStat.entOwn; | |
5178 | |
5179 simEntStat.curCmd = AT_CMD_NONE; | |
5180 simEntStat.entOwn = simShrdPrm.owner = OWN_NONE; | |
5181 | |
5182 switch (ccShrdPrm.als_cmd) | |
5183 { | |
5184 case ALS_CMD_SET: | |
5185 if (flag) | |
5186 { | |
5187 cmhPrm[ownBuf].ccCmdPrm.ALSmode = ALS_MOD_AUX_SPEECH; | |
5188 R_AT( RAT_OK, ownBuf ) ( AT_CMD_ALS ); | |
5189 } | |
5190 else | |
5191 { | |
5192 R_AT( RAT_CME, ownBuf ) ( AT_CMD_ALS, CME_ERR_OpNotSupp ); | |
5193 } | |
5194 break; | |
5195 case ALS_CMD_TEST: | |
5196 if (flag) | |
5197 { | |
5198 ALSmode = ALS_MOD_SPEECH | ALS_MOD_AUX_SPEECH; | |
5199 } | |
5200 else | |
5201 { | |
5202 ALSmode = ALS_MOD_SPEECH; | |
5203 } | |
5204 R_AT( RAT_ALS, ownBuf ) ( ALSmode ); | |
5205 R_AT( RAT_OK, ownBuf ) ( AT_CMD_ALS ); | |
5206 break; | |
5207 default: | |
5208 TRACE_EVENT("wrong value in als_cmd"); | |
5209 R_AT( RAT_CME, ownBuf ) ( AT_CMD_ALS, CME_ERR_OpNotSupp ); | |
5210 } | |
5211 ccShrdPrm.als_cmd = ALS_CMD_NONE; | |
5212 } | |
5213 | |
5214 /* | |
5215 +-------------------------------------------------------------------+ | |
5216 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
5217 | ROUTINE : cmhCC_redialTimeout | | |
5218 +-------------------------------------------------------------------+ | |
5219 | |
5220 PURPOSE : handle redial timeout | |
5221 | |
5222 */ | |
5223 | |
5224 GLOBAL void cmhCC_redialTimeout ( void ) | |
5225 { | |
5226 int i; | |
5227 T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */ | |
5228 | |
5229 TRACE_FUNCTION( "cmhCC_redialTimeout()" ); | |
5230 | |
5231 if (psaCC_ctbIsValid (rdlPrm.rdlcId)) | |
5232 { | |
5233 pCCCmdPrm = &cmhPrm[psaCC_ctb(rdlPrm.rdlcId)->curSrc].ccCmdPrm; | |
5234 | |
5235 if (rdlPrm.rdlMod EQ AUTOM_REPEAT_ON) | |
5236 { | |
5237 if((psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex >= 1) AND | |
5238 (psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex < 3)) | |
5239 { | |
5240 #ifdef _SIMULATION_ | |
5241 TIMERSTART(ACI_REPEAT_1,ACI_REPEAT_HND); | |
5242 #else | |
5243 psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex++; | |
5244 TIMERSTART(ACI_REPEAT_2_4,ACI_REPEAT_HND); | |
5245 #endif | |
5246 } | |
5247 else | |
5248 { | |
5249 psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex = RDL_TIM_INDEX_NOT_PRESENT; | |
5250 psaCC_ctb(rdlPrm.rdlcId)->rdlCnt++; | |
5251 for(i = 0; i < CMD_SRC_MAX; i++) | |
5252 { | |
5253 R_AT(RAT_RDL, i)(REDIAL_ATT_START); | |
5254 } | |
5255 psaCC_ctb(rdlPrm.rdlcId)->calType = CT_MOC_RDL; | |
5256 cmhCC_flagCall( rdlPrm.rdlcId, &(pCCCmdPrm->mltyCncFlg)); | |
5257 /* start a new call */ | |
5258 psaCC_NewCall(rdlPrm.rdlcId); | |
5259 rdlPrm.rdlcId = NO_ENTRY; | |
5260 } | |
5261 } | |
5262 else | |
5263 { | |
5264 TRACE_EVENT("cmhCC_redialTimeout: wrong cId"); | |
5265 } | |
5266 } | |
5267 } | |
5268 | |
5269 | |
5270 /* | |
5271 +-------------------------------------------------------------------+ | |
5272 | PROJECT : GSM-PS (6147) MODULE : CMH_CCR | | |
5273 | ROUTINE : cmhCC_sendFie | | |
5274 +-------------------------------------------------------------------+ | |
5275 | |
5276 PURPOSE : forward unsolicited facility responses from CC to terminal | |
5277 | |
5278 */ | |
5279 GLOBAL T_ACI_RETURN cmhCC_sendFie( T_ACI_FAC_DIR tDirection, | |
5280 SHORT cId, | |
5281 T_fac_inf *fie ) | |
5282 { | |
5283 T_ACI_CMD_SRC tSrc; | |
5284 | |
5285 TRACE_EVENT( "cmhCC_sendFie()" ); | |
5286 | |
5287 for( tSrc=CMD_SRC_LCL; tSrc<CMD_SRC_MAX; tSrc++ ) /* try over all sources */ | |
5288 { | |
5289 if( cmhPrm[tSrc].ccCmdPrm.CSCNcc_mode.CcCSCNModeState EQ CC_CSCN_MOD_STATE_ON ) | |
5290 { | |
5291 switch (cmhPrm[tSrc].ccCmdPrm.CSCNcc_mode.CcCSCNModeDirection) | |
5292 { | |
5293 case CC_CSCN_MOD_DIR_BOTH: | |
5294 break; /* printout regardless of direction */ | |
5295 | |
5296 case CC_CSCN_MOD_DIR_IN: | |
5297 if( tDirection NEQ CSCN_FACILITY_DIRECTION_IN) | |
5298 continue; /* settings for source don't match, advance to next source */ | |
5299 break; | |
5300 | |
5301 case CC_CSCN_MOD_DIR_OUT: | |
5302 if( tDirection NEQ CSCN_FACILITY_DIRECTION_OUT ) | |
5303 continue; /* settings for source don't match, advance to next source */ | |
5304 break; | |
5305 | |
5306 default: | |
5307 continue; /* illegal setting, advance to next source */ | |
5308 } | |
5309 R_AT( RAT_CCCN, tSrc )( tDirection, cId, fie ); | |
5310 } | |
5311 } | |
5312 return( AT_CMPL ); | |
5313 } | |
5314 | |
5315 /*==== EOF ========================================================*/ | |
5316 |