📄 uiwm_queue.c
字号:
/**************************************************************
INCLUDE FILE
***************************************************************/
#include <uiWnd.h>
#include <stdio.h>
#include <battery.h>
#include <uiAlarm.h>
#include <uiWm_Queue.h>
#ifdef _DEBUG
//#define _DEBUG_WM_QUEUE_
#endif
//extern variable
extern unsigned short SleepHandlingFlag;
extern struct thread *CurrentThread;
extern TWindow * gpWindowsList;
extern TGuiMessageQueue *SysMsgQueue;
//extern unsigned int gIdlePLL;
BOOL _guiSysDefaultMsgHandler(TGuiMessage *message);
TGuiMessageQueue *_guiAllocateMessageQueue(short nMaxMessageNo)
{
TGuiMessage *pMsg;
TGuiMessageQueue *pQueue;
//allocate queue;
pMsg=(TGuiMessage *)sc_malloc(sizeof(TGuiMessage)*nMaxMessageNo);
if(pMsg==NULL)
{
return NULL;
}
//allocate structure
pQueue=(TGuiMessageQueue *)sc_malloc(sizeof(TGuiMessageQueue));
if(pQueue==NULL)
{
sc_free(pMsg);
return NULL;
}
else
{
pQueue->mqRear=0;
pQueue->mqFront=0;
pQueue->ownerThread=CurrentThread;
pQueue->suspendFlag=0;
pQueue->mQueue=pMsg;
pQueue->nMaxMessageNo=nMaxMessageNo;
}
return pQueue;
}
TGuiMessageQueue * guiAllocateMessageQueue(void)
{
return _guiAllocateMessageQueue(GUI_MAX_MESSAGE_NO);
}
STATUS guiReleaseMessageQueue(TGuiMessageQueue *pQueue)
{
sc_disableInt();
if(pQueue==NULL)
{
return STATUS_ERR;
}
sc_free(pQueue->mQueue);
sc_free(pQueue);
sc_enableInt();
return STATUS_OK;
}
STATUS _guiEnqueue(TGuiMessageQueue *queue,TGuiMessage *message)
{
WORD qRear,qFront;
if(queue==NULL)
{
return STATUS_ERR;
}
qRear=queue->mqRear;
qFront=queue->mqFront;
//if the queue is full,return;
if(qRear>qFront&&qRear==(queue->nMaxMessageNo-1)&&qFront==0)
{
#ifdef _DEBUG_WM_QUEUE_
char DebugInfo[32];
sprintf(DebugInfo,"the queue: %x is full",(int)queue);
if(queue!=SysMsgQueue)
{
sc_logString(DebugInfo,TO_MONITOR);
}
else
{
sc_logString("the sys queue is full!",TO_MONITOR);
}
#endif
return STATUS_ERR;
}
if(qRear<qFront&&(qFront-qRear)==1)
{
#ifdef _DEBUG_WM_QUEUE_
char DebugInfo[32];
sprintf(DebugInfo,"the queue: %x is full",(int)queue);
if(queue!=SysMsgQueue)
{
sc_logString(DebugInfo,TO_MONITOR);
}
else
{
sc_logString("the sys queue is full!",TO_MONITOR);
}
#endif
return STATUS_ERR;
}
//add message to queue;
qRear=(qRear+1)%queue->nMaxMessageNo;
memcpy(&queue->mQueue[qRear],message,sizeof(TGuiMessage));
queue->mqRear=qRear;
//if the owner thread is suspended,resume it;
if(queue->suspendFlag==1)
{
queue->suspendFlag=0;
queue->ownerThread->waitingTickNO=1;
SleepHandlingFlag=1;
}
return STATUS_OK;
}
STATUS guiEnqueue(TGuiMessageQueue * queue, TGuiMessage *message)
{
STATUS iRet;
sc_disableInt();
iRet=_guiEnqueue(queue,message);
sc_enableInt();
return iRet;
}
STATUS guiDequeue(TGuiMessageQueue *queue, TGuiMessage *message)
{
//if queue have not message,suspend it;
if(queue==NULL)
{
return STATUS_ERR;
}
sc_disableInt();
if(queue->mqRear==queue->mqFront)
{
queue->suspendFlag=1;
sc_suspend((int)queue->ownerThread->tid);
if(queue->mqRear==queue->mqFront)
{
sc_enableInt();
return STATUS_ERR;
}
}
#ifndef __WIN32__
//SpeedPLL();
#endif
//get message
queue->mqFront=(queue->mqFront+1)%queue->nMaxMessageNo;
memcpy(message,&queue->mQueue[queue->mqFront],sizeof(TGuiMessage));
sc_enableInt();
// call system default message handler
if(_guiSysDefaultMsgHandler(message)!=0)
{
return STATUS_ERR;
}
return STATUS_OK;
}
STATUS guiDequeue2(TGuiMessageQueue *queue, TGuiMessage *message)
{
if(queue==NULL)
{
return STATUS_ERR;
}
sc_disableInt();
//if queue have not message ,return -1;
if(queue->mqRear==queue->mqFront)
{
sc_enableInt();
return STATUS_ERR;
}
//get message
queue->mqFront=(queue->mqFront+1)%queue->nMaxMessageNo;
memcpy(message,&queue->mQueue[queue->mqFront],sizeof(TGuiMessage));
sc_enableInt();
// call system default message handler
if(_guiSysDefaultMsgHandler(message)!=0)
{
return STATUS_ERR;
}
return STATUS_OK;
}
STATUS guiPequeue(TGuiMessageQueue *queue, TGuiMessage *message)
{
WORD front;
if(queue==NULL)
{
return STATUS_ERR;
}
sc_disableInt();
//if queue have not message ,return -1;
if(queue->mqRear==queue->mqFront)
{
sc_enableInt();
return STATUS_ERR;
}
//get message
front=(queue->mqFront+1)%queue->nMaxMessageNo;
memcpy(message,&queue->mQueue[front],sizeof(TGuiMessage));
sc_enableInt();
return STATUS_OK;
}
void _guiEmptyQueue(TGuiMessageQueue *queue)
{
if(queue==NULL)
{
return;
}
queue->mqRear=0;
queue->mqFront=0;
return;
}
void guiEmptyQueue(TGuiMessageQueue *queue)
{
if(queue==NULL)
{
return;
}
sc_disableInt();
_guiEmptyQueue(queue);
sc_enableInt();
return;
}
void guiBroadcasting(TGuiMessage *message)
{
TWindow *pWin;
sc_disableInt();
//broadcast message;
pWin=gpWindowsList;
while(pWin!=NULL)
{
if(pWin->parent==NULL)
{
guiEnqueue(pWin->messageQueue,message);
}
pWin=pWin->back;
}
sc_enableInt();
return;
}
BOOL _guiSysDefaultMsgHandler(TGuiMessage *message)
{
AlarmNode *pAlarm;
//voidfun pFun;
PF_DisplayAlarm pFun;
if(message->messageType==WIN_WAKEUP_MENU)
{
guiEnterWCS();
//wakeupMenubar();
guiExitWCS();
//return TRUE;
}
else if(message->messageType==WIN_HELP)
{
guiWindow_Help();
return TRUE;
}
else if(message->messageType==SYS_MESSAGE_ALARM)
{
pAlarm = (AlarmNode *)message->elseInfo;
pFun = pAlarm->msg_alarmcallbackfun;
(*pFun)(message->handle, pAlarm->pAlarmMsg);
#ifndef __WIN32__
StopAlarmBuzz();
#endif
return TRUE;
}
else if(message->messageType==TEXTFIELD_LONG_TOUCH)
{
extern POPUP_FUNC_TYPE GetPopFuncPtr( void );
POPUP_FUNC_TYPE ptr;
//extern void PopLookupWindow(const char *, int);
//printf("long touch msg, index=%d,string=%s", message->x, (char *)message->elseInfo );
ptr = GetPopFuncPtr();
if ( ptr != NULL )
(*ptr)( (char *)message->elseInfo , (int)message->x);
//PopLookupWindow( (char *)message->elseInfo , (int)message->x);
return TRUE;
}
else if(message->messageType==SYS_MESSAGE_LOWBATTERY)
{
extern WORD BatteryMessage;
if ( message->x == VOLT_LEVEL0 )
{
extern int gLanguage;
#ifndef __WIN32__ // by zhangxp
#if defined(CHIPMOS) || defined(PR2001B)
wave_error();
#endif
#endif
guiMessageBox("Warning", RES_STR_LOWBATTERY[gLanguage], GUIMB_OK); // "响闹提醒"
BatteryMessage = 1;//Kevin
printf("batt warning\n\r");
}
else if ( message->x == DANGER_LEVEL )
{
#ifndef __WIN32__
systemShutDown();
printf("batt shutdown\n\r");
#endif }
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -