LRESULT CMainDlg::OnMsgSensor(WPARAM wParam, LPARAM lParam)
{
SENSOR_MESSAGE_CONTEXT *pSensorContext;
DB_EVENT DB;
CString str;
int32 nEventID;
uint8 nAlgID;
uint32 nVideoNum;
int32 temp=0;
char RecordFileName[255]; memset(&DB,0,sizeof(DB_EVENT));
pSensorContext=(SENSOR_MESSAGE_CONTEXT *)lParam;
switch(wParam)
{
case SENSOR_MESSAGE_TYPE_COMMDOWN:
DB.nCID=pSensorContext->nCID;
DB.nType=0x01;//设备故障
while(!temp)
do{str.Format(L"%d号设备发生通信故障",pSensorContext->nCID);
temp++;}
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)str,-1,DB.cInfo,255,NULL,NULL);
nEventID=NewEvent(&DB);
if(nEventID<0)
return -1; theApp.m_pMainWnd->PostMessage(DSOF_MESSAGE_STATUS,MESSAGE_STATUS_DEVERR,pSensorContext->nCID);
break;
case SENSOR_MESSAGE_TYPE_DEVICEALARM:
//添加事件到数据库并在列表中显示
DB.nCID=pSensorContext->nCID;
DB.nType=0x01;//设备故障
while(!temp)
do{
str.Format(L"%d号设备发生故障:%s;功率(%.3fmW),电流(%.3fmA),温度(%.3f℃),制冷电流(%.3fmA)",pSensorContext->nCID,GetSensorStateString(pSensorContext->nAlarmType),(float)(pSensorContext->LaserData.laserpower)/1000,(float)(pSensorContext->LaserData.laserbias)/1000,(float)(pSensorContext->LaserData.lasertemp)/1000,(float)(pSensorContext->LaserData.laseritec)/1000);
temp++;}
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)str,-1,DB.cInfo,255,NULL,NULL);
nEventID=NewEvent(&DB);
if(nEventID<0)
return -1; theApp.m_pMainWnd->PostMessage(DSOF_MESSAGE_STATUS,MESSAGE_STATUS_DEVERR,pSensorContext->nCID);
break;
case SENSOR_MESSAGE_TYPE_CHANNELALARM:
m_nVideoAlarmCnt=0;
//如果防区禁用,忽略这次告警
if(gpZoneArray[pSensorContext->nZoneNum]->GetRunState()==ZONE_STATE_STOP)
{
PDEBUG("因防区禁用,传感器通道告警被阻止\n");
break;
}
PDEBUG("传感器通道告警\n"); //添加事件到数据库并在列表中显示
DB.nZoneID=pSensorContext->nZoneNum;
DB.nCID=pSensorContext->nCID;
if(pSensorContext->nRecvType!=0x0 && pSensorContext->nAlarmType==0x0)
{
DB.nType=0x01;//某通道接收状态异常,属于设备故障
while(!temp)
do{
str.Format(L"%d号设备-%d号通道:%s;接收光功率(%.3fmW)",pSensorContext->nCID,pSensorContext->nChNum,GetSensorChStateString(pSensorContext->nRecvType),(float)(pSensorContext->nRecvPower)/1000);
temp++;}
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)str,-1,DB.cInfo,255,NULL,NULL);

theApp.m_pMainWnd->PostMessage(DSOF_MESSAGE_STATUS,MESSAGE_STATUS_DEVERR,pSensorContext->nCID);
}
else if(pSensorContext->nRecvType==0x0 && pSensorContext->nAlarmType!=0x0)
{
//某通道入侵告警
if(pSensorContext->nAlarmType==0x01)
{
//一般入侵
DB.nType=0x02;
}
else if(pSensorContext->nAlarmType==0x02)
{
//入侵告警
DB.nType=0x03;
}
while(!temp)
do{
str.Format(L"%d号防区(%d号设备-%d号通道)发生入侵告警",pSensorContext->nZoneNum,pSensorContext->nCID,pSensorContext->nChNum);
temp++;}
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)str,-1,DB.cInfo,255,NULL,NULL); theApp.m_pMainWnd->PostMessage(DSOF_MESSAGE_STATUS,MESSAGE_STATUS_ALARM,pSensorContext->nZoneNum); //如果是定时告警则启动告警定时器
if(gnAlarmTime>0)
SetTimer(TIMER_ALARM_BASE+pSensorContext->nZoneNum,1000,NULL); //更新防区数据库
gpZoneArray[pSensorContext->nZoneNum]->UpdateTableState(DB.nType);
//更新防区地图
UpdateZoneInMap(pSensorContext->nZoneNum,DB.nType); }
else if(pSensorContext->nRecvType!=0x0 && pSensorContext->nAlarmType!=0x0)
{
//某通道既入侵告警,又接收状态异常,以入侵告警为主,属于入侵告警
if(pSensorContext->nAlarmType==0x01)
{
//一般入侵
DB.nType=0x02;
}
else if(pSensorContext->nAlarmType==0x02)
{
//入侵告警
DB.nType=0x03;
}
while(!temp)
do{
str.Format(L"%d号防区(%d号设备-%d号通道)发生入侵告警;另外该通道:%s;接收光功率(%.3fmW)",pSensorContext->nZoneNum,pSensorContext->nCID,pSensorContext->nChNum,GetSensorChStateString(pSensorContext->nRecvType),(float)(pSensorContext->nRecvPower)/1000);
temp++;}
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)str,-1,DB.cInfo,255,NULL,NULL);

theApp.m_pMainWnd->PostMessage(DSOF_MESSAGE_STATUS,MESSAGE_STATUS_ALARM,pSensorContext->nZoneNum); //如果是定时告警则启动告警定时器
if(gnAlarmTime>0)
SetTimer(TIMER_ALARM_BASE+pSensorContext->nZoneNum,1000,NULL); //更新防区数据库
gpZoneArray[pSensorContext->nZoneNum]->UpdateTableState(DB.nType);
//更新防区地图
UpdateZoneInMap(pSensorContext->nZoneNum,DB.nType);
}
nEventID=NewEvent(&DB);
if(nEventID<0)
return -1; if(pSensorContext->nAlarmType!=0x0)
{
//如果是入侵事件,添加事件特征值到数据库
nAlgID=gpZoneArray[pSensorContext->nZoneNum]->GetAlgID();
if(nAlgID<0)
return -1;
pSensorContext->Attr.eventid=nEventID;
if(gpAlgArray[nAlgID]->NewAttr(&pSensorContext->Attr)<0)
return -1; if(pSensorContext->nAlarmType==0x02)
{
PDEBUG("搜集告警视频通道信息\n");
//如果是入侵告警事件,需要播放视频并开始保存视频文件
int32 nRet;
nRet=gpZoneArray[pSensorContext->nZoneNum]->GetVideoNum();
if(nRet>=0)
{
nVideoNum=nRet;
//保存需要告警的视频通道号
m_VideoAlarm[m_nVideoAlarmCnt]=nVideoNum;
m_nVideoAlarmCnt++;

//开始录制,启动录制定时器
while(!temp)
do{
str.Format(L"%s\\Record%d.sxr",gstrRecordPath,nEventID);
temp++;}
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)str,-1,RecordFileName,255,NULL,NULL);
gpVideoArray[nVideoNum]->StartFileCapture(RecordFileName);
SetTimer(nVideoNum,1000,NULL);
}
}
}
PDEBUG("播放视频\n");
//通知线程播放视频
PostThreadMessage(m_VideoThreadID, MAIN_MESSAGE_REQUEST_START, 0, 0); break;
case SENSOR_MESSAGE_TYPE_LASERPARAM:
break;
default:
break;
} return 0;
}
从这个类看来,最后出现在界面上的显示的提示是由哪句语言控制的啊
现在的问题是,比如告警说:“"1号设备发生通信故障”
就一直不断的显示
怎么样才能让它只显示一次呢?
注:str.format前的do while 语句是我自己加的,没有效果