#include "../src/rc522.h"
#include <avr/io.h>
#include "../lib/usart/src/usart.h"
#include "string.h"

#define	uchar	unsigned char
#define	uint	unsigned int
#define MAX_LEN 16
const int chipSelectPin = 10;
const int NRSTPD = 5;

uchar serNum[5];
uchar  writeDate[16] ={'T', 'e', 'n', 'g', ' ', 'B', 'o', 0, 0, 0, 0, 0, 0, 0, 0,0};

uchar sectorKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                             {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                            };
 uchar sectorNewKeyA[16][16] = {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                                {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
                               };

int main() {                
	usart::init(1000000);
	printf("Hello");
   	MFRC522_Init();
	while(1) {
		uchar i;
		uchar status;
			uchar str[MAX_LEN];
			uchar RC_size;
			uchar blockAddr;	//Select the address of the operation 0~63


			// searching card, return card type	
			status = MFRC522_Request(PICC_REQIDL, str);	
			if (status == MI_OK)
			{
			}

			
			status = MFRC522_Anticoll(str);
			memcpy(serNum, str, 5);
			if (status == MI_OK)
			{
				printf("The card's number is  : %x%x%x%x%x%x\n\r",
					serNum[0],
					serNum[1],
					serNum[2],
					serNum[3],
					serNum[4]);
			}

			// select card, return card capacity
			RC_size = MFRC522_SelectTag(serNum);
			if (RC_size != 0)
			{}
					
			// write data card
			blockAddr = 7;		// data block 7		
			status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], serNum);	// authentication 
			if (status == MI_OK)

			{
				// write data
				status = MFRC522_Write(blockAddr, sectorNewKeyA[blockAddr/4]);
				printf("set the new card password, and can modify the data of the Sector: ");
				printf("%i", blockAddr/4);

				// write data
				blockAddr = blockAddr - 3 ; 
				status = MFRC522_Write(blockAddr, writeDate);
				if(status == MI_OK)
				{
					printf("OK!\n\r");
				}
			}

			// read card
			blockAddr = 7;		// data block 7		
			status = MFRC522_Auth(PICC_AUTHENT1A, blockAddr, 

	sectorNewKeyA[blockAddr/4], serNum);	// authentication 
			if (status == MI_OK)
			{
				// read data
							blockAddr = blockAddr - 3 ; 
							status = MFRC522_Read(blockAddr, str);
				if (status == MI_OK)
				{
					printf("Read from the card ,the data is : \n\r");
					for (i=0; i<16; i++)
					{
						printf("%c", str[i]);
					}
						printf("\n\r");
				}
			}
			printf("\n\r");
			MFRC522_Halt();			// command card into sleeping mode              
			
	}

}