?? evtdb.cpp
字號:
// evtdb.cpp version 3.0: implementation of the evtdb class.
//
// evtdb 1.0 cjh
// evtdb 3.0 jyy 2003 北海銀河高科技產業股份有限公司
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RealEv.h"
#include "evtdb.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
evtdb::evtdb()
{
// memset(evt,0,sizeof(scada_event)*MAXEVT);
memset(&m_oldEvt,0,sizeof(scada_event));
nEvt=0;
cursor=-1;
curchange=0;
m_nEvtTypeCounts = 0;
m_iCurEvtDisType = 0xffff;//全部
m_bdbInitialed = false;
m_printf=false;
warntimes=true;
warntime=1;
handle=NULL;
fisf=false;
Is_ChgF=false;
m_bInVoice = false;
char* yhpath = getenv("yhpath");
CFileStatus status;
if((yhpath!=NULL)&&(CFile::GetStatus(yhpath,status)))
{
strcpy(m_strSoundpath,yhpath);
strcat(m_strSoundpath,"\\sound\\");
}
else
strcpy(m_strSoundpath,"c:\\yh-5000\\sound\\");
m_pNode1=NULL;
m_pEvt1=NULL;
m_pEvtType1=NULL;
m_ptmp1=NULL;
m_pNode=NULL;
m_pEvt=NULL;
m_ptmp=NULL;
m_pEvtType=NULL;
m_EvtOpt=NULL;
}
evtdb::~evtdb()
{
}
//讀入所有的事件記錄
void evtdb::ReadAllEvt()
{
int i = 0,num = 0;
m_pEvt=(scada_event*)GetAllEvent(num); //返回記錄
if(num==0) return;
memcpy(evt,m_pEvt,sizeof(scada_event)*num);
nEvt = num;
}
//到上一條事件記錄
void evtdb::GotoLastEvent()
{
cursor=cursor>0 ? cursor-1:cursor;
curchange=1;
}
//到下一條事件記錄
void evtdb::GotoNextEvent()
{
cursor=cursor<nEvt-1 ? cursor+1:nEvt-1;
curchange=1;
}
//返回當前顯示串
void evtdb::GetCurStr(char *str)
{
if(cursor<0||nEvt==0){
sprintf(str,"沒有事件消息");
return;
}
strcpy(str,evt_tmp[cursor].Describe);
}
//是否已確認
bool evtdb::Ack()
{
WORD at;
if(cursor<0||nEvt==0) return true;
at=evt_tmp[cursor].AffirmF;
if(at==0) return false;
else return true;
}
//返回日期時間串
void evtdb::GetDTMStr(CTime &tm,WORD MilliSec, char *dstr,bool f)
{
CTime time=CTime::GetCurrentTime();
if(tm<0)
memcpy(&tm,&time,sizeof(CTime));
int year =tm.GetYear();
int month = tm.GetMonth();
int day = tm.GetDay();
int hour = tm.GetHour();
int minute = tm.GetMinute();
int second = tm.GetSecond();
if(f)
sprintf(dstr,"%4d-%02d-%02d %02d:%02d:%02d-%03d",year,month,day,hour,minute,second,MilliSec);
else
sprintf(dstr,"%4d-%02d-%02d %02d:%02d:%02d",year,month,day,hour,minute,second);
// AfxMessageBox(dstr);
}
//選擇一個新的提示事件
void evtdb::SelectNewEvt()
{
int i;
if(nEvt<=0) return;
cursor=nEvt-1;
for(i=nEvt-1;i>50;i--){
if((evt_tmp[i].AffirmF==0)/*&&(evt[i].prcF == 1)*/){
cursor=i;
break;
}
}
}
//返回當前事件的類型
int evtdb::GetType()
{
if(nEvt<=0||cursor<0) return 0;
//return evt[cursor].TypeID+1;//?+1
return evt_tmp[cursor].TypeID;
}
int evtdb::GetAck()
{
if(nEvt<=0||cursor<0) return 1;
return evt_tmp[cursor].AffirmF;
}
//確認一個消息
bool evtdb::AckEvent()
{
LSI_GetTableID("scada","event",m_Evtid);//COMMON_Node
if ((m_pEvt1=(MEMTABLE*)LSI_GetTableAdd(m_Evtid&0xffff))==NULL)
{
return false;
}
m_pEvt=(scada_event*)m_pEvt1->data;
if(!m_ptmp) return false;
if(cursor<0) return false;
m_ptmp[cursor].AffirmF = 1;
evt_tmp[cursor].AffirmF = 1;
LSI_SetChanged(m_tmpid,cursor);
return true;
}
//返回級別
/*int evtdb::Level()
{
if(nEvt<=0||cursor<0) return 0;
return evt[cursor].level;
}
*/
bool evtdb::InitDbApi(char *user, char *pw)
{
if(LSI_InitNTDbi())
{
if(LSI_CheckUser(user,pw))
{
m_bdbInitialed = true;
}
else
{
MessageBox(0,"非法的用戶或口令!","錯誤",MB_OK|MB_ICONERROR);
return false;
}
}
/*else
{
MessageBox(0,"平臺未啟動!","錯誤",MB_OK|MB_ICONERROR);
return false;
}*/
int i = 0,num = 0;
m_nEvtTypeCounts = 0;
m_pEvtType = (scada_eventType*)GetAllEventType(num);
m_nEvtTypeCounts = num;
if(num >MAXEVTTYPE)AfxMessageBox("告警程序告警類型內存溢出,>150條,請整理告警類型庫");
memcpy(evttype,m_pEvtType,num*sizeof(scada_eventType));
SetOpen();
DWORD id=0;
LSI_GetTableID("scada","EvtOpt",id);//scada_analog
if(m_pEvtOpt=(MEMTABLE*)LSI_GetTableAdd(id&0xffff))
m_EvtOpt=(scada_EvtOpt*)m_pEvtOpt->data;
if(m_pEvtOpt->userec<1)
{
scada_EvtOpt obj;
for(i=0;i<m_pEvtOpt->recmax;i++) LSI_AppendRec("scada.EvtOpt", &obj);
}
return true;
}
void* evtdb::GetAllEventType(int &num)
{
int recn,error;
char *lp = NULL;
num=0;
void*buf=LSI_QueryRecord("TABLE(scada.eventType)",recn,error,false);
if(error<0) return NULL;
if(buf==NULL) num=0;
else
{
num=recn;
lp=(char*)buf;
lp=lp+recn*2;
}
return lp;
}
void * evtdb::GetAllEvent(int &num)
{
//得到事件類型庫類型數量
int recn,error;
char *lp = NULL;
num=0;
void*buf=LSI_QueryRecord("TABLE(scada.event)",recn,error,false);
if(error<0) return NULL;
if(buf==NULL) num=0;
else
{
num=recn;
lp=(char*)buf;
lp=lp+recn*2;
}
return lp;
}
bool evtdb::EvtCmp(scada_event *evt1, scada_event *evt2)
{
if(evt1->Time==evt2->Time)
{
if(evt1->MilliSec==evt2->MilliSec)
{
if(evt1->TypeID==evt2->TypeID)
{
if(evt1->SubtypeID==evt2->SubtypeID)
{
if(evt1->RTUNo==evt2->RTUNo)
{
if(evt1->Value==evt2->Value)
{
if(strcmp(evt1->Describe,evt2->Describe)==0)
{
return true;
}
}
}
}
}
}
}
return false;
}
//確認是否有新的事件產生
bool evtdb::IsRecChanged()
{
for(int i=nEvt-1;i>=0;i--)
{
if(IsNeedShow(evt_tmp[i].TypeID,evt_tmp[i].SubtypeID))
{
if(EvtCmp(&m_oldEvt,&evt_tmp[i]))
return FALSE;
memcpy(&m_oldEvt,&evt_tmp[i],sizeof(scada_event));
return TRUE;
}
}
return false;
/*if(EvtCmp(&m_oldEvt,&evt[nEvt-1])) return FALSE;
else if(IsNeedShow(evt[nEvt-1].TypeID,evt[nEvt-1].SubtypeID))
{
memcpy(&m_oldEvt,&evt[nEvt-1],sizeof(scada_event));
return TRUE;
}
else return false;*/
}
//當前顯示的事件類型是否有變化
char evtdb::IsDisRecChanged()
{
int i = 0;
if(nEvt<=0) return 0;
if(IsRecChanged())
{
if(m_iCurEvtDisType == 0xffff) return 1;
else
{
for(i = nEvt -1;i>50;i--)
{
if(evt_tmp[i].TypeID == (BYTE)m_iCurEvtDisType)
{
if(EvtCmp(&m_olddisEvt,&evt_tmp[i])) return 1;
else
{
memcpy(&m_olddisEvt,&evt_tmp[i],sizeof(scada_event));
return 2;
}
}
}
return 0;
}
}
else return 0;
}
//取安全天數
bool evtdb::GetSafeDays(int& safedays)
{
return true;
char *lp = NULL;
int recn,error;
void *buf=LSI_QueryRecord("TABLE(scada.progReg),WHERE(Name=SYSDAY))",recn,error,false);
if(error<0) return false;
if(buf==NULL) return false;
lp=(char*)buf;
lp=lp+recn*2;
safedays = (int)(((scada_progReg*)lp)->IntVal);
}
void evtdb::SetEventType()
{
for(int i=0;i<m_nEvtTypeCounts;i++)
{
if(memcmp((char*)&evttype[i].Color+4,(char*)&m_pEvtType[i].Color+4,1)!=0)
{
memcpy((char*)&m_pEvtType[i].Color+4,(char*)&evttype[i].Color+4,1);
LSI_SetChanged(m_EvtTid,i);
}
}
}
//取事件類型
bool evtdb::GetEventType(CString *pNames, WORD *pType,COLORREF *pColor)
{
BYTE TypeID= 0,SubTypeID = 0;
WORD type;
if(pNames == 0)return false;
if(pType == NULL)return false;
for(int i = 0;i< m_nEvtTypeCounts;i++)
{
pNames->Format("%s",m_pEvtType[i].Describe);
TypeID = m_pEvtType[i].TypeID;
SubTypeID = m_pEvtType[i].SubtypeID;
type = MAKEWORD(SubTypeID,TypeID);
(WORD)*pType = type;
pColor[i] = m_pEvtType[i].Color;
pNames++;
pType++;
}
memcpy(evttype,m_pEvtType,m_nEvtTypeCounts*sizeof(scada_eventType));
return true;
}
//設置當前顯示類型
void evtdb::SetCurDisType(WORD iType)
{
m_iCurEvtDisType = (WORD)iType;
}
void evtdb::SetCurDisType(char* warndes)
{
BYTE TypeID = 0,SubtypeID = 0;
for(int i = 0;i< m_nEvtTypeCounts;i++)
{
if(0 == strcmp(warndes,m_pEvtType[i].Describe))
{
m_iCurEvtDisType = MAKEWORD(SubtypeID,TypeID);
break;
}
}
}
//取告警種類的顏色
COLORREF evtdb::GetWarnColor(BYTE TypeID, BYTE SubtypeID)
{
if((TypeID<0)||(TypeID>=M_EVTT)) return COLORREF(RGB(255,255,255));
if((SubtypeID<0)||(SubtypeID>=M_EVTTS)) return COLORREF(RGB(255,255,255));
char ind=IndEvtT[TypeID][SubtypeID];
if((ind<0)||(ind>=M_EVT)) return COLORREF(RGB(255,255,255));
return m_pEvtType[ind].Color;
}
COLORREF evtdb::GetWarnColor(char* warndes)
{
for(int i = 0;i< m_nEvtTypeCounts;i++)
{
if(0 == strcmp(warndes,m_pEvtType[i].Describe))
{
return m_pEvtType[i].Color;
}
}
return COLORREF(RGB(255,255,255));
}
//實時打印
void evtdb::PrintWarn()
{
int i = 0;
char dt[64];
char desi[128];
if(nEvt<=0)return ;
memset(&dt,0,64);
memset(&desi,0,128);
CString szWarn;
char printer[20];//="\\\\.\\LPT1";
memset(&printer,0,20);
memcpy(&printer,"\\\\.\\LPT1",20);
DWORD wlen;
if(!m_bPrint)//m_printf
{
for(i = 0;i < nEvt;i++)
{
if(evt_tmp[i].IfPrint==1)
continue;
AckPrint(i);
}
Sleep(100);
return;
}
for(i = 0;i < nEvt;i++) //2003/7/7改動
{
//cursor = i;
if(evt_tmp[i].IfPrint == 0)
{
if(!IsNeedPrint(evt_tmp[i].TypeID,evt_tmp[i].SubtypeID))
{
AckPrint(i);
//Sleep(10);
continue;
}
handle = CreateFile(printer, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, NULL , NULL);
if(handle==INVALID_HANDLE_VALUE)
{
return;
}
if(!fisf)
{
fisf=true;
headLine();
Sleep(10);
NewLine();
Sleep(10);
NewLine();
Sleep(10);
}
GetDTMStr(evt_tmp[i].Time,evt_tmp[i].MilliSec,dt);
szWarn = dt;
szWarn += " ";
szWarn+=evt_tmp[i].Describe;
memcpy(desi,szWarn,szWarn.GetLength());
WriteFile(handle,desi,szWarn.GetLength(),&wlen,NULL);
Sleep(100);
NewLine();
Sleep(100);
CloseHandle(handle);
AckPrint(i);
Sleep(100);
}
}
Sleep(100);
// CloseHandle(handle);
}
//判斷是否需要打印
bool evtdb::IsNeedPrint(BYTE TypeID, BYTE SubtypeID)
{
if((TypeID<0)||(TypeID>=M_EVTT)) return 0;
if((SubtypeID<0)||(SubtypeID>=M_EVTTS)) return 0;
char ind=IndEvtT[TypeID][SubtypeID];
if((ind<0)||(ind>=M_EVT)) return 0;
if(1 == m_pEvtType[ind].IfPrint)
return true;
else return false;
}
void evtdb::NewLine()
{
DWORD nWrite;
BOOL result=FALSE;
BYTE close[2];
close[0]=0x0a;
close[1]=0x0d;
result = WriteFile( handle,close,2,&nWrite,NULL);
}
void evtdb::headLine()
{
DWORD nWrite;
BOOL result=FALSE;
char dtt1[64];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -