⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deviceclass.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		pBuff[nPosition]='N';
		nPosition++;
		pBuff[nPosition]=8;				//右边距为8
		nPosition++;
		*/
		pBuff[nPosition]=0x1c;			//设置汉字方式打印
		nPosition++;
		pBuff[nPosition]='&';
		nPosition++;
//	打印车道号及收费员代码
		m_clsLane.GetPlazaName(pBuff+nPosition);
		nPosition+=16;					//打印收费站名称
		
		sprintf(pBuff+nPosition,"%.2d            %.5d\n\n",
			m_clsLane.LaneNO(),m_clsStat.CollectNO());
		nPosition+=21;
		
		if(SendPrintData(pBuff,nPosition)){
//	如果参数设置为预先打印一部分发票,预打发票标志置位,预打发票
			m_clsStat.HasPrePrint(TRUE);
		}
	}
}

//将整数金额转换为汉字金额
void CPrinter::ConvertMoney(UINT iData,char *chData)
{
		char strChineseDigit[]="零壹贰叁肆伍陆柒捌玖";
	char strChineseUnit[]="拾佰仟万";	
	int index=0;
	char chTmp[6],chTmp2[6];
	memset(chTmp,0,6);
	memset(chTmp2,0,6);

	memset(chData,0,10);
	
	sprintf(chTmp,"%5d",iData);

	int len=sprintf(chTmp2,"%d",iData);

	if(len==1){
		memmove(chData,strChineseDigit+iData*2,2);
		return;
	}

	if(len==2){
		memset(chTmp2,0,6);
		memmove(chTmp2,chTmp+3,1);

		index=atoi(chTmp2);
		memmove(chData,strChineseDigit+index*2,2);
		
		memset(chTmp2,0,6);
		memmove(chTmp2,chTmp+4,1);

		index=atoi(chTmp2);
		if(index!=0)
		{
			memmove(chData+2,strChineseUnit,2);
			memmove(chData+4,strChineseDigit+index*2,2);
		}
		else
		{
			memmove(chData+2,strChineseUnit,2);
		}
		
		return;
	}

	if(len==3){
		memset(chTmp2,0,6);
		memmove(chTmp2,chTmp+2,1);
		index=atoi(chTmp2);

		memmove(chData,strChineseDigit+index*2,2);
		memmove(chData+2,strChineseUnit+2,2);
		
		memset(chTmp2,0,6);
		memmove(chTmp2,chTmp+3,1);
		index=atoi(chTmp2);

		memset(chTmp2,0,6);
		memmove(chTmp2,chTmp+4,1);
		int index3=atoi(chTmp2);

		if(index==0&&index3==0) return;

		if(index!=0)
		{	

			memmove(chData+4,strChineseDigit+index*2,2);
			memmove(chData+6,strChineseUnit,2);

			if(index3!=0){
				memmove(chData+8,strChineseDigit+index3*2,2);
			}else{
				return;
			}

		}else{

			if(index3!=0){
				memmove(chData+4,strChineseDigit,2);
				memmove(chData+6,strChineseDigit+index3*2,2);
			}else{
				return;
			}
		}
	}
	
}


//	通知打印机清空打印缓冲区
void CPrinter::ClearBuff()
{
	char pBuff[3];
	memset(pBuff,0,3);
	pBuff[0]=0x1b;					//初始化打印机
	pBuff[1]='@';
	SendPrintData(pBuff,2);
}

//	通知打印机进纸
void CPrinter::Feed()
{
	char pBuff[4];
	memset(pBuff,0,4);
	pBuff[0]=0x1b;					//
	pBuff[1]=0x19;
	pBuff[2]=8;						//进纸8行
	SendPrintData(pBuff,3);
}

//	通过控制打印机打印票据
//	串口连接:将数据发送到连接打印机的串口
//	并口连接:用写方式打开并口PRN并将数据写入并行口。
//	特别地:若打印机未开机,向并口发送数据可能会导致较长的延迟,因
//			此打印的操作用另一个线程在后台执行
BOOL CPrinter::SendPrintData(char *pBuff,int iLen)
{
//	以下注释部分用于串行打印机
//	try{
//		if(sio_write(PRINT_PORT,pBuff,iLen)<iLen){
//			NormalFlag(FALSE);
//		} else {
//			NormalFlag(TRUE);
//		}
//		return NormalFlag();
//	}
//	catch(...){
//		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CPrinter::PrintInvoice()出现异常\n");
//	}
//	return FALSE;
//	以下几行用于并口打印机
	theApp.muxPrint.Lock();
	memmove(strPrintInfo,pBuff,iLen);
	nPrintLen=iLen;
	theApp.muxPrint.Unlock();
	return TRUE;
}

//	返回票据打印机状态
BOOL CPrinter::NormalFlag()
{
	return bNormalFlag;
}

//	设置票据打印机状态
void CPrinter::NormalFlag(BOOL value)
{
//	若打印状态改变,生成设备状态消息
	if(bNormalFlag!=value){
		bNormalFlag=value;
		CRecord m_clsRecord;
		m_clsRecord.DeviceIndex(PRINTER_DEVICE_STATUS);
		if(!value){
//	绘制信息以提醒操作员
			CScreen m_clsScreen;
			m_clsScreen.DrawAlarmInfo("打印机故障");
			m_clsRecord.DeviceStatus('1');
		} else {
			m_clsRecord.DeviceStatus('0');
		}
		m_clsRecord.RecordME();
	}
}

BOOL COverlay::bNormalFlag=TRUE;

unsigned char COverlay::pDataBuff[30];
BOOL COverlay::bNewDataFlag=FALSE;
BOOL COverlay::bNewPositionFlag=FALSE;
char COverlay::pCommandBuff[2];
int COverlay::iCollectNO;
int COverlay::iLaneNO;

COverlay::COverlay()
{
}

//	字符叠加器初始化时需要设置时间、字体、车道信息,但这些信息
//	不能同时发送到叠加器,因此启动一定时器,定时器每超时一次则
//	发送一帧信息
void COverlay::Initial()
{
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,INITIAL_TIMER,0);
}

//	初始化定时器超时,继续下发其他尚未发完的命令
void COverlay::InitialTimerOut()
{
//	由于和字符叠加器通讯时经常丢失数据,每种消息我们都至少发送
//	8次以防止丢失
	static int nCount=1;
	if(nCount>31) return;
	switch(nCount%4){
	case 0:
		OverlaySetStatus(LINE);		//设置信息行位置
		break;
	case 1:
		OverlayDelay(DISPLAY_TIME);	//设置显示延时
		break;
	case 2:
		OverlayLaneInfo();			//叠加车道信息
		break;
	case 3:
		OverlaySetTime();			//设置叠加器时间
		break;
	}
	nCount++;
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,INITIAL_TIMER,0);    
}

//Overlay定时器超时
void COverlay::ProcessTimerOut()
{
	
}

//	设置字符位置
void COverlay::OverlaySetStatus(char Line)
{
	
	UCHAR tmpStr[4];
	memset(tmpStr,0,4);

	tmpStr[0]=OVERLAY_POSITION;	
	tmpStr[1]=Line;
	
	SendOverlayData(tmpStr,2);
	
}

//	字符显示延时
void COverlay::OverlayDelay(char Second)
{
	
	UCHAR tmpStr[4];
	memset(tmpStr,0,4);

	tmpStr[0]=OVERLAY_DELAY;	
	tmpStr[1]=Second;
	
	SendOverlayData(tmpStr,2);
	
}

//	叠加车道信息
void COverlay::OverlayLaneInfo()
{
	CLaneInfo m_clsLane;

	char tmpStr[5];
	memset(tmpStr,0,5);

	tmpStr[0]=OVERLAY_DISPLAY_LANE;	
	tmpStr[1]=m_clsLane.LaneNO()+'0';				
	
	SendOverlayData((UCHAR *)tmpStr,2);
}

