Esempio n. 1
0
int	PubICReadCard(char* pszOut, int *pLen)
{
	unsigned char ucRecBuf[256];
	unsigned int uiRetLen;
	unsigned char CFlagGetKey;

	
	EA_vCls();
	
	CFlagGetKey = NO;
	EA_vCls();
	if ( PubOpenUserICCardDev () != NORMAL )
		return EXCEPTION;

	PubDisplayInv(1, "联名卡");
	PubDisplayCen(2, "请插入IC卡");
	PubDisplayCen(3, "按<取消>退出");
    while(1)
    {
      	if ( PubUserICCardIn() == NORMAL )
       		break;
       	if (EA_ucKBHit () == EM_key_HIT)
		{
			if (PubuiInkey (1) == CANCEL) 
			{
				return EXCEPTION;
			}
		}
    }
	if ( PubUserICCardPowerUp() != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("MF选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00",
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("EF05选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\xEF\x05",
		0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
	if ( ProICCComm1 ("读文件选择",CPU_CARD, 0x00, 0xB0, 0x00, 0x00, 0x00, "",
		0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
	EA_ucCloseDevice (&gbhdlUserCard);

	memcpy(pszOut, ucRecBuf, uiRetLen);
	*pLen = uiRetLen;
	EA_ucCloseDevice (&gbhdlUserCard);

	return NORMAL;
}
Esempio n. 2
0
int	PubOpenUserICCardDev (void)
{
	uchar result;
	DevHandle hdlTmp;

	result = 0;
	hdlTmp = EM_NULL;
	if (gbhdlUserCard != EM_NULL)
		EA_ucCloseDevice (&gbhdlUserCard);
	result = EA_ucOpenDevice("USERCARD", 0 ,&hdlTmp);
	if (result == EM_SUCCESS)
	{
		gbhdlUserCard = hdlTmp;
		result = EA_ucICInitModule (gbhdlUserCard, EM_ic_VOLDEFAULT,EM_ic_DEFAULTMODE);
		if ( result != EM_SUCCESS )
		{
			PubDisplay (2, "初始化Module%02x", result);
			PubuiInkey (20);
			return EXCEPTION;
		}
		return NORMAL;
	}
	else
	{
		PubDisplay (2, "初始化句柄%02x", result);
		PubuiInkey (20);
		return EXCEPTION;
	}
}
Esempio n. 3
0
int send_to_EFT(int len, char *p)
{
	uchar ucRet;
    DevHandle hRS232Handle;
    ET_ProductInfo tProductInfo;
	
#ifdef EPT_A9L
    memset(&tProductInfo, 0x00, sizeof(ET_ProductInfo));
	EA_ucGetProductInfo(&tProductInfo);
	if ( memcmp(tProductInfo.acName , "E520" , 4) == 0 && tProductInfo.ucMachType == 2)
	{
		ucRet = EA_ucOpenDevice("COM3", 0, &hRS232Handle);
	}
	else
	{
		ucRet = EA_ucOpenDevice(SERIAL_PORT, 0, &hRS232Handle);
	}

#else
	ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &hRS232Handle);
#endif
	
    if (ucRet != EM_SUCCESS)
    {
        EA_vCls();
        EA_vDisplay(2, "打开RS232口出错");
		EA_ucCloseDevice(&hRS232Handle);
        PubuiInkey(3);
        return (EXCEPTION);
    }
    EA_ucInitRS232(hRS232Handle, EM_232_9600BPS, EM_232_NOPAR, EM_232_8DBS);
    EA_ucClearRS232(hRS232Handle);//清除RS232缓冲区

	ucRet = EA_ucWriteDevice(hRS232Handle, (uint)len, 0, p);
    EA_ucCloseDevice(&hRS232Handle);
//    debug_print((char*)"SendToPC", p, len);
    if (ucRet  == EM_io_SUCCESS)
        return NORMAL;
    else
        return EXCEPTION;
	return (NORMAL) ;
}
Esempio n. 4
0
    uchar EI_ucTMSExit(TMS_AppScript *ptTMSHead)
    {
        if (EG_ucDevCloseFlg)
        {
            switch (ptTMSHead->ucCOMMType)
            {
            case TMS_COMTYPE_BYMODEM:
                EA_ucDialOff(EG_hCommHandle);
                break;
            case TMS_COMTYPE_BYETHENET:
#ifndef PLAT_M3
                close(ptTMSHead->uiSockID);
#endif
                break;
            case TMS_COMTYPE_BYGPRS:
            case TMS_COMTYPE_BYCDMA:
#ifndef PLAT_M3
                EA_ucGsmModeExit();
#endif
                break;
            case TMS_COMTYPE_BYGPRSPPP:
            case TMS_COMTYPE_BYCDMAPPP:
            case TMS_COMTYPE_BYMODEMPPP:
#ifndef PLAT_M3
                EA_ucDialOffPpp(EG_iPPPn);
                close(ptTMSHead->uiSockID);
#endif
                break;
            }

            EA_ucCloseDevice(&EG_hCommHandle);
            EA_ucCloseDevice(&EG_hPINPadDev);
            EA_ucCloseTimer(&EG_hTimer);
        }
        return EM_SUCCESS;
    }
Esempio n. 5
0
UINT8 ucClosePrinter(DevHandle *hDev)
{
	uchar ucRet = 0;
	
	ucRet = EA_ucCloseDevice(hDev);
	if (ucRet != EM_SUCCESS)
	{
		EA_vCls();
		display(2, "打印口关闭失败[%02X]", ucRet);
		inkey(0);
		return 1;
	}

	return 0;	
}
Esempio n. 6
0
int SetS100LoadKeyMode(void)
{
	uchar aucOut[20], ucRet;
	DevHandle hDevHandle;
	uint uiOutLen;
	int  nReturn;
	
	nReturn = 0;
	ucRet = EA_ucOpenDevice("COM", EM_io_PORT2, &hDevHandle);
    if ( ucRet != EM_SUCCESS)
    {
		EA_vCls();
        PubDisplay(2,"打开端口错误 %d", ucRet);
        PubuiInkey(30);
		return -1;
    }
	EA_ucInitRS232(hDevHandle, EM_232_115200BPS, EM_232_NOPAR, EM_232_8DBS);
	EA_ucClearRS232(hDevHandle);//清除缓冲区
	
    memcpy(aucOut,"\x02\x06\x9a\x01\x00\x00\x03\x02",8);
    ucRet = EA_ucWriteDevice(hDevHandle, 8, 1, (char*)aucOut);
	
    memset(aucOut, 0x00, 8);
    memcpy(aucOut+8,"\x06\x02\x04\x00\x01\x03\x02",7);    
	uiOutLen = 0;
    ucRet = EA_ucReadDevice(hDevHandle, 7, 3, aucOut, &uiOutLen);
    if ( ucRet != EM_SUCCESS|| uiOutLen != 7)
    {
		EA_vCls();
        PubDisplay(2,"从端口读数据错 %d %d", ucRet, uiOutLen);
        PubuiInkey(30);
		nReturn = -2;
    }
    else
    {
        if(memcmp(aucOut+8, aucOut, 7))
        {
			EA_vCls();
			PubDisplay(2,"数据校验错误");
			PubuiInkey(30);
			nReturn = -3;
        }
    }
	EA_ucCloseDevice(&hDevHandle);
	return nReturn;
}
Esempio n. 7
0
uchar TA_BT_ucReadBT(uint* puiDataLen, uchar* pucData)
{
	uchar ucRet = 0;
	uchar ucStatus = 0, ucRS232Status = 0;
	int iConnectStatus = 0;

	EA_ucGetBTLinkStatus(&iConnectStatus);
	if (EM_BTCONNECTED != iConnectStatus)
	{
		if (EM_SUCCESS == EA_ucIfIODeviceBufEmpty(g_hBtHandle, &ucRS232Status))
		{
			if (EM_BUFEMPTY == ucRS232Status)
			{
				return EM_ERROR;
			}
			EA_ucClearIODeviceBuf(g_hBtHandle);
		}

		return EM_ERROR;
	}

	EA_ucIfIODeviceBufEmpty(g_hBtHandle, &ucStatus);
	if (ucStatus == 1) //蓝牙串口有数据,一般是请求输入密码之类的
	{
		ucRet = EA_BT_ucReadFrame(g_hBtHandle, 100, READ_BUFFER_MAX, pucData, puiDataLen);
		PRINT_RET("EA_BT_ucReadFrame", ucRet);
		if (0x00 == memcmp((char*)pucData, "\xf6\x00\x07\x53\x44\xdd\x5a\xa5\x00\xff\xca\x03", 12))
		{
			TA_BT_ucWriteBT(2, (uchar*)&"\x90\x00");
			EA_ucCloseDevice(&g_hBtHandle);

			EA_vDownMain(EM_DOWN_TYPE_BT);

			ucRet = EA_ucOpenDevice(DEV_NAME_BLUETOOTH, DEV_OPEN_MODE_DEFAULT, &g_hBtHandle);
			if (ucRet != EM_SUCCESS)
			{
				PRINT_RET(DEV_NAME_BLUETOOTH, ucRet);
			}
			TA_vSetDeskTopState(TM_DTM_REFRESH, 0, FALSE);
			return EM_ERROR;
		}
		return ucRet;
	}

	return EM_ERROR;
}
Esempio n. 8
0
int ProDisplayECBal(char * pszAddiAmount, int nLen)
{
	DevHandle          hdlPinpad;

	if (iPinpadType == 1) 
	{
		if (PubOpenDevice((char *)"PINPAD", EM_io_EPP, &hdlPinpad) != EM_SUCCESS)
		{
			EA_vCls();
			PubDisplay(2, "无法打开密码键盘");
			PubDisplay(3, "按任意键返回");
			PubuiInkey(TIPS_TIMEOUT);
			ASSERT_NORMAL(EXCEPTION);
		}
	
        PubucDispPinpad(hdlPinpad, 1, (char *)"    ");
		PubucDispPinpad(hdlPinpad, 2, (char *)"    ");
    }

	PubClearAll();
	PubDisplay(2, "电子现金余额:");
	PubDisplay(3, "%s", pszAddiAmount);
	if (iPinpadType == 1)       //外置PINPAD
    {
        PubucDispPinpad(hdlPinpad, 1, (char*)"BALANCE:");
		PubucDispPinpad(hdlPinpad, 2, pszAddiAmount);
    }
	if (IsDisplayExtRf(0) == YES)
	{
		EA_ucDisplay_ExtRF(gbMifCardHandle,2, 1," 余额:");
		EA_ucDisplay_ExtRF(gbMifCardHandle,3, 1," %s", pszAddiAmount);
		EA_ucDisplay_ExtRF(gbMifCardHandle,4, 1,"      ");
	}
	

    PubuiInkey(TIPS_TIMEOUT);

    if (iPinpadType == 1) 
	{
		ClearPinpadDisp(hdlPinpad);
		while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS)
			;
	}
    return NORMAL;
}
Esempio n. 9
0
uchar ucOfflineLoadTms(uint uiKeyIndex ,uint uiTmkIndex, char *KeyBuf , char *szShopID , char *szPosID)
{
	DevHandle hRS232Handle;
	uchar ucRet;  
// 	uchar ucInitBuf[11];
// 	uchar ucKeyBuf[64];
// 	uchar ucCloseBuf[11];
// 	uchar ucCMD[2];
// 	uchar ucRespCode[2];
// 	uint uiDealCounts;//处理次数,三次失败函数返回EM_ERROR
	uint uiNextKeyNo;
// 	uint uiKeyNo;
	uint uiKeySum;
	uint uiWRecNum;//可写记录数
	uint uiVRecNum;//有效记录数

	uchar ucKeyFileID;
	uchar ucFlashBuf[50];
	uchar ucIsFileEmpty;

// 	return EM_SUCCESS;


	//打开密钥文件
	ucKeyFileID = ucKeyFileOpen("KeyFile");//包含报错
	if (ucKeyFileID == 0)
	{
		ucKeyFileClose(ucKeyFileID);//关闭文件
		return EM_ERROR;
	}


	//--------------------------------------------------------
	//查询剩余可写记录数
	ucRet = EA_ucPFInfo(ucKeyFileID, EM_ffs_FREEREC, &uiWRecNum);
	
	if(ucRet == EM_SUCCESS)
	{
		if( uiWRecNum  < 1)
		{
			EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiWRecNum);
			
			PubClearAll();
			PubDisplayInv(1, "错误");
			PubDisplay(2,"系统已有%d条密钥",uiWRecNum);
			PubDisplayCen(3,"密钥文件已满,无法加载密钥");
			PubDisplayCen(4,"请先清除所有密钥");
			
			PubuiInkey(10);
			ucKeyFileClose(ucKeyFileID);//关闭文件
			return EM_ERROR;
		}
	}
	//---------------------------------------------------------
	
	ucIsFileEmpty = 0;
	EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiVRecNum);
	if(uiVRecNum == 0)//密钥文件为空
	{
		//使用ucFileOpNoSearch函数
		ucIsFileEmpty = 1;
	}

	//-----------------------------

	uiKeySum = 0;
	uiNextKeyNo = 1;
	
		 /*写flash*/
		BUFCLR(ucFlashBuf);
		memcpy( ucFlashBuf, szShopID, 15 );
		memcpy( ucFlashBuf +15, szPosID, 8 );
		memcpy( ucFlashBuf +23, KeyBuf, 24 );
		ucFlashBuf[47] = uiKeyIndex/10*16 + uiKeyIndex%10;
		ucFlashBuf[49] = uiTmkIndex/10*16 + uiTmkIndex%10;
#ifdef SET_DEBUG
		PubDisplay(1 , "[%ld]tmk[%ld]", uiKeyIndex ,uiTmkIndex );
		PubDisplay(2 , "[%02x][%02x]" , ucFlashBuf[47] , ucFlashBuf[49]);
		PubuiInkey(0);
#endif

		if(ucIsFileEmpty == 1) 
		{
			//密钥文件为空时,不搜索匹配,直接添加记录
			if(ucFileOpNoSearch( ucKeyFileID,ucFlashBuf) != EM_SUCCESS)
			{
				ucKeyFileClose(ucKeyFileID);//关闭文件
				EA_ucCloseDevice(&hRS232Handle);
				return EM_ERROR;
			}
		}
		else if(ucIsFileEmpty == 0)
		{
			//密钥文件非空时,搜索是否有一样记录,防重复
			if( ucFileOp( ucKeyFileID, ucFlashBuf) != EM_SUCCESS)
			{
				ucKeyFileClose(ucKeyFileID);//关闭文件
				PubDisplayInv(1, "错误");
				PubDisplayCen(2, "写密钥文件错误");
				PubuiInkey(10);
				return EM_ERROR;
			}		
		}
		else
		{
			PubClearAll();
			PubDisplayInv(1, "错误");
			PubDisplayCen(2, "搜索标志位错误");
			PubuiInkey(3);
			ucKeyFileClose(ucKeyFileID);//关闭文件
			return EM_ERROR;
		}

		PubDisplayInv(1, "密钥加载");
		PubDisplayCen(2,"正在接收密钥...");
		PubDisplay(3,"加载密钥成功");
		PubuiInkey(1);

	ucKeyFileClose(ucKeyFileID);//关闭文件
	return EM_SUCCESS;
}
Esempio n. 10
0
/* 系统检查,此函数为检测不过只有按取消键跳越 */
void PubCheckTerminal( void )
{
DevHandle hDevHandle;
uchar ucRet;
int  iPrinterType ,iPinpadType, iPinpadVer;

	EA_vCls();
	PubDisplayInv(1 , "系统自检");


	PubDisplayCen(3 , "密码键盘");
	PubuiInkey(1);
	PubUsePinpadInside(FV.gbstCfg.nInputPinType); //[12/15/2013 zyf DJ] 德基默认内置
	hDevHandle = EM_NULL;
	PubGetPinpadType( &iPinpadType );
	while ((ucRet = PubOpenDevice((char*)"PINPAD", EM_io_EPP, &hDevHandle)) != EM_SUCCESS)
	{
		PubDisplay(3, "========[%d]========", ucRet);
		PubDisplayCen(4, "请接入密码键盘");
		EA_vBeepMs(50);
		if( PubuiInkey(1) == EM_key_CANCEL ){
			EA_ucCloseDevice(&hDevHandle);
			break;
		}
	}
	PubGetPinpadVer(hDevHandle, &iPinpadVer);
	while ((ucRet = PubResetPinpad( hDevHandle )) != EM_SUCCESS)
	{
		PubDisplay(3, "========[%d]========", ucRet);
		PubDisplayCen(4, "请接入密码键盘");
		EA_vBeepMs(50);
		if( PubuiInkey(1) == EM_key_CANCEL ){
			EA_ucCloseDevice(&hDevHandle);
			break;
		}
	}
	EA_ucCloseDevice(&hDevHandle);
	
	PubClearAll();
	PubDisplayCen(3 , "打 印 机");
	PubuiInkey(1);
	PubGetPrinterType( &iPrinterType );
	while ((ucRet = PubOpenDevice((char *)"PRINT", EM_io_REALMODE, &hDevHandle)) != EM_SUCCESS)
	{
		PubDisplay(3, "========[%d]========", ucRet);
		PubDisplayCen(4, "请检查打印机");
		EA_vBeepMs(50);
		if( PubuiInkey(1) == EM_key_CANCEL ){
			EA_ucCloseDevice(&hDevHandle);
			break;
		}
	}
	while ((ucRet = EA_ucGetPrinterStatus(hDevHandle)) != EM_SUCCESS)
	{
		PubDisplayCen(2, "缺纸或系统故障");
		PubDisplay(3, "========[%d]========", ucRet);
		PubDisplayCen(4, "请检查打印机");
		EA_vBeepMs(50);
		if( PubuiInkey(1) == EM_key_CANCEL ){
			EA_ucCloseDevice(&hDevHandle);
			break;
		}
	}
	EA_ucCloseDevice(&hDevHandle);
	PubClearAll();
	PubDisplayCen(3 , "通 信 口");
	PubInitComm(&CommInfo, AUTOCHECK);
#ifdef TEST
	while(1)
	{
		PubDisplayCen(2, "这是测试是程序不能使");
		PubDisplayCen(3, "用在生产环境由此产生");
		PubDisplayCen(4, "的一切后果概不负责");
		EA_vBeepMs(200);
		if( PubuiInkey(1) == EM_key_FUNC )
			break;
	}
#endif
	return;
}
Esempio n. 11
0
/*
 * 函数功能:IC卡下载密钥
 * 入口参数:无
 * 出口参数:无
 * 返 回 值:NORMAL     ―― 成功
 *           EXCEPTION  ―― 失败
 */
int	PubICDownKey(void)
{
	unsigned char ucSedBuf[256],ucRecBuf[256],szBuf[4096];
	unsigned int uiRetLen,uiRet;
	unsigned char Cp1,Cp2,Cle,CFlagGetKey;
	int len;
	char szGetBuffer[30],szGetBuffer1[30],szGetBuffer2[30],szGetBuffer3[30];
    int i, nBufSize;
	CARDHEADER stCardHead;
	KEYREC stKeyRec;
	unsigned char szKeyPwd[9],ucTEK2[17],ucTMK[17],ucTMK1[17],chLRCValue, chCheckvalue[9], kyLRCValue;
	int nKeyNum, nKeyLen;
	ET_DATETIME tDateTime;	
	char szBuffer[100], cRet;
	int nTmpFlag, nIndex = 5;
	DevHandle phPinpad;

	EA_vCls();
	PubDisplayInv(1, "IC卡导入密钥");
	PubDisplay(2, "主密钥索引号(0-31)");
	//PubDisplay(3, "[%d]",nIndex);
	nTmpFlag = 1;
	do
	{
		BUFCLR(szBuffer);
		cRet = PubGetNStr(4, 0, szBuffer, 2);
		if (cRet == CANCELED||cRet == APPTIMEOUT)
		{
			nTmpFlag = 0;
			break;
		}
		if (strlen(szBuffer) > 2)
			continue;
		nIndex = atoi(szBuffer);
	}
	while (nIndex > 31);
	if (nTmpFlag == 0)
		return EXCEPTION;
	PubGetBankcDesType(&cDesType);	
	
	CFlagGetKey = NO;
	EA_vCls();
	if ( PubOpenUserICCardDev () != NORMAL )
		return EXCEPTION;
	//EA_vCls();
	PubDisplayInv(1, "IC卡导入密钥");
	PubDisplayCen(2, "请插入密钥IC卡");
    PubDisplayCen(3, "按<取消>退出");
    while(1)
    {
      	if ( PubUserICCardIn() == NORMAL )
       		break;
       	if (EA_ucKBHit () == EM_key_HIT)
		{
			if (PubuiInkey (1) == CANCEL)
			{
				return EXCEPTION;
			}
		}
    }
	if ( PubUserICCardPowerUp() != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("DF1选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00",
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("DF3选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x03",
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("READ BINARY",CPU_CARD, 0x00, 0xb0, 0x83, 0x00, 0x00, ucSedBuf,
				0x1b, ucRecBuf, &uiRetLen)!= NORMAL )
		return EXCEPTION;
	memcpy(&stCardHead, ucRecBuf, 27);
	chLRCValue = 0;
	for(i=0;i<26;i++)
		chLRCValue ^= ucRecBuf[i];
	if(chLRCValue != stCardHead.chLRCValue)
	{
		PubClearAll();
		PubDisplayCen(2, "IC卡错误");
		PubuiInkey(20);
		return EXCEPTION;
	}
	EA_ucGetDateTime (&tDateTime);
	sprintf (szBuffer, "%4d%02d%02d", tDateTime.usYear, tDateTime.ucMonth,
			 tDateTime.ucDay);
	PubAscToHex (szGetBuffer, szBuffer, 8, 0);
	if(memcmp(stCardHead.chExpireDate, szGetBuffer, 4) < 0)
	{
		PubClearAll();
		PubDisplayCen(2, "此卡已过期");
		PubuiInkey(20);
		return EXCEPTION;
	}
		
	if ( ProICCComm1 ("DF2选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x02",
				0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	nBufSize = sizeof(szGetBuffer);
	BUFCLR(szGetBuffer);
    ASSERT_NORMAL(PubGetBankszCust(szGetBuffer, nBufSize));
	nBufSize = sizeof(szGetBuffer);
	BUFCLR(szGetBuffer1);
    ASSERT_NORMAL(PubGetBankszTerminal(szGetBuffer1, nBufSize));
    	
	strcat(szGetBuffer, "F");	//商户号是右补F
	PubAscToHex(szGetBuffer2, szGetBuffer, 16, 0);
	PubAscToHex(szGetBuffer3, szGetBuffer1, 8, 0);

	nKeyNum = stCardHead.KeyNum[0]*256+stCardHead.KeyNum[1];
	BUFCLR(szBuf);
	i=0;
	while(1)
	{
		len = i * 31;
			
		Cp1 = (uchar)(len/256);
		Cp2 = (uchar)(len%256);
		Cle = 31;
		if ( ProICCComm1 ("READ BINARY",CPU_CARD, 0x00, 0xb0, Cp1, Cp2, 0x00, ucSedBuf,
					Cle, ucRecBuf, &uiRetLen)!= NORMAL )
			return EXCEPTION;
		if (CARD_SW1 == 0x6B )
			break;
		memcpy(&stKeyRec, ucRecBuf, 31);
		if(!memcmp(stKeyRec.kyMechID,szGetBuffer2,8) && !memcmp(stKeyRec.kyTermID,szGetBuffer3,4))
		{
			CFlagGetKey = YES;
			break;
		}
		i++;
		if(i > nKeyNum)	
			break;
	}
	if ( CFlagGetKey == NO )
	{
		PubClearAll();
		PubDisplayCen(2, "主密钥未找到");
        PubuiInkey (20);
        return EXCEPTION;
	}
	// 银商规范修改,这个值无效,不用判断了。
// 	if(stKeyRec.kyNum < 1)
// 	{
// 		PubClearAll();
// 		PubDisplayCen(2, "该密钥已无法使用");
// 		PubuiInkey(20);
// 		return EXCEPTION;
// 	}
	BUFCLR(szBuf);
	memcpy(szBuf, &stKeyRec, 31);
	kyLRCValue = 0;
	for(i=0;i<29;i++)
		kyLRCValue ^= szBuf[i];
	if(kyLRCValue != stKeyRec.kyLRCValue)
	{
/*银商总公司沈进要求不写卡
		//可用次数减1
		stKeyRec.kyNum--;
		memcpy(ucSedBuf, &stKeyRec, 31);
		if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, Cp1, Cp2, 0x1f, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
			return EXCEPTION;
*/
		PubClearAll();
		PubDisplayCen(2, "主密钥有误");
		PubuiInkey(20);
		return EXCEPTION;
	}
	
	PubClearAll();
	PubDisplay(2,"请输入密钥卡密码");
	PubKeyOff();	
	BUFCLR(szBuffer);
	uiRet = PubGetAStr(3,BIGFONT,szBuffer,8);
	PubKeyOn();
	if (uiRet != NORMAL) 
	{
		return EXCEPTION;
	}
	strcpy(szKeyPwd, szBuffer);

	BUFCLR(ucTEK2);
	memset(ucTEK2, 0xff, 8);
	memcpy(ucTEK2, szKeyPwd, strlen(szKeyPwd));
	BUFCLR(szBuffer);
	DES(ucTEK2, szBuffer, chCheckvalue);
	if(memcmp(stCardHead.chCheckvalue, chCheckvalue, 4))
	{
/*银商总公司沈进要求不写卡
		//可用次数减1
		stKeyRec.kyNum--;
		memcpy(ucSedBuf, &stKeyRec, 31);
		if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, Cp1, Cp2, 0x1f, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
			return EXCEPTION;
*/
		PubClearAll();
		PubDisplayCen(2, "密码错误");
		PubuiInkey(20);
		return EXCEPTION;
	}

	//使用手工输入的密码对IC卡中存在的二级转加密主密钥TMK2进行Des解密,获得TMK1
	BUFCLR(ucTMK1);
	_DES(ucTEK2, stKeyRec.kyEncryptMKey, ucTMK1);
	_DES(ucTEK2, stKeyRec.kyEncryptMKey+8, ucTMK1+8);

	//初始化加密指令
	if ( ProICCComm1 ("INIT FOR DES",CPU_CARD, 0x80, 0x1a, 0x08, 0x03, 0x00, ucSedBuf,
				0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
	
	//解密
	if ( ProICCComm1 ("DESCRYPT",CPU_CARD, 0x80, 0xfa, 0x80, 0x00, 0x10, ucTMK1,
				0x10, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
	memcpy(ucTMK, ucRecBuf, 16);

	if (PubOpenDevice("PINPAD", EM_io_EPP, &phPinpad) != EM_SUCCESS)
    {
        PubDisplay(2, "密码键盘打开失败!");
        EA_vBeepMs(50);
        return EXCEPTION;;
    }

	nKeyLen = 16;    
    while (PubLoadKey(phPinpad, EM_pin_MASTERKEY, nIndex, nKeyLen, ucTMK) != NORMAL)
    {
        PubDisplay(2, "请接好密码键盘!");
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
	EA_ucCloseDevice(&phPinpad);
	PubSetBankcDesType(DES3);			//设定密钥类型为3DES

/*银商总公司沈进要求不写卡
	//可用次数置0
	stKeyRec.kyNum=0;
	memcpy(ucSedBuf, &stKeyRec, 31);
	if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, Cp1, Cp2, 0x1f, ucSedBuf,
				0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
*/
	EA_ucCloseDevice (&gbhdlUserCard);

	EA_vCls();
	PubDisplay(2, "主密钥导入成功!");
	PubuiInkey(20);
	return NORMAL;
}
Esempio n. 12
0
/*
 * 函数功能:检查返回的报文
 * 入口参数:pos--用于检验的POS结构
 * 出口参数:无
 * 返    回:NORMAL  ―― 成功
 *           EXCEPTION  ―― 失败
 */
int PubDispRetMsg(struct FileRecStru *pos)
{

    char szBuffer[50];
    //char szRetAmt[15];
    char szBuf[256],szAmtBuf[25];
    unsigned char ucRet;
	unsigned  long ulBalance,ulAvilBanlance;
    int i, nLen;
    DevHandle hdlPinpad;
	ET_DATETIME dtLocal;
	char szDateTime[3];

    PubClearAll();
//	PubDisplay( 4 , "1111[%s]",pos->szProcCode );
//	PubuiInkey(0);
    /*检验是否串包 */
    ASSERT_NORMAL(PubCheckPack(pos));

	EA_ucGetDateTime(&dtLocal);
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_TIME, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(pos->szTime);
        sprintf(pos->szTime, "%6.6s", szBuffer);
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer, 2);
        dtLocal.ucHour = atoi(szDateTime);
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer + 2, 2);
        dtLocal.ucMinute = atoi(szDateTime);
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer + 4, 2);
        dtLocal.ucSecond = atoi(szDateTime);
		EA_ucSetDateTime(&dtLocal, EM_SYSTEM_TIME);
    }

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_DATE, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(pos->szDate);
        sprintf(pos->szDate, "%4.4s", szBuffer);
		BUFCLR(szDateTime);
		memcpy(szDateTime, szBuffer, 2);
        dtLocal.ucMonth = atoi(szDateTime);
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer + 2, 2);
        dtLocal.ucDay = atoi(szDateTime);
		EA_ucSetDateTime(&dtLocal, EM_SYSTEM_DATE);
    }

    /*非签到交易而且返回码不成功,就清除冲正标志 */
    if ((pos->cTransType != LOGIN) && (memcmp(gbszErrCode, "00", 2) != 0))
        PubSetPoscfgcAutoVoidFlag(0);

    i = 0;
    while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2))
        i++;

    if (err_mess[i][0] == '\0') /* Unknow Error */
        sprintf(szBuffer, "交易失败");
    else                                         
		// strcpy(szBuffer, err_mess[i] + 2);  20060119  by luo
        strcpy(szBuffer, err_mess[i] );      /*Defined Error */

    if (strlen(szBuffer) > 20)
    {
        BUFCLR(szBuf);
        memcpy(szBuf, szBuffer, 20);
        PubDisplayCen(2, szBuf);
        PubDisplayCen(3, szBuffer + 20);
    }
    else
        PubDisplayCen(2, szBuffer);

    if (memcmp(gbszErrCode, "00", 2))
        PubuiInkey(30);

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);    

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, RETR_NUM, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(pos->szReferenceNum);
        sprintf(pos->szReferenceNum, "%12.12s", szBuffer);
    }
	PubGetAccountInfo(pos);
    if (!memcmp(gbszErrCode, "00", 2))
    {
        switch (pos->cTransType)
        {
        case INQUERY:
            BUFCLR(szBuffer);
			ulBalance = atol(pos->Balance);
			ulAvilBanlance = atol(pos->available);

            nLen = sizeof(szBuffer);            

            ucRet = PubOpenDevice((char *)"PINPAD", EM_io_EPP, &hdlPinpad);
            if (ucRet != EM_SUCCESS)
            {
                PubuiInkey(3);
                PubClearAll();
                if (ucRet == EM_DEVICE_USED)
                    PubDisplay(2, "密码键盘已经打开");
                else
                    PubDisplay(2, "无法打开密码键盘");
                PubuiInkey(3);
                break;
            }
			BUFCLR(szAmtBuf);
            PubFormatAmount(1,pos->Balance,szAmtBuf);
			if ( iPinpadType == 1 )	//外置PINPAD
			{
				if(!memcmp(pos->Sign, "0", 1))
				{
					sprintf(szBuffer,"-%s", szAmtBuf);
					//sprintf(szBuffer,"-%ld.%02ld", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100);
                }
				else
				{
					sprintf(szBuffer,"%s", szAmtBuf);
					//sprintf(szBuffer,"%ld.%02ld", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100);
				}
				PubDisplayCen (3, "查询成功");
			    PubDisplayCen (4, "请查看密码键盘");
				PubucDispPinpad(hdlPinpad, 1, (char *)"Balance:");
				PubucDispPinpad(hdlPinpad, 2, szBuffer);
			}
			else
			{
				if(!memcmp(pos->Sign, "0", 1))
				{
					PubDisplay(3, "余额:-%s元", szAmtBuf);
				//	PubDisplay(3, "余额:%ld.%02ld元", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100);
				}
				else
				{
					PubDisplay(3, "余额:%s元", szAmtBuf);
				//	PubDisplay(3, "余额:%ld.%02ld元", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100);
				}
			}
/*
			PubuiInkey(5);

			if ( iPinpadType == 1 )	//外置PINPAD
			{
				sprintf(szBuffer,"%ld.%02ld", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100);
                PubDisplayCen (3, "可用余额");
			    PubDisplayCen (4, "请查看密码键盘");
				PubucDispPinpad(hdlPinpad, 1, "Available:");
				PubucDispPinpad(hdlPinpad, 2, szBuffer);
			}
			else
			{
				PubDisplay(3, "可用余额:%ld.%02ld元", (ulAvilBanlance/FV.bank.lPointRate)/100, (ulAvilBanlance/FV.bank.lPointRate)%100);
			}

*/
			if(pos->Remark[0])//打印会员号
				PubPrintQueryMsg(pos->Remark);
            PubuiInkey(10);
            if ( iPinpadType == 1 )	//外置PINPAD
            {
                PubucDispPinpad(hdlPinpad, 1, (char *)"WELCOME TO USE ");
                PubucDispPinpad(hdlPinpad, 2, (char *)" START PINPAD");
            }
            while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS);
            break;
        default:
            BUFCLR(szBuffer);
            nLen = sizeof(szBuffer);
            PubGetBit(&iso1, EXPIRY, szBuffer, &nLen);
            if (nLen > 0)
            {
                BUFCLR(pos->szExpDate);
                sprintf(pos->szExpDate, "%4.4s", szBuffer);
            }

            BUFCLR(szBuffer);
            nLen = sizeof(szBuffer);
            PubGetBit(&iso1, PAN, szBuffer, &nLen);
            if (nLen > 0)
            {
                BUFCLR(pos->szCardNo);
                strcpy(pos->szCardNo, szBuffer);
            }
//            BUFCLR(szBuf);
//            nLen = sizeof(szBuf);
//            PubGetBit(&iso1, 63, szBuf, &nLen);
//            if (nLen > 0)
//            {
//                BUFCLR(pos->szCardId);
//                BUFCLR(pos->szIssuerMsg);
//                BUFCLR(pos->szCupMsg);
//                BUFCLR(pos->szAquMsg);
//                memcpy(pos->szCardId, szBuf, 3);
//                if (nLen > 3)
//                    sprintf(pos->szIssuerMsg, "%20.20s", szBuf + 3);
//                if (nLen > 23)
//                    sprintf(pos->szCupMsg, "%20.20s", szBuf + 23);
//                if (nLen > 43)
//                    sprintf(pos->szAquMsg, "%20.20s", szBuf + 43);
//            }

			memcpy(pos->szCardId, "CUP", 3);
            BUFCLR(szBuf);
            nLen = sizeof(szBuf);
            BUFCLR(pos->szIssuerID);
            BUFCLR(pos->szAcqId);
            PubGetBit(&iso1, 44, szBuf, &nLen);
            if (nLen > 0)
            {
                //dudj20060725 modify after ylsw, 右靠改左靠
                sprintf(pos->szIssuerID, "%-11.11s", szBuf);
                sprintf(pos->szAcqId, "%-11.11s", szBuf + 11);
            }
            BUFCLR(szBuf);
            nLen = sizeof(szBuf);
            PubGetBit(&iso1, 32, szBuf, &nLen);
            if (nLen)
                sprintf(pos->szPosCenter, "%s", szBuf); /* Pos 中心号 */

            BUFCLR (szBuffer);
			nLen = sizeof (szBuffer);
			PubGetBit (&iso1, ADDI_AMOUNT, szBuffer, &nLen);

			if (szBuffer[0])
			{
				if (pos->cTransType == ADD)
				{
					BUFCLR (pos->szAmount2);
					sprintf (pos->szAmount2, "%12.12s", szBuffer + 2);
				}
			}
            break;
        }
    }
    else
    {
        if(!memcmp(gbszErrCode, "77", 2))
        {
            PubDisplay(4 , "请重新签到");
            PubuiInkey(3);
        }
        return EXCEPTION;
    }

    return NORMAL;
}
Esempio n. 13
0
void ProEncSSl(char *szOutSendStr, int *pnOutLen)
{
#ifndef EPT_A9L
	return;
#else
	char ucRd[17],ucRd1[17],szBuffer[300],szCrc[2];
    char szTmpBuf[30];
    char szMacBuf1[30];
	uint uiOutLen;
	char szValue [80];
	uint nLen , nKeyId ,nJ,i;
	ET_ProductInfo PI;
	char szSerial[40],szPosid[30],szPosName[30];
	DevHandle hdlPinpad;
	EA_ucGetProductInfo(&PI);
	BUFCLR(szPosName);
	sprintf(szPosName,"LANDI %s" , PI.acName);
	BUFCLR(szSerial);
	EA_ucGetSerial(EM_SERIAL_MAIN_BOARD,szSerial); 
	i = 1;			//公司标识
	i +=  szSerial[i] - '0' + 1; // 得到版本型号长度位置
    i +=  szSerial[i] - '0' + 1; // 得到生产序列号长度位置
    nLen  =  szSerial[i++] - '0';   // 得到生产序列号长度
	BUFCLR(szPosid);
    memcpy(szPosid, szSerial+i, nLen);
		
	memset(ucRd,0,sizeof(ucRd));
	memset(ucRd1,0,sizeof(ucRd1));
	EA_ucGetRandom(16,ucRd);
	BUFCLR(szCrc);
	szCrc[0] = ucRd[0];
	for (nJ = 1; nJ < 16; nJ++)
	{
		szCrc[0] ^= ucRd[nJ];
    }
//	strcpy(PI.acName,(char *)"E330P");
//	strcpy(szSerial,(char *)"S4E3307PTJ1-03898902696000000000");
	memset(szBuffer,0,sizeof(szBuffer));
	memset(szBuffer , 0x20,58);
	memcpy(szBuffer , szPosName , strlen(szPosName));
	memcpy(szBuffer +20 , szPosid , strlen(szPosid));
	memcpy(szBuffer+82,ucRd,16);
	memcpy(szBuffer+98,szCrc,1);
	BUFCLR(szTmpBuf);
	memset(szTmpBuf , 0x20 , 24);
	memcpy(szTmpBuf,szPosName , strlen(szPosName));
	nKeyId = 7;//默认tms密钥是7
	//从主控参数中读取tms密钥索引,如果读到,则覆盖
	if (EA_ucParamFileFindPara("D086UCUPyldla", "parafile", "12000007", &nLen, szValue) == EM_SUCCESS)
    {
		if ( szValue[0])
		{
			nKeyId = atol(szValue);
		}
    }

	if(PubOpenDevice((char *)"PINPAD", EM_io_EPP, &hdlPinpad)== EM_SUCCESS)
	{
		if(PubSelectKey(hdlPinpad, EM_pin_MASTERKEY, nKeyId) == NORMAL)
			if(EA_pci_ucUserDes(hdlPinpad,  nKeyId , ucRd, ucRd1) == EM_SUCCESS)	
				if(EA_pci_ucUserDes(hdlPinpad,  nKeyId , ucRd+8, ucRd1+8) == EM_SUCCESS)
					if(EA_ucTDes(EM_alg_TDESENCRYPT|EM_alg_TDESDEFAULTMODE, 16, ucRd1, 24, szTmpBuf, &uiOutLen, szMacBuf1) == EM_SUCCESS)
					{
 							memcpy(szBuffer+ 58,szMacBuf1,24);
 							*pnOutLen=99;
							memcpy(szOutSendStr,szBuffer,*pnOutLen);
							EA_ucCloseDevice(&hdlPinpad);
							return;
					}

		EA_ucCloseDevice(&hdlPinpad);// 这里要关一下句柄。
    }
	// 硬件加密失败,使用软加密固定密钥

	// 使用软算法
	DES((char *)"\x11\x11\x11\x11\x11\x11\x11\x11",ucRd,ucRd1);
	DES((char *)"\x11\x11\x11\x11\x11\x11\x11\x11",&ucRd[8],&ucRd1[8]);
	uiOutLen=24;
	EA_ucTDes(EM_alg_TDESENCRYPT|EM_alg_TDESDEFAULTMODE, 16, ucRd1, 24, szTmpBuf, &uiOutLen, szMacBuf1);
	memcpy(szBuffer+58,szMacBuf1,24);
	*pnOutLen=99;
	memcpy(szOutSendStr,szBuffer,*pnOutLen);
	//PubDisplay(0 , "soft");
	//PubuiInkey(1);
#endif
	return;
}
Esempio n. 14
0
File: main.c Progetto: 12019/zibogas
/*****************************************************************
 函数原型:Device_Handle_Init()
 功能描述:设备所有句柄初始化
 参数描述:	
				 
 返回值:	OK ? NOTOK
 
 作  者: 刘及华
 日  期:	2012-11-24
 修改历史:
		日期		修改人		修改描述
		------		---------	-------------
*****************************************************************/
INT8U Device_Handle_Init(void)
{
	uchar  ucRet;

	if (EA_ucOpenDevice("RFCARD", EM_mifs_TYPEA, &hMifsHandle) != EM_SUCCESS)
	{
		lcddisperr("读卡器初始化失败");
		return notok;
	}
	if ( EA_ucOpenDevice("PRINT", EM_io_REALMODE, &hDprinterHandle) != EM_SUCCESS )
	{
		lcddisperr("获得打印操作句柄失败!");
		return notok;
	}
//  if ( EA_ucOpenDevice("USBD", EM_io_REALMODE, &hUSBDHandle) != EM_SUCCESS )
//  {
//  	lcddisperr("获得打印操作句柄失败!");
//  	return notok;
//  }
//  if ( EA_ucOpenDevice("WLM", 0, &hWLMHandle) != EM_SUCCESS )
//  {
//  	lcddisperr("获得GPRS句柄失败!");
//  	return notok;
//  }
///////////////////////////////////////////////打印机设置参数
	ucRet =  EA_ucInitPrinter(hDprinterHandle);
	if ( ucRet != EM_SUCCESS )
	{
		EA_vDisplay(2, "初始化打印机芯失败!");
		return notok;
	}
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_XSPACE, 0);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}
	ucRet =  EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_YSPACE, 6);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}

	//  ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE, 578);
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE , 220);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}

	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_DOTTYPE, EM_prn_ASCIIDOT24X12);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_PRNTYPE, EM_prn_ASCIIPRN1X1);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_DOTTYPE, EM_prn_HZDOT24X24);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}

	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_PRNTYPE, EM_prn_HZPRN1X1);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}	
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PRNGRAY, 4);
	if ( ucRet != EM_SUCCESS )
	{
		//  	(void)EA_ucCloseDevice(&hDprinterHandle);
		lcddisperr("打印机设置失败!");
		return notok;
	}
/////////////////////////////////////////////////////////////////////////////初始化时候只设置一次
	if (EA_ucOpenDevice("SAM1CARD", 0, &hSam1Handle) != EM_SUCCESS)
	{
		lcddisperr("PSAM卡初始化失败");
		return notok;
	}
//  if (EA_ucOpenDevice("USERCARD", 0, &hCpuHandle) != EM_SUCCESS)
//  {
//  	lcddisperr("CPU卡初始化失败");
//  	return notok;
//  }
//  if (EA_ucICInitModule(hCpuHandle, EM_ic_VOLDEFAULT, EM_ic_TCRMODE) != EM_SUCCESS)
//  {
//      lcddisperr("设置CPU规范失败");
//   	return notok;
//  }
    ucRet = EA_ucOpenDevice("USBD", 0, &hRS232Handle);
	if ( ucRet != EM_SUCCESS )
	{
		(void)EA_ucCloseDevice(&hRS232Handle);
		lcddisperr("COM口设置失败!");
		return notok;
	}
	EA_ucInitRS232(hRS232Handle, EM_232_115200BPS, EM_232_NOPAR, EM_232_8DBS);

	return ok;
}
Esempio n. 15
0
/*
 * 函数功能: 联机签到
 * 入口参数:无
 * 出口参数:无
 * 返 回 值:NORMAL--成功
 *           EXCEPTION--失败
 */
int PubBankLogin(void)
{
    uchar szBatch[7], szBuffer[121], szBuf[33],szGetBuffer[121];
    uchar szDateTimeBuf[3], szTmpBuffer[30], szWorkKey[25], szMacKey[25], szWorkKeyChk[5], szMacKeyChk[5];
	uchar szTdkKey[25], szTdkKeyChk[5];
    struct FileRecStru LoginPos;
    int nSendLen, nLen , nWorkKeyLen=8,nMacKeyLen=8,nTdkKeyLen=8;
    ET_DATETIME DateTime;

//#ifndef PRG_TST
    uchar szTmp1[20];
    int nKeyIndex;
    DevHandle phPinpad;

//#endif
    /*获得当前操作员号 */
#ifdef TRANSTEST
    PubSetPoscfgcLoginState(LOGON);
    return NORMAL;
#endif
    LoginPos.cTransType = LOGIN;
    gbnTransType = LOGIN;

	PubGetBankcDesType(&cDesType);
    /*获得批次号 */
    ASSERT_NORMAL(PubGetBankstateszBatchNum(szBatch, sizeof(szBatch)));
    sprintf(LoginPos.szBatchNum, "%s", szBatch);

    /*设置mac方式 */
    PubSetBankcMacChk(MAC_NO);

    /* 8583打包 */
    ASSERT_NORMAL(PubPacketFix(&LoginPos));
    BUFCLR(szTmpBuffer);
/*** modified by gud 20060124 ***/
	if (cDesType == DES1)
		sprintf(szTmpBuffer, "00%6.6s001", LoginPos.szBatchNum);
	else
	{
//		if(FV.bank.cEncryptTrack == YES)		//增加磁条加密功能
//			sprintf(szTmpBuffer, "00%6.6s004", LoginPos.szBatchNum);
//		else
			sprintf(szTmpBuffer, "00%6.6s003", LoginPos.szBatchNum);
	}
/*** modified by gud 20060124 ***/
    ASSERT_NORMAL(PubSetBitYL(&iso, 60, szTmpBuffer, 11));
/*
//add by baijz 20110620 终端设备信息
	nLen = 0;
	i = 0;
	BUFCLR(szBuffer);
	if(EA_ucGetSerial(EM_SERIAL_MAIN_BOARD, szBuffer) == EM_SUCCESS)
	{
 		i++;			//公司标识
		nLen = szBuffer[i]-0x30;
		i++;			//产品类别长度
		i+=nLen;		//产品类别
		nLen = szBuffer[i]-0x30;
		i++;			//版本型号长度
		i+=nLen;		//版本型号
		nLen = szBuffer[i]-0x30;
		i++;			//序列号长度
		BUFCLR(szBuf);
		if(nLen > 32)
			nLen = 32;
		memcpy(szBuf, szBuffer+i, nLen);
	}
	else
	{
		strcpy(szBuf, "00000000");
		nLen = 8;
	}
	BUFCLR(szTmpBuffer);
	PubGetPosYlCode(szTmpBuffer);
    sprintf(szBuffer, "Sequence No%02d%4.4s%s", nLen+4, szTmpBuffer, szBuf);//证书编号+序列号
    ASSERT_NORMAL(PubSetBitYL(&iso, 62, szBuffer, strlen(szBuffer)));
//add end
*/
    BUFCLR(szBuf);
    sprintf(szBuf, "%2.2s ", FV.OPER.gbszOper);
    ASSERT_NORMAL(PubSetBitYL(&iso, 63, szBuf, 3));

    /*iso到字符串 */
    nSendLen = sizeof(gbszSendStr);
    ASSERT_NORMAL(PubIsoToStr(gbszSendStr, &iso, &nSendLen));
    gbnSendLen = nSendLen;

    /*发送数据 */
    ASSERT_NORMAL(PubCommu(&CommInfo, gbszSendStr, gbnSendLen, gbszReadStr, &gbnReadLen, DIALOFF_NO));

    /*接收返回 */
    ASSERT_NORMAL(PubDispRetMsg(&LoginPos));
    PubDisplay(2 , "");//bctc认为这个时候显示交易成功不合理,必须在校验完密钥后才显示交易成功,所以这里清空PubDispRetMsg里面显示成功
	BUFCLR(szBuffer);
	nLen = sizeof(szBuffer);
	ASSURE_NORMAL(PubGetBit (&iso1, 60, szBuffer, &nLen));
	if (nLen > 0)
	{
		BUFCLR (szTmp1);
		memcpy (szTmp1, szBuffer + 8, 3);
		if (cDesType == DES1)
		{
			if (memcmp (szTmp1, "001", 3) != 0)
			{
				PubClearAll ();
				PubDisplay (3, "密钥算法有误");
				PubuiInkey (30);
				return EXCEPTION;
			}
		}
		else if (cDesType == DES3)
		{
//add by baijz 20110426
//			if (FV.bank.cEncryptTrack == YES)
//			{
//				if(memcmp (szTmp1, "004", 3) != 0)
//				{
//					PubClearAll ();
//					PubDisplay (3, "密钥算法有误");
//					PubuiInkey (30);
//					return EXCEPTION;
//				}
//			}
//			else
//add end
			if (memcmp (szTmp1, "003", 3) != 0)
			{
				PubClearAll ();
				PubDisplay (3, "密钥算法有误");
			    PubuiInkey (30);
				return EXCEPTION;
			}
		}
	}
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    ASSURE_NORMAL(PubGetBit(&iso1, 62, szBuffer, &nLen));
	//华腾后台62域返回的密钥长度为61位,第一位跳过
	BUFCLR(szGetBuffer);
	memcpy(szGetBuffer,szBuffer+1,60);
	BUFCLR(szBuffer);
	memcpy(szBuffer,szGetBuffer,60);
	nLen --;
#ifdef LDYTEST
	PubDisplay(2,"返回62域长度%d",nLen);
	PubuiInkey(0);
#endif
    if ((nLen != 24) && (cDesType == DES1))
    {
        PubDisplay(3, "下载参数密钥失败");
        PubDisplayCen (4, "使用单DES");
        PubuiInkey(30);
        return EXCEPTION;
    }
//add by baijz 20110426
//	else if(FV.bank.cEncryptTrack == YES)
//	{
//		if ((nLen != 60) && (cDesType == DES3))
//		{
//			PubDisplay(3, "下载参数密钥失败");
//			PubDisplayCen (4, "使用 3DES");
//			PubuiInkey(30);
//			return EXCEPTION;
//		}
//	}
//add end
	else if ((nLen != 60) && (cDesType == DES3))
    {
        PubDisplay(3, "下载参数密钥失败");
        PubDisplayCen (4, "使用 3DES");
        PubuiInkey(30);
        return EXCEPTION;
    }
     

    /*选择主密钥 */
    ASSURE_NORMAL(PubGetBanknMKeyIndex(&nKeyIndex));
#ifdef EMVIC
	if ( FV.EmvStru.gbcExeReader == YES)
	{
		EA_ucCloseComm(); //先关闭串口,然后下面打开串口
	}
#endif
    if (PubOpenDevice("PINPAD", EM_io_EPP, &phPinpad) != EM_SUCCESS)
    {
        EA_vCls();
        PubDisplay(2, "无法打开密码键盘");
        PubDisplay(3, "按任意键返回");
        PubuiInkey(3);
        return EXCEPTION;
    }
   

    ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MASTERKEY, nKeyIndex));

    if (cDesType == DES1)
    {        
        memset(szWorkKey, 0, sizeof(szWorkKey));
        memset(szMacKey, 0, sizeof(szMacKey));
        memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk));
        memset(szMacKeyChk, 0, sizeof(szMacKeyChk));
        memcpy(szWorkKey, szBuffer, 8);
        memcpy(szWorkKeyChk, szBuffer + 8, 4);
        memcpy(szMacKey, szBuffer + 12, 8);
        memcpy(szMacKeyChk, szBuffer + 20, 4);
        nWorkKeyLen = 8 ;
        nMacKeyLen = 8 ;
    }
    else if ( cDesType == DES3)
    {
        memset(szWorkKey, 0, sizeof(szWorkKey));
        memset(szMacKey, 0, sizeof(szMacKey));
        memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk));
        memset(szMacKeyChk, 0, sizeof(szMacKeyChk));
        memcpy(szWorkKey, szBuffer, 16);
        memcpy(szWorkKeyChk, szBuffer + 16, 4);
        memcpy(szMacKey, szBuffer + 20, 8); // mackey 银联预留了16位,目前只用了8位
        memcpy(szMacKeyChk, szBuffer + 36, 4);
        nWorkKeyLen = 16 ;
        nMacKeyLen = 8 ;
//add by baijz 20110422
//		if(FV.bank.cEncryptTrack == YES)
		{
			memcpy(szTdkKey, szBuffer + 40, 16);
			memcpy(szTdkKeyChk, szBuffer + 56, 4);
			nTdkKeyLen = 16;
		}
//add end
    }


    /*判断密钥是否正确 */
        ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_WORKKEY, 0, nWorkKeyLen, szWorkKey));
        ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, 0, nWorkKeyLen, szWorkKey));
        ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, 0));
        BUFCLR(szTmpBuffer);
        memset(szTmp1, 0, sizeof(szTmp1));

        ASSURE_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer));

        if (memcmp(szTmpBuffer, szWorkKeyChk, 4))
        {
            PubClearAll();
            PubDisplay(3, "校验workkey错");
            PubuiInkey(10);
            EA_ucCloseDevice(&phPinpad);
#ifndef TAICANGTEST
            return EXCEPTION;
#endif
        }

        ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, 0, nMacKeyLen, szMacKey));
        ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, 0));

        BUFCLR(szTmpBuffer);
        memset(szTmp1, 0, sizeof(szTmp1));

        ASSURE_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer));

        if (memcmp(szTmpBuffer, szMacKeyChk, 4))
        {
            PubClearAll();
            PubDisplay(3, "校验mackey错");
            PubuiInkey(10);
            EA_ucCloseDevice(&phPinpad);
#ifndef TAICANGTEST
            return EXCEPTION;
#endif
        }
//add by baijz 20110426
		if(FV.bank.cEncryptTrack == YES)
		{
			ASSURE_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, 1, nTdkKeyLen, szTdkKey));
			ASSURE_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, 1));

			BUFCLR(szTmpBuffer);
			memset(szTmp1, 0, sizeof(szTmp1));

			ASSURE_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer));

			if (memcmp(szTmpBuffer, szTdkKeyChk, 4))
			{
				PubClearAll();
				PubDisplay(3, "校验tdkkey错");
				PubuiInkey(10);
				EA_ucCloseDevice(&phPinpad);
#ifndef TAICANGTEST
				return EXCEPTION;
#endif
			}
		}
//add end
        EA_ucCloseDevice(&phPinpad);
   
        BUFCLR(FV.Other.gbszWorkKey);
        BUFCLR(FV.Other.gbszMacKey);
        memcpy(FV.Other.gbszWorkKey, szWorkKey, nWorkKeyLen);
		FV.Other.gbWorkKeyLen = nWorkKeyLen;
		WRITE_nVAR(FV.Other.gbszWorkKey);
		WRITE_nVAR(FV.Other.gbWorkKeyLen);
        memcpy(FV.Other.gbszMacKey, szMacKey , nMacKeyLen);
		FV.Other.gbMacKeyLen = nMacKeyLen;
		WRITE_nVAR(FV.Other.gbszMacKey);
		WRITE_nVAR(FV.Other.gbMacKeyLen);

//add by baijz 20110420
		BUFCLR(FV.Other.gbszTdkKey);
        memcpy(FV.Other.gbszTdkKey, szTdkKey , nTdkKeyLen);
        FV.Other.gbTdkKeyLen = nTdkKeyLen;
		WRITE_nVAR(FV.Other.gbszTdkKey);
		WRITE_nVAR(FV.Other.gbTdkKeyLen);
//add end

//add by baijz 20120109
	/*
     * 设置批次号
     */
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, 60, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(szTmpBuffer);
        memcpy(szTmpBuffer, szBuffer + 2, 6);
        PubSetBankstateszBatchNum(szTmpBuffer);
    }

    EA_ucGetDateTime(&DateTime);
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_DATE, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer, 2);
        DateTime.ucMonth = atoi(szDateTimeBuf);
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer + 2, 2);
        DateTime.ucDay = atoi(szDateTimeBuf);
//        EA_ucSetDateTime(&DateTime, EM_SYSTEM_DATE);			//del by baijz 20120524
    }

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_TIME, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer, 2);
        DateTime.ucHour = atoi(szDateTimeBuf);
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer + 2, 2);
        DateTime.ucMinute = atoi(szDateTimeBuf);
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer + 4, 2);
        DateTime.ucSecond = atoi(szDateTimeBuf);
//        EA_ucSetDateTime(&DateTime, EM_SYSTEM_TIME);			//del by baijz 20120524
    }
//add end
	EA_ucSetDateTime(&DateTime, EM_SYSTEM_DATE|EM_SYSTEM_TIME);	//add by baijz 20120524

//BCTST
    strcpy(FV.OPER.gbszLoginOper, FV.OPER.gbszOper);    //已向主机签到的操作员不能删除
	WRITE_nVAR(FV.OPER.gbszLoginOper);
	PubDisplayCen(2, "交易成功");
	PubuiInkeyMs(500);
#ifdef EMVIC
	BUFCLR(szGetBuffer);
	PubGetDownLoadEmvPara(szGetBuffer);
	if ( szGetBuffer[0] == YES)
	{
		//这里有多一次拨号,是无法避免的,因为签到有下密钥动作,
		//而这个动作有打开外置密码键盘,这样拨号和密码键盘会冲突,
		//所以只能多一次拨号
		PubDisplay(2,"下载EMV参数中..."); 
		PubuiInkey(1);
		//下载EMV 参数,先下载密钥,然后下载
		if(PubYlConnect(&CommInfo) ==NORMAL)
		{
			if (PubQueryPubilcKey () == 1)
			{
				PubDownPubilcKey ();
			}
			// 						    PubDialOff (&CommInfo);
			if(PubYlConnect(&CommInfo)==NORMAL)
			{
				PubDownEmvPara ();
			}
			// PubDialOff (&CommInfo);
		}
		PubDialOff (&CommInfo);
		VERIFY_NORMAL(PubSetDownLoadEmvPara(NO));
		
	}
#endif
	PubDialOff (&CommInfo);

//add by baijz 20110718 BCTC检测要求,参数下载成功,清除标志
	if(FV.Other.POSSTATFLAG == 3)
	{
		FV.Other.POSSTATFLAG = 0;
		WRITE_nVAR(FV.Other.POSSTATFLAG);
	}
	PubSetPoscfgcLoginState(LOGON);
//add end

    return NORMAL;
}
Esempio n. 16
0
/*
 * 函数功能:检查返回的报文
 * 入口参数:pos--用于检验的POS结构
 * 出口参数:无
 * 返    回:NORMAL  ―― 成功
 *           EXCEPTION  ―― 失败
 */
int PubDispRetMsg(struct FileRecStru *pos)
{

    char szBuffer[50];
    char szRetAmt[15];
    char szBuf[256];
    unsigned char ucRet;
    int i, nLen;
    DevHandle hdlPinpad;
	int nTmpLen;
	uchar ucFd;
    //chenjs20061220 add down
	ET_DATETIME dtLocal;
    char szDateTime[3];
    //chenjs20061220 add up
    PubClearAll();

    /*检验是否串包 */
    ASSERT_NORMAL(PubCheckPack(pos));

	EA_ucGetDateTime(&dtLocal);
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_TIME, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(pos->szTime);
        sprintf(pos->szTime, "%6.6s", szBuffer);
		//chenjs20061220 add down
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer, 2);
        dtLocal.ucHour = atoi(szDateTime);
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer + 2, 2);
        dtLocal.ucMinute = atoi(szDateTime);
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer + 4, 2);
        dtLocal.ucSecond = atoi(szDateTime);
		//chenjs20061220 add up
// 		EA_ucSetDateTime(&dtLocal, EM_SYSTEM_TIME);
    }

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_DATE, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(pos->szDate);
        sprintf(pos->szDate, "%4.4s", szBuffer);
		//chenjs20061220 add down
		BUFCLR(szDateTime);
		memcpy(szDateTime, szBuffer, 2);
        dtLocal.ucMonth = atoi(szDateTime);
		BUFCLR(szDateTime);
        memcpy(szDateTime, szBuffer + 2, 2);
        dtLocal.ucDay = atoi(szDateTime);
		//chenjs20061220 add up
// 		EA_ucSetDateTime(&dtLocal, EM_SYSTEM_DATE);
    }
	EA_ucSetDateTime(&dtLocal, EM_SYSTEM_DATE|EM_SYSTEM_TIME);
    /*非签到交易而且返回码不成功,就清除冲正标志 */
    if ((pos->cTransType != LOGIN) && (memcmp(gbszErrCode, "00", 2) != 0))
        PubSetPoscfgcAutoVoidFlag(0);

    i = 0;
    while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2))
        i++;

    if (err_mess[i][0] == '\0') /* Unknow Error */
        sprintf(szBuffer, "%2.2s交易失败" , gbszErrCode);
    else                                         
		// strcpy(szBuffer, err_mess[i] + 2);  20060119  by luo
        strcpy(szBuffer, err_mess[i] );      /*Defined Error */

	//磁条卡充值返回98,需要马上发起确认交易
	if(memcmp(gbszErrCode, "98", 2) == 0 && gbnTransType == MAG_LOAD_CASH)
	{
		return NORMAL;
	}
	//add by baijz 20110704 11 A2 A4 A5 A6 交易成功
	if ((memcmp(gbszErrCode, "11", 2) == 0) || (memcmp(gbszErrCode, "A2", 2) == 0)
		|| (memcmp(gbszErrCode, "A4", 2) == 0) || (memcmp(gbszErrCode, "A5", 2) == 0)
		|| (memcmp(gbszErrCode, "A6", 2) == 0))  
	{
		if (memcmp(gbszErrCode, "11", 2) == 0)
		{
			PubDisplayCen(2, "11交易成功");
			PubDisplayCen(3, "VIP客户");
		}
		else
		{
			sprintf(szBuffer, "%2.2s交易成功", gbszErrCode);
			PubDisplayCen(2,szBuffer);
			PubDisplayCen(3, "请向发卡行确认");
		}
		strcpy(gbszErrCode, "00");
		PubuiInkeyMs(1000);
	}

    if (memcmp(gbszErrCode, "00", 2))
	{  
		if (strlen(szBuffer) > 20)
		{
			BUFCLR(szBuf);
			memcpy(szBuf, szBuffer, 20);
			PubDisplayCen(1, "交易失败");
			PubDisplayCen(2, szBuf);
			PubDisplayCen(3, szBuffer + 20);
		}
		else
		{
			PubDisplayCen(2, "交易失败");
			PubDisplayCen(3, szBuffer);
		}
			PubVoice(4);
		BUFCLR(szCMDRetCode);
		BUFCLR(szCMDRetMsg);
		memcpy(szCMDRetCode,gbszErrCode, 2); 
		strncpy(szCMDRetMsg,szBuffer+2,sizeof(szCMDRetMsg) - 1);
		PubuiInkey(5);
	}
	else
	{
		if (pos->cTransType != LOGIN)
		{
		PubVoice(3);
		EA_vBeepMs(100);
		PubDisplayCen(2, "交易成功");
		PubuiInkeyMs(200);
		EA_vBeepMs(100);		
		}

	}

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, AUTH_ID, szBuffer, &nLen);
    if (nLen > 0)
    {
        if ( pos->cTransType == CONFIRM || pos->cTransType == OFFLINE_CONFIRM 
			|| pos->cTransType == MOTO_CONFIRM || pos->cTransType == MOTO_OFFLINE_CONFIRM)
        {
            BUFCLR(pos->szOldAuthID);
            sprintf(pos->szOldAuthID, "%6.6s", pos->szAuthID );
        }
        BUFCLR(pos->szAuthID);
        sprintf(pos->szAuthID, "%6.6s", szBuffer);
    }

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, RETR_NUM, szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(pos->szReferenceNum);
        sprintf(pos->szReferenceNum, "%12.12s", szBuffer);
    }

    if (!memcmp(gbszErrCode, "00", 2))
    {
        switch (pos->cTransType)
        {
        case INQUERY:
		case YLJF_INQUERY:		//add by baijz 20110428
            BUFCLR(szBuffer);
            nLen = sizeof(szBuffer);
            ASSERT_NORMAL(PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen));
            if (nLen == 0)
            {
                PubClearAll();
                PubDisplayInv(2, "未返回余额");
                EA_vBeepMs(1000);
                PubuiInkey(5);
                return EXCEPTION;
            }

            memcpy(szRetAmt, szBuffer + 7, 13);
            szRetAmt[13] = '\0';
            if (szRetAmt[0] == 'C')
                szRetAmt[0] = ' ';
            else
                szRetAmt[0] = '-';
            i = 1;
            while (1)
            {
                if (i == 13)//chenjs20061115 12->13
                    break;
                if (szRetAmt[i] != '0' && szRetAmt[i] != ' ')
                    break;
                //chenjs20061115研发测试 if (szRetAmt[i] == '0')
				if (szRetAmt[i] == '0' && i < 10)
                    szRetAmt[i] = ' ';
				//chenjs20061115 add down
				if( i >=10 && szRetAmt[i] == ' ')
					szRetAmt[i] = '0';
				//chenjs20061115 add up
                i++;
            }
#ifdef EMVIC
			if ( FV.EmvStru.gbcExeReader == YES)
			{
				EA_ucCloseComm(); //先关闭串口,然后下面打开串口
			}
#endif

            ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad);
            if (ucRet != EM_io_SUCCESS)
            {
                PubuiInkey(3);
                PubClearAll();
                if (ucRet == EM_io_OPENED)
                    PubDisplay(2, "密码键盘已经打开");
                else
				{
                    PubDisplay(2, "无法打开密码键盘");
					PubuiInkey(3);
					return EXCEPTION;
				}
                PubuiInkey(3);
                break;
            }

            sprintf(szBuffer, "%11.11s.%2.2s", szRetAmt, szRetAmt + 11);
		//bctc add by wei
#ifndef EPT5610
        ucRet = EA_ucICCardIn(gbhdlUserCard); 
#endif
#ifdef EPT5610
        ucRet = EA_ucICCardIn(EM_ic_USERCARD); 
#endif		
		//bctc add end
			if ( iPinpadType == 1 )	//外置PINPAD
			{
				EA_vCls();
                PubDisplayCen (2, "查询成功");
			    PubDisplayCen (3, "请查看密码键盘");
				if(ucRet == EM_SUCCESS)
				{
					PubDisplayCen (4, "并拔卡");
				}
				PubucDispPinpad(hdlPinpad, 1, "Balance:");
				PubucDispPinpad(hdlPinpad, 2, szBuffer);
			}
			else
			{
				sprintf(szBuf , "      %14.14s" , szBuffer);
				EA_vCls();
                PubDisplayCen (1, "查询成功");
			    PubDisplay (2, "可用余额:");
				PubDisplay(3, "%s", szBuf);
				if(ucRet == EM_SUCCESS)
				{
					PubDisplayCen (4, "请拔卡");
				}
			}

		


            PubuiInkey(10);
            if ( iPinpadType == 1 )	//外置PINPAD
            {
                PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE ");
                PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD");
            }
            while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS);
            break;
        default:
            BUFCLR(szBuffer);
            nLen = sizeof(szBuffer);
            PubGetBit(&iso1, EXPIRY, szBuffer, &nLen);
            if (nLen > 0)
            {
                BUFCLR(pos->szExpDate);
                sprintf(pos->szExpDate, "%4.4s", szBuffer);
            }

            BUFCLR(szBuffer);
            nLen = sizeof(szBuffer);
            PubGetBit(&iso1, PAN, szBuffer, &nLen);
            if (nLen > 0)
            {
                BUFCLR(pos->szCardNo);
                strcpy(pos->szCardNo, szBuffer);
            }
			if(pos->cTransType == CDT_PURCHASE)
			{
                BUFCLR(szBuf);
                nLen = sizeof(szBuf);
                PubGetBit(&iso1, 62, szBuf, &nLen);
                if (nLen > 26)
				{
			BUFCLR(pos->szRetAmount);
			BUFCLR(pos->szRetMoneyCode);
			BUFCLR(pos->szRetFee);
			BUFCLR(pos->szCdtPoint);
			BUFCLR(pos->szCdtType);
			BUFCLR(pos->szCdt1stFee);
			BUFCLR(pos->szCdtEvyFee);


			memcpy(pos->szRetAmount, szBuf, 12);
			memcpy(pos->szRetMoneyCode, szBuf+12, 3);
			memcpy(pos->szRetFee, szBuf+15, 12);
			memcpy(pos->szCdtPoint, szBuf+27, 12);
			memcpy(pos->szCdtType, szBuf+27+12, 1);
			memcpy(pos->szCdt1stFee, szBuf+27+12+1, 12);
			memcpy(pos->szCdtEvyFee, szBuf+27+12+1+12, 12);

				}
			}
			if(pos->cTransType == FQ_PURCHASE || pos->cTransType == CDT_PURCHASE)
			{
				BUFCLR(szBuf);
				nLen = sizeof(szBuf);
				PubGetBit(&iso1, 62, szBuf, &nLen);
				if (nLen > 26)
				{
				BUFCLR(pos->szRetAmount);
				BUFCLR(pos->szRetMoneyCode);
				BUFCLR(pos->szRetFee);
				memcpy(pos->szRetAmount, szBuf, 12);
				memcpy(pos->szRetMoneyCode, szBuf+12, 3);
				memcpy(pos->szRetFee, szBuf+15, 12);
				}
		    }
			if(pos->cTransType == JF_PURCHASE || pos->cTransType == YLJF_PURCHASE)
			{
                BUFCLR(szBuf);
                nLen = sizeof(szBuf);
                PubGetBit(&iso1, 62, szBuf, &nLen);
                if (nLen > 21)
				{
                    BUFCLR(pos->szJFPoint);
                    BUFCLR(pos->szJFPayAmount);
					BUFCLR(pos->szJFBalance);
				    memcpy(pos->szJFPoint, szBuf, 10);
                    memcpy(pos->szJFPayAmount, szBuf +10, 12);
					memcpy(pos->szJFBalance, szBuf + 22, 10);
				}
//add by baijz 20120109 积分余额以54域为准
                BUFCLR(szBuf);
                nLen = sizeof(szBuf);
                PubGetBit(&iso1, 54, szBuf, &nLen);
				if (nLen > 8)
				{
					memcpy(pos->szJFBalance, szBuf + 8, 12);
				}
//add end
			}
            BUFCLR(szBuf);
            nLen = sizeof(szBuf);
            PubGetBit(&iso1, 63, szBuf, &nLen);
            if (nLen > 0)
            {
                BUFCLR(pos->szCardId);
                BUFCLR(pos->szIssuerMsg);
                BUFCLR(pos->szCupMsg);
                BUFCLR(pos->szAquMsg);
                memcpy(pos->szCardId, szBuf, 3);
                if (nLen > 3)
                    sprintf(pos->szIssuerMsg, "%20.20s", szBuf + 3);
                if (nLen > 23)
                    sprintf(pos->szCupMsg, "%20.20s", szBuf + 23);
                if (nLen > 43)
                    sprintf(pos->szAquMsg, "%20.20s", szBuf + 43);
            }

            BUFCLR(szBuf);
            nLen = sizeof(szBuf);
            BUFCLR(pos->szIssuerID);
            BUFCLR(pos->szAcqId);
            PubGetBit(&iso1, 44, szBuf, &nLen);
            if (nLen > 0)
            {
                sprintf(pos->szIssuerID, "%-11.11s", szBuf);
                sprintf(pos->szAcqId, "%-11.11s", szBuf + 11);
            }
            BUFCLR(szBuf);
            nLen = sizeof(szBuf);
            PubGetBit(&iso1, 32, szBuf, &nLen);
		if (nLen)
		sprintf(pos->szPosCenter, "%s", szBuf); /* Pos 中心号 */

		BUFCLR (szBuffer);
		nLen = sizeof (szBuffer);
		PubGetBit (&iso1, ADDI_AMOUNT, szBuffer, &nLen);

			if (szBuffer[0])
			{
				if (pos->cTransType == ADDPRE_AUTH)
				{
					BUFCLR (pos->szAmount2);
					sprintf (pos->szAmount2, "%12.12s", szBuffer + 2);
				}
			}
			if( pos->cTransType == CDT_OPEN || pos->cTransType == CDT_QUERY )
			{
				BUFCLR(szBuffer);
				nLen = sizeof(szBuffer);
				ASSERT_NORMAL(PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen));
				if (nLen == 0)
				{
					PubClearAll();
					PubDisplayInv(2, "未返回余额");
					EA_vBeepMs(1000);
					PubuiInkey(5);
					return EXCEPTION;
				}

				memcpy(szRetAmt, szBuffer + 7, 13);
				szRetAmt[13] = '\0';
				if (szRetAmt[0] == 'C')
					szRetAmt[0] = ' ';
				else
					szRetAmt[0] = '-';
				sprintf (pos->szAmount2, "%13.13s", szRetAmt);     //for icbc cdt 取可用额度

		      BUFCLR(szBuf);
                    nLen = sizeof(szBuf);
                    PubGetBit(&iso1, 62, szBuf, &nLen);
                    if (nLen > 0)
			{
                    BUFCLR(pos->szLCdtAmount);
                    BUFCLR(pos->szBCdtAmount);
		      memcpy(pos->szLCdtAmount, szBuf, 12);    //取授信额度
                    memcpy(pos->szBCdtAmount, szBuf +12, 12);//取银行评定额度
			}

			}
            break;
        }

		// 2009-7-27 10部分承兑处理
		if (memcmp(pos->szReturnCode, "10", 2) == 0)
		{
			//pos->cPart=1;
			strcpy(pos->szReturnCode, "00");
			if(gbnComposFlag==1)
			{
				return NORMAL;
			}
			else
			{
				EA_vCls ();
				BUFCLR(szBuffer);
				sprintf(szBuffer, "金额: %ld.%02ld", atol(pos->szAmount) / 100, atol(pos->szAmount) % 100);
				PubDisplayCen(1, "交易成功, 但为部分承兑");
				PubDisplayCen(2, "是否接受部分承兑?");
				PubDisplayCen(3, "接受1   取消0");
				PubDisplayCen(4, szBuffer);
				i = PubuiInkey(60);
				EA_vCls ();
				if (i == '1')
				{    
					EA_vCls ();
					BUFCLR(szBuffer);
					sprintf(szBuffer, "%ld.%02ld", atol(pos->szJFPayAmount) / 100, atol(pos->szJFPayAmount) % 100);
					//PubDisplayCen(1, "交易成功, 但为部分承兑");
					PubDisplayCen(2, "未付金额");
					PubDisplayCen(3, szBuffer);
					PubDisplayCen(4, "请另行收取");
					PubuiInkey(10);
					EA_vCls ();
					return NORMAL;
				}
			}
			//保存流水
			nTmpLen = sizeof(struct FileRecStru);    
			if(PubFileOpen(YLWATER, &ucFd)!= NORMAL)
			{
				FV.Void.gbnVoidReason = WRI_WATER_ERR;
				WRITE_nVAR(FV.Void.gbnVoidReason);
				PubWriteLog(EXCEPTION, __FILE__, __LINE__);
				return EXCEPTION;
			}
			if (PubFileOper(ucFd, REC_WRITE, 0, 0, (char *)pos, &nTmpLen) != NORMAL)
			{
				FV.Void.gbnVoidReason = WRI_WATER_ERR;
				WRITE_nVAR(FV.Void.gbnVoidReason);
				EA_ucPFClose(ucFd);
				PubWriteLog(EXCEPTION, __FILE__, __LINE__);
				return EXCEPTION;
			}
			EA_ucPFClose(ucFd);
			PubSaveDetail(pos);
			PubSetPoscfgcAutoVoidFlag(0);

			//PubSetPoscfgcPrintEndFlag(1);
			PubPrint(0, iPrinterType);

			//自动撤销
			if(gbnTransType == PURCHASE)
				gbnTransType = POS_VOID;
			if(gbnTransType == YLJF_PURCHASE)
				gbnTransType = YLJF_VOID;
			PubAutoPosVoid(pos);
			return EXCEPTION;
		}
    }
    else
    {
	    //根据孙银泉反馈修改,20080509
        if(!memcmp(gbszErrCode, "77", 2)||!memcmp(gbszErrCode, "99", 2)||!memcmp(gbszErrCode, "A0", 2))
        {
            PubDisplay(4 , "请重新签到");
	    VERIFY_NORMAL(PubSetPoscfgcPosState(NO_LOGON));
            VERIFY_NORMAL(PubSetPoscfgcLoginState(NO_LOGON));
            memset( FV.Other.gbLoginDate , 0 , sizeof(FV.Other.gbLoginDate));
			WRITE_nVAR(FV.Other.gbLoginDate);
            PubuiInkey(5);
        }
       //end
        return EXCEPTION;
    }

    return NORMAL;
}
Esempio n. 17
0
int dlm_main(void)
{
    char szGetBuffer[100],szTmpBuf[100];

    char cWaitRet;
    uint uiKey , uiRet;
    uchar ucRetVal;
    uchar ucFd;
    uchar ucRet;

    int nScreen = 0;
    char cMenuTime;
    uint uiCount1,uiCount2;
    uint uiOption;
	uint puiConfigInfo;
   
    const char *pcModuleName = MODULE_FILE_NAME;
//    const char *pcCommModuleName = "applib";
    DevHandle phPinpad;
#ifdef EPT_A9L
	uint_64 llCnt = 0;
	char szData[100];
#endif

#ifdef EMVIC
	EA_EMV_vInit();
#endif
    //设备句柄清空 
    gbPrintHandle = EM_NULL;
	//清空所有全局设备句柄,add by zhuchentao 060831
	gbhdlMagCard = EM_NULL;;	//磁卡模块 
	gbhdlUserCard = EM_NULL;
	gbhdlMasterCard = EM_NULL;
	gbhdlSAM1Card = EM_NULL;
	gbhdlSAM2Card = EM_NULL;
	gbhdlSAM3Card = EM_NULL;
	gbhdlSAM4Card = EM_NULL;
	gbMifCardHandle = EM_NULL;
#ifdef EMVIC 
	gbhdlPINPAD = EM_NULL;   
	gbhdlRS232 = EM_NULL;
	gbMifCardHandle = EM_NULL; 
#endif
	cRunState = 1;
    CommInfo.gbHdl = EM_NULL;
    memset(&iso, 0, sizeof(ISODataStru));
    memset(&iso1, 0, sizeof(ISODataStru));
    memset(&printiso, 0, sizeof(ISODataStru));
    memset(&upiso, 0, sizeof(ISODataStru));
	gbcECDefault = 0;
#ifndef EPT_A9L
#ifdef EPT_M3
	if (EA_uiLoadAndExecuteModule("LibRFReader.dlm", "") != EM_SUCCESS)
#endif
#ifdef EPT56X0
	if (EA_uiLoadAndExecuteModule("LibRFReader", "") != EM_SUCCESS)
#endif
    {
    	
        PubDisplay(3, "载入LibRFReader.dlm失败");
        PubDisplay(4, "请下载LibRFReader.dlm文件");
		PubuiInkey(0);
		return EXCEPTION;
    }
#endif
	EA_vCls();
	PubucLoadAllMfVar((char*)MODULE_FILE_NAME, &FV, sizeof(FV));
// #ifdef EPT56X0
// 	EA_ucSetStopFlag(EM_DISABLE_STOP);
// #endif
// #ifdef EPT_A9L
// 	EA_ucSetStopFlag(EM_DISABLE_STOP);
// #endif
// 银商允许修改参数标志,提交程序的时候分别tms非tms的2种情况编译提交 
//	setup.c 中设置的地方取消无用了!!
	cSetupModifyFlag = 1;// 下载版 允许修改参数
//   	cSetupModifyFlag = 0;// TMS服务器版 不允许修改参数

#ifndef EPT5610
	EA_vSetLCDLightTimer(60);
#endif
    EA_vCls();
    if (PubucFirstRunPara(pcModuleName, "parafile") == EM_SUCCESS)
    {
		PubGetPinpadPara();// 先读取参数文件中密码键盘标签
        FV.gbnParaFirstFlag = YES;
		WRITE_nVAR(FV.gbnParaFirstFlag);
    }
	PubUsePinpadInside(FV.Other.SetPinpadType);
// 	PubUsePinpadInside(1);
    PubGetPrinterType(&iPrinterType); 
    PubGetPinpadType(&iPinpadType);
    while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
    {
        PubDisplayInv(2, "打开密码键盘错");
        PubDisplay(3, "请接入密码键盘");
        PubDisplay(4, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
		uiRet = PubuiInkey(1);
        if (uiRet == EM_key_FUNC1)
		{
			PubSetUsePinpadType();
		}
		if (uiRet == EM_key_FUNC9||uiRet == EM_key_CANCEL)
		{
			return EM_ERROR;
		}
    }
    while ((PubGetPinpadVer(phPinpad ,&iPinpadVer)) == 3)
    {
        PubDisplayInv(2, "请接好密码键盘");
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
#ifndef EPT5610
    //20070914  by wei 将安全级别设置成默认级别
	if ( iPinpadVer == 2 )  
	{
		EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &puiConfigInfo);
		if ( puiConfigInfo != EM_pin_DEFAULTCONFIG)
		{
			EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG);
		}
	}
#endif
    EA_ucCloseDevice(&phPinpad);

    nFirstSetupFlag = NO;

    if (PubucFirstRunProg(pcModuleName) == EM_SUCCESS)
	{
        FV.gbnFirstFlag = YES;
		WRITE_nVAR(FV.gbnFirstFlag);
	}


    // 导入def8583.h中的8583包定义
    if (PubImport8583(YlIso8583Def) == EXCEPTION)
    {
        EA_vCls();
        PubDisplay(3, "8583包导入出错");
        PubDisplay(4, "请检查程序重新下装");
        PubuiInkey(0);
        return EXCEPTION;
    }
    // 导入结束 
	PubGetMifsType(&iMifsType);	//增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断

    if (FV.gbnFirstFlag == YES)
    {
        PubSetupFirst();
#ifdef EMVIC
   		setup_first ();
#endif   		
		WRITE_nVAR(FV); //这里把setupfirst里面的内容统一写入一次
        nFirstSetupFlag = YES;
        FV.gbnFirstFlag = NO;
		WRITE_nVAR(FV.gbnFirstFlag);

        FV.gbnParaFirstFlag = YES;
		WRITE_nVAR(FV.gbnParaFirstFlag);

        if (FV.gbnParaFirstFlag == YES)
        {
            PubReadPara() ;
        }
        FV.gbnParaFirstFlag = NO;
		WRITE_nVAR(FV.gbnParaFirstFlag);
    }
    if (FV.gbnParaFirstFlag == YES)
    {
        PubReadPara();
    }
    if (nFirstSetupFlag == YES)
    {
		PubInitGlobal();
        PubSetup(10);
        nFirstSetupFlag = NO;
    }
	else
	{    
		PubInitGlobal();
	}
#ifdef TMS
	//读取主控应用参数
	ProReadBasePara();
#endif
	// by wei 每次进入应用不需要重新操作员签到 modify by baijz 20110723 BCTC要求每次开机操作员签到
     BUFCLR(szGetBuffer);
//      VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));
//      if (szGetBuffer[0] == LOGON)
//          PubSetPoscfgcPosState(NO_LOGON);

    EA_vCls();
    PubKeyOn();
	PubDisplayInv( 1, "银联应用" ); 
	PubDisplayCen(2, "CUP2.0");
	PubDisplayCen(3, "自检...");

    //ucRet = EA_ucOpenDevice("PINPAD",EM_io_IPP, &phPinpad);
    while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
	{
        PubDisplayInv(2, "打开密码键盘错");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
	}
    while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS)
	{
        PubDisplayInv(2, "请接好密码键盘");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
	}
	// 为多应用,怕其他应用使用和银联相同的mackey workkey的ID号,这里重新load一次。
	PubucSelectKey(phPinpad, EM_pin_MASTERKEY, FV.bank.nMKeyIndex);
	if(FV.Other.gbMacKeyLen)
		PubucLoadKey(phPinpad,EM_pin_DEFAULTMODE ,EM_pin_MACKEY, 0, FV.Other.gbMacKeyLen, FV.Other.gbszMacKey);
	if(FV.Other.gbWorkKeyLen)
		PubucLoadKey(phPinpad, EM_pin_DEFAULTMODE ,EM_pin_WORKKEY, 0, FV.Other.gbWorkKeyLen, FV.Other.gbszWorkKey);
    EA_ucCloseDevice(&phPinpad);
    if (PubuiInkeyMs(500) == EM_key_CANCEL)
        PubLogin();

	PubGetMifsType(&iMifsType);	//增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断
    PubInitComm(&CommInfo, AUTOCHECK);
    BUFCLR(szGetBuffer);
    VERIFY_NORMAL(PubGetPoscfgcBatchState(szGetBuffer));

    if (szGetBuffer[0] == YES)
    {
        EA_vCls();
        PubDisplayInv(2, "请先结算再作交易");
        PubuiInkey(0);
    }
    BUFCLR(szGetBuffer);
	BUFCLR(gbPosTags);
	gbTags = 0; 
#ifdef EMVIC
	PubSetExeReader(1);
#endif
	// 为防止清冲正标志的时候死机这种非常极端小概率事件,这里做一次判断最后一笔交易流水来清冲正
	PubPreAutoVoid();
	nScreen = 0 ;
    while (1)
    {
		// 当冲正标识、冲正缓冲区两者中的一个为0时,两者都清0
		if (FV.Void.cAutoVoidFlag != 1 || !memcmp(FV.Void.gbszVoidStr, "\x00\x00\x00\x00\x00\x00\x00\x00", 8))
		{
			PubClearAutoVoidBuf();
		}
		PubClearIcon();// //清图标行
#ifdef TMS
		if (ProJudgeBaseDlaVer() == EM_SUCCESS)
		{
			ProGetBaseDialFix();
			ucRet = PubReturnUpdate() ;
			if (ucRet != EM_ERROR)
			{
				PubDelAllBit(&iso);
				close_all_dev();
				return ucRet;
			}
			if (PubCheckRunState() == EM_SUCCESS)
			{
				PubDelAllBit(&iso);
				close_all_dev();
				return EM_ERROR;
			}
			if (PubCheckSettleTimes() == EM_SUCCESS)
			{
				PubDisplay(2 , "到达累计结算次数");
				PubDisplay(3 , "自动联机报道");
				PubuiInkey(2);
				FV.SettleTimesCount = 0;
				WRITE_nVAR(FV.SettleTimesCount);
				PubDelAllBit(&iso);
				close_all_dev();
				return 29;// 标签120000029
			}
		}
#endif
        memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
		memset(&gbCardinfo, 0, sizeof(struct CardConfig));

		//FV.Other.POSSTATFLAG = 6;//chenjs20060915 ls add for test TMS 
		
        switch (FV.Other.POSSTATFLAG)
        {
        case 0:
            break;
        case 1:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求下载参数");
            PubDisplay(2, "请按确认键继续");
			PubuiInkey(0);  
            PubDownPara();
            continue;
        case 2:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求上传状态");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
            PubUploadState();
            continue;
        case 3:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求重新签到");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
			PubSetPoscfgcLoginState(NO_LOGON);   //add by chenjis 20130423
            PubBankLogin();
            continue;

#ifdef EMVIC
        case 4:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求公钥下载");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
            if(PubYlConnect(&CommInfo)!=NORMAL)
			    continue;
	    	if (PubQueryPubilcKey () == 1)
			{
			    PubDownPubilcKey ();
			}
		    PubDialOff (&CommInfo);
			continue;     
        case 5:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求更新参数");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
	        if(PubYlConnect(&CommInfo)!=NORMAL)
			    continue;
//add by baijz 20110906 下载过程断电,需要删除EMV参数文件,否则会重复下载
			EA_ucPFDel (FEmvPara);
			EA_ucPFCreate (FEmvPara, (sizeof (struct EMVPARA)));
//add end 
		    PubDownEmvPara ();
		    PubDialOff (&CommInfo);
            continue;
#endif

#ifdef TMS
		case 6:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
			EA_vCls();
            PubDisplay(1, "要求下载TMS参数");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(60);
	        TmsDownPara();
			continue;
#endif
			
			case 7:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
			EA_vCls();
            PubDisplay(1, "要求下载卡BIN黑名单");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(60);
	        PubDownCardBin();
			continue;
			//JP add
        default:
            break;
        }
		FV.Other.POSSTATFLAG = 0;//chenjs20070104 add防止不小心死循环
		CheckPOSSTATFLAGTimes = 0;

		WRITE_nVAR(FV.Other.POSSTATFLAG);
        EA_ucGetDateTime(&datetime);
        sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay);
        PubDialOff(&CommInfo);

        // 判断打印是否完成 
        PubJudePrintFinish(1);

        if (EA_ucPFOpen(YLWATER, &ucFd) == EM_SUCCESS)
        {
            uiCount1 = 0;
			uiCount2 = 0;
            EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount1);    //查询剩余笔数
			EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiCount2);   //查询有效笔数 //add by chenjis 20130624
            if (uiCount1 < 5 || uiCount2 >= FV.Other.gbnForceSettleNums)  //modify by chenjis 20130624
            {
                EA_vCls();
                PubDisplayInv(1, "系统报告");
				if(uiCount1 < 5)
					PubDisplay(2, "存储满,请先结算");
				else
					PubDisplay(2, "满%d笔,请先结算", FV.Other.gbnForceSettleNums );
                PubDisplay(3, "按确认键结算");
                PubuiInkey(0);
                EA_ucPFClose(ucFd);
                PubSettle();
                continue;
            }
            EA_ucPFClose(ucFd);
        }
//		 如果隔日了,就要求POS的操作员签到。
		if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 ))
			PubSetPoscfgcPosState(NO_LOGON);

        BUFCLR(szGetBuffer);
        VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));
           
        if (szGetBuffer[0] == NO_LOGON)
        {
#ifdef TMS
			EA_vCls();
			PubDisplayInv(1,"银联EMV应用");
			PubDisplayCen(3,"按任意键签到");
			PubDisplayCen(4,"按取消键切换应用");
			uiRet = PubuiInkey(10);
			if (uiRet == EM_key_FUNC9|| uiRet == EM_key_CANCEL)
			{
				EA_vCls();
				PubClearIcon();// //清图标行
                PubDisplayCen(2, "应用切换");
                PubuiInkeyMs(500);
                PubDelAllBit(&iso);
				close_all_dev();
				EA_vCls();
                return EM_ERROR;
			}
#endif
            if (PubLogin() != NORMAL)
                continue;
        }
	
        

//   20060119
//for test dudj
/*
PubDisplay(3, "是否联机签到?");
 if (PubuiInkey(2)!=EM_key_ENTER)
	sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
PubDisplay(3, "");
*/
		// 测试的时候打开。发布的封掉
//		sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
        if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 ))
        {
                if (PubBankLogin() != NORMAL)
                {
                    PubSetPoscfgcPosState(NO_LOGON);
                }
                else
                {
			        EA_ucGetDateTime(&datetime);
					sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay);
                    sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
					WRITE_nVAR(FV.Other.gbLoginDate);
                }
			    continue;
        }           
        
        BUFCLR(szGetBuffer);
        VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));

        if (szGetBuffer[0] == LOCK)
        {
            PubLock();
            continue;
        }

        PubGetPoscfgcMenuTime(&cMenuTime);
		PubGetTermCapSet();     //add by chenjis 20130311
        while (1)
        {
// 			PubSetExeReader(0);
			gbcECDefault = 0;
			gbcMifUpCard = 0;
			PubClearIcon();// //清图标行
#ifdef TMS
			if (ProJudgeBaseDlaVer() == EM_SUCCESS)
			{		
				// for 主控应用更新,添加一个新返回值2
				ucRet = PubReturnUpdate() ;
				if (ucRet != EM_ERROR)
				{
					PubDelAllBit(&iso);
					close_all_dev();
					return ucRet;
				}
				if (PubCheckRunState() == EM_SUCCESS)
				{
					PubDelAllBit(&iso);
					close_all_dev();
					return EM_ERROR;
				}
				if (PubCheckSettleTimes() == EM_SUCCESS)
				{
					PubDisplay(2 , "到达累计结算次数");
					PubDisplay(3 , "自动联机报道");
					PubuiInkey(2);
					FV.SettleTimesCount = 0;
					WRITE_nVAR(FV.SettleTimesCount);
					PubDelAllBit(&iso);
					close_all_dev();
					return 29;// 标签120000029
				}
			}
#endif
            PubSetPoscfgcSettleEnd(1);  /*设置结算未结束标志 */
            EA_vCls();
			PubClearIcon();// //清图标行
           // nScreen = 0 ;
            //chenjs20060725 add down
            memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
            memset(&gbCardinfo, 0, sizeof(struct CardConfig));
#ifndef TAICANGTEST
			PubSetBankcMacChk(MAC_X99);
#else
			PubSetBankcMacChk(MAC_NO);
#endif
#ifdef EMVIC          
            //ecash   by wei
			gblTranAmt = 0l;
			BUFCLR(gbszTermData);
			gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes
#endif
			strcpy(gbszErrCode, "");
//             if(nScreen == 0)
//             {
// 		        PubDisplay (1, "1.消  费   2.撤  销");
// 		        PubDisplay (2, "3.退  货   4.预授权");
// 		        PubDisplay (3, "5.离  线   6.打  印");
// 		        PubDisplay (4, "7.管  理   8.其  它");
//             }
// 			else
// 				PubDisplay (1, "9.转  账   0.水电煤");
            //[08/31/2015 shizd]modify
            PubDisplay (1, "1.查  询   2.消  费");
            PubDisplay (2, "3.撤  销   4.补  登");
            PubDisplay (3, "5.管  理   6.打  印");
            gbTrkInfo.cDoneFlag = 0;
            uiKey = PubuiInkey((char) cMenuTime);
            if (uiKey == EM_key_FUNC||uiKey == EM_key_CANCEL)
            {
                uiKey = EM_key_NOHIT ;           
            }
            if (uiKey == EM_key_ENTER)
            {
                nScreen = (nScreen + 1) % 2;
				continue;               
            }
            uiOption = 0;
            //if (nScreen == 1)
                //uiOption += 8;
            switch (uiKey)
            {
            case EM_key_NOHIT:
                PubDisdoter();
				/*chenjs 20060228 del
                PubDisplays(5 , 1 , " ");
                PubDisplays(6 , 1 , " ");
				*/
                PubDispLogo();
                cWaitRet = PubWaitProcess(&ucRetVal);
                if (cWaitRet == EXCEPTION)
                    continue;
				PubClearIcon();// //清图标行
                switch (ucRetVal)
                {
                case 0x99:
                    continue;//[08/31/2015 shizd]add for不允许待机快速交易
                    if (FV.Other.gbuiDefault == 0)       //无默认交易 
                        continue;
                    else        // 有默认交易 
                    {
                      if (FV.Other.gbuiDefault == PRE_AUTH)
                            uiOption = 9;
                        else
                            uiOption = 1;
                       break;
                    }
                // 屏保状态下对快捷键的响应 
                case EM_key_PURCHASE:
                    uiOption = 1;
                    break;
                case EM_key_POSVOID:
                    uiOption = 2;
                    break;
                case EM_key_QUERY:
                    uiOption = 10;
                    break;
                case EM_key_REFUND:
                    uiOption = 3;
                    break;
                case EM_key_PREAUTH:
                    uiOption = 9;
                    break;
                case EM_key_SETTLE:
                    uiOption = 12;
                    break;
				case '1':
                    uiOption = 13;// 电子现金快速支付
                    break;
				case '2':
                    uiOption = 14;// 电子现金余额查询
                    break;
				case '3':
					uiOption = 15;//分期付款消费
					break;
				case '4':
					uiOption = 16;//手机芯片消费
					break;
				case '5':
					uiOption = 9;//预授权
					break;
				case '6':
					uiOption = 17;//预授权撤销
					break;
				case '7':
					uiOption = 18;//预授权完成请求
					break;
				case '8':
					uiOption = 19;//圈存
					break;
                case EM_key_CANCEL:
					PubClearIcon();// //清图标行
					EA_vCls();
					PubDisplayCen(2, "应用切换");
					PubuiInkeyMs(500);
					PubDelAllBit(&iso);
					close_all_dev();
					EA_vCls();
                    return EM_ERROR;
                default:
					nScreen = 0;
                    continue;
                }
                break;

                // 对快捷键的响应 
            case EM_key_PURCHASE:
                uiOption = 1;
                break;
            case EM_key_POSVOID:
                uiOption = 2;
                break;
            case EM_key_QUERY:
                uiOption = 10;
                break;
            case EM_key_REFUND:
                uiOption = 3;
                break;
            case EM_key_PREAUTH:
                uiOption = 9;
                break;
            case EM_key_SETTLE:
                uiOption = 12;
                break;
            // 对ATM键的响应  
            case EM_key_L1:
            case '1':
                uiOption = 10;
                break;
            case EM_key_R1:
            case '2':
                uiOption = 1;
                break;
            case EM_key_L2:
            case '3':
                uiOption = 2;
                break;
            case EM_key_R2:
            case '4':
                uiOption = 21;
                break;
            case EM_key_L3:
            case '5':
                uiOption = 7;
                break;
            case EM_key_R3:
            case '6':
                uiOption = 6;
                break;
//             case EM_key_L4:
//             case '7':
//                 uiOption = 7;
//                 break;
//             case EM_key_R4:
//             case '8':
//                 uiOption = 8;
//                 break;
// 			//添加转账 liudy
// 			case '9':
// 				uiOption = 11;
// 				break;
//             //添加水电煤 liudy
//             case '0':
//                 uiOption = 20;
//                 break;
			case EM_key_FUNC8:
#ifdef EPT_A9L
				EA_vCls();
				PubDisplay(2, "写内存文件次数:");
				PubucGetMfVarCnt((char*)MODULE_FILE_NAME, &llCnt);
				BUFCLR(szData);
				sprintf(szData, "%lld", llCnt);		
				PubDisplay(3, "  %s", szData);
				PubuiInkey(5);
#endif
				continue;
			
            case EM_key_FUNC9:
                EA_vCls();//chenjs20061127 add
                PubDisplayCen(2, "应用切换");
                PubuiInkeyMs(500);
                PubDelAllBit(&iso);
				close_all_dev();
				EA_vCls();
                return EM_ERROR;
            default:
                continue;
            }
            if (uiOption >= 1 && uiOption <= 21)
                break;
        }
//        PubInitComm(&CommInfo, WAIT);
        PubProcess(uiOption);
//        gbnTransType = 0;
    }
    return EM_SUCCESS;
}
Esempio n. 18
0
/**************************************
*功能:	基于EMV整个流程交易结果显示
*注意:  卡片批准后显示查询余额
*参数意义:
*		pos.transresult:0x00--交易批准 
*						 0x01--交易拒绝
***************************************/
void PubEMVResult(struct FileRecStru *TmpPos)
{
	char szBuffer[50];	  
	char szRetAmt[15];	  
    unsigned char ucRet;
	int i, nLen;
    DevHandle hdlPinpad;
	char szBuf[50];//chenjs20070125 add
	
	i = 0;
	while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2))
		i ++;
	PubClearAll();
	if (err_mess [ i ][ 0 ] == '\0')	   /* Unknow Error*/
		sprintf(szBuffer, "交易失败[%2.2s]",gbszErrCode);
	else	 
		strcpy(szBuffer, err_mess[i]);   /*Defined Error*/
	
	if (memcmp(gbszErrCode, "00", 2)&&TmpPos->transresult == 0x00 )
	{
	    if (gbnTransType != LOGIN && gbnTransType !=LOGOUT)
	    {
	          PubClearAll();
	    	if (strlen(szBuffer) > 20)
	    	{
	    		//chenjs20060712 del PubDisplayCen(2, "交易失败");
	    		PubDisplay(2, "%20.20s", szBuffer);//chenjs20060712 3->2
	    		PubDisplayCen(3, szBuffer + 20);//chenjs20060712 4->3
	    	}
	    	else
	    	{
	    	
	    		PubDisplayCen(2, "交易失败");
	    		PubDisplayCen(3, szBuffer);
	    	}	
		PubVoice(4);
		BUFCLR(szCMDRetCode);
		BUFCLR(szCMDRetMsg);
		memcpy(szCMDRetCode,gbszErrCode, 2); 
		strncpy(szCMDRetMsg,szBuffer+2,sizeof(szCMDRetMsg) - 1);	
//		PubuiInkey(2);
	    }
    } 	
	
	if (!memcmp(gbszErrCode, "00", 2) && TmpPos->transresult == 0x01)
	{
		BUFCLR(szBuf);
		PubHexToAsc(szBuf,TmpPos->tvr,10,0);
		EA_vCls();
		PubDisplays(1,1,"95:%s",szBuf);
		PubDisplays(2,1, "9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]);
		strcpy (szBuffer, "交易拒绝");
		PubDisplayCen(3, szBuffer);
		PubDisplayCen(4, "请拔卡");
		PubuiInkey(5);
		EA_vCls();
	}
	//add by wei bctc debug 拒绝交易也显示tvr
	if ((strlen(gbszErrCode)==0) && TmpPos->transresult == 0x01)
	{
		BUFCLR(szBuf);
		PubHexToAsc(szBuf,TmpPos->tvr,10,0);
		EA_vCls();
		PubDisplays(1,1,"95:%s",szBuf);
		PubDisplays(2,1, "TSI9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]);
		strcpy (szBuffer, "交易拒绝");
		PubDisplayCen(3, szBuffer);
		PubDisplayCen(4, "请拔卡");
	       PubuiInkey(5);
		EA_vCls();
	}
	

	if (memcmp(gbszErrCode, "00", 2)&&(strlen(gbszErrCode)>0))//bctc add by wei
	{
		
		//chenjs20070125 add down 解决研发测试组提的显示不完整
	          PubClearAll();
              if (strlen(szBuffer) > 20)
		{
            BUFCLR(szBuf);
            memcpy(szBuf, szBuffer, 20);
            PubDisplayCen(2, szBuf);
            PubDisplayCen(3, szBuffer + 20);
		}
              else
		PubDisplayCen(2, szBuffer);
		PubDisplayCen(4, "请拔卡");
		PubVoice(4);
		BUFCLR(szCMDRetCode);
		BUFCLR(szCMDRetMsg);
		memcpy(szCMDRetCode,gbszErrCode, 2); 
		strncpy(szCMDRetMsg,szBuffer+2,sizeof(szCMDRetMsg) - 1);	
		PubuiInkey(2);
	}
	//chenjs20070125 add up




	
	if (!memcmp(gbszErrCode, "00", 2) && (gbnTransType == INQUERY  || gbnTransType == YLJF_INQUERY || gbnTransType == CDT_OPEN || gbnTransType == CDT_QUERY) && TmpPos->transresult == 0x00)
	{
		nLen = sizeof(szBuffer);
		PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen);
		if (nLen == 0)
		{
			PubClearAll();
			PubDisplayInv(2, "未返回余额");
			BUFCLR(szCMDRetCode);
			BUFCLR(szCMDRetMsg);				
			strcpy(szCMDRetCode,"XR");	
			strcpy(szCMDRetMsg,"未返回余额");	
			EA_vBeepMs(1000);
			PubuiInkey(3);
			return;
		}
		
		memcpy(szRetAmt, szBuffer + 7, 13);
		szRetAmt[13] = '\0';
		if (szRetAmt[0] == 'C')
			szRetAmt [ 0 ] = ' ';
		else
			szRetAmt [ 0 ] = '-';
		i = 1;
		while (1)
		{
			if (i == 13)//chenjs20061115 12->13
				break;
			if (szRetAmt[i] !='0' && szRetAmt[i] != ' ')
				break;
			//chenjs20061115研发测试if (szRetAmt[i] == '0')
			if (szRetAmt[i] == '0' && i < 10) //chenjs20061115 add
				szRetAmt[i] = ' ';
			//chenjs20061115 add down
			if( i >= 10 && szRetAmt[i] == ' ')
				szRetAmt[i] = '0';
			//chenjs20061115 add up
			i ++;
		}		 
		
		if ( FV.EmvStru.gbcExeReader == YES)
		{
			EA_ucCloseComm();
		}

        ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad);
        if (ucRet != EM_io_SUCCESS)
        {
			//PubuiInkey(3);
            PubClearAll();
            if (ucRet == EM_io_OPENED)
                PubDisplay(2, "密码键盘已经打开");
            else
			{
                PubDisplay(2, "无法打开密码键盘");
				PubuiInkey(3);
				return ;
			}
            PubuiInkey(3);
        }
        sprintf(szBuffer, "%11.11s.%2.2s", szRetAmt, szRetAmt + 11);
		if ( iPinpadType == 1 )	//外置PINPAD
		{
			EA_vCls();
			PubDisplayCen (2, "查询成功");
			PubDisplayCen (3, "请查看密码键盘");
			PubDisplayCen (4, "并拔卡");
			PubucDispPinpad(hdlPinpad, 1, "Balance:");
			PubucDispPinpad(hdlPinpad, 2, szBuffer);
		}
		else
		{
			PubDisplay(3, "余额:%s元", szBuffer);
			sprintf(szBuf , "      %14.14s" , szBuffer);
			EA_vCls();
			PubDisplayCen (1, "查询成功");
			PubDisplay (2, "可用余额:");
			PubDisplay(3, "%s", szBuf);
			PubDisplayCen (4, "请拔卡");
		}
		while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS);
		RemoveIccTimeOut(10);
        if ( iPinpadType == 1 )	//外置PINPAD
        {
			if ( FV.EmvStru.gbcExeReader == YES)
			{
				EA_ucCloseComm();
			}
			
			ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad);
			PubClearAll();
            PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE ");
            PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD");
			while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS);
        }
        
	}
	EA_vCls();
	return;
}
Esempio n. 19
0
int read_from_EFT(int *pLen, char *readstr)
{
	char buffer[512];
	ET_ProductInfo tProductInfo;
	uint unActLen;
	uchar ucRet;
	DevHandle hRS232Handle = EM_INVALID_HANDLE;
	
	unActLen = 0;
	
#ifdef EPT_A9L
    memset(&tProductInfo, 0x00, sizeof(ET_ProductInfo));
	EA_ucGetProductInfo(&tProductInfo);
	if ( memcmp(tProductInfo.acName , "E520" , 4) == 0 && tProductInfo.ucMachType == 2)
	{
		ucRet = EA_ucOpenDevice("COM3", 0, &hRS232Handle);
	}
	else
	{
		ucRet = EA_ucOpenDevice(SERIAL_PORT, 0, &hRS232Handle);
	}

#else
	ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &hRS232Handle);
#endif
	if (ucRet != EM_SUCCESS || hRS232Handle == EM_INVALID_HANDLE)
	{
		EA_vCls();
		EA_vDisplay(2, "打开RS232口出错[%02x]", ucRet);
		EA_ucCloseDevice(&hRS232Handle);
		
		PubuiInkey(3);
		return (EXCEPTION);
	}

	ucRet = EA_ucInitRS232(hRS232Handle, EM_232_9600BPS, EM_232_NOPAR, EM_232_8DBS);
    if (ucRet != EM_SUCCESS)
    {
        EA_vCls();
        EA_vDisplay(2, "RS232初始化错[%02x]", ucRet);
        EA_ucCloseDevice(&hRS232Handle);
        
        PubuiInkey(3);
		return (EXCEPTION);
    }

	while (1)
    {
		*pLen = 0;
		/*
		* read STX 0x02 until time out
		*/
		memset (buffer ,0 ,sizeof(buffer));
		do
		{
			if(EM_key_HIT == EA_ucKBHit()) 
			{		
				EA_ucCloseDevice(&hRS232Handle);
				return (EXCEPTION);	    
			}
			EA_ucReadDeviceMs(hRS232Handle, 1, 10, buffer, &unActLen);
        } while (buffer[0] != 0x02);
		
        //read left data
		ucRet = EA_ucReadDeviceMs(hRS232Handle, 200, 10, buffer+1, &unActLen);
        if (ucRet != EM_SUCCESS || unActLen > 200)
            continue;

//        debug_print((char*)"SERIAL CMD", buffer, unActLen + 1);//FIXME
        
        *pLen = unActLen + 1;
        memcpy(readstr, buffer, *pLen);

		break;
	} //end of while
	
	EA_ucCloseDevice(&hRS232Handle);
	return (NORMAL);
}
Esempio n. 20
0
/*
 * 函数功能:IC密钥卡发行
 * 入口参数:无
 * 出口参数:无
 * 返 回 值:NORMAL     ―― 成功
 *           EXCEPTION  ―― 失败
 */
int	PubICCreateKey(void)
{
	unsigned char ucSedBuf[256],ucRecBuf[256],szBuf[4096];
	unsigned int uiRetLen;
   	int i, j;
	CARDHEADER stCardHead;
	KEYREC stKeyRec;
	unsigned char szKeyPwd[9],ucTEK1[17],ucTEK2[17],ucTMK[17],ucTMK1[17],ucTMK2[17],chLRCValue, chCheckvalue[9], kyLRCValue;
	unsigned char  ucRandom[5], ucCardMonKey[17], ucMac[9], ucEncryptData[33];
	int nKeyNum;
	ET_DATETIME tDateTime;
	char szBuffer[100], cRet;

	EA_vCls();
	if ( PubOpenUserICCardDev () != NORMAL )
		return EXCEPTION;

	PubDisplayInv(1, "IC密钥卡发行");
	PubDisplayCen(2, "请插入密钥IC卡");
    PubDisplayCen(3, "按<取消>退出");
    while(1)
    {
      	if ( PubUserICCardIn() == NORMAL )
       		break;
       	if (EA_ucKBHit () == EM_key_HIT)
		{
			if (PubuiInkey (1) == CANCEL)
			{
				return EXCEPTION;
			}
		}
    }
	if ( PubUserICCardPowerUp() != NORMAL )
		return EXCEPTION;

	BUFCLR(ucCardMonKey);		//卡片主控密钥默认是16个0x00

	PubClearAll();
	PubDisplay(2,"请输入密钥卡密码");
	PubKeyOff();	
	BUFCLR(szBuffer);
	cRet = PubGetAStr(3,BIGFONT,szBuffer,8);
	PubKeyOn();
	if (cRet != NORMAL) 
	{
		return EXCEPTION;
	}
	strcpy(szKeyPwd, szBuffer);

	//写卡时间做为一级转加密密钥(POS时间后补0xFF0xFF)
	BUFCLR(ucTEK1);	
	EA_ucGetDateTime (&tDateTime);
	sprintf (szBuffer, "%4d%02d%02d%02d%02d%02d", tDateTime.usYear, tDateTime.ucMonth,
			 tDateTime.ucDay,tDateTime.ucHour,tDateTime.ucMinute,tDateTime.ucSecond);
	memset(ucTEK1, 0xff, 16);
	memcpy (ucTEK1, szBuffer, 14);

	//手工输入的密码做为二级转加密密钥
	BUFCLR(ucTEK2);
	memset(ucTEK2, 0xff, 8);
	memcpy(ucTEK2, szKeyPwd, strlen(szKeyPwd));


	//获取随机数
	if ( ProICCComm1 ("GET CHALLENGE",CPU_CARD, 0x00, 0x84, 0x00, 0x00, 0x00, ucSedBuf,
					0x04, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
	memcpy(ucRandom,ucRecBuf,4);

	//外部内证
	BUFCLR(szBuf);
	memcpy(szBuf, ucRandom, 4);
	DES(ucCardMonKey, szBuf, ucSedBuf);
	if ( ProICCComm1 ("EXT AUTH",CPU_CARD, 0x00, 0x82, 0x00, 0x00, 0x08, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	//擦除目录
	if ( ProICCComm1 ("CLEAR MF",CPU_CARD, 0x80, 0xee, 0x00, 0x00, 0x00, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("DF1选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00",
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	//建立安全文件
	memcpy(ucSedBuf, "\x1E\x00\x00\x01\x00\xF0\xF0\x00\xFF\x00\xFF", 11);
	if ( ProICCComm1 ("CREATE FILE",CPU_CARD, 0x80, 0xe0, 0x02, 0x00, 0x0b, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	//写入MF下密钥
	memcpy(ucSedBuf, "\x39\xF0\xF0\x33\x02", 5);
	memcpy(ucSedBuf+5, ucCardMonKey, 16);
	if ( ProICCComm1 ("WRITE KEY",CPU_CARD, 0x80, 0xd4, 0x01, 0x00, 0x15, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	//创建卡信息记录文件
	memcpy(ucSedBuf, "\x00\x00\x03\x00\x20\xF0\xF0\x03\x00\xFF\x00", 11);
	if ( ProICCComm1 ("CREATE FILE",CPU_CARD, 0x80, 0xe0, 0x02, 0x00, 0x0b, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	//创建密钥信息记录文件
	memcpy(ucSedBuf, "\x00\x00\x02\x08\x00\xF0\xF0\x02\x00\xFF\x00", 11);
	if ( ProICCComm1 ("CREATE FILE",CPU_CARD, 0x80, 0xe0, 0x02, 0x00, 0x0b, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("DF1选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x3f\x00",
				0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	//计算密钥的密文
	BUFCLR(ucEncryptData);
	memcpy(ucEncryptData, "\x13\x48\x03\x00", 4);
	memcpy(ucEncryptData+4, ucTEK1, 16);
	memcpy(ucEncryptData+20, "\x80\x00\x00\x00", 4);
	DES(ucCardMonKey, ucEncryptData, ucEncryptData);
	_DES(ucCardMonKey+8, ucEncryptData, ucEncryptData);
	DES(ucCardMonKey, ucEncryptData, ucEncryptData);
	DES(ucCardMonKey, ucEncryptData+8, ucEncryptData+8);
	_DES(ucCardMonKey+8, ucEncryptData+8, ucEncryptData+8);
	DES(ucCardMonKey, ucEncryptData+8, ucEncryptData+8);
	DES(ucCardMonKey, ucEncryptData+16, ucEncryptData+16);
	_DES(ucCardMonKey+8, ucEncryptData+16, ucEncryptData+16);
	DES(ucCardMonKey, ucEncryptData+16, ucEncryptData+16);

	//获取随机数
	BUFCLR(ucRecBuf);
	if ( ProICCComm1 ("GET CHALLENGE",CPU_CARD, 0x00, 0x84, 0x00, 0x00, 0x00, ucSedBuf,
					0x04, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
	memcpy(ucRandom,ucRecBuf,4);

	//计算MAC
	BUFCLR(ucMac);
	memcpy(ucMac, ucRandom, 4);
	BUFCLR(ucSedBuf);
	memcpy(ucSedBuf, "\x84\xd4\x00\x00\x1c", 5);
	memcpy(ucSedBuf+5, ucEncryptData, 24);
	memcpy(ucSedBuf+29, "\x80\x00\x00", 3);
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 8; j++)
		{
			ucMac[j] ^= ucSedBuf[i * 8 + j];
		}
		DES(ucCardMonKey, ucMac, ucMac);
	}
	_DES(ucCardMonKey+8, ucMac, ucMac);
	DES(ucCardMonKey, ucMac, ucMac);

	//写密钥
	memcpy(ucSedBuf, ucEncryptData, 24);
	memcpy(ucSedBuf+24, ucMac, 4);
	if ( ProICCComm1 ("WRITE KEY",CPU_CARD, 0x84, 0xd4, 0x00, 0x00, 0x1c, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	//写卡信息文件
	BUFCLR(szBuffer);
	DES(ucTEK2, szBuffer, chCheckvalue);
	memset(&stCardHead, 0, sizeof(CARDHEADER));
	stCardHead.KeyNum[0] = 0x00;				//密钥数量 根据实际情况填写 最大66条 在此做为测试只写一条
	stCardHead.KeyNum[1] = 0x01;
	memcpy(stCardHead.chExpireDate, "\x20\x99\x12\x31", 4);//有效期
	memset(stCardHead.chReserved, 0xff, 16);
	memcpy(stCardHead.chCheckvalue, chCheckvalue, 4);
	memcpy(szBuf, &stCardHead, 27);
	chLRCValue = 0;
	for(i=0;i<26;i++)
		chLRCValue ^= szBuf[i];
	stCardHead.chLRCValue = chLRCValue;
	if ( ProICCComm1 ("DF3选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x03",
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;
	BUFCLR(ucSedBuf);
	memcpy(ucSedBuf, &stCardHead, 31);
	if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, 0x00, 0x00, 0x1b, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	if ( ProICCComm1 ("DF2选择",CPU_CARD, 0x00, 0xa4, 0x00, 0x00, 0x02, "\x00\x02",
				0x00, ucRecBuf, &uiRetLen) != NORMAL )
		return EXCEPTION;

	nKeyNum = stCardHead.KeyNum[0]*256+stCardHead.KeyNum[1];
	for(i=0; i<nKeyNum; i++)
	{
		BUFCLR(ucTMK);				//终端主密钥明文 根据实际情况填写 在此做为测试固定8个0x31 8个0x32
		memset(ucTMK, 0x31, 8);
		memset(ucTMK+8, 0x32, 8);

		//初始化加密指令
		if ( ProICCComm1 ("INIT FOR DES",CPU_CARD, 0x80, 0x1a, 0x08, 0x03, 0x00, ucSedBuf,
					0x00, ucRecBuf, &uiRetLen) != NORMAL )
			return EXCEPTION;

		//加密
		memcpy(ucSedBuf, ucTMK, 16);
		if ( ProICCComm1 ("DESCRYPT",CPU_CARD, 0x80, 0xfa, 0x00, 0x00, 0x10, ucSedBuf,
					0x10, ucRecBuf, &uiRetLen) != NORMAL )
			return EXCEPTION;
		memcpy(ucTMK1, ucRecBuf, 16);

		//使用手工输入的密码加密,生成二级转加密密钥
		BUFCLR(ucTMK2);
		DES(ucTEK2, ucTMK1, ucTMK2);
		DES(ucTEK2, ucTMK1+8, ucTMK2+8);

		//写密钥信息文件
		nKeyNum = stCardHead.KeyNum[0]*256+stCardHead.KeyNum[1];
		memset(&stKeyRec, 0, sizeof(stKeyRec));
		stKeyRec.kyIndex = 0x00;		//密钥索引 默认值为0x00 实际并没有使用
		stKeyRec.kyNum = 0x01;			//可用次数 0-9 做为预留值 暂时没有使用
		PubAscToHex(stKeyRec.kyMechID, "123456789111115F", 16, 0);	//商户号 根据实际情况填写 记住后补F 在此做为测试
		PubAscToHex(stKeyRec.kyTermID, "11115010", 8, 0);			//终端号 根据实际情况填写 在此做为测试
		memcpy(stKeyRec.kyEncryptMKey, ucTMK2, 16);		//密钥密文
		BUFCLR(szBuf);
		memcpy(szBuf, &stKeyRec, 31);
		kyLRCValue = 0;
		for(i=0;i<29;i++)
			kyLRCValue ^= szBuf[i];
		stKeyRec.kyLRCValue = kyLRCValue;			//校验位
		memcpy(ucSedBuf, &stKeyRec, 31);
		if ( ProICCComm1 ("UPDATE BINARY",CPU_CARD, 0x00, 0xd6, 0x00, 0x00, 0x1f, ucSedBuf,
						0x00, ucRecBuf, &uiRetLen) != NORMAL )
			return EXCEPTION;
	}

	EA_ucCloseDevice (&gbhdlUserCard);

	EA_vCls();
	PubDisplay(2, "发卡成功!");
	PubDisplay(3, "密钥总数:%d", nKeyNum);
	PubuiInkey(20);
	return NORMAL;
}
Esempio n. 21
0
//两个出口参数,*uiTotalKeyCounts = 0表示第一个包接收失败
uchar ucOfflineLoad(uint *uiTotalKeyCounts, uint *uiLoadKeyCounts)
{
	DevHandle hRS232Handle;
	uchar ucRet;  
	uchar ucInitBuf[11];
	uchar ucKeyBuf[100];
	uchar ucCloseBuf[11];
	uchar ucCMD[2];
	uchar ucRespCode[2];
	uint uiDealCounts;//处理次数,三次失败函数返回EM_ERROR
	uint uiNextKeyNo;
	uint uiKeyNo;
	uint uiKeySum;
	uint uiWRecNum;//可写记录数
	uint uiVRecNum;//有效记录数

	uchar ucKeyFileID;
	uchar ucFlashBuf[50];
	uchar ucIsFileEmpty;

	ucRet = PubOpenDevice("COM", EM_io_PORT1,&hRS232Handle);
	if (ucRet != EM_SUCCESS)
	{
		PubClearAll();
		PubDisplayInv(1, "错误");
		PubDisplayCen(2, "打开串口错误");
		PubuiInkey(3);
		EA_ucCloseDevice(&hRS232Handle);
		*uiLoadKeyCounts = 0;	
		return EM_ERROR;
	}
	ucRet = EA_ucInitRS232(hRS232Handle, FV.ucBPS, EM_232_NOPAR, EM_232_8DBS);//!!!!!!!!!!!!!
	ucRet = EA_ucClearRS232(hRS232Handle);//清除缓冲
	
	ucRet = ucInitConnect(hRS232Handle, ucInitBuf);//与PC建链
	if (ucRet != EM_SUCCESS)//建链失败
	{
		PubClearAll();
		PubDisplayInv(1, "错误");
		PubDisplayCen(2, "建链失败");
		PubuiInkey(3);
		EA_ucCloseDevice(&hRS232Handle);
		*uiLoadKeyCounts = 0;
		return EM_ERROR;
	}

	//打开密钥文件
	ucKeyFileID = ucKeyFileOpen("KeyFile");//包含报错
	if (ucKeyFileID == 0)
	{
		ucKeyFileClose(ucKeyFileID);//关闭文件
		EA_ucCloseDevice(&hRS232Handle);
		*uiLoadKeyCounts = 0;
		return EM_ERROR;
	}


	//--------------------------------------------------------
	//查询剩余可写记录数
	ucRet = EA_ucPFInfo(ucKeyFileID, EM_ffs_FREEREC, &uiWRecNum);
	
	if(ucRet == EM_SUCCESS)
	{
		if( uiWRecNum  < 1)
		{
			EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiWRecNum);
			
			PubClearAll();
			PubDisplayInv(1, "错误");
			PubDisplay(2,"系统已有%d条密钥",uiWRecNum);
			PubDisplayCen(3,"密钥文件已满,无法加载密钥");
			PubDisplayCen(4,"请先清除所有密钥");
			
			PubuiInkey(10);
			ucKeyFileClose(ucKeyFileID);//关闭文件
			EA_ucCloseDevice(&hRS232Handle);
			*uiLoadKeyCounts = 0;
			return EM_ERROR;
		}
	}
	//---------------------------------------------------------
	
	ucIsFileEmpty = 0;
	EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiVRecNum);
	if(uiVRecNum == 0)//密钥文件为空
	{
		//使用ucFileOpNoSearch函数
		ucIsFileEmpty = 1;
	}

	//-----------------------------

	*uiTotalKeyCounts = 0;
	uiKeySum = 0;
	uiNextKeyNo = 1;

	PubClearAll();

	while (1)
	{
		uiDealCounts = 3;
		while (uiDealCounts > 0)
		{
			ucRet = ucRecvPackage(hRS232Handle, ucKeyBuf);
			if (ucRet != EM_SUCCESS)//收密钥失败
			{
				PubClearAll();
				PubDisplayInv(1, "错误");
				PubDisplay(2, "接收第%d条密钥失败", uiNextKeyNo);
				PubuiInkey(3);
							
				ucKeyFileClose(ucKeyFileID);//关闭文件
				EA_ucCloseDevice(&hRS232Handle);
				*uiLoadKeyCounts = uiNextKeyNo - 1;	
				return EM_ERROR;
			}

			if(ucKeyBuf[7] != 0x00 || ucKeyBuf[8] != 0x02)//不是离线加载报文,抛弃
			{
				continue;
			}

			uiKeyNo = ucKeyBuf[9] / 16 * 100000 +
					ucKeyBuf[9] % 16 * 10000 +
					ucKeyBuf[10] / 16 * 1000 +
					ucKeyBuf[10] % 16 * 100 +
					ucKeyBuf[11] / 16 * 10 +
					ucKeyBuf[11] % 16 ;//当前密钥序号
			if( uiKeyNo != uiNextKeyNo )
			{
				continue;//若当前密钥序号!=预计的序号,抛弃该包
			}

			if (uiKeySum == 0)//第一次收到密钥包,仅计算一次密钥总条数
			{
				uiKeySum = ucKeyBuf[12] / 16 * 100000 +
					ucKeyBuf[12] % 16 * 10000 +
					ucKeyBuf[13] / 16 * 1000 +
					ucKeyBuf[13] % 16 * 100 +
					ucKeyBuf[14] / 16 * 10 +
					ucKeyBuf[14] % 16 ;//包内密钥总条数

				*uiTotalKeyCounts = uiKeySum;//修改出口
			}

			//核对密钥校验值
			ucRet = ucCheckTMK(&ucKeyBuf[38], &ucKeyBuf[62]);
			if (ucRet != EM_SUCCESS)//密钥校验失败
			{
				ucCMD[0] = 0x80, ucCMD[1] = 0x02;
				ucRespCode[0] = 0x39, ucRespCode[1] = 0x39;
				ucResponse(hRS232Handle, &ucKeyBuf[3], ucCMD, ucRespCode);//&ucInitBuf[3]:SEQ序列号
				uiDealCounts --;
				continue;
			}
			break;
		}//结束该循环表示:收到一个包或重试了三次
		
		if (uiDealCounts == 0)//三次处理失败
		{
			ucCloseConnect(hRS232Handle, ucCloseBuf);//断链
			ucKeyFileClose(ucKeyFileID);//关闭文件
			EA_ucCloseDevice(&hRS232Handle);
			PubClearAll();
			PubDisplayInv(1, "错误");
			PubDisplay(2, "接收第%d条密钥失败",uiNextKeyNo);
			PubuiInkey(3);
			ucKeyFileClose(ucKeyFileID);//关闭文件
			EA_ucCloseDevice(&hRS232Handle);
			*uiLoadKeyCounts = uiNextKeyNo - 1;
			return EM_ERROR;
		}
		                                                                      
		 /*写flash*/
		memcpy( ucFlashBuf, &ucKeyBuf[15], 47 );
		ucFlashBuf[47] = ucKeyBuf[66];
		ucFlashBuf[49] = 0;
		
		if(ucIsFileEmpty == 1) 
		{
			//密钥文件为空时,不搜索匹配,直接添加记录
			if(ucFileOpNoSearch( ucKeyFileID,ucFlashBuf) != EM_SUCCESS)
			{
				ucKeyFileClose(ucKeyFileID);//关闭文件
				EA_ucCloseDevice(&hRS232Handle);
				*uiLoadKeyCounts = uiNextKeyNo - 1;
				return EM_ERROR;
			}
		}
		else if(ucIsFileEmpty == 0)
		{
			//密钥文件非空时,搜索是否有一样记录,防重复
			if( ucFileOp( ucKeyFileID, ucFlashBuf) != EM_SUCCESS)
			{
				ucKeyFileClose(ucKeyFileID);//关闭文件
				EA_ucCloseDevice(&hRS232Handle);
				*uiLoadKeyCounts = uiNextKeyNo - 1;
				return EM_ERROR;
			}		
		}
		else
		{
			PubClearAll();
			PubDisplayInv(1, "错误");
			PubDisplayCen(2, "搜索标志位错误");
			PubuiInkey(3);
			ucKeyFileClose(ucKeyFileID);//关闭文件
			EA_ucCloseDevice(&hRS232Handle);
			*uiLoadKeyCounts = uiNextKeyNo - 1;
			return EM_ERROR;
		}

		
		ucCMD[0] = 0x80, ucCMD[1] = 0x02;
		ucRespCode[0] = 0x30, ucRespCode[1] = 0x30;//加载成功
		ucResponse(hRS232Handle, &ucKeyBuf[3], ucCMD, ucRespCode);//&ucInitBuf[3]:SEQ序列号
//-----------------------------------------------------------
		uiWRecNum--;
		if(uiWRecNum == 0)
		{
			//查询剩余可写记录数
			EA_ucPFInfo( ucKeyFileID, EM_ffs_VALIDREC, &uiVRecNum);
			PubClearAll();
			PubDisplayInv(1, "错误");
			PubDisplay(2,"系统已有%d条密钥",uiVRecNum);
			PubDisplayCen(3,"密钥文件已满,无法加载密钥");
			PubuiInkey(5);
			
			ucKeyFileClose(ucKeyFileID);//关闭文件
			EA_ucCloseDevice(&hRS232Handle);
			*uiLoadKeyCounts = uiNextKeyNo - 1;
			return EM_ERROR;
			
		}
//-----------------------------------------------


		PubDisplayInv(1, "密钥加载");
		PubDisplayCen(2,"正在接收密钥...");
		PubDisplay(3,"接收第%d条密钥成功", uiNextKeyNo);

		uiNextKeyNo ++ ;
		if (uiNextKeyNo - 1 == uiKeySum)//接收完所有密钥
		{
			break;
		}
	}

	ucCloseConnect(hRS232Handle, ucCloseBuf);//断链
	ucKeyFileClose(ucKeyFileID);//关闭文件
	EA_ucCloseDevice(&hRS232Handle);
	*uiLoadKeyCounts = uiNextKeyNo - 1;
	return EM_SUCCESS;
}
Esempio n. 22
0
// E5X0的DLM需要固定dlm_main这个名字,base才能调用
int dlm_main(void)
{
    DevHandle phPinpad;
    uchar     ucFd;
    uint      uiCount, uiValidRec;
    char      cMenuTime;
    uchar     ucRet;
    int       nLoginFailCnt;  // 签到失败次数
    int       nSettleFailCnt;  // 自动结算失败次数
    ET_DATETIME dtTmp;
    char      szBuffer[200];
    char *CMDBUF=0 ;//yinzc add 2011-10-29
    int *nCmdLen=0;//yinzc add 2011-10-29
    int nRet;//yinzc add 2011-10-29
    UINT uiKey;//yinzc add 2011-10-29
#ifdef EPT56X0
    uint      uiConfigInfo;
#endif
    char      cIsAutoVoid=0;    // 是否需要自动发送冲正,开机若有遗留冲正,签到后自动发送一次

    ProInitVar();
    PubucLoadAllMfVar (MODULE_FILE_NAME, (void *)&FV, sizeof(FV));

#ifdef _ECASH_
    PubInitRFReader();
#endif

#ifdef EPT_A9L
    // EPT_A9L的FV内存写操作不记录日志
    PubSetFVDBGMsgWrite(1);
#endif

#ifdef SGPL ///add by kevin 20150423
	uchar ucFd1;
	uint uiCount3;
#endif


    BUFCLR(szBuffer);


    // 导入def8583.h中的8583包定义。
    if (PubImport8583(Iso8583Def) == EXCEPTION)
    {
        EA_vCls();
        PubDisplay(3, "8583包导入出错");
        PubDisplay(4, "请检查程序重新下装");
        PubuiInkey(0);
        ASSERT_NORMAL(EXCEPTION);
    }
    if (PubucFirstRunProg(MODULE_FILE_NAME) == EM_SUCCESS)
        FV.gbcFirstFlag = YES;

    if (PubucFirstRunPara(MODULE_FILE_NAME, PARAM_FILE_NAME) == EM_SUCCESS)
        FV.gbcParaFirstFlag = YES;

    gbPrintHandle  = NULL_HANDLE;
    CommInfo.gbHdl = NULL_HANDLE;

    EA_vCls();


    PubGetPrinterType(&iPrinterType);
    gbcPrintType = iPrinterType;

    PubUsePinpadInside(FV.bank.cPinpadUseInside);
    PubGetPinpadType(&iPinpadType);

    ucRet = FV.bank.cIsDCCMode;
    FV.bank.cIsDCCMode = YES; // 20090928确保DCC模块存在的话,能先执行DCC模块的初始化动作
    ucFd=PubRunBocccProc(CMD_INITPOS, (char *)"", 0);
    FV.bank.cIsDCCMode = ucRet;

    if (FV.gbcFirstFlag == YES || FV.gbcParaFirstFlag == YES)
    {
        if (FV.gbcFirstFlag == YES)
        {
            PubSetupFirst();
#ifdef EMVIC
            setup_first();

            gbnNeedDownAIDParamAll = YES;
            gbnNeedDownAIDParam = YES;//[5/12/2015 shizd]modify
            gbnNeedDownCAPKeyAll = YES;
            gbnNeedDownCAPKey = YES;//[5/12/2015 shizd]modify
#endif
            FV.gbcNeedDownParam = YES;
        }
        PubInitGlobal();

        if (PubReadPara() != NORMAL)
        {
            PubDisplayCen(2, "读参数失败");
            PubDisplayCen(3, "请下载参数");
            PubDisplayCen(4, "或按<确认键>设置");
            while (PubuiInkey(5) != ENTER)
                ;
            PubSetup();
        }
        else
        {
#ifdef TMS
            ProTmsRestorePara();  // 成功读入参数文件后,恢复TMS保存的相关参数
#endif

        }
        FV.gbcFirstFlag     = NO;
        FV.gbcParaFirstFlag = NO;

        PubWriteMemFile(&FV, sizeof(FV));
        PubRunBocccProc(CMD_SETFORCECHGPWD, &FV.bank.cForceChgPwd, 1);

#ifdef TMS
        iInitTmsVar((void *)&EG_tTMSHead, sizeof(EG_tTMSHead));

        // 支持TMS的如果系统管理员密码是默认值,则提示设置,否则不设置
        if (memcmp(FV.gbszParSetupOperPwd, "000000", ADMIN_PWD_LEN) == 0)
        {
            ProSetManager();
            ProSetCustom();
        }
#else
        ProSetManager();
        ProSetCustom();
#endif
    }

    PubInitGlobal();

#ifdef TEL_FUNC
    if (FV.bank.cCommFlag == TCP)
        EA_ucSelectEnetOrFsk(ETH_USED);       //获取以太网模块工作需要的SPI口,使用以太网通讯方式,将无法支持电话来电显示
    else
        EA_ucSelectEnetOrFsk(FSK_USED);       //获取FSK模块工作需要的SPI口

    //电话模块初始化
    TA_Tel_vInit(0x71,0x1b);
//	main_teltest(); // 电话功能测试
#endif


#ifdef EMVIC
#if EPT_A9L || EPT_M3
    EA_EMV_vInit();
#endif
#endif

#ifdef TMS
    iRestoreAllTmsVar((void *)&EG_tTMSHead, sizeof(EG_tTMSHead));  // 载入TMS结构
#endif

    EA_vCls();
    PubDisplayInv(1, "BOC POS");
    PubDisplay(2, "自检...");
    PubKeyOn();
    /*
        EA_vCls();
        PubDisplay(1, "自检:");
        PubDisplayInv(2, "密码键盘");
        PubDisplayCen(3, "打 印 机");
        PubDisplayCen(4, "通 信 口");

        PubDisplayInv(2, "密码键盘");
        EA_vDelay(1);
        PubDisplayCen(2, "密码键盘");
        PubDisplayInv(3, "打 印 机");
        EA_vDelay(1);
        PubDisplayCen(3, "打 印 机");
        PubDisplayInv(4, "通 信 口");
    */

#ifdef _ECASH_
    gblTranAmt = 0l;
    BUFCLR(gbszTermData);
    gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes
    if (FV.bank.nRFReaderType == 0)
        ProAutoSetcBanknRFReaderType();
#endif

    PubDisplay(3, "按<取消>进入设置");
    if (PubuiInkey(1) == EM_key_CANCEL)   //如果误选通讯方式(无线),造成死机,在这里可以进行设置。
        ProGetSuperOper();
    PubDisplay(3, " ");
    while ((ucRet = PubOpenDevice((char *)"PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
    {
        PubClearAll();
        PubDisplayInv(2, "打开密码键盘错");
        PubDisplay(3, "请接好密码键盘%d %d", ucRet, FV.bank.cPinpadUseInside);
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
    while ((PubGetPinpadVer(phPinpad, &iPinpadVer)) == 3)
    {
        PubClearAll();
        PubDisplayInv(2, "请接好密码键盘");
        PubDisplay(4, "[%02x]", FV.bank.cPinpadUseInside);
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
#ifdef EPT56X0
    // 2007-9-18  将pinpad安全级别设置成默认级别
    if (iPinpadVer == 2)
    {
        EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &uiConfigInfo);
        if (uiConfigInfo != EM_pin_DEFAULTCONFIG)
        {
            EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG);
        }
    }
#endif
    PubSetPinTimer(phPinpad, 50); // liudy 将密码键盘超时时间设置为120秒
    while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS)
    {
        PubClearAll();
        PubDisplayInv(2, "请接好密码键盘");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
    EA_ucCloseDevice(&phPinpad);

    //yinzc add below 2011-10-28 for compos
#ifdef COMPOS
    //打开MISPOS的通讯接口
#ifdef EPT_A9L
    //	ucRet = EA_ucOpenDevice("USBD", EM_io_PORT1, &gbhdCMDRS232);
    //debug
    //	PubDisplay(2, "port[%s]", FV.szRecvPortName);
    //	PubuiInkey(1);

    ucRet = EA_ucOpenDevice(FV.szRecvPortName, EM_io_PORT1, &gbhdCMDRS232);
#else
    ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &gbhdCMDRS232);
#endif
    if (ucRet != EM_SUCCESS)
    {
        EA_vCls();
        PubDisplay(1,"无法打开通信端口!");
        PubDisplay(2,"请重启设备");
        EA_vBeepMs(1000);
        PubuiInkey(2);
        return EXCEPTION;
    }
    else
    {
        //		ucRet = EA_ucInitRS232(gbhdCMDRS232,EM_232_9600BPS,EM_232_NOPAR ,EM_232_8DBS);
        ucRet = EA_ucInitRS232(gbhdCMDRS232,EM_232_115200BPS,EM_232_NOPAR ,EM_232_8DBS);
        ucRet = EA_ucCloseDevice(&gbhdCMDRS232);
        //gbhdCMDRS232 = EM_NULL;
    }
#endif
    // end of above //////
#ifdef COMPOS
    if (FV.gbnComposType == 0)//yinzc add 2011-10-28 是否完全COMPOS模式  1--收银机通讯 0--POS通讯
        PubInitComm(&CommInfo, AUTOCHECK);
#endif

    PubRunBocccProc(CMD_IMPORTCARDBIN, NULL, 0);//091001

    gbcPreState    = 0;
    FV.gbNacInfo.cPreState = 0;

//    gbcPosState   = NO_LOGON;   //-zyf
//    gbcLoginState = NO_LOGON;
    nLoginFailCnt = 0;
    nSettleFailCnt = 0;
    cIsAutoVoid = 1;

    PubPreAutoVoid();

    while (1)
    {
        EA_ucGetDateTime(&dtTmp);
        if (dtTmp.usYear != FV.gdtLastCheck.usYear
                || dtTmp.ucMonth != FV.gdtLastCheck.ucMonth
                || dtTmp.ucDay != FV.gdtLastCheck.ucDay)  // 隔日重新签到,自动结算
        {
//linq del 20081203 中行规范未提及隔日签到的功能
//            gbcPosState   = NO_LOGON;
//            gbcLoginState = NO_LOGON;
        }
        FV.gdtLastCheck = dtTmp;

        if (FV.poscfg.cBatchState == YES)
        {
            EA_vCls();
            PubDisplayInv(2, "请先结算再作交易");
            ProAccumulate(); // 重新统计
            PubuiInkey(0);
        }

        if (gbcPreState != 0)
            PubDialOff(&CommInfo);
        gbcPreState = 0;


        //mis不打印del by wangrm 2011-12-6
        // PubJudePrintFinish();

//-zyfdel
//        if (gbcPosState == NO_LOGON)
//        {
//			// 重新获取菜单
//			ProSetDefaultMenu();
//
//            if (PubLogin() != NORMAL)
//                continue;
//            else
//                EA_ucGetDateTime(&FV.gdtLastCheck);
//        }

        //  [7/2/2013 zyf]del
// 		// 签到失败5次则等待用户按键,防止无人值守时无谓的拨号,出现高额话费
// 		if (nLoginFailCnt >= 5)
// 		{
// 			EA_vCls();
// 			PubDisplay(2, "签到失败");
// 			PubDisplay(3, "请按任意键继续...");
//
// 			ProucSetStopFlag(FV.bank.cDisableSave);
//
// 			PubuiInkey(0);
// 			nLoginFailCnt = 0;
//
// 			ProucSetStopFlag(1);
//
// 			continue;
// 		}
//         if (gbcLoginState == NO_LOGON)
//         {
//             if (PubBankLogin() != NORMAL)
//             {
// 				nLoginFailCnt ++;
//                 gbcPosState = NO_LOGON;
// 				PubDialOff(&CommInfo);
// 				PubClearAll();
// 				PubDisplay(3, "签到失败");
// 				PubuiInkey(TIPS_TIMEOUT);
//                 continue;
//             }
//
// 			nLoginFailCnt = 0;
// 			BUFCLR(szBuffer);
// 			memcpy(szBuffer, gbszOper, OPER_NUM_LEN);
// 			memcpy(szBuffer+OPER_NUM_LEN, gbszOperPwd, OPER_PWD_LEN);
// 			PubRunBocccProc(CMD_SETCURRENTOPER, szBuffer, OPER_NUM_LEN + OPER_PWD_LEN);
//         }

#ifdef COMPOS
        if ( nCmdLen != NULL && CMDBUF != NULL)
        {
            FV.CMDBUFLen = *nCmdLen;
            if (FV.CMDBUFLen >0 )
            {
                memset(szCMDBuffer , 0 , sizeof(szCMDBuffer));
                memcpy(szCMDBuffer , CMDBUF , FV.CMDBUFLen);
                FV.szGetCmdFlag = 15;
            }
        }
#endif

        if (gbcPosState == LOCK)
        {
            PubLock();
            continue;
        }

        switch (gbcPosCtrlCode)
        {
        case '1':   // 在交易后下装参数
            FV.gbcNeedDownParam = YES;
            gbcLoginState = NO_LOGON;
            gbcPosCtrlCode = 0;
            continue;
        case '2':   // 强制结束批请求 保留
            break;
        case '3':   // 还有消息需要发送指示 下装参数时 终端批上送时不在此处
            FV.gbcNeedDownParam = YES;
            gbcLoginState = NO_LOGON;
            continue;
        case '4':   // 终端批号更新及签到标志
        case '5':   // 终端批号更新

#ifdef TMS
            PubTmsUpdate(2); // 在系统要求更新批次时,先做TMS更新处理
#endif
            PubUpdateBatchPorc();

            if (strlen((char *)gbszBatchNum) > 0)
            {
                memcpy(FV.bankstate.szBatchNum, gbszBatchNum, 6);
                PubWriteMemFile(&FV.bankstate, sizeof(FV.bankstate));
            }

            if (gbcPosCtrlCode == '4')
                gbcLoginState = NO_LOGON;

            gbcPosCtrlCode = 0;
            if (IsSupportBoccc() == YES &&
                    ( PubRunBocccProc(CMD_ISWATER_EDC,NULL,0) == NORMAL || PubRunBocccProc(CMD_ISWATER_DCC,NULL,0) == NORMAL )
               )//090929卡司结账,有流水的情况才结算
            {
                EA_vCls();
                PubDisplayCen(1, "中行结账已完成");
                PubDisplayCen(2, "将进行卡司结算");
                PubDisplayCen(3, "请勿取消");
                PubDisplayCen(4, "任意键继续");
                PubuiInkey(10);
                PubRunBocccProc(CMD_DCCSETTLE, (char *)"\x00", 1);
                if (PubRunBocccProc(CMD_ISBJMODE, NULL, 0) != NORMAL) // 非北京模式
                    PubRunBocccProc(CMD_EDCSETTLE, (char *)"\x00", 1);

            }
            continue;
        case '6':   // 要求终端签到标志
            gbcLoginState = NO_LOGON;
            gbcPosCtrlCode = 0;
            continue;

        case '7':   // POS终端应该提示终端操作员进行结帐动作
            EA_vCls();
            PubDisplay(2, "请先结算");
            PubuiInkey(TIPS_TIMEOUT);
            break;

        default:
            break;
        }

        // 	当POS上成功批准一笔基于EMV标准/基于PBOC电子现金IC卡离线消费交易后,
        // 如果此时POS上所保留的需要上送IST而未上送IST的交易笔数已经超过基本参数
        // 中"POS中允许保存的未上送交易笔数"的值,则此时,POS必须主动拨号,将未上送交易全部上送到IST。
        //add by liudy COMPOS不允许自主脱机上送
#ifndef COMPOS
        if ((FV.bank.nHasOfflineNum > 0) && (FV.bank.nHasOfflineNum >= FV.bank.nMaxOfflineNum))
        {
            gbnTransType = OFFLINE_UPLOAD;
            PubSendOfflineTrans();
        }
#endif

#ifdef TMS
        // 如果已TMS下载,进行更新处理
        PubTmsUpdate(1);   // 自动结账POS,若无流水,即可以进行程序更新

        if (FV.gbcNeedDownloadTmsPara == YES)
        {
            // 下载TMS参数信息
            if (PubDownTmsParam() == NORMAL) // 下载TMS参数
            {
                FV.gbcNeedDownloadTms = YES;   // 需要进行下载TMS
                FV.gbcNeedDownloadTmsPara = NO; // 不需要进行下载TMS参数
                PubWriteMemFile(&FV.gbcNeedDownloadTms, sizeof(FV.gbcNeedDownloadTms));
                PubWriteMemFile(&FV.gbcNeedDownloadTmsPara, sizeof(FV.gbcNeedDownloadTmsPara));
            }
        }
#endif

// #ifdef EMVIC
// 		if ((gbnNeedDownAIDParam == YES) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0))
// 		{
// 			// 系统主动要求下载AID参数
// 			PubDownEmvPara();
// 		}
// 		if ((gbnNeedDownCAPKey == YES) && (memcmp(AUTHENTIC_VERSION, "\x13\x03", 2) >= 0))
// 		{
// 			// 系统主动要求下载认证中心公钥
// 			PubDownEmvCAPKey();
// 		}
// #endif

        // 开机后自动发送一次冲正
// 		if (cIsAutoVoid == 1) //  [7/2/2013 zyf]del mis不主动交易
// 			PubAutoVoid();
        cIsAutoVoid = 0;

#ifdef COMPOS
        FV.szCMDChangeAppFlag = 0x01;
        ClearCMD();
        while (1)
        {
            FV.poscfg.cSettleEnd               = 0;        /* 设置结算结束标志         */
            //EA_vCls();
            //             nScreen = 0 ;
            //chenjs20060725 add down
            memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
            memset(&gbCardinfo, 0, sizeof(struct CardConfig));
            gbTrkInfo.cDoneFlag = 0;

            //add by liudy 20140228增加显示余额的控制
            if(iDisplayTimer == 1)
            {
                ulong passtime = 0;
                EA_ucGetPassTimer(gbhdlDisplayTimer,&passtime);
                if(passtime >= 3000)
                {
                    if (iPinpadType == 1)
                    {
                        ClearPinpadDisp(gbPinpadHandle);
                        if(gbPinpadHandle != NULL_HANDLE)
                        {
                            while (EA_ucCloseDevice(&gbPinpadHandle) != EM_SUCCESS)
                                ;
                            gbPinpadHandle = NULL_HANDLE;
                        }
                    }
                    iDisplayTimer = 0;
                    EA_ucCloseTimer(&gbhdlDisplayTimer);
                }
            }
            if (CMDCONT.Type == cmd_NONE) // CMD_NONE表示无命令
            {
                nRet = GetCMD();

                if (nRet != NORMAL)
                {
                    PubDisplayInv(1, "中国银行");
                    PubDisplayCen(2, "等待接收数据-->");
                    PubDisplay(3, "  ");
                    PubDisplay(4, "  ");
                    EA_ucLKeySwitch(EM_key_ENLKEY);
                    if (EA_ucKBHit_ped() == EM_key_HIT)
                    {
                        uiKey = PubuiInkey(5);
                        if (uiKey == EM_key_FUNC)
                        {
                            EA_vCls();
                            PubDisplay (1, "1.签到2.重打印");
                            PubDisplay (2, "3.查询交易明细");
                            PubDisplay (3, "4.按流水号查询交易");
                            PubDisplay (4, "5.结算");
                            ucRet = PubuiInkey(10);

                            switch (ucRet)
                            {
                            case '1':
                                EA_vCls();
                                PubLogin();
                                break;
                            case '2':
                                EA_vCls();
                                ProPrintManageExt(1);
                                break;
                            case '3':
                                EA_vCls();
                                PubCheckLsExt(4);
                                break;
                            case '4':
                                EA_vCls();
                                PubCheckLsExt(2);
                                break;
                            case '5':
                                EA_vCls();
                                ProSettle_POS();
                                break;
                            default:
                                break;

                            }
                        }
                    }
                    EA_ucLKeySwitch(EM_key_DISLKEY);
                    continue;
                }
            }

            if (CMDCONT.Type != cmd_NONE)
            {
                break;
            }

        }

        //  [6/8/2013 zyf]
        if (EA_ucPFOpen((uchar *) WATERFILE, &ucFd) == EM_SUCCESS)
        {
            uiCount = 0;
            EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount);
            uiValidRec = 0;
            EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec);
            EA_ucPFClose(ucFd);
            if (uiCount < 5 || uiValidRec >= 300)
            {
                //  [6/7/2013 zyf] 存储满自动清流水
                EA_vCls();
                PubDisplayInv(1, "系统报告");
                PubDisplay(2, "存储满,清流水中");
                NAK_info(4, (char *)"XX",(char *)"交易失败");
                PubuiInkey(1);
                ProDelWater2();
                continue;
            }

        }

        if (PubProcess(CMDCONT.Type) != cmd_INTERRUPT)
        {
            ClearCMD();
        }

#else
        PubDialOff(&CommInfo);

// 20130107 存储满判断从前面调整到这里,避免存储满自动结算,系统返回需要重新签到时无法进入签到的问题
        // 自动结算5次则等待用户按键,防止无谓的拨号,出现高额话费
        if (nSettleFailCnt >= 5)
        {
            EA_vCls();
            PubDisplay(2, "结算失败");
            PubDisplay(3, "请按任意键继续...");

            ProucSetStopFlag(FV.bank.cDisableSave);
            PubuiInkey(0);
            nSettleFailCnt = 0;

            ProucSetStopFlag(1);

            continue;
        }

        if (EA_ucPFOpen((uchar *) WATERFILE, &ucFd) == EM_SUCCESS)
        {
            uiCount = 0;
            EA_ucPFInfo(ucFd, EM_ffs_FREEREC, &uiCount);
            uiValidRec = 0;
            EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiValidRec);
            EA_ucPFClose(ucFd);
			
#ifdef SGPL ///modify by kevin 20150423
			if (EA_ucPFOpen((uchar *)YLSIGNWATER, &ucFd1) == EM_SUCCESS)
			{
				uiCount3 = 0;
				EA_ucPFInfo(ucFd, EM_ffs_VALIDREC, &uiCount3);	  //查询剩余笔数
			}
			if (uiCount < 5 || uiValidRec >= 300 || uiCount3 >= FV.Other.gbnForceSettleSignNums)
#else
			if (uiCount < 5 || uiValidRec >= 300)
#endif
            //if (uiCount < 5 || uiValidRec >= 300)
            {
                EA_vCls();
                PubDisplayInv(1, "系统报告");
                PubDisplay(2, "存储满,请先结算");
                PubDisplay(3, "自动结算...");
                if (PubuiInkey(TIPS_TIMEOUT) != EM_key_FUNC1)
                {
                    if (FV.poscfg.cBatchState == YES)  // 自动结算支持披上送的断点续传
                        PubBatchUp();
                    else
                    {
                        if (PubSettle() == EXCEPTION)
                            nSettleFailCnt++;
                        else
                            nSettleFailCnt = 0;  // 结算成功的

                        PubRunBocccProc(CMD_DCCSETTLE, (char *)"\x00", 1);
                        if (PubRunBocccProc(CMD_ISBJMODE, NULL, 0) != NORMAL) // 非北京模式
                            PubRunBocccProc(CMD_EDCSETTLE, (char *)"\x00", 1);
                    }
                    continue;
                }
            }
#ifdef SGPL
			EA_ucPFClose(ucFd1);
#endif
        }


        cMenuTime = FV.poscfg.cMenuTime;

        // linq add 20081117 重新获取菜单
        ProSetDefaultMenu();

        PubLoadMenu(gbszMenuResource, MenuResource);

        if (QUIT_APP == PubProcMenu(MenuResource, (char *)"中国银行"))
        {
            PubucUnloadAllMfVar(MODULE_FILE_NAME);
            return NORMAL;
        }
#endif
    }
}
Esempio n. 23
0
//  [4/25/2013 zyf]
int PubReadPin_PlainText(int nMaxLen, int nDispMode,char *pcRetStr, unsigned char *pucRetLen)
{
    uchar ucPinLen, ucRet;
    char szPinBuf[20 + 1], szBuffer[30];
    char szPinCardFlag[1 + 1];
    int nEncryptMode;
	int iPinpadType;
    DevHandle hdlPinpad;

    /*
     * 以下检查参数的合法性。
     */
    if ( pcRetStr == NULL)
    {
        PubWriteLog(EXCEPTION, __FILE__, __LINE__);
        return EXCEPTION;
    }

    if ( nDispMode != DISPOFF && nDispMode != DISPON)
    {
        PubWriteLog(EXCEPTION, __FILE__, __LINE__);
        return EXCEPTION;
    }

    /* 
     * 检查在不加密的情况下,缓冲区的大小pucRetLen和要求输入最大长度nMaxLen的合法性 
     */
    if (nMaxLen > 16)
        nMaxLen = 16;

    /* 以上是检查参数的合法性 */


	nEncryptMode = 0;

	PubGetPinpadType( &iPinpadType );
    ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad);
    if (ucRet != EM_SUCCESS)
    {
        PubClearAll();
        PubDisplay(2, "打开密码键盘口错");
        PubuiInkey(3);
	  EA_ucCloseDevice(&hdlPinpad);//chenjs20060925
        return (EXCEPTION);
    }


    PubSetPinTimer(hdlPinpad, 60);//wujianyuan modify 120改成60s 2012-03-03
    memset(szPinCardFlag, 0, sizeof(szPinCardFlag));

    while (1)
    {
        PubClearAll();
        
		
        BUFCLR(szBuffer);       
		PubDisplay(1, "                     ");
        PubDisplay(2, "");

			if ( iPinpadType == 1 )	//外置PINPAD
			{
				PubDisplayCen(2, "请持卡人输入密码");
				PubucDispPinpad(hdlPinpad, 1, "INPUT PIN:");
				PubucDispPinpad(hdlPinpad, 2, "            ");
			}
            else
            {
                PubDisplay(2, "请输入联机密码");
                PubDisplay(5, "无密码按确认键");
            }



        // 参数4,"0456" 仅仅对56X0 有用,5610中参数用不上,只能允许小于16位的密码输入。
        if(nMaxLen <=6)//chenjs20060605 add 
            ucRet = PubReadPinpad(hdlPinpad, 4, "\x00\x04\x05\x06", nDispMode, nEncryptMode, &ucPinLen, szPinBuf);
		else if(nMaxLen <= 8)//chenjs20060605 add 
			ucRet = PubReadPinpad(hdlPinpad, 6, "\x00\x04\x05\x06\x07\x08", nDispMode, nEncryptMode, &ucPinLen, szPinBuf);
		else//chenjs20060605 add 
			ucRet = PubReadPinpad(hdlPinpad, 10, "\x00\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c", nDispMode, nEncryptMode, &ucPinLen, szPinBuf);


		if (ucRet == EM_pin_ABOLISH || ucRet == EM_pin_CANCEL || ucRet == EM_TIMEOUT)
		{
			if ( iPinpadType == 1 )	// dfr add at 2006-04-11
            {
				PubResetPinpad(hdlPinpad);
			//	PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE");
			//	PubucDispPinpad(hdlPinpad, 2, "START PINPAD");
            }
            EA_ucCloseDevice(&hdlPinpad);
			if(ucRet == EM_TIMEOUT)//chenjs20060712 add
			{
                return EXCEPTION;
				//chenjs20060712 add down
			}
			else
			{
				return CANCELED;
			}
			//chenjs20060712 add up
        }
        else if ( ucRet == EM_pin_NOPIN)
        {
                pcRetStr[0] = '\0';
                *pucRetLen = 0;
				if ( iPinpadType == 1 )	// dfr add at 2006-04-11
                {
					PubResetPinpad(hdlPinpad);
				//	PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE");
				//	PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD");
                }
                EA_ucCloseDevice(&hdlPinpad);
                return NORMAL;
        }
        else if (ucRet != EM_SUCCESS)
        {
			if ( iPinpadType == 1 )	// dfr add at 2006-04-11
            {
				PubResetPinpad(hdlPinpad);
			//	PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE");
			//	PubucDispPinpad(hdlPinpad, 2, "START PINPAD");
            }
            PubDisplay(3, "密码键盘故障[%d]", ucRet);
            PubuiInkey(2);
            EA_ucCloseDevice(&hdlPinpad);
            return EXCEPTION;
        }

        break;
    }

        /* 组合一:密码明文返回 */
        if (ucPinLen + 1 > *pucRetLen)
        {
            PubWriteLog(EXCEPTION, __FILE__, __LINE__);
			if ( iPinpadType == 1 )	// dfr add at 2006-04-11
            {
				PubResetPinpad(hdlPinpad);
			//	PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE");
			//	PubucDispPinpad(hdlPinpad, 2, "START PINPAD");
            }
            EA_ucCloseDevice(&hdlPinpad);
            return EXCEPTION;
        }
        memcpy(pcRetStr, szPinBuf, ucPinLen);
        pcRetStr[ucPinLen] = 0;
        *pucRetLen = ucPinLen;


	if ( iPinpadType == 1 )	// dfr add at 2006-04-11
    {
		PubResetPinpad(hdlPinpad);
    }
    EA_ucCloseDevice(&hdlPinpad);
    return NORMAL;
}
Esempio n. 24
0
File: main.c Progetto: 12019/zibogas
/*****************************************************************
 函数原型:Device_Handle_Init()
 功能描述:设备所有句柄初始化
 参数描述:	
				 
 返回值:	OK ? NOTOK
 
 作  者: 刘及华
 日  期:	2012-11-24
 修改历史:
		日期		修改人		修改描述
		------		---------	-------------
*****************************************************************/
INT8U Device_Handle_Init(void)
{
	uchar  ucRet;
	uint   cap_sd;

	if (EA_ucOpenDevice("RFCARD", EM_mifs_TYPEA, &hMifsHandle) != EM_SUCCESS)
	{
		lcddisperr("读卡器初始化失败");
		return notok;
	}
	if ( EA_ucOpenDevice("PRINT", EM_io_REALMODE, &hDprinterHandle) != EM_SUCCESS )
	{
		lcddisperr("获得打印操作句柄失败!");
		return notok;
	}
	if ( EA_ucOpenDevice("USBD", EM_io_REALMODE, &hUSBDHandle) != EM_SUCCESS )
	{
		lcddisperr("获得打印操作句柄失败!");
		return notok;
	}
//  if ( EA_ucOpenDevice("WLM", 0, &hWLMHandle) != EM_SUCCESS )
//  {
//  	lcddisperr("获得GPRS句柄失败!");
//  	return notok;
//  }
///////////////////////////////////////////////打印机设置参数
	ucRet =  EA_ucInitPrinter(hDprinterHandle);
	if ( ucRet != EM_SUCCESS )
	{
		EA_vDisplay(2, "初始化打印机芯失败!");
		return notok;
	}
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_XSPACE, 0);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印字符间距设置失败");
		return notok;
	}
	ucRet =  EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_YSPACE, 8);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印行距设置失败");
		return notok;
	}

	//  ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE, 578);
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE , 180);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印页长度设置失败");
		return notok;
	}

	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_DOTTYPE, EM_prn_ASCIIDOT24X12); 
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印ASCII字符设置失败");
		return notok;
	}
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_PRNTYPE, EM_prn_ASCIIPRN1X1);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印ASCII字符大小失败");
		return notok;
	}
	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_DOTTYPE, EM_prn_HZDOT24X24);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印汉字设置失败!");
		return notok;
	}

	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_PRNTYPE, EM_prn_HZPRN1X1);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印汉字大小设置失败");
		return notok;
	}	

	ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PRNGRAY, 4);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("打印灰度设置失败");
		return notok;
	}
/////////////////////////////////////////////////////////////////////////////初始化时候只设置一次
	if (EA_ucOpenDevice("SAM1CARD", 0, &hSam1Handle) != EM_SUCCESS)
	{
		lcddisperr("PSAM卡初始化失败");
		return notok;
	}
//  if (EA_ucOpenDevice("USERCARD", 0, &hCpuHandle) != EM_SUCCESS)
//  {
//  	lcddisperr("CPU卡初始化失败");
//  	return notok;
//  }
//  if (EA_ucICInitModule(hCpuHandle, EM_ic_VOLDEFAULT, EM_ic_TCRMODE) != EM_SUCCESS)
//  {
//      lcddisperr("设置CPU规范失败");
//   	return notok;
//  }
    ucRet = EA_ucOpenDevice("USBD", 0, &hRS232Handle);
	if ( ucRet != EM_SUCCESS )
	{
		(void)EA_ucCloseDevice(&hRS232Handle);
		lcddisperr("COM口初始化失败!");
		return notok;
	}
	ucRet = EA_ucInitRS232(hRS232Handle, EM_232_115200BPS, EM_232_NOPAR, EM_232_8DBS);
	if ( ucRet != EM_SUCCESS )
	{
		(void)EA_ucCloseDevice(&hRS232Handle);
		lcddisperr("COM口设置失败!");
		return notok;
	}
//获取SD卡信息
	ucRet = EA_ucGetDiskInfo(EM_DISK_SDCARD, &ptDiskInfo);
	if ( ucRet != EM_SUCCESS )
	{
		lcddisperr("请插入SD卡!");
		return notok;
	}
	cap_sd = ptDiskInfo.ullSize / 0x100000;
	EA_vDisplay(3, "  SD卡可用容量%dM", cap_sd);
	SleepMs(2000);
	if(cap_sd < 1)
	{
		lcddisperr("请及时清理SD中数据!");
		Beeperr();
	}
//  // 分配空间来存储磁盘的分区列表
//  ptPartList = EA_pvMalloc(ptDiskInfo.uiPartNum * sizeof(ptPartList));
//  if (!ptPartList)
//  {
//  	lcddisperr("分配SD卡缓存区失败!");
//  	return notok;
//  }
//  // 获取磁盘的分区列表
//  ucRet = EA_ucGetPartList(EM_DISK_SDCARD, ptDiskInfo.uiPartNum, &uiRealPartNum, ptPartList);
//  if (ucRet != EM_SUCCESS)
//  {
//  	EA_vFree(ptPartList);
//  	lcddisperr("获取SD卡列表失败!");
//  	return notok;
//  }
//
//  EA_vDisplay(1, "分区数目:%d", ptDiskInfo.uiPartNum);
//  SleepMs(3000);

	ucRet = EA_ucGetPartInfo(EM_DISK_SDCARD, 0, &ptPartInfo);
	if (ucRet != EM_SUCCESS)
	{
		lcddisperr("获取SD卡分区信息失败!");
		return notok;
	}

	return ok;
}
Esempio n. 25
0
//chenjs20061127 add down for 应用切换
void close_all_dev(void)
{
	DevHandle HandleNull;
#ifdef EPT_A9L
	HandleNull = EM_INVALID_HANDLE;
#else
	HandleNull = EM_NULL;
#endif
    if(gbPrintHandle != HandleNull)
		EA_ucCloseDevice(&gbPrintHandle);
	if(gbhdlMagCard != HandleNull)
		EA_ucCloseDevice(&gbhdlMagCard);
	if(gbhdlUserCard != HandleNull)
		EA_ucCloseDevice(&gbhdlUserCard);
	if(gbhdlMasterCard != HandleNull)
        EA_ucCloseDevice(&gbhdlMasterCard);
	if(gbhdlSAM1Card != EM_NULL)
        EA_ucCloseDevice(&gbhdlSAM1Card);
	if(gbhdlSAM2Card != HandleNull)
        EA_ucCloseDevice(&gbhdlSAM2Card);
	if(gbhdlSAM3Card != HandleNull)
        EA_ucCloseDevice(&gbhdlSAM3Card);
	if(gbhdlSAM4Card != HandleNull)
        EA_ucCloseDevice(&gbhdlSAM4Card);
	if(gbMifCardHandle != HandleNull)
        EA_ucCloseDevice(&gbMifCardHandle);
#ifdef EMVIC 
    if(gbhdlPINPAD != HandleNull)
        EA_ucCloseDevice(&gbhdlPINPAD);
	if(gbhdlRS232 != HandleNull)
	{
#ifdef EPT_A9L
		EA_ucCloseRfCardDevEI(&gbhdlRS232);
#else
		EA_ucCloseDevice(&gbhdlRS232);	
#endif
	}
	if(gbMifCardHandle != HandleNull)
        EA_ucCloseDevice(&gbMifCardHandle);  
#endif
}
Esempio n. 26
0
int dlm_main(char *CMDBUF , int *nCmdLen)
{
    char szGetBuffer[30],szTmpBuf[30];
	char szBuffer[100];

 //   char cWaitRet;
    uint uiKey , uiRet,nRet;
 //   uchar ucRetVal;
//    uchar ucFd;
    uchar ucRet;

    int nScreen = 0;
    char cMenuTime;
 //   uint uiCount;
    uint uiOption;
	uint puiConfigInfo;
//  uchar i,  ucIfExist, ucStatus; 

    const char *pcModuleName = MODULE_FILE_NAME;
//    const char *pcCommModuleName = "applib";
    DevHandle phPinpad;
//    DevHandle hVoiceHandle;
#ifdef EPT_A9L
//	uint_64 llCnt = 0;
//	char szData[100];
#endif

#ifdef EMVIC
	EA_EMV_vInit();
#endif
    //设备句柄清空 
    gbPrintHandle = EM_NULL;
	//清空所有全局设备句柄,add by zhuchentao 060831
	gbhdlMagCard = EM_NULL;;	//磁卡模块 
	gbhdlUserCard = EM_NULL;
	gbhdlMasterCard = EM_NULL;
	gbhdlSAM1Card = EM_NULL;
	gbhdlSAM2Card = EM_NULL;
	gbhdlSAM3Card = EM_NULL;
	gbhdlSAM4Card = EM_NULL;
	gbMifCardHandle = EM_NULL;
#ifdef EMVIC 
	gbhdlPINPAD = EM_NULL;   
	gbhdlRS232 = EM_NULL;
	gbMifCardHandle = EM_NULL; 
#endif
	cRunState = 1;
    CommInfo.gbHdl = EM_NULL;
    memset(&iso, 0, sizeof(ISODataStru));
    memset(&iso1, 0, sizeof(ISODataStru));
    memset(&printiso, 0, sizeof(ISODataStru));
    memset(&upiso, 0, sizeof(ISODataStru));
	gbcECDefault = 0;
#ifndef EPT_A9L
#ifdef EPT_M3
	if (EA_uiLoadAndExecuteModule("LibRFReader.dlm", "") != EM_SUCCESS)
#endif
#ifdef EPT56X0
	if (EA_uiLoadAndExecuteModule("LibRFReader", "") != EM_SUCCESS)
#endif
    {
    	
        PubDisplay(3, "载入LibRFReader.dlm失败");
        PubDisplay(4, "请下载LibRFReader.dlm文件");
		PubuiInkey(0);
		return EXCEPTION;
    }
#endif
	EA_vCls();
	PubucLoadAllMfVar((char*)MODULE_FILE_NAME, &FV, sizeof(FV));

// #ifdef EPT56X0
// 	EA_ucSetStopFlag(EM_DISABLE_STOP);
// #endif
// #ifdef EPT_A9L
// 	EA_ucSetStopFlag(EM_DISABLE_STOP);
// #endif
// 银商允许修改参数标志,提交程序的时候分别2种情况编译提交 
//	setup.c 中还有一个地方要设置,勿忘!!!
#ifdef TMS
   		     cSetupModifyFlag = 0;// TMS服务器版 不允许修改参数
#else
  			 cSetupModifyFlag = 1;// 下载版 允许修改参数
#endif

#ifndef EPT5610
	EA_vSetLCDLightTimer(60);
#endif
    EA_vCls();
    if (PubucFirstRunPara(pcModuleName, "parafile") == EM_SUCCESS)
    {
		PubGetPinpadPara();// 先读取参数文件中密码键盘标签
              FV.gbnParaFirstFlag = YES;
		WRITE_nVAR(FV.gbnParaFirstFlag);
    }
	PubUsePinpadInside(FV.Other.SetPinpadType);
// 	PubUsePinpadInside(1);
    PubGetPrinterType(&iPrinterType); 
    PubGetPinpadType(&iPinpadType);
    while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
    {
		PubGetPosType();
		if (FV.gbnPosTypeFlag == YES)
		{
			FV.Other.SetPinpadType = 1;
			PubUsePinpadInside(1);
			WRITE_nVAR(FV.Other.SetPinpadType);
		}
		else
		{
	        PubDisplayInv(2, "打开密码键盘错");
	        PubDisplay(3, "请接入密码键盘");
	        PubDisplay(4, "[%d][%02x][%d]", ucRet, ucRet,FV.gbnPosTypeFlag);
	        EA_vBeepMs(50);
			uiRet = PubuiInkey(1);
	        if (uiRet == EM_key_FUNC1)
			{
				PubSetUsePinpadType();
			}
			if (uiRet == EM_key_FUNC9||EM_key_CANCEL)
			{
				return EM_ERROR;
			}
		}
    }
    while ((PubGetPinpadVer(phPinpad ,&iPinpadVer)) == 3)
    {
        PubDisplayInv(2, "请接好密码键盘");
        EA_vBeepMs(50);
        PubuiInkey(1);
    }
#ifndef EPT5610
    //20070914  by wei 将安全级别设置成默认级别
	if ( iPinpadVer == 2 )  
	{
		EA_pci_ucGetSecureConfig(phPinpad, EM_NULL, &puiConfigInfo);
		if ( puiConfigInfo != EM_pin_DEFAULTCONFIG)
		{
			EA_pci_ucSetSecureConfig(phPinpad, EM_NULL, EM_pin_DEFAULTCONFIG);
		}
	}
#endif
    EA_ucCloseDevice(&phPinpad);

    nFirstSetupFlag = NO;

    if (PubucFirstRunProg(pcModuleName) == EM_SUCCESS)
	{
        FV.gbnFirstFlag = YES;
		WRITE_nVAR(FV.gbnFirstFlag);
	}

    // 注册headcommon 
/*
    if (PubLoadAndExecuteModule(pcCommModuleName, "F0506") != EM_SUCCESS)
    {
        EA_vCls();
        PubDisplay(3, "装载公共模块失败!");   
        //因为PubDisplay是在applib中的,注册applib失败也就无法使用PubDisplay函数,只能用EA_vDisplay函数
        PubuiInkey(0);
        return EXCEPTION;
    }

*/
    // 导入def8583.h中的8583包定义
    if (PubImport8583(YlIso8583Def) == EXCEPTION)
    {
        EA_vCls();
        PubDisplay(3, "8583包导入出错");
        PubDisplay(4, "请检查程序重新下装");
        PubuiInkey(0);
        return EXCEPTION;
    }
    // 导入结束 
	PubGetMifsType(&iMifsType);	//增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断

    if (FV.gbnFirstFlag == YES)
    {
		PubGetPosType();
		PubSetupFirst();
#ifdef EMVIC
   		setup_first ();
#endif   		
		WRITE_nVAR(FV); //这里把setupfirst里面的内容统一写入一次
		nFirstSetupFlag = YES;
		FV.gbnFirstFlag = NO;
		WRITE_nVAR(FV.gbnFirstFlag);

		FV.gbnParaFirstFlag = YES;
		WRITE_nVAR(FV.gbnParaFirstFlag);

		if (FV.gbnParaFirstFlag == YES)
		{
		PubReadPara() ;
		}
		FV.gbnParaFirstFlag = NO;
		WRITE_nVAR(FV.gbnParaFirstFlag);
    }
    if (FV.gbnParaFirstFlag == YES)
    {
        PubReadPara();
    }
    if (nFirstSetupFlag == YES)
    {
		PubInitGlobal();
        PubSetup(10);
        nFirstSetupFlag = NO;
    }
	else
	{    
		PubInitGlobal();
	}
#ifdef TMS
	//读取主控应用参数
	ProReadBasePara();
#endif
	// by wei 每次进入应用不需要重新操作员签到 modify by baijz 20110723 BCTC要求每次开机操作员签到
     BUFCLR(szGetBuffer);
//      VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));
//      if (szGetBuffer[0] == LOGON)
//          PubSetPoscfgcPosState(NO_LOGON);

	EA_vCls();
	PubKeyOn();

#ifdef BZ       /*标准版*/
	PubDisplayInv( 1, "中国银联"); 
#endif
#ifdef Largevalue   /*大额支付*/	
       PubDisplayInv( 1, "中国银联-大额"); 
#endif
#ifdef NMLS   /*内蒙移动零售*/
	PubDisplayInv( 1, "内蒙移动零售"); 
#endif
#ifdef NMJF   /*内蒙移动缴费*/
	PubDisplayInv( 1, "内蒙移动缴费"); 
#endif 
	PubDisplayCen(2, "CUP2.0");
	PubDisplayCen(3, "自检...");
	szGetCmdFlag = 0 ;
	szCMDChangeAppFlag = 0 ;
    //ucRet = EA_ucOpenDevice("PINPAD",EM_io_IPP, &phPinpad);
    while ((ucRet = PubOpenDevice("PINPAD", EM_io_IPP, &phPinpad)) != EM_SUCCESS)
	{
        PubDisplayInv(2, "打开密码键盘错");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
	}
    while ((ucRet = PubResetPinpad(phPinpad)) != EM_SUCCESS)
	{
        PubDisplayInv(2, "请接好密码键盘");
        PubDisplay(3, "[%d][%02x]", ucRet, ucRet);
        EA_vBeepMs(50);
        PubuiInkey(1);
	}
	// 为多应用,怕其他应用使用和银联相同的mackey workkey的ID号,这里重新load一次。
	PubucSelectKey(phPinpad, EM_pin_MASTERKEY, FV.bank.nMKeyIndex);
	if(FV.Other.gbMacKeyLen)
		PubucLoadKey(phPinpad,EM_pin_DEFAULTMODE ,EM_pin_MACKEY, 0, FV.Other.gbMacKeyLen, FV.Other.gbszMacKey);
	if(FV.Other.gbWorkKeyLen)
		PubucLoadKey(phPinpad, EM_pin_DEFAULTMODE ,EM_pin_WORKKEY, 0, FV.Other.gbWorkKeyLen, FV.Other.gbszWorkKey);
    EA_ucCloseDevice(&phPinpad);
    if (PubuiInkeyMs(500) == EM_key_CANCEL)
        PubLogin();
  
	PubGetMifsType(&iMifsType);	//增加POS模块判断/必须放在initcomm之前,initcomm可能会影响底层的判断
    PubInitComm(&CommInfo, AUTOCHECK);
    BUFCLR(szGetBuffer);
    VERIFY_NORMAL(PubGetPoscfgcBatchState(szGetBuffer));

    if (szGetBuffer[0] == YES)
    {
        EA_vCls();
        PubDisplayInv(2, "请先结算再作交易");
        PubuiInkey(1);
    }
	//打开MISPOS的通讯接口 
#ifdef EPT_A9L
	
	ucRet = EA_ucOpenDevice(FV.Other.gbcMISPort,0, &gbhdCMDRS232);
	if (ucRet != EM_SUCCESS)
	{
		ucRet = EA_ucOpenDevice("COM3",0, &gbhdCMDRS232);
		if (ucRet == EM_SUCCESS)
		{
			memcpy(FV.Other.gbcMISPort,"COM3",4);
			WRITE_nVAR(FV.Other.gbcMISPort);
		}
	}
	if (ucRet != EM_SUCCESS)
	{
		 EA_vCls();
		 PubDisplay(1,"请先设置COMPOS 端口");
		 EA_vBeepMs(1000);
		 PubuiInkey(0);
		return ProFuncBankszComPos();
		/*memcpy(FV.Other.gbcMISPort,"COM2",4);
		WRITE_nVAR(FV.Other.gbcMISPort);
		EA_vCls();
		PubDisplay(1,"无法打开通信端口!");
		PubDisplay(2,"请重启设备");
		EA_vBeepMs(1000);
		PubuiInkey(2);
		return EXCEPTION;*/
	}
	else
	{
		ucRet = EA_ucInitRS232(gbhdCMDRS232,FV.gbRSInfo.ucBps,EM_232_NOPAR ,EM_232_8DBS);
		//ucRet = EA_ucCloseDevice(&gbhdCMDRS232);
		//gbhdCMDRS232 = EM_NULL;
	}
#endif

	if ( nCmdLen != NULL && CMDBUF != NULL)
	{
		CMDBUFLen = *nCmdLen;
		if (CMDBUFLen >0 )
		{				      
			memset(szCMDBuffer , 0 , sizeof(szCMDBuffer));
			memcpy(szCMDBuffer , CMDBUF , CMDBUFLen);			
			memset(&TlvSendValue,0,sizeof(struct TLVVALUE));
			CMDProcess(szCMDBuffer, (char*)&TlvSendValue, &gbctlvflag);
			szGetCmdFlag = 15;
		}
	}

    BUFCLR(szGetBuffer);
	BUFCLR(gbPosTags);
	gbTags = 0; 


	      gbnDisplayTime = 0;
#ifdef EMVIC
	PubSetExeReader(1);
#endif
    while (1)
    {
		PubDispIcon();//显示一下5650电池电量和信号
#ifdef TMS
		if (ProJudgeBaseDlaVer() == EM_SUCCESS)
		{
			ProGetBaseDialFix();
			ucRet = PubReturnUpdate() ;
			if (ucRet != EM_ERROR)
			{
				PubDelAllBit(&iso);
				close_all_dev();
				return ucRet;
			}
			if (PubCheckRunState() == EM_SUCCESS)
			{
				PubDelAllBit(&iso);
				close_all_dev();
				return EM_ERROR;
			}
		}
#endif
	memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
	memset(&gbCardinfo, 0, sizeof(struct CardConfig));
//	PubDisplay(4 , "%d  %d  %d   %d",EM_VOC_LEVEL0,EM_VOC_LEVEL1,EM_VOC_LEVEL2,EM_VOC_LEVEL3);
//	PubuiInkey(60);
//    FV.Other.POSSTATFLAG = 6;//chenjs20060915 ls add for test TMS 
//	EA_ucAudioSetVolume(FV.Other.ucNewVolume);
//	EA_ucAudioPlay("qing.wav");
//	EA_ucAudioPlay("shuaka.wav");
	

	
#if 0
    ucRet = EA_ucOpenDevice("EVOICE", 0, &hVoiceHandle); //打开外置语音设备

    if(ucRet != EM_SUCCESS)
    {
        EA_vDisplays(2,1, "Test Open Err:%02x", ucRet);
        EA_uiInkey(0);
        return EM_ERROR;
    }
    else
    {
        EA_vDisplays(2,1, "Open OK");
        EA_uiInkey(2);
    }
    ucRet = EA_ucIfVoiceExist(hVoiceHandle, &ucIfExist);
    if(ucRet != EM_SUCCESS)
    {
        EA_vDisplays(2,1, "Test IfExist Err:%02x", ucRet);
        EA_ucCloseDevice(&hVoiceHandle);
        EA_uiInkey(0);
        return EM_ERROR;
    }
    else
    {
         if(ucIfExist == 1) //If Exist
        {
            for(i = 0; i < 8; i++)
            {
                ucRet = EA_ucPlayVoice(hVoiceHandle, i);
                if(ucRet != EM_SUCCESS)
                {
                    EA_vDisplays(2,1, "Test play%d Err:%02x",i, ucRet);
                    EA_uiInkey(0);
                }
                else
                {
                    EA_vDisplays(2,1, "Test play%d OK", i);
                }
                do
                {
                    EA_ucGetPlayStatus(hVoiceHandle, &ucStatus);
                }while(ucStatus == EM_VOICE_PLAYING);
            }
        }
        else
        {
            EA_vDisplays(2,1, "No voice module exists");
            EA_uiInkey(0);
        }
        EA_ucCloseDevice(&hVoiceHandle);
    }
#endif	
#if 0		
        switch (FV.Other.POSSTATFLAG)
        {
        case 0:
            break;
        case 1:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求下载参数");
            PubDisplay(2, "请按确认键继续");
			PubuiInkey(0);  
            if ( PubDownPara() == NORMAL) 
			{
				ACK(4,"00");
			}
			else
			{
				NAK_info(4,"XX","交易失败");
			}
            continue;
        case 2:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求上传状态");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
            if (PubUploadState() == NORMAL) 
			{
				ACK(4,"00");
			}
			else
			{
				NAK_info(4,"XX","交易失败");
			}
            continue;
        case 3:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求重新签到");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
            if (PubBankLogin() == NORMAL)
			{
				ACK(4,"00");
			}
			else
			{
				NAK_info(4,"XX","交易失败");
			}
            continue;

#ifdef EMVIC
        case 4:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求公钥下载");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
            //if(PubYlConnect(&CommInfo)!=NORMAL)
			//    continue;
	    	if (PubQueryPubilcKey () == 1)
			{
			    PubDownPubilcKey ();
			}
			ACK(4, "00");
		    //PubDialOff (&CommInfo);
			continue;     
        case 5:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
            EA_vCls();
            PubDisplay(1, "系统要求更新参数");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(0);
	        if(PubYlConnect(&CommInfo)!=NORMAL)
			    continue;
//add by baijz 20110906 下载过程断电,需要删除EMV参数文件,否则会重复下载
			EA_ucPFDel (FEmvPara);
			EA_ucPFCreate (FEmvPara, (sizeof (struct EMVPARA)));
//add end 
		    PubDownEmvPara ();
		    PubDialOff (&CommInfo);
            continue;
#endif

#ifdef TMS
		case 6:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
			EA_vCls();
            PubDisplay(1, "要求下载TMS参数");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(60);
	        TmsDownPara();
			continue;
#endif
			
			case 7:
			if (ProCheckPOSSTATFLAG()!= NORMAL)
			{
				break;
			}
			EA_vCls();
            PubDisplay(1, "要求下载卡BIN黑名单");
            PubDisplay(2, "请按确认键继续");
            PubuiInkey(60);
	        PubDownCardBin();
			continue;
			//JP add
        default:
            break;
        }
		FV.Other.POSSTATFLAG = 0;//chenjs20070104 add防止不小心死循环
		CheckPOSSTATFLAGTimes = 0;

		WRITE_nVAR(FV.Other.POSSTATFLAG);

#endif
        EA_ucGetDateTime(&datetime);
        sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay);
        PubDialOff(&CommInfo);
        // 判断打印是否完成 
        PubJudePrintFinish(1);


//		 如果隔日了,就要求POS的操作员签到。
		if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 ))
			PubSetPoscfgcPosState(NO_LOGON);

        BUFCLR(szGetBuffer);
        VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));
           
/*        if (szGetBuffer[0] == NO_LOGON)
        {
#ifdef TMS
			EA_vCls();
			PubDisplayInv(1,"银联EMV应用");
			PubDisplayCen(3,"按任意键签到");
			PubDisplayCen(4,"按取消键切换应用");
			uiRet = PubuiInkey(10);
			if (uiRet == EM_key_FUNC9|| uiRet == EM_key_CANCEL)
			{
				EA_vCls();
                PubDisplayCen(2, "应用切换");
                PubuiInkeyMs(500);
                PubDelAllBit(&iso);
				close_all_dev();
				EA_vCls();
                return EM_ERROR;
			}
#endif
            if (PubLogin() != NORMAL)
                continue;
        }
*/	
        

//   20060119
//for test dudj
/*
PubDisplay(3, "是否联机签到?");
 if (PubuiInkey(2)!=EM_key_ENTER)
	sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
PubDisplay(3, "");
*/
		// 测试的时候打开。发布的封掉
 		/*sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
        if(memcmp( szTmpBuf , FV.Other.gbLoginDate, 8 ))
        {
                if (PubBankLogin() != NORMAL)
                {
                    PubSetPoscfgcPosState(NO_LOGON);
                }
                else
                {
			        EA_ucGetDateTime(&datetime);
					sprintf(szTmpBuf , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay);
                    sprintf( FV.Other.gbLoginDate , "%s", szTmpBuf);
					WRITE_nVAR(FV.Other.gbLoginDate);
                }
			    continue;
        }*/           
        
        BUFCLR(szGetBuffer);
        VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));

        if (szGetBuffer[0] == LOCK)
        {
            PubLock();
            continue;
        }
        PubGetPoscfgcMenuTime(&cMenuTime);
	    PubGetTermCapSet();     //add by chenjis 20130311

        while (1)
        {
			if (szCMDChangeAppFlag == 2)//强制切换到应用2
			{
				PubDelAllBit(&iso);
				close_all_dev();
				return 2;
			}
// 			PubSetExeReader(0);
			gbcECDefault = 0;
			PubDispIcon();
#ifdef TMS
			if (ProJudgeBaseDlaVer() == EM_SUCCESS)
			{		
				// for 主控应用更新,添加一个新返回值2
				ucRet = PubReturnUpdate() ;
				if (ucRet != EM_ERROR)
				{
					PubDelAllBit(&iso);
					close_all_dev();
					return ucRet;
				}
				if (PubCheckRunState() == EM_SUCCESS)
				{
					PubDelAllBit(&iso);
					close_all_dev();
					return EM_ERROR;
				}

			}
#endif
            PubSetPoscfgcSettleEnd(1);  /*设置结算未结束标志 */
            EA_vCls();
            nScreen = 0 ;
            //chenjs20060725 add down
            memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
            memset(&gbCardinfo, 0, sizeof(struct CardConfig));
            gbTrkInfo.cDoneFlag = 0;
			PubSetBankcMacChk(MAC_ECB);
#ifdef EMVIC          
            //ecash   by wei
			gblTranAmt = 0l;
			BUFCLR(gbszTermData);
			gbszTermData[0] = FV.EmvStru.gbcMSD;//loyes
#endif
			strcpy(gbszErrCode, "");

	        while (1)
	        {
				gbnComposFlag =1;
         		gbnSettleFlag=0;
				if (szCMDChangeAppFlag == 2)//强制切换到应用2
				{
					PubDelAllBit(&iso);
					close_all_dev();
					return 2;
				}
	            PubSetPoscfgcSettleEnd(1);  /*设置结算未结束标志 */
	            //EA_vCls();
	            nScreen = 0 ;
	            //chenjs20060725 add down
	            memset(&gbTrkInfo, 0, sizeof(struct TrackInfo));
	            memset(&gbCardinfo, 0, sizeof(struct CardConfig));
	            gbTrkInfo.cDoneFlag = 0;
				if (CMDCONT.Type == CMD_NONE) // CMD_NONE表示无命令			
				{
					nRet = GetCMD();
					if (szCMDChangeAppFlag == 15)
					{
						PubDelAllBit(&iso);
						close_all_dev();
						EA_ucCloseDevice(&gbhdCMDRS232);
						memcpy(CMDBUF , szCMDBuffer , CMDBUFLen);
						CMDBUF[CMDBUFLen] = 0 ;
						*nCmdLen = CMDBUFLen;
						return 15;
					}
					if (nRet != NORMAL)
					{
					
						//PubDisdoter();
	 					PubDispLogo();
						if( EA_ucKBHit_ped() == EM_key_HIT )
						{
						      uiKey = PubuiInkeyMs(500);
#ifdef BZ  /*标准版*/
						  if (uiKey == ENTER)
#endif
#ifdef Largevalue   /*大额支付*/
						   if (uiKey == ENTER)
#endif
#ifdef NMLS   /*内蒙移动零售*/
						   if (uiKey == EM_key_F1)     /*应内蒙银商要求F1进入查询菜单wujianyuan modify 20130712*/
#endif
#ifdef NMJF   /*内蒙移动缴费*/
						   if (uiKey == EM_key_F1)    /*应内蒙银商要求F1进入查询菜单wujianyuan modify 20130712*/
#endif 
						     {
							EA_vCls();
							PubDisplay(2, "请输入安全密码:");
							BUFCLR(szGetBuffer);
							PubGetSAFEPWD(szGetBuffer, sizeof(szGetBuffer));
							PubKeyOff();
							
							BUFCLR(szBuffer);
							if (PubGetNStr(3, BIGFONT, szBuffer, 6) == NORMAL &&
								memcmp(szGetBuffer, szBuffer, 6) == 0)
							{
								PubKeyOn();	
								EA_ucCloseDevice(&gbhdCMDRS232);
								gbhdCMDRS232 = EM_NULL;
								PubSetupNew();
								 EA_vCls();
							}	
							 EA_vCls();
							PubKeyOn();					
						
							}
							if(uiKey==EM_key_9)
							{
							if (PubuiInkey(1) == '5')
							if (PubuiInkey(1) == '9')
							{
		                                      EA_vSystemManage(EM_RESET);//add by wujy  20111020 实现重启
							}
							}
							if (uiKey == EM_key_FUNC9)  //多应用切换
							{
								EA_ucCloseDevice(&gbhdCMDRS232);
								gbhdCMDRS232 = EM_NULL;
								PubDelAllBit(&iso);
								close_all_dev();
								EA_vCls();
								return EM_SUCCESS;				
							}
							if (uiKey == EM_key_FUNC)
							{

								gbnComposFlag =0;
								memset(&TlvSendValue,0,sizeof(struct TLVVALUE));
								PubGetBankszTerminal(TlvSendValue.szTerminal, 8);
								PubGetBankszCust(TlvSendValue.szCust, 15);
						        BUFCLR(szGetBuffer);
						        VERIFY_NORMAL(PubGetPoscfgcPosState(szGetBuffer));

						        if (szGetBuffer[0] == NO_LOGON)
						        {
					            	if(PubLogin()!=NORMAL)
					        		{
										EA_vCls();
					        			continue;
									}
								
					        	}
						        BUFCLR(szGetBuffer);
						        VERIFY_NORMAL(PubGetPoscfgcLoginState(szGetBuffer));

						        if (szGetBuffer[0] == NO_LOGON)
					        	{
									VERIFY_NORMAL(PubSetPoscfgcPosState(NO_LOGON));
									if(PubBankLogin()== NORMAL)
									{
										VERIFY_NORMAL(PubSetPoscfgcPosState(LOGON));
						        		       VERIFY_NORMAL(PubSetPoscfgcLoginState(LOGON));
										EA_ucGetDateTime(&datetime);
										BUFCLR(FV.Other.gbLoginDate);
										sprintf(FV.Other.gbLoginDate , "%04d%02d%02d", datetime.usYear, datetime.ucMonth, datetime.ucDay);
										WRITE_nVAR(FV.Other.gbLoginDate);
									}
									else
					        		      {
										PubDialOff (&CommInfo);
										EA_vCls();
										continue;
									}
					        	}
								EA_vCls();
								PubDisplay (1, "1.消  费   2.撤  销");
								PubDisplay (2, "3.退  货   4.预授权");
								PubDisplay (3, "5.离  线   6.打  印");
								PubDisplay (4, "7.管  理   8.其  它");

								uiKey = PubuiInkey((char) cMenuTime);
								if(uiKey>='1'&&uiKey<='8')
									uiOption=uiKey-'0';
								else
								{
									EA_vCls();
									continue;
								}
								
								PubUpYLDataOld();

						              PubProcessOld(uiOption);
								EA_vCls();
								continue;				
							}						
						}
						continue;
					}
				}
				
				if (CMDCONT.Type != CMD_NONE)
				{
				break;
				}
				
	        }      

	         if (PubProcess(CMDCONT.Type) != CMD_INTERRUPT)
	         {
	 	     ClearCMD();
	         }
	         EA_vLCDLightOff();
	    }
	    return EM_SUCCESS;
	}
}
Esempio n. 27
0
//chenjs20061127 add down for 应用切换
void close_all_dev(void)
{
	
    if(gbPrintHandle != EM_NULL)
		EA_ucCloseDevice(&gbPrintHandle);
	if(gbhdlMagCard != EM_NULL)
		EA_ucCloseDevice(&gbhdlMagCard);
	if(gbhdlUserCard != EM_NULL)
		EA_ucCloseDevice(&gbhdlUserCard);
	if(gbhdlMasterCard != EM_NULL)
        EA_ucCloseDevice(&gbhdlMasterCard);
	if(gbhdlSAM1Card != EM_NULL)
        EA_ucCloseDevice(&gbhdlSAM1Card);
	if(gbhdlSAM2Card != EM_NULL)
        EA_ucCloseDevice(&gbhdlSAM2Card);
	if(gbhdlSAM3Card != EM_NULL)
        EA_ucCloseDevice(&gbhdlSAM3Card);
	if(gbhdlSAM4Card != EM_NULL)
        EA_ucCloseDevice(&gbhdlSAM4Card);
	if(gbMifCardHandle != EM_NULL)
        EA_ucCloseDevice(&gbMifCardHandle);
#ifdef EMVIC 
    if(gbhdlPINPAD != EM_NULL)
        EA_ucCloseDevice(&gbhdlPINPAD);
	if(gbhdlRS232 != EM_NULL)
	{
#ifdef EPT_A9L
		EA_ucCloseRfCardDevEI(&gbhdlRS232);
#else
		EA_ucCloseDevice(&gbhdlRS232);	
#endif
	}
	if(gbMifCardHandle != EM_NULL)
        EA_ucCloseDevice(&gbMifCardHandle);  
#endif
}
Esempio n. 28
0
int ProReadMobileNo(char *szMobileNo)
{
    char szGetBuf[20];
    char cRet;
    int  nTmpLen = 0;
    DevHandle hdlPinpad;
    uchar ucRet;
    uint uiTimeOut = FV.Other.gbnSignTimeout;
    if (FV.Other.gbcIsEnterMbOnPinpad && iPinpadType == 1)
    {
#ifdef EMVIC
        if ( FV.EmvStru.gbcExeReader == YES)
        {
            EA_ucCloseComm(); //先关闭串口,然后下面打开串口
        }
#endif
        ucRet = PubOpenDevice("PINPAD", EM_io_EPP, &hdlPinpad);
        if (ucRet != EM_SUCCESS)
        {
            PubClearAll();
            PubDisplay(2, "打开密码键盘口错");
            PubuiInkey(3);
            EA_ucCloseDevice(&hdlPinpad);
            return (EXCEPTION);
        }
        EA_vCls();
        PubDisplayCen(2, "请在键盘输入");
        PubDisplayCen(3, "手机号码");
        if ( iPinpadType == 1 )	// dfr add at 2006-04-11
        {
            PubResetPinpad(hdlPinpad);
            PubucDispPinpad(hdlPinpad, 1, "Cellphone No:");
            PubucDispPinpad(hdlPinpad, 2, "");
        }
        if ( iPinpadVer == 2 )
            EA_pci_ucSetPinTimer(hdlPinpad , EM_pin_KEYWAITTIME , uiTimeOut);
        BUFCLR(szGetBuf);
        ucRet = EA_pci_ucNonPinRead(hdlPinpad, 1, "\x0b",&nTmpLen,szGetBuf);
        if (ucRet != EM_SUCCESS)
        {
            PubResetPinpad(hdlPinpad);
            EA_ucCloseDevice(&hdlPinpad);
            return EXCEPTION;
        }
        PubucDispPinpad(hdlPinpad, 1, "WELCOME TO USE");
        PubucDispPinpad(hdlPinpad, 2, " LANDI PINPAD");
        EA_ucCloseDevice(&hdlPinpad);
    }
    else
    {
        EA_vCls();
        PubDisplay(2, "请输入持卡人手机号码:");
        while(1)
        {
            BUFCLR(szGetBuf);
            //cRet = PubGetNStr(3, 0, szGetBuf, 11);
            cRet = PubGetLimitNStr(3,BIGFONT,szGetBuf,0,11,uiTimeOut);
            nTmpLen = strlen(szGetBuf);
            if(cRet == NORMAL && nTmpLen == 11)
            {
                break;
            }
            else if(cRet == CANCELED)     //此种情况要如何处理?
            {
                break;
            }
            else
            {
                PubDisplay(3, "");
                PubDisplay(4, "位数不足,请重输:");
            }
        }
    }
    if(nTmpLen == 11)
    {
        sprintf(szMobileNo, "%-11.11s", szGetBuf);
        return NORMAL;
    }
    return EXCEPTION;
}
Esempio n. 29
0
/*
 * 函数功能: 联机签到
 * 入口参数:无
 * 出口参数:无
 * 返 回 值:NORMAL--成功
 *           EXCEPTION--失败
 */
int PubBankLogin(void)
{
    int i;
    uchar szBatch[7], szBuffer[50], szBuf[20];
    uchar szDateTimeBuf[3], szTmpBuffer[30], szWorkKey[25], szMacKey[25], szWorkKeyChk[5], szMacKeyChk[5];
    struct FileRecStru LoginPos;
    int nSendLen, nLen , nWorkKeyLen=8,nMacKeyLen=8;
    ET_DATETIME DateTime;

//#ifndef PRG_TST
    uchar szTmp1[20];
    int nKeyIndex;
    DevHandle phPinpad;
//#endif

    /*获得当前操作员号 */
    LoginPos.cTransType = LOGIN;
    gbnTransType = LOGIN;

	PubGetBankcDesType(&cDesType);
    /*获得批次号 */
    ASSERT_NORMAL(PubGetBankstateszBatchNum((char *)szBatch, sizeof(szBatch)));
    sprintf(LoginPos.szBatchNum, "%s", szBatch);

    /*设置mac方式 */
    PubSetBankcMacChk(MAC_NO);

    /* 8583打包 */
    ASSERT_NORMAL(PubPacketFix(&LoginPos));
    BUFCLR(szTmpBuffer);

    //[06/15/2015 shizd]modify down
    /*** modified by gud 20060124 ***/
	if (cDesType == 1)
		sprintf((char *)szTmpBuffer, "00%6.6s001", LoginPos.szBatchNum);
	else
    {
        sprintf((char*)szTmpBuffer, "00%6.6s003", LoginPos.szBatchNum);
    }
	
    /*** modified by gud 20060124 ***/
    ASSERT_NORMAL(PubSetBit(&iso, 60, (char *)szTmpBuffer, 14));
   
    // 终端设备信息
    nLen = 0;
    i = 0;
    BUFCLR(szBuffer);
    if(EA_ucGetSerial(EM_SERIAL_MAIN_BOARD, (char*)szBuffer) == EM_SUCCESS)
    {
        i++;			//公司标识
        nLen = szBuffer[i]-0x30;
        i++;			//产品类别长度
        i+=nLen;		//产品类别
        nLen = szBuffer[i]-0x30;
        i++;			//版本型号长度
        i+=nLen;		//版本型号
        nLen = szBuffer[i]-0x30;
        i++;			//序列号长度
        BUFCLR(szBuf);
        if(nLen > 32)
            nLen = 32;
        memcpy(szBuf, szBuffer+i, nLen);
    }
    else
    {
        strcpy((char*)szBuf, "00000000");
        nLen = 8;
    }
    BUFCLR(szTmpBuffer);
    PubGetPosYlCode((char*)szTmpBuffer);
    sprintf((char*)szBuffer, "Sequence No%02d%4.4s%s", nLen+4, szTmpBuffer, szBuf);//证书编号+序列号
    ASSERT_NORMAL(PubSetBit(&iso, 62, (char*)szBuffer, strlen((char*)szBuffer)));
    //add end
    BUFCLR(szBuf);
    sprintf((char*)szBuf, "%2.2s ", FV.OPER.gbszOper);
    ASSERT_NORMAL(PubSetBit(&iso, 63, (char*)szBuf, 3));
    //[06/15/2015 shizd]modify up

    /*iso到字符串 */
	BUFCLR(gbszSendStr);
    nSendLen = sizeof(gbszSendStr);
    ASSERT_NORMAL(PubIsoToStr(gbszSendStr, &iso, &nSendLen));
    gbnSendLen = nSendLen;

    /*发送数据 */
    ASSERT_NORMAL(PubCommu(&CommInfo, gbszSendStr, gbnSendLen, gbszReadStr, &gbnReadLen, DIALOFF_YES));

    /*接收返回 */
    ASSERT_NORMAL(PubDispRetMsg(&LoginPos));
    /*返回的密钥处理 */
//#ifndef PRG_TST             /*模拟前置测试,不需下载密钥*/

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    ASSERT_NORMAL(PubGetBit (&iso1, 60, (char *)szBuffer, &nLen));
	if (nLen > 0)
	{
		BUFCLR (szTmp1);
		memcpy (szTmp1, szBuffer + 8, 3);
		if (cDesType == 1)
		{
			if (memcmp (szTmp1, "001", 3) != 0)
			{
				PubClearAll ();
				PubDisplay (3, "密钥算法有误");
				PubuiInkey (30);
				return EXCEPTION;
			}
		}
		else if (cDesType == 0)
		{
			if (memcmp (szTmp1, "003", 3) != 0)
			{
				PubClearAll ();
				PubDisplay (3, "密钥算法有误");
			    PubuiInkey (30);
				return EXCEPTION;
			}
		}
	}
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    ASSERT_NORMAL(PubGetBit(&iso1, 62, (char *)szBuffer, &nLen));
    
    if ((nLen != 24) && (cDesType == 1))
    {
        PubDisplay(3, "下载参数密钥失败");
        PubDisplayCen (4, "使用单DES");
        PubuiInkey(30);
        return EXCEPTION;
    }else if ((nLen != 40) && (cDesType == 0))
    {
        PubDisplay(3, "下载参数密钥失败");
        PubDisplayCen (4, "使用 3DES");
        PubuiInkey(30);
        return EXCEPTION;
    }
     

    /*选择主密钥 */
    ASSERT_NORMAL(PubGetBanknMKeyIndex(&nKeyIndex));

    if (PubOpenDevice("PINPAD", EM_io_EPP, &phPinpad) != EM_SUCCESS)
    {
        EA_vCls();
        PubDisplay(2, "无法打开密码键盘");
        PubDisplay(3, "按任意键返回");
        PubuiInkey(3);
        return EXCEPTION;
    }
   

    ASSERT_NORMAL(PubSelectKey(phPinpad, EM_pin_MASTERKEY, nKeyIndex));

    if (cDesType == 1)
    {        
        memset(szWorkKey, 0, sizeof(szWorkKey));
        memset(szMacKey, 0, sizeof(szMacKey));
        memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk));
        memset(szMacKeyChk, 0, sizeof(szMacKeyChk));
        memcpy(szWorkKey, szBuffer, 8);
        memcpy(szWorkKeyChk, szBuffer + 8, 4);
        memcpy(szMacKey, szBuffer + 12, 8);
        memcpy(szMacKeyChk, szBuffer + 20, 4);
        nWorkKeyLen = 8 ;
        nMacKeyLen = 8 ;
    }
    else if ( cDesType == 0)
    {
        memset(szWorkKey, 0, sizeof(szWorkKey));
        memset(szMacKey, 0, sizeof(szMacKey));
        memset(szWorkKeyChk, 0, sizeof(szWorkKeyChk));
        memset(szMacKeyChk, 0, sizeof(szMacKeyChk));
        memcpy(szWorkKey, szBuffer, 16);
        memcpy(szWorkKeyChk, szBuffer + 16, 4);
        memcpy(szMacKey, szBuffer + 20, 8); // mackey 银联预留了16位,目前只用了8位
        memcpy(szMacKeyChk, szBuffer + 36, 4);
        nWorkKeyLen = 16 ;
        nMacKeyLen = 8 ;
    }

    /*判断密钥是否正确 */
    ASSERT_NORMAL(PubLoadKey(phPinpad, EM_pin_WORKKEY, FV.Other.gbMacWorkKeyIndex, nWorkKeyLen, szWorkKey));
    ASSERT_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex, nWorkKeyLen, szWorkKey));
    ASSERT_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex));
    BUFCLR(szTmpBuffer);
    memset(szTmp1, 0, sizeof(szTmp1));

    ASSERT_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer));

    if (memcmp(szTmpBuffer, szWorkKeyChk, 4))
    {
        PubClearAll();
        PubDisplay(3, "校验workkey错");
        PubuiInkey(10);
        EA_ucCloseDevice(&phPinpad);
        return EXCEPTION;
    }

    ASSERT_NORMAL(PubLoadKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex, nMacKeyLen, szMacKey));
    ASSERT_NORMAL(PubSelectKey(phPinpad, EM_pin_MACKEY, FV.Other.gbMacWorkKeyIndex));

    BUFCLR(szTmpBuffer);
    memset(szTmp1, 0, sizeof(szTmp1));

    ASSERT_NORMAL(PubLoadMacData(phPinpad, 8, szTmp1, szTmpBuffer));

    if (memcmp(szTmpBuffer, szMacKeyChk, 4))
    {
        PubClearAll();
        PubDisplay(3, "校验mackey错");
        PubuiInkey(10);
        EA_ucCloseDevice(&phPinpad);
        return EXCEPTION;
    }
    EA_ucCloseDevice(&phPinpad);

    BUFCLR(FV.Other.gbszWorkKey);
    BUFCLR(FV.Other.gbszMacKey);
    memcpy(FV.Other.gbszWorkKey, szWorkKey, nWorkKeyLen);
	FV.Other.gbWorkKeyLen = nWorkKeyLen;
	WRITE_nVAR(FV.Other.gbszWorkKey);
	WRITE_nVAR(FV.Other.gbWorkKeyLen);
    memcpy(FV.Other.gbszMacKey, szMacKey , nMacKeyLen);
	WRITE_nVAR(FV.Other.gbszMacKey);
	WRITE_nVAR(FV.Other.gbMacKeyLen);

    /*
     * 设置批次号
     */
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, 60, (char *)szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(szTmpBuffer);
        memcpy(szTmpBuffer, szBuffer + 2, 6);
		// 测试, 不从主机返回批次号来判断。
        PubSetBankstateszBatchNum((char *)szTmpBuffer);
    }

    EA_ucGetDateTime(&DateTime);
    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_DATE, (char *)szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer, 2);
        DateTime.ucMonth = atoi((char *)szDateTimeBuf);
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer + 2, 2);
        DateTime.ucDay = atoi((char *)szDateTimeBuf);
        EA_ucSetDateTime(&DateTime, EM_SYSTEM_DATE);
    }

    BUFCLR(szBuffer);
    nLen = sizeof(szBuffer);
    PubGetBit(&iso1, LOCAL_TIME, (char *)szBuffer, &nLen);
    if (nLen > 0)
    {
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer, 2);
        DateTime.ucHour = atoi((char *)szDateTimeBuf);
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer + 2, 2);
        DateTime.ucMinute = atoi((char *)szDateTimeBuf);
        BUFCLR(szDateTimeBuf);
        memcpy(szDateTimeBuf, szBuffer + 4, 2);
        DateTime.ucSecond = atoi((char *)szDateTimeBuf);
        EA_ucSetDateTime(&DateTime, EM_SYSTEM_TIME);
    }
//BCTST
    strcpy(FV.OPER.gbszLoginOper, FV.OPER.gbszOper);    //已向主机签到的操作员不能删除
//
    return NORMAL;
}
Esempio n. 30
0
/**************************************
*功能:	基于EMV整个流程交易结果显示
*注意:  卡片批准后显示查询余额
*参数意义:
*		pos.transresult:0x00--交易批准 
*						 0x01--交易拒绝
***************************************/
void PubEMVResult(struct FileRecStru *TmpPos)
{
	char szBuffer[50];	  
	char szRetAmt[15];	  
    unsigned char ucRet;
	int i, nLen;
    DevHandle hdlPinpad;
	char szBuf[50];//chenjs20070125 add
	struct FileRecStru errrec;
	
	i = 0;
	while ((err_mess[i][0] != '\0') && memcmp(gbszErrCode, err_mess[i], 2))
		i ++;
	PubClearAll();
	if (err_mess [ i ][ 0 ] == '\0')	   /* Unknow Error*/
		sprintf(szBuffer, "交易失败[%2.2s]",gbszErrCode);
	else	 
		strcpy(szBuffer, err_mess[i]);   /*Defined Error*/
	
	
	if (memcmp(gbszErrCode, "00", 2)&&TmpPos->transresult == 0x00 )
	{
	    if (gbnTransType != LOGIN && gbnTransType !=LOGOUT)
	    {
	    	if (strlen(szBuffer) > 20)
	    	{
	    		//chenjs20060712 del PubDisplayCen(2, "交易失败");
	    		PubDisplay(2, "%20.20s", szBuffer);//chenjs20060712 3->2
	    		PubDisplayCen(3, szBuffer + 20);//chenjs20060712 4->3
	    	}
	    	else
	    	{
	    		PubDisplayCen(2, "交易失败");
				if (gbszErrCode[0] != '\0')
	    		PubDisplayCen(3, szBuffer);
	    	}
			PubuiInkey(60);     //modify by chenjis 20140108 BCTC
	    }
    } 	
	
	if (!memcmp(gbszErrCode, "00", 2) && TmpPos->transresult == 0x01)
	{
/*del by baijz 20111207 BCTC要求
		BUFCLR(szBuf);
		PubHexToAsc(szBuf,TmpPos->tvr,10,0);
		PubDisplays(1,1,"95:%s",szBuf);
		PubDisplays(2,1, "9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]);
		strcpy (szBuffer, "交易拒绝");
		PubDisplayCen(3, szBuffer);
		PubDisplayCen(4, "请拔卡");
	    PubuiInkey(5);
*/
//add by baijz 20111207
		memset((char *) &errrec, 0, sizeof(struct FileRecStru));
		
		errrec = *TmpPos;
		memcpy(errrec.tTAC_Denial,TermInitData.tTAC_Denial, 5);
		memcpy(errrec.tTAC_Online,TermInitData.tTAC_Online, 5);
		memcpy(errrec.tTAC_Default,TermInitData.tTAC_Default, 5);
		
		EMV_ErrDisplay(&errrec);
//add end
		EA_vCls();
		//add by chenjis 20130304 for BCTC 
		if(TmpPos->cTransType == PURCHASE || TmpPos->cTransType == PRE_AUTH)
		{
			PubClearAll();
			PubDisplayCen(3,"请联系发卡行!");
			PubuiInkey(5);
		}
		//end chenjis 20130304
	}
	//add by wei bctc debug 拒绝交易也显示tvr
	if ((strlen(gbszErrCode)==0) && TmpPos->transresult == 0x01)
	{
/*
		BUFCLR(szBuf);
		PubHexToAsc(szBuf,TmpPos->tvr,10,0);
		PubDisplays(1,1,"95:%s",szBuf);
		PubDisplays(2,1, "TSI9B:%02x%02x", TmpPos->tsi[0], TmpPos->tsi[1]);
		strcpy (szBuffer, "交易拒绝");
		PubDisplayCen(3, szBuffer);
		PubDisplayCen(4, "请拔卡");
	    PubuiInkey(5);
*/
//add by baijz 20111207
		memset((char *) &errrec, 0, sizeof(struct FileRecStru));
		
		errrec = *TmpPos;
		memcpy(errrec.tTAC_Denial,TermInitData.tTAC_Denial, 5);
		memcpy(errrec.tTAC_Online,TermInitData.tTAC_Online, 5);
		memcpy(errrec.tTAC_Default,TermInitData.tTAC_Default, 5);
		
		EMV_ErrDisplay(&errrec);
//add end
		EA_vCls();
	}
	

	if (memcmp(gbszErrCode, "00", 2)&&(strlen(gbszErrCode)>0))//bctc add by wei
	{
		
		//chenjs20070125 add down 解决研发测试组提的显示不完整

        if (strlen(szBuffer) > 20)
		{
            BUFCLR(szBuf);
            memcpy(szBuf, szBuffer, 20);
            PubDisplayCen(2, szBuf);
            PubDisplayCen(3, szBuffer + 20);
		}
        else
            PubDisplayCen(2, szBuffer);

		if(gnCardType != MIF_CARD)		//add by baijz 20120326 检测中心要求
		{
			PubDisplayCen(4, "请拔卡");  //change by wei bctc   
		}
		else
		{
			PubDisplayCen(4, "请移卡");
		}
	    //PubuiInkey(3);
		PubuiInkey(60);     //modify by chenjis 20140108 BCTC
	}
	//chenjs20070125 add up




	
	if (!memcmp(gbszErrCode, "00", 2) && (gbnTransType == INQUERY  || gbnTransType == YLJF_INQUERY || gbnTransType == CDT_OPEN || gbnTransType == CDT_QUERY) && TmpPos->transresult == 0x00)
	{
		nLen = sizeof(szBuffer);
		PubGetBit(&iso1, ADDI_AMOUNT, szBuffer, &nLen);
		if (nLen == 0)
		{
			PubClearAll();
			PubDisplayInv(2, "未返回余额");
			EA_vBeepMs(1000);
			PubuiInkey(10);
			return;
		}
		
		memcpy(szRetAmt, szBuffer + 7, 13);
		szRetAmt[13] = '\0';
		if (szRetAmt[0] == 'C')
			szRetAmt [ 0 ] = ' ';
		else
			szRetAmt [ 0 ] = '-';
		i = 1;
		while (1)
		{
			if (i == 13)//chenjs20061115 12->13
				break;
			if (szRetAmt[i] !='0' && szRetAmt[i] != ' ')
				break;
			//chenjs20061115研发测试if (szRetAmt[i] == '0')
			if (szRetAmt[i] == '0' && i < 10) //chenjs20061115 add
				szRetAmt[i] = ' ';
			//chenjs20061115 add down
			if( i >= 10 && szRetAmt[i] == ' ')
				szRetAmt[i] = '0';
			//chenjs20061115 add up
			i ++;
		}		 
		
		if ( FV.EmvStru.gbcExeReader == YES)
		{
			EA_ucCloseComm();
		}

        ucRet = PubOpenDevice((char*)"PINPAD", EM_io_EPP, &hdlPinpad);
        if (ucRet != EM_io_SUCCESS)
        {
			//PubuiInkey(3);
            PubClearAll();
            if (ucRet == EM_io_OPENED)
                PubDisplay(2, "密码键盘已经打开");
            else
			{
                PubDisplay(2, "无法打开密码键盘");
				PubuiInkey(3);
				return ;
			}
            PubuiInkey(3);
        }
        sprintf(szBuffer, "%11.11s.%2.2s", szRetAmt, szRetAmt + 11);
		if ( iPinpadType == 1 )	//外置PINPAD
		{
			EA_vCls();
            PubDisplayCen (2, "查询成功");
			PubDisplayCen (3, "请查看密码键盘");
			if(gnCardType != MIF_CARD)		//add by baijz 20120326 检测中心要求
			{
				PubDisplayCen(4, "并拔卡"); 
			}
			else
			{
				PubDisplayCen(4, "并移卡");
			}
			PubucDispPinpad(hdlPinpad, 1, (char*)"Balance:");
			PubucDispPinpad(hdlPinpad, 2, szBuffer);
		}
		else
		{
			PubDisplay(3, "余额:%s元", szBuffer);
			sprintf(szBuf , "      %14.14s" , szBuffer);
			EA_vCls();
            PubDisplayCen (1, "查询成功");
			PubDisplay (2, "可用余额:");
			PubDisplay(3, "%s", szBuf);
			if(gnCardType != MIF_CARD)		//add by baijz 20120326 检测中心要求
			{
				PubDisplayCen(4, "请拔卡");  //change by wei bctc   
			}
			else
			{
				PubDisplayCen(4, "请移卡");
			}
		}
		while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS);
		PubuiInkey (FV.EmvStru.gbcQueryResultDispDelay);		//add by baijz 20120524
		RemoveIccTimeOut(10);
        if ( iPinpadType == 1 )	//外置PINPAD
        {
			if ( FV.EmvStru.gbcExeReader == YES)
			{
				EA_ucCloseComm();
			}
			
			ucRet = PubOpenDevice((char*)"PINPAD", EM_io_EPP, &hdlPinpad);
			PubClearAll();
            PubucDispPinpad(hdlPinpad, 1, (char*)"WELCOME TO USE ");
            PubucDispPinpad(hdlPinpad, 2, (char*)" LANDI PINPAD");
			while (EA_ucCloseDevice(&hdlPinpad) != EM_SUCCESS);
        }
        
	}
	EA_vCls();
	return;
}