📄 historydata.cpp
字号:
nLocSum--;
continue; //跟打开文件失败同样处理
}
}
FILE *ftpA;
float nLocAnaval;
if ((ftpA=fopen(nFileName,"rb"))!=NULL)
{
time_t nTime;
long nLen=sizeof(time_t)+sizeof(float);
BOOL bInsteadFile=FALSE;
fseek(ftpA,-nLen,2);
fread(&nTime,sizeof(time_t),1,ftpA);
while((nLocSum>0)||(nCount>=nSum))
{
nCurTime=nFindTime[nSum-nLocSum];
if (InTimeRange(nTime,nCurTime,nTimeInterval))
{
fread(&nLocAnaval,sizeof(float),1,ftpA);
nTempFloat+=nLocAnaval;
nPerRangePointCount++;
if (fseek(ftpA,-(nLen*2),1))
{
bInsteadFile=TRUE;
break;
}
if (fread(&nTime,sizeof(time_t),1,ftpA)!=1) break;
}
else
{
if (nPerRangePointCount>0)
{
*(pCurAnaval+nCount)=nTempFloat/nPerRangePointCount;
*(pTime+nCount)=nFindTime[nSum-nLocSum];
nCount++;
nLocSum--;
if (nCount>=nSum) break;
}
else if (nTime<nCurTime)
{
while(nTime<nCurTime)
{
if (InTimeRange(nTime,nCurTime,nTimeInterval)) break;
nLocSum--;
if (nLocSum==0) break;
nCurTime=nFindTime[nSum-nLocSum];
}
}
else if (nTime>nCurTime)
{
while(nTime>nCurTime)
{
if (InTimeRange(nTime,nCurTime,nTimeInterval)) break;
if (fseek(ftpA,-(nLen+sizeof(time_t)),1))
{
bInsteadFile=TRUE;
break;
}
fread(&nTime,sizeof(time_t),1,ftpA);
}
if (bInsteadFile) break;
}
nPerRangePointCount=0;
nTempFloat=0;
};
}
if (bInsteadFile)
{
nLocTime=nTime;
if (nPerRangePointCount>0)
{
*(pCurAnaval+nCount)=nTempFloat/nPerRangePointCount;
*(pTime+nCount)=nFindTime[nSum-nLocSum];
nCount++;
nLocSum--;
nPerRangePointCount=0;
nTempFloat=0.0;
}
nLocSum-=(nLocTime.GetHour()*3600+nLocTime.GetMinute()*60+nLocTime.GetSecond())/nTimeInterval;
nLocSum--;
}
fclose(ftpA);
}
else //打开文件失败
{
if (nPerRangePointCount>0)
{
*(pCurAnaval+nCount)=nTempFloat/nPerRangePointCount;
*(pTime+nCount)=nFindTime[nSum-nLocSum];
nCount++;
nLocSum--;
nPerRangePointCount=0;
nTempFloat=0.0;
}
nLocTime=nFindTime[nSum-nLocSum];
nLocSum-=(nLocTime.GetHour()*3600+nLocTime.GetMinute()*60+nLocTime.GetSecond())/nTimeInterval;
nLocSum--;
}
}
return nCount;
}
short CHistoryData::GetDataOrderTime(short nNo,long nTime, float *nAnaval)
{
short nPos;
CHistData *nHistData;
time_t *nCurTime;
if (nNo>=m_nPointCount) return RESULT_ERROR;
short nHistNum;
nHistNum=m_nHistNum;
float nPreAnaval,nNextAnaval;
BOOL nPreHaved,nNextHaved;
nPreHaved=FALSE;
nNextHaved=FALSE;
short m_nTimer=3;
for(int i=0;i<nHistNum;i++)
{
short nCurPos=m_nHistPosBegin+i;
nCurPos%=MAX_MEMORY_HISTNUM;
nCurTime=m_pHistTime+nCurPos;
if (*nCurTime==nTime)
{
nHistData=m_pHistData[nNo]+nCurPos;
*nAnaval=nHistData->nCurAnaval;
break;
}
else if ((fabs(*nCurTime-nTime)<(m_nTimer/2.0))&&(*nCurTime<nTime))
{
nHistData=m_pHistData[nNo]+nCurPos;
nPreAnaval=nHistData->nCurAnaval;
nPreHaved=TRUE;
}
else if ((fabs(*nCurTime-nTime)<(m_nTimer/2.0))&&(*nCurTime>nTime))
{
nHistData=m_pHistData[nNo]+nCurPos;
nNextAnaval=nHistData->nCurAnaval;
nNextHaved=TRUE;
}
}
if (i==nHistNum)
{
if ((nPreHaved)&&(nNextHaved)) *nAnaval=(nPreAnaval+nNextAnaval)/2;
else if (nPreHaved) *nAnaval=nPreAnaval;
else if (nNextHaved) *nAnaval=nNextAnaval;
else return RESULT_ERROR;
}
return RESULT_NORMAL;
}
BOOL CHistoryData::InTimeRange(time_t nTime, time_t nCenterTime, short nRange)
{
if (nRange%2==0)
{
if (nTime>=(nCenterTime-nRange/2)&&(nTime<=(nCenterTime+nRange/2-1)))
{
return TRUE;
}
else
{
return FALSE;
}
}
else
{
if (nTime>=(nCenterTime-nRange/2)&&(nTime<=(nCenterTime+nRange/2)))
{
return TRUE;
}
else
{
return FALSE;
}
}
}
short CHistoryData::GetCurHistData(short nNo, float *nCurAnaval, long *nTime)
{
CHistData *nHistData;
time_t *nCurTime;
if (nNo>=m_nPointCount) return RESULT_ERROR;
short nHistNum;
nHistNum=m_nHistNum;
short nCurPos=(m_nHistPosBegin+nHistNum-1+MAX_MEMORY_HISTNUM)%MAX_MEMORY_HISTNUM;
nHistData=m_pHistData[nNo]+nCurPos;
nCurTime=m_pHistTime+nCurPos;
*(nCurAnaval)=nHistData->nCurAnaval;
*nTime=*nCurTime;
return RESULT_NORMAL;
}
void CHistoryData::GetName(short nNo, CString *nStr)
{
CHistProperty *pHistProperty;
if((nNo<0)||(nNo>=m_nPointCount)) return;
Code_Name_Tab *code_name_tab;
pHistProperty=m_pHistProperty+nNo;
code_name_tab=code_name_tab1+pHistProperty->nFdcsNo*(MAX_CHNUM+1)+pHistProperty->nCh;
nStr->Format("%s",code_name_tab->psName);
}
void CHistoryData::GetProjSignalUnit(short nNo, CString *nStr)
{
CHistProperty *pHistProperty;
if((nNo<0)||(nNo>=m_nPointCount)) return;
pHistProperty=m_pHistProperty+nNo;
aps=aps1+pHistProperty->nFdcsNo*(MAX_CHNUM+1)+pHistProperty->nCh;
nStr->Format("%s",aps->sysUnit);
}
void CHistoryData::DrawCurveMenu(CDC *pDC,CWnd *pWnd,CRect nRect, CButton *pButton,DWORD *pButtonID)
{
CRect nRectButton;
short nWidth=nRect.Width()/7;
short nHeight=nRect.Height();
pDC->SelectStockObject(NULL_PEN);
CBrush *brush=new CBrush(RGB(200,200,200));
CBrush *oldbrush=pDC->SelectObject(brush);
pDC->Rectangle(&nRect);
pDC->SelectObject(oldbrush);
delete brush;
if (pButton->GetSafeHwnd()!=NULL) return;
nRectButton.SetRect(nWidth,nRect.top+3,2*nWidth,nRect.bottom-3);
pButton->Create("实时曲线",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE|WS_BORDER,nRectButton,pWnd,*pButtonID);
nRectButton.SetRect(3*nWidth,nRect.top+3,4*nWidth,nRect.bottom-3);
(pButton+1)->Create("历史曲线",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE|WS_BORDER,nRectButton,pWnd,*(pButtonID+1));
nRectButton.SetRect(5*nWidth,nRect.top+3,6*nWidth,nRect.bottom-3);
(pButton+2)->Create("退出",BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE|WS_BORDER,nRectButton,pWnd,*(pButtonID+2));
}
void CHistoryData::GetAddChByCode(char *pCode,short *nAdd,short *nCh)
{
BOOL bFind=FALSE;
for(int i=0;i<(MAX_ADNUM+3);i++)
for(int j=0;j<(MAX_CHNUM+1);j++)
{
code_name_tab=code_name_tab1+i*(MAX_CHNUM+1)+j;
if(strcmp(pCode,code_name_tab->psCode)==0)
{
/*
*nAdd=code_name_tab->add;
*nCh=code_name_tab->ch;
*/
*nAdd=i;
*nCh=j;
bFind=TRUE;
break;
}
if (bFind) break;
}
}
short CHistoryData::GetCode(char *pCode, short nAdd, short nCh)
{
if ((nAdd>0)&&(nAdd<MAX_ADNUM+3)&&(nCh>0)&&(nCh<=MAX_CHNUM))
{
code_name_tab=code_name_tab1+nAdd*(MAX_CHNUM+1)+nCh;
// strcpy(pCode,"");
strcpy(pCode,code_name_tab->psCode);
return RESULT_NORMAL;
}
return RESULT_ERROR;
}
void CHistoryData::ReadFileHistData()
{
CHistData *pHistoryData;
CHistProperty *pHistProperty;
time_t *pHistTime;
time_t nBeginTime,nEndTime,nCurTime;
float nCurAnaval;
short nCurDay;
CString nFileName;
CTime nTime;
char nCode[16];
// m_nFileCritSect.Lock();
nTime=CTime::GetCurrentTime();
nBeginTime=nTime.GetTime()-30*60;
nEndTime =nTime.GetTime();
BOOL bFirstGet=TRUE;
for(int i=0;i<m_nPointCount;i++)
{
pHistProperty=m_pHistProperty+i;
short nCurPos=0;
//******* Get Point code begin***********
if (GetCode(nCode,pHistProperty->nFdcsNo,pHistProperty->nCh)==RESULT_ERROR)continue;
//********Get point code end*********
nFileName.Format(".\\History\\%4s\\D%02d.his",nCode,nTime.GetDay());
CFile nFile;
CFileStatus nStatus;
if (nFile.GetStatus(nFileName,nStatus))
{
if(nStatus.m_mtime.GetMonth()!= nTime.GetMonth())
{
continue;
}
}
FILE *ftpA;
if ((ftpA=fopen(nFileName,"rb"))==NULL) continue;
//while
fseek(ftpA,-8,2);
BOOL bFind=FALSE,bFirstRead=TRUE;
while (1)
{
if (fread(&nCurTime,sizeof(time_t),1,ftpA)!=1)break;
if (nCurTime>nBeginTime)
{
if (fseek(ftpA,-12,1))
{
fseek(ftpA,0,0);
bFind=TRUE;
break;
}
}
else if(nCurTime==nBeginTime)
{
bFind=TRUE;
fseek(ftpA,-4,1);
break;
}
else
{
if (bFirstRead) break;
fseek(ftpA,4,1);
bFind=TRUE;
break;
}
bFirstRead=FALSE;
}
if (!bFind)
{
fclose(ftpA);
continue;
}
while(1)
{
if (fread(&nCurTime,sizeof(time_t),1,ftpA)!=1)break;
if ((nCurTime>=nBeginTime)&&(nCurTime<=nEndTime))
{
pHistoryData=m_pHistData[i]+nCurPos;
if(bFirstGet)
{
pHistTime=m_pHistTime+nCurPos;
*pHistTime=nCurTime;
}
fread(&nCurAnaval,sizeof(float),1,ftpA);
pHistoryData->nCurAnaval=nCurAnaval;
nCurPos++;
if (nCurPos>=(MAX_MEMORY_HISTNUM-2)) break;
}
else
{
break;
}
}
fclose(ftpA);
if (bFirstGet)
{
m_nHistNum=nCurPos;
m_nHistCurPos=nCurPos;
m_nHistSavePos=nCurPos;
bFirstGet=FALSE;
}
}
}
void CHistoryData::CreateHistoryPath()
{
CHistProperty *pHistProperty;
char nCurrentPath[128],nSubPath[128];
::GetCurrentDirectory(127,nCurrentPath);
strcat(nCurrentPath,"\\alarm");
CreateFilePath(nCurrentPath);
::GetCurrentDirectory(127,nCurrentPath);
strcat(nCurrentPath,"\\history");
CreateFilePath(nCurrentPath);
char nCode[8];
for(int i=0;i<m_nPointCount;i++)
{
pHistProperty=m_pHistProperty+i;
short nCurPos=0;
//******* Get Point code begin***********
if (GetCode(nCode,pHistProperty->nFdcsNo,pHistProperty->nCh)==RESULT_ERROR)continue;
sprintf(nSubPath,"%s\\%s",nCurrentPath,nCode);
if (CreateFilePath(nSubPath)==RESULT_ERROR) continue; //this file no esit;
//********Get point code end*********
}
}
int CHistoryData::CreateFilePath(char *nFile)
{
WIN32_FIND_DATA nFindData;
HANDLE hFindFile;
if ((hFindFile=::FindFirstFile(nFile,&nFindData))!=INVALID_HANDLE_VALUE)
{
::FindNextFile(hFindFile,&nFindData);
::FindClose(hFindFile);
return RESULT_NORMAL;
}
else
{
SECURITY_ATTRIBUTES nSecurityAttributes;
char nTempPath[64];
short nError=::CreateDirectory(nFile,NULL);
// short nError=::CreateSubdirectory(nFile,&nSecurityAttributes);
// nError=GetLastError();
//::CreateDirectoryEx(nTempPath,nFile,&nSecurityAttributes);
CFile nFile;
return RESULT_ERROR;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -