metroflip_scene_parse.c 2.7 KB

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