desktop_scene_locked.c 3.6 KB

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