📄 deviceclass.cpp
字号:
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 + -