Esempio n. 1
0
uchar TA_BT_ucSetBTPINCodeMode(uchar ucMode)
{
	uchar ucRet = 0, ucCmd = 0, ucData = 0;

	if (0x00 == ucMode)	//	SPP 无需PIN配对
	{
		ucCmd = EM_BT_PARE_MODE;
		ucData = EM_BT_PARE_SSP_JUST;
	}
	else
	{
		ucCmd = EM_BT_PARE_MODE;
		ucData = EM_BT_PARE_FIXED;
	}

	ucRet = EA_ucSetBTParamConfig(ucCmd, &ucData);
	if (EM_SUCCESS != ucRet)
	{
		ucCmd = 20;
		EA_vCls();
		TA_vDisplayLine(DISP_LINE_M1, DISP_POS_MID, "设置蓝牙配对模式错%02X", ucRet);
		while (ucCmd--)
		{
			EA_vLCDLightOff();
			EA_vDelayMs(500);
			EA_vLCDLightOn();
			EA_vDelayMs(500);
			EA_vBeepMs(500);
			TA_vDisplayLine(DISP_LINE_M2, DISP_POS_MID, "请联系厂商客服!");
			EA_uiInkey(3);
		}
		EA_uiInkey(30);
		EA_vSystemManage(EM_SHUTDOWN);
	}

	return ucRet;
}
Esempio n. 2
0
/******************************************************************************
* 函数名称: vCallEnd
* 功能描述: 
*     挂机处理
******************************************************************************/
void vCallEnd(void)
{
	UINT8 cTempNo[DIALNOLEN];
	
	memset(cTempNo,0x00,DIALNOLEN);
	EA_ucOffHook(TELEPHONEOFF);
	vGetCallNo(cTempNo);
	if(cTempNo[0] != 0)
	{
		vSetDialCall(cTempNo, 1);
	}
	EA_vDelayMs(500);
	EA_modem_setlisten(1);
	EA_ucModemSwitch(MODEMON);	
	cls();
}
Esempio n. 3
0
int PubPurchaseRFIcc (struct CardConfig *pcard,struct TrackInfo* pcTrackInfo)
{
	char szTmpBuf[50], szBatch[7], szGetBuffer[50];
	BYTE szData[100] , cLen;
	BYTE Ret,RetRF;
	BYTE cRet; 
	char cIsBlackCard;
	struct FileRecStru PurPos;
	TransDt TransDataStru; 
	int cFlg;
	WORD nLen;


	memset((char *) &PurPos, 0, sizeof(struct FileRecStru));
    PurPos.cTransType = gbnTransType;
	PubSetBankcMacChk(MAC_ECB);
	/*
	 * 数据采集(打基本包,输金额)
	 */
	//PubDisplayInv (1, "快速");
	ASSERT_NORMAL(PubPacketFix(&PurPos));
	
	PurPos.cAidLen = pcard->cAidLen;
	memcpy (PurPos.aid,pcard->aid,PurPos.cAidLen);
	sprintf (PurPos.tAPN,"%s",gbctAPN);
	sprintf (PurPos.tAppLabel,"%s",gbctAppLabel);
	memcpy (PurPos.szMode , pcTrackInfo->szServerCodeBuf , 4);
	PurPos.cIC_Condition_Code = pcard->cIC_Condition_Code;
	if (PurPos.cTransType == EP_PURCHASE)
	{
		PubICProcess (&PurPos);
		gbnTransType = 0;
		return NORMAL;
	}
	PurPos.cECFlag = 2;// 电子现金标志
	//应用初始化,读应用数据
	PurPos.cECFlag = 2;
	//折扣
	sprintf (PurPos.szAmount, "%012ld", gblTranAmt);
	RetRF = StartEmvRFApp (&PurPos);
	if(gbnGetCardNoFromINQUERY == 1)
		{
		sprintf(pcTrackInfo->szPanBuf,"%s",PurPos.szCardNo);
		return NORMAL;
		}
	PubWriteLog(RetRF, __FILE__, __LINE__);
	if (RetRF == 99)
	{
		return NORMAL;
	}
	if (RetRF == RFARQC)
	{
		if (memcmp
			(gbCandListStru[gbcAidNumSelected - 1].tAID,
			"\xA0\x00\x00\x03\x33\x01\x01\x06",
				8) == 0)
		{
			EA_vCls();
			PubDisplayCen( 2, "余额不足");
			PubDisplayCen( 3, "交易拒绝");
			PubuiInkey(15);
			return  EXCEPTION;
		}

	}
	
	if( RetRF == 0 || RetRF == RFARQC )
	{
		;
	}
	else if( RetRF == RFQPBOC  || RetRF == RFPBOC)
	{
		;
	}
	else if(RetRF == RFMSD1 || RetRF == RFMSD2 )
	{
		PurPos.szMode[0] = '9';
		PurPos.szMode[1] = '1';
	}
	else if (RetRF != 0)
	{
		if (RetRF == EMVPANDIFFTRACK2)	//v1.0.2
		{
			return EXCEPTION;
		}
		/*chenjs20060626 del
			if (szTrack2.ucTrkFlag == EM_mag_SUCCESS
				&& szTrack2.ucTrkLength > 10)*/
		if(pcTrackInfo->nTrack2BufLen >10 )//chenjs20060626 add //在trackstru有初始化的前期下,从读卡函数看,这个条件成立已经包括szTrack2.ucTrkFlag == EM_mag_SUCCESS
		{						//EM_mag_SUCCESS=0x00 所以不能只判断szTrack2.ucTrkFlag的值
			PurPos.szMode[0] = '0';
			PurPos.szMode[1] = '2';
			PurPos.szMode[2] = '2';
			PurPos.szMode[3] = 0x00;	// 读取磁道方式
			PurPos.cIC_Condition_Code = 2;
		}
		else
		{
			gbcICWrongFlag = YES;
			if (PubRead_Card("消费",YES,NO,NO,NO,YES, pcard , pcTrackInfo) != NORMAL)
				return EXCEPTION;
		}
		PubPurchase(pcTrackInfo);
		//fallback
		return (EXCEPTION);
	}

	//打包
	BUFCLR (szGetBuffer);
	PubGetCurOper (szGetBuffer, 3);
	sprintf (PurPos.szOperNo, "%s", szGetBuffer);
	if(strlen (PurPos.szCardNo) > 0  )
		PubSetBitYL (&iso, PAN, PurPos.szCardNo, strlen (PurPos.szCardNo));

	if (PurPos.pansn_flag == '#')
	{
		BUFCLR (szTmpBuf);
		szTmpBuf[0] = '0';
		PubHexToAsc(szTmpBuf + 1, &PurPos.pansn, 2, 0);
		PubSetBitYL (&iso, 23, szTmpBuf, 3);	// PAN顺序号
	}
	PubSetBitYL (&iso, AMOUNT, PurPos.szAmount, 12);	// 交易金额
	PubSetBitYL (&iso, SERVEMODE, PurPos.szMode, 3);
	PubSetBitYL (&iso, 11, PurPos.szTrace, 6);
	PubSetBitYL (&iso, 25, "00", 2);
	PubSetBitYL (&iso, 49, "156", 3);
	BUFCLR (szBatch);
	PubGetBankstateszBatchNum (szBatch, sizeof (szBatch));
	sprintf (PurPos.szBatchNum, "%s", szBatch);
	//v1.0.2

	//add
	BUFCLR (szTmpBuf);
	sprintf (szTmpBuf, "22%6.6s0006%d1", PurPos.szBatchNum,PurPos.cIC_Condition_Code);
	ASSURE_NORMAL (PubSetBitYL (&iso, 60, szTmpBuf, 14));//modify by baijz 20120109  支持返回余额
	if (PurPos.szExpDate[0])
	{
		PubSetBitYL (&iso, 14, PurPos.szExpDate, 4);
	}

	if( RetRF == 0 )
	{
		memset(&TransDataStru, 0 , sizeof(TransDataStru ));
		EA_EMV_GetTransDt(&TransDataStru);
		ConverTransToPos(&TransDataStru,&PurPos);
		//JP add
		BUFCLR (szGetBuffer);
		if ( EA_EMV_GetAppData("\x9f\x74", 2, szGetBuffer, &nLen) == 0 )
		{
			memcpy(PurPos.szVLPAuth,szGetBuffer,6);
// 			PubDisplay(3, "1111111");
// 			PubDisplay(4 , "[%s][%2.2x]" , szGetBuffer,szGetBuffer[0]);
// 			PubuiInkey(0);
		}
		BUFCLR (szGetBuffer);
// 		if ( EA_EMV_GetAppData("\x9f\x10", 2, szGetBuffer, &nLen) == 0 )
 		if ( EA_EMV_ucGetTranCVR(szGetBuffer, &cLen) == EM_SUCCESS )
		{
			BUFCLR(PurPos.szCVR);
			memcpy(PurPos.szCVR,szGetBuffer ,4);
		}
		//
// 		PurPos.cAidLen = pcard->cAidLen;
// 		memcpy (PurPos.aid,pcard->aid,PurPos.cAidLen);
// 		sprintf (PurPos.tAPN,"%s",gbctAPN);
// 		sprintf (PurPos.tAppLabel,"%s",gbctAppLabel);
// 		PubDisplay(3, "[%d][%s]" ,PurPos.cAidLen , PurPos.aid );
// 	PubuiInkey(0);

		//add by baijz 20110629
		cIsBlackCard = 0;
		cIsBlackCard = EQueryBlackRecord (PurPos.szCardNo);
		if(cIsBlackCard == 1)
		{
/*del by baijz 20110812 BCTC不要求记录流水
			strcpy(PurPos.arc , "Z1");
			PurPos.transresult = 0x01;  //不成功的脱机交易
			PurPos.cOfflineFlag = '*';
			PurPos.cUploadFlag = ' ';			
			PubEMVWater(&PurPos);
			PubIncTrace(); 
*/		
			PubClearAll();
			PubDisplayCen(3, "该卡被列入黑名单");
			PubDisplayCen(4, "交易失败");
			PubuiInkey(3);
			return EXCEPTION;
		}

		PurPos.transresult = 0x00; // 交易结果为批准		
		PurPos.cOfflineFlag = '*';
		PurPos.cUploadFlag = ' ';
		strcpy(PurPos.arc, "Y1");//脱机核准
		
		//add by baijz 20110622
		FV.Other.gbnOfflineNums++;
		WRITE_nVAR(FV.Other.gbnOfflineNums);

		PubEMVWater(&PurPos);
		PubSaveDetail(&PurPos);	
		PubIncTrace();           //流水号递加,没有联机就在此对流水号加一
//add by baijz 20110725
		EA_vDelayMs(500);       //人耳能区分开,只能延时了。
		EA_vBeepMs(500);
		PubClearAll();
		if(ifVoidDeviceAppear == 1)
        EA_ucPlayVoice(gbVoiseHandle,3);
		PubDisplayCen(2, "交易成功");
		PubDisplayCen (3, "现金余额为");
 		PubDisplay (4, "%ld.%02ld",atol(PurPos.szAmount2)/100 , atol(PurPos.szAmount2) %100);
	 //	PubuiInkey (FV.EmvStru.gbcQueryResultDispDelay);
	 //add by ldy  售饭POS,显示2秒钟就可以了
	  // 清屏 
     PubSubdisplayClear();      
     // 显示交易成功金额和余额 add by feiq 2013/06/13 
     PubSubdisplayAmount(atol(PurPos.szAmount)*0.01, atol(PurPos.szAmount2)*0.01, SUBDISPLAY_MONEY_TYPE_BOTH); 
	 PubuiInkey(2);
	 //end
//add end
//---------------delete by ldy 售饭POS,不打单了,直接刷卡消费
		//PubSetPoscfgcPrintEndFlag(1);
		//PubPrint(0 , iPrinterType);
//---------------end
		return NORMAL;
	}

	if( RetRF != RFPBOC)//MSD1 MSD2 ARQC
	{
		if( RetRF == RFQPBOC || RetRF == RFARQC )
		{
			EA_EMV_GetTransDt(&TransDataStru);
			ConverTransToPos(&TransDataStru,&PurPos);
			memcpy(PurPos.cvmr , "\x02\x00\x00" , 3);
			PurPos.dial_response = 0x01;
		}
		else if(RetRF == RFMSD2 )
		{
			EA_EMV_GetTransDt(&TransDataStru);
			ConverTransToPos(&TransDataStru,&PurPos);
			PurPos.dial_response = 0x01;
		}
		else if( RetRF == RFMSD1 )//Need to Read Record
		{
			PurPos.cF55Flag = 0x01;
		}

		
		cRet = EA_EMV_GetAppData("\x9F\x6C", 2, szData, &nLen);
		
		if (cRet == EM_SUCCESS)
		{
/*del by baijz 20111219
			if (((szData[0] & 0x80) == 0x80) || (( szData[0] & 0x20) == 0x20))  //联机都输入密码
			{
				if ( FV.EmvStru.gbcExeReader == YES)
				{
					EA_ucCloseComm(); //先关闭串口,然后下面打开串口
				}
				
				if( ReadOnlinePin(&PurPos) == 2 )
					return EXCEPTION;
			}
			else if ((szData[0] & 0x60) == 0x60) //需要签名
			{
				if ( FV.EmvStru.gbcExeReader == YES)
				{
					EA_ucCloseComm(); //先关闭串口,然后下面打开串口
				}
				
				if( ReadOnlinePin(&PurPos) == 2 )
					return EXCEPTION;
			}
			else
			{
				return EXCEPTION; //交易拒绝
			}
*/
//add by baijz 20111219
			if ( FV.EmvStru.gbcExeReader == YES)
			{
				EA_ucCloseComm(); //先关闭串口,然后下面打开串口
			}
			
			if( ReadOnlinePin(&PurPos) == 2 )
				return EXCEPTION;
//add end
		}

		strcpy(gbszErrCode, "");
		
		cFlg = CommuWithHost(&PurPos); // 与Host进行通信	
		
		if(cFlg != NORMAL || memcmp(gbszErrCode,"00",2))
		{
			PubClearAll();
			PubDisplay(3," 主机返回[%2.2s]", gbszErrCode );
			PubDialOff(&CommInfo);
			PubuiInkey(3);

			return EXCEPTION;
		}
		if(gbcdial_response == 0 )
			PurPos.dial_response = 0x00;				
	
		if (cFlg == NORMAL && !memcmp(gbszErrCode,"00",2)) 
		{				
			
			PurPos.transresult = 0x00;
			PurPos.cOfflineFlag = ' ';
			PurPos.cUploadFlag = ' ';
		
			PubEMVWater(&PurPos);
			PubSaveDetail(&PurPos);
			//PubIncTrace(); //流水号递加,没有联机就在此对流水号加一
			PubSetPoscfgcAutoVoidFlag(0);
			PubClearAutoVoidBuf();
			//  先判断有没有脱机流水要上送,如果没有,则立刻挂断
			if(PubUploadOffline(CHECKUPLOAD)!= EM_SUCCESS)
				PubDialOff(&CommInfo);
			PubSetPoscfgcPrintEndFlag(1);
			PubPrint(0 , iPrinterType);
//			PubDialOff(&CommInfo);	
	
//add by baijz 20110623 先上送当前联机交易,再进行离线上送
    PubUploadOffline(RUNUPLOAD);    
	PubDialOff(&CommInfo);
		}
		return NORMAL;
	}

	PurPos.szMode[0] = '9';
	PurPos.szMode[1] = '8';
	PubSetBitYL (&iso, SERVEMODE, PurPos.szMode, 3);


	Ret = EmvRFAppProcess (&PurPos);
// 	EA_EMV_SetDebugShow(0x00);
	if (Ret != NORMAL)
	{
		if(Ret == FALLBACK)
		{
			memset(pcard,0,sizeof(pcard));
			memset(pcTrackInfo,0,sizeof(pcTrackInfo));
			gbcICWrongFlag = YES;
			if (PubRead_Card("消费",YES,NO,NO,NO,YES, pcard , pcTrackInfo) != NORMAL)
			{
                return EXCEPTION;
			}
			PubPurchase(pcTrackInfo);
		}
        //chenjs20060711 add up
		return EXCEPTION;
	}
	PubSetPoscfgcAutoVoidFlag(0);
	PubClearAutoVoidBuf();

//add by baijz 20110623 先上送当前联机交易,再进行离线上送
    PubUploadOffline(RUNUPLOAD);    
	PubDialOff(&CommInfo);

	return NORMAL;
}
Esempio n. 4
0
/******************************************************************************
* 函数名称: vDialDialRecord
* 功能描述: 
*     从通话记录进行回拨
******************************************************************************/
void vDialDialRecord(char* cCallNo,UINT8 ucCallLen,UINT8* pucCancelFlag,UINT8* pucNextPage)
{
	UINT8 ucAct,ucKeyValue,i;
	uchar ucReDialTabel=0;
	//UINT8 ucReDialFlag=0;
	//ucReDialFlag
	UINT8 ucReFlag = 0;

	while(1)
	{
		ucAct=ucGetActAndKey(&ucKeyValue);
		switch(ucAct)
		{
		case KEYHIT:
			if(ucKeyValue == KEY_CANCEL)
			{
				*pucCancelFlag=1;
				return ;
			}
			else if(ucKeyValue == KEY_REDIAL)
			{
				ucReDialTabel=1;
			}
			else
			{
				*pucNextPage = ucKeyValue;
				return;
			}
		case CALLON_SET:		
		case CALLON_FREE:
			if(gtTermPara1.bEnableCall == 0)
			{
				cls();
				TPA_vDisplayInv(3, DISP_CENTER, "请开通终端通话功能");
				while(1)
				{
					ucKeyValue = ucReadInput();
					//挂机
					if(ucKeyValue == KEY_HANGUP|| ucKeyValue == KEY_CANCEL)
					{
						*pucCancelFlag = 1;
						return;
					}		
				}
			}
			EA_ucModemSwitch(MODEMOFF);	//关闭振铃
			EA_modem_setlisten(0);//停止监听
			EA_ucOffHook(TELEPHONEON);
			if(ucAct == CALLON_SET)
			{
				vSwitchHandSet();
			}
			else
			{
				vSwitchHandFree();
			}	
			cls();
			EA_vDisplay(2, "%s", cCallNo);
			TPA_vDisplayInv(1, DISP_CENTER, "回拨电话");
			vClearCallNo();
			if(ucCallLen == 0)
			{
				vHaveNoDialNum();
				*pucCancelFlag = 1;
				return;				
			}
			while(1)
			{
				ucAct = ucGetActAndKey(&ucKeyValue);
				if((ucAct == KEYHIT && ucKeyValue == KEY_REDIAL) || ucReDialTabel == 1)
				{
					if(ucReFlag == 0)
					{
						if (ucReDialTabel == 1)
						{
							EA_vDelayMs(2000);
						}
						EA_vDelayMs(40);
						ucTempNo[0] = 0;
						strcpy(ucTempNo,cCallNo);
						EA_ucTeleDialStr(ucTempNo);	
						ucReDialTabel=0;
						for(i = 0 ; i < strlen(ucTempNo); i ++)
						{
							vSetCallNo(ucTempNo[i]);
						}
						ucReFlag = 1;
					}
					vGetReDialNo(ucTempNo);
					cls();
					display(3,ucTempNo);	
					while(1)
					{
						ucAct = ucGetActAndKey(&ucKeyValue);						
						if(ucAct == KEYHIT)
						{
							switch(ucKeyValue) 
							{
							case KEY_REDIAL:
								if(ucReFlag==1)
								{								
									EA_ucOffHook(TELEPHONEOFF);
									vGetCallNo(ucTempNo);
									if(ucTempNo[0] != 0)
									{
										vSetDialCall(ucTempNo, 1);
									}
									EA_vDelayMs(1500);
									vClearCallNo();
									
									if(EA_cPhoneGetHs()==1)
									{
										vSwitchHandSet();
									}
									else
									{
										vSwitchHandFree();
									}
									EA_vDelayMs(700);
									ucTempNo[0] = 0;
									vGetReDialNo(ucTempNo);
									EA_ucTeleDialStr(ucTempNo);
									for(i = 0 ; i < strlen(ucTempNo); i ++)
									{
										vSetCallNo(ucTempNo[i]);
									}
									ucReFlag = 1;
								}
								vGetReDialNo(ucTempNo);
								cls();
								display(3,ucTempNo);		
								break;
							case KEY_X07:
								ucKeyValue='#';
							case KEY_X08:
								if(ucKeyValue == KEY_X08)
								{
									ucKeyValue='*';
								}
							case KEY_0:
							case KEY_1:
							case KEY_2:
							case KEY_3:
							case KEY_4:
							case KEY_5:
							case KEY_6:
							case KEY_7:
							case KEY_8:
							case KEY_9:
								EA_cPhoneDial((char)ucKeyValue);
								vSetCallNo(ucKeyValue);
								vGetCallNo(ucTempNo);
								display(3,ucTempNo);
								break;
							default:
								break;
							}	
						}
						else if(ucAct==CALLON_SET)
						{
							vSwitchHandSet();
						}
						else if(ucAct==CALLON_FREE)
						{
							vSwitchHandFree();
						}
						else if(ucAct==CALLEND)
						{
							*pucCancelFlag=1;
							vCallEnd();
							ucReFlag=0;
							return;
						}
						else if (ucAct==CALLIN)
						{
							gucRing=0;
							*pucCancelFlag=1;
							return;
						}
					}
					break;
				}
				else if(ucAct==CALLON_SET)
				{
					vSwitchHandSet();
				}
				else if(ucAct==CALLON_FREE)
				{
					vSwitchHandFree();
				}
				else if(ucAct==CALLEND)
				{
					*pucCancelFlag=1;
					vCallEnd();
					ucReFlag=0;
					return;
				}
				else if (ucAct == CALLIN)
				{
					gucRing = 0;
					*pucCancelFlag = 1;
					return;
				}
			}	
			break;
		case CALLIN:
			gucRing = 0;
			*pucCancelFlag=1;
			return;
		default:
			break;
		}//switch
	}
}
Esempio n. 5
0
void vHaveNoDialNum(void)
{
	INT8 cTempNo[DIALNOLEN];
	UINT8 i,ucAct,ucKeyValue;
	UINT8 ucReFlag=0,ucKeyFlag=0;
	vClearCallNo();
	memset(cTempNo,0x00,sizeof(cTempNo));
	while(1)
	{
		ucAct=ucGetActAndKey(&ucKeyValue);						
		if(ucAct==KEYHIT)
		{
			switch(ucKeyValue) 
			{			
			case KEY_X07:
				ucKeyValue='#';
			case KEY_X08:
				if(ucKeyValue==KEY_X08)
				{
					ucKeyValue='*';
				}
			case KEY_0:
			case KEY_1:
			case KEY_2:
			case KEY_3:
			case KEY_4:
			case KEY_5:
			case KEY_6:
			case KEY_7:
			case KEY_8:
			case KEY_9:
				EA_cPhoneDial((char)ucKeyValue);
				vSetCallNo(ucKeyValue);
				vGetCallNo(cTempNo);
				display(3,cTempNo);
				ucKeyFlag=1;
				break;
			case KEY_REDIAL:
				if(ucKeyFlag==0)
				{
					cls();
					EA_vDisplay(3, "无号码不可以重拨");
					break;
				}		
				vCallEnd();//挂机
				ucReFlag=0;
				if(EA_cPhoneGetHs())
				{
					vSwitchHandSet();
				}
				else
				{
					vSwitchHandFree();
				}	
				EA_vDelayMs(400);
				memset(cTempNo, 0x00, sizeof(cTempNo));
				vGetReDialNo(cTempNo);
				vClearCallNo();
				EA_ucTeleDialStr(cTempNo);
				for(i = 0 ; i < strlen(cTempNo); i ++)
				{
					vSetCallNo(cTempNo[i]);
				}
				ucReFlag = 1;
				EA_vDisplay(1, "      重拨电话");
				display(3, cTempNo);
				
				break;
			default:
				break;
			}	
		}
		else if(ucAct==CALLON_SET)
		{
			vSwitchHandSet();
		}
		else if(ucAct==CALLON_FREE)
		{
			vSwitchHandFree();
		}
		else if(ucAct==CALLEND)
		{
			vCallEnd();
			ucReFlag=0;
			return;
		}	
	}
}
Esempio n. 6
0
    /*远程下载交易,需要双向认证*/
    uchar EA_TMS_ucDownload(uchar ucFlag, TMS_AppScript *ptTMSHead)
    {
        ET_DATETIME tDateTime;
        uchar  ucRet;

        EG_uiDebugMsgLen = 0;
        memset(&tDateTime, 0, sizeof(tDateTime));
        EA_ucGetDateTime(&tDateTime);

        EA_TMS_vLog("/************************************************/");
        EA_TMS_vLog("/*TMS DBVer:01-01-05  %d.%d.%d %d:%d:%d*/",
                    tDateTime.usYear, tDateTime.ucMonth, tDateTime.ucDay, tDateTime.ucHour, tDateTime.ucMinute, tDateTime.ucSecond);
        EA_TMS_vLog("/************************************************/");

#ifdef PED
        EA_TMS_vLog("\n\r# PRODUCT TYPE: PED !\n\r");
#endif

        if(NULL == ptTMSHead)
        {
            EI_ClearAll();
            EI_vDisplayCen(2, "TMS_AppScript is NULL!");
            EA_TMS_vLog("TMS_AppScript is NULL!");
            ET_uiInkey(10);
            return EM_ERROR;
        }


        EA_TMS_vLog("# GloableVarInit...");

        EG_ucAuthFlag = ucFlag;
        EI_vGloableVarInit();

        EA_TMS_vLog("# EI_ucTMSInit...");
        /*TMS初始化*/
        ucRet = EI_ucTMSInit(ptTMSHead);
        if (ucRet != EM_SUCCESS)
        {
            EA_face_vSetInfo("参数非法");
            EA_TMS_vLog("TMS SCRIPT 初始化失败!中止!");
            goto TMS_EXIT;
        }

        //创建计时器
        EA_TMS_vLog("# Create Timer...");
        ucRet = EA_ucCreateTimer(&EG_hTimer);
        if (ucRet != EM_SUCCESS)
        {
            EA_TMS_vLog("EI_ucTMS3Proc: EA_ucCreateTimer EG_hTimer Fail![%x]", ucRet);
        }

        EA_TMS_vLog("连接到服务器...");
        EA_face_vSetInfo("连接到服务器...");

        switch (EG_ucAuthFlag)
        {
        case TMS_AUTH_NO:
            break;
        case TMS_AUTH_YL:
            EA_TMS_vLog("# TMS_AUTH_YL !");
            EG_YL_ucPTIFlag = 0;
            memset(EG_ucPTI, 0, sizeof(EG_ucPTI));
            if (EM_SUCCESS == EI_ucCheckTag(EG_ucReserve, sizeof(EG_ucReserve), 0xA0, 8, EG_ucPTI))
            {
                EG_YL_ucPTIFlag = 1;
                EA_TMS_vLog("# EG_YL_ucPTIFlag = 1");
            }

            EG_YL_ucSyncFlag = 0;
            if (EM_SUCCESS == EI_ucCheckTag(EG_ucReserve, sizeof(EG_ucReserve), 0xA1, 1, &EG_YL_ucSyncFlag))
            {
                if (EG_YL_ucSyncFlag != 0 && EG_YL_ucSyncFlag != 1)
                {
                    EI_ClearAll();
                    EI_vDisplayCen(2, "Flag:A1 invalid[%x]", EG_YL_ucSyncFlag);
                    ET_uiInkey(2);
                    goto TMS_EXIT;
                }

                EA_TMS_vLog("# EG_YL_ucSyncFlag = %d", EG_YL_ucSyncFlag);
            }

            EA_vDelayMs(100);
            break;
        case TMS_AUTH_LZ:
            //等待modem池接通TCP
            EA_vDelay(1);
            EA_TMS_vLog("开始认证...");
            ucRet = EI_ucMutualAuth_LZ();
            if (ucRet != EM_SUCCESS)
            {
                EA_face_vSetInfo("服务器握手失败");
                goto TMS_EXIT;
            }

            EA_vDelayMs(100);
            break;
        case TMS_AUTH_LOCAL:
            //等待modem池接通TCP
            EA_vDelay(1);
            EA_TMS_vLog("开始认证...");
            ucRet = EI_ucLocalAuth();
            if (ucRet != EM_SUCCESS)
            {
                EA_face_vSetInfo("服务器握手失败");
                goto TMS_EXIT;
            }
            EA_vDelayMs(100);
            break;
        case TMS_AUTH_ICBC:
            EA_TMS_vLog("TMS_AUTH_Type: ICBC");
            if (EG_ucTPDULen != 0)
            {
                EA_face_vSetInfo("ICBC不支持TPDU!");
                EA_TMS_vLog("TMS_AUTH_ICBC don't need tpdu !");
                ucRet = EM_ERROR;
                goto TMS_EXIT;
            }
        case TMS_AUTH_YOUCU:
            if (EG_ucCommType == TMS_COMTYPE_BYMODEM || EG_ucCommType == TMS_COMTYPE_BYMODEM_SDLC)
            {
                if (EG_ucTPDULen != 5)
                {
                    EA_face_vSetInfo("TMS参数设置错误");
                    EI_vDisplayCen(3, "TPDU设置错误[%d]", EG_ucTPDULen);
                    EA_TMS_vLog("EI_ucTMSInit: TMS_AUTH_YOUCU EG_ucTPDULen[%d] error!", EG_ucTPDULen);
                    ET_uiInkey(10);
                    goto TMS_EXIT;
                }
            }
            else if (EG_ucCommType == TMS_COMTYPE_BYETHENET)
            {
                if (EG_ucTPDULen != 0)
                {
                    EA_face_vSetInfo("TMS参数设置错误");
                    EI_vDisplayCen(3, "TPDU设置错误[%d]", EG_ucTPDULen);
                    EA_TMS_vLog("EI_ucTMSInit: TMS_AUTH_YOUCU EG_ucTPDULen[%d] error!", EG_ucTPDULen);
                    ET_uiInkey(10);
                    goto TMS_EXIT;
                }
            }

            break;
        default:
            EA_face_vSetInfo("应用类型设置错误!");
            EA_TMS_vLog("EA_TMS_ucDownload EG_ucAuthFlag[%x] Fail!", EG_ucAuthFlag);
            ET_uiInkey(10);
            ucRet = 0x01;
            goto TMS_EXIT;
        }

        ucRet = EI_ucTMS3Proc(ptTMSHead);
        if (ucRet != EM_SUCCESS)
        {
            EA_face_vSetInfo("下载失败");
            goto TMS_EXIT;
        }

        EA_face_vSetInfo("下载结束");

TMS_EXIT:

        if (EM_SUCCESS == ucRet)
        {
            EA_TMS_vLog("\r\n下载成功!\r\n");
        }
        else
        {
            EA_TMS_vLog("\r\n错误原因,下载中断!\r\n");
            ET_uiInkey(2);
        }

        EI_ucTMSExit(ptTMSHead);
        return ucRet;
    }
Esempio n. 7
0
void TA_BT_vDisconectBT(void)
{
	EA_ucBtDisconnectLink();
	EA_vDelayMs(200);
}
Esempio n. 8
0
/*
 * 函数功能:特殊用于离线交易上送的通讯
 * 入口参数:
 *          szSendStr       ―― 待发送的数据
 *          nSendLen        ―― 待发送数据的长度
 * 出口参数:
 *          szRecvStr       ―― 收到的数据
 *          pnRecvLen       ―― 收到的数据的长度
 */
int PubUploadCommu(struct CommStru *pCommInfo, char *szSendStr, int nSendLen, char *szRecvStr, int *pnRecvLen, char *cOnline , int flag)
{
    char szGetBuffer[30], szBuffer[10];
    ISODataStru isotmp;
    int nLen;
    
	*cOnline = NO;
    if (szSendStr == NULL || szRecvStr == NULL)
        return EXCEPTION;

    if (pnRecvLen == NULL || nSendLen == 0)
        return EXCEPTION;

//add by baijz 20110728 BCTC要求 CDMA通讯没有办法按取消键退出
	EA_vDelayMs(300);
	if (EA_ucKBHit () == EM_key_HIT)
	{						//有按键
		if (PubuiInkey (1) == EM_key_CANCEL)
		{
			*cOnline = CANCEL;
			return EXCEPTION;
		}
	}
//add end

	if (PubYlConnect (pCommInfo) != NORMAL)
	{
		*cOnline = CANCEL;
		return EXCEPTION;
	}

    if (gbnTransType != LOGIN)
    {
        /*
         * 自动冲正处理
         */
//BCTST
        BUFCLR(szBuffer);
        ASSERT_NORMAL(PubGetPoscfgcAutoVoidFlag(szBuffer));
        if (szBuffer[0] == 1)
        {
			PubDisplay(2, "自动冲正, 请稍候...");
			BUFCLR(szGetBuffer);
			ASSURE_NORMAL(PubGetBankcMacChk(szGetBuffer));
			PubSetBankcMacChk(MAC_ECB);
			//chenjs20061226 测试组反馈无法取消冲正PubAutoVoid();
			//chenjs20061226 add down
			ASSURE_NORMAL(PubAutoVoid());//chenjs20061226 add down
			PubSetBankcMacChk(szGetBuffer[0]);
			PubClearAll();
        }
		ProDispCommMsg(5);
//END
	}
//add end

    PubSetBankcMacChk(MAC_ECB);
	if ( flag != 2)
		PubCalcMac(szSendStr, nSendLen - 8, szSendStr + nSendLen - 8);
    /*
     * 通讯:发送、接收
     */
	/*chenjs20070105根据测试组反馈,这个提示会覆盖上面的提示
    PubClearAll();
    ProDispCommMsg(5);
    PubDisplay(2, "处理中, 请稍候...");
	*/
    ASSURE_NORMAL(ProSendToHost(pCommInfo, nSendLen, szSendStr));

    //chenjs20070105 ProDispCommMsg(6);
	*cOnline = YES;
	PubDisplay(2 , "");// 清屏
    ASSURE_NORMAL(ProReadFromHost(pCommInfo, pnRecvLen, szRecvStr));
    memset((char *) &isotmp, 0, sizeof(isotmp));
    PubStrToIso(szRecvStr + 5, *pnRecvLen - 5, &isotmp, NULL);

    BUFCLR(szGetBuffer);
    ASSURE_NORMAL(PubGetBankcMacChk(szGetBuffer));
    if (szGetBuffer[0] != MAC_NO)
    {
        BUFCLR(szBuffer);
        nLen = sizeof(szBuffer);
        PubGetBit(&isotmp, RET_CODE, szBuffer, &nLen);
        if (memcmp(szBuffer, "00", 2) == 0)
        {
			// 银联生产后台在电子现金离线交易上送的时候,没有送mac下来,造成计算mac错误,bctc测试是没问题的,说明按照规范,我们做法是正确的。
           // if (PubChkMac(szRecvStr + *pnRecvLen - 8, szRecvStr + 5, *pnRecvLen - 8 - 5) != NORMAL)
           //     return EXCEPTION;
        }
    }

    return NORMAL;
}
Esempio n. 9
0
//当笔闪卡处理
int PubCurSkProcess (char *pcFlg, struct FileRecStru *TmpPos)
{
	uchar			ucRet, option;
	DevHandle		hdlClock;
	char			cSetTime;
	unsigned long	ulSetTime = 0;
	unsigned long	ulPassTime = 0;
	char   cRet1;
	char szTitle[100],szDispCardNo[30];
	struct CardConfig card;
	char CanDisplay;
#ifdef _ECASH_
	uint mbuiRespLen;
	char mbpvResp[512];
#endif
	
    
	cSetTime = FV.Other.gbnCurrSKTime;
    if (EA_ucCreateTimer(&hdlClock) != EM_SUCCESS)
	{
		PubWriteLog(EXCEPTION, (char*)__FILE__, __LINE__);
        return EXCEPTION;
	}
    if (EA_ucResetTimer(hdlClock) != EM_SUCCESS)
    {
        EA_ucCloseTimer(&hdlClock);
		PubWriteLog(EXCEPTION, (char*)__FILE__, __LINE__);
        return EXCEPTION;
    }
	
	//	cSetTime =  FV.bank.cSKReadCardTime;
	EInitOpenMifCard ();
	//非接闪灯20140108:红灯(只有红灯)常亮
#ifndef C_RFLED
	if(FV.EmvStru.gbcExeReader != YES)     //内置非接
	{
		EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_BLUE, EM_LED_OFF,100,EM_BLINK_STOP);
		EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_OFF,100,EM_BLINK_STOP);
		EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_GREEN, EM_LED_OFF,100,EM_BLINK_STOP);
		EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_RED, EM_LED_ON,100,EM_BLINK_STOP);
	}
	else                                   //外置非接
	{
		;//暂无机器测试
	}	
#endif
	CanDisplay = YES;
	RFPreProcess(); //非接交易,移到此处。
	while (1)
	{
		if(CanDisplay)
		{
			
			BUFCLR(szTitle);
			BUFCLR(szDispCardNo);
			sprintf(szTitle,"(交易类型:消费%ld.%02ld)",gblTranAmt/100 , gblTranAmt%100);
			sprintf(szDispCardNo,"卡号%6.6s******%4.4s",TmpPos->szCardNo,TmpPos->szCardNo+(strlen(TmpPos->szCardNo)-4));	
			EA_vCls();
			PubDisplayInv (1, szTitle);
			PubDisplay(2,szDispCardNo);
			PubDisplayCen(3,"请重新挥卡");
			PubDisplayCen(4, "退出请按取消键");
			EA_vBeepMs(1500);
			CanDisplay = NO;
		}
		if (EA_ucGetPassTimer(hdlClock, &ulPassTime) == EM_SUCCESS)
		{
			ulSetTime = cSetTime;
			if (ulPassTime > ulSetTime * 1000)
			{
				EA_ucCloseTimer(&hdlClock);
				return EM_TIMEOUT;
			}
		}
		ucRet = EM_FAILED;
		// 20110617 2张卡寻卡冲突增加
		if (FV.EmvStru.gbcExeReader != YES)
			EA_ucMIFSetParamConfig( gbMifCardHandle, EM_mifs_PARAM_RXTHRESHOLD_A, FV.bank.nRxThresHold); 
		else
			EA_ucSetRFParamLib(gbMifCardHandle, 0x20, 1);
		//EA_ucSetRFParamLib(gbMifCardHandle, 0, FV.bank.nRxThresHold);
		
		ucRet = PubucMIFCardActivate(gbMifCardHandle, &mbuiRespLen,mbpvResp);
        
		if (ucRet == 55)// 读卡器没有初始化好
		{
			EA_vCls();
			EA_ucCloseTimer(&hdlClock);
			return EM_key_FUNC;
		}
		if (ucRet == EM_SUCCESS)
		{
			//非接闪灯20140108:蓝灯黄灯常用亮
#ifndef C_RFLED
			if(FV.EmvStru.gbcExeReader != YES)     //内置非接
			{
				EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_ON,100,EM_BLINK_STOP);
			}
			else                                   //外置非接
			{
				;//暂无机器测试
			}
			
#endif
			ucRet = ProcessRFIcc (&card);
			if (ucRet != 0)
			{
				if (FV.EmvStru.gbcExeReader != YES )
				{
					if(ucRet==EM_ERRHANDLE)
						EInitOpenMifCard ();
					EA_ucMIFCardDeactivate(gbMifCardHandle);
				}
				else
				{
					//外置读卡器处理 2009.6.7 
				}
				CanDisplay = YES;
				continue;
			}
			gnCardType = MIF_CARD;
			if (RFICC_Process_AppSel_SK(TmpPos) != 0)
			{
				CanDisplay = YES;
				continue;
			}
			ucRet = EA_EMV_ucQFailRedo();
			if (ucRet != 0)//返回值1 为未扣款情况下的闪卡,再次挥卡直接按正常流程处理  hejf 20151008
			{
				switch(ucRet)
				{
				case 0xE1:
					EA_vBeepMs(500);
					/*
					//非接闪灯20140108:红灯(只有红灯)常亮
					#ifndef C_RFLED
					if(FV.EmvStru.gbcExeReader != YES)     //内置非接
					{
					EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_BLUE, EM_LED_OFF,100,EM_BLINK_STOP);
					EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_YELLOW, EM_LED_OFF,100,EM_BLINK_STOP);
					EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_GREEN, EM_LED_OFF,100,EM_BLINK_STOP);
					EA_ucSetRFLedSenior(gbMifCardHandle, EM_LED_RED, EM_LED_ON,100,EM_BLINK_STOP);
					}
					else                                   //外置非接
					{
					;//暂无机器测试
					}	
					#endif
					*/
					PubClearAll();
					//PubDisplayInv(1,"闪卡异常");
					//PubDisplayCen(3,"读数据错误");
					//PubDisplayCen(3,"交易拒绝");
					PubDisplayCen(2,"卡号不一致");
                    PubDisplayCen(3,"请使用原卡片");
					PubuiInkey(2);
					//return EXCEPTION;
					CanDisplay = YES;
					continue;
				case 0xE2:
					EA_vBeepMs(500);
					PubClearAll();
					//PubDisplayInv(1,"闪卡异常");
					PubDisplayCen(2,"卡号不一致");
                    PubDisplayCen(3,"请使用原卡片");
					PubuiInkey(2);
					CanDisplay = YES;
					continue;
				case 0xE6:
					//0xE1: 读数据错误, 重新回到重刷界面
					//0xE2: 数据不匹配,重新回到重刷界面
					//0xE6: 找不到匹配的闪卡记录
					PubClearAll();
					PubDisplayInv(1,"闪卡异常");
					PubDisplayCen(3,"找不到匹配的闪卡记录");
					PubuiInkey(3);	
					CanDisplay = YES;
					continue;
					break;
				case 0xE3:
					//0xE3: 数据异常,需要删除失败交易记录,进入正常交易
					EA_ucCloseTimer(&hdlClock);
					PubClearAll();
					PubDisplayInv(1,"闪卡异常");
					PubDisplayCen(3,"闪卡读数据异常");
					PubuiInkey(3);						
					return EXCEPTION;
				case 0xE4:
					//0xE4: 数据异常,需要保留失败交易记录,提示交易失败
					EA_ucCloseTimer(&hdlClock);
					PubClearAll();
					PubDisplayInv(1,"交易失败");
					PubDisplayCen(2,"ATC异常,卡片ATC大于当");
					PubDisplayCen(3,"前记录ATC.");
					PubuiInkey(3);	
					return EXCEPTION;
				case 0xE5:
					//0xE4: 数据异常,需要保留失败交易记录,提示交易失败
					EA_ucCloseTimer(&hdlClock);
					PubClearAll();
					PubDisplayInv(1,"交易失败");
					PubDisplayCen(3,"余额异常, 提示交易失败.");
					PubuiInkey(3);	
					return EXCEPTION;
				case 1: 
					//交易金额已经回滚,直接GPO开始新交易
					PubDelSkFailRec(TmpPos->szCardNo,(char*)TmpPos->atc);  //删除失败的闪卡流水
					cRet1 = 0;
					cRet1 = RFICC_Process_AppGpo_SK(TmpPos);
					if (cRet1 == RFARQC || cRet1 == RFPBOC || cRet1 == RFQPBOC)
						*pcFlg = cRet1;
					
					else
						return EXCEPTION;	
                    break;
				default:
					EA_ucCloseTimer(&hdlClock);
					PubClearAll();
					PubDisplayInv(1,"闪卡异常");
					PubDisplay(3,"闪卡返回异常%d",ucRet);
					PubuiInkey(3);	
					return EXCEPTION;
				}
			}
			EA_ucCloseTimer(&hdlClock);
			return NORMAL;
		}
		option = 0;
		if (EA_ucKBHit() == EM_key_HIT)
		{						//有按键
			option = PubuiInkey(1);
			if (option == CANCEL)
			{
				EA_ucCloseTimer(&hdlClock);
				return CANCEL;	//按取消键
			}
		}
		//sfh120509 读卡延迟100毫秒
		EA_vDelayMs(100);
	}
	return EXCEPTION;
}