示例#1
0
BOOL CComm_Thread::OnIdle(LONG lCount)
{
    // TODO: Add your specialized code here and/or call the base class

    COApp* pApp=(COApp*)AfxGetApp();
    unsigned char ucAddr;
    static BOOL AorB=true;
    memset(CommMsgR,0,sizeof(CommMsgR));

    if(CommLink)
    {
        if(pApp->x_stop)
        {   //冻结屏幕
            if(pApp->ChkClock)
            {   //关闭其他功能,只提取遥信时钟
                if(bOutComm)
                {
                    CommSend(CommMsgS,xLength);
                    ucAddr=CommMsgS[2]*256+CommMsgS[3];
                    bOutComm=false;
                    SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x11,0x00);
                }
                else//实时询问报文
                {   //询问开入状态
                    if((pApp->ChkOff && (pApp->uiLed[5] & 0x08)) || pApp->ChkOn)
                    {   //自动提取事件
                        if(AorB && pApp->B)
                        {   //提取开入信号
                            CommMsgS[0]=0xFF;
                            CommMsgS[1]=0x03;
                            CommMsgS[2]=0x00;
                            CommMsgS[3]=0x00;
                            CommMsgS[4]=0x00;
                            CommMsgS[5]=0x03;
                            CRC16(CommMsgS,6,&CommMsgS[6]);

                            pApp->test.Format("发送报文: → %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgS[0],CommMsgS[1],CommMsgS[2],CommMsgS[3],CommMsgS[4],CommMsgS[5],CommMsgS[6],CommMsgS[7]);
                            AorB=!AorB;
                        }
                        else
                        {   //提取事件
                            CommMsgS[0]=0xFF;
                            CommMsgS[1]=0x03;
                            CommMsgS[2]=0x00;
                            CommMsgS[3]=0x01;
                            CommMsgS[4]=0x00;
                            CommMsgS[5]=0x07;
                            CRC16(CommMsgS,6,&CommMsgS[6]);
                            pApp->test.Format("发送报文: → %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgS[0],CommMsgS[1],CommMsgS[2],CommMsgS[3],CommMsgS[4],CommMsgS[5],CommMsgS[6],CommMsgS[7]);
                            AorB=!AorB;
                            if(!(pApp->uiLed[5] & 0x08))
                            {
                                pApp->NewEvent1=true;
                            }
                        }
                    }
                    else
                    {   //只提取开入信号
                        CommMsgS[0]=0xFF;
                        CommMsgS[1]=0x03;
                        CommMsgS[2]=0x00;
                        CommMsgS[3]=0x00;
                        CommMsgS[4]=0x00;
                        CommMsgS[5]=0x03;
                        CRC16(CommMsgS,6,&CommMsgS[6]);

                        pApp->test.Format("发送报文: → %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgS[0],CommMsgS[1],CommMsgS[2],CommMsgS[3],CommMsgS[4],CommMsgS[5],CommMsgS[6],CommMsgS[7]);

                    }

                    CommSend(CommMsgS,8);
                    ucAddr=CommMsgS[2]*256+CommMsgS[3];
                    SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x11,0x00);
                }
            }
            else
            {   //提取时钟
                CommMsgS[0]=0xFF;
                CommMsgS[1]=0x03;
                CommMsgS[2]=0x00;
                CommMsgS[3]=0x02;
                CommMsgS[4]=0x00;
                CommMsgS[5]=0x04;
                CRC16(CommMsgS,6,&CommMsgS[6]);
                pApp->test.Format("发送报文: → %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgS[0],CommMsgS[1],CommMsgS[2],CommMsgS[3],CommMsgS[4],CommMsgS[5],CommMsgS[6],CommMsgS[7]);
                CommSend(CommMsgS,8);
                ucAddr=CommMsgS[2]*256+CommMsgS[3];
                SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x11,0x00);
            }

            if(CommRecv(CommMsgR))
            {
                switch(CommMsgR[1])
                {
                case 0x03:
                    switch(ucAddr)
                    {
                    case 0:
                    {   //开入信号状态响应
                        pApp->uiLed[0]=CommMsgR[3];
                        pApp->uiLed[1]=CommMsgR[4];
                        pApp->uiLed[2]=CommMsgR[5];
                        pApp->uiLed[3]=CommMsgR[6];
                        pApp->uiLed[4]=CommMsgR[7];
                        pApp->uiLed[5]=CommMsgR[8];

                        //判断故障事件
                        if(pApp->NewEvent1)
                        {   //有新的事件记录
                            if(pApp->uiLed[5] & 0x08)
                            {
                                pApp->NewEvent1=false;
                                if(!pApp->ChkOff)
                                {
                                    SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x12,0x00);
                                }
                            }
                        }
                        if(pApp->NewEvent2)
                        {   //板卡故障1
                            if(pApp->uiLed[5] & 0x10)
                            {
                                pApp->NewEvent2=false;
                                SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x13,0x00);
                            }
                        }
                        if(pApp->NewEvent3)
                        {   //板卡故障2
                            if(pApp->uiLed[5] & 0x20)
                            {
                                pApp->NewEvent3=false;
                                SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x14,0x00);
                            }
                        }
                        if(pApp->NewEvent4)
                        {   //板卡故障3
                            if(pApp->uiLed[5] & 0x40)
                            {
                                pApp->NewEvent4=false;
                                SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x15,0x00);
                            }
                        }
                        if(pApp->NewEvent5)
                        {   //板卡故障4
                            if(pApp->uiLed[5] & 0x80)
                            {
                                pApp->NewEvent5=false;
                                SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x16,0x00);
                            }
                        }
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7],CommMsgR[8],CommMsgR[9],CommMsgR[10]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                        break;
                    }
                    case 1://提取事件记录响应
                    {
                        if(CommMsgR[2]==0x0E)
                        {   //有新事件
                            pApp->NoneEvent=true;
                            if(pApp->bEnum)
                            {
                                pApp->Enum=0;
                                pApp->bEnum=false;
                            }
                            pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7],CommMsgR[8],CommMsgR[9],CommMsgR[10],CommMsgR[11],CommMsgR[12],CommMsgR[13],CommMsgR[14],CommMsgR[15],CommMsgR[16],CommMsgR[17],CommMsgR[18]);
                            SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                            pApp->MilliSecondH=(CommMsgR[11])*256+(CommMsgR[12]);
                            if(CommMsgR[4]==0x55)
                            {
                                pApp->test.Format("第 %02d 路产生变位,变位类型: 0->1 (上升沿),变位时间: %d年%02d月%02d日%02d时%02d分%02d秒%03d毫秒\r\n",CommMsgR[3],CommMsgR[5]+2000,CommMsgR[6],CommMsgR[7],CommMsgR[8],CommMsgR[9],CommMsgR[10],pApp->MilliSecondH);
                            }
                            if(CommMsgR[4]==0xAA)
                            {
                                pApp->test.Format("第 %02d 路产生变位,变位类型: 1->0 (下降沿),变位时间: %d年%02d月%02d日%02d时%02d分%02d秒%03d毫秒\r\n",CommMsgR[3],CommMsgR[5]+2000,CommMsgR[6],CommMsgR[7],CommMsgR[8],CommMsgR[9],CommMsgR[10],pApp->MilliSecondH);
                            }
                            if(CommMsgR[4]!=0x55 && CommMsgR[4]!=0xAA)
                            {
                                pApp->test.Format("提取事件失败!\r\n");
                            }
                            SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x01,0x00);
                        }
                        else
                        {   //无事件记录
                            pApp->NewEvent1=true;
                            pApp->NewEvent2=true;
                            pApp->NewEvent3=true;
                            pApp->NewEvent4=true;
                            pApp->NewEvent5=true;
                            pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4]);
                            pApp->bEnum=true;
                            pApp->ChkOn=false;
                            pApp->B=true;
                            SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                            if(pApp->NoneEvent)
                            {
                                pApp->NoneEvent=false;
                                SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x09,0x00);
                            }
                        }
                        break;
                    }
                    case 2://提取实时时钟响应
                    {
                        pApp->Year=CommMsgR[3];
                        pApp->Month=CommMsgR[4];
                        pApp->Day=CommMsgR[5];
                        pApp->Hour=CommMsgR[6];
                        pApp->Minute=CommMsgR[7];
                        pApp->Second=CommMsgR[8];
                        pApp->MilliSecondH=(CommMsgR[9])*256+(CommMsgR[10]);
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7],CommMsgR[8],CommMsgR[9],CommMsgR[10],CommMsgR[11],CommMsgR[12]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x02,0x00);
                        //提取遥信时钟
                        if(!pApp->ChkClock)
                        {
                            pApp->test.Format("遥信时钟: %d年%02d月%02d日%02d时%02d分%02d秒%03d毫秒\r\n",pApp->Year+2000,pApp->Month,pApp->Day,pApp->Hour,pApp->Minute,pApp->Second,pApp->MilliSecondH);
                            SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x18,0x00);
                            Sleep(180);
                        }
                        break;
                    }
                    case 3://提取软件版本号响应
                    {
                        pApp->edition=(float(CommMsgR[3]*256+CommMsgR[4]))/100;
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7],CommMsgR[8]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x03,0x00);
                        break;
                    }
                    case 4://提取防抖时间响应
                    {
                        for(int m=0,n=3; m<36; n+=2,m++)
                        {
                            pApp->JH[m]=CommMsgR[n];
                            pApp->JL[m]=CommMsgR[n+1];
                        }
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgS[0],CommMsgS[1],CommMsgS[2],CommMsgS[3],CommMsgS[4],CommMsgS[5],CommMsgS[6],CommMsgS[7],CommMsgS[8],CommMsgS[9],CommMsgS[10],CommMsgS[11],CommMsgS[12],CommMsgS[13],CommMsgS[14],CommMsgS[15],CommMsgS[16],CommMsgS[17],CommMsgS[18],CommMsgS[19],CommMsgS[20],CommMsgS[21],CommMsgS[22],CommMsgS[23],CommMsgS[24],CommMsgS[25],CommMsgS[26],CommMsgS[27],CommMsgS[28],CommMsgS[29],CommMsgS[30],CommMsgS[31],CommMsgS[32],CommMsgS[33],CommMsgS[34],CommMsgS[35],CommMsgS[36],CommMsgS[37],CommMsgS[38],CommMsgS[39],CommMsgS[40],CommMsgS[41],CommMsgS[42],CommMsgS[43],CommMsgS[44],CommMsgS[45],CommMsgS[46],CommMsgS[47],CommMsgS[48],CommMsgS[49],CommMsgS[50],CommMsgS[51],CommMsgS[52],CommMsgS[53],CommMsgS[54],CommMsgS[55],CommMsgS[56],CommMsgS[57],CommMsgS[58],CommMsgS[59],CommMsgS[60],CommMsgS[61],CommMsgS[62],CommMsgS[63],CommMsgS[64],CommMsgS[65],CommMsgS[66],CommMsgS[67],CommMsgS[68],CommMsgS[69],CommMsgS[70],CommMsgS[71],CommMsgS[72],CommMsgS[73],CommMsgS[74],CommMsgS[75],CommMsgS[76]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x07,0x00);
                        break;
                    }
                    case 5:
                    {
                        pApp->x_Address=CommMsgR[3];
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x00,0x00);
                        break;
                    }
                    }
                    break;
                case 0x10:
                    switch(ucAddr)
                    {
                    case 1://设定实时时钟响应
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x04,0x00);
                        break;
                    case 2://清除事件记录响应
                    {
                        pApp->NewEvent1=true;
                        pApp->NewEvent2=true;
                        pApp->NewEvent3=true;
                        pApp->NewEvent4=true;
                        pApp->NewEvent5=true;
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x08,0x00);
                        break;
                    }
                    case 3://设定防抖时间响应
                        pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7]);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                        SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x05,0x00);
                        break;
                    }
                    break;
                default:
                {
                    pApp->test.Format("收到报文: ← %02X %02X %02X %02X %02X %02X %02X %02X",CommMsgR[0],CommMsgR[1],CommMsgR[2],CommMsgR[3],CommMsgR[4],CommMsgR[5],CommMsgR[6],CommMsgR[7]);
                    SendMessage(pApp->m_pMainWnd->m_hWnd,WM_MSGCOMMANS,0x17,0x00);
                    break;
                }
                }
            }
        }
        //计算报文收发成功率
        pApp->pbt=((float(pApp->Rnum))/(float(pApp->Snum)))*100;
        Sleep(20);
        return true;
    }
}
示例#2
0
/**
* @brief pos结算
* @param in cFlag 结算标识0正常结算    非0结算中断后的再次结算
* @return 
* @li APP_SUCC
* @li APP_FAIL
* @li APP_QUIT
*/
int Settle(char cFlag)
{	

	char *pszTitle="结算";
	STSYSTEM stSystem;
	STAMT_NUM_SETTLE stAmtNumSettle;
	STAMT_NUM_INFO_SETTLE stAmtNumInfo;

	int nRet = 0;
	char sPackBuf[MAX_PACK_SIZE]; 
	int nPackLen = 0;
	int nFieldLen = 0;
	char szSettleDateTime[5+1];
	char cProcStep = 0;
	int nTagSum=0;

	memset(&stSystem, 0, sizeof(STSYSTEM));

	/*
	* 检查POS限制,电量是否充足
	*/
	ASSERT_QUIT(DealPrintLimit()); 
	
	if (cFlag)
	{
		/*
		* 取原来结算中断的步骤
		*/
		if (YES == GetVarBatchHaltFlag())
		{
			cProcStep = 2;
		}
		else if (YES == GetVarPrintSettleHalt())
		{
			cProcStep = 3;
		}
		else if (YES == GetVarPrintDetialHalt())
		{
			cProcStep = 4;
		}
		else if (YES == GetVarClrSettleDataFlag())
		{
			cProcStep = 5;
		}
	}
	else
	{
		cProcStep = 0;
		/*
		* 将批上送中断标识的数置为1,从第一笔开始送
		*/
		SetVarBatchMagOfflineHaltFlag(1);
		SetVarFinanceHaltFlag(1);
		SetVarMessageHaltFlag(1);		
		SetVarEmvOfflineUpNum(1);
		SetVarEmvOnlineUpNum(1);
		SetVarEMVOfflineFailHaltFlag(1);
		SetVarEMVOnlineARPCErrHaltFlag(1);
		/*
		* 将批上送的笔数置为0,重新统计
		*/
		SetVarBatchSum(0);
	}	

	/**
	* 联机结算
	*/
	if (cProcStep <= 1)
	{
		/**
		* 检查是否签到
		*/
		ASSERT_QUIT(ChkLoginStatus());

		/**
		* 执行冲正
		*/
		ASSERT_HANGUP_QUIT(DoReversal());
		PubDisplayTitle(pszTitle);		
		/**
		* 再次判断拨号
		*/
		ASSERT_HANGUP_QUIT(CommConnect());
	
		/**
		* 采集数据
		*/
		DealSystem(&stSystem);
		CustodyTlvInit();

		DealSettle(&stAmtNumInfo);
		memset((char *)&stAmtNumSettle, 0, sizeof(stAmtNumSettle));
		PubHexToAsc(stAmtNumInfo.nDebitAmount_N.sSettleAmt, 12, 0,(uchar*)stAmtNumSettle.sDebitAmt_N);
		sprintf(stAmtNumSettle.sDebitNum_N, "%03ld", stAmtNumInfo.nDebitNum_N);		
		PubHexToAsc(stAmtNumInfo.nCreditAmount_N.sSettleAmt, 12, 0, (uchar*)stAmtNumSettle.sCreditAmt_N);
		sprintf(stAmtNumSettle.sCreditNum_N, "%03ld", stAmtNumInfo.nCreditNum_N);

#if 0
		stAmtNumSettle.cSettleCode_N = '0';
		PubHexToAsc(stAmtNumInfo.nDebitAmount_W.sSettleAmt, 12, 0, (uchar*)stAmtNumSettle.sDebitAmt_W);
		sprintf(stAmtNumSettle.sDebitNum_W, "%03ld", stAmtNumInfo.nDebitNum_W);	
		PubHexToAsc(stAmtNumInfo.nCreditAmount_W.sSettleAmt, 12, 0, (uchar*)stAmtNumSettle.sCreditAmt_W);
		sprintf(stAmtNumSettle.sCreditNum_W, "%03ld", stAmtNumInfo.nCreditNum_W);
		stAmtNumSettle.cSettleCode_W= '0';
#endif

		memcpy(stSystem.szTransCode, "200001", 6);
		memset(sPackBuf, 0, sizeof(sPackBuf));
		nPackLen =0;
		ASSERT_FAIL(CustodyTlvAddValue(1, stSystem.szTransCode, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(2, stSystem.szDate, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(3, stSystem.szTime, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(4, stSystem.szTrace, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(5, stSystem.szBatchNo, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(7,  stSystem.szPosID, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValue(8,  stSystem.szShopID, sPackBuf, &nPackLen, &nTagSum));
		ASSERT_FAIL(CustodyTlvAddValueLen(34, (char *)&stAmtNumSettle,36, sPackBuf, &nPackLen, &nTagSum));
		

		/**
		*拨号
		*/
		ASSERT_HANGUP_QUIT(CommConnect());
		ASSERT_HANGUP_FAIL(CustodyPack(sPackBuf, &nPackLen, nTagSum));

		IncVarTraceNo();
		ASSERT_HANGUP_FAIL(CommSend(sPackBuf, nPackLen));
		ASSERT_HANGUP_FAIL(CommRecv(sPackBuf, &nPackLen));
		
		ASSERT_HANGUP_FAIL(CustodyUpPack(sPackBuf, &nPackLen, &nTagSum));
		ASSERT_HANGUP_FAIL(CustodyChkRespon(&stSystem, sPackBuf, nPackLen));
		if (memcmp(stSystem.szResponse, "00", 2) != 0)
		{
			CommHangUp();
			CustoyDispResp(stSystem.szResponse, stSystem.szRespInfo);
			return APP_QUIT;
		}
	
		ASSERT_FAIL(CustodyGetField(34,  (char *)&stAmtNumSettle.cSettleCode_N, &nFieldLen));
		if(stAmtNumSettle.cSettleCode_N == '1' || stAmtNumSettle.cSettleCode_N == '2' || stAmtNumSettle.cSettleCode_N == '3')
		{
			SetVarCnCardFlag(stAmtNumSettle.cSettleCode_N);/*<内卡应答码*/
		}
		else
		{
			PubMsgDlg("结算", "内卡\n对帐应答代码错误", 3, 10);
			CommHangUp();
			return APP_FAIL;
		}
		/**
		* 保存结算日期时间
		*/
		PubAscToHex((uchar *)stSystem.szDate+4, 4, 0, (uchar *)szSettleDateTime);
		PubAscToHex((uchar *)stSystem.szTime, 6, 0, (uchar *)szSettleDateTime + 2);
		SetVarSettleDateTime(szSettleDateTime);
	}

	/**
	* 批上送
	*/
	if (cProcStep <= 2)
	{
		SetVarBatchHaltFlag(YES);
		/*银商要求除了通讯\打包问题,
		批上送应答只显示但是不失败,
		都强制成功*/
		
		//现在没有需要离线上送的交易
		//ASSERT_HANGUP_FAIL(DoBatchUp());
		SetVarBatchHaltFlag(NO);
	}

	CommHangUp();

	/**
	* 打印结算单
	*/
	if (cProcStep <= 3)
	{
		SetVarPrintSettleHalt(YES);
		PubClearAll();
		PubDisplayTitle("正在打印结算单");
		PubDisplayGen(3, "请稍候");
		PubUpdateWindow();
		nRet = PrintSettle(FIRSTPRINT);
		if (nRet == APP_FAIL)
		{
			return APP_FAIL;
		}
 		SetVarPrintSettleHalt(NO);
 	}
	
	/**
	* 打印明细单
	*/
	if (cProcStep <= 4)
	{
		SetVarPrintDetialHalt(YES);
		if (YES == GetVarIsPrintWaterRec())
		{
			int nSelect = 0;
			
			nRet = ProSelectList("0.否||1.是", "是否打印明细", 0xFF, &nSelect);
			if (nRet == APP_SUCC && nSelect == 1)
			{
				PubClear2To4();
				PubDisplayGen(3, "打印明细单");
				PubUpdateWindow();
				nRet = PrintAllWater();
				if (nRet == APP_FAIL)
				{
					return APP_FAIL;
				}
			}
		}

		SetVarPrintDetialHalt(YES);

		#if 0
		if(GetFailSendNum(0xFF) != 0)
		{
			PubClearAll();
			PubDisplayGen(3, "打印上送不成功的");
			PubDisplayGen(4, "交易明细");
			PubUpdateWindow();
	  		nRet = PrintFailWater(0xFF);
			if (nRet != APP_SUCC)
			{
				return APP_FAIL;
			}
		}
		if(GetFailSendNum(0xFE) != 0)
		{
			PubClearAll();
			PubDisplayGen(3, "打印上送被拒的");
			PubDisplayGen(4, "交易明细");
			PubUpdateWindow();
			nRet = PrintFailWater(0xFE);
			if (nRet != APP_SUCC)
			{
				return APP_FAIL;
			}
		}
		#endif
		SetVarPrintDetialHalt(NO);
	}

	/*
	* 清除结算数据流水等
	*/
	if (cProcStep <= 5)
	{
		SetVarClrSettleDataFlag(YES);
		PubClearAll();
		PubDisplayTitle(pszTitle);
		PubDisplayGen(2, "正在处理结算");
		PubUpdateWindow();
		nRet = InitWaterFile();/**<清除流水*/
		ASSERT(nRet);
		if (nRet != APP_SUCC)
		{
			InitWaterFile();/**<清除流水*/
		}
		ClearSettle();/**<清除结算数据*/
		IncVarBatchNo();/**<批次号加一*/
		SetVarClrSettleDataFlag(NO);
		SetVarOfflineUnSendNum(0);
	}
	PubClearAll();
	PubDisplayTitle(pszTitle);
	PubDisplayStrInline(DISPLAY_MODE_CENTER, 2, "结 算 成 功");
	PubUpdateWindow();
	return APP_SUCC;
}