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

📄 mfw_tim.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timTime            |
+--------------------------------------------------------------------+

  PURPOSE : get timers remaining time

*/

S32 timTime (MfwHnd h)
{
    MfwTim *tc;

    if (!h)
        return 0;

    if (((MfwHdr *) h)->type != MfwTypTim)
        return 0;

    tc = ((MfwHdr *) h)->data;

    if (timFind(tc))
        return (tmrLeft() + tc->left);

    return 0;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timSignal          |
+--------------------------------------------------------------------+

  PURPOSE : thread context time out

*/

void timSignal (void)
{
    S32 tout;
    MfwTim *tc;
	UBYTE temp;

    if (!timRoot)
        return;

    ActiveTOut = timRoot;
	ActiveTOut->next2 = 0;

    while (timRoot && timRoot->left == 0)
    {
        timRoot->left = -1;             /* flag timeout             */
        timRoot->next2 = timRoot->next; /* setup timeout chain      */
        timRoot = timRoot->next;        /* remove element           */

        /* SPR#2029 - DS - Ensure second timer exists. Port of HLE fix. */
	  if (timRoot != 0)
            timRoot->next2 = 0;
    }

    if (timRoot)
    {
        tout = timRoot->left;
        tc = timRoot;
        while (tc)
        {
            tc->left -= tout;           /* adjust time left entry   */
            tc = tc->next;
        }
        tmrStart(tout);                 /* start next session       */
    }

    while (ActiveTOut && ActiveTOut->left < 0)          /* signal timout handlers   */
    {
        ActiveTOut->left = 0;

/* PATCH PMC 000721: save the next pointer because the memory associated with 
 * to may be released in the timer handler function.
 */
        timSavedNext = ActiveTOut->next2;
/* END PATCH PMC 000721 */
		
        if (ActiveTOut->handler)
        {
        // PATCH LE 06.06.00
        // store current mfw elem
          current_mfw_elem = ActiveTOut->mfwHeader;	 /* SPR#1597 - SH - Change mfw_header to mfwHeader */
        // END PATCH LE 06.06.00

		/* NM, p011b */	
//		temp = dspl_Enable(0);
		/* p011b end */	
		
		  (*(ActiveTOut->handler))(ActiveTOut->time,ActiveTOut);

		/* NM, p011c */
//		dspl_Enable(temp);
		/* p011c end */	  
		
        }
/* PATCH PMC 000721: use the SavedNext pointer to set ActiveTOut */
		ActiveTOut = timSavedNext;
/* END PATCH PMC 000721 */
    }

	ActiveTOut = 0;
	timSavedNext = 0;

}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timTimeout         |
+--------------------------------------------------------------------+

  PURPOSE : thread context time out

*/

void timTimeout (void)
{
    timTimeoutCount++;

    if (timTimeoutBusy)
        return;

    timTimeoutBusy = 1;
    while (timTimeoutCount)
    {
        timTimeoutCount--;
        timSignal();
    }
    timTimeoutBusy = 0;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timInsert          |
+--------------------------------------------------------------------+

  PURPOSE : insert timer into ordered list

*/

static void timInsert (MfwTim *t)
{
    MfwTim *prev, *curr;

    if (!timRoot)
    {
        timRoot = t;
        t->next = 0;
        return;
    }
    if (t->left < timRoot->left)
    {
        t->next = timRoot;
        timRoot = t;
        return;
    }
    prev = timRoot;
    curr = timRoot->next;
    while (curr && t->left >= curr->left)
    {
        prev = curr;
        curr = curr->next;
    }
    prev->next = t;
    t->next = curr;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timRemove          |
+--------------------------------------------------------------------+

  PURPOSE : remove timer from list

*/

static void timRemove (MfwTim *t)
{
    MfwTim *prev, *curr;
	MfwTim *timCheck;
	int		doneFlag = 0;

	if (t == 0)
        return;
	
    while (timRoot == t)
        timRoot = t->next;
 
    if (timRoot)
	{
    prev = timRoot;
    curr = timRoot->next;

    while (curr)
    {
        if (curr == t)
            prev->next = curr->next;
        else
            prev = curr;
        curr = curr->next;
    }
}

    /*
    ** Ensure that the timer being deleted is not on the ActiveTOut List
    */
    if (timSavedNext)
	{
		if (timSavedNext == t)
		{
			timSavedNext = timSavedNext->next2;
		}
		else
		{
			timCheck = timSavedNext;

		    while (timCheck != 0 && !doneFlag)
		    {
		    	if (timCheck->next2 == t)
		    	{
		    		timCheck->next2 = t->next2;

		    		doneFlag = (int)1;
		    	}
		    	else
		    	{
		    		timCheck = timCheck->next2;
		    	}
		   	}
		}
	}
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timAdjust          |
+--------------------------------------------------------------------+

  PURPOSE : adjust all timers in list

*/

static void timAdjust (S32 t)
{
    MfwTim *tc;

    tc = timRoot;
    while (tc)
    {
        tc->left += t;
        tc = tc->next;
    }
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timFind            |
+--------------------------------------------------------------------+

  PURPOSE : find timer in running list

*/

static int timFind (MfwTim *t)
{
    MfwTim *tc;

    tc = timRoot;
    while (tc)
    {
        if (tc == t)
            return 1;
        tc = tc->next;
    }

    return 0;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timCommand         |
+--------------------------------------------------------------------+

  PURPOSE : handle mfw windows command

*/

static int timCommand (U32 cmd, void *h)
{
    switch (cmd)
    {
        case MfwCmdDelete:              /* delete me                */
            if (!h)
                return 0;
            timDelete(h);
            return 1;
        default:
            break;
    }

    return 0;
}

//glowing,2004-06-16,import from M188
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_TIM            |
| STATE   : code                        ROUTINE : timFindOut zy         |
+--------------------------------------------------------------------+

  PURPOSE : find timer in running list

*/
int timFindOut (MfwHnd h)
{  MfwTim *t;
   MfwTim *tc;
   if (!h)
        return 0;

    if (((MfwHdr *) h)->type != MfwTypTim)
        return 0;
    t = ((MfwHdr *) h)->data;


    tc = timRoot;
    while (tc)
    {
        if (tc == t)
            return 1;
        tc = tc->next;
    }

    return 0;
}

//glowing,2004-06-16,end of import


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -