📄 mfw_tim.c
字号:
}
/*
+--------------------------------------------------------------------+
| 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 + -