//	叠加收费员工号
void COverlay::OverLayCollectNo()
{
	CStatInfo m_clsStat;
	char tmpStr[8];
	memset(tmpStr,0,8);

	char tmp1[6],tmp2[6];
	memset(tmp1,0,6);
	memset(tmp2,0,6);
	//memmove(tmp1,' ',5);

	//itoa(m_clsStat.CollectNO(),tmp1,4);
	sprintf(tmp1,"%.4d",m_clsStat.CollectNO());
    memmove(tmp2,tmp1,4);
	tmpStr[0]=OVERLAY_COLLECT_NO;	

	if(atoi(tmp2)!=0){		
		tmpStr[1]=atoi(tmp2)/1000+'0';	
		tmpStr[2]=((atoi(tmp2))%1000)/100+'0';		
		tmpStr[3]=((atoi(tmp2)%1000)%100)/10+'0';					
		tmpStr[4]=((atoi(tmp2)%1000)%100)%10+'0';				
	}else{
		memset(tmpStr+1,' ',4);
	}
			
	SendOverlayData((UCHAR *)tmpStr,5);
}


//叠加交易信息
void COverlay::OverlayTransInfo()
{
	CTransInfo m_clsTrans;

	char tmpStr[12];
	memset(tmpStr,0,12);

	tmpStr[0]=OVERLAY_CLASS_MONEY; 	
//	tmpStr[1]=m_clsTrans.BusClass();
	tmpStr[1]=(m_clsTrans.Fare()%1000)/100+'0';	
	tmpStr[2]=((m_clsTrans.Fare()%1000)%100)/10+'0';	
	tmpStr[3]=((m_clsTrans.Fare()%1000)%100)%10+'0';
	
	SendOverlayData((UCHAR *)tmpStr,4);
}

//	设定叠加器时间
void COverlay::OverlaySetTime()
{
	CTimeInfo m_clsTime;
	UCHAR tmpStr[15];
	memset(tmpStr,0,15);

	tmpStr[0]=OVERLAY_TIME;	
	tmpStr[1]=(m_clsTime.GetYear()%100)/10+'0';	
	tmpStr[2]=(m_clsTime.GetYear()%100)%10+'0';	
	tmpStr[3]=m_clsTime.GetMonth()/10+'0';	
	tmpStr[4]=m_clsTime.GetMonth()%10+'0';
	tmpStr[5]=m_clsTime.GetDay()/10+'0';
	tmpStr[6]=m_clsTime.GetDay()%10+'0';	
	tmpStr[7]=m_clsTime.GetHour()/10+'0';	
	tmpStr[8]=m_clsTime.GetHour()%10+'0';	
	tmpStr[9]=m_clsTime.GetMinute()/10+'0';	
	tmpStr[10]=m_clsTime.GetMinute()%10+'0';	
	tmpStr[11]=m_clsTime.GetSecond()/10+'0';	
	tmpStr[12]=m_clsTime.GetSecond()%10+'0';

	SendOverlayData(tmpStr,13);
	
}

//	向字符叠加器发送数据
void COverlay::SendOverlayData(UCHAR *pStr,int nLen)
{
	UCHAR tmpStr[42];
	memset(tmpStr,0,42);
	tmpStr[0]=OVERLAY_HEAD;		//起始符
	
	memmove(tmpStr+1,pStr,nLen);

	tmpStr[nLen+1]=OVERLAY_TAIL; //结束符
	
	try{
		if(sio_write(OVERLAY_PORT,(char *)tmpStr,40)<40){
			if(bNormalFlag){
				bNormalFlag=FALSE;
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"向字符叠加器发送数据失败\n");
			}
		} else {
			bNormalFlag=TRUE;
		}
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"COverlay::SendOverlayData()出现异常\n");
	}
}


/*
//处理来自字符叠加器的数据
void COverlay::ProcessOverlayData(unsigned char Status)
{
	static unsigned char SendIndex;
	static unsigned char CheckSum;
	static unsigned char tmpDataBuff[30];

	switch(Status){
	case 0x55:							//假如空闲
		if(bNewDataFlag==TRUE){			//假如要更新叠加信息
			bNewDataFlag=FALSE;
			memmove(tmpDataBuff,pDataBuff,30);
			SendOverlayData(0x2a,0x2a);		//准备发送数据
			SendIndex=0;
			CheckSum=0;					//校验和赋初值
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CLOSE_TIMER,CLEAR_OVERLAY_TIMER,0);
										//关闭“清除叠加信息”定时器
		} else {			
				
			SendOverlayData(0,0);		//无数据要发送			
		}
		break;
	case 0x77:							//假如正在接收数据
		if(SendIndex>EVENT_TYPE_BUFF){
			SendOverlayData(0xa7,CheckSum);	//发送数据结束
		} else {
			switch(SendIndex){
			case COLLECT_NO_BUFF:
			case COLLECT_NO_BUFF+1:
			case COLLECT_NO_BUFF+2:
			case COLLECT_NO_BUFF+3:
			case LANE_NO_BUFF:
			case LANE_NO_BUFF+1:
			case TIME_BUFF:
			case TIME_BUFF+1:
			case TIME_BUFF+2:
			case TIME_BUFF+3:
			case BUS_CLASS_BUFF:
			case MONEY_BUFF:
			case MONEY_BUFF+1:
			case MONEY_BUFF+2:
			case EVENT_TYPE_BUFF:
				SendOverlayData(pDataBuff[SendIndex],SendIndex+1);
				CheckSum=SendIndex+1+pDataBuff[SendIndex]+CheckSum;
				SendIndex++;
				break;
			default:
				SendIndex++;
				break;
			}
		}
		break;
	case 0xa7:							//假如校验不正确
	case 0xaa:							//叠加器复位
		bNewDataFlag=TRUE;				//重新发送数据
		break;
	}
	
}
*/

/*唐山	叠加交易信息
void COverlay::OverlayTransInfo(unsigned char Status)
{
	
	CTransInfo m_clsTrans;
	char tmpStr[38];
	memset(tmpStr,0,38);
	tmpStr[0]=OVERLAY_WORD;
	tmpStr[1]=LINE_2;
	tmpStr[2]=COL_2;
	tmpStr[3]=0x10;				//通道1叠加
	CLaneInfo m_clsLane;
	
	sprintf(tmpStr+4,"车型 %c  人民币  %.4d",m_clsTrans.BusClass(),
			m_clsTrans.Fare());
	
	SendOverlayData((UCHAR *)tmpStr,24);
//	启动定时器,10秒后清除叠加信息
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,OVERLAY_TIMER,10000);
	
}*/

/*
//	叠加车道信息
void COverlay::OverlayLaneInfo()
{
	CLaneInfo m_clsLane;
	CStatInfo m_clsStat;

	memset(pDataBuff,0xcf,30);
	
	pDataBuff[PLAZA_NO]=m_clsLane.PlazaNO()/10;	
	pDataBuff[PLAZA_NO+1]=m_clsLane.PlazaNO()%10;	

	pDataBuff[LANE_NO_BUFF]=m_clsLane.LaneNO()/10;
	pDataBuff[LANE_NO_BUFF+1]=m_clsLane.LaneNO()%10;
	
	pDataBuff[COLLECT_NO_BUFF]=m_clsStat.CollectNO()/10000;
	pDataBuff[COLLECT_NO_BUFF+1]=(m_clsStat.CollectNO()%10000)/1000;
	pDataBuff[COLLECT_NO_BUFF+2]=((m_clsStat.CollectNO()%10000)%1000)/100;
	pDataBuff[COLLECT_NO_BUFF+3]=(((m_clsStat.CollectNO()%10000)%1000)%100)/10;
	pDataBuff[COLLECT_NO_BUFF+4]=(((m_clsStat.CollectNO()%10000)%1000)%100)%10;
	
	iCollectNO=m_clsStat.CollectNO();		
	iLaneNO=m_clsLane.LaneNO();
	bNewDataFlag=TRUE;	
}
*/

/*
//	向字符叠加器发送数据
void COverlay::SendOverlayData(unsigned char index,unsigned char value)
{
	try{
	char tmpStr[5];
	memset(tmpStr,0,5);
	tmpStr[0]=index;
	tmpStr[1]=tmpStr[2]=value;
	tmpStr[3]=0;
	sio_write(OVERLAY_PORT,tmpStr,4);
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"COverlay::SendOvelayData()出现异常\n");
	}
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -