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

added steps to read all banks, not working yet

frux-c 2 лет назад
Родитель
Сommit
28b375c9f0
6 измененных файлов с 198 добавлено и 254 удалено
  1. 1 1
      scenes/uhf_scene_read_tag_success.c
  2. 3 3
      scenes/uhf_scene_verify.c
  3. 0 18
      uhf_cmd.c
  4. 94 218
      uhf_cmd.h
  5. 0 1
      uhf_data.c
  6. 100 13
      uhf_worker.c

+ 1 - 1
scenes/uhf_scene_read_tag_success.c

@@ -17,7 +17,7 @@ void uhf_scene_read_card_success_widget_callback(GuiButtonType result, InputType
 void uhf_scene_read_tag_success_on_enter(void* ctx) {
     UHFApp* uhf_app = ctx;
 
-    const uint8_t* read_data = uhf_app->worker->response_data->head->data;
+    const uint8_t* read_data = uhf_response_data_get_uhf_data(uhf_app->worker->response_data, 0)->data;
 
     widget_add_string_element(
         uhf_app->widget, 32, 5, AlignLeft, AlignCenter, FontPrimary, "Read Success");

+ 3 - 3
scenes/uhf_scene_verify.c

@@ -61,7 +61,7 @@ bool uhf_scene_verify_on_event(void* ctx, SceneManagerEvent event) {
                     uhf_app->widget, 64, 5, AlignCenter, AlignCenter, FontPrimary, "Module Info");
                 // hardware info
                 furi_string_cat_str(temp_str, "HW Version: ");
-                for(int i = 0; i < 10; i++) {
+                for(int i = 0; i < (int)hardware_version->data[4]; i++) {
                     furi_string_cat_printf(temp_str, "%c", hardware_version->data[offset + i]);
                 }
                 widget_add_string_element(
@@ -75,7 +75,7 @@ bool uhf_scene_verify_on_event(void* ctx, SceneManagerEvent event) {
                 furi_string_reset(temp_str);
                 // software info
                 furi_string_cat_str(temp_str, "SW Version: ");
-                for(int i = 0; i < 10; i++) {
+                for(int i = 0; i < (int)software_version->data[4]; i++) {
                     furi_string_cat_printf(temp_str, "%c", software_version->data[offset + i]);
                 }
                 widget_add_string_element(
@@ -89,7 +89,7 @@ bool uhf_scene_verify_on_event(void* ctx, SceneManagerEvent event) {
                 furi_string_reset(temp_str);
                 // manufacturer info
                 furi_string_cat_str(temp_str, "Manufacturer: ");
-                for(int i = 0; i < 10; i++) {
+                for(int i = 0; i < (int)manufacturer->data[4]; i++) {
                     furi_string_cat_printf(temp_str, "%c", manufacturer->data[offset + i]);
                 }
                 widget_add_string_element(

+ 0 - 18
uhf_cmd.c

@@ -1,18 +0,0 @@
-#include "uhf_cmd.h"
-// #include "uhf_app_i.h"
-
-// char* uhf_get_dev_info(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;
-}

+ 94 - 218
uhf_cmd.h

@@ -1,4 +1,5 @@
-#pragma once
+#ifndef UHF_CMD_H
+#define UHF_CMD_H
 
 #include <stdint.h>
 #include <stdlib.h>
@@ -6,226 +7,101 @@
 typedef struct UHF_RFID_CMD {
     uint8_t* cmd;
     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 FRAME_START 0xBB
 #define FRAME_END 0x7E
 #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};
-
-uint8_t calculate_checksum(uint8_t* arr, size_t length);
+UHF_RFID_CMD CMD_HARDWARE_VERSION = {.cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x7E}, .length = 8};
+
+UHF_RFID_CMD CMD_SOFTWARE_VERSION = {.cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x01, 0x05, 0x7E}, .length = 8};
+
+UHF_RFID_CMD CMD_MANUFACTURERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0x03, 0x00, 0x01, 0x02, 0x06, 0x7E}, .length = 8};
+
+UHF_RFID_CMD CMD_SINGLE_POLLING = {.cmd = (uint8_t[]){0xBB, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_MULTIPLE_POLLING = {.cmd = (uint8_t[]){0xBB, 0x00, 0x27, 0x00, 0x03, 0x22, 0x27, 0x10, 0x83, 0x7E}, .length = 10};
+
+UHF_RFID_CMD CMD_STOP_MULTIPLE_POLLING = {.cmd = (uint8_t[]){0xBB, 0x00, 0x28, 0x00, 0x00, 0x28, 0x7E}, .length = 7};
+
+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 = 26};
+
+UHF_RFID_CMD CMD_GET_SELECT_PARAMETER = {.cmd = (uint8_t[]){0xBB, 0x00, 0x0B, 0x00, 0x00, 0x0B, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_SET_SELECT_MODE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x12, 0x00, 0x01, 0x01, 0x14, 0x7E}, .length = 8};
+
+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 = 16};
+
+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};
+
+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};
+
+UHF_RFID_CMD CMD_INACTIVATE_KILL_TAG = {.cmd = (uint8_t[]){0xBB, 0x00, 0x65, 0x00, 0x04, 0x00, 0x00, 0xFF, 0xFF, 0x67, 0x7E}, .length = 11};
+
+UHF_RFID_CMD CMD_SET_COMMUNICATION_BAUD_RATE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x11, 0x00, 0x02, 0x00, 0xC0, 0xD3, 0x7E}, .length = 9};
+
+UHF_RFID_CMD CMD_GET_QUERY_PARAMETERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0x0D, 0x00, 0x00, 0x0D, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_SET_QUERY_PARAMETER = {.cmd = (uint8_t[]){0xBB, 0x00, 0x0E, 0x00, 0x02, 0x10, 0x20, 0x40, 0x7E}, .length = 9};
+
+UHF_RFID_CMD CMD_SETUP_WORK_AREA = {.cmd = (uint8_t[]){0xBB, 0x00, 0x07, 0x00, 0x01, 0x01, 0x09, 0x7E}, .length = 8};
+
+UHF_RFID_CMD CMD_ACQUIRE_WORK_LOCATIONS = {.cmd = (uint8_t[]){0xBB, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_SETUP_WORKING_CHANNEL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xAB, 0x00, 0x01, 0x01, 0xAC, 0x7E}, .length = 8};
+
+UHF_RFID_CMD CMD_GET_WORKING_CHANNEL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xAA, 0x00, 0x00, 0xAA, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_SET_AUTO_FREQUENCY_HOPPING = {.cmd = (uint8_t[]){0xBB, 0x00, 0xAD, 0x00, 0x01, 0xFF, 0xAD, 0x7E}, .length = 8};
+
+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};
+
+UHF_RFID_CMD CMD_ACQUIRE_TRANSMITTING_POWER = {.cmd = (uint8_t[]){0xBB, 0x00, 0xB7, 0x00, 0x00, 0xB7, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_SET_TRANSMITTING_POWER = {.cmd = (uint8_t[]){0xBB, 0x00, 0xB6, 0x00, 0x02, 0x07, 0xD0, 0x8F, 0x7E}, .length = 9};
+
+UHF_RFID_CMD CMD_SET_CONTINUOUS_CARRIER = {.cmd = (uint8_t[]){0xBB, 0x00, 0xB0, 0x00, 0x01, 0xFF, 0xB0, 0x7E}, .length = 8};
+
+UHF_RFID_CMD CMD_GET_DEMODULATOR_PARAMETERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF1, 0x00, 0x00, 0xF1, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_SET_DEMODULATOR_PARAMETERS = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF0, 0x00, 0x04, 0x03, 0x06, 0x01, 0xB0, 0xAE, 0x7E}, .length = 11};
+
+UHF_RFID_CMD CMD_TEST_RF_INPUT_BLOCK_SIGNAL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF2, 0x00, 0x00, 0xF2, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_TEST_RSSI_SIGNAL = {.cmd = (uint8_t[]){0xBB, 0x00, 0xF3, 0x00, 0x00, 0xF3, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_MODULE_HIBERNATION = {.cmd = (uint8_t[]){0xBB, 0x00, 0x17, 0x00, 0x00, 0x17, 0x7E}, .length = 7};
+
+UHF_RFID_CMD CMD_IDLE_HIBERNATION_TIME = {.cmd = (uint8_t[]){0xBB, 0x00, 0x1D, 0x00, 0x01, 0x02, 0x20, 0x7E}, .length = 8};
+
+UHF_RFID_CMD CMD_IDLE_MODE = {.cmd = (uint8_t[]){0xBB, 0x00, 0x04, 0x00, 0x03, 0x01, 0x01, 0x03, 0x0C, 0x7E}, .length = 10};
+
+UHF_RFID_CMD CMD_NXP_READPROTECT = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE1, 0x00, 0x05, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xE4, 0x7E}, .length = 12};
+
+UHF_RFID_CMD CMD_NXP_CHANGE_EAS = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE3, 0x00, 0x05, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xE7, 0x7E}, .length = 12};
+
+UHF_RFID_CMD CMD_NXP_EAS_ALARM = {.cmd = (uint8_t[]){0xBB, 0x00, 0xE4, 0x00, 0x00, 0xE4, 0x7E}, .length = 7};
+
+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};
+
+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};
+
+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};
+
+#endif /* UHF_CMD_H */

+ 0 - 1
uhf_data.c

@@ -1,6 +1,5 @@
 #include <furi.h>
 #include "uhf_data.h"
-// #include "uhf_cmd.h"
 
 UHFData* uhf_data_alloc() {
     UHFData* uhf_data = (UHFData*)malloc(sizeof(UHFData));

+ 100 - 13
uhf_worker.c

@@ -1,6 +1,17 @@
 #include "uhf_worker.h"
 #include "uhf_cmd.h"
 
+// inner functions
+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;
+}
+
 // uart callback functions
 void module_rx_callback(UartIrqEvent event, uint8_t data, void* ctx) {
     UNUSED(event);
@@ -13,25 +24,25 @@ void module_rx_callback(UartIrqEvent event, uint8_t data, void* ctx) {
 UHFWorkerEvent verify_module_connected(UHFWorker* uhf_worker) {
     UHFResponseData* uhf_response_data = uhf_worker->response_data;
     uhf_response_data_reset(uhf_response_data);
-    FURI_LOG_E("log", "freeing done");
+    // FURI_LOG_E("log", "freeing done");
     UHFData* hardware_version = uhf_response_data->head;
     UHFData* software_version = uhf_response_data_add_new_uhf_data(uhf_response_data);
     UHFData* manufacturer = uhf_response_data_add_new_uhf_data(uhf_response_data);
-    FURI_LOG_E("log", "alloc done");
+    // FURI_LOG_E("log", "alloc done");
     furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
     // read hardware version
     furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, hardware_version);
     furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_HARDWARE_VERSION.cmd, CMD_HARDWARE_VERSION.length);
-    furi_delay_ms(150);
+    furi_delay_ms(50);
     // read software version
     furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, software_version);
     furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_SOFTWARE_VERSION.cmd, CMD_SOFTWARE_VERSION.length);
-    furi_delay_ms(150);
+    furi_delay_ms(50);
     // read manufacturer
     furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, manufacturer);
     furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_MANUFACTURERS.cmd, CMD_MANUFACTURERS.length);
-    furi_delay_ms(150);
-    FURI_LOG_E("log", "done sending tx");
+    furi_delay_ms(50);
+    // FURI_LOG_E("log", "done sending tx");
     if(!hardware_version->end || !software_version->end || !manufacturer->end) {
         return UHFWorkerEventFail;
     }
@@ -41,10 +52,10 @@ UHFWorkerEvent verify_module_connected(UHFWorker* uhf_worker) {
 UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
     UHFResponseData* uhf_response_data = uhf_worker->response_data;
     uhf_response_data_reset(uhf_response_data);
-    UHFData* uhf_data = uhf_response_data->head;
+    UHFData* raw_read_data = uhf_response_data_get_uhf_data(uhf_response_data, 0);
     furi_hal_uart_set_br(FuriHalUartIdUSART1, DEFAULT_BAUD_RATE);
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, uhf_data);
-    uhf_data_reset(uhf_data);
+    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, raw_read_data);
+    uhf_data_reset(raw_read_data);
     // read epc bank
     while(true) {
         furi_hal_uart_tx(FuriHalUartIdUSART1, CMD_SINGLE_POLLING.cmd, CMD_SINGLE_POLLING.length);
@@ -52,14 +63,90 @@ UHFWorkerEvent read_single_card(UHFWorker* uhf_worker) {
         if(uhf_worker->state == UHFWorkerStateStop) {
             return UHFWorkerEventAborted;
         }
-        if(uhf_data->end) {
-            if(uhf_data->data[1] == 0x01 && uhf_data->data[5] == 0x15) {
-                uhf_data_reset(uhf_data);
+        if(raw_read_data->end) {
+            if(raw_read_data->data[1] == 0x01 && raw_read_data->data[5] == 0x15) {
+                uhf_data_reset(raw_read_data);
                 continue;
-            } else if(uhf_data->data[1] == 0x02)
+            } else if(raw_read_data->data[1] == 0x02)
                 break; // read success
         }
     }
+    // Set select
+    uint8_t* select_cmd = (uint8_t*)malloc(sizeof(uint8_t) * CMD_SET_SELECT_PARAMETER.length);
+    memcpy(select_cmd, (void*)&CMD_SET_SELECT_PARAMETER.cmd[0], CMD_SET_SELECT_PARAMETER.length);
+    // set select param
+    select_cmd[5] = 0x01; // 0x00=rfu, 0x01=epc, 0x10=tid, 0x11=user
+    // set ptr
+    select_cmd[9] = 0x20;
+    // set mask
+    for(int i = 0; i < 12; i++) // 96 bits, 12 bytes
+    {
+        select_cmd[12 + i] = raw_read_data->data[8 + i];
+    }
+    // checksum
+    select_cmd[CMD_SET_SELECT_PARAMETER.length - 2] =
+        calculate_checksum(select_cmd + 1, CMD_SET_SELECT_PARAMETER.length - 3);
+    UHFData* select_response = uhf_response_data_add_new_uhf_data(uhf_response_data);
+    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, select_response);
+    furi_hal_uart_tx(FuriHalUartIdUSART1, select_cmd, CMD_SET_SELECT_PARAMETER.length);
+    furi_delay_ms(50);
+
+    if(select_response->data[5] != 0x00) return UHFWorkerEventFail;
+
+    uint8_t* read_bank_cmd =
+        (uint8_t*)malloc(sizeof(uint8_t) * CMD_READ_LABEL_DATA_STORAGE.length);
+    memcpy(
+        read_bank_cmd,
+        (void*)&CMD_READ_LABEL_DATA_STORAGE.cmd[0],
+        CMD_READ_LABEL_DATA_STORAGE.length);
+
+    // read rfu bank
+    UHFData* rfu_bank = select_response;
+    uhf_data_reset(rfu_bank);
+    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, rfu_bank);
+    read_bank_cmd[9] = 0x00;
+    furi_hal_uart_tx(FuriHalUartIdUSART1, read_bank_cmd, CMD_READ_LABEL_DATA_STORAGE.length);
+    furi_delay_ms(50);
+
+    // for(int i = 0; i < (int)rfu_bank->length; i++) {
+    //     FURI_LOG_E("rfu_bank", "data[%d]=%02x", i, rfu_bank->data[i]);
+    // }
+
+    // read epc bank
+    UHFData* epc_bank = uhf_response_data_add_new_uhf_data(uhf_response_data);
+    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, epc_bank);
+    read_bank_cmd[9] = 0x01;
+    furi_hal_uart_tx(FuriHalUartIdUSART1, read_bank_cmd, CMD_READ_LABEL_DATA_STORAGE.length);
+    furi_delay_ms(50);
+
+    // for(int i = 0; i < (int)epc_bank->length; i++) {
+    //     FURI_LOG_E("epc_bank", "data[%d]=%02x", i, epc_bank->data[i]);
+    // }
+
+    // read tid bank
+    UHFData* tid_bank = uhf_response_data_add_new_uhf_data(uhf_response_data);
+    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, tid_bank);
+    read_bank_cmd[9] = 0x02;
+    furi_hal_uart_tx(FuriHalUartIdUSART1, read_bank_cmd, CMD_READ_LABEL_DATA_STORAGE.length);
+    furi_delay_ms(50);
+
+    // for(int i = 0; i < (int)tid_bank->length; i++) {
+    //     FURI_LOG_E("tid_bank", "data[%d]=%02x", i, tid_bank->data[i]);
+    // }
+
+    // read user bank
+    UHFData* user_bank = uhf_response_data_add_new_uhf_data(uhf_response_data);
+    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, module_rx_callback, user_bank);
+    read_bank_cmd[9] = 0x03;
+    furi_hal_uart_tx(FuriHalUartIdUSART1, read_bank_cmd, CMD_READ_LABEL_DATA_STORAGE.length);
+    furi_delay_ms(50);
+
+    // for(int i = 0; i < (int)user_bank->length; i++) {
+    //     FURI_LOG_E("user_bank", "data[%d]=%02x", i, user_bank->data[i]);
+    // }
+
+    free(select_cmd);
+    free(read_bank_cmd);
     return UHFWorkerEventSuccess;
 }