3 * poll the uFR reader and print JSON formatted card info to stdout.
15 // really simple JSON helpers
16 #define JSON_NUM(NAME) printf("\"" #NAME "\": %d", NAME)
17 #define JSON_STR(NAME) printf("\"" #NAME "\": \"%s\"", NAME)
18 #define JSON_START() printf("{\n")
19 #define JSON_NEXT() printf(",\n")
20 #define JSON_END() printf("\n}\n")
22 static mt_rfid_t ufr = {READER_TYPE, PORT_NAME, PORT_INTERFACE, 0, 1};
24 static void signal_exit(int sig)
27 fprintf(stderr, "signal %d, terminating\n", sig);
30 void *mt_rfid_run(void *ptr)
32 mt_rfid_t *self = (mt_rfid_t *)ptr;
36 uint8_t sak; //select acknowledge
37 uint8_t uid_num[10]; //uid as bytes
39 char uid[24]; //uid as a string
41 fprintf(stderr, "uFCoder library version: %s\n", GetDllVersionStr());
43 status = ReaderOpenEx(self->reader_type, self->port_name, self->port_interface, 0);
44 if (status != UFR_OK) {
45 fprintf(stderr, "ReaderOpenEx: %s\n", UFR_Status2String(status));
49 fputs(GetReaderDescription(), stderr);
52 status = GetDlogicCardType(&card_type);
53 if (status != UFR_OK) {
54 if (status != UFR_NO_CARD) {
55 fprintf(stderr, "GetDlogicCardType: %s\n", UFR_Status2String(status));
61 status = GetCardIdEx(&sak, uid_num, &uid_size);
62 if (status != UFR_OK) {
63 if (status != UFR_NO_CARD) {
64 fprintf(stderr, "GetCardIdEx: %s\n", UFR_Status2String(status));
70 for (uint8_t i = 0; i < uid_size; i++) {
71 sprintf(&uid[2*i], "%02x", uid_num[i]);
75 JSON_NUM(card_type); JSON_NEXT();
76 JSON_NUM(sak); JSON_NEXT();
77 JSON_NUM(uid_size); JSON_NEXT();
78 JSON_STR(uid); JSON_END();
87 status = ReaderClose();
88 fprintf(stderr, "ReaderClose: %s\n", UFR_Status2String(status));
93 int main(int argc, char **argv)
98 while ((c = getopt(argc, argv, "p:bh")) != -1) {
101 ufr.port_name = optarg;
109 // avoid sigaction for windows compatibility
110 signal(SIGINT, signal_exit);
111 signal(SIGTERM, signal_exit);
113 if (pthread_create(&t, NULL, mt_rfid_run, (void *)&ufr)) {
114 perror("pthread_create");
118 pthread_join(t, NULL);