Просмотр исходного кода

adding read for different banks

frux-c 2 лет назад
Родитель
Сommit
33109a890b
4 измененных файлов с 238 добавлено и 97 удалено
  1. 6 2
      README.md
  2. 11 2
      uhf_cmd.c
  3. 217 90
      uhf_cmd.h
  4. 4 3
      uhf_worker.c

+ 6 - 2
README.md

@@ -8,10 +8,14 @@ This repository contains a UHF RFID application developed for FlipperZero, a ver
 
 
 ## Features
 ## Features
 
 
-- [x] Read UHF RFID tags.
-- [ ] Write UHF RFID tags.
+- [x] Read Single UHF RFID tag.
+- [x] View saved UHF RFID tag.
+- [ ] Write Single UHF RFID tag.
 - [ ] Communicate with the YRM100 module to perform UHF RFID operations.
 - [ ] Communicate with the YRM100 module to perform UHF RFID operations.
 - [ ] Easy-to-use interface on FlipperZero's display.
 - [ ] Easy-to-use interface on FlipperZero's display.
+    - Extras
+        - [ ] Read multiple tags at once
+        - [ ] View multiple on a list view
 
 
 ## Requirements
 ## Requirements
 
 

+ 11 - 2
uhf_cmd.c

@@ -1,4 +1,4 @@
-// #include "uhf_cmd.h"
+#include "uhf_cmd.h"
 // #include "uhf_app_i.h"
 // #include "uhf_app_i.h"
 
 
 // char* uhf_get_dev_info(UHFApp* uhf_app) {
 // char* uhf_get_dev_info(UHFApp* uhf_app) {
@@ -6,4 +6,13 @@
 
 
 // uint8_t* uhf_single_poll(UHFApp* uhf_app){
 // uint8_t* uhf_single_poll(UHFApp* uhf_app){
 
 
-// }
+// }
+uint8_t calculate_checksum(uint8_t* arr, size_t length) {
+    // CheckSum8 Modulo 256
+    // Sum of Bytes % 256
+    uint8_t sum_val = 0x00;
+    for(size_t i = 0; i < length; i++) {
+        sum_val += arr[i];
+    }
+    return sum_val % 256;
+}

+ 217 - 90
uhf_cmd.h

@@ -6,99 +6,226 @@
 typedef struct UHF_RFID_CMD {
 typedef struct UHF_RFID_CMD {
     uint8_t* cmd;
     uint8_t* cmd;
     size_t length;
     size_t length;
-}UHF_RFID_CMD;
-
-typedef enum{
-    COMMAND_FRAME = 0x00,
-    RESPONSE_FRAME,
-    NOTIFICATION_FRAME
-}UHFFrameType;
-
-typedef enum{
-    CHINA_900MHZ = 1,
-    CHINA_800MHZ = 4,
-    US = 2,
-    EU = 3,
-    KOREA = 6
-}UHFWorkArea;
+} UHF_RFID_CMD;
+
+typedef enum { COMMAND_FRAME = 0x00, RESPONSE_FRAME, NOTIFICATION_FRAME } UHFFrameType;
+
+typedef enum { CHINA_900MHZ = 1, CHINA_800MHZ = 4, US = 2, EU = 3, KOREA = 6 } UHFWorkArea;
 
 
 #define DEFAULT_BAUD_RATE 115200
 #define DEFAULT_BAUD_RATE 115200
 #define FRAME_START 0xBB
 #define FRAME_START 0xBB
 #define FRAME_END 0x7E
 #define FRAME_END 0x7E
 #define ERROR 0x15
 #define ERROR 0x15
 
 
