⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfw_sat.c

📁 GSM手机设计软件代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -