]> git.karo-electronics.de Git - magstrip.git/blobdiff - lmain.c
Add multitrack and write support
[magstrip.git] / lmain.c
diff --git a/lmain.c b/lmain.c
index a74ea2f8490f4d511aff2b8841e47e6c4413f980..f0b52e4b023d83d5aa4c201c89b238bb60cdb8bb 100755 (executable)
--- a/lmain.c
+++ b/lmain.c
@@ -64,69 +64,191 @@ unsigned int sbpos = 0;
        free(sbuf);
 }
 
        free(sbuf);
 }
 
+void print_help(void)
+{
+       fprintf(stderr, "r      -       initial RESET, required after power-on\n");
+       fprintf(stderr, "i      -       C:2 insert permit request\n");
+       fprintf(stderr, "s      -       C10 C/R status request\n");
+       fprintf(stderr, "S      -       C11 sensor status\n");
+       fprintf(stderr, "1      -       Reads ISO #1 and sends data\n");
+       fprintf(stderr, "2      -       Reads ISO #2 and sends data\n");
+       fprintf(stderr, "3      -       Reads ISO #3 and sends data\n");
+       fprintf(stderr, "m      -       Sends the read data in memory by this command\n");
+       fprintf(stderr, "M      -       Sends multi-tracks data in the memory by this command and parameter\n");
+       fprintf(stderr, "q      -       close serial and quite\n");
+       fprintf(stderr, "h      -       this help\n");
+}
+
 int process_user_cmd(char *rxbuf, int len, int ufd)
 {
 int in_cmd = 0;
 
 int process_user_cmd(char *rxbuf, int len, int ufd)
 {
 int in_cmd = 0;
 
-       if (rxbuf[0] == 'i') {
-               fprintf(stderr, "Init permit request... ");
-               send_command(ufd, "C:2", 3);
-               in_cmd = 1;
-       }
-       if (rxbuf[0] == 'r') {
-               fprintf(stderr, "RESET request... ");
-               send_command(ufd, "C00", 3);
-               in_cmd = 1;
-       }
-       if (rxbuf[0] == 'e') {
-               fprintf(stderr, "Eject request... ");
-               send_command(ufd, "C30", 3);
-               in_cmd = 1;
-       }
-       if (rxbuf[0] == 's') {
-               fprintf(stderr, "Status request... ");
-               send_command(ufd, "C10", 3);
-               in_cmd = 1;
-       }
-       if (rxbuf[0] == 'S') {
-               fprintf(stderr, "Status request... ");
-               send_command(ufd, "C11", 3);
-               in_cmd = 1;
-       }
-       if (rxbuf[0] == '1') {
-               fprintf(stderr, "Status request... ");
-               send_command(ufd, "C61", 3);
-               in_cmd = 1;
-       }
-       if (rxbuf[0] == '2') {
-               fprintf(stderr, "Status request... ");
-               send_command(ufd, "C62", 3);
-               in_cmd = 1;
+       switch (rxbuf[0]) {
+               case 'i':
+                       fprintf(stderr, "Insert permit request... ");
+                       send_command(ufd, "C:2", 3);
+                       in_cmd = 1;
+                       break;
+               case 'r':
+                       fprintf(stderr, "RESET request... ");
+                       send_command(ufd, "C00", 3);
+                       in_cmd = 1;
+                       break;
+               case 'e':
+                       fprintf(stderr, "Eject request... ");
+                       send_command(ufd, "C30", 3);
+                       in_cmd = 1;
+                       break;
+               case 'E':
+                       fprintf(stderr, "Eject request... ");
+                       send_command(ufd, "C31", 3);
+                       in_cmd = 1;
+                       break;
+               case 's':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C10", 3);
+                       in_cmd = 1;
+                       break;
+               case 'S':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C11", 3);
+                       in_cmd = 1;
+                       break;
+               case '1':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C61", 3);
+                       in_cmd = 1;
+                       break;
+               case '2':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C62", 3);
+                       in_cmd = 1;
+                       break;
+               case '3':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C63", 3);
+                       in_cmd = 1;
+                       break;
+               case 'R':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C687", 4);
+                       in_cmd = 1;
+                       break;
+               case 'm':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C69", 3);
+                       in_cmd = 1;
+                       break;
+               case 'M':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C6A7", 4);
+                       in_cmd = 1;
+                       break;
+               case 'w':
+                       fprintf(stderr, "Status request... ");
+                       send_command(ufd, "C731234", 7);
+                       in_cmd = 1;
+                       break;
+               case 'h':
+                       print_help();
+                       in_cmd = 0;
+                       break;
+               case 'q':
+                       fprintf(stderr, "Exiting...\n");
+                       in_cmd = -1;
+                       break;
+               default:
+                       break;
        }
        }
-       if (rxbuf[0] == '3') {
-               fprintf(stderr, "Status request... ");
-               send_command(ufd, "C63", 3);
-               in_cmd = 1;
+
+       return in_cmd;
+}
+
+void print_multi_track(char *rxbuf, int len)
+{
+int bpos = 0, t, i;
+int t1len, t2len, t3len;
+char tmpstr[4];
+
+       fprintf(stderr, "tracks requested:      %c\n", rxbuf[bpos++]);
+       memset(tmpstr, 0, 4);
+       t=0;
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       fprintf(stderr, "t#1 read result:       %s\n", tmpstr);
+       t=0;
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       fprintf(stderr, "t#2 read result:       %s\n", tmpstr);
+       t=0;
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       fprintf(stderr, "t#3 read result:       %s\n", tmpstr);
+       memset(tmpstr, 0, 4);
+
+       t=0;
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       t1len = atoi(tmpstr);
+       fprintf(stderr, "t#1 read len:  %d\n", t1len);
+       t=0;
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       t2len = atoi(tmpstr);
+       fprintf(stderr, "t#2 read len:  %d\n", t2len);
+       t=0;
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       tmpstr[t++] = rxbuf[bpos++];
+       t3len = atoi(tmpstr);
+       fprintf(stderr, "t#3 read len:  %d\n", t3len);
+
+       fprintf(stderr, "t#1 data:      '");
+       for (i=0; i<t1len; i++) {
+               unsigned char c = rxbuf[bpos++];
+               if (c > 31 || c < 128)
+                       fprintf(stderr, "%c", c);
+               else
+                       fprintf(stderr, "0x%02x ", c);
        }
        }
+       fprintf(stderr, "'\n");
 
 
-       if (rxbuf[0] == 'q') {
-               fprintf(stderr, "Exiting...\n");
-               in_cmd = -1;
+       fprintf(stderr, "t#2 data:      '");
+       for (i=0; i<t2len; i++) {
+               unsigned char c = rxbuf[bpos++];
+               if (c > 31 || c < 128)
+                       fprintf(stderr, "%c", c);
+               else
+                       fprintf(stderr, "0x%02x ", c);
        }
        }
+       fprintf(stderr, "'\n");
 
 
-       return in_cmd;
+       fprintf(stderr, "t#3 data:      '");
+       for (i=0; i<t3len; i++) {
+               unsigned char c = rxbuf[bpos++];
+               if (c > 31 || c < 128)
+                       fprintf(stderr, "%c", c);
+               else
+                       fprintf(stderr, "0x%02x ", c);
+       }
+       fprintf(stderr, "'\n");
 }
 
 void process_read_packet(char *rxbuf, int rxpos)
 {
 int bpos;
 }
 
 void process_read_packet(char *rxbuf, int rxpos)
 {
 int bpos;
+char cmd[2];
 
        bpos = 2; // index into read buffer
        if (rxbuf[bpos] == 'P') {
                fprintf(stderr, "positive, ");
                bpos++;
 
        bpos = 2; // index into read buffer
        if (rxbuf[bpos] == 'P') {
                fprintf(stderr, "positive, ");
                bpos++;
-               fprintf(stderr, "cmd was '%c%c', ", rxbuf[bpos], rxbuf[bpos+1]);
-               bpos+=2;
+               cmd[0] = rxbuf[bpos++];
+               cmd[1] = rxbuf[bpos++];
+               fprintf(stderr, "cmd was '%c%c', ", cmd[0], cmd[1]);
+
                if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='0') {
                        fprintf(stderr, "no card present, ");
                } else if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='1') {
                if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='0') {
                        fprintf(stderr, "no card present, ");
                } else if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='1') {
@@ -139,7 +261,7 @@ int bpos;
                fprintf(stderr, "negative, ");
                bpos++;
                fprintf(stderr, "cmd was '%c%c', ", rxbuf[bpos], rxbuf[bpos+1]);
                fprintf(stderr, "negative, ");
                bpos++;
                fprintf(stderr, "cmd was '%c%c', ", rxbuf[bpos], rxbuf[bpos+1]);
-               bpos+=2;
+               bpos += 2;
                if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='0') {
                        fprintf(stderr, "undefined command, ");
                } else if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='1') {
                if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='0') {
                        fprintf(stderr, "undefined command, ");
                } else if (rxbuf[bpos]=='0' && rxbuf[bpos+1]=='1') {
@@ -163,42 +285,53 @@ int bpos;
                } else if (rxbuf[bpos]=='4' && rxbuf[bpos+1]=='6') {
                        fprintf(stderr, "Jitter read error, ");
                } else
                } else if (rxbuf[bpos]=='4' && rxbuf[bpos+1]=='6') {
                        fprintf(stderr, "Jitter read error, ");
                } else
