📄 posfunc.c
字号:
/*
posfunc.c
Sunyard S520-G POS .
*/
#include "pos.h"
static unsigned char ucgTrack2Len, ucgTrack3Len;
static char strgTrack2[TRACK2_LEN+1], strgTrack3[TRACK3_LEN+1];
static int PrintNormal( );
// *******************************************************************
// Function Name : SwipeCard
// Function : swipe input cardno
// Parameter : ucFlag: CARD1 or CARD2
// : ucIsSwipe: 1: Get data from card reader
// : 0: Get data from global directly
// Return : On Success return 0
// : -1: read error
// : -2: Track 2 error
// : -3: Track 3 error
// : -5: Both 2 & 3 error
// : -6: Invalid card
// : -7: Can't found in CDT
// *******************************************************************
static short SwipeCard(unsigned char ucFlag, unsigned char ucIsSwipe)
{
unsigned char i;
short sOffset, sRet;
char strCardTemp[ 25 ], strCdtTemp[ CDT_BUF_LEN ], strTemp[ 50 ];
unsigned char ucKey;
if ( ucIsSwipe )
{
ucgTrack2Len = ucgTrack3Len = 0;
memset( strgTrack2, 0, sizeof(strgTrack2));
memset( strgTrack3, 0, sizeof(strgTrack3));
sRet = Sys_Mc_Read_Double( strgTrack2, &ucgTrack2Len, strgTrack3, &ucgTrack3Len, &ucKey, 2 );
if ( sRet == -3 && ucKey == KEY_CANCEL )
return -10;
Sys_Beep_Set();
}
sRet = 0;
if ( ucgTrack2Len == 0 )
sRet = -2;
if ( ucgTrack3Len == 0 )
sRet += -3;
if ( ( sRet == -2 ) || ( sRet == -5 ) )
return sRet;
for ( i = 0; i < ucgTrack2Len; i++ )
strgTrack2[ i ] += 0x30;
for ( i = 0; i < ucgTrack3Len; i++ )
strgTrack3[ i ] += 0x30;
sOffset = Syd_FieldVar( strgTrack2, 1, CARDSEP, strCardTemp ); /* Get card number */
if ( sOffset < 9 || sOffset > 21 )
return (-6);
if ( ucFlag == CARD1 )
{
strcpy( gTrans.strCardNo1, strCardTemp );
strcpy( gTrans.strTrack2, strgTrack2 );
strcpy( gTrans.strTrack3, strgTrack3 );
gTrans.sPosEnt = SWIPE;
}
else
{
strcpy( gTrans.strCardNo2, strCardTemp );
}
return sRet;
}
// *******************************************************************
// Function Name : DisplaySwipeMessage
// Function : when Swipe Card Error, display the error Message
// Parameter :
// Return :
// *******************************************************************
void DisplaySwipeMessage(unsigned char ucLine, short sRet)
{
switch ( sRet )
{
case 0:
case -3:
break;
case -2:
Syd_DisplayLine( ucLine, "Bad Track 2", 0, ALIGN_CENTER );
break;
case -5:
Syd_DisplayLine( ucLine, "Bad Track 2 & 3", 0, ALIGN_CENTER );
break;
default:
Syd_DisplayLine( ucLine, "Bad Card ", 0, ALIGN_CENTER );
break;
}
}
// *******************************************************************
// Function Name : GetCardNo
// Function : Get card NO
// Parameter : ucFlag: CARD1 or CARD2
// : ucMode: SWIPE or MANUAL or BOTH
// Return : On Success return 0
// *******************************************************************
int GetCardNo(unsigned char ucFlag, unsigned char ucMode)
{
short sRet, i, j;
i = 0;
do
{
if ( i == 0 )
Syd_DisplayLine( 3, "swipe card pls", 0, ALIGN_CENTER );
else {
DisplaySwipeMessage(3, sRet);
Syd_DisplayLine( 4, "swipe again pls", 0, ALIGN_CENTER );
}
sRet = SwipeCard( ucFlag, 1 );
if (sRet == -3)
sRet = 0;
Syd_ClearLine(3); Syd_ClearLine(4);
if ( sRet == -10 )
return -1;
if (sRet == -6) break;
i++;
} while (sRet < 0 && i < 3 );
if (sRet == 0 || sRet == -3)
return 0;
DisplaySwipeMessage(3, sRet);
sleep(1);
return -1;
}
// *******************************************************************
// Function Name : Get Holder Pin
// Function : Get card holder pin
// Parameter :
// Return : On Success return 0
// *******************************************************************
short GetHolderPin(void)
{
char temp[ 19 + 1 ], strWorkKey[20];
short i, j, sMasterKeyId;
int nRet;
Syd_FieldVar( gTrans.strHdtBuf, HDT_PKEY, HDT_FS, temp );
Syd_DspToHex( temp, strWorkKey, 8 );
Syd_FieldVar( gTrans.strHdtBuf, HDT_MKEYINDEX, HDT_FS, temp );
sMasterKeyId = atoi( temp );
if ( Sys_PINpad_SelectKey( sMasterKeyId ) < 0 )
{
Syd_ErrorMessageWait( 3, "No Key Exist", 0, ALIGN_CENTER );
return -1;
}
Syd_DisplayLine( 3, "Transaction Pin: ", 0, ALIGN_CENTER );
for ( i = 0; i < 3; i++ )
{
if ( Sys_PINpad_Init() < 0 )
{
Syd_ErrorMessageWait( 3, "Init Keyboard failure", 0, ALIGN_CENTER );
return -1;
}
j = 0;
do
{
memset( temp, '*', j );
temp[ j ] = 0;
if (j == 0) Syd_ClearLine(5);
else
Syd_DisplayLine( 5, temp, 0, ALIGN_LEFT );
nRet = Sys_PINpad_WaitKey();
if ( nRet == 0x2a )
j++;
if ( nRet == KEY_DEL )
{
j--;
if ( j < 0 )
j = 0;
}
} while ( nRet != KEY_ENTER && nRet != KEY_CANCEL );
Syd_ClearLine( 3 );
Syd_ClearLine( 4 );
Syd_ClearLine( 5 );
if (nRet == KEY_CANCEL) return -1;
if ( nRet == KEY_ENTER )
{
if ( 0 == j )
return 0;
gTrans.sPinLen = j;
//
memset( temp, 0, sizeof( temp ) );
memset( temp, '0', 19 );
strcpy( temp + 19 - strlen( gTrans.strCardNo1 ), gTrans.strCardNo1 );
if ( Sys_PINpad_PinEncrypt( gTrans.strHolderPin, temp, strWorkKey ) < 0 )
{
Syd_ErrorMessageWait( 3, "get pin error", 0, ALIGN_CENTER );
return -1;
}
return 0;
}
}
return -1;
}
// *******************************************************************
// Function Name : ModifyHdtPara
// Function : Modify the special hdt para
// Parameter : sHostNum: the host id
// : ucIndex : the parameter index
// : strMsg1 : the prompt message
// : strMsg2 : the prompt message
// : ucMaxLen: the max length of the parameter can accepted
// : ucInputType : 1: number 2: string 3: ip
// Return : on success return 0
// *******************************************************************
int ModifyHdtPara( short sHostNum, unsigned char ucIndex, char *strMsg1, char *strMsg2, unsigned char ucMinLen, unsigned char ucMaxLen, unsigned char ucInputType )
{
char strHdtBuf[ HDT_BUF_LEN ];
char temp[ 40 ], strName[10];
int nRet;
sprintf(strName, "HDT%d", sHostNum);
if (Syd_GetEnv( strName, strHdtBuf, HDT_BUF_LEN - 1 ) < 0)
{
Syd_ErrorMessageWait( 5, "GetHDT", 0, ALIGN_CENTER );
return -1;
}
Syd_FieldVar( strHdtBuf, ucIndex, HDT_FS, temp );
if ( strMsg2[ 0 ] == ' ' ) {
Syd_ClearLine(2);
Syd_DisplayLine( 3, strMsg1, 0, ALIGN_LEFT );
}
else {
Syd_DisplayLine( 2, strMsg1, 0, ALIGN_LEFT );
Syd_DisplayLine( 3, strMsg2, 0, ALIGN_LEFT );
}
Syd_DisplayLine( 4, "Old:", 0, ALIGN_LEFT );
Syd_DisplayLineAt( 4, MAX_ASCII-ucMaxLen, temp, 0 );
do
{
Syd_DisplayLine( 5, "New:", 0, ALIGN_LEFT );
nRet = Syd_GetInput( MAX_ASCII - ucMaxLen, 5, temp, ucMaxLen, ucInputType );
if ( nRet < 0 )
{
Syd_ClearLine( 2 );
Syd_ClearLine( 3 );
Syd_ClearLine( 4 );
Syd_ClearLine( 5 );
return -1;
}
if (nRet == 0) return 0;
} while ( nRet < ucMinLen );
Syd_FieldPut( strHdtBuf, ucIndex, HDT_FS, temp );
if (Syd_PutEnv( strName, strHdtBuf ) < 0)
{
Syd_ErrorMessageWait( 5, "Syd_PutEnv", 0, ALIGN_CENTER );
return -1;
}
Syd_ClearLine( 2 );
Syd_ClearLine( 3 );
Syd_ClearLine( 4 );
Syd_ClearLine( 5 );
return 0;
}
// *******************************************************************
// Function Name : DisplayFlag
// Function : Display the flag
// Parameter :
// Return :
// *******************************************************************
void DisplayFlag(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -