Преглед изворни кода

NFC Maker: Dynamic NDEF buffer size

Willy-JL пре 1 година
родитељ
комит
646bd7ce6a
3 измењених фајлова са 24 додато и 11 уклоњено
  1. 3 2
      nfc_maker/nfc_maker.c
  2. 1 1
      nfc_maker/nfc_maker.h
  3. 20 8
      nfc_maker/scenes/nfc_maker_scene_save_generate.c

+ 3 - 2
nfc_maker/nfc_maker.c

@@ -73,7 +73,6 @@ NfcMaker* nfc_maker_alloc() {
 
     // Nfc Device
     app->nfc_device = nfc_device_alloc();
-    app->ndef_buffer = malloc(MAX_NDEF_LEN);
 
     return app;
 }
@@ -83,7 +82,9 @@ void nfc_maker_free(NfcMaker* app) {
 
     // Nfc Device
     nfc_device_free(app->nfc_device);
-    free(app->ndef_buffer);
+    if(app->ndef_buffer) {
+        free(app->ndef_buffer);
+    }
 
     // Gui modules
     view_dispatcher_remove_view(app->view_dispatcher, NfcMakerViewSubmenu);

+ 1 - 1
nfc_maker/nfc_maker.h

@@ -53,7 +53,6 @@ typedef enum {
 extern const NfcDataGeneratorType ntag_generators[NtagMAX];
 extern const char* ntag_names[NtagMAX];
 extern const size_t ntag_sizes[NtagMAX];
-#define MAX_NDEF_LEN ntag_sizes[NtagI2C2K]
 
 typedef enum {
     WifiAuthenticationOpen = 0x01,
@@ -82,6 +81,7 @@ typedef struct {
 
     NfcDevice* nfc_device;
     uint8_t* ndef_buffer;
+    size_t ndef_size;
 
     uint8_t mac_buf[MAC_INPUT_LEN];
     char mail_buf[MAIL_INPUT_LEN];

+ 20 - 8
nfc_maker/scenes/nfc_maker_scene_save_generate.c

@@ -1,6 +1,6 @@
 #include "../nfc_maker.h"
 
-size_t nfc_maker_scene_save_generate_populate_ndef_buffer(NfcMaker* app) {
+static void nfc_maker_scene_save_generate_populate_ndef_buffer(NfcMaker* app) {
     // NDEF Docs: https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/protocols/nfc/index.html#nfc-data-exchange-format-ndef
     uint8_t tnf = 0x00;
     const char* type = "";
@@ -239,12 +239,19 @@ size_t nfc_maker_scene_save_generate_populate_ndef_buffer(NfcMaker* app) {
     header_len += type_len; // Payload type
 
     // Start consolidating into NDEF buffer
-    memset(app->ndef_buffer, 0, MAX_NDEF_LEN);
-    uint8_t* buf = app->ndef_buffer;
+    size_t record_len = header_len + payload_len;
+    app->ndef_size = 1 // TLV type
+                     + (record_len < 0xFF ? 1 : 3) // TLV length
+                     + record_len // NDEF Record
+                     + 1 // Record terminator
+        ;
+    if(app->ndef_buffer) {
+        free(app->ndef_buffer);
+    }
+    uint8_t* buf = app->ndef_buffer = malloc(app->ndef_size);
 
     // NDEF TLV block
     *buf++ = 0x03; // TLV type
-    size_t record_len = header_len + payload_len;
     if(record_len < 0xFF) {
         *buf++ = record_len; // TLV length
     } else {
@@ -275,7 +282,8 @@ size_t nfc_maker_scene_save_generate_populate_ndef_buffer(NfcMaker* app) {
     // Record terminator
     *buf++ = 0xFE;
 
-    return buf - app->ndef_buffer; // Size of NDEF data
+    // Double check size of NDEF data
+    furi_check(app->ndef_size == (size_t)(buf - app->ndef_buffer));
 }
 
 void nfc_maker_scene_save_generate_submenu_callback(void* context, uint32_t index) {
@@ -286,7 +294,7 @@ void nfc_maker_scene_save_generate_submenu_callback(void* context, uint32_t inde
 void nfc_maker_scene_save_generate_on_enter(void* context) {
     NfcMaker* app = context;
     Submenu* submenu = app->submenu;
-    size_t ndef_size = nfc_maker_scene_save_generate_populate_ndef_buffer(app);
+    nfc_maker_scene_save_generate_populate_ndef_buffer(app);
 
     submenu_set_header(submenu, "Tag Type:");
 
@@ -297,7 +305,7 @@ void nfc_maker_scene_save_generate_on_enter(void* context) {
             ntag,
             nfc_maker_scene_save_generate_submenu_callback,
             app,
-            ndef_size > ntag_sizes[ntag],
+            app->ndef_size > ntag_sizes[ntag],
             "Data is\ntoo large!");
     }
 
@@ -324,7 +332,11 @@ bool nfc_maker_scene_save_generate_on_event(void* context, SceneManagerEvent eve
             MIN(ntag_sizes[event.event], // Known size
                 data->page[3].data[2] * NTAG_DATA_AREA_UNIT_SIZE // Capability Container
             );
-        memcpy(&data->page[4].data[0], app->ndef_buffer, size);
+        furi_check(app->ndef_size <= size);
+        memcpy(&data->page[4].data[0], app->ndef_buffer, app->ndef_size);
+        free(app->ndef_buffer);
+        app->ndef_buffer = NULL;
+
         nfc_device_set_data(app->nfc_device, NfcProtocolMfUltralight, data);
         mf_ultralight_free(data);