ibutton-scene-start.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "ibutton-scene-start.h"
  2. #include "../ibutton-app.h"
  3. #include "../ibutton-view-manager.h"
  4. #include "../ibutton-event.h"
  5. #include <callback-connector.h>
  6. #include <filesystem-api.h>
  7. typedef enum {
  8. SubmenuIndexRead,
  9. SubmenuIndexSaved,
  10. SubmenuIndexAdd,
  11. } SubmenuIndex;
  12. void iButtonSceneStart::on_enter(iButtonApp* app) {
  13. iButtonAppViewManager* view_manager = app->get_view_manager();
  14. Submenu* submenu = view_manager->get_submenu();
  15. auto callback = cbc::obtain_connector(this, &iButtonSceneStart::submenu_callback);
  16. submenu_add_item(submenu, "Read", SubmenuIndexRead, callback, app);
  17. submenu_add_item(submenu, "Saved", SubmenuIndexSaved, callback, app);
  18. submenu_add_item(submenu, "Add manually", SubmenuIndexAdd, callback, app);
  19. view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewSubmenu);
  20. }
  21. bool iButtonSceneStart::on_event(iButtonApp* app, iButtonEvent* event) {
  22. bool consumed = false;
  23. if(event->type == iButtonEvent::Type::EventTypeMenuSelected) {
  24. switch(event->payload.menu_index) {
  25. case SubmenuIndexRead:
  26. app->switch_to_next_scene(iButtonApp::Scene::SceneRead);
  27. break;
  28. case SubmenuIndexSaved: {
  29. bool res = app->get_sd_ex_api()->file_select(
  30. app->get_sd_ex_api()->context,
  31. "ibutton",
  32. "*",
  33. app->get_file_name(),
  34. app->get_file_name_size());
  35. if(res) {
  36. string_t key_str;
  37. string_init_set_str(key_str, "ibutton/");
  38. string_cat_str(key_str, app->get_file_name());
  39. File key_file;
  40. uint8_t key_data[IBUTTON_KEY_SIZE + 1] = {};
  41. // Read data from file
  42. // TODO handle false return
  43. res = app->get_fs_api()->file.open(
  44. &key_file, string_get_cstr(key_str), FSAM_READ, FSOM_OPEN_EXISTING);
  45. res = app->get_fs_api()->file.read(&key_file, key_data, IBUTTON_KEY_SIZE + 1);
  46. res = app->get_fs_api()->file.close(&key_file);
  47. string_clear(key_str);
  48. // Set key
  49. iButtonKeyType key_type = static_cast<iButtonKeyType>(key_data[0]);
  50. if(key_type > iButtonKeyType::KeyMetakom) {
  51. app->switch_to_next_scene(iButtonApp::Scene::SceneStart);
  52. }
  53. app->get_key()->set_name(app->get_file_name());
  54. app->get_key()->set_type(key_type);
  55. app->get_key()->set_data(key_data + 1, IBUTTON_KEY_SIZE);
  56. app->switch_to_next_scene(iButtonApp::Scene::SceneSavedKeyMenu);
  57. } else {
  58. // TODO add error scene
  59. app->switch_to_next_scene(iButtonApp::Scene::SceneStart);
  60. }
  61. }; break;
  62. case SubmenuIndexAdd:
  63. app->switch_to_next_scene(iButtonApp::Scene::SceneAddType);
  64. break;
  65. }
  66. consumed = true;
  67. }
  68. return consumed;
  69. }
  70. void iButtonSceneStart::on_exit(iButtonApp* app) {
  71. iButtonAppViewManager* view = app->get_view_manager();
  72. Submenu* submenu = view->get_submenu();
  73. submenu_clean(submenu);
  74. }
  75. void iButtonSceneStart::submenu_callback(void* context, uint32_t index) {
  76. iButtonApp* app = static_cast<iButtonApp*>(context);
  77. iButtonEvent event;
  78. event.type = iButtonEvent::Type::EventTypeMenuSelected;
  79. event.payload.menu_index = index;
  80. app->get_view_manager()->send_event(&event);
  81. }