📄 mfw_sat.c
字号:
trmResponse[1] = ti - 2; /* length of menu selection */
sAT_PercentSATE(CMD_SRC_LCL,ti,trmResponse);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : satEvtDownload |
+--------------------------------------------------------------------+
PURPOSE : download actual event to SAT (User activity and Idle Screen available)
*/
MfwRes satEvtDownload (U8 evt)
{
S16 ti = 0;
U8 src;
U8 evtFlags=0;
TRACE_FUNCTION("satEvtDownload()");
switch (evt)
{
case SatEvtUserAction: /* user activity */
evtFlags = SatEvtUserActionActivated; /* source of event */
break;
case SatEvtIdleScreen: /* idle screen available */
evtFlags = SatEvtIdleScreenActivated; /* source of event */
break;
default:
return MfwResErr; /* illegal event */
}
if (!(eventList&evtFlags)) /*Only send registered events */
return MfwResErr;
switch (evt)
{
case SatEvtUserAction: /* user activity */
src = SatDevME; /* source of event */
break;
case SatEvtIdleScreen: /* idle screen available */
src = SatDevDisplay; /* source of event */
break;
default:
return MfwResErr; /* illegal event */
}
eventList&=(~evtFlags); /* Deregister event */
trmResponse[ti++] = 0xD6; /* event download tag */
trmResponse[ti++] = 0; /* length (filled later) */
trmResponse[ti++] = 0x99; /* --event list-- */
trmResponse[ti++] = 0x01; /* length */
trmResponse[ti++] = evt; /* actual event */
trmResponse[ti++] = 0x82; /* --device identities-- */
trmResponse[ti++] = 0x02; /* length */
trmResponse[ti++] = src; /* source */
trmResponse[ti++] = 0x81; /* destination: SIM */
trmResponse[1] = ti - 2; /* length of event download */
sAT_PercentSATE(CMD_SRC_LCL,ti,trmResponse);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : satDone |
+--------------------------------------------------------------------+
PURPOSE : SIM toolkit command confirmation
*/
MfwRes satDone (SatCmd *cmd, U8 *res, int rlen)
{
S16 ti;
U8 response = *res;
if (satNoResponse) /* no response, if ... */
{
TRACE_EVENT("satDone: no response. Handled by ACI");
return MfwResOk; /* ... notified by ACI */
}
trmResponse[2] = cmd->number; /* command number */
trmResponse[3] = cmd->type; /* command type */
trmResponse[4] = cmd->qual; /* command qualifier */
ti = sizeof(defResponse) - 2; /* result length */
if(res[1] != SatResAiNoCause) /* only attach additional information if existent*/
{
trmResponse[ti++] = rlen; /* dito */
while (rlen--)
trmResponse[ti++] = *res++; /* result data */
}
else /* result ok no additional resultcode attached*/
{
trmResponse[ti++] = 0x01;
trmResponse[ti++] = *res;
}
switch (response)
{
case SatResSuccess: /* performed successsfully */
case SatResPartial: /* ok,partial comprehension */
case SatResMissing: /* ok,missing information */
case SatResAdditional: /* ok,additional EFs read */
case SatResNoIcon: /* ok,no icon displayed */
case SatResModified: /* ok,modified by SIM */
case SatResUserAbort: /* terminated by user */
case SatResUserBack: /* backward move by user */
case SatResUserNoResp: /* no response from user */
case SatResUserHelp: /* help request from user */
case SatResUserAbortUSSD: /* USSD terminated by user */
case SatResBusyME: /* ME temporary failure */
case SatResBusyNet: /* Net temporary failure */
case SatResReject: /* user reject call setup */
case SatResCleared: /* call cleared (user/net) */
case SatResTimerConflict: /* conflict on timer state */
case SatResCCTemp: /* CC by SIM: temp failure */
case SatResImpossible: /* ME cannot do it */
case SatResUnknownType: /* type not understood */
case SatResUnknownData: /* data not understood */
case SatResUnknownNumber: /* number not understood */
case SatResSSerror: /* SS return error */
case SatResSMSerror: /* SMS-RP error */
case SatResNoValues: /* missing required values */
case SatResUSSDerror: /* USSD return error */
case SatResMultiCard: /* Multiple card error */
case SatResCCPermanent: /* CC by SIM: perm. failure */
break;
default:
TRACE_ERROR("ill response code");
break;
}
TRACE_EVENT_P1("SATR:satdone. Response: %x", response);
sAT_PercentSATR(CMD_SRC_LCL,ti,trmResponse);
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : sigExec |
+--------------------------------------------------------------------+
PURPOSE : execute SAT signal
*/
static int sigExec (MfwHdr *curElem, U32 evt, void *data)
{
MfwSat *sc;
while (curElem)
{
if (curElem->type == MfwTypSat)
{
sc = curElem->data;
if (sc->map & evt)
{ /* events match */
if (sc->handler) /* handler valid */
{
current_mfw_elem = curElem; /* LE 06.06.00 */
sc->evt = evt;
if (sc->cmd)
memcpy(sc->cmd,(U8 *)data,sizeof(SatCmd));
if ((*(sc->handler))(evt,sc))
return 1; /* event consumed */
}
}
}
curElem = curElem->next;
}
return 0;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : satSignal |
+--------------------------------------------------------------------+
PURPOSE : SAT event
*/
void satSignal (U32 evt, void *data)
{
UBYTE temp = dspl_Enable(0);
TRACE_FUNCTION("satSignal event %d",evt);
if (mfwSignallingMethod EQ 0)
{
if (mfwFocus)
if (sigExec(mfwFocus,evt,data))
{
dspl_Enable(temp);
return;
}
if (mfwRoot)
sigExec(mfwRoot,evt,data);
}
else
{
MfwHdr* h = 0;
if (mfwFocus)
h = mfwFocus;
if (!h)
h = mfwRoot;
while (h)
{
if (sigExec(h,evt,data))
{
dspl_Enable(temp);
return;
}
if (h == mfwRoot)
{
dspl_Enable(temp);
return;
}
h = mfwParent(mfwParent(h));
if (h)
h = ((MfwWin *)(h->data))->elems;
}
sigExec (mfwRoot,evt,data);
}
dspl_Enable(temp);
return;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : satCommand |
+--------------------------------------------------------------------+
PURPOSE : handle mfw windows command
*/
static int satCommand (U32 cmd, void *h)
{
switch (cmd)
{
case MfwCmdDelete: /* delete me */
if (!h)
return 0;
satDelete(h);
return 1;
default:
break;
}
return 0;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : satResponse |
+--------------------------------------------------------------------+
PURPOSE : setup Terminal Response for SIM
*/
static void satResponse (U8 res)
{
TRACE_FUNCTION("satResponse()");
if (satNoResponse) /* no response, if ... */
return; /* ... notified by ACI */
trmResponse[10] = 1;
trmResponse[11] = res;
sAT_PercentSATR(CMD_SRC_LCL,sizeof(defResponse),trmResponse);
return;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : getTLValue |
+--------------------------------------------------------------------+
PURPOSE : check TLV:
setup curCR, curTag, curLen
return size of TL part
*/
static U8 getTLValue (U8 *sc)
{
TRACE_FUNCTION("getTLValue()");
curCR = *(sc+0) & 0x80; /* comprehension required ? */
curTag = *(sc+0) & 0x7f; /* TLV id */
curLen = *(sc+1); /* length of TLV value part */
if (curLen < 0x80)
return 2;
if (curLen == 0x81)
{
curLen = *(sc+2); /* long length */
return 3;
}
TRACE_ERROR("invalid length coding");
satResponse(SatResUnknownData);
return 0; /* invalid TLV object */
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : decTLV |
+--------------------------------------------------------------------+
PURPOSE : decode TLV
*/
static U8 decTLV (U8 tagWanted, U8 mandatory, char *id)
{
U8 *sc = curCmd;
S16 len = curCmdLen;
U8 tl, partial = 0;
static char outstr [64];
sprintf(outstr,"decTLV(%02x,%d,%s)",tagWanted,mandatory,id);
TRACE_EVENT(outstr);
while (len > 0)
{
tl = getTLValue(sc);
if (!tl)
return 0;
if (curTag == tagWanted)
{
sc += tl;
curVal = sc;
curCmd = sc + curLen;
curCmdLen = len - (tl + curLen);
partialCompr += partial;
return 2;
}
sprintf(outstr,"no %s TLV",id);
TRACE_EVENT(outstr);
if (curCR)
{
if (mandatory)
satResponse(SatResUnknownData);
return !mandatory;
}
sc += tl + curLen;
len -= tl + curLen;
partial = 1;
}
if(!strcmp(id,"Tone"))
{
/*
* according to GSM 11.14 if no tone is included play general beep
*/
*curVal = 10; /* General Beep */
return 2;
}
if(!strcmp(id,"Duration"))
{
/*
* according to GSM 11.14 if no tone is included play general beep
*/
*(curVal) = 1; /* Units = sec */
*(curVal+1) = 5; /* play 5 seconds ??*/
return 2;
}
sprintf(outstr,"not found: %s TLV",id);
TRACE_EVENT(outstr);
if (mandatory)
satResponse(SatResNoValues);
return !mandatory;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : decByte |
+--------------------------------------------------------------------+
PURPOSE : decode TLV: miscelleaneous TLVs (single byte value)
*/
static U8 decByte (U8 *t, U8 tagWanted, U8 mandatory)
{
U8 res;
TRACE_FUNCTION("decByte()");
res = decTLV(tagWanted,mandatory,"byte");
if (res > 1)
{
*t = *curVal;
return 1;
}
return res;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_SAT |
| STATE : code ROUTINE : decData |
+--------------------------------------------------------------------+
PURPOSE : decode TLV: miscelleaneous TLVs (length, data)
*/
static U8 decData (SatData *t, U8 tagWanted, U8 mandatory)
{
U8 res;
TRACE_FUNCTION("decData()");
res = decTLV(tagWanted,mandatory,"data");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -