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