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

NFC Maker: Allow setting custom UID

Willy-JL 1 год назад
Родитель
Сommit
116b40a292

+ 2 - 0
nfc_maker/nfc_maker.h

@@ -91,6 +91,8 @@ typedef struct {
     char small_buf1[SMALL_INPUT_LEN];
     char small_buf2[SMALL_INPUT_LEN];
     char save_buf[BIG_INPUT_LEN];
+
+    uint8_t uid_buf[10];
 } NfcMaker;
 
 typedef enum {

+ 1 - 0
nfc_maker/scenes/nfc_maker_scene_config.h

@@ -15,5 +15,6 @@ ADD_SCENE(nfc_maker, wifi_auth, WifiAuth)
 ADD_SCENE(nfc_maker, wifi_encr, WifiEncr)
 ADD_SCENE(nfc_maker, wifi_pass, WifiPass)
 ADD_SCENE(nfc_maker, save_generate, SaveGenerate)
+ADD_SCENE(nfc_maker, save_uid_mful, SaveUidMful)
 ADD_SCENE(nfc_maker, save_name, SaveName)
 ADD_SCENE(nfc_maker, save_result, SaveResult)

+ 1 - 1
nfc_maker/scenes/nfc_maker_scene_save_generate.c

@@ -340,7 +340,7 @@ bool nfc_maker_scene_save_generate_on_event(void* context, SceneManagerEvent eve
         nfc_device_set_data(app->nfc_device, NfcProtocolMfUltralight, data);
         mf_ultralight_free(data);
 
-        scene_manager_next_scene(app->scene_manager, NfcMakerSceneSaveName);
+        scene_manager_next_scene(app->scene_manager, NfcMakerSceneSaveUidMful);
     }
 
     return consumed;

+ 70 - 0
nfc_maker/scenes/nfc_maker_scene_save_uid_mful.c

@@ -0,0 +1,70 @@
+#include "../nfc_maker.h"
+
+enum ByteInputResult {
+    ByteInputResultOk,
+};
+
+static void nfc_maker_scene_save_uid_mful_byte_input_callback(void* context) {
+    NfcMaker* app = context;
+
+    size_t uid_len;
+    nfc_device_get_uid(app->nfc_device, &uid_len);
+    bool uid_valid = nfc_device_set_uid(app->nfc_device, app->uid_buf, uid_len);
+
+    if(uid_valid) {
+        view_dispatcher_send_custom_event(app->view_dispatcher, ByteInputResultOk);
+    } else {
+        byte_input_set_header_text(app->byte_input, "Invalid UID!");
+    }
+}
+
+static void nfc_maker_scene_save_uid_mful_byte_input_changed(void* context) {
+    NfcMaker* app = context;
+
+    byte_input_set_header_text(app->byte_input, "Change UID:");
+}
+
+void nfc_maker_scene_save_uid_mful_on_enter(void* context) {
+    NfcMaker* app = context;
+    ByteInput* byte_input = app->byte_input;
+
+    byte_input_set_header_text(byte_input, "(Optional) Change UID:");
+
+    size_t uid_len;
+    const uint8_t* uid = nfc_device_get_uid(app->nfc_device, &uid_len);
+    memcpy(app->uid_buf, uid, uid_len);
+
+    byte_input_set_result_callback(
+        byte_input,
+        nfc_maker_scene_save_uid_mful_byte_input_callback,
+        nfc_maker_scene_save_uid_mful_byte_input_changed,
+        app,
+        app->uid_buf,
+        uid_len);
+
+    view_dispatcher_switch_to_view(app->view_dispatcher, NfcMakerViewByteInput);
+}
+
+bool nfc_maker_scene_save_uid_mful_on_event(void* context, SceneManagerEvent event) {
+    NfcMaker* app = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        consumed = true;
+        switch(event.event) {
+        case ByteInputResultOk:
+            scene_manager_next_scene(app->scene_manager, NfcMakerSceneSaveName);
+            break;
+        default:
+            break;
+        }
+    }
+
+    return consumed;
+}
+
+void nfc_maker_scene_save_uid_mful_on_exit(void* context) {
+    NfcMaker* app = context;
+    byte_input_set_result_callback(app->byte_input, NULL, NULL, NULL, NULL, 0);
+    byte_input_set_header_text(app->byte_input, "");
+}