metroflip_scene_parse.c 2.5 KB

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