📄 paypass_anticollision.c
字号:
l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOA_RATS, l_bStatus,&g_abRATS_ATTRIB[0],g_lDataBytesReceived);
#ifdef TTAL1
//if ((g_sLog.enable) && (i!=1) )
if (g_sLog.enable)
{
//BUFFER CONCATENATION (WITH VARIABLE SIZE OF RESPONSE)
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"RATS Response: ");
v = 0;
l_lDataBytesReceived=g_lDataBytesReceived;
while(l_lDataBytesReceived!=0)
{
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"%02x",g_abRATS_ATTRIB[v]);
v += 1;
l_lDataBytesReceived -= 1;
}
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"\n");
}
#endif
}
while ((i < 3) && (l_bStatus == ERR_NOCARD));
// RETURN ERROR
if ((i = 3) && (l_bStatus == ERR_NOCARD))
{
return TIME_OUT_ERROR;
}
// FP COLLISION RETURN 23/08/07
if (l_bStatus == ERR_COLL)
{
return COLLISION_ERROR ;
}
if(l_bStatus != ERR_NO_ERROR)
{
return TRANSMISSION_ERROR;
}
// CALCULATE SFGT + D(SFGT) 32 x 2^SFGI + 3*2^SFGI
g_FWT_SFGT = b_fnFWT_SFGTCalculate(_SFGT,g_abRATS_ATTRIB[3],1);
g_FWT_SFGT /= 10;
// WAIT DURING SFGT + D(SFGT)
for(l_bDelay=10;l_bDelay>0;l_bDelay--)
{
delay_us(g_FWT_SFGT);
}
#ifdef MODE_DEBUG
printf("Card A RATS ok, ready for the transaction!!\n");
#endif
return END_ACTIVATE_A;
}
//-----------------------------------------------------------------------------
// Function name : b_fnActivateB(unsigned char* p_abATQBResponse_polling, StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type B Activate
//
//
// IN : p_pStructReader : Pointer to the used StructReader structure.
// p_abATQBResponse_polling : ATQB memorized in the polling
//
// OUT : - none -
//
// RETURN : END_ACTIVATE_B card B activated
// PROTOCOL_ERROR
// TIME_OUT_ERROR
// TRANSMISSION_ERROR Collision
//
// Notes : - none -
//-----------------------------------------------------------------------------
unsigned char b_fnActivateB(unsigned char* p_abATQBResponse_polling, StructReader* p_pStructReader)
{
unsigned char l_bStatus;
unsigned char l_abBuffer[15];
unsigned char i;
unsigned char l_abDataForPrintf[3];
/*----------WUPB----------*/
i = 0;
do
{
i += 1;
//Option for Host mode
l_abDataForPrintf[0] = _ISOB_REQB;
l_abDataForPrintf[1] = _ISOB_AFI_ALL; // all application families
l_abDataForPrintf[2] = _ISOB_WUPB_NO_SLOT; // _ISOB_REQB_NO_SLOT or _ISOB_WUPB_NO_SLOT
#ifdef TTAL1
if(g_sLog.enable)
{
sprintf(g_sLog.buffer,"WUPB Command: %02x%02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1],l_abDataForPrintf[2]);
}
#endif
// SEND WUPB AND RECEIVE ATQB
l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_WUPB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_bATQBLength);
// CHECK ERROR
l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_WUPB_NO_SLOT, l_bStatus,&l_abBuffer[0],g_bATQBLength);
#ifdef TTAL1
//Option for Host mode
if(g_sLog.enable)
{
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATQB Received: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
l_abBuffer[0],
l_abBuffer[1],
l_abBuffer[2],
l_abBuffer[3],
l_abBuffer[4],
l_abBuffer[5],
l_abBuffer[6],
l_abBuffer[7],
l_abBuffer[8],
l_abBuffer[9],
l_abBuffer[10],
l_abBuffer[11]);
}
#endif
}
while ((i < 3) && (l_bStatus == ERR_NOCARD));
// RETURN ERROR
if ((i = 3) && (l_bStatus == ERR_NOCARD))
{
return TIME_OUT_ERROR;
}
// FP COLLISION RETURN 23/08/07
if (l_bStatus == ERR_COLL)
{
return COLLISION_ERROR ;
}
if(l_bStatus != ERR_NO_ERROR)
{
return TRANSMISSION_ERROR ; // return l_bStatus; FP 23/08/07
}
#ifdef MODE_DEBUG
printf("Card B awoken\n");
#endif
// VERIFY THE VALUE OF ATQB WITH THE POLLING ATQB (Requirements 9.5)
for(i=0;i<g_bATQBLength;i++)
{
if (p_abATQBResponse_polling[i] != l_abBuffer[i])
{
return PROTOCOL_ERROR;
}
}
#ifdef MODE_DEBUG
printf("ATQB correct\n");
#endif
// EXTRACT FWI FROM THE ATQB TO CALCULATE THE FWT FOR THE ATTRIB COMMAND
g_FWT_SFGT = b_fnFWT_SFGTCalculate(_FWT,l_abBuffer[11],1);
/*----------ATTRIB----------*/
// TIMEOUT CALCULATE WITH THE FWT + PICOREAD OFFSET
p_pStructReader->s_bRTimeoutUsed = (g_FWT_SFGT + _PICOREAD_TIMEOUT_OFFSET_B);
// PREPARE THE DATA TO SEND
v_fnSendPreparATTRIB_PayPass(&l_abBuffer[0],p_pStructReader);
#ifdef TTAL1
//Option for Host mode
if(g_sLog.enable)
{
//BUFFER CONCATENATION
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATTRIB Command: %02x%02x%02x%02x%02x%02x%02x%02x%02x\n",l_abBuffer[0],l_abBuffer[1],l_abBuffer[2],l_abBuffer[3],l_abBuffer[4],l_abBuffer[5],l_abBuffer[6],l_abBuffer[7],l_abBuffer[8]);
}
#endif
// SEND ATTRIB CMD TO THE CHIP (WITHOUT Higher layer朓NF (Requirements 6.22) )
i = 0;
do
{
i += 1;
// SEND ATTRIB COMMAND
v_fnSendBuffer(_SENDCRC,9,0,&l_abBuffer[0],p_pStructReader);
// RECEIVE ATTRIB REsPONSE
l_bStatus = b_fnReceiveBuffer(_CHECKCRC,&g_abRATS_ATTRIB[0],p_pStructReader,&g_lDataBytesReceived,&g_bDataBitsReceived,&g_bPicoReadStatus,&g_bRFReceiveEOFB,&g_bBitsToReceive);
// CHECK ERROR
l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_ATTRIB, l_bStatus,&g_abRATS_ATTRIB[0],g_lDataBytesReceived);
}
while ( (i < 3) && (l_bStatus == ERR_NOCARD) );
// RETURN ERROR
if ( (i = 3) && (l_bStatus == ERR_NOCARD) )
{
return TIME_OUT_ERROR;
}
// FP COLLISION RETURN 23/08/07
if (l_bStatus == ERR_COLL)
{
return COLLISION_ERROR ;
}
if ((l_bStatus != ERR_NO_ERROR) )
{
return TRANSMISSION_ERROR ; //return l_bStatus; FP 23/08/07
}
#ifdef TTAL1
// Option for Host mode
if(g_sLog.enable)
{
// BUFFER CONCATENATION (WITH VARIABLE SIZE OF RESPONSE)
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"ATTRIB Response: ");
i = 0;
while(g_lDataBytesReceived!=0)
{
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"%02x",g_abRATS_ATTRIB[i]);
i += 1;
g_lDataBytesReceived -= 1;
}
sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"\n");
}
#endif
#ifdef MODE_DEBUG
printf("Card B attrib & ready for the transaction\n");
#endif
return END_ACTIVATE_B;
}
//-----------------------------------------------------------------------------
// Function name : b_fnRemoveA(StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type A Remove
//
//
// IN : p_pStructReader : Pointer to the used StructReader structure.
//
// OUT :
//
// RETURN : END_ACTIVATE_B card B activated
// PROTOCOL_ERROR
// TIME_OUT_ERROR
// TRANSMISSION_ERROR Collision
//
// Notes : - none -
//-----------------------------------------------------------------------------
unsigned char b_fnRemoveA(StructReader* p_pStructReader)
{
unsigned char l_ATQReceived=0;
unsigned char l_bStatus;
unsigned char l_abBuffer[3];
unsigned char l_bDelay;
unsigned char j;
/*----------LOOP WUPA----------*/
j = 0;
do
{
j += 1;
// TIMEOUT + PICOREAD OFFSET
p_pStructReader->s_bRTimeoutUsed =(_FDT_A_PICC_MIN + _PICOREAD_TIMEOUT_OFFSET_A)+10;
// SEND WUPA COMMAND
l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_WUPA,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
// IF RESPONSE (CORRECT OR NOT)
if (l_bStatus != ERR_NOCARD)
{
j = 0;
// SEND HALT COMMAND
v_fnSendHALTA(p_pStructReader); // no response waiting from the card
l_ATQReceived=1;
// delay tP (500 etu = 4,72 ms = 10 * 472 祍 )
for(l_bDelay=10;l_bDelay>0;l_bDelay--)
{
delay_us(472);
}
}
if((j==1)||(j==2))
{
for(l_bDelay=100;l_bDelay>0;l_bDelay--)
{
delay_us(310);
}
}
}
while (j < 3);
#ifdef MODE_DEBUG
//printf("Card A removed, end of payment !!\n");
#endif
return TIME_OUT_ERROR; // and go to reset!!
}
//-----------------------------------------------------------------------------
// Function name : b_fnRemoveB(StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type B Remove
//
//
// IN : p_pStructReader : Pointer to the used StructReader structure.
//
// OUT : - none -
//
// RETURN : END_ACTIVATE_B card B activated
// PROTOCOL_ERROR
// TIME_OUT_ERROR
// TRANSMISSION_ERROR Collision
//
// Notes : - none -
//-----------------------------------------------------------------------------
unsigned char b_fnRemoveB(StructReader* p_pStructReader)
{
unsigned char l_bStatus;
unsigned char l_abBuffer[15];
unsigned char l_bDelay;
unsigned char j;
/*----------LOOP WUPB----------*/
j = 0;
p_pStructReader->s_bRTimeoutUsed = (_FWT_ATQB +_PICOREAD_TIMEOUT_OFFSET_B);
do
{
j += 1;
// SEND WUPB COMMAND
l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_WUPB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
// IF RESPONSE (CORRECT OR NOT)
if (l_bStatus != ERR_NOCARD)
{
j = 0;
//delay(500 etu = 4,72 ms = 10 * 472 祍 ) tP
for(l_bDelay=10;l_bDelay>0;l_bDelay--)
{
delay_us(472);
}
}
}
while (j < 3);
#ifdef MODE_DEBUG
printf("Card B removed, end of payment !!\n");
#endif
return TIME_OUT_ERROR; //& go to Reset
}
//-----------------------------------------------------------------------------
// Function name : b_fnLoopBackFunction(StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Execute the T=CL protocol to transmit APDU
//
// IN : p_pStructReader : Pointer to the used StructReader structure.
//
// OUT : - none -
//
// RETURN : END_RESET error so Reset
// END_TRANSMIT end of the transmission of APDU
//
// Notes :
//-----------------------------------------------------------------------------
unsigned char b_fnLoopBackFunction(StructReader* p_pStructReader)
{
unsigned short l_bStatus;
unsigned char l_abCommand[5];
unsigned short l_iDataOutLength;
unsigned short l_iDataInLength;
unsigned char i = 0;
//g_sLog.enable=1;
#ifdef TTAL1
// LOOP BACK FUNCTION FOR PAYPASS
if (g_Anticollision_choice == 0)
#endif
{
// The first C-APDU to be sent is a SELECT Proximity Payment System Environment APDU
// (
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -