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

📄 uiwm_queue.c

📁 嵌入工linux开发的源码
💻 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 + -