desktop_scene_locked.c 3.1 KB

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