Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:8e949d38885c, committed 2019-06-04
- Comitter:
- williequesada
- Date:
- Tue Jun 04 18:01:55 2019 +0000
- Commit message:
- pablo
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Tue Jun 04 18:01:55 2019 +0000
@@ -0,0 +1,572 @@
+#include "mbed.h"
+
+#define COMMAND_ON 0X70
+#define COMMAND_INIT 0X71
+#define COMMAND_GPRS 0X72
+#define COMMAND_DATA 0X73
+#define COMMAND_POST 0X74
+#define COMMAND_ANSWER 0X75
+#define COMMAND_SIGNAL 0X76
+#define COMMAND_CONNECT 0X77
+#define COMMAND_OFF 0X78
+#define HOSTING_STEP1 0x79
+#define HOSTING_STEP2 0x7A
+#define HOSTING_STEP3 0x7B
+#define HOSTING_STEP4 0x7C
+#define HOSTING_STEP5 0x7D
+#define HOSTING_STEP6 0x7E
+#define HOSTING_STEP7 0x7F
+#define HOSTING_STEP8 0x80
+#define HOSTING_STEP9 0x81
+#define HOSTING_STEP10 0x82
+#define HOSTING_STEP11 0x83
+#define HOSTING_OFF 0x84
+#define NEXT_STEP 0x85
+#define NEXT_SLEEP 0x86
+#define COMMAND_END 0X88
+
+#define USER_INIT 0xA0
+#define USER_PLACE 0xA1
+#define USER_CARD 0xA2
+#define USER_TIME 0xA3
+#define USER_DATA 0xA4
+#define USER_PRINT 0xA5
+#define USER_TICKET 0xA6
+#define USER_FINISH 0xA7
+#define USER_POST 0xA8
+#define USER_ANSWER 0xA9
+#define USER_INIT2 0xAA
+#define USER_INIT3 0xB0
+#define USER_INIT4 0xB1
+#define USER_CARD2 0xB2
+#define USER_INIT5 0xB3
+#define USER_CARD3 0xB4
+// Conector ZHR-6 de JST http://www.jst.com/
+// _ _ _ _ _ _
+// ! ! ! ! ! ! ! 1->CTS 2->TXD 3->DTR
+// 6 5 4 3 2 1 4->RXD 5->GND 6->PWR
+
+Serial Computer(USBTX, USBRX); // tx, rx
+Serial CardReader(PC_12,PD_2,9600);
+
+const char SOH=1;
+const char EOT=4;
+const char ESP=33;
+const char ADDR=0;
+const char LEN=0;
+const char CARD_POSITION='8';
+const char CARD_LOCK='{';
+const char CARD_UNLOCK='}';
+const char DEV_STATUS='$';
+const char DEV_RESET=127;
+const char ARM_MODE='P';
+const char ARM_DEBUG='p';
+const char ARM_ABORT=27;
+const char SIG_START='?';
+const char FCT_READ='R';
+const char MAG_CUSTOM_T1='U';
+const char MAG_CUSTOM_T2='V';
+const char MAG_CUSTOM_T3='W';
+const char MAG_ISO_T1='Q';
+const char MAG_ISO_T2='R';
+const char MAG_ISO_T3='S';
+const char MAG_CUSTOM_F='4';
+const char BBCA='=';
+const char BBCB='~';
+const char BBCC='x';
+const char BBCD='!';
+const char BBCE='U';
+const char BBCF='u';
+const char BBCG=30;
+const char BBCH='d';
+const char BBCI='z';
+const char BBCJ='T';
+const char BBCK='W';
+const char BBCL='V';
+const char BBCM=10;
+const char R_ACTION='^';
+const char R_ERROR='*';
+const char R_INVALID='!';
+const char R_NO_DATA='+';
+const char R_COMAND_ERROR='?';
+const char R_START=':';
+const char R_POSITION1='q';
+const char R_POSITION2='s';
+const char R_NO_MAG_CARD='>';
+const char R_MAG_DETECT_ON='(';
+const char R_MAG_DETECT_OFF=')';
+char Track2[38]="0000000000000000000000000000000000000";
+
+DigitalOut CardReaderPower(PF_3);//
+DigitalOut Max232(PC_8);
+
+
+char StateReader[7]= {'0','0','0','0','0','0','0'};
+char CardReader_Buffer[255];
+int CardReader_Counter=0;
+char Comando=' ';
+unsigned long Inicio, Fin, Transcurrido;
+Timer BaseClock;
+
+
+
+void Interrupt_CardReader()
+{
+ CardReader_Buffer[CardReader_Counter]=CardReader.getc();
+ CardReader_Counter++;
+}
+
+
+
+int ResetCard()
+{
+ CardReader_Counter=0;
+ StateReader[0]='S';
+ Computer.printf("\n Reset card reader");
+ if(CardReader.writeable()) {
+ CardReader.putc(SOH); // 00000001
+ CardReader.putc(ADDR); // 00000000
+ CardReader.putc(LEN); // 00000000
+ CardReader.putc(LEN); // 00000000
+ CardReader.putc(DEV_RESET); // 01111111
+ CardReader.putc(EOT); // 00000100
+ CardReader.putc(BBCI); // 01111010
+ }
+ wait_ms(2000);
+ for(int i=0; i<=CardReader_Counter; i++) {
+ if(CardReader_Buffer[i]==R_START) {
+ Computer.printf("\n Start\n"); // Encendido
+ StateReader[0]='A';
+
+ return 1;
+ }
+ if(CardReader_Buffer[i]==R_INVALID) {
+ Computer.printf("\n Invalid "); // Comando Invalido
+ StateReader[0]='N';
+
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_ERROR) {
+ Computer.printf("\n Error "); // Error
+ StateReader[0]='E';
+
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+ Computer.printf("\n Comando error "); // Error en comando
+ StateReader[0]='C';
+
+ return 0;
+ }
+ }
+
+ return 2;
+}
+
+void DetectionCard(uint32_t TimeOut)
+{
+ CardReader_Counter=0;
+ StateReader[1]='S';
+ StateReader[2]='S';
+ StateReader[3]='S';
+ if(StateReader[0]=='A') { // Se envia el comando Arm Debug
+ Computer.printf("\n Introducir tarjeta");
+ if(CardReader.writeable()) {
+ CardReader.putc(SOH);
+ CardReader.putc(ADDR);
+ CardReader.putc(LEN);
+ CardReader.putc(LEN);
+ CardReader.putc(ARM_DEBUG);
+ CardReader.putc(EOT);
+ CardReader.putc(BBCF);
+ }
+ wait_ms(500);
+ for(int i=0; i<=CardReader_Counter; i++) {
+ if(CardReader_Buffer[i]==R_ACTION) {
+ Computer.printf("\n ACTION "); // Accion ejecutada
+ StateReader[1]='A';
+
+ }
+ if(CardReader_Buffer[i]==R_INVALID) {
+ Computer.printf("\n Invalido "); // Comando Invalido
+ StateReader[1]='N';
+
+ }
+ if(CardReader_Buffer[i]==R_ERROR) {
+ Computer.printf("\n Error "); // Error
+ StateReader[1]='E';
+
+ }
+ if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+ Computer.printf("\n Comando error ");// Error en comando
+ StateReader[1]='C';
+
+ }
+ }
+ CardReader_Counter=0;
+
+ Inicio=BaseClock.read_ms();
+ while(CardReader_Counter==0) { // Esperando introduccion de tarjeta
+ Fin=BaseClock.read_ms();
+ Transcurrido=Fin-Inicio;
+ if(StateReader[1]=='C'||StateReader[1]=='E'||StateReader[1]=='N') {
+ Computer.printf("\n Error en comando");
+ break;
+ }
+ if(StateReader[1]=='S') {
+ Computer.printf("\n Sin respuesta");
+ break;
+ }
+ if(Transcurrido>TimeOut) {
+ Computer.printf("\n Tiempo de respuesta");
+ if(CardReader.writeable()) {
+ CardReader.putc(SOH);
+ CardReader.putc(ADDR);
+ CardReader.putc(LEN);
+ CardReader.putc(LEN);
+ CardReader.putc(ARM_ABORT);
+ CardReader.putc(EOT);
+ CardReader.putc(BBCG);
+ }
+ break;
+ }
+ }
+ wait_ms(1000);
+ for(int i=0; i<=CardReader_Counter; i++) {
+ Computer.printf("%c",CardReader_Buffer[i]);
+ if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
+ Computer.printf("\n Deteccion nula "); // No se detecta banda magnetica
+ StateReader[2]='N';
+ StateReader[3]='N';
+ }
+ if(CardReader_Buffer[i]==R_MAG_DETECT_ON) {
+ Computer.printf("\n Deteccion on "); // Se inicia verificacion de banda
+ StateReader[2]='A';
+ }
+ if(CardReader_Buffer[i]==R_MAG_DETECT_OFF) {
+ Computer.printf("\n Deteccion off "); // Se termina verificacion de banda
+ StateReader[3]='A';
+ }
+ if(CardReader_Buffer[i]==R_ACTION) {
+ Computer.printf("\n Action arm abort "); // Accion ejecutada
+ StateReader[1]='T';
+ }
+ }
+ }
+}
+
+int PositionCard()
+{
+ CardReader_Counter=0;
+ StateReader[4]='S';
+ Computer.printf("\n Detectando tarjeta");
+ if(CardReader.writeable()) {
+ CardReader.putc(SOH);
+ CardReader.putc(ADDR);
+ CardReader.putc(LEN);
+ CardReader.putc(LEN);
+ CardReader.putc(CARD_POSITION);
+ CardReader.putc(EOT);
+ CardReader.putc(BBCA);
+ }
+ wait_ms(250);
+ for(int i=0; i<=CardReader_Counter; i++) {
+ Computer.printf("%c",CardReader_Buffer[i]);
+ if(CardReader_Buffer[i]==R_POSITION1) {
+ Computer.printf("\n Tarjeta en posicion incorrecta "); // Mal colocada la tarjeta
+ StateReader[4]='N';
+
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_POSITION2) {
+ Computer.printf("\n Tarjeta en posicion correcta "); // Bien colocada la tarjeta
+ StateReader[4]='A';
+
+ return 1;
+ }
+ if(CardReader_Buffer[i]==R_INVALID) {
+ Computer.printf("\n Invalido "); // Comando Invalido
+ StateReader[4]='N';
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_ERROR) {
+ Computer.printf("\n Error "); // Error
+ StateReader[4]='E';
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+ Computer.printf("\n Comando error ");// Error en comando
+ StateReader[4]='C';
+ return 0;
+ }
+ }
+ return 2;
+}
+
+int ReadCard(uint32_t TimeOut)
+{
+ CardReader_Counter=0;
+ StateReader[5]='S';
+ StateReader[6]='S';
+ if(StateReader[4]=='A') {
+ Computer.printf("\n Retirar Tarjeta en un solo movimiento");
+ if(CardReader.writeable()) {
+ CardReader.putc(SOH);
+ CardReader.putc(ADDR);
+ CardReader.putc(LEN);
+ CardReader.putc(LEN);
+ CardReader.putc(ARM_MODE);
+ CardReader.putc(EOT);
+ CardReader.putc(BBCE);
+ }
+ wait_ms(300);
+ for(int i=0; i<=CardReader_Counter; i++) {
+ Computer.printf("%c",CardReader_Buffer[i]);
+ if(CardReader_Buffer[i]==R_ACTION) {
+ Computer.printf("\n Accion"); // Accion ejecutada
+ StateReader[5]='A';
+ }
+ if(CardReader_Buffer[i]==R_INVALID) {
+ Computer.printf("\n Invalido "); // Comando Invalido
+ StateReader[5]='N';
+ }
+ if(CardReader_Buffer[i]==R_ERROR) {
+ Computer.printf("\n Error "); // Error
+ StateReader[5]='E';
+ }
+ if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+ Computer.printf("\n Comando error ");// Error en comando
+ StateReader[5]='C';
+ }
+ }
+ CardReader_Counter=0;
+ Inicio=BaseClock.read_ms();
+ while(CardReader_Counter==0) { // Esperando introduccion de tarjeta
+ Fin=BaseClock.read_ms();
+ Transcurrido=Fin-Inicio;
+ if(StateReader[5]=='C'||StateReader[5]=='E'||StateReader[5]=='N') {
+ Computer.printf("\n Error en comando");
+ break;
+ }
+ if(StateReader[5]=='S') {
+ Computer.printf("\n Sin Respuesta");
+ break;
+ }
+ if(Transcurrido>TimeOut) {
+ Computer.printf("\n Tiempo de respuesta superado");
+ if(CardReader.writeable()) {
+ CardReader.putc(SOH);
+ CardReader.putc(ADDR);
+ CardReader.putc(LEN);
+ CardReader.putc(LEN);
+ CardReader.putc(ARM_ABORT);
+ CardReader.putc(EOT);
+ CardReader.putc(BBCG);
+ }
+ StateReader[5]='T';
+ break;
+ }
+ }
+ wait_ms(200);
+ for(int i=0; i<=CardReader_Counter; i++) {
+ Computer.printf("%c",CardReader_Buffer[i]);
+ Computer.printf("-%2X-",CardReader_Buffer[i]);
+ if(CardReader_Buffer[i]==R_NO_MAG_CARD) {
+ Computer.printf("\n Deteccion nula "); // No se detecta banda magnetica
+ StateReader[6]='N';
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_ACTION) {
+ Computer.printf("\n Tarjeta leida "); // Tarjeta leida
+ StateReader[6]='A';
+ return 1;
+ }
+ if(CardReader_Buffer[i]==R_INVALID) {
+ Computer.printf("\n Invalido "); // Comando Invalido
+ StateReader[6]='N';
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_ERROR) {
+ Computer.printf("\n Error "); // Error
+ StateReader[6]='E';
+ return 0;
+ }
+ if(CardReader_Buffer[i]==R_COMAND_ERROR) {
+ Computer.printf("\n Error comando "); // Error en comando
+ StateReader[6]='C';
+ return 0;
+ }
+ }
+ }
+ return 0;
+}
+
+int RecibeDataCard()
+{
+ if (StateReader[6]=='A') {
+ CardReader_Counter=0;
+ if(CardReader.writeable()) {
+ CardReader.putc(SOH); // 00000001
+ CardReader.putc(ADDR); // 00000000
+ CardReader.putc(LEN); // 00000000
+ CardReader.putc(LEN); // 00000000
+ CardReader.putc(MAG_ISO_T2); // 01010101
+ CardReader.putc(EOT); // 00000100
+ CardReader.putc(BBCK);
+ }
+ wait_ms(200);
+ for(int i=0; i<=CardReader_Counter; i++) {
+ if(CardReader_Buffer[i]==R_NO_DATA) {
+ Computer.printf("Sin lectura\n");
+ return 0;
+ }
+ Computer.putc(CardReader_Buffer[i]);
+ if(CardReader_Buffer[i]=='=') {
+ Computer.printf("Datos leidos ");
+ for(int i=0; i<37; i++) {
+ Track2[i]=CardReader_Buffer[i+4];
+ }
+ Computer.printf("<%s>\n",Track2);
+ return 1;
+ }
+ }
+ }
+ return 2;
+}
+
+int RetiroTarjeta(uint32_t TiempoFuera)
+{
+ Computer.printf("Retiro tarjeta\n");
+ Inicio=BaseClock.read_ms();
+ while(true) {
+ if(PositionCard()==0) {
+ return 1;
+ } else {
+
+ Computer.printf("Retire tarjeta");
+
+ }
+ Fin=BaseClock.read_ms();
+ Transcurrido=Fin-Inicio;
+ if(Transcurrido>TiempoFuera) {
+ StateReader[1]='T';
+ return 0;
+ }
+ }
+}
+
+uint8_t IngresoTarjeta(uint32_t TimeOut)
+{
+ Computer.printf("Funcion ingreso de tarjeta\n");
+
+ Inicio=BaseClock.read_ms();
+ while(true) {
+ if(PositionCard()==1) {
+ Computer.printf("Tarjeta ingresada\n");
+ StateReader[1]='A';
+ StateReader[2]='A';
+ StateReader[3]='A';
+ return 1;
+ }
+ Fin=BaseClock.read_ms();
+ Transcurrido=Fin-Inicio;
+ if(Transcurrido>TimeOut) {
+ Computer.printf("Tiempo limite\n");
+ StateReader[1]='T';
+ StateReader[2]='N';
+ StateReader[3]='N';
+ return 0;
+ }
+ }
+}
+
+uint8_t GetCard(char Salida,uint32_t TimeOutEntrada,uint32_t TimeOutSalida)
+{
+ //CardReaderStatus=[Reset,ArmDebug,DetectionOn,DetectionOff,Position,Arm,Read]
+ // C-> Command error
+ // A-> Accepted
+ // N-> Invalid
+ // E-> Error
+ // N-> No detection
+ // S-> Without answer
+ // T-> Time out
+ // Se pide al usuario por pantalla la intrduccion de la tarjeta
+
+ Computer.printf("Introduzca tarjeta");
+ Computer.printf("debito o credito");
+ sprintf(Track2,"0000000000000000000000000000000000000");
+
+ if(ResetCard()==1) {
+ while(true) {
+ uint8_t RespuestaIngresoTarjeta = IngresoTarjeta(TimeOutEntrada);
+ if(RespuestaIngresoTarjeta==1) {
+
+ Computer.printf("Retire tarjeta");
+
+ }
+ if(RespuestaIngresoTarjeta==0) {
+ wait(3);
+ return USER_FINISH;
+ }
+ if(RespuestaIngresoTarjeta==2) {
+ return USER_FINISH;
+ }
+
+ uint8_t RespuestaReadCard=ReadCard(TimeOutSalida); // Se le la tarjeta al retirarse
+ if(RespuestaReadCard==2) {
+ return USER_FINISH;
+ }
+
+ uint8_t DataResult=RecibeDataCard(); // Se corrobora que la informacion de la tajeta es la corre
+ if(DataResult==0) {
+ Computer.printf("Banda magnetica");
+ Computer.printf("ilegible");
+ wait(2);
+ if(RetiroTarjeta(7000)) {
+ Computer.printf("Introduzca tarjeta");
+ Computer.printf("debito o credito");
+ } else {
+ return USER_FINISH;
+ }
+ }
+ if(DataResult==1) {
+ return Salida;
+ }
+ if(DataResult==2) {
+ Computer.printf("Banda magnetica");
+ Computer.printf("ilegible");
+ wait(2);
+ if(RetiroTarjeta(7000)) {
+ Computer.printf("Introduzca tarjeta");
+ Computer.printf("debito o credito");
+
+ } else {
+ return USER_FINISH;
+ }
+ }
+ }
+ } else {
+ Computer.printf("Error");
+ return USER_FINISH;
+ }
+}
+
+int main()
+{
+ BaseClock.start();
+ CardReader.format(8, Serial::None, 1);
+ CardReader.baud(9600);
+ Computer.format(8, Serial::None, 1);
+ Computer.baud(9600);
+ CardReader.attach(&Interrupt_CardReader);
+ while(1) {
+ CardReaderPower=1;
+ Max232=1;
+ Computer.printf("iniciando proceso\n");
+ wait(2);
+ GetCard(USER_TIME,20000,5000);
+ CardReaderPower=0;
+ Max232=0;
+ wait(2);
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Jun 04 18:01:55 2019 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/5aab5a7997ee \ No newline at end of file
