desktop_scene_locked.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "../desktop_i.h"
  2. #include "../views/desktop_locked.h"
  3. void desktop_scene_locked_callback(DesktopLockedEvent event, void* context) {
  4. Desktop* desktop = (Desktop*)context;
  5. view_dispatcher_send_custom_event(desktop->view_dispatcher, event);
  6. }
  7. void desktop_scene_locked_on_enter(void* context) {
  8. Desktop* desktop = (Desktop*)context;
  9. DesktopLockedView* locked_view = desktop->locked_view;
  10. desktop_locked_set_callback(locked_view, desktop_scene_locked_callback, desktop);
  11. desktop_locked_reset_door_pos(locked_view);
  12. desktop_locked_update_hint_timeout(locked_view);
  13. desktop_locked_set_dolphin_animation(locked_view);
  14. uint32_t state = scene_manager_get_scene_state(desktop->scene_manager, DesktopViewLocked);
  15. desktop_locked_with_pin(desktop->locked_view, state == DesktopLockedWithPin);
  16. view_port_enabled_set(desktop->lock_viewport, true);
  17. osTimerStart(locked_view->timer, 63);
  18. view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewLocked);
  19. }
  20. static bool desktop_scene_locked_check_pin(Desktop* desktop, DesktopMainEvent event) {
  21. bool match = false;
  22. size_t length = desktop->pincode_buffer.length;
  23. length = code_input_push(desktop->pincode_buffer.data, length, event);
  24. desktop->pincode_buffer.length = length;
  25. match = code_input_compare(
  26. desktop->pincode_buffer.data,
  27. length,
  28. desktop->settings.pincode.data,
  29. desktop->settings.pincode.length);
  30. if(match) {
  31. desktop->pincode_buffer.length = 0;
  32. desktop->settings.locked = false;
  33. desktop_settings_save(&desktop->settings);
  34. desktop_main_unlocked(desktop->main_view);
  35. }
  36. return match;
  37. }
  38. bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) {
  39. Desktop* desktop = (Desktop*)context;
  40. bool consumed = false;
  41. if(event.type == SceneManagerEventTypeCustom) {
  42. switch(event.event) {
  43. case DesktopLockedEventUnlock:
  44. scene_manager_set_scene_state(
  45. desktop->scene_manager, DesktopSceneMain, DesktopMainEventUnlocked);
  46. scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain);
  47. consumed = true;
  48. break;
  49. case DesktopLockedEventUpdate:
  50. desktop_locked_manage_redraw(desktop->locked_view);
  51. consumed = true;
  52. break;
  53. case DesktopLockedEventInputReset:
  54. desktop->pincode_buffer.length = 0;
  55. break;
  56. default:
  57. if(desktop_scene_locked_check_pin(desktop, event.event)) {
  58. scene_manager_set_scene_state(
  59. desktop->scene_manager, DesktopSceneMain, DesktopMainEventUnlocked);
  60. scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain);
  61. consumed = true;
  62. }
  63. break;
  64. }
  65. }
  66. return consumed;
  67. }
  68. void desktop_scene_locked_on_exit(void* context) {
  69. Desktop* desktop = (Desktop*)context;
  70. desktop_locked_reset_counter(desktop->locked_view);
  71. osTimerStop(desktop->locked_view->timer);
  72. }