/************************************************
Monitor LPC2478
Menu para ler/escrever no SmartCard (usa o modulo i2c.c)
Marcos A. Stemmer
*************************************************/
#include <arch/nxp/lpc24xx.h>
#include "i2c.h"
#include "monarm.h"

void smartcard(void)
{
char buf[48];
int k;
int c, offset;
int x;
buf[16]='\0';
LCDputs("Le SmartCard");
ini_i2c();	/* Inicializa a interface i2c do smcard */
c = offset = 0;
do	{
	switch(c){
		case '+': offset += 16; break;
		case '-': offset -= 16; break;
		case ' ': case '\r': case '\n': break;
		case 'l': for(x=1; x < 17; x++) buf[x]='\xff'; 
			buf[x]='\0'; goto l_escreve;
		case 'E': case 'e': case 'w': case 'W':
			U0puts("\r\nNome=");
			if(GetStr(buf+1,44)) break;
			U0puts("\r\nNome=");
/* No buf[0] vai o endereco do byte dentro do smcard. 
Nos bytes serguintes vao os dados. */
			U0puts(buf+1);
		l_escreve:
			for(x=1; buf[x]; x++);
			for(c=k=0; (!c) && (x>0); x-=16) {
				buf[k]=offset+k;
				c=escreve_i2c(0xa0,buf+k,x>15? 17:x+1);
				k+=16;
				}
			U0puts(c? "Erro na escrita!\r\n":"OK\r\n");
			break;
		default:
			U0puts("+ Le 16 bytes adiante\r\n");
			U0puts("- Le 16 bytes anteriores\r\n");
			U0puts("e ou w Escreve no smcard\r\n");
			U0puts("l Limpa: escreve 16 bytes de '\\xff'\r\n");
		}
/* Depois de qualquer operacao efetua uma leitura */
	LCDcomando(1);	/* Limpa LCD */
	buf[0]=offset;
	escreve_i2c(0xa0,buf, 1);	/* Escreve o offset (endereco no smcard)*/
	c=le_i2c(0xa0, buf, 16);	/* Le 16 bytes a partir do offset */
	buf[17]='\0';			/* Coloca um marcador de fim de string */
	if(c)	{	/* Se a leitura retornou !=0 houve erro */
		LCDputs("**Erro**");	/* Retorna !=0 se nao leu */
		U0puts("\r\nErro de leitura!\r\n");
		}
	else	{	/* Se leitura OK escreve os dados lidos no LCD */
		LCDcomando(1);
		LCDputs("Leu Ofs=");
		LCDprbyte(offset);
		LCDcomando(0xc0);
		LCDputs(buf);
		}
/* Escreve os dados lidos na interface serial */
	PrByte(offset);
	U0putchar('|');
	for(x=0; x<16; x++){	/* Escreve 16 bytes como hexadecimal */
		PrByte(buf[x]);
		U0putchar(' ');
		}
	U0putchar('|');
	for(x=0; x < 16; x++) {	/* Escreve os mesmos 16 bytes como caracteres */
		c=buf[x];	/* Se for de char de controle escreve ponto */
		if(c < ' ' || c > 127) c = '.';
		U0putchar(c);
		}
	U0puts("|\r\n");		/* Nova linha */
	c = U0getchar();
	} while(c != 0x1b);
}
