#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winscard.h>
#include <ACS38DrvTools.h>
#include "SLE4428.h"

int
main(	int		argc,
		char*	argv[])
{
	SCARDCONTEXT	scardContext;
	char		readerList[100];
	DWORD		readerListStrLen;
	int		numReader;
	char*		readerName[10];
	int		readerNo;
	SLE4428		sle4428;
	char		presentCode[2] = {0xFF, 0xFF};
	char		readBuf[1024];
	LONG		rv;
	char*		ptr;
	FILE		*fp;
	int			i=0;
	
	rv = SCardEstablishContext(	SCARD_SCOPE_SYSTEM,
								NULL,
								NULL,
								&scardContext);
	if (rv != SCARD_S_SUCCESS)
	{
		printf(	"SCardEstablishContext failed(0x%X)\n", rv);
		goto SCardEstablishContextFailed;
	}
	
	readerListStrLen=sizeof(readerList);
	rv = SCardListReaders(	scardContext,
							NULL,
							readerList,
							&readerListStrLen);
	if (rv != SCARD_S_SUCCESS)
	{
		printf("SCardListReaders failed(0x%X)\n", rv);
		goto SCardListReadersFailed;
	}
	numReader = 0;
	ptr = readerList;
	while (*ptr != '\0')
	{
		printf("[%d] %s\n", numReader, ptr);
		readerName[numReader] = ptr;
		ptr += strlen(ptr) + 1;
		numReader++;
	}

	printf("Please input reader no:");
	scanf("%d", &readerNo);
	getchar();

	printf(	"Setting reader %d [%s] to SLE4428 mode...\n",
			readerNo,
			readerName[readerNo]);
	rv = ACS38DrvSetCardType(
			scardContext,
			readerName[readerNo],
			ACS38DRV_CARD_TYPE_SLE4418_4428);
	if (rv != SCARD_S_SUCCESS)
	{
		printf("ACS38DrvSetCardType failed(0x%X)\n", rv);
		goto ACS38DrvSetCardTypeFailed;
	}

	printf("Waiting for card inserted...Press enter to continue...\n");
	getchar();
	printf("Connecting SLE4428 card on reader %d\n", readerNo);
	rv = SLE4428Connect(&sle4428,
						scardContext,
						readerName[readerNo]);
	if (rv != SCARD_S_SUCCESS)
	{
		printf("SLE4428Connect failed(0x%X)\n", rv);
		goto SLE4428ConnectFailed;
	}

	printf("Present Code [FF FF]...\n");
	rv = SLE4428Present(&sle4428, presentCode);
	if (rv != SCARD_S_SUCCESS)
	{
		printf("SLE4428Present failed(0x%X)\n", rv);
		goto SLE4428PresentFailed;
	}

	printf("Read 1024 bytes from addr 00:00...\n");
	for (i=0 ; i<4 ; i++)
	{
		rv = SLE4428ReadMem(&sle4428,
							0x00,
							0x00,
							128,
							readBuf+i*128,
							sizeof(readBuf)-i*128);
		if (rv != SCARD_S_SUCCESS)
		{
			printf("SLE4428ReadMem failed(0x%X)\n", rv);
			goto SLE4428ReadMemFailed;
		}
	}

	printf(	"Setting reader %d [%s] back to MCU mode...\n",
			readerNo,
			readerName[readerNo]);
	rv = ACS38DrvSetCardType(
			scardContext,
			readerName[readerNo],
			ACS38DRV_CARD_TYPE_MCU);
	if (rv != SCARD_S_SUCCESS)
	{
		printf("ACS38DrvSetCardType failed(0x%X)\n", rv);
		goto ACS38DrvSetCardTypeFailed;
	}
	
	SLE4428Disconnect(&sle4428);
	
	// dump content of card in a file
	fp=fopen("sle4428.bin","w");
	if (NULL!=fp) 
	{
		fwrite(readBuf,sizeof(readBuf),1,fp);	
		fclose(fp);
	}
		
	return 0;

/****** Error Part ******/
SLE4428ReadMemFailed:
SLE4428PresentFailed:
	SLE4428Disconnect(&sle4428);

SLE4428ConnectFailed:
ACS38DrvSetCardTypeFailed:
SCardListReadersFailed:
SCardEstablishContextFailed:
	return 1;
}
