📄 laneinfo.cpp
字号:
fputs(tmpStr,fp1); //收费车图象是否上传
memset(tmpStr,0,40);
if(strLaneParam[PARAM_COMPUTER_INVOICE_CHANGE])
tmpStr[0]='Y';
else
tmpStr[0]='N';
strcat(tmpStr," ModifyInvoice\n");
fputs(tmpStr,fp1); //电脑票收费员是否可修改
memset(tmpStr,0,40);
if(strLaneParam[PARAM_AUTORAIL_AUTO_SHUTDOWN])
tmpStr[0]='Y';
else
tmpStr[0]='N';
strcat(tmpStr," AutoRail\n");
fputs(tmpStr,fp1); //自动栏杆是否自动下落
fclose(fp1);
} else {
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新车道参数文件失败\n");
}
}
catch(...){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CLaneParam::SaveLaneParam()出现异常\n");
}
}
// 从车道配置文件中读取车道参数
void CLaneInfo::ReadLaneParam()
{
try{
FILE *fp1;
char tmpStr[40];
if((fp1=fopen(PARAMVS,"r"))!=NULL){
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //车道号码
memmove(strLaneParam+PARAM_LANE_NO,tmpStr,2);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //车道地址
memmove(strLaneParam+PARAM_LANE_ADDR,tmpStr,2);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //收费站代码
memmove(strLaneParam+PARAM_PLAZA_NO,tmpStr,2);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //本地端口号
memmove(strLaneParam+PARAM_LOCAL_PORT,tmpStr,4);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //消息服务器IP地址
memmove(strLaneParam+PARAM_MESSAGE_IP,tmpStr,15);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //消息服务器端口号
memmove(strLaneParam+PARAM_MESSAGE_PORT,tmpStr,4);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //图像服务器IP地址
memmove(strLaneParam+PARAM_PICTURE_IP,tmpStr,15);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //图像压缩质量
memmove(strLaneParam+PARAM_COMPRESS_QUALITY,tmpStr,3);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //是否输入发票号码
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_INPUT_INVOICE]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //是否输入班次号码
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_SHIFT_NO]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //是否允许自动关机
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_SHUT_DOWN]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //是否使用RAM盘
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_RAM_DISK]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //是否检查发票起、止号
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_CHECK_INVOICE]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //是否预先打印发票
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_PRE_PRINT]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //车道数据备份时间
memmove(strLaneParam+PARAM_BACKUP_TIME,tmpStr,2);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //是否允许重打发票
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_REPEAT_INVOICE]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //违章模式
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_VIOLATE_MODE]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //四个班次上班交班时间
memmove(strLaneParam+PARAM_FOUR_SHIFT_TIME,tmpStr,16);
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //月票车是否输入车牌?
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_MONTH_CAR_NO]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //收费车图象是否上传?
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_NORMAL_CAR_PICTURE]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //电脑票收费员是否可修改?
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_COMPUTER_INVOICE_CHANGE]=tmpStr[0];
memset(tmpStr,0,40);
fgets(tmpStr,40,fp1); //自动栏杆是否自动下落?
if(tmpStr[0]=='Y')
tmpStr[0]=TRUE;
else
tmpStr[0]=FALSE;
strLaneParam[PARAM_AUTORAIL_AUTO_SHUTDOWN]=tmpStr[0];
memset(tmpStr,0,40);
fclose(fp1);
} else {
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"车道参数文件不存在,使用缺省参数\n");
DefaultParam();
}
}
catch(...){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CLaneParam::ReadLaneParam()出现异常\n");
DefaultParam();
}
}
// 判断操作员身份是否合法:非法操作员返回-1,收费员返回0,维修员
// 返回1
int CLaneInfo::CheckID(ULONG ID,ULONG nPassword)
{
char tmpStr[20],tmpB[10];
memset(tmpStr,0,20);
memset(tmpB,0,10);
sprintf(tmpStr,"%.5d%.6d",ID,nPassword);
sprintf(tmpB,"%.5d",ID);
// 首先判断ID是否位于黑名单中:若黑名单不为空、长度合法且
// 当前ID位于黑名单中,返回-1
if(strBlackList!=NULL){
if(strlen(strBlackList)>=5){
if(SearchString(strBlackList,tmpB,5)){
return -1;
}
}
}
// 其次判断操作员工号及密码是否位于操作员表中:若操作员表为空
// 或操作员表长度错误或当前ID及密码不位于该表中,返回-1
if(strCollectList==NULL) return -1;
if(strlen(strCollectList)<12) return -1;
sprintf(tmpStr+11,"%d",0); //收费员
if(SearchString(strCollectList,tmpStr,12)) return 0;
sprintf(tmpStr+11,"%d",1); //维修员
if(SearchString(strCollectList,tmpStr,12)) return 1;
return -1;
}
// 核对黑名单违章车:车牌位于黑名单中返回TRUE;否则返回FALSE
BOOL CLaneInfo::CheckBlackCar(char *pNO)
{
char tmpStr[20];
memset(tmpStr,0,20);
memset(tmpStr,' ',10);
memmove(tmpStr+10-strlen(pNO),pNO,strlen(pNO));
if(strBlackCarList==NULL){
return FALSE;
}
if(strlen(strBlackCarList)<10){
return FALSE;
}
if(!SearchString(strBlackCarList,tmpStr,10)){
return FALSE;
}
return TRUE;
}
// 核对月票车:车牌位于月票车名单中返回TRUE;否则返回FALSE
BOOL CLaneInfo::CheckMonthCar(char *pNO)
{
char tmpStr[20];
memset(tmpStr,0,20);
memset(tmpStr,' ',10);
memmove(tmpStr+(10-strlen(pNO)),pNO,strlen(pNO));
if(strMonthCarList==NULL){
return FALSE;
}
if(strlen(strMonthCarList)<10){
return FALSE;
}
if(!SearchString(strMonthCarList,tmpStr,10))
{
return FALSE;
}
return TRUE;
}
// 核对免征车:车牌位于免征车名单中返回TRUE;否则返回FALSE
BOOL CLaneInfo::CheckFreeCar(char *pNO)
{
char tmpStr[20];
memset(tmpStr,0,20);
memset(tmpStr,' ',10);
memmove(tmpStr+(10-strlen(pNO)),pNO,strlen(pNO));
if(strFreeCarList==NULL){
return FALSE;
}
if(strlen(strFreeCarList)<10){
return FALSE;
}
if(!SearchString(strFreeCarList,tmpStr,10)){
return FALSE;
}
return true;
}
// 根据给定的车型搜索相应的价格
int CLaneInfo::SearchFare(UCHAR nClass,UCHAR nType)
{
if(nType!='1') return 0; //非收费车返回0
if(strRMB==NULL){
SendMessage(AfxGetMainWnd()->m_hWnd,WM_ABNORMAL,0,(LPARAM)"价格文件错误\n");
return 999;
}
UINT nPosition=(nClass-'1')*4+12; //扣除生效日期及时间
if(strlen(strRMB)<nPosition+4){
SendMessage(AfxGetMainWnd()->m_hWnd,WM_ABNORMAL,0,(LPARAM)"价格文件或入口站序号错误\n");
return 999;
}
char tmpStr[5];
memset(tmpStr,0,5);
memmove(tmpStr,strRMB+nPosition,4);
return atoi(tmpStr);
}
// 用二分法查找字符串
BOOL CLaneInfo::SearchString(char *SourceStr, char *ObjectStr, int Length)
{
char tmpStr[50];
unsigned int LowPosition=0;
unsigned int HighPosition=strlen(SourceStr);
int StrCount,CurrentPosition,CompareResult;
do{
StrCount=(HighPosition-LowPosition)/Length; //共有多少组字符串
CurrentPosition=(StrCount/2)*Length+LowPosition;//定位到源串中间
memset(tmpStr,0,50);
memmove(tmpStr,SourceStr+CurrentPosition,Length);
CompareResult=Compare(ObjectStr,tmpStr,Length);
if(CompareResult>0){
LowPosition=CurrentPosition;
} else {
HighPosition=CurrentPosition;
}
} while((CompareResult!=0)&&(StrCount>1));
if(CompareResult==0){
return TRUE;
} else {
return FALSE;
}
}
// 用二分法比较字符串,若源字符串中有匹配的字符串,将匹配的字符
// 串在目标字符串中返回
BOOL CLaneInfo::FindString(char *SourceStr,char *ObjectStr,int nCompareLen,int nRealLen)
{
char tmpStr[50];
unsigned int LowPosition=0;
unsigned int HighPosition=strlen(SourceStr);
int StrCount,CurrentPosition,CompareResult;
do{
// 计算有多少组字符串需要比较
StrCount=(HighPosition-LowPosition)/nRealLen;
// 定位到要比较字符串的中间位置
CurrentPosition=(StrCount/2)*nRealLen+LowPosition;
memset(tmpStr,0,50);
// 取出中间位置的字符串
memmove(tmpStr,SourceStr+CurrentPosition,nRealLen);
// 比较其中部分字符串
CompareResult=Compare(ObjectStr,tmpStr,nCompareLen);
if(CompareResult>0){
LowPosition=CurrentPosition;
} else {
HighPosition=CurrentPosition;
}
} while((CompareResult!=0)&&(StrCount>1));
if(CompareResult==0){
// 返回所有匹配的字符串
memmove(ObjectStr,tmpStr,nRealLen);
return TRUE;
} else {
return FALSE;
}
}
// 比较两个字符串的大小
int CLaneInfo::Compare(char *ObjectStr, char *SourceStr, int Length)
{
for(int i=0;i<Length;i++,ObjectStr++,SourceStr++){
if(*ObjectStr==*SourceStr) continue;
if(*ObjectStr<*SourceStr) return -1;
if(*ObjectStr>*SourceStr) return 1;
// if(*SourceStr==0x20) continue;
}
return 0;
}
// 车道参数配置文件不存在时使用缺省配置参数
void CLaneInfo::DefaultParam()
{
SetLaneNO("01");
LaneAddr("01");
SetPlazaNO("01");
OwnNO("01");
LocalPort("6767");
SetMessageIP("202.202.202.108");
MessagePort("6768");
SetPictureIP("202.202.202.109");
PictureQuality("085");
RepeatInvoice('Y'); //缺省允许按“重打票”键
InputInvoice('Y'); //缺省必须输入发票号
InputShiftNO('Y'); //缺省必须输入班次
ShutDown('N'); //缺省禁止自动关机
bCheckInvoice('Y'); //缺省检查发票起、止号
bPrePrint('Y'); //缺省预先打印发票
SetViolateModeFlag('N'); //缺省违章模式
BackupTime("30");
memmove(strLaneParam+PARAM_FOUR_SHIFT_TIME,"0200080014002000",16);//缺省四个班次上班交班时间
strLaneParam[PARAM_MONTH_CAR_NO]=TRUE; //缺省月票车是输入车牌
strLaneParam[PARAM_NORMAL_CAR_PICTURE]=TRUE; //缺省收费车图象是上传?
strLaneParam[PARAM_COMPUTER_INVOICE_CHANGE]=TRUE; //缺省电脑票收费员否可修改?
strLaneParam[PARAM_AUTORAIL_AUTO_SHUTDOWN]=TRUE; //缺省自动栏杆是自动下落
SaveLaneParam();
}
// 设置导致程序退出的错误信息
void CLaneInfo::SetErrorInfo(char *pStr)
{
memset(strErrorInfo,0,80);
memmove(strErrorInfo,pStr,strlen(pStr));
}
// 获取导致程序退出的错误信息
void CLaneInfo::GetErrorInfo(char *pRetStr)
{
memmove(pRetStr,strErrorInfo,strlen(strErrorInfo));
}
// 设置运行参数文件齐全标志
void CLaneInfo::FileReadyFlag(UINT nIndex,BOOL value)
{
bFileReadyFlag[nIndex]=value;
}
// 返回运行参数文件齐全标志
BOOL CLaneInfo::FileReadyFlag(UINT nIndex)
{
return bFileReadyFlag[nIndex];
}
// 处理时间:每分钟前三秒检查价格文件生效时间,若新价格生效日期已经
// 到达,则用新价格表替换当前价格表
void CLaneInfo::ProcessTime()
{
CTimeInfo m_clsTime;
UINT nSecond=m_clsTime.GetSecond();
if((nSecond>=0)&&(nSecond<=3)){
char strNowTime[14];
memset(strNowTime,0,14);
sprintf(strNowTime,"%.4d%.2d%.2d%.2d%.2d",m_clsTime.GetYear(),
m_clsTime.GetMonth(),m_clsTime.GetDay(),
m_clsTime.GetHour(),m_clsTime.GetMinute());
if((strRMB_New!=NULL)&&(strlen(strRMB_New)>12)){
if(strncmp(strNowTime,strRMB_New,12)>=0){
// 当前时间大于新价格生效时间,用新价格
UpdateNewFare();
}
}
}
}
// 用新价格表更新当前价格表
void CLaneInfo::UpdateNewFare()
{
try{
if(strRMB_New!=NULL){
if(strRMB!=NULL){
delete [] strRMB;
strRMB=NULL;
}
UINT nLen=strlen(strRMB_New);
strRMB=new char[nLen+2];
if(strRMB==NULL){
PostMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL_QUIT,ERROR_NO_ENOUGH_MEMORY,0);
return;
}
memset(strRMB,0,nLen+2);
memmove(strRMB,strRMB_New,nLen);
if(strRMB_New!=NULL){
delete [] strRMB_New;
strRMB_New=NULL;
}
FILE *fp1;
if((fp1=fopen(TFRMB_FILE,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新价格文件失败\n");
return;
}
UINT nPosition=0;
nLen=strlen(strRMB);
if(nLen<=12) return;
fwrite(strRMB,8,1,fp1); //生效日期
fputc('\n',fp1);
nPosition+=8;
fwrite(strRMB+nPosition,4,1,fp1); //生效时间
fputc('\n',fp1);
nPosition+=4;
UINT nReadLength=4;
while(1){
if(nPosition>=nLen) break;
fwrite(strRMB+nPosition,nReadLength,1,fp1);
fputc('\n',fp1);
nPosition+=nReadLength;
}
fclose(fp1);
remove(TFRMB_NEW);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,TFRMB_INDEX);
}
}
catch(...){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CLaneInfo::UpdateNewFare()出现异常\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -