]> rtime.felk.cvut.cz Git - coffee/mt-apps.git/commitdiff
print simple json when a card is nearby
authorJiří Matěják <jiri.matejak@fel.cvut.cz>
Mon, 23 Apr 2018 13:32:55 +0000 (15:32 +0200)
committerJiří Matěják <jiri.matejak@fel.cvut.cz>
Mon, 23 Apr 2018 13:32:55 +0000 (15:32 +0200)
Makefile
main.c

index 1111e4806b88070a47ab889a364cdcc77b7243cb..2c66d922a20fcb4b7421c49ff2fb0dd34596e580 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 OUTPUT_FILE=mt-rfid
 
 all: main.c
-       $(CC) $(CFLAGS) -o $(OUTPUT_FILE) main.c -luFCoder-armhf
+       $(CC) $(CFLAGS) -o $(OUTPUT_FILE) main.c -luFCoder-armhf -pthread
 
 .PHONY: clean
 
diff --git a/main.c b/main.c
index 368555a158e4533ff56f7d5b55f078354e0d99aa..e652d02e6f305725dd18501fbef009d9c8985235 100644 (file)
--- a/main.c
+++ b/main.c
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <signal.h>
 
 #include "uFCoder.h"
 
-#define READER_TYPE    1              //uFR type (1Mbps)
-#define PORT_NAME      "/dev/ttyUSB0" //"" to check all
-#define PORT_INTERFACE 1              //Serial
+#define READER_TYPE    1 //uFR type (1Mbps)
+#define PORT_NAME      "/dev/ttyUSB0"
+#define PORT_INTERFACE 1 //Serial
 
-int main(void)
+#define JSON_NUM(NAME) printf("\"" #NAME "\": %d", NAME)
+#define JSON_STR(NAME) printf("\"" #NAME "\": \"%s\"", NAME)
+#define JSON_START() printf("{\n")
+#define JSON_NEXT() printf(",\n")
+#define JSON_END() printf("\n}\n")
+
+static int run = 1;
+
+static void signal_exit(int sig)
+{
+    fprintf(stderr, "signal %d\n", sig);
+    run = 0;
+}
+
+static void *read_cards(void *ptr)
 {
     UFR_STATUS status;
 
-    printf("uFCoder library version: %s\n", GetDllVersionStr());
+    uint8_t card_type;
+    uint8_t sak;
+    uint8_t uid_num[10];
+    uint8_t uid_size;
+    char uid[24];
+
+    fprintf(stderr, "uFCoder library version: %s\n", GetDllVersionStr());
 
     status = ReaderOpenEx(READER_TYPE, PORT_NAME, PORT_INTERFACE, 0);
-    printf("ReaderOpenEx: %s\n", UFR_Status2String(status));
+    if (status != UFR_OK) {
+        fprintf(stderr, "ReaderOpenEx: %s\n", UFR_Status2String(status));
+        return NULL;
+    }
 
     //status = ReaderUISignal(0, 0);
     //printf("ReaderUISignal: %s\n", UFR_Status2String(status));
 
-    puts(GetReaderDescription());
+    fputs(GetReaderDescription(), stderr);
 
-    uint8_t lpucCardType;
-    status = GetDlogicCardType(&lpucCardType);
-    printf("GetDlogicCardType: %s\n", UFR_Status2String(status));
-    if (status != UFR_OK) {
-        return status;
-    }
-    printf("card type: %x\n", lpucCardType);
+    while (run) {
+        status = GetDlogicCardType(&card_type);
+        if (status != UFR_OK) {
+            if (status != UFR_NO_CARD) {
+                fprintf(stderr, "GetDlogicCardType: %s\n", UFR_Status2String(status));
+            }
+            usleep(10000);
+            continue;
+        }
 
-    uint8_t lpucSak;
-    uint8_t aucUid[10];
-    uint8_t lpucUidSize;
-    status = GetCardIdEx(&lpucSak, aucUid, &lpucUidSize);
-    printf("GetCardIdEx: %s\n", UFR_Status2String(status));
-    if (status != UFR_OK) {
-        return status;
-    }
-    printf("lpucSak: %d, lpucUidSize: %d, aucUid: ", lpucSak, lpucUidSize);
-    for (uint8_t i = 0; i < lpucUidSize; i++) {
-        printf("%x", aucUid[i]);
+        status = GetCardIdEx(&sak, uid_num, &uid_size);
+        if (status != UFR_OK) {
+            if (status != UFR_NO_CARD) {
+                fprintf(stderr, "GetCardIdEx: %s\n", UFR_Status2String(status));
+            }
+            usleep(10000);
+            continue;
+        }
+
+        for (uint8_t i = 0; i < uid_size; i++) {
+            sprintf(&uid[2*i], "%02x", uid_num[i]);
+        }
+
+        JSON_START();
+        JSON_NUM(card_type); JSON_NEXT();
+        JSON_NUM(sak);       JSON_NEXT();
+        JSON_NUM(uid_size);  JSON_NEXT();
+        JSON_STR(uid);       JSON_END();
+
+        usleep(500000);
     }
-    printf("\n");
 
     status = ReaderClose();
-    printf("ReaderClose: %s\n", UFR_Status2String(status));
+    fprintf(stderr, "ReaderClose: %s\n", UFR_Status2String(status));
+
+    return NULL;
+}
+
+int main(void)
+{
+    pthread_t t;
+
+    signal(SIGINT, signal_exit);
+    signal(SIGTERM, signal_exit);
+
+    if (pthread_create(&t, NULL, read_cards, NULL)) {
+        perror("pthread_create");
+        return -1;
+    }
+
+    pthread_join(t, NULL);
 
-    return status;
+    return 0;
 }