metroflip_scene_parse.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "../metroflip_i.h"
  2. #include <furi.h>
  3. #include "../metroflip_plugins.h"
  4. #define TAG "Metroflip:Scene:Parse"
  5. #include <stdio.h>
  6. void metroflip_scene_parse_on_enter(void* context) {
  7. Metroflip* app = context;
  8. metroflip_plugin_manager_alloc(app);
  9. // Check if card_type is empty or unknown
  10. if((app->card_type[0] == '\0') || (strcmp(app->card_type, "unknown") == 0) ||
  11. (!app->card_type)) {
  12. view_dispatcher_send_custom_event(app->view_dispatcher, MetroflipCustomEventWrongCard);
  13. } else {
  14. char path[128]; // Adjust size as needed
  15. snprintf(
  16. path, sizeof(path), "/ext/apps_assets/metroflip/plugins/%s_plugin.fal", app->card_type);
  17. FURI_LOG_I(TAG, "path %s", path);
  18. // Try loading the plugin
  19. if(plugin_manager_load_single(app->plugin_manager, path) != PluginManagerErrorNone) {
  20. FURI_LOG_E(TAG, "Failed to load parse plugin");
  21. return;
  22. }
  23. // Get and run the plugin's on_enter function
  24. const MetroflipPlugin* plugin = plugin_manager_get_ep(app->plugin_manager, 0);
  25. plugin->plugin_on_enter(app);
  26. }
  27. }
  28. bool metroflip_scene_parse_on_event(void* context, SceneManagerEvent event) {
  29. Metroflip* app = context;
  30. if(event.type == SceneManagerEventTypeCustom) {
  31. if(event.event == MetroflipCustomEventWrongCard) {
  32. Popup* popup = app->popup;
  33. popup_set_header(popup, "card\n currently\n unsupported", 58, 31, AlignLeft, AlignTop);
  34. popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);
  35. return true;
  36. }
  37. } else if(event.type == SceneManagerEventTypeBack) {
  38. scene_manager_search_and_switch_to_previous_scene(app->scene_manager, MetroflipSceneStart);
  39. return true;
  40. }
  41. // Get and run the plugin's on_event function
  42. const MetroflipPlugin* plugin = plugin_manager_get_ep(app->plugin_manager, 0);
  43. return plugin->plugin_on_event(app, event);
  44. }
  45. void metroflip_scene_parse_on_exit(void* context) {
  46. Metroflip* app = context;
  47. if(!((app->card_type[0] == '\0') || (strcmp(app->card_type, "unknown") == 0) ||
  48. (!app->card_type))) {
  49. // Get and run the plugin's on_exit function
  50. const MetroflipPlugin* plugin = plugin_manager_get_ep(app->plugin_manager, 0);
  51. plugin->plugin_on_exit(app);
  52. plugin_manager_free(app->plugin_manager);
  53. composite_api_resolver_free(app->resolver);
  54. }
  55. app->card_type = "unknown";
  56. }