-const UHF_RFID_CMD CMD_HARDWARE_VERSION = {.cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_SOFTWARE_VERSION = {.cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x01, 0x05, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_MANUFACTURERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x02, 0x06, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_SINGLE_POLLING = {.cmd = (uint8_t[]){0xBB, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_MULTIPLE_POLLING = {.cmd = (uint8_t[]){0xBB, 0x00, 0x27, 0x00, 0x03, 0x22, 0x27, 0x10, 0x83, 0x7E}, .length = 10};
-
-const UHF_RFID_CMD CMD_STOP_MULTIPLE_POLLING = {.cmd = (uint8_t[]){0xBB, 0x00, 0x28, 0x00, 0x00, 0x28, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_SET_SELECT_PARAMETER = {.cmd = (uint8_t[]){0xBB, 0x00, 0x0C, 0x00, 0x13, 0x01, 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x30, 0x75, 0x1F, 0xEB, 0x70, 0x5C, 0x59, 0x04, 0xE3, 0xD5, 0x0D, 0x70, 0xAD, 0x7E }, .length = 27};
-
-const UHF_RFID_CMD CMD_GET_SELECT_PARAMETER = {.cmd = (uint8_t[]){0xBB, 0x00, 0x0B, 0x00, 0x00, 0x0B, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_SET_SELECT_MODE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x12, 0x00, 0x01, 0x01, 0x14, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_READ_LABEL_DATA_STORAGE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x39, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x4D, 0x7E}, .length = 17};
-
-const UHF_RFID_CMD CMD_WRITE_LABEL_DATA_STORAGE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x49, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x71, 0x7E}, .length = 24};
-
-const UHF_RFID_CMD CMD_LOCK_LABEL_DATA_STORAGE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x82, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x02, 0x00, 0x80, 0x09, 0x7E}, .length = 13};
-
-const UHF_RFID_CMD CMD_INACTIVATE_KILL_TAG = {.cmd = (uint8_t[]){0xBB, 0x00, 0x65, 0x00, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0x67, 0x7E}, .length = 11};
-
-const UHF_RFID_CMD CMD_SET_COMMUNICATION_BAUD_RATE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x11, 0x00, 0x02, 0x00, 0xC0, 0xD3, 0x7E}, .length = 9};
-
-const UHF_RFID_CMD CMD_GET_QUERY_PARAMETERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0x0D, 0x00, 0x00, 0x0D, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_SET_QUERY_PARAMETER = {.cmd = (uint8_t[]){0xBB, 0x00, 0x0E, 0x00, 0x02, 0x10, 0x20, 0x40, 0x7E}, .length = 9};
-
-const UHF_RFID_CMD CMD_SETUP_WORK_AREA = {.cmd = (uint8_t[]){0xBB, 0x00, 0x07, 0x00, 0x01, 0x01, 0x09, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_ACQUIRE_WORK_LOCATIONS = {.cmd = (uint8_t[]){0xBB, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_SETUP_WORKING_CHANNEL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xAB, 0x00, 0x01, 0x01, 0xAC, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_GET_WORKING_CHANNEL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xAA, 0x00, 0x00, 0xAA, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_SET_AUTO_FREQUENCY_HOPPING = {.cmd = (uint8_t[]){0xBB, 0x00, 0xAD, 0x00, 0x01, 0xFF, 0xAD, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_INSERT_WORKING_CHANNEL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xA9, 0x00, 0x06, 0x05, 0x01, 0x02,0x03, 0x04, 0x05, 0xC3, 0x7E}, .length = 13};
-
-const UHF_RFID_CMD CMD_ACQUIRE_TRANSMITTING_POWER = {.cmd = (uint8_t[]){0xBB, 0x00, 0xB7, 0x00, 0x00, 0xB7, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_SET_TRANSMITTING_POWER = {.cmd = (uint8_t[]){0xBB, 0x00, 0xB6, 0x00, 0x02, 0x07, 0xD0, 0x8F, 0x7E}, .length = 9};
-
-const UHF_RFID_CMD CMD_SET_CONTINUOUS_CARRIER = {.cmd = (uint8_t[]){0xBB, 0x00, 0xB0, 0x00, 0x01, 0xFF, 0xB0, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_GET_DEMODULATOR_PARAMETERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF1, 0x00, 0x00, 0xF1, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_SET_DEMODULATOR_PARAMETERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF0, 0x00, 0x04, 0x03, 0x06, 0x01, 0xB0, 0xAE, 0x7E}, .length = 11};
-
-const UHF_RFID_CMD CMD_TEST_RF_INPUT_BLOCK_SIGNAL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF2, 0x00, 0x00, 0xF2, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_TEST_RSSI_SIGNAL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF3, 0x00, 0x00, 0xF3, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_MODULE_HIBERNATION = {.cmd = (uint8_t[]){0xBB, 0x00, 0x17, 0x00, 0x00, 0x17, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_IDLE_HIBERNATION_TIME = {.cmd = (uint8_t[]){0xBB, 0x00, 0x1D, 0x00, 0x01, 0x02, 0x20, 0x7E}, .length = 8};
-
-const UHF_RFID_CMD CMD_IDLE_MODE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x04, 0x00, 0x03, 0x01, 0x01, 0x03, 0x0C, 0x7E}, .length = 10};
-
-const UHF_RFID_CMD CMD_NXP_READPROTECT = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE1, 0x00, 0x05, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xE4, 0x7E}, .length = 12};
-
-const UHF_RFID_CMD CMD_NXP_CHANGE_EAS = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE3, 0x00, 0x05, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xE7, 0x7E}, .length = 12};
-
-const UHF_RFID_CMD CMD_NXP_EAS_ALARM = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE4, 0x00, 0x00, 0xE4, 0x7E}, .length = 7};
-
-const UHF_RFID_CMD CMD_NXP_CONFIG_WORD = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE0, 0x00, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xE4, 0x7E}, .length = 13};
-
-const UHF_RFID_CMD CMD_IMPINJ_MONZA4_QT = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE5, 0x00, 0x08, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x01, 0x40, 0x00, 0x2D, 0x7E}, .length = 15};
-
-const UHF_RFID_CMD CMD_BLOCK_PERMALOCK = {.cmd = (uint8_t[]){0xBB, 0x00, 0xD3, 0x00, 0x0B, 0x00, 0x00, 0xFF,0xFF, 0x01, 0x03, 0x00, 0x00, 0x01, 0x07, 0x00, 0xE8, 0x7E}, .length = 18};
+const UHF_RFID_CMD CMD_HARDWARE_VERSION = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_SOFTWARE_VERSION = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x01, 0x05, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_MANUFACTURERS = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x02, 0x06, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_SINGLE_POLLING = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_MULTIPLE_POLLING = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x27, 0x00, 0x03, 0x22, 0x27, 0x10, 0x83, 0x7E},
+    .length = 10};
+
+const UHF_RFID_CMD CMD_STOP_MULTIPLE_POLLING = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x28, 0x00, 0x00, 0x28, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_SET_SELECT_PARAMETER = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x0C, 0x00, 0x13, 0x01, 0x00, 0x00, 0x00,
+                       0x20, 0x60, 0x00, 0x30, 0x75, 0x1F, 0xEB, 0x70, 0x5C,
+                       0x59, 0x04, 0xE3, 0xD5, 0x0D, 0x70, 0xAD, 0x7E},
+    .length = 27};
+
+const UHF_RFID_CMD CMD_GET_SELECT_PARAMETER = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x0B, 0x00, 0x00, 0x0B, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_SET_SELECT_MODE = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x12, 0x00, 0x01, 0x01, 0x14, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_READ_LABEL_DATA_STORAGE = {
+    .cmd =
+        (uint8_t[]){
+            0xBB,
+            0x00,
+            0x39,
+            0x00,
+            0x09,
+            0x00,
+            0x00,
+            0x00,
+            0x00,
+            0x03,
+            0x00,
+            0x00,
+            0x00,
+            0x08,
+            0x4D,
+            0x7E},
+    .length = 17};
+
+const UHF_RFID_CMD CMD_WRITE_LABEL_DATA_STORAGE = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x49, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+                       0x00, 0x04, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x71, 0x7E},
+    .length = 24};
+
+const UHF_RFID_CMD CMD_LOCK_LABEL_DATA_STORAGE = {
+    .cmd =
+        (uint8_t
+             []){0xBB, 0x00, 0x82, 0x00, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0x02, 0x00, 0x80, 0x09, 0x7E},
+    .length = 13};
+
+const UHF_RFID_CMD CMD_INACTIVATE_KILL_TAG = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x65, 0x00, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0x67, 0x7E},
+    .length = 11};
+
+const UHF_RFID_CMD CMD_SET_COMMUNICATION_BAUD_RATE = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x11, 0x00, 0x02, 0x00, 0xC0, 0xD3, 0x7E},
+    .length = 9};
+
+const UHF_RFID_CMD CMD_GET_QUERY_PARAMETERS = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x0D, 0x00, 0x00, 0x0D, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_SET_QUERY_PARAMETER = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x0E, 0x00, 0x02, 0x10, 0x20, 0x40, 0x7E},
+    .length = 9};
+
+const UHF_RFID_CMD CMD_SETUP_WORK_AREA = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x07, 0x00, 0x01, 0x01, 0x09, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_ACQUIRE_WORK_LOCATIONS = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_SETUP_WORKING_CHANNEL = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xAB, 0x00, 0x01, 0x01, 0xAC, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_GET_WORKING_CHANNEL = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xAA, 0x00, 0x00, 0xAA, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_SET_AUTO_FREQUENCY_HOPPING = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xAD, 0x00, 0x01, 0xFF, 0xAD, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_INSERT_WORKING_CHANNEL = {
+    .cmd =
+        (uint8_t[]){0xBB, 0x00, 0xA9, 0x00, 0x06, 0x05, 0x01, 0x02, 0x03, 0x04, 0x05, 0xC3, 0x7E},
+    .length = 13};
+
+const UHF_RFID_CMD CMD_ACQUIRE_TRANSMITTING_POWER = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xB7, 0x00, 0x00, 0xB7, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_SET_TRANSMITTING_POWER = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xB6, 0x00, 0x02, 0x07, 0xD0, 0x8F, 0x7E},
+    .length = 9};
+
+const UHF_RFID_CMD CMD_SET_CONTINUOUS_CARRIER = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xB0, 0x00, 0x01, 0xFF, 0xB0, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_GET_DEMODULATOR_PARAMETERS = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xF1, 0x00, 0x00, 0xF1, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_SET_DEMODULATOR_PARAMETERS = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xF0, 0x00, 0x04, 0x03, 0x06, 0x01, 0xB0, 0xAE, 0x7E},
+    .length = 11};
+
+const UHF_RFID_CMD CMD_TEST_RF_INPUT_BLOCK_SIGNAL = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xF2, 0x00, 0x00, 0xF2, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_TEST_RSSI_SIGNAL = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xF3, 0x00, 0x00, 0xF3, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_MODULE_HIBERNATION = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x17, 0x00, 0x00, 0x17, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_IDLE_HIBERNATION_TIME = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x1D, 0x00, 0x01, 0x02, 0x20, 0x7E},
+    .length = 8};
+
+const UHF_RFID_CMD CMD_IDLE_MODE = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0x04, 0x00, 0x03, 0x01, 0x01, 0x03, 0x0C, 0x7E},
+    .length = 10};
+
+const UHF_RFID_CMD CMD_NXP_READPROTECT = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xE1, 0x00, 0x05, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xE4, 0x7E},
+    .length = 12};
+
+const UHF_RFID_CMD CMD_NXP_CHANGE_EAS = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xE3, 0x00, 0x05, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xE7, 0x7E},
+    .length = 12};
+
+const UHF_RFID_CMD CMD_NXP_EAS_ALARM = {
+    .cmd = (uint8_t[]){0xBB, 0x00, 0xE4, 0x00, 0x00, 0xE4, 0x7E},
+    .length = 7};
+
+const UHF_RFID_CMD CMD_NXP_CONFIG_WORD = {
+    .cmd =
+        (uint8_t[]){0xBB, 0x00, 0xE0, 0x00, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xE4, 0x7E},
+    .length = 13};
+
+const UHF_RFID_CMD CMD_IMPINJ_MONZA4_QT = {
+    .cmd =
+        (uint8_t[]){
+            0xBB,
+            0x00,
+            0xE5,
+            0x00,
+            0x08,
+            0x00,
+            0x00,
+            0xFF,
+            0xFF,
+            0x01,
+            0x01,
+            0x40,
+            0x00,
+            0x2D,
+            0x7E},
+    .length = 15};
+
+const UHF_RFID_CMD CMD_BLOCK_PERMALOCK = {
+    .cmd =
+        (uint8_t[]){
+            0xBB,
+            0x00,
+            0xD3,
+            0x00,
+            0x0B,
+            0x00,
+            0x00,
+            0xFF,
+            0xFF,
+            0x01,
+            0x03,
+            0x00,
+            0x00,
+            0x01,
+            0x07,
+            0x00,
+            0xE8,
+            0x7E},
+    .length = 18};
+
+uint8_t calculate_checksum(uint8_t* arr, size_t length);

+ 4 - 3
uhf_worker.c

@@ -40,10 +40,12 @@ UHFWorkerEvent verify_module_connected(UHFWorker* uhf_worker) {
 
 
 UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
 UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
     UHFResponseData* uhf_response_data = uhf_worker->response_data;
     UHFResponseData* uhf_response_data = uhf_worker->response_data;
+    uhf_response_data_reset(uhf_response_data);
     UHFData* uhf_data = uhf_response_data->head;
     UHFData* uhf_data = uhf_response_data->head;
     furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
     furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
     furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, uhf_data);
     furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, uhf_data);
     uhf_data_reset(uhf_data);
     uhf_data_reset(uhf_data);
+    // read epc bank
     while(true) {
     while(true) {
         furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_SINGLE_POLLING.cmd, CMD_SINGLE_POLLING.length);
         furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_SINGLE_POLLING.cmd, CMD_SINGLE_POLLING.length);
         furi_delay_ms(100);
         furi_delay_ms(100);
@@ -51,12 +53,11 @@ UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
             return UHFWorkerEventAborted;
             return UHFWorkerEventAborted;
         }
         }
         if(uhf_data->end) {
         if(uhf_data->end) {
-            // before breaking, check if the response is not an error
-            // index 1 = response type, index 5 = parameter
             if(uhf_data->data[1] == 0x01 && uhf_data->data[5] == 0x15) {
             if(uhf_data->data[1] == 0x01 && uhf_data->data[5] == 0x15) {
+                uhf_data_reset(uhf_data);
                 continue;
                 continue;
             } else if(uhf_data->data[1] == 0x02)
             } else if(uhf_data->data[1] == 0x02)
-                break; // success read
+                break; // read success
         }
         }
     }
     }
     return UHFWorkerEventSuccess;
     return UHFWorkerEventSuccess;