📄 record.cpp
字号:
nLastYear=m_clsTime.GetDayCount()+365-m_clsLane.BackupTime();
}
} else {
nLastYear=m_clsTime.GetYear();
nLastDayCount=m_clsTime.GetDayCount()-m_clsLane.BackupTime();
}
nLastYear=nLastYear%100;
char strFileName[PICTURE_NAME_LEN];
memset(strFileName,0,PICTURE_NAME_LEN);
if(m_clsLane.RAM_Disk()){
sprintf(strFileName,"%s\\%.2d%.3d",TEMP_PATH,nLastYear,nLastDayCount);
} else {
sprintf(strFileName,"%s\\%.2d%.3d",INFO_PATH,nLastYear,nLastDayCount);
}
remove(strFileName); //删除规定日期前的索引文件
memset(strFileName,0,PICTURE_NAME_LEN);
sprintf(strFileName,"%s\\%.2d%.2d%.3d.?",INFO_PATH,
m_clsLane.LaneNO(),nLastYear,nLastDayCount);
DeleteOldFile(INFO_PATH,strFileName);//删除规定日期前的信息文件
memset(strFileName,0,PICTURE_NAME_LEN);
sprintf(strFileName,"%s\\Log%.2d%.3d.txt",LOG_PATH,nLastYear,nLastDayCount);
remove(strFileName); //删除规定日期前的运行日志文件
memset(strFileName,0,PICTURE_NAME_LEN);
sprintf(strFileName,"%s\\%.2d%.2d%.3d????????????",PICTURE_PATH,
m_clsLane.LaneNO(),nLastYear,nLastDayCount);
DeleteOldFile(PICTURE_PATH,strFileName);//删除规定日期前的图片文件
// 每天零点重新初始化视频捕获卡。特别地:实际上该功能不应放到本类中
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CAPTURE_WINDOW,RESET_CAPTURE,0);
} else {
nRecordYear=m_clsTime.GetYear();
nRecordMonth=m_clsTime.GetMonth();
nRecordDay=m_clsTime.GetDay();
nRecordDayCount=m_clsTime.GetDayCount();
nRecordHour=m_clsTime.GetHour()-1;
// 特别地:小时消息的生成时间总为整点
nRecordSecond=0;
nRecordMinute=0;
RecordMH();
CStatInfo m_clsStat;
m_clsStat.ClearMh();
}
nHasRecordHour=m_clsTime.GetHour();
nHasRecordDate=nNowDate;
}
}
// 返回消息当前的流水号:首先从文件中读取当前序号,所读取序号++后
// 再写回文件中。
// 特别地:获取索引文件时不能使用当前时间,否则再跨天生成MH消息时
// 消息序号会出错
UINT CRecord::MesgHeadIndex(UINT nType,int nYear,int nDayCount)
{
char strFileName[35];
memset(strFileName,0,35);
CLaneInfo m_clsLane;
if(m_clsLane.RAM_Disk()){
sprintf(strFileName,"%s\\%.2d%.3d",TEMP_PATH,nYear,nDayCount);
} else {
sprintf(strFileName,"%s\\%.2d%.3d",INFO_PATH,nYear,nDayCount);
}
// 首先从索引文件中读取当前索引号,将该号码加1后重新写回到文件中并
// 返回加1后的序号。若索引文件不存在,则认为当前序号为1
FILE *fp1;
UINT nMesgHeadIndex[MESSAGE_COUNT];
if((fp1=fopen(strFileName,"rb"))!=NULL){
if(fread(&nMesgHeadIndex,sizeof(UINT),MESSAGE_COUNT,fp1)!=MESSAGE_COUNT){
memset(&nMesgHeadIndex,0,sizeof(UINT)*MESSAGE_COUNT);
}
fclose(fp1);
} else {
memset(&nMesgHeadIndex,0,sizeof(UINT)*MESSAGE_COUNT);
}
nMesgHeadIndex[nType]++;
// 将新序号改写回序号文件
if((fp1=fopen(strFileName,"wb"))!=NULL){
fwrite(&nMesgHeadIndex,sizeof(UINT),MESSAGE_COUNT,fp1);
fclose(fp1);
}
return nMesgHeadIndex[nType];
}
// 删除40天前的旧文件
void CRecord::DeleteOldFile(char *pPath, char *pFileName)
{
struct _finddata_t FileInfo;
long hFile;
if((hFile=_findfirst(pFileName,&FileInfo))!=-1L){
char tmpStr[PICTURE_NAME_LEN];
memset(tmpStr,0,PICTURE_NAME_LEN);
sprintf(tmpStr,"%s\\%s",pPath,FileInfo.name);
remove(tmpStr);
while(_findnext(hFile,&FileInfo)==0){
memset(tmpStr,0,PICTURE_NAME_LEN);
sprintf(tmpStr,"%s\\%s",pPath,FileInfo.name);
remove(tmpStr);
}
_findclose(hFile);
}
}
//返回将要存储的JPEG文件的名称
void CRecord::GetPictureName(char *pRetStr)
{
// 设置抓拍消息内容
// 特别地:图像抓拍消息中无消息头
CLaneInfo m_clsLane;
CTimeInfo m_clsTime;
CStatInfo m_clsStat;
CTransInfo m_clsTrans;
sprintf(pRetStr+P_TRANS_INDEX,"%.5u%", //图像消息流水号
MesgHeadIndex(MESSAGE_PICTURE,m_clsTime.GetYear()%100,m_clsTime.GetDayCount()));
sprintf(pRetStr+P_PLAZA_NO,"%.2d",m_clsLane.PlazaNO());
sprintf(pRetStr+P_DATE,"%.2d%.2d%.2d%",m_clsTime.GetYear()%100,
m_clsTime.GetMonth(),m_clsTime.GetDay());
sprintf(pRetStr+P_TIME,"%.2d%.2d%.2d",m_clsTime.GetHour(),
m_clsTime.GetMinute(),m_clsTime.GetSecond());
sprintf(pRetStr+P_SHIFT_NO,"%c",m_clsStat.ShiftNO());
sprintf(pRetStr+P_LANE_NO,"%.2d",m_clsLane.LaneNO());
sprintf(pRetStr+P_COLLECT_NO,"%.5u",m_clsStat.CollectNO());
sprintf(pRetStr+P_BUS_TYPE,"%c",m_clsTrans.BusType());
sprintf(pRetStr+P_BUS_CLASS,"%c",m_clsTrans.BusClass());
pRetStr[P_VIOLATE]=m_clsTrans.ViolateType();
pRetStr[P_MODIFY]=m_clsTrans.ModifyType();
// 设置车牌:不足十位则在前面加空格;
char tmpStr[12];
memset(tmpStr,0,12);
m_clsTrans.GetBusNO(tmpStr);
memset(pRetStr+P_BUS_NO,' ',10);
memmove(pRetStr+P_BUS_NO+10-strlen(tmpStr),tmpStr,strlen(tmpStr));
// 设置价格:价格在叠加字符时需要,但上传文件时并不需要
sprintf(pRetStr+P_FARE,"%.4d",m_clsTrans.Fare());
}
// 记录图象抓拍消息
// 特别地:生成图像文件时的所需的信息内容多于实际需要消息,因此
// 此处应将多于的信息(比如:价格)删除
void CRecord::RecordP(char *pIndexFile,char *pDataFile,char *pStr)
{
try{
// 实际上:图像压缩时已经扣除了多余的信息,因此不处无须再修改文件名
// 用新的文件名代替旧的文件名
// char tmpFileName[PICTURE_NAME_LEN];
// memset(tmpFileName,0,PICTURE_NAME_LEN);
// memmove(tmpFileName,pStr,strlen(pStr));
// 扣除价格等不再需要的信息
// int nLen=strlen(PICTURE_PATH)-4; //价格信息占用4个字节
// rename(pStr,tmpFileName);
FILE *fp1;
if((fp1=fopen(pDataFile,"a"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"追加IMG_TRANS文件失败\n");
return;
}
fputs(pStr,fp1);
fputc('\n',fp1);
unsigned long nLength=ftell(fp1);
fclose(fp1);
AdjustFilePointer(pIndexFile,nLength);
}
catch(...){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CRecord::RecordP()出现异常\n");
}
}
// 寻找符合重传条件的文件名
void CRecord::CheckFileRange(unsigned long StartTime,unsigned long EndTime, char *FileName)
{
char tmpStr[PICTURE_NAME_LEN];
memset(tmpStr,0,PICTURE_NAME_LEN);
memmove(tmpStr,FileName+5,3);
int FileDayCount=atoi(tmpStr); //文件名的天数
memset(tmpStr,0,PICTURE_NAME_LEN);
memmove(tmpStr,FileName+8,2);
int FileHour=atoi(tmpStr); //文件名的小时数
memset(tmpStr,0,PICTURE_NAME_LEN);
memmove(tmpStr,FileName+10,2);
int FileMinute=atoi(tmpStr); //文件名的分钟数
memset(tmpStr,0,PICTURE_NAME_LEN);
memmove(tmpStr,FileName+12,2);
int FileSecond=atoi(tmpStr); //文件名的秒数
unsigned long FileTime=FileDayCount*24*60*60L
+FileHour*60*60L+FileMinute*60L+FileSecond;
if((FileTime>=StartTime)&&(FileTime<=EndTime)){
memset(tmpStr,0,PICTURE_NAME_LEN);
sprintf(tmpStr,"%s\\%s",PICTURE_PATH,FileName);
CLaneInfo m_clsLane;
if(m_clsLane.RAM_Disk()){
RecordP(PRIORITY_INDEX,PRIORITY_TRANS,tmpStr);
} else {
RecordP(PRI_INDEX_1,PRI_TRANS_1,tmpStr);
}
}
}
// 在规定时间前1个小时内出现大班变化或在规定时间到达时统计日期
// 改变。比如:规定时间为每天8:30,若7:30 ~ 8:30之间有大班变化,
// 则以变化时刻为限,该时间之前的统计日期为上一天,该时间之后的
// 统计日期为当天;若7:30 ~ 8:30之间无大班变化,在8:30时自动交
// 班信息、MH消息及MJ消息,同时将消息索引及交易流水号清零
// 若切换时间非整点,该小时会产生2条MH消息,收费站软件负责合并
// 这两条MH消息
// 所谓的大班变化是指当前收费员输入的班次和上一班的班次不同,若
// 连续两班班次相同,则认为是同一个大班内的小班,收费站软件负责
// 将多个小班合并为一个大班
void CRecord::CheckStatTime()
{
// 首先获取当前时间,若当前时间大于规定的交班时间,统计日期为当
// 前日期,当前日期标志bNowDayFlag置位,切换标志bChangeFlag复位
CLaneInfo m_clsLane;
//UINT nChangeStatTime=m_clsLane.ChangeStatTime();
CTimeInfo m_clsTime;
UINT nNowTime=m_clsTime.GetHour()*100+m_clsTime.GetMinute();
/*
if(nChangeStatTime<nNowTime){
bNowDayFlag=TRUE;
bChangeFlag=FALSE;
return;
}
*/
// 若位于切换时间且已经切换统计日期,直接返回,此语句的作用是防
// 止车道软件在切换时刻每秒生成一条MH信息
// if((nChangeStatTime==nNowTime)&&(bNowDayFlag)) return;
// 若当前时间小于规定时间前一小时,统计日期为上一天的日期
// 特别地:如果规定时间在零点,其前一小时应为23点
UINT nLastTime=0;
//if(nChangeStatTime<=100){ //规定时间在1点以前
// nLastTime=2300+nChangeStatTime%100; //上一小时为23点
// } else {
// nLastTime=nChangeStatTime-100; //扣除一小时
//}
bNowDayFlag=FALSE;
if(nNowTime<nLastTime){
bChangeFlag=FALSE;
return;
}
bChangeFlag=TRUE;
}
// 返回统计日期所对应的天数:车道软件存储备份消息和获取消息索引
// 时使用每年的天数,而统计日期使用每月的天数,本函数负责将统计
// 日期转换为对应的天数
UINT CRecord::StatDayCount()
{
// 若统计日期等于当前日期,返回当前的天数;否则,返回昨天的天数
CTimeInfo m_clsTime;
// if(m_clsTime.GetDay()==StatDate()) return m_clsTime.GetDayCount();
// 否则,返回昨天的天数
// 否则,返回前一天的时间:首先获取UNIX时间,该时间减去一天的
// 总秒数即为昨天此刻的UNIX时间,再将该时间转换为年、月、日格
// 式后返回对应的天数
long nLastDay=(long)m_clsTime.GetUnixTime()-24*60*60L;
struct tm *tmpTm; //入口时间
tmpTm=localtime(&nLastDay);
return tmpTm->tm_yday+1;
}
// 设置下传文件索引
void CRecord::AkIndex(UCHAR nIndex)
{
chAkIndex=nIndex;
}
// 返回下传文件索引
UCHAR CRecord::AkIndex()
{
return chAkIndex;
}
// 设置下传文件状态
void CRecord::AkStatus(UCHAR status)
{
chAkStatus=status;
}
// 返回下传文件状态(0:失败;1:成功)
UCHAR CRecord::AkStatus()
{
return chAkStatus;
}
// 设置设备索引 01:抓拍线圈 02:检测线圈 03:打印机
void CRecord::DeviceIndex(UCHAR index)
{
iDeviceIndex=index;
}
// 返回设备索引
UCHAR CRecord::DeviceIndex()
{
return iDeviceIndex;
}
// 设置设备状态 0: 正常 1:出错
void CRecord::DeviceStatus(UCHAR status)
{
iDeviceStatus=status;
}
// 返回设备状态
UCHAR CRecord::DeviceStatus()
{
return iDeviceStatus;
}
// 设置记录时间
void CRecord::SetRecordDate(UINT Year,UINT DayCount,UINT Minutes,UINT Seconds)
{
nRecordYear=Year;
nRecordDayCount=DayCount;
nRecordMinute=Minutes;
nRecordSecond=Seconds;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -