⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posfunc.c

📁 这是一个基于UCLinux下的一个GPRS 移动POS设备的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 
   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 + -