Eric Betts пре 8 месеци
родитељ
комит
b3ba8a7470
1 измењених фајлова са 60 додато и 17 уклоњено
  1. 60 17
      scenes/weebo_scene_write.c

+ 60 - 17
scenes/weebo_scene_write.c

@@ -85,13 +85,16 @@ NfcCommand weebo_scene_write_poller_callback(NfcGenericEvent event, void* contex
         nfc3d_amiibo_pack(&weebo->amiiboKeys, weebo->figure, modified);
         nfc3d_amiibo_pack(&weebo->amiiboKeys, weebo->figure, modified);
 
 
         MfUltralightError error;
         MfUltralightError error;
+        MfUltralightPage page;
 
 
+        // You might think it odd that I'm doing this writing "by hand" and not using the flipper SDK, but this is for two reasons:
+        // 1. The flipper SDK doesn't write beyond user memory
+        // 2. I order the writes from least destructive to most destructive, so that if something goes wrong, recovery _might_ be possible
         do {
         do {
             // user data
             // user data
             view_dispatcher_send_custom_event(
             view_dispatcher_send_custom_event(
                 weebo->view_dispatcher, WeeboCustomEventWritingUserData);
                 weebo->view_dispatcher, WeeboCustomEventWritingUserData);
             for(size_t i = userMemoryFirst; i <= userMemoryLast; i++) {
             for(size_t i = userMemoryFirst; i <= userMemoryLast; i++) {
-                MfUltralightPage page;
                 memcpy(
                 memcpy(
                     page.data, modified + (i * MF_ULTRALIGHT_PAGE_SIZE), MF_ULTRALIGHT_PAGE_SIZE);
                     page.data, modified + (i * MF_ULTRALIGHT_PAGE_SIZE), MF_ULTRALIGHT_PAGE_SIZE);
                 FURI_LOG_D(TAG, "Writing page %zu", i);
                 FURI_LOG_D(TAG, "Writing page %zu", i);
@@ -107,31 +110,71 @@ NfcCommand weebo_scene_write_poller_callback(NfcGenericEvent event, void* contex
                 break;
                 break;
             }
             }
 
 
-            UNUSED(PWD);
-            UNUSED(PACKRFUI);
-            UNUSED(CC);
-            UNUSED(CFG0);
-            UNUSED(CFG1);
-            UNUSED(DLB);
-            UNUSED(SLB);
             view_dispatcher_send_custom_event(
             view_dispatcher_send_custom_event(
                 weebo->view_dispatcher, WeeboCustomEventWritingConfigData);
                 weebo->view_dispatcher, WeeboCustomEventWritingConfigData);
-            /*
             // pwd
             // pwd
-            memcpy(newdata->page[pwd].data, PWD, sizeof(PWD));
+
+            memcpy(page.data, PWD, sizeof(PWD));
+            error = mf_ultralight_poller_write_page(poller, pwd, &page);
+            if(error != MfUltralightErrorNone) {
+                FURI_LOG_E(TAG, "Error writing PWD: %d", error);
+                ret = NfcCommandStop;
+                break;
+            }
+
             // pack
             // pack
-            memcpy(newdata->page[pack].data, PACKRFUI, sizeof(PACKRFUI));
+            memcpy(page.data, PACKRFUI, sizeof(PACKRFUI));
+            error = mf_ultralight_poller_write_page(poller, pack, &page);
+            if(error != MfUltralightErrorNone) {
+                FURI_LOG_E(TAG, "Error writing PACKRFUI: %d", error);
+                ret = NfcCommandStop;
+                break;
+            }
+
             // capability container
             // capability container
-            memcpy(newdata->page[capabilityContainer].data, CC, sizeof(CC));
+            memcpy(page.data, CC, sizeof(CC));
+            error = mf_ultralight_poller_write_page(poller, capabilityContainer, &page);
+            if(error != MfUltralightErrorNone) {
+                FURI_LOG_E(TAG, "Error writing CC: %d", error);
+                ret = NfcCommandStop;
+                break;
+            }
+
             // cfg0
             // cfg0
-            memcpy(newdata->page[cfg0].data, CFG0, sizeof(CFG0));
+            memcpy(page.data, CFG0, sizeof(CFG0));
+            error = mf_ultralight_poller_write_page(poller, cfg0, &page);
+            if(error != MfUltralightErrorNone) {
+                FURI_LOG_E(TAG, "Error writing CFG0: %d", error);
+                ret = NfcCommandStop;
+                break;
+            }
+
             // cfg1
             // cfg1
-            memcpy(newdata->page[cfg1].data, CFG1, sizeof(CFG1));
+            memcpy(page.data, CFG1, sizeof(CFG1));
+            error = mf_ultralight_poller_write_page(poller, cfg1, &page);
+            if(error != MfUltralightErrorNone) {
+                FURI_LOG_E(TAG, "Error writing CFG1: %d", error);
+                ret = NfcCommandStop;
+                break;
+            }
+
             // dynamic lock bits
             // dynamic lock bits
-            memcpy(newdata->page[dynamicLockBits].data, DLB, sizeof(DLB));
+            memcpy(page.data, DLB, sizeof(DLB));
+            error = mf_ultralight_poller_write_page(poller, dynamicLockBits, &page);
+            if(error != MfUltralightErrorNone) {
+                FURI_LOG_E(TAG, "Error writing DLB: %d", error);
+                ret = NfcCommandStop;
+                break;
+            }
+
             // static lock bits
             // static lock bits
-            memcpy(newdata->page[staticLockBits].data, SLB, sizeof(SLB));
-            */
+            memcpy(page.data, SLB, sizeof(SLB));
+            error = mf_ultralight_poller_write_page(poller, staticLockBits, &page);
+            if(error != MfUltralightErrorNone) {
+                FURI_LOG_E(TAG, "Error writing SLB: %d", error);
+                ret = NfcCommandStop;
+                break;
+            }
         } while(false);
         } while(false);
         ret = NfcCommandStop;
         ret = NfcCommandStop;
         view_dispatcher_send_custom_event(weebo->view_dispatcher, WeeboCustomEventWriteSuccess);
         view_dispatcher_send_custom_event(weebo->view_dispatcher, WeeboCustomEventWriteSuccess);