Browse Source

UI and supported cards list

Luu 11 months ago
parent
commit
658e3df1f6

+ 1 - 1
metroflip_i.h

@@ -90,7 +90,7 @@ typedef struct {
     size_t sec_num;
     float value;
     char currency[4];
-    char card_type[32];
+    const char* card_type;
     bool auto_mode;
     CardType mfc_card_type;
     NfcProtocol protocol;

+ 14 - 14
scenes/metroflip_scene_auto.c

@@ -124,19 +124,19 @@ bool metroflip_scene_auto_on_event(void* context, SceneManagerEvent event) {
             nfc_poller_stop(app->poller);
             nfc_poller_free(app->poller);
             if(app->desfire_card_type == CARD_TYPE_CLIPPER) {
-                strncpy(app->card_type, "clipper", sizeof(app->card_type) - 1);
+                app->card_type = "clipper";
             } else if(app->desfire_card_type == CARD_TYPE_OPAL) {
-                strncpy(app->card_type, "opal", sizeof(app->card_type) - 1);
+                app->card_type = "opal";
             } else if(app->desfire_card_type == CARD_TYPE_MYKI) {
-                strncpy(app->card_type, "myki", sizeof(app->card_type) - 1);
+                app->card_type = "myki";
             } else if(app->desfire_card_type == CARD_TYPE_ITSO) {
-                strncpy(app->card_type, "itso", sizeof(app->card_type) - 1);
+                app->card_type = "itso";
             } else if(app->desfire_card_type == CARD_TYPE_DESFIRE_UNKNOWN) {
-                strncpy(app->card_type, "unknown", sizeof(app->card_type) - 1);
+                app->card_type = "unknown";
                 Popup* popup = app->popup;
                 popup_set_header(popup, "Unsupported\n card", 58, 31, AlignLeft, AlignTop);
             } else {
-                strncpy(app->card_type, "unknown", sizeof(app->card_type) - 1);
+                app->card_type = "unknown";
                 Popup* popup = app->popup;
                 popup_set_header(popup, "Unsupported\n card", 58, 31, AlignLeft, AlignTop);
             }
@@ -166,27 +166,27 @@ bool metroflip_scene_auto_on_event(void* context, SceneManagerEvent event) {
                 UNUSED(popup);
                 switch(card_type) {
                 case CARD_TYPE_METROMONEY:
-                    strncpy(app->card_type, "metromoney", sizeof(app->card_type) - 1);
+                    app->card_type = "metromoney";
                     FURI_LOG_I(TAG, "Detected: Metromoney\n");
                     break;
                 case CARD_TYPE_CHARLIECARD:
-                    strncpy(app->card_type, "charliecard", sizeof(app->card_type) - 1);
+                    app->card_type = "charliecard";
                     FURI_LOG_I(TAG, "Detected: CharlieCard\n");
                     break;
                 case CARD_TYPE_SMARTRIDER:
-                    strncpy(app->card_type, "smartrider", sizeof(app->card_type) - 1);
+                    app->card_type = "smartrider";
                     FURI_LOG_I(TAG, "Detected: SmartRider\n");
                     break;
                 case CARD_TYPE_TROIKA:
-                    strncpy(app->card_type, "troika", sizeof(app->card_type) - 1);
+                    app->card_type = "troika";
                     FURI_LOG_I(TAG, "Detected: Troika\n");
                     break;
                 case CARD_TYPE_UNKNOWN:
-                    strncpy(app->card_type, "unknown", sizeof(app->card_type) - 1);
+                    app->card_type = "unknown";
                     popup_set_header(popup, "Unsupported\n card", 58, 31, AlignLeft, AlignTop);
                     break;
                 default:
-                    strncpy(app->card_type, "unknown", sizeof(app->card_type) - 1);
+                    app->card_type = "unknown";
                     FURI_LOG_I(TAG, "Detected: Unknown card type\n");
                     popup_set_header(popup, "Unsupported\n card", 58, 31, AlignLeft, AlignTop);
                     break;
@@ -196,7 +196,7 @@ bool metroflip_scene_auto_on_event(void* context, SceneManagerEvent event) {
             } else if(
                 nfc_detected_protocols_get_protocol(app->detected_protocols, 0) ==
                 NfcProtocolIso14443_4b) {
-                strncpy(app->card_type, "calypso", sizeof(app->card_type) - 1);
+                app->card_type = "calypso";
                 scene_manager_next_scene(app->scene_manager, MetroflipSceneParse);
                 consumed = true;
             } else if(
@@ -208,7 +208,7 @@ bool metroflip_scene_auto_on_event(void* context, SceneManagerEvent event) {
             } else if(
                 nfc_detected_protocols_get_protocol(app->detected_protocols, 0) ==
                 NfcProtocolInvalid) {
-                strncpy(app->card_type, "unknown", sizeof(app->card_type) - 1);
+                app->card_type = "unkown";
                 Popup* popup = app->popup;
                 popup_set_header(
                     popup, "protocol\n currently\n unsupported", 58, 31, AlignLeft, AlignTop);

+ 1 - 0
scenes/metroflip_scene_config.h

@@ -2,5 +2,6 @@ ADD_SCENE(metroflip, start, Start)
 ADD_SCENE(metroflip, auto, Auto)
 ADD_SCENE(metroflip, parse, Parse)
 ADD_SCENE(metroflip, ovc, OVC)
+ADD_SCENE(metroflip, supported, Supported)
 ADD_SCENE(metroflip, about, About)
 ADD_SCENE(metroflip, credits, Credits)

+ 7 - 6
scenes/metroflip_scene_credits.c

@@ -16,18 +16,19 @@ void metroflip_scene_credits_on_enter(void* context) {
     furi_string_printf(str, "\e#Credits:\n\n");
     furi_string_cat_printf(str, "Created by luu176\n");
     furi_string_cat_printf(str, "Inspired by Metrodroid\n\n");
+    furi_string_cat_printf(str, "Special Thanks:\n willyjl\n");
     furi_string_cat_printf(str, "\e#Parser Credits:\n\n");
-    furi_string_cat_printf(str, "Rav-Kav Parser: luu176\n\n");
-    furi_string_cat_printf(str, "Navigo Parser: \n luu176, DocSystem \n\n");
-    furi_string_cat_printf(str, "Opus Parser: DocSystem\n\n");
-    furi_string_cat_printf(str, "Metromoney Parser:\n Leptopt1los\n\n");
     furi_string_cat_printf(str, "Bip! Parser:\n rbasoalto, gornekich\n\n");
     furi_string_cat_printf(str, "CharlieCard Parser:\n zacharyweiss\n\n");
     furi_string_cat_printf(str, "Clipper Parser:\n ke6jjj\n\n");
-    furi_string_cat_printf(str, "Troika Parser:\n gornekich\n\n");
     furi_string_cat_printf(str, "ITSO Parser:\n gsp8181, hedger, gornekich\n\n");
-    furi_string_cat_printf(str, "Opal Parser:\n gornekich\n\n");
+    furi_string_cat_printf(str, "Metromoney Parser:\n Leptopt1los\n\n");
     furi_string_cat_printf(str, "myki Parser:\n gornekich\n\n");
+    furi_string_cat_printf(str, "Navigo Parser: \n luu176, DocSystem \n\n");
+    furi_string_cat_printf(str, "Opal Parser:\n gornekich\n\n");
+    furi_string_cat_printf(str, "Opus Parser: DocSystem\n\n");
+    furi_string_cat_printf(str, "Rav-Kav Parser: luu176\n\n");
+    furi_string_cat_printf(str, "Troika Parser:\n gornekich\n\n");
     furi_string_cat_printf(str, "Info Slaves:\n Equip, TheDingo8MyBaby\n\n");
 
     widget_add_text_scroll_element(widget, 0, 0, 128, 64, furi_string_get_cstr(str));

+ 8 - 10
scenes/metroflip_scene_parse.c

@@ -9,17 +9,14 @@ void metroflip_scene_parse_on_enter(void* context) {
     metroflip_plugin_manager_alloc(app);
 
     // Check if card_type is empty or unknown
-    if(app->card_type[0] == '\0') {
-        view_dispatcher_send_custom_event(app->view_dispatcher, MetroflipCustomEventWrongCard);
-    } else if(strcmp(app->card_type, "unknown") == 0) {
+    if((app->card_type[0] == '\0') || (strcmp(app->card_type, "unknown") == 0) ||
+       (!app->card_type)) {
         view_dispatcher_send_custom_event(app->view_dispatcher, MetroflipCustomEventWrongCard);
     } else {
-        char plugin_name[64]; // Adjust size as needed
-        snprintf(plugin_name, sizeof(plugin_name), "%s_plugin.fal", app->card_type);
+        char path[128]; // Adjust size as needed
+        snprintf(
+            path, sizeof(path), "/ext/apps_assets/metroflip/plugins/%s_plugin.fal", app->card_type);
 
-        // Construct the final path
-        char path[128]; // Adjust for path length
-        snprintf(path, sizeof(path), "/ext/apps_assets/metroflip/plugins/%s", plugin_name);
         FURI_LOG_I(TAG, "path %s", path);
 
         // Try loading the plugin
@@ -56,7 +53,8 @@ bool metroflip_scene_parse_on_event(void* context, SceneManagerEvent event) {
 void metroflip_scene_parse_on_exit(void* context) {
     Metroflip* app = context;
 
-    if(!((app->card_type[0] == '\0') || (strcmp(app->card_type, "unknown") == 0))) {
+    if(!((app->card_type[0] == '\0') || (strcmp(app->card_type, "unknown") == 0) ||
+         (!app->card_type))) {
         // Get and run the plugin's on_exit function
         const MetroflipPlugin* plugin = plugin_manager_get_ep(app->plugin_manager, 0);
         plugin->plugin_on_exit(app);
@@ -64,5 +62,5 @@ void metroflip_scene_parse_on_exit(void* context) {
         plugin_manager_free(app->plugin_manager);
         composite_api_resolver_free(app->resolver);
     }
-    memset(app->card_type, 0, sizeof(app->card_type));
+    app->card_type = "unknown";
 }

+ 7 - 0
scenes/metroflip_scene_start.c

@@ -21,6 +21,13 @@ void metroflip_scene_start_on_enter(void* context) {
         metroflip_scene_start_submenu_callback,
         app);
 
+    submenu_add_item(
+        submenu,
+        "Supported Cards",
+        MetroflipSceneSupported,
+        metroflip_scene_start_submenu_callback,
+        app);
+
     submenu_add_item(
         submenu, "About", MetroflipSceneAbout, metroflip_scene_start_submenu_callback, app);
 

+ 64 - 0
scenes/metroflip_scene_supported.c

@@ -0,0 +1,64 @@
+#include "../metroflip_i.h"
+#include <dolphin/dolphin.h>
+#include "../api/metroflip/metroflip_api.h"
+
+#define TAG "Metroflip:Scene:SupportedCards"
+
+void metroflip_scene_supported_on_enter(void* context) {
+    Metroflip* app = context;
+    Widget* widget = app->widget;
+
+    dolphin_deed(DolphinDeedNfcReadSuccess);
+    furi_string_reset(app->text_box_store);
+
+    FuriString* str = furi_string_alloc();
+
+    furi_string_printf(str, "\e#Supported Cards:\n\n");
+    furi_string_cat_printf(
+        str, " - Bip!:\nSantiago de Chile, Chile\nProtocol: Mifare Classic\n\n");
+    furi_string_cat_printf(str, " - Charliecard:\nBoston, MA, USA\nProtocol: Mifare Classic\n\n");
+    furi_string_cat_printf(
+        str, " - Clipper:\nSan Francisco, CA, USA\nProtocol: Mifare DESFire\n\n");
+    furi_string_cat_printf(str, " - ITSO:\nUnited Kingdom\nProtocol: Mifare DESFire\n\n");
+    furi_string_cat_printf(str, " - Metromoney:\nTbilisi, Georgia\nProtocol: Mifare Classic\n\n");
+    furi_string_cat_printf(
+        str,
+        " - myki:\n🇦🇺 Melbourne (and surrounds), VIC, Australia\nProtocol: Mifare DESFire\n\n");
+    furi_string_cat_printf(str, " - Navigo:\nParis, France\nProtocol: Calypso\n\n");
+    furi_string_cat_printf(
+        str, " - Opal:\nSydney (and surrounds), NSW, Australia\nProtocol: Mifare DESFire\n\n");
+    furi_string_cat_printf(str, " - Opus:\nMontreal, QC, Canada\nProtocol: Calypso\n\n");
+    furi_string_cat_printf(str, " - Rav-Kav:\nIsrael\nProtocol: Calypso\n\n");
+    furi_string_cat_printf(
+        str, " - SmartRider:\nWestern Australia, Australia\nProtocol: Mifare Classic\n\n");
+    furi_string_cat_printf(str, " - Troika:\nMoscow, Russia\nProtocol: Mifare Classic\n\n");
+
+    widget_add_text_scroll_element(widget, 0, 0, 128, 64, furi_string_get_cstr(str));
+
+    widget_add_button_element(
+        widget, GuiButtonTypeRight, "Exit", metroflip_exit_widget_callback, app);
+
+    furi_string_free(str);
+    view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
+}
+
+bool metroflip_scene_supported_on_event(void* context, SceneManagerEvent event) {
+    Metroflip* app = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == GuiButtonTypeLeft) {
+            consumed = scene_manager_previous_scene(app->scene_manager);
+        }
+    } else if(event.type == SceneManagerEventTypeBack) {
+        scene_manager_search_and_switch_to_previous_scene(app->scene_manager, MetroflipSceneStart);
+        consumed = true;
+    }
+    return consumed;
+}
+
+void metroflip_scene_supported_on_exit(void* context) {
+    Metroflip* app = context;
+    widget_reset(app->widget);
+    UNUSED(context);
+}