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 + -
显示快捷键?