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

📄 alarm_q.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
/*************************************************************************
*
* Copyright  2000 National ASIC Center, All right Reserved
*
* FILE NAME:			asix_tmr.c
* PROGRAMMER:			Lingming
* Date of Creation:		2001/02/13
* 
* DESCRIPTION: 			
*						
*						
*                       
*
* NOTE:			 		 
*						 
*
* FUNCTIONS LIST:
* -------------------------------------------------------------------------
*
* GLOBAL VARS LIST:
*
**************************************************************************
* MODIFICATION HISTORY
*
* 2001/05/21	by Lingming		Creation of this file
*							
*************************************************************************/

/* SDS C lib */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* asix window include file*/
#include "asixwin.h"
#include "asixapp.h"
//#include "hc.h"
//#include "asix_tmr.h"
#include "alarm_q.h"
#include "select.h"

#include "bitmap.h"

#include "gpc.h"

struct	alarmlist {
	U32	btid;
	U32	staticid;
	struct asix_alarmQ *alarm;		
};

U8					AlarmWinOpened = FALSE;
struct asix_alarmQ	*AsixAlarmQ, *CurDispAlarm = NULL;
U8					AlarmQLen = 0;
U8					AlarmHappens = FALSE;




static STATUS DispAlarmDetail(struct asix_alarmQ *alarm);


STATUS PostAlarm(char *title, char *infor, U16 style )
{
	struct asix_alarmQ	*alarmq, *qptr;
	MSG		msg;

	alarmq = (struct asix_alarmQ *)Lcalloc(sizeof(struct asix_alarmQ));
	if (alarmq == NULL ) return ASIX_NO_MEM;
	
	alarmq->task = GetCurTask();
	
	ReadDateTime( &alarmq->date,&alarmq->time );
	
	alarmq->flag = style;
	strncpy(alarmq->title, title, 19);
	strncpy(alarmq->infor, infor, 99);
	
	AlarmHappens = TRUE;
	
	if (AsixAlarmQ == NULL ){ 
		AsixAlarmQ = CurDispAlarm = alarmq;
		AlarmQLen++;
	}
	else
	{
		for(qptr = AsixAlarmQ; qptr->next != NULL; qptr = qptr->next);
		
		alarmq->prev = qptr;
		qptr->next = alarmq;
		
		if (CurDispAlarm == NULL) CurDispAlarm = alarmq;
		
		AlarmQLen++;
	}
	memset( (void *)&msg, 0x0, sizeof(MSG) );
	msg.messageType = ASIX_MESSAGE;
	msg.message = WM_ALARM;
	msg.lparam = 0;
	msg.data = NULL;				
	msg.wparam = 0;
	if( AdvSendMessage(GetCurTask()->id, (P_MESSAGE)&msg, NO_SWAP_TASK) == PPSM_ERROR )
		return ASIX_ERROR;
	
	return ASIX_OK;
	
}


STATUS AlarmWindow(void)
{
	U32 	boxid, bt1, bt2;
	

	struct alarmlist	list[10];
	
	U8		listindex = 0;
	static	MSG		Msg;
	U8		quit = FALSE;
	U8		float_time = 0;
	U16		lcd_w, lcd_h;
	char	tempstr[25];
	
	//struct asix_alarmq *temp;
	char 	i = 0, j = 0;
	
#define SINGLE_ALARM_MODE	0 //only display one alarm message 
#define MULTI_ALARM_MODE	1 //display multiple messages in one window	
							  //which means there have new messages coming during 
							  //this window MSG loop	
	U8		mode = SINGLE_ALARM_MODE;
	U16		lst_w = CHINESE_CHAR_HEIGHT + 2;

	if (AlarmWinOpened || CurDispAlarm == NULL)
		return ASIX_ERROR;
		

	lcd_w = ASIX_LCD_W;
	lcd_h = ASIX_LCD_H;
	
	if (CurDispAlarm->flag & ALM_NORMAL) {
		boxid = CreateWindow(WNDCLASS_WIN, CurDispAlarm->title, WS_CAPTION | WS_CLOSEBOX, // | WS_SAVESCREEN,
		0, 0, lcd_w, lcd_h, 0, 0, NULL);
		
		
	} else if (CurDispAlarm->flag & ALM_FLOAT) {
		boxid = CreateWindow(WNDCLASS_WIN, NULL, WS_BORDER | WS_SAVESCREEN,
		(U16)(lcd_w/6), (U16)(lcd_h/2), (U16)(lcd_w*2/3), (U16)(CHINESE_CHAR_HEIGHT*3), 0, 0, NULL);
	}	
	
	if (boxid==0) return ASIX_ERROR;
	
	AlarmWinOpened = TRUE;
	AlarmHappens = FALSE;
	
	if (CurDispAlarm->flag & ALM_NORMAL) {
		//switchonetotwo(note_icon, 6, CHINESE_CHAR_HEIGHT+4+6, 24, 24);
		//DrawMonoImage( GetGC(), note_icon, 6, CHINESE_CHAR_HEIGHT+4+6, 24, 24, ColorTheme.form_text, ColorTheme.form_client );
		{
			U32	hbmp;
			//U32	trColor;
			U16 x = 6;
			U16 y = CHINESE_CHAR_HEIGHT+4+6;
			U32 palette[2];
			
			palette[0] =  ColorTheme.form_client;
			palette[1] = ColorTheme.form_text;

			hbmp = (U32)LoadBitmap( note_icon, (DWORD *)palette );
			if( hbmp != 0 )
			{
				SetBMPPalette( hbmp, palette, NULL );
				//SetBkFillMode( pGC, MAKELONG( GPC_REPLACE_STYLE, GPC_TRANSPARENT_STYLE ) );
				//GetBMPPixel( pGC, 0, 0, hbmp, &trColor );
				//DisplayBMPEx( pGC, x, y, hbmp, GPC_TRANSPARENT_STYLE, trColor );
				DisplayBMP( GetGC(), x, y, hbmp );
				FreeBitmap( hbmp );
			}
		}
		
		sprintf(tempstr,"%02d:%02d:%02d\n%d/%02d/%02d", CurDispAlarm->time.hour, CurDispAlarm->time.minute, 
		CurDispAlarm->time.second,CurDispAlarm->date.year,CurDispAlarm->date.month,CurDispAlarm->date.day);
		
		DisplayMsg(tempstr, 45, CHINESE_CHAR_HEIGHT+4+6, lcd_w-5, CHINESE_CHAR_HEIGHT+4+6+32, GPC_REPLACE_STYLE);
		DisplayMsg(CurDispAlarm->infor, 5, CHINESE_CHAR_HEIGHT+4+6+35, lcd_w-5, lcd_h-25, GPC_REPLACE_STYLE);
		
		bt1 = CreateWindow(WNDCLASS_BUTTON, "确定", WS_CHILD| BS_REGULAR,
							20, (U16)(lcd_h-20), 32, 18, boxid, 0, NULL);
		bt2 = CreateWindow(WNDCLASS_BUTTON, "确定", WS_CHILD| BS_REGULAR,
							72, (U16)(lcd_h-20), 32, 18, boxid, 0, NULL);
		CurDispAlarm->flag |= ALM_DISPED;
							
		
	} else if (CurDispAlarm->flag & ALM_FLOAT) {
		DisplayMsg(CurDispAlarm->infor, lcd_w/6+1,lcd_h/2+2, lcd_w*5/6, lcd_h/2+CHINESE_CHAR_HEIGHT*2, GPC_REPLACE_STYLE);	
	}
	
	/*we should consider mutiple display of alarm 06/28*/
		
	while(!quit) {
		
		ASIXGetMessage(&Msg,NULL,0,0);
		
		if (mode == SINGLE_ALARM_MODE){
			if (CurDispAlarm->next != NULL && (CurDispAlarm->flag & ALM_NORMAL)) {
				DestroyWindow(bt1);
				DestroyWindow(bt2);
				RepaintWindow(boxid, 0);
				SetWindowText(boxid,"系统告警!",NULL);	
			
				list[0].btid = CreateWindow(WNDCLASS_BUTTON, CurDispAlarm->title, WS_CHILD | BS_ICON,
				17,30, 100, lst_w, boxid, 0, NULL);
				list[0].alarm = CurDispAlarm;
				
				list[0].staticid = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD | SS_ICON,
				3,30, 10, 10, boxid, MAKELONG(10,10), (char *)down10X10);
				
				listindex++;
				CurDispAlarm = CurDispAlarm->next;
				mode = MULTI_ALARM_MODE;
			}
		}
		
		if (CurDispAlarm!= NULL && mode == MULTI_ALARM_MODE && listindex<10) {
			list[listindex].btid = CreateWindow(WNDCLASS_BUTTON, CurDispAlarm->title, WS_CHILD | BS_ICON,
			17,(U16)(listindex*lst_w+30), 100, lst_w, boxid, 0, NULL);
			
			list[listindex].alarm = CurDispAlarm;
			
			list[listindex].staticid = CreateWindow(WNDCLASS_STATIC, NULL, WS_CHILD | SS_ICON,
			3,(U16)(listindex*lst_w+30), 10, 10, boxid, MAKELONG(10,10), (char *)down10X10);
			
			listindex++;
			CurDispAlarm->flag |= ALM_DISPED;
			CurDispAlarm = CurDispAlarm->next;
			
			AlarmHappens = FALSE;//clear the alarm happening flag
			
		}
		
		switch (Msg.message )
		{
			case ASIX_RTC:
				i++;
				if (mode == SINGLE_ALARM_MODE)
					if (i>2 && (CurDispAlarm->flag & ALM_FLOAT))
						quit=TRUE;
				break;
			/*case WM_CLIENT:
				if (CurDispAlarm->flag & ALM_FLOAT)
					quit = TRUE;
				break;*/
			case WM_COMMAND:
				if (mode == SINGLE_ALARM_MODE) {
					if (Msg.lparam == bt1) {
						quit = TRUE;
					} else if (Msg.lparam ==bt2) {
						;
					}
									
				}else if (mode == MULTI_ALARM_MODE) {
					for (j= 0; (Msg.lparam != list[j].btid) && j<10; j++);
					if (j == 10 ) break;
					DispAlarmDetail(list[j].alarm);	
					
					if (list[j].staticid != 0){
						DestroyWindow(list[j].staticid);
						list[j].staticid = 0;
					}	
							
				}
				
				break;
			case WM_QUIT:
				quit = TRUE;
				break;
		}
		
		DefWindowProc(Msg.message, Msg.lparam, Msg.data, Msg.wparam);
	}
	
	
	DestroyWindow(boxid);
	
	//temp = CurDispAlarm;
	
	if (mode == SINGLE_ALARM_MODE)
		CurDispAlarm = CurDispAlarm->next;
	
	//Lfree(temp);
	
	AlarmWinOpened = FALSE;
	//AlarmQLen--;
	
	return ASIX_OK;
	
}


STATUS DispAlarmDetail(struct asix_alarmQ *alarm)
{
	U32 	boxid, bt1, bt2;
	static	MSG		Msg;
	U8		quit = FALSE;
	U16		lcd_w, lcd_h;
	char	tempstr[25];
	//U8		i;
		
	lcd_w = ASIX_LCD_W;
	lcd_h = ASIX_LCD_H;
	
	boxid = CreateWindow(WNDCLASS_WIN, alarm->title, WS_CAPTION | WS_CLOSEBOX ,
	0, 0, lcd_w, lcd_h, 0, 0, NULL);
	
	if (boxid==0) return ASIX_ERROR;
	
		
	//switchonetotwo(note_icon, 6, CHINESE_CHAR_HEIGHT+4+6, 24, 24);
	//DrawMonoImage( GetGC(), note_icon, 6, CHINESE_CHAR_HEIGHT+4+6, 24, 24, ColorTheme.form_text, ColorTheme.form_client );
	{
		U32	hbmp;
		//U32	trColor;
		U16 x = 6;
		U16 y = CHINESE_CHAR_HEIGHT+4+6;
		//U32 palette[] = { ColorTheme.form_client, ColorTheme.form_text };
		U32 palette[2];

		palette[0] =  ColorTheme.form_client;
		palette[1] = ColorTheme.form_text;

		hbmp = LoadBitmap( note_icon, palette );
		if( hbmp != 0 )
		{
			SetBMPPalette( hbmp, palette, NULL );
			//SetBkFillMode( pGC, MAKELONG( GPC_REPLACE_STYLE, GPC_TRANSPARENT_STYLE ) );
			//GetBMPPixel( pGC, 0, 0, hbmp, &trColor );
			//DisplayBMPEx( pGC, x, y, hbmp, GPC_TRANSPARENT_STYLE, trColor );
			DisplayBMP( GetGC(), x, y, hbmp );
			FreeBitmap( hbmp );
		}
	}
	
	sprintf(tempstr,"%02d:%02d:%02d\n%d/%02d/%02d", alarm->time.hour, alarm->time.minute, 
	alarm->time.second, alarm->date.year,alarm->date.month,alarm->date.day);
	
	DisplayMsg(tempstr, 45, CHINESE_CHAR_HEIGHT+4+6, lcd_w-5, CHINESE_CHAR_HEIGHT+4+6+32, GPC_REPLACE_STYLE);
	DisplayMsg(alarm->infor, 5, CHINESE_CHAR_HEIGHT+4+6+35, lcd_w-5, lcd_h-25, GPC_REPLACE_STYLE);
		
	bt1 = CreateWindow(WNDCLASS_BUTTON, "确定", WS_CHILD| BS_REGULAR,
						20, (U16)(lcd_h-20), 32, 18, boxid, 0, NULL);
	bt2 = CreateWindow(WNDCLASS_BUTTON, "确定", WS_CHILD| BS_REGULAR,
						72, (U16)(lcd_h-20), 32, 18, boxid, 0, NULL);
	
	while(!quit) {
		
		ASIXGetMessage(&Msg,NULL,0,0);
		
		// if we are in this window for 25 seconds,
		//we will quit automatically, so that we will never
		//miss the after coming message 
		if (PowerSavingTimeOut <= 5) quit = TRUE;
		
		switch (Msg.message )
		{
		case WM_COMMAND:
			if (Msg.lparam == bt1) {
				quit = TRUE;
			} else if (Msg.lparam ==bt2) {
				;
			}
			break;
		case WM_QUIT:
			quit = TRUE;
			break;
		}
		
		DefWindowProc(Msg.message, Msg.lparam, Msg.data, Msg.wparam);
	}
	
	
	DestroyWindow(boxid);	
	
	return ASIX_OK;	
	
}


STATUS BrowseAlarm(void)
{
	
	U32 	boxid, bt1, bt2, checkid, scrollid;
	struct 	alarmlist	list[9];
	
	const	char 		spacestr[]=" ";
	SL_ITEM				*checkitem;
	
	U8		listindex = 0;
	static	MSG		Msg;
	U8		quit = FALSE;
	struct asix_alarmQ	*alarmq, *curindex, *oldindex;
	U8		i;
	
	if (AlarmQLen == 0) {
		MessageBox(0, "没有告警记录!","没有告警记录",MB_OK | MB_ICONASTERISK);
		return ASIX_OK;
	}
	
	memset(list, 0x0, 9*sizeof(struct alarmlist));
	
	boxid = CreateWindow(WNDCLASS_WIN, "系统告警浏览", WS_CAPTION | WS_CLOSEBOX | WS_SAVESCREEN,
	0, 0, ASIX_LCD_W, ASIX_LCD_H, 0, 0, NULL);
	
	if (boxid==0) return ASIX_ERROR;
	
	bt1 = CreateWindow(WNDCLASS_BUTTON, "删 除", WS_CHILD | WS_DISABLED | BS_REGULAR,
		20,213, 50, 25, boxid, 0, NULL);
	bt2 = CreateWindow(WNDCLASS_BUTTON, "确 定", WS_CHILD | BS_REGULAR,
		90,213, 50, 25, boxid, 0, NULL);
				
	
	
	checkitem = Lcalloc(min(AlarmQLen+1,10)*sizeof(SL_ITEM));
	
	if (checkitem != NULL) {
		for (i = 0; i< min(AlarmQLen,9); i++)
			checkitem[i].caption = (char *)spacestr;
		
		checkid = CreateWindow(WNDCLASS_SELECT, NULL, WS_CHILD | SLS_CHECKBOX,
		1,30, 14, (U16)(i*20), boxid, 0, checkitem);		
		
	}
	
	
	for (listindex = 0,alarmq = AsixAlarmQ ; listindex < min(9, AlarmQLen); 
	listindex++, alarmq = alarmq->next) {
		
		list[listindex].btid = CreateWindow(WNDCLASS_BUTTON, alarmq->title, WS_CHILD | BS_ICON,
		16,(U16)(listindex*20+30), 130, 20, boxid, 0, NULL);
		
		list[listindex].alarm = alarmq;
		
	}
	
	
	
	if (AlarmQLen> 9) {
		scrollid = CreateWindow(WNDCLASS_SCROLL, NULL, WS_CHILD | SBS_VERT,
		146, 30, 14, 180, boxid, MAKELONG(0,AlarmQLen), NULL);
		curindex = oldindex = AsixAlarmQ;	
	}	
	
	
	
		
	while(!quit) {
		
		ASIXGetMessage(&Msg,NULL,0,0);
		
		switch (Msg.message )
		{
			case WM_COMMAND:
				if ( Msg.lparam == bt1 ) {
					;
				} else if (Msg.lparam == bt2) {
					;
				} else {
					for(i=0; i<AlarmQLen && list[i].btid!=Msg.lparam; i++);
					if (i == AlarmQLen ) break;
					DispAlarmDetail(list[i].alarm);
				}
				break;
			
			case WM_SELECTBOX:
				for ( i = 0; i<(AlarmQLen+1) &&	checkitem[i].state == SL_UNCHECKED; i++);
				
				if ( i == AlarmQLen+1) 
					EnableWindow(bt1, FALSE);
				else 
					EnableWindow(bt1, TRUE);
				
				break;
			case WM_VSCROLL:
			
				if (Msg.lparam == scrollid){
										
					oldindex = curindex;
					
					switch ( Msg.wparam )
					{
					case SB_PAGEUP:
						for (i = 0; curindex!= NULL && i<9; i++)
							curindex = curindex->prev;
						if (curindex == NULL) curindex = AsixAlarmQ;
						break;
					case SB_PAGEDOWN:
						for (i = 0; curindex->next != NULL && i<9; i++)
							curindex = curindex->next;
						
						break;
					case SB_LINEUP:
						curindex = curindex->prev;
						if ( curindex == NULL )	curindex = AsixAlarmQ; 
						break;
					case SB_LINEDOWN:
						
						if (curindex->next!= NULL)
							curindex = curindex->next;
						
						break;
					
					case SB_ENDSCROLL:
						for ( i = 0, curindex = AsixAlarmQ; i<GetScrollPos(Msg.lparam,0,0,0); i++)
							curindex = curindex->next ;
						
						//if (curindex > (AsixAlarmQ+AlarmQLen-1))  curindex = AsixAlarmQ+AlarmQLen-1;
						break;
					}
					
					if (oldindex != curindex){
						
						for (i=0, alarmq = AsixAlarmQ; curindex != alarmq;i++,alarmq = alarmq->next);
															
						SetScrollPos(Msg.lparam, i, 0, 0);
						
						
						for ( i = 0; i < 9; i++){
							
							list[i].alarm = curindex;
							
							if (curindex!= NULL)
								curindex = curindex->next;
							
							if (list[i].alarm!= NULL)	
								SetWindowText(list[i].btid, (list[i].alarm)->title, NULL);
							else
								SetWindowText(list[i].btid, NULL, NULL);
								
							if ( curindex == NULL )
								EnableWindow(list[i].btid,FALSE);
							else 
								EnableWindow(list[i].btid,TRUE);
						}
						
					}
					
					
				}
				
				
				break;
			
			case WM_QUIT:
				quit = TRUE;
				break;
		}
		
		DefWindowProc(Msg.message, Msg.lparam, Msg.data, Msg.wparam);
	}
	
	
	
	DestroyWindow(boxid);
	Lfree(checkitem);
	
	return ASIX_OK;
	
}

⌨️ 快捷键说明

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