-                       fprintf(stderr, "stat is '%c%c', ", rxbuf[bpos], rxbuf[bpos+1]);
+                       fprintf(stderr, "unknown stat '%c%c', ", rxbuf[bpos], rxbuf[bpos+1]);
        }
        }
-       bpos+=2;
-       if (bpos < rxpos-3)
+
+       bpos += 2;
+       if (bpos < rxpos-3) {
                fprintf(stderr, "\ndata: ");
                fprintf(stderr, "\ndata: ");
-       while (bpos < rxpos-3) {
-               unsigned char c = rxbuf[bpos++];
-               if (c > 31 || c < 128)
-                       fprintf(stderr, "%c", c);
-               else
-                       fprintf(stderr, "0x%02x ", c);
-               
+               if (cmd[0] == '6' && cmd[1] == 'A') {
+                       print_multi_track((rxbuf+bpos), rxpos-3);
+               } else {
+                       while (bpos < rxpos-3) {
+                               unsigned char c = rxbuf[bpos++];
+                               if (c > 31 || c < 128)
+                                       fprintf(stderr, "%c", c);
+                               else
+                                       fprintf(stderr, "0x%02x ", c);
+                       }
+                       fprintf(stderr, "\n");
+               }
        }
        }
-       fprintf(stderr, "\n");
 }
 
 int main(int argc, char **argv)
 {
 }
 
 int main(int argc, char **argv)
 {
+char *ser_dev;
 char rxbuf[256];
 char rxbuf[256];
-int ufd, rxlen=0, rxpos=0, ret;
+int ufd, rxlen=0, rxpos=0, ret=0;
 int in_cmd = 0;
 fd_set rfds;
 struct timeval tval;
 
 int in_cmd = 0;
 fd_set rfds;
 struct timeval tval;
 
-       if (open_uart("/dev/ttyUSB0", B9600) != 0)
+       if (argc > 1)
+               ser_dev = argv[1];
+       else
+               ser_dev = "/dev/ttyS0";
+       if (open_uart(ser_dev, B9600) != 0)
                return -1;
        ufd = uart_get_fd();
        // fprintf(stderr, "UART fd = %d\n", ufd);
                return -1;
        ufd = uart_get_fd();
        // fprintf(stderr, "UART fd = %d\n", ufd);
+
        FD_ZERO(&rfds);
        FD_SET(ufd, &rfds);
        FD_SET(0, &rfds);
        tval.tv_sec = 0;
        tval.tv_usec = 5000000;
 
        FD_ZERO(&rfds);
        FD_SET(ufd, &rfds);
        FD_SET(0, &rfds);
        tval.tv_sec = 0;
        tval.tv_usec = 5000000;
 
-       fprintf(stderr, "OMRON MVFW card reader terminal\nEnter 'h' for help\n");
-       while (1) {
+       fprintf(stderr, "OMRON MVFW card reader terminal\non serial %s\nEnter 'h' for help\n", ser_dev);
+       while (ret >= 0) {
                ret = select((ufd+1), &rfds, NULL, NULL, &tval);
                if (ret == 0) {
                        FD_ZERO(&rfds);
                ret = select((ufd+1), &rfds, NULL, NULL, &tval);
                if (ret == 0) {
                        FD_ZERO(&rfds);
@@ -228,8 +361,8 @@ struct timeval tval;
                                        process_read_packet(rxbuf, rxpos);
                                        memset(rxbuf, 0, 256);
                                        rxpos = 0;
                                        process_read_packet(rxbuf, rxpos);
                                        memset(rxbuf, 0, 256);
                                        rxpos = 0;
-                               } else
-                                       fprintf(stderr, "buf not complete yet\n");
+                               } //else
+                               //      fprintf(stderr, "buf not complete yet\n");
                        }
                        if (FD_ISSET(0, &rfds)) {
                                // fprintf(stderr, "**** keypress\n");
                        }
                        if (FD_ISSET(0, &rfds)) {
                                // fprintf(stderr, "**** keypress\n");
@@ -257,3 +390,4 @@ struct timeval tval;
 
 return 0;
 }
 
 return 0;
 }
+