MX 1 год назад
Родитель
Сommit
9b98911592

+ 1 - 1
base_pack/find_my_flipper/application.fam

@@ -10,6 +10,6 @@ App(
     fap_category="Bluetooth",
     fap_author="@MatthewKuKanich",
     fap_weburl="https://github.com/MatthewKuKanich/FindMyFlipper",
-    fap_version="2.0",
+    fap_version="3.0",
     fap_description="BLE FindMy Location Beacon",
 )

+ 9 - 0
base_pack/find_my_flipper/findmy.c

@@ -53,6 +53,8 @@ static FindMy* findmy_app_alloc() {
 
     findmy_main_update_active(app->findmy_main, furi_hal_bt_extra_beacon_is_active());
     findmy_main_update_interval(app->findmy_main, app->state.broadcast_interval);
+    findmy_main_toggle_mac(app->findmy_main, app->state.show_mac);
+    findmy_main_update_mac(app->findmy_main, app->state.mac);
     findmy_main_update_type(app->findmy_main, app->state.tag_type);
 
     return app;
@@ -129,6 +131,13 @@ void findmy_change_transmit_power(FindMy* app, uint8_t value) {
     }
 }
 
+void findmy_toggle_show_mac(FindMy* app, bool show_mac) {
+    app->state.show_mac = show_mac;
+    findmy_state_sync_config(&app->state);
+    findmy_state_save(&app->state);
+    findmy_main_toggle_mac(app->findmy_main, app->state.show_mac);
+}
+
 void findmy_toggle_beacon(FindMy* app) {
     app->state.beacon_active = !app->state.beacon_active;
     findmy_state_save(&app->state);

+ 1 - 0
base_pack/find_my_flipper/findmy_i.h

@@ -50,5 +50,6 @@ typedef enum {
 
 void findmy_change_broadcast_interval(FindMy* app, uint8_t value);
 void findmy_change_transmit_power(FindMy* app, uint8_t value);
+void findmy_toggle_show_mac(FindMy* app, bool show_mac);
 void findmy_set_tag_type(FindMy* app, FindMyType type);
 void findmy_toggle_beacon(FindMy* app);

+ 9 - 1
base_pack/find_my_flipper/findmy_state.c

@@ -29,6 +29,12 @@ bool findmy_state_load(FindMyState* out_state) {
             if(!flipper_format_read_uint32(file, "transmit_power", &tmp, 1)) break;
             state.transmit_power = tmp;
 
+            if(!flipper_format_read_bool(file, "show_mac", &state.show_mac, 1)) {
+                // Support migrating from old config
+                state.show_mac = false;
+                flipper_format_rewind(file);
+            }
+
             if(!flipper_format_read_uint32(file, "tag_type", &tmp, 1)) {
                 // Support migrating from old config
                 tmp = FindMyTypeApple;
@@ -53,7 +59,7 @@ bool findmy_state_load(FindMyState* out_state) {
         state.beacon_active = false;
         state.broadcast_interval = 5;
         state.transmit_power = 6;
-
+        state.show_mac = false;
         state.tag_type = FindMyTypeApple;
 
         // Set default mac
@@ -135,6 +141,8 @@ void findmy_state_save(FindMyState* state) {
         tmp = state->tag_type;
         if(!flipper_format_write_uint32(file, "tag_type", &tmp, 1)) break;
 
+        if(!flipper_format_write_bool(file, "show_mac", &state->show_mac, 1)) break;
+
         if(!flipper_format_write_hex(file, "mac", state->mac, sizeof(state->mac))) break;
 
         if(!flipper_format_write_hex(

+ 1 - 1
base_pack/find_my_flipper/findmy_state.h

@@ -17,7 +17,7 @@ typedef struct {
     bool beacon_active;
     uint8_t broadcast_interval;
     uint8_t transmit_power;
-
+    bool show_mac;
     uint8_t mac[EXTRA_BEACON_MAC_ADDR_SIZE];
     uint8_t data[EXTRA_BEACON_MAX_DATA_SIZE];
     FindMyType tag_type;

+ 13 - 0
base_pack/find_my_flipper/scenes/findmy_scene_config.c

@@ -4,6 +4,7 @@ enum VarItemListIndex {
     VarItemListIndexBroadcastInterval,
     VarItemListIndexTransmitPower,
     VarItemListIndexRegisterTag,
+    VarItemListIndexShowMac,
     VarItemListIndexAbout,
 };
 
@@ -27,6 +28,14 @@ void findmy_scene_config_transmit_power_changed(VariableItem* item) {
     variable_item_set_current_value_index(item, app->state.transmit_power);
 }
 
+void findmy_scene_config_show_mac(VariableItem* item) {
+    FindMy* app = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+    findmy_toggle_show_mac(app, index);
+    variable_item_set_current_value_text(item, app->state.show_mac ? "Yes" : "No");
+    variable_item_set_current_value_index(item, app->state.show_mac);
+}
+
 void findmy_scene_config_callback(void* context, uint32_t index) {
     furi_assert(context);
     FindMy* app = context;
@@ -59,6 +68,10 @@ void findmy_scene_config_on_enter(void* context) {
 
     item = variable_item_list_add(var_item_list, "Register Tag", 0, NULL, NULL);
 
+    item = variable_item_list_add(var_item_list, "Show MAC", 2, findmy_scene_config_show_mac, app);
+    variable_item_set_current_value_index(item, app->state.show_mac);
+    variable_item_set_current_value_text(item, app->state.show_mac ? "Yes" : "No");
+
     item = variable_item_list_add(
         var_item_list,
         "Matthew KuKanich, Thanks to Chapoly1305, WillyJL, OpenHaystack, Testers",

+ 1 - 0
base_pack/find_my_flipper/scenes/findmy_scene_config_mac.c

@@ -49,6 +49,7 @@ bool findmy_scene_config_mac_on_event(void* context, SceneManagerEvent event) {
             if(app->state.beacon_active) {
                 furi_check(furi_hal_bt_extra_beacon_start());
             }
+            findmy_main_update_mac(app->findmy_main, app->state.mac);
             scene_manager_next_scene(app->scene_manager, FindMySceneConfigPacket);
             break;
         default:

BIN
base_pack/find_my_flipper/screenshots/1.png


BIN
base_pack/find_my_flipper/screenshots/2.png


BIN
base_pack/find_my_flipper/screenshots/3.png


+ 57 - 16
base_pack/find_my_flipper/views/findmy_main.c

@@ -9,7 +9,9 @@ struct FindMyMain {
 
 typedef struct {
     bool active;
+    bool show_mac;
     uint8_t interval;
+    uint8_t mac[6];
     FindMyType type;
 } FindMyMainModel;
 
@@ -20,20 +22,7 @@ static void findmy_main_draw_callback(Canvas* canvas, void* _model) {
     canvas_set_font(canvas, FontPrimary);
 
     canvas_draw_str(canvas, 4, 11, "FindMy Flipper");
-    canvas_set_font(canvas, FontSecondary);
-    if(model->active) {
-        canvas_draw_str(canvas, 4, 49, "Broadcast Active");
-        canvas_draw_icon(canvas, 78, 42, &I_Ok_btn_9x9);
-    } else {
-        canvas_draw_str(canvas, 4, 49, "Broadcast Inactive");
-    }
-    canvas_set_font(canvas, FontSecondary);
-    canvas_draw_str(canvas, 4, 21, "Press <- to run in background");
-    canvas_set_font(canvas, FontSecondary);
-    char interval_str[20];
-    snprintf(interval_str, sizeof(interval_str), "Ping Interval: %ds", model->interval);
-    canvas_draw_str(canvas, 4, 62, interval_str);
-    canvas_set_font(canvas, FontPrimary);
+
     const char* network_text = "";
     switch(model->type) {
     case FindMyTypeApple:
@@ -48,8 +37,42 @@ static void findmy_main_draw_callback(Canvas* canvas, void* _model) {
     default:
         break;
     }
-    canvas_draw_str(canvas, 4, 32, network_text);
-    canvas_draw_icon(canvas, 6 + canvas_string_width(canvas, network_text), 24, &I_Lock_7x8);
+
+    if(model->show_mac == false) {
+        canvas_set_font(canvas, FontPrimary);
+        canvas_draw_str(canvas, 4, 31, network_text);
+        canvas_draw_icon(canvas, 6 + canvas_string_width(canvas, network_text), 24, &I_Lock_7x8);
+    } else if(model->show_mac == true) {
+        canvas_set_font(canvas, FontSecondary);
+        char mac_str[23];
+        snprintf(
+            mac_str,
+            sizeof(mac_str),
+            "MAC: %02X:%02X:%02X:%02X:%02X:%02X",
+            model->mac[0],
+            model->mac[1],
+            model->mac[2],
+            model->mac[3],
+            model->mac[4],
+            model->mac[5]);
+        canvas_draw_str(canvas, 4, 40, mac_str);
+        canvas_draw_str(canvas, 4, 30, network_text);
+        canvas_draw_icon(canvas, 6 + canvas_string_width(canvas, network_text), 23, &I_Lock_7x8);
+    }
+    canvas_set_font(canvas, FontSecondary);
+    if(model->active) {
+        canvas_draw_str(canvas, 4, 49, "Broadcast Active");
+        canvas_draw_icon(canvas, 78, 41, &I_Ok_btn_9x9);
+    } else {
+        canvas_draw_str(canvas, 4, 49, "Broadcast Inactive");
+    }
+    canvas_set_font(canvas, FontSecondary);
+    canvas_draw_str(canvas, 4, 21, "Press <- to run in background");
+    canvas_set_font(canvas, FontSecondary);
+    char interval_str[20];
+    snprintf(interval_str, sizeof(interval_str), "Ping Interval: %ds", model->interval);
+    canvas_draw_str(canvas, 4, 62, interval_str);
+
     canvas_set_font(canvas, FontSecondary);
     canvas_draw_str(canvas, 100, 61, "Config");
     canvas_draw_line(canvas, 100, 51, 127, 51);
@@ -107,6 +130,8 @@ FindMyMain* findmy_main_alloc(FindMy* app) {
         {
             model->active = app->state.beacon_active;
             model->interval = app->state.broadcast_interval;
+            model->show_mac = app->state.show_mac;
+            memcpy(model->mac, app->state.mac, sizeof(model->mac));
             model->type = app->state.tag_type;
         },
         false);
@@ -141,6 +166,22 @@ void findmy_main_update_active(FindMyMain* findmy_main, bool active) {
         findmy_main->view, FindMyMainModel * model, { model->active = active; }, true);
 }
 
+void findmy_main_toggle_mac(FindMyMain* findmy_main, bool show_mac) {
+    furi_assert(findmy_main);
+    with_view_model(
+        findmy_main->view, FindMyMainModel * model, { model->show_mac = show_mac; }, true);
+}
+
+void findmy_main_update_mac(FindMyMain* findmy_main, uint8_t* mac) {
+    with_view_model(
+        findmy_main->view,
+        FindMyMainModel * model,
+        {
+            memcpy(model->mac, mac, sizeof(model->mac));
+            furi_hal_bt_reverse_mac_addr(model->mac);
+        },
+        true);
+}
 void findmy_main_update_interval(FindMyMain* findmy_main, uint8_t interval) {
     furi_assert(findmy_main);
     with_view_model(

+ 2 - 0
base_pack/find_my_flipper/views/findmy_main.h

@@ -27,4 +27,6 @@ void findmy_main_set_callback(FindMyMain* findmy_main, FindMyMainCallback callba
 // To redraw when info changes
 void findmy_main_update_active(FindMyMain* findmy_main, bool active);
 void findmy_main_update_interval(FindMyMain* findmy_main, uint8_t interval);
+void findmy_main_toggle_mac(FindMyMain* findmy_main, bool show_mac);
+void findmy_main_update_mac(FindMyMain* findmy_main, uint8_t* mac);
 void findmy_main_update_type(FindMyMain* findmy_main, FindMyType type);