Sie sind auf Seite 1von 7

//----------------------------------------------------------------------------// File

: coremain.c
// Module
:
// Description : Main Entry.
// Author
: Lewis
// Notes
:
//
// Naming conventions
// ~~~~~~~~~~~~~~~~~~
//
Constant : Leading K
//
Global Variable : Leading g
//
Function argument : Leading a
//
Local Variable : All lower case
//
// Date
Who
Action
// ------------ ----------- ------------------------------------------------// 01 Dec 2007 Lewis
Initial Version.
//----------------------------------------------------------------------------#include "midware.h"
#include "sysutil.h"
#include "menu.h"
#include "coremain.h"
//----------------------------------------------------------------------------//
Prototypes
//----------------------------------------------------------------------------void MsrOpen(void);
void MsrClose(void);
void SwipeTest(void);
//----------------------------------------------------------------------------//
Defines
//----------------------------------------------------------------------------#define TRK2
0x01
#define TRK1
0x02
#define TRK3
0x04
#define
#define
#define
#define

TRK_END_SENTINEL
TRK1_START_SENTINEL
TRK2_START_SENTINEL
TRK3_START_SENTINEL

0x3F
0x25
0x3B
0x3B

//----------------------------------------------------------------------------//
Globals
//----------------------------------------------------------------------------static int gMsrFd = -1;
// PC0802 cannot use global
//static BYTE gTrk1Data[80], gTrk2Data[40], gTrk3Data[110];
//----------------------------------------------------------------------------//
Constant
//----------------------------------------------------------------------------const BYTE KSoftName[] = {"Msr_Test"};
const DWORD KExportFunc[] =
{
(DWORD) 0,
ns!!!
(DWORD) NULL,
};

// Export Function Table


// Importance!! Number of export functio

const struct FuncTable


{
{" Open
",
{" Close ",
{"Swipe Test",
{" Exit
",
{NULL, NULL}
};

KFuncMain[] =

// Func Test Menu

MsrOpen},
MsrClose},
SwipeTest},
NULL},

//*****************************************************************************
// Function
: VirginInit
// Description
: Perform virgin initialization.
// Input
: N/A
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
int VirginInit(void)
{
return 0;
}
//*****************************************************************************
// Function
: GlobalsInit
// Description
: Initialization global variables.
// Input
: N/A
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
void GlobalsInit(void)
{
return;
}
//*****************************************************************************
// Function
: Coremain
// Description
: Your application code start here.
// Input
: N/A
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
int Coremain(DWORD aParam1, DWORD aParam2, DWORD aParam3)
{
// Application start here!!
int selection;
// Main Menu
selection = 0;
while (1)
{
selection = ShowMenu ((const struct FuncTable*)&KFuncMain, (const char*)KSof
tName, 1, selection);
if (selection >= 0) {
if (KFuncMain[selection].Func != NULL) {
PrintfMW("\x10\f\x1c %s\x5\x1d", KFuncMain[selection].Name);
KFuncMain[selection].Func ();

}
else {
break;
}
}
}
// Close MSR to avoid fd lost
CloseMW(gMsrFd);
return 0;
}
//*****************************************************************************
// Function
: ShowLastErr
// Description
: Show Last Operation Error code at current position.
// Input
: N/A
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
static void ShowLastErr(void)
{
int err_no;
err_no = GetLastErrMW();
PrintfMW("(Err: %d)", err_no);
}
//*****************************************************************************
// Function
: MsrOpen
// Description
: Open the MSR at default mode.
// Input
: N/A
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
void MsrOpen(void)
{
int fd;
char dev_name[24];
ClrBelow(MWLINE2);
PutCharMW(MWPUSH_CURSOR);
PutCharMW(MWSEL_SPFONT);
strcpy(dev_name, DEV_MSR1);
fd = OpenMW(dev_name, MW_RDONLY);
PrintfMW("\x1B\x40 %s\n Open ", DEV_MSR1);
if (fd == -1) {
PrintfMW("Fail!");
ShowLastErr();
}
else {
PrintfMW("Success!\n (Fd = 0x%04x)", fd);
gMsrFd = fd;
}
WaitKey();
PutCharMW(MWPOP_CURSOR);
}
//*****************************************************************************
// Function
: MsrClose
// Description
: Close MSR Device

