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

src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 26 Sep 2016 00:29:36 +0000
parents
children
comparison
equal deleted inserted replaced
2:c41a534f33c6 3:93999a60b835
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-F&D (8411)
4 | Modul : ATI
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : AT Command Interpreter: Error handling.
18 +-----------------------------------------------------------------------------
19 */
20
21 /*********************************/
22 /* General Error Handling in ACI */
23 /*********************************/
24
25 #ifndef ATI_ERR_C
26 #define ATI_ERR_C
27
28 #undef DUMMY_ATI_STRINGS
29
30 #include "aci_all.h"
31
32 #include "aci_cmh.h"
33 #include "ati_cmd.h"
34 #include "aci_io.h"
35 #include "aci_cmd.h"
36 #include "l4_tim.h"
37
38 #include "aci.h"
39 #include "aci_mem.h"
40
41 #include "aci_lst.h"
42 #include "ati_int.h"
43
44 #ifdef FF_ATI_BAT
45
46 #include "typedefs.h"
47 #include "gdd.h"
48 #include "bat.h"
49
50 #include "ati_bat.h"
51
52 #endif /*FF_ATI_BAT*/
53
54 LOCAL CHAR *AT_Fail_Error(void);
55
56 EXTERN T_ACI_ERR_DESC aciErrDesc;
57
58 LOCAL CHAR ErrBuff[MAX_CMD_LEN];
59
60 typedef struct
61 {
62 CHAR *msg;
63 CHAR *nmb;
64 AtErrCode code;
65 } AtErrTable;
66
67 LOCAL const AtErrTable tabAtError[]=
68 {
69 "OK", "0", atOk,
70 "CONNECT", "1", atConnect,
71 "RING", "2", atRing,
72 "NO CARRIER", "3", atNoCarrier,
73 "NO DIALTONE", "6", atNoDialtone,
74 "BUSY", "7", atBusy,
75 "NO ANSWER", "8", atNoAnswer,
76 "CONNECT 9600","15", atConnect1,
77 /* this has to be the last entry */
78 "ERROR", "4", atError
79 };
80
81 GLOBAL CHAR *disable_or_numeric(const CHAR* key,LONG e) // e is actually enum...
82 {
83 UBYTE srcId = srcId_cb;
84
85 if(ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Disable)
86 {
87 cmdAtError(atError);
88 }
89 else if(ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Numeric)
90 {
91 sprintf(cmdErrStr,"%s ERROR: %d",key,e);
92 }
93 return cmdErrStr;
94 }
95
96
97 /*
98 +--------------------------------------------------------------------+
99 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
100 | STATE : code ROUTINE : cmdExtError |
101 +--------------------------------------------------------------------+
102
103 PURPOSE : handle extended errors
104
105 */
106
107 LOCAL const struct T_ATI_EXT_ERR /* error code - error message mapping */
108 {
109 const CHAR* msg; /* error message */
110 const T_ACI_EXT_ERR code; /* error code */
111 const ULONG displ_code; /* error code to be display */
112 }
113
114 err[] =
115 {
116 "parameter not allowed", EXT_ERR_Parameter, EXT_ERR_Parameter,
117 "data corrupted", EXT_ERR_DataCorrupt, EXT_ERR_DataCorrupt,
118 "internal error", EXT_ERR_Internal, EXT_ERR_Internal,
119 "call table full", EXT_ERR_CallTabFull, EXT_ERR_CallTabFull,
120 "service table full", EXT_ERR_SrvTabFull, EXT_ERR_SrvTabFull,
121 "call not found", EXT_ERR_CallNotFound, EXT_ERR_CallNotFound,
122 "no data-call supported", EXT_ERR_NoDataCallSup, EXT_ERR_NoDataCallSup,
123 "one call on hold", EXT_ERR_OneCallOnHold, EXT_ERR_OneCallOnHold,
124 "hold call not supported for this type", EXT_ERR_CallTypeNoHold, EXT_ERR_CallTypeNoHold,
125 "number not allowed by FDN", EXT_ERR_FdnCheck, EXT_ERR_FdnCheck,
126 "number not allowed by BDN", EXT_ERR_BdnCheck, EXT_ERR_BdnCheck,
127 "parallel USSD not supported", EXT_ERR_ParallelUSSD, EXT_ERR_ParallelUSSD,
128 "fax minimum speed condition", EXT_ERR_FaxMinSpeedCond, EXT_ERR_FaxMinSpeedCond,
129 "conflict with command details", EXT_ERR_CmdDetailsSAT, EXT_ERR_CmdDetailsSAT,
130 "IMEI illegal", EXT_ERR_IMEICheck, EXT_ERR_IMEICheck,
131 "not allowed by ALS-Lock", EXT_ERR_AlsLock, EXT_ERR_AlsLock,
132 #if defined FF_EOTD
133 "Command not supported", EXT_ERR_LCS_CmdNotSup, 0,
134 "Command not recognised/out of range", EXT_ERR_LCS_CmdNotRec, 1,
135 "LCS Client ID not recognised/out of range", EXT_ERR_LCS_CLPSClientNotRec, 2,
136 "Interval attribute out of range", EXT_ERR_LCS_IntervalNotSup, 3,
137 "Repeat attribute not supported/ out of range", EXT_ERR_LCS_RepeatNotSup, 4,
138 "Send request type not recognised / out of range", EXT_ERR_LCS_SendReqTyNotRec, 2,
139 "User confirmation request type not recognised / out of range", EXT_ERR_LCS_UsConfReqTyNotRec, 3,
140 "LCS Client ID not recognised/out of range", EXT_ERR_LCS_CLSRClientIdNotRec, 4,
141 "Circuit switched call number out of range", EXT_ERR_LCS_CSCallNumNotSup, 5,
142 #endif /* FF_EOTD */
143 "error unknown", EXT_ERR_Unknown, EXT_ERR_Unknown,
144 /* this has to be the last entry */
145 "other error", EXT_ERR_NotPresent, EXT_ERR_NotPresent
146 };
147
148 GLOBAL CHAR *cmdExtError (T_ACI_EXT_ERR e)
149 {
150 SHORT idx=0;
151 T_ACI_ERR_DESC aed;
152 UBYTE srcId = srcId_cb;
153
154
155 if ( e EQ EXT_ERR_NotPresent )
156 {
157 if (((aed = qAT_ErrDesc()) >> 16) EQ ACI_ERR_CLASS_Ext)
158 {
159 e = (T_ACI_EXT_ERR)(aed & 0xFFFF);
160 }
161 else
162 {
163 e = EXT_ERR_Unknown;
164 }
165 }
166
167 *ErrBuff = '\0';
168 cmdErrStr = ErrBuff;
169
170 if (ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Verbose OR
171 ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Numeric)
172 {
173 /* search the array for the index of the notified failure */
174 while ( err[idx].code NEQ EXT_ERR_NotPresent AND
175 err[idx].code NEQ e )
176 {
177 idx++;
178 }
179 }
180 else /* Catch some Extended Error Codes and map them to more suitable codes */
181 {
182 switch (e)
183 {
184 case EXT_ERR_CallTabFull:
185 case EXT_ERR_FdnCheck:
186 case EXT_ERR_BdnCheck:
187 return(cmdAtError(atNoCarrier));
188 }
189 }
190 if (ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Verbose)
191 {
192 strcat(cmdErrStr,"+EXT ERROR: ");
193 strcat( cmdErrStr, err[idx].msg );
194 }
195 return(disable_or_numeric("+EXT", err[idx].displ_code));
196 }
197
198 /*
199 +--------------------------------------------------------------------+
200 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
201 | STATE : code ROUTINE : cmdCmeError |
202 +--------------------------------------------------------------------+
203
204 PURPOSE : handle Mobile Equipment Errors
205
206 */
207 #ifdef GPRS
208 #define GPRS_ERR(a,b) a,b,
209 #else
210 #define GPRS_ERR(a,b)
211 #endif /* GPRS */
212
213 LOCAL const struct T_ATI_CME_ERR /* error code - error message mapping */
214 {
215 const CHAR* msg; /* error message */
216 const T_ACI_CME_ERR code; /* error code */
217 }
218 error[] =
219 {
220 "phone failure", CME_ERR_PhoneFail,
221 "no connection to phone", CME_ERR_NoConnect,
222 "phone-adaptor link reserved", CME_ERR_LinkRes,
223 "operation not allowed", CME_ERR_OpNotAllow,
224 "operation not supported", CME_ERR_OpNotSupp,
225 "PH-SIM PIN required", CME_ERR_PhSimPinReq,
226 "SIM not inserted", CME_ERR_SimNotIns,
227 "SIM PIN required", CME_ERR_SimPinReq,
228 "SIM PUK required", CME_ERR_SimPukReq,
229 "SIM failure", CME_ERR_SimFail,
230 "SIM busy", CME_ERR_SimBusy,
231 "SIM wrong", CME_ERR_SimWrong,
232 "incorrect password", CME_ERR_WrongPasswd,
233 "SIM PIN2 required", CME_ERR_SimPin2Req,
234 "SIM PUK2 required", CME_ERR_SimPuk2Req,
235 "memory full", CME_ERR_MemFull,
236 "invalid index", CME_ERR_InvIdx,
237 "not found", CME_ERR_NotFound,
238 "memory failure", CME_ERR_MemFail,
239 "text string too long", CME_ERR_TxtToLong,
240 "invalid characters in text string", CME_ERR_InvalidTxtChar,
241 "dial string too long", CME_ERR_DialToLong,
242 "invalid characters in dial string", CME_ERR_InvDialChar,
243 "no network service", CME_ERR_NoServ,
244 "network timeout", CME_ERR_Timeout,
245 "network not allowed - emergency calls only", CME_ERR_LimServ,
246 "Network lock - PIN required", CME_ERR_NetworkPersPinReq, /* PIN to change network personalisation required */
247 "Network lock - PUK required", CME_ERR_NetworkPersPukReq, /* network personalisation PUK is required */
248 "Subnetwork lock - PIN required", CME_ERR_NetworkSubsetPersPinReq, /* keycode to change nw subset personalisation required */
249 "Subnetwork lock - PUK required", CME_ERR_NetworkSubsetPersPukReq, /* network subset personalisation PUK is required */
250 "Provider lock - PIN required", CME_ERR_ProviderPersPinReq, /* keycode to change service provider personal. required */
251 "Provider lock - PUK required", CME_ERR_ProviderPersPukReq, /* service provider personalisation PUK is required */
252 "Corporate lock - PIN required", CME_ERR_CorporatePersPinReq, /* keycode to change corporate personalisation required */
253 "Corporate lock - PUK required", CME_ERR_CorporatePersPukReq, /* corporate personalisation PUK is required */
254 "unknown", CME_ERR_Unknown, /* ATTENTION! If you insert new entries before CME_ERR_Unknown, remember to increase NBR_CME_NORM_ERR */
255 GPRS_ERR("illegal MS", CME_ERR_GPRSBadMs)
256 GPRS_ERR("illegal ME", CME_ERR_GPRSBadMe)
257 GPRS_ERR("GPRS service not allowed", CME_ERR_GPRSNoService)
258 GPRS_ERR("PLMN not allowed", CME_ERR_GPRSBadPlmn)
259 GPRS_ERR("Location not allowed", CME_ERR_GPRSBadLoc)
260 GPRS_ERR("Roaming not allowed in Location Area", CME_ERR_GPRSNoRoam)
261 GPRS_ERR("GPRS service option not supported", CME_ERR_GPRSSerOptNsup)
262 GPRS_ERR("requested service option not subscribed",CME_ERR_GPRSSerOptNsub)
263 GPRS_ERR("service option temporarily out of order",CME_ERR_GPRSSerOptOOO)
264 GPRS_ERR("unspecified GPRS error", CME_ERR_GPRSUnspec)
265 GPRS_ERR("PDP authorisation error", CME_ERR_GPRSPdpAuth)
266 GPRS_ERR("invalid module class", CME_ERR_GPRSBadModClass)
267 "failed to abort", CME_ERR_FailedToAbort,
268 "ACM reset needed", CME_ERR_AcmResetNeeded,
269 /* this has to be the last entry */
270 "other error", CME_ERR_NotPresent
271 };
272
273 GLOBAL CHAR *cmdCmeError (T_ACI_CME_ERR e)
274 {
275 SHORT idx=0;
276 T_ACI_ERR_DESC aed;
277 UBYTE srcId = srcId_cb;
278
279 *ErrBuff = '\0'; /* initialization */
280 cmdErrStr = ErrBuff;
281
282 if ( e EQ CME_ERR_NotPresent )
283 {
284 if (((aed = qAT_ErrDesc()) >> 16) EQ ACI_ERR_CLASS_Cme)
285 {
286 e = (T_ACI_CME_ERR)(aed & 0xFFFF);
287 }
288 else
289 {
290 e = CME_ERR_Unknown;
291 }
292 }
293 else if( e EQ CME_ERR_Unknown )
294 {
295 return(AT_Fail_Error());
296 }
297
298 if (ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Verbose)
299 {
300 strcat(cmdErrStr,"+CME ERROR: ");
301
302 /* search for the description of the notified error */
303 while ( error[idx].code NEQ CME_ERR_NotPresent AND
304 error[idx].code NEQ e )
305 {
306 idx++;
307 }
308 strcat( cmdErrStr, error[idx].msg );
309 }
310 return(disable_or_numeric("+CME",e));
311 }
312
313
314 /*
315 +--------------------------------------------------------------------+
316 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
317 | STATE : code ROUTINE : cmdCmsError |
318 +--------------------------------------------------------------------+
319
320 PURPOSE : handle Short Message Errors
321
322 */
323
324 LOCAL const struct T_ATI_CMS_ERR /* error code - error message mapping */
325 {
326 const CHAR* msg; /* error message */
327 const T_ACI_CMS_ERR code; /* error code */
328 }
329 cms_err[] =
330 {
331 "unassigned (unallocated) number", CMS_ERR_UnAllocNum,
332 "operator determined barring", CMS_ERR_OpDetermBarr,
333 "call barred", CMS_ERR_CallBarr,
334 "short message transfer rejected", CMS_ERR_TransReject,
335 "destination out of service", CMS_ERR_DestOutOfServ,
336 "unidentified subscriber", CMS_ERR_UnidentSubsc,
337 "facility rejected", CMS_ERR_FacReject,
338 "unknown subscriber", CMS_ERR_UnKnownSubsc,
339 "network out of order", CMS_ERR_NetOutOfOrder,
340 "temporary failure", CMS_ERR_TempFail,
341 "congestion", CMS_ERR_Congestion,
342 "resources unavailable, unspecified", CMS_ERR_ResUnAvail,
343 "requested facility not subscribed", CMS_ERR_FacNotSubscr,
344 "requested facility not implemented", CMS_ERR_FacNotImpl,
345 "invalid short message transfer ref. value", CMS_ERR_TransRefInval,
346 "semantically incorrect message", CMS_ERR_InValSM,
347 "invalid mandatory information", CMS_ERR_InValManInfo,
348 "message type non-existent or not implemented", CMS_ERR_MsgTypNotExist,
349 "message not compatible with SM protocol state", CMS_ERR_MsgNotCompatible,
350 "information element non-existent or not impl.", CMS_ERR_InfoElemNotImpl,
351 "protocol error, unspecified", CMS_ERR_ProtErr,
352 "interworking, unspecified", CMS_ERR_InterWrkUnSpec,
353 "telematic interworking not supported", CMS_ERR_TlmtkNotSup,
354 "short message type 0 not supported", CMS_ERR_SM0NotSup,
355 "cannot replace short message", CMS_ERR_CantReplceSM,
356 "unspecified TP-PID error", CMS_ERR_UnSpecPIDErr,
357 "data coding scheme (alphabet) not supported", CMS_ERR_DcsNotSup,
358 "message class not supported", CMS_ERR_MsgClassNotSup,
359 "unspecified TP-DCS error", CMS_ERR_UnSpecTpDcs,
360 "command cannot be actioned", CMS_ERR_CmdNotAct,
361 "command unsupported", CMS_ERR_CmdUnSup,
362 "unspecified TP-Command error", CMS_ERR_UnSpecTpCmd,
363 "TPDU not supported", CMS_ERR_TpduUnSup,
364 "SC busy", CMS_ERR_ScBsy,
365 "no SC subscription", CMS_ERR_NoScSubsc,
366 "SC system failure", CMS_ERR_ScSysFail,
367 "invalid SME address", CMS_ERR_InValSme,
368 "destination SME barred", CMS_ERR_DestSmeBarr,
369 "SM rejected-duplicate SM", CMS_ERR_SmRejctDuplSm,
370 "TP-VPF not supported", CMS_ERR_SmTPVPFNotSup,
371 "TP-VP not supported", CMS_ERR_SmTPVPNotSup,
372 "SIM SMS storage full", CMS_ERR_SimSmsStorFull,
373 "no SMS storage capability in SIM", CMS_ERR_NoStorInSim,
374 "error in MS", CMS_ERR_ErrInMs,
375 "memory capacity exceeded", CMS_ERR_MemCabExcee,
376 "unspecified error cause", CMS_ERR_UnSpecErr,
377 "ME failure", CMS_ERR_MeFail,
378 "SMS service of ME reserved", CMS_ERR_ServRes,
379 "operation not allowed", CMS_ERR_OpNotAllowed,
380 "operation not supported", CMS_ERR_OpNotSup,
381 "invalid PDU mode parameter", CMS_ERR_InValPduMod,
382 "invalid text mode parameter", CMS_ERR_InValTxtMod,
383 "SIM not inserted", CMS_ERR_SimNotIns,
384 "SIM PIN required", CMS_ERR_SimPinReq,
385 "PH-SIM PIN required", CMS_ERR_PhSimPinReq,
386 "SIM failure", CMS_ERR_SimFail,
387 "SIM busy", CMS_ERR_SimBsy,
388 "SIM wrong", CMS_ERR_SimWrong,
389 "SIM PUK required", CMS_ERR_SimPukReq,
390 "SIM PIN2 required", CMS_ERR_SimPin2Req,
391 "SIM PUK2 required", CMS_ERR_SimPuk2Req,
392 "memory failure", CMS_ERR_MemFail,
393 "invalid memory index", CMS_ERR_InValMemIdx,
394 "memory full", CMS_ERR_MemFull,
395 "SMSC address unknown", CMS_ERR_SmscAdrUnKnown,
396 "no network service", CMS_ERR_NoNetServ,
397 "network timeout", CMS_ERR_NetTimeOut,
398 "no +CNMA acknowledegment expected", CMS_ERR_NoCnmaAckExpect,
399 "unknown error", CMS_ERR_UnknownErr,
400 "failed to abort", CMS_ERR_FailedToAbort,
401 /* this must be the last entry */
402 "other error", CMS_ERR_NotPresent
403 };
404
405 #define NBR_CMS_ERR 69
406 #define MAX_CMS_LTH 60
407
408 GLOBAL char* cmdCmsError ( T_ACI_CMS_ERR e )
409 {
410 int i = 0;
411 T_ACI_ERR_DESC aed;
412 UBYTE srcId = srcId_cb;
413
414 if ( e EQ CMS_ERR_NotPresent )
415 {
416 if (((aed = qAT_ErrDesc()) >> 16) EQ ACI_ERR_CLASS_Cms)
417 {
418 e = (T_ACI_CMS_ERR)(aed & 0xFFFF);
419 }
420 else /* no SMS error code */
421 {
422 e = CMS_ERR_UnknownErr;
423 }
424 }
425
426 {
427 *ErrBuff = '\0'; /* build message */
428 cmdErrStr = ErrBuff;
429
430 if ( ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Verbose )
431 {
432 strcat( cmdErrStr, "+CMS ERROR: " );
433
434 while ( cms_err[i].code NEQ CMS_ERR_NotPresent AND
435 cms_err[i].code NEQ e )
436 {
437 i++;
438 }
439 strcat( cmdErrStr, cms_err[i].msg );
440 }
441 else if ( ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Disable )
442 {
443 strcat ( cmdErrStr, "ERROR" );
444 }
445 else if ( ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Numeric )
446 {
447 sprintf ( cmdErrStr, "+CMS ERROR: %d", e );
448 }
449 }
450
451 return cmdErrStr;
452 }
453
454
455 /*
456 +--------------------------------------------------------------------+
457 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
458 | STATE : code ROUTINE : atPlusCEER |
459 +--------------------------------------------------------------------+
460
461 PURPOSE : Extented error report
462 */
463
464 typedef struct
465 {
466 char * desc;
467 T_ACI_CEER rpt;
468 } CEER_TABLE;
469
470 /* Defined by standards CEER cause description table */
471 const CEER_TABLE StdCEERDesc[]=
472 {
473 {"unassigned number", CEER_Unassign },
474 {"no route to destination", CEER_NoRoute },
475 {"channel unacceptable", CEER_ChanUnaccept },
476 {"operator determined barring", CEER_Barred },
477 {"normal call clearing", CEER_CallClear },
478 {"user busy", CEER_UserBusy },
479 {"no user responding", CEER_NoResponse },
480 {"user alerting, no answer", CEER_AlertNoAnswer },
481 {"call rejected", CEER_CallReject },
482 {"number changed", CEER_NumChanged },
483 {"non selected user clearing", CEER_UserClear },
484 {"destination out of order", CEER_DestOutOfOrder },
485 {"invalid number format", CEER_NumFormat },
486 {"facility rejected", CEER_FacilityReject },
487 {"response to status enquiry", CEER_StatusEnquiry },
488 {"normal, unspecified", CEER_Unspecified },
489 {"no channel available", CEER_NoChanAvail },
490 {"network out of order", CEER_NetworkOutOfOrder },
491 {"temporary failure", CEER_TempFailure },
492 {"switching equipment congestion", CEER_SwitchCongest },
493 {"access information discarded", CEER_InfoDiscard },
494 {"requested channel unavailable", CEER_ReqChanUnavail },
495 {"recources unavailable", CEER_ResourceUnavail },
496 {"quality of service unavailable", CEER_QOS_Unavail },
497 {"requested facility unsubscribed", CEER_FAC_Unsubscr },
498 {"incoming calls barred within CUG", CEER_BarredInCUG },
499 {"bearer capability not authorized", CEER_BearerCapNotAuth },
500 {"bearer capability not available", CEER_BearerCapUnavail },
501 {"service not available", CEER_ServUnavail },
502 {"bearer service not implemented", CEER_BearerNotImpl },
503 {"ACM reached ACM maximum", CEER_ACM_Max },
504 {"facility not implemented", CEER_FAC_NotImpl },
505 {"only restricted bearer cap. avail.", CEER_RestrictBearerCap },
506 {"service not implemented", CEER_ServNotImpl },
507 {"invalid TI", CEER_InvalidTI },
508 {"no member of CUG", CEER_UserNotInCUG },
509 {"incompatible destination", CEER_IncompatDest },
510 {"invalid transit network selection", CEER_InvalidTransNet },
511 {"incorrect message", CEER_IncorrMsg },
512 {"invalid mandatory information", CEER_InvalidMandInfo },
513 {"message type not implemented", CEER_MsgTypeNotImpl },
514 {"message type incompatible", CEER_MsgTypeIncomp },
515 {"info element not implemented", CEER_InfoElemNotImpl },
516 {"conditional info element error", CEER_CondInfoElem },
517 {"message incompatible", CEER_MsgIncomp },
518 {"recovery on time expiry", CEER_Timer },
519 {"protocol error", CEER_Protocol },
520 {"interworking error", CEER_Interworking },
521 {"bearer service not available", CEER_ReqBearerServNotAvail },
522 {"no TI available", CEER_NoTransIdAvail },
523 {"timer 303 expiry", CEER_Timer303 },
524 {"establishment failure", CEER_EstabFail },
525 {"no error", CEER_NoError },
526 {"operation failed", CEER_Failed },
527 {"timeout", CEER_Timeout },
528 {"bearer service not compatible", CEER_BearerServNotCompat },
529 #ifdef GPRS
530 {"unsuccessful GPRS attach", CEER_FailedGPRSAttach },
531 {"unsuccessful PDP context activation",CEER_FailedGPRSContextAct },
532 {"GPRS detach", CEER_GPRSDetach },
533 {"GPRS PDP context deactivation", CEER_GPRSDeactivation },
534 #endif /* GPRS */
535 /* these have to be the last entries */
536 {"no error", CEER_NotPresent },
537 /* last entry for at+ceer */
538 { NULL, 0}
539 };
540
541 /* Proprietary ACI CEER cause description table */
542 const CEER_TABLE pACI_CEERDesc[]=
543 {
544 {"ACM reached ACM maximum", P_CEER_ACMMaxReachedOrExceeded, },
545 {"number not in FDN list", P_CEER_InvalidFDN },
546 /* these have to be the last entries */
547 {"no error", P_CEER_NotPresent },
548 /* last entry for at+ceer */
549 { NULL, 0}
550 };
551
552 /* Proprietary MM CEER cause description table */
553 const CEER_TABLE pMM_CEERDesc[]=
554 {
555 {"IMSI not present in HLR", P_MM_CEER_IMSINotInHLR},
556 {"no service", P_MM_CEER_NoService },
557 /* these have to be the last entries */
558 {"no error", P_MM_CEER_NotPresent },
559 /* last entry for at+ceer */
560 { NULL, 0}
561 };
562
563 /* Proprietary SS CEER cause description table */
564 const CEER_TABLE pSS_CEERDesc[]=
565 {
566 {"Unknown Subscriber", P_SS_CEER_UnknownSubscriber },
567 {"Illegal Subscriber", P_SS_CEER_IllegalSubscriber },
568 {"Bearer service not provisioned", P_SS_CEER_BearerSvcNotProv },
569 {"Teleservice not provisioned", P_SS_CEER_TeleSvcNotProv },
570 {"Illegal Equipment", P_SS_CEER_IllegalEquipment },
571 {"Call barred", P_SS_CEER_CallBarred },
572 {"Illegal supplementary service operation", P_SS_CEER_IllegalSSOperation },
573 {"SS error status", P_SS_CEER_SSerrStatus },
574 {"SS not available", P_SS_CEER_SSNotAvail },
575 {"SS subscript violation", P_SS_CEER_SSSubsViolation },
576 {"SS incompatible", P_SS_CEER_SSIncomp },
577 {"Facility not supported", P_SS_CEER_FacNotSupported },
578 {"Absent subscriber", P_SS_CEER_AbsentSubs },
579 {"System failure", P_SS_CEER_SystenFail },
580 {"Data Missing", P_SS_CEER_DataMissing },
581 {"Unexpected Data Value", P_SS_CEER_UnexpectData },
582 {"Password registration failure", P_SS_CEER_PwdRegFail },
583 {"Negative password check", P_SS_CEER_NegPwdCheck},
584 {"Number of password attempts violation", P_SS_CEER_NumPwdViolation },
585 {"Unknown alphabet", P_SS_CEER_UnknownAlpha },
586 {"Unstructured supplementary service data busy", P_SS_CEER_UssdBusy },
587 {"Number of multiparty participants exceeded", P_SS_CEER_MaxNumMptyExceed },
588 {"Resource not available", P_SS_CEER_ResourceNotAvail },
589
590 /* these have to be the last entries */
591 {"no error", P_SS_CEER_NotPresent },
592 /* last entry for at+ceer */
593 { NULL, 0}
594 };
595 #define MAX_CEER_DESC_LTH (50)
596 #define MAX_CEER_VAL_LTH (11)
597
598 GLOBAL void getCeerDesc(USHORT cause, char *desc)
599 {
600 SHORT idx;
601 int val;
602
603 TRACE_FUNCTION("getCeerDesc()");
604
605 memset(desc,0,MAX_CEER_DESC_LTH);
606
607 if ( GET_CAUSE_DEFBY(cause) EQ DEFBY_STD )
608 {
609 TRACE_EVENT_P1("Cause: %d, defined by standard", cause);
610 val = GET_CAUSE_VALUE(cause);
611
612 if ( val EQ NOT_PRESENT_8BIT )
613 {
614 val = CEER_NotPresent;
615 }
616 TRACE_EVENT("Get desc from Standard CEER desc table");
617 for( idx = 0; StdCEERDesc[idx].desc NEQ NULL; idx++ )
618 {
619 if ( StdCEERDesc[idx].rpt EQ val )
620 {
621 memcpy(desc, StdCEERDesc[idx].desc, strlen(StdCEERDesc[idx].desc) );
622 return;
623 }
624 }
625 }
626
627 if ( GET_CAUSE_DEFBY(cause) EQ DEFBY_CONDAT )
628 {
629 if ( GET_CAUSE_ORIGIN_ENTITY(cause) EQ ACI_ORIGINATING_ENTITY )
630 {
631 TRACE_EVENT_P1("Cause: %d, is ACI proprietary", cause);
632 val = GET_CAUSE_VALUE(cause);
633
634 if ( val EQ NOT_PRESENT_8BIT )
635 {
636 val = P_CEER_NotPresent;
637 }
638 TRACE_EVENT("Get desc from proprietary ACI CEER desc table");
639 for( idx = 0; pACI_CEERDesc[idx].desc NEQ NULL; idx++ )
640 {
641 if ( pACI_CEERDesc[idx].rpt EQ val )
642 {
643 memcpy(desc, pACI_CEERDesc[idx].desc, strlen(pACI_CEERDesc[idx].desc) );
644 return;
645 }
646 }
647 }
648 else if ( GET_CAUSE_ORIGIN_ENTITY(cause) EQ MM_ORIGINATING_ENTITY )
649 {
650 TRACE_EVENT_P1("Cause: %d, is MM proprietary", cause);
651 val = GET_CAUSE_VALUE(cause);
652
653 if ( val EQ NOT_PRESENT_8BIT )
654 {
655 val = P_MM_CEER_NotPresent;
656 }
657 TRACE_EVENT("Get desc from proprietary MM CEER desc table");
658 for( idx = 0; pMM_CEERDesc[idx].desc NEQ NULL; idx++ )
659 {
660 if ( pMM_CEERDesc[idx].rpt EQ val )
661 {
662 memcpy(desc, pMM_CEERDesc[idx].desc, strlen(pMM_CEERDesc[idx].desc) );
663 return;
664 }
665 }
666 }
667 else if ( GET_CAUSE_ORIGIN_ENTITY(cause) EQ SS_ORIGINATING_ENTITY )
668 {
669 TRACE_EVENT_P1("Cause: %d, is SS proprietary", cause);
670 val = GET_CAUSE_VALUE(cause);
671
672 if ( val EQ NOT_PRESENT_8BIT )
673 {
674 val = P_SS_CEER_NotPresent;
675 }
676 TRACE_EVENT("Get desc from proprietary SS CEER desc table");
677 for( idx = 0; pSS_CEERDesc[idx].desc NEQ NULL; idx++ )
678 {
679 if ( pSS_CEERDesc[idx].rpt EQ val )
680 {
681 memcpy(desc, pSS_CEERDesc[idx].desc, strlen(pSS_CEERDesc[idx].desc) );
682 return;
683 }
684 }
685 }
686 }
687 }
688
689
690 GLOBAL T_ATI_RSLT atPlusCEER(char *cl, UBYTE srcId)
691 {
692 TRACE_FUNCTION("atPlusCEER()");
693
694 #ifdef FF_ATI_BAT
695 {
696 T_BAT_cmd_send cmd;
697 T_BAT_no_parameter dummy;
698
699 cmd.ctrl_params=BAT_CMD_SET_PLUS_CEER;
700 dummy.bat_dummy = 0xFF;
701 cmd.params.ptr_set_plus_ceer = &dummy;
702 bat_send(ati_bat_get_client(srcId), &cmd);
703 return(ATI_EXCT);
704 }
705 #else /* no FF_ATI_BAT */
706 {
707 char desc[MAX_CEER_DESC_LTH];
708 T_ACI_RETURN ret;
709 USHORT cause;
710
711 ret=qAT_PlusCEER( srcId, &cause );
712 if (ret EQ AT_CMPL)
713 {
714 /* check if description text is available*/
715 getCeerDesc(cause, desc);
716
717 if ( desc[0] EQ 0 )
718 {
719 /* no description text is available */
720 sprintf( g_sa, "+CEER: %d,%d,%d,%d",
721 GET_CAUSE_DEFBY(cause), GET_CAUSE_ORIGSIDE(cause),
722 GET_CAUSE_ORIGIN_ENTITY(cause), GET_CAUSE_VALUE(cause));
723 }
724 else
725 {
726 /* description text is available */
727 sprintf( g_sa, "+CEER: %d,%d,%d,%d,%s",
728 GET_CAUSE_DEFBY(cause), GET_CAUSE_ORIGSIDE(cause),
729 GET_CAUSE_ORIGIN_ENTITY(cause), GET_CAUSE_VALUE(cause),
730 desc );
731 }
732 io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
733 return ATI_CMPL;
734 }
735 else
736 {
737 cmdAtError(atError);
738 return ATI_FAIL;
739 }
740 }
741 #endif /* no FF_ATI_BAT */
742 }
743
744 /*
745 +--------------------------------------------------------------------+
746 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
747 | STATE : code ROUTINE : atPercentCSSD |
748 +--------------------------------------------------------------------+
749
750 PURPOSE : Supplementary Service Diagnostic
751 */
752
753 GLOBAL T_ATI_RSLT atPercentCSSD(char *cl, UBYTE srcId)
754 {
755 T_ACI_RETURN ret;
756 UBYTE ss_diag;
757 CHAR *me = "%CSSD: ";
758
759 TRACE_FUNCTION("atPercentCSSD()");
760
761 ret = qAT_PercentCSSD( srcId, &ss_diag);
762
763 if (ret EQ AT_CMPL)
764 {
765 sprintf( g_sa, "%s%d", me, ss_diag );
766 io_sendMessage(srcId, g_sa, ATI_NORMAL_OUTPUT);
767 return ATI_CMPL;
768 }
769 else
770 {
771 cmdAtError(atError);
772 return ATI_FAIL;
773 }
774
775 }
776
777 /*
778 +--------------------------------------------------------------------+
779 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
780 | STATE : code ROUTINE : cmdCeerError |
781 +--------------------------------------------------------------------+
782
783 PURPOSE : handle CEER Errors
784
785 */
786
787 GLOBAL CHAR *cmdCeerError(USHORT cause)
788 {
789 T_ACI_ERR_DESC aed;
790 char desc[MAX_CEER_DESC_LTH];
791 UBYTE srcId = srcId_cb;
792
793 *ErrBuff = '\0'; /* build message */
794 cmdErrStr = ErrBuff;
795
796 if ( GET_CAUSE_VALUE(cause) EQ NOT_PRESENT_8BIT )
797 {
798 if (((aed = qAT_ErrDesc()) >> 16) EQ ACI_ERR_CLASS_Ceer)
799 cause = (T_ACI_CEER)(aed & 0xFFFF);
800 else
801 cause = CAUSE_MAKE(DEFBY_STD, ORIGSIDE_MS, ACI_ORIGINATING_ENTITY,
802 CEER_NoError);
803 }
804 if (ati_user_output_cfg[srcId].CMEE_stat EQ CMEE_MOD_Verbose)
805 {
806 sprintf(cmdErrStr, "+CEER ERROR: %d,%d,%d,%d",
807 GET_CAUSE_DEFBY(cause), GET_CAUSE_ORIGSIDE(cause),
808 GET_CAUSE_ORIGIN_ENTITY(cause), GET_CAUSE_DEFBY(cause));
809
810 getCeerDesc(cause, desc);
811
812 if ( desc[0] NEQ 0 )
813 {
814 strcat( cmdErrStr, desc);
815 }
816
817 }
818 return(disable_or_numeric("+CEER",cause));
819 }
820
821 /*
822 +--------------------------------------------------------------------+
823 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
824 | STATE : code ROUTINE : cmdAtError |
825 +--------------------------------------------------------------------+
826
827 PURPOSE : handle standard AT Errors
828
829 */
830
831 GLOBAL CHAR *cmdAtError (AtErrCode e)
832 {
833 SHORT idx=0;
834
835 *ErrBuff = '\0';
836 cmdErrStr = ErrBuff;
837
838 /* search for the description of the notified error */
839 while ( tabAtError[idx].code NEQ atError AND
840 tabAtError[idx].code NEQ e )
841 {
842 idx++;
843 }
844 sprintf(cmdErrStr,(at.s1415.atV) ? tabAtError[idx].msg : tabAtError[idx].nmb);
845 return cmdErrStr;
846 }
847
848 /*
849 +--------------------------------------------------------------------+
850 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD |
851 | STATE : code ROUTINE : AT_FailError |
852 +--------------------------------------------------------------------+
853
854 PURPOSE : General handling of errors (either CME CMS CEER or EXT errors)
855 when function returns AT_FAIL
856
857 */
858 #define ACI_GET_ERR_CLASS() ((aciErrDesc & 0xFFFF0000) >> 16)
859 #define ACI_GET_ERR_VALUE() (aciErrDesc & 0x0000FFFF)
860 #define ACI_RESET_ERR_DESC() (aciErrDesc = 0xFFFFFFFF)
861 #define ACI_VALID_ERR_DESC() (aciErrDesc NEQ 0xFFFFFFFF)
862
863 LOCAL CHAR *AT_Fail_Error(void)
864 {
865 T_ACI_ERR_CLASS err_class;
866
867 if ( ACI_VALID_ERR_DESC() )
868 {
869 err_class = ACI_GET_ERR_CLASS();
870 switch(err_class)
871 {
872 case(ACI_ERR_CLASS_NotPresent):
873 break;
874 case(ACI_ERR_CLASS_Cme):
875 {
876 T_ACI_CME_ERR l_err;
877
878 l_err = ACI_GET_ERR_VALUE();
879 ACI_RESET_ERR_DESC(); // needs to be reinitialized
880 return(cmdCmeError (l_err));
881 }
882 case(ACI_ERR_CLASS_Cms):
883 {
884 T_ACI_CMS_ERR l_err;
885
886 l_err = ACI_GET_ERR_VALUE();
887 ACI_RESET_ERR_DESC(); // needs to be reinitialized
888 return(cmdCmsError (l_err));
889 }
890 case(ACI_ERR_CLASS_Ceer):
891 {
892 T_ACI_CEER l_err;
893
894 l_err = ACI_GET_ERR_VALUE();
895 ACI_RESET_ERR_DESC(); // needs to be reinitialized
896 /* return(cmdCeerError((USHORT)err)); */
897 return(cmdCeerError(l_err));
898 }
899 case(ACI_ERR_CLASS_Ext):
900 {
901 T_ACI_EXT_ERR l_err;
902
903 l_err = ACI_GET_ERR_VALUE();
904 ACI_RESET_ERR_DESC(); // needs to be reinitialized
905 return(cmdExtError (l_err));
906 }
907 default:
908 break;
909 }
910 }
911 *ErrBuff = '\0';
912 cmdErrStr = ErrBuff;
913
914 return (cmdCmeError(CME_ERR_NotPresent));
915 }
916
917 #endif /* ATI_ERR_C */