#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;
}