// Input
: N/A
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
void MsrClose(void)
{
ClrBelow(MWLINE2);
PutCharMW(MWPUSH_CURSOR);
PutCharMW(MWSEL_SPFONT);
PrintfMW("\x1B\x40 FD : 0x%04x\n Close ", gMsrFd);
if (CloseMW(gMsrFd) == -1) {
PrintfMW("Fail!");
ShowLastErr();
}
else
PrintfMW("Success!");
WaitKey();
PutCharMW(MWPOP_CURSOR);
}
//*****************************************************************************
// Function
: ExtractTrackData
// Description
: Extract Track Data
// Input
: aTrk1;
// pointer to track 1 buffer
//
aTrk2;
// pointer to track 2 buffer
//
aTrk3;
// pointer to track 3 buffer
//
aLen;
// MSR data len;
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
static void ExtractTrackData(BYTE *aTrk1, BYTE *aTrk2, BYTE *aTrk3, BYTE aLen)
{
BYTE i;
BYTE ch;
WORD ch_count, trk_data_count;
aTrk1[0] = aTrk2[0] = aTrk3[0] = 0;
ch_count = 0;
for (i = TRK2; i <= TRK3; i<<=1) {
ReadMW(gMsrFd, &ch, 1); // Skip Track2 start sentinel
ch_count++;
trk_data_count = 0;
do {
ReadMW(gMsrFd, &ch, 1); // Skip Track2 start sentinel
if ((ch == 0x00) || (ch_count > aLen)) { // No more data
aTrk1[0]=0;
aTrk2[0]=0;
aTrk3[0]=0;
return;
}
ch_count++;
switch (i) {
case TRK2:
aTrk2[trk_data_count] = ch;
break;
case TRK1:
aTrk1[trk_data_count] = ch;
break;

case TRK3:
aTrk3[trk_data_count] = ch;
break;
}
trk_data_count++;
} while (ch != TRK_END_SENTINEL);
trk_data_count--;
switch (i) {
case TRK2:
aTrk2[trk_data_count] = 0x00;
break;
case TRK1:
aTrk1[trk_data_count] = 0x00;
break;
case TRK3:
aTrk3[trk_data_count] = 0x00;
break;
}
}
}
//*****************************************************************************
// Function
: SwipeTest
// Description
: MSR swipe test.
// Input
: N/A
// Return
: N/A
// Note
: N/A
// Globals Changed : N/A
//*****************************************************************************
void SwipeTest(void)
{
struct MW_MSR_CFG msr_cfg;
int req_track;
int msr_len;
DWORD result;
int i;
DWORD line_no;
BYTE *ptr;
BYTE gTrk1Data[80], gTrk2Data[40], gTrk3Data[110]; //PC0802 cannot use global
PutCharMW(MWPUSH_CURSOR);
// Select Track
req_track = 0;
while (req_track == 0) {
PrintfMW("\x1B\x20<1> Track 1,2\n<2> Track 2,3\n<3> Track 1,2,3");
switch (GetCharMW()) {
case MWKEY_1 :
req_track = TRK2 | TRK1;
break;
case MWKEY_2 :
req_track = TRK3 | TRK1;
break;
case MWKEY_3 :
req_track = TRK2 | TRK1 | TRK3;
break;
case MWKEY_CANCL:
req_track = -1;
}
if (req_track == -1)
break;

}
if (req_track != -1) {
msr_cfg.b_mode = req_track;
msr_cfg.b_speed = 0;
IOCtlMW(gMsrFd, IO_MSR_CFG, &msr_cfg);
ClrBelow(MWLINE2);
PutCharMW(MWSEL_BIGFONT);
PrintfMW("\x1B\x60 PLS SWIPE CARD");
PutCharMW(MWSEL_SPFONT);
while (1) {
SleepMW();
if (GetCharMW()==MWKEY_CANCL)
break;
if ((msr_len = IOCtlMW(gMsrFd, IO_MSR_RXLEN, NULL))<=0) {
if (msr_len == -1) {
PrintfMW("\x1B\xC0");
ShowLastErr();
}
continue;
}
result = IOCtlMW(gMsrFd, IO_MSR_STATUS, NULL);
if (result & req_track)
AcceptBeep();
else
LongBeep();
ExtractTrackData(gTrk1Data, gTrk2Data, gTrk3Data, (BYTE)msr_len);
// Show Result
ClrBelow(MWLINE2); // !TODO This line cause simulator access fail.
PrintfMW("\x10\x1B\x40TRK 2: NO CHECK\n\x05\x1B\x80TRK 1: NO CHECK\n\x05\x
1B\xC0TRK 3: NO CHECK\n\x05");
line_no = MWLINE3;
for (i = TRK2; i <= TRK3; i<<=1) {
if ((req_track & i)==0x00)
continue;
PrintfMW("\x10\x1B%c", line_no+7); // col 7
if (result & i)
PrintfMW("PASS\x05");
else
if (result & (i<<8))
PrintfMW("FAIL\x05");
else
PrintfMW("NO DATA\x05");
switch (i) {
case TRK1:
ptr = gTrk1Data;
break;
case TRK2:
ptr = gTrk2Data;
break;
case TRK3:
default:
ptr = gTrk3Data;
break;
}
PutCharMW(MWSEL_SPFONT);
PrintfMW("\x12\x1B%c", line_no+MWLINE2);
msr_len = strlen((char *)ptr); // reuse msr_len;
msr_len = msr_len > 21 ? 21 : msr_len;
PutNCharMW(ptr, msr_len);
line_no += MWLINE3;

}
IOCtlMW(gMsrFd, IO_MSR_RESET, NULL);
}
}
PutCharMW(MWPOP_CURSOR);
}

Das könnte Ihnen auch gefallen