alarm.c

来自「采用MINIGUI开发的一套GUI界面」· C语言 代码 · 共 865 行 · 第 1/2 页

C
865
字号
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pwd.h>#include <time.h>#include <sys/types.h>#include <sys/shm.h>#include <sys/ipc.h>#include <sys/types.h>#include <sys/stat.h>#include <minigui/common.h>#include <minigui/minigui.h>#include <minigui/gdi.h>#include <minigui/window.h>#include <minigui/control.h>#include <minigui/mgext.h>#include "common.h"#include "alarm.h"//写报警文件//每条记录为//通道号+来源+消报标志+报警类型/*报警时间+报警时实时值record_length  单条数据总长度RECORD_LENGTHrecord_index  第几条数据*/#define RECORD_LENGTH 22char *alarm_type[] = {"Lo_报警","Hi_报警","LoLo_报警","HiHi_报警"};void CheckEvent(void){bzero(evnt,sizeof(evnt));	//alarm_number//当前报警数//总的支持的事件条数}void CheckMemory(void){// #define DEBUG_MEM int i1=0,i2=0;FILE * cfPtr;unsigned char *tokenPtr;unsigned char memobuff[110];unsigned char memo1[10];bzero(memo,sizeof(memo));	tokenPtr=(unsigned char *)malloc(12*sizeof(unsigned char));	 system("command df > dat.tmp");                       if ( (cfPtr=fopen("dat.tmp","r"))==NULL)                          printf (" dat.tmp file could not be opened \n");                      else {                        while (!feof (cfPtr)   )                        {                        i1+=1;                        fgets(memobuff,100,cfPtr);//得到磁盘个数#ifdef DEBUG_MEM			    printf ("memo=%s\n",memobuff);	#endif				if (i1==2){				tokenPtr=strtok(memobuff," "); 				while ( tokenPtr!= NULL&& i2<6)   //i2为打断本行					     {                        //    Data = tokenPtr;#ifdef DEBUG_MEM							                        //    sprintf(Data[i2],"%s\0",Data[i2]);                   			//	 printf ("Data2[%d]=%s\n",i2,Data[i2]);		// printf ("memo4=%s\n",Data[4]);		 #endif        						if(i2==4)strncpy(memo,tokenPtr,3);			//				 printf ("i2=%d  memo5=%s\n",i2,memo);                            tokenPtr= strtok(NULL," ");				 i2+=1;						}			    		}	                   	    }                 	  } 			//strncpy(memo,Data[4],6);					//memo[7]='\0';		system("rm dat.tmp -rf");			//strncpy(memo1,Data[4],3);			// printf ("memo=%s\n",memo1);			//sprintf(memo,"%s\n\n%s\0","memo",memo1);}//本函数当一有报警就调用void WriteAlertRecord(BYTE * record){//可以考虑当程序一旦启动则文件处于开放状态	 time_t t;	 struct tm* tm;	 	struct stat file;	FILE *fd;	static BYTE buf[24];	int record_index;//记录条数	int record_addr;//新记录地址		//打开报警文件	 if(stat("alert.dat",&file)>0)//文件存在	{ 	fd=fopen("alert.dat","r+b");	 fseek(fd,0,SEEK_SET); 	 	 //开始的3-4个字节放有最新记录所在位置record_addr	 //  1-2  BYTE is 记录号(record_index)	 fread(buf,sizeof(buf[0]),4,fd);	 record_addr=buf[2]*256+buf[3];	 record_index=buf[0]*256+buf[1];	  	fseek(fd,4+RECORD_LENGTH*record_index,SEEK_SET); 	 time(&t);		 	//读取当前时间 	 tm = localtime(&t);		 	   	 buf[0]=dev_id;	       //板卡号	        buf[1]=channel_id;       //通道号	        buf[2]=clear_alert_flag;         //消报标志	        buf[3]=alert_type;         //类型	        buf[4]=0;         //颜色	        buf[5]=0;         //报警类型	        buf[6]=tm->tm_year-100;          	        buf[7]=tm->tm_mon;	        buf[8]=tm->tm_mday;	        buf[9]=tm->tm_hour;	        buf[10]=tm->tm_min;	        buf[11]=tm->tm_sec;				//四位报警时候实时值	//写入本条记录	fwrite(record,sizeof(record[0]),RECORD_LENGTH,fd);	record_index++;		//更新文件头索引	record_addr=record_addr+RECORD_LENGTH;	 buf[0]=record_index/256;	 buf[1]=record_index%256;	 buf[2]=record_addr/256;	 buf[3]=record_addr%256;	 	 fseek(fd,0,SEEK_SET);	 fwrite(buf,sizeof(buf[0]),4,fd); 		fclose(fd);   	 	}} //读报警文件//根据时间读或者根据索引读,总条数void  ReadAlertRecord( int index,int number){	FILE* fd;	BYTE AlertData[528];  	fd=fopen("alert.dat","r+b");		fseek(fd,4+index*RECORD_LENGTH,SEEK_SET); 	fread(AlertData,sizeof(AlertData[0]),number*RECORD_LENGTH,fd);			fclose(fd);	 }//定义报警界面 LVSUBITEM subdata;  //添加每一行内容 LVITEM item;        	//添加一行 unsigned char date[20]; static unsigned int RowY;       //当前屏幕纵坐标int  EventProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam){  	HDC hdc;	int i;    //循环用       static unsigned int rowNum;   //所处行号        int id ;	 id= LOWORD (wParam);       switch (message)       {       case MSG_INITDIALOG:       {             AlarmInit(hDlg);    	    RowY=1;      	     for(i=0;i<10;i++) 	 	AlarmHappenTest (GetDlgItem (hDlg, ALARM_ALERT_LIST));		 SetTimer(hDlg,_ID_TIMER_ALARM,99);	            }      return 1; case MSG_KEYDOWN:	 	if(!keydowned)	 		{	if(id==KEYE_MODE)	SendDlgItemMessage(hDlg, ALARM_MODE, BM_SETSTATE , BST_PUSHED ,0);	if(id==KEYE_UPDOWN)SendDlgItemMessage(hDlg, ALARM_FIRST, MSG_LBUTTONDOWN , 0 ,0);	if(id==KEYE_UP)SendDlgItemMessage(hDlg, ALARM_UP, MSG_LBUTTONDOWN , 0 ,0);	if(id==KEYE_DOWN)SendDlgItemMessage(hDlg, ALARM_DOWN, MSG_LBUTTONDOWN , 0 ,0);	if(id==KEYE_ENTER)SendDlgItemMessage(hDlg, ALARM_ENTER, MSG_LBUTTONDOWN , 0 ,0);	if(id==KEYE_BACK)SendDlgItemMessage(hDlg, ALARM_BACK, BM_SETSTATE, BST_PUSHED,0);	if(id==KEYE_SHUT)SendDlgItemMessage(hDlg, ALARM_CLOSE, BM_SETSTATE, BST_PUSHED,0);	  	keydowned=1;		}	  break;		 case MSG_KEYUP:		keydowned=0;	      if(id==KEY_EXIT)  	EndDialog (hDlg, 0);		if(id==KEYE_MODE)		{		SendDlgItemMessage(hDlg, ALARM_MODE, BM_SETSTATE , 0,0);		SendMessage(hDlg,MSG_COMMAND,ALARM_MODE,0);       	}	if(id==KEYE_UPDOWN)		{SendDlgItemMessage(hDlg, ALARM_FIRST, MSG_LBUTTONUP, 0,0);		SendMessage(hDlg,MSG_COMMAND,ALARM_FIRST,0);		}	if(id==KEYE_UP)		{SendDlgItemMessage(hDlg, ALARM_UP, MSG_LBUTTONUP, 0,0);		SendMessage(hDlg,MSG_COMMAND,ALARM_FIRST,0);       	}		if(id==KEYE_DOWN)		{SendDlgItemMessage(hDlg, ALARM_DOWN, MSG_LBUTTONUP, 0,0);		SendMessage(hDlg,MSG_COMMAND,ALARM_DOWN,0);		}		 if(id==KEYE_ENTER)		{SendDlgItemMessage(hDlg, ALARM_ENTER, MSG_LBUTTONUP, 0,0);		SendMessage(hDlg,MSG_COMMAND,ALARM_ENTER,0);       	}	  if(id==KEYE_BACK)		{SendDlgItemMessage(hDlg, ALARM_BACK, BM_SETSTATE, 0,0);		 EndDialog(hDlg,0);	  	}	  if(id==KEYE_SHUT)SendDlgItemMessage(hDlg, ALARM_CLOSE, BM_SETSTATE, 0,0);	    	break;	   case MSG_COMMAND:    {	 /*当前显示窗口为报警列表*/        if(IsWindowVisible (GetDlgItem (hDlg, ALARM_ALERT_LIST))) {  	 switch (id){	  /*convert between eventAlert page and Report page*/		  case ALARM_MODE:	  {	   ShowWindow(GetDlgItem (hDlg, ALARM_ALERT_LIST),SW_HIDE) ;		   ShowWindow(GetDlgItem (hDlg, ALARM_REPORT_LIST),SW_SHOW) ;	   ShowWindow(GetDlgItem (hDlg, ALARM_DATE),SW_SHOW) ;	   ShowWindow(GetDlgItem (hDlg, ALARM_LAST),SW_SHOW) ;	   ShowWindow(GetDlgItem (hDlg, ALARM_NEXT),SW_SHOW);	   SetDlgItemText(hDlg, ALARM_MODE,"  \n模式\n报告"); 	   SetDlgItemText(hDlg, ALARM_FIRST,"  \n报告\n每日");	   SendMessage(GetDlgItem(hDlg,ALARM_REPORT), BM_SETSTATE , BST_PUSHED ,0);	   SendMessage(GetDlgItem(hDlg,ALARM_ALARM), BM_SETSTATE , 0 ,0); 	  }	 break;       /*选择首行或尾行*/	 case ALARM_FIRST:	 {    	 	rowNum = SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),LVM_GETSELECTEDITEM, 0,0);	 	if(alarm_number==0)  break;             else if(alarm_number<24)              	{              	    if(rowNum==1)              	    	{				RowY = alarm_number;     //小于24行,且不在首行时,移到行末                           SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15+8)<<16)+50));	              	    	}			   else                                                   	{        			RowY=1;     //移至行首        			SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15+8)<<16)+50));	                     	}                         break;             	       }		else	 	//大于23行 ,一屏显示不下,需下拉显示最后一行		{                  if(rowNum==1)                  {                        //是第一行的话则选最后一行                        RowY = 23;                        SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST), MSG_VSCROLL, SB_THUMBTRACK,(LPARAM)0xfff);	                        SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15+8)<<16)+50));						             	     }                  else                   {			RowY= 1;	             SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_VSCROLL, SB_THUMBTRACK,0);				SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15)<<16)+50));	                  }		}	 break;	 }	       /*上移*/        case ALARM_UP:	{    	       rowNum = SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),LVM_GETSELECTEDITEM, 0,0);		if((alarm_number==0)||(rowNum==1))  break;		else if(RowY>=1)		{		     RowY --;			 if(RowY<1)RowY=rowNum;                  SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15+8)<<16)+50));	             	     break;		}	      else		{       	     RowY = 1;      	           SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_VSCROLL, SB_LINEUP,0);      		    SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15+8)<<16)+50));			}             break;	}	/*下移*/	 case ALARM_DOWN:	 {	      rowNum = SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),LVM_GETSELECTEDITEM, 0,0);	      if((alarm_number==0)||(rowNum== alarm_number))  break;	      else if(RowY<23)	      {                   RowY++;                  	            SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15+8)<<16)+50));                   break;  		      }	      else		{                	     RowY = 23;      	           SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_VSCROLL, SB_LINEDOWN,0);       //大于23行,向下拉      		    SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),MSG_LBUTTONDOWN, 0,(LPARAM)(((RowY*15+8)<<16)+50));			}             break;	}		      	 case ALARM_ENTER:	 	rowNum = SendMessage(GetDlgItem (hDlg, ALARM_ALERT_LIST),LVM_GETSELECTEDITEM, 0,0);	 	AlarmOver(GetDlgItem (hDlg, ALARM_ALERT_LIST) ,rowNum); 	 break;	 	 case ALARM_CLEAR :	 	AlarmClear(GetDlgItem (hDlg, ALARM_ALERT_LIST));        break;	 	 case ALARM_DOWNLOAD :	     for(i=0;i<10;i++) 	 	AlarmHappenTest (GetDlgItem (hDlg, ALARM_ALERT_LIST));	        break;         }      }   else     {  	 switch (id){	  /*convert between eventAlert page and Report page*/		 case ALARM_MODE:	  	{		       //  ShowWindow(GetDlgItem (hDlg, ALARM_REPORT_LIST),SW_HIDE) ;		   ShowWindow(GetDlgItem (hDlg, ALARM_ALERT_LIST),SW_SHOW) ;	   SetDlgItemText(hDlg, ALARM_MODE,"  \n模式\n事件");	   SetDlgItemText(hDlg, ALARM_FIRST,  " \n\n首尾");	    SendMessage(GetDlgItem(hDlg,ALARM_ALARM), BM_SETSTATE , BST_PUSHED ,0);		 SendMessage(GetDlgItem(hDlg,ALARM_REPORT), BM_SETSTATE , 0 ,0);	 }	break;        //日期增加	 case ALARM_NEXT : 	         ForwardDate(hDlg);	 	  break;       //日期减少        case ALARM_LAST : 	         BackDate(hDlg);		  break;	 /*convert report period */	 case ALARM_REPORT:	 {	   	 	if (period == DAY)	      {		period = WEEK;		SetDlgItemText(hDlg, ALARM_FIRST,"  \n报告\n每周");		}		else if(period == WEEK)		{              period = MONTH;              SetDlgItemText(hDlg, ALARM_FIRST,"  \n报告\n每月");              sprintf(date, "%04d年%02d月",report_date.year,report_date.month);	       SetDlgItemText(hDlg, ALARM_DATE,date); 		}		else		{              period = DAY;              SetDlgItemText(hDlg, ALARM_FIRST,"  \n报告\n每日");              sprintf(date, "%02d/%02d/%04d",report_date.month,report_date.day,report_date.year);               SetDlgItemText(hDlg, ALARM_DATE,date);		 }	 	 break;         }        }	     }       if(id==  ALARM_CLOSE)        EndDialog(hDlg,0);  	if(id==  ALARM_BACK)        EndDialog(hDlg,0);    }   break;/*定时比较,先取警报登陆的通道号*/ case MSG_TIMER:   DealAlarmReport(GetDlgItem (hDlg, ALARM_ALERT_LIST),alarm_id_type); break; case MSG_DESTROY: 	 KillTimer(hDlg,_ID_TIMER_ALARM); 	printf("destroy\n"); 	break; case MSG_CLOSE: 	   	 EndDialog(hDlg,0); break;}     return DefaultDialogProc (hDlg, message, wParam, lParam);

⌨️ 快捷键说明

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