recovery.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include <flipper.h>
  4. #include <alt_boot.h>
  5. #include <u8g2_glue.h>
  6. #include <assets_icons.h>
  7. #define COUNTER_VALUE (100U)
  8. static void flipper_boot_recovery_draw_splash(u8g2_t* fb, size_t progress) {
  9. u8g2_ClearBuffer(fb);
  10. u8g2_SetDrawColor(fb, 0x01);
  11. u8g2_SetFont(fb, u8g2_font_helvB08_tr);
  12. u8g2_DrawStr(fb, 2, 8, "PIN and Factory Reset");
  13. u8g2_SetFont(fb, u8g2_font_haxrcorp4089_tr);
  14. u8g2_DrawStr(fb, 2, 21, "Hold Right to confirm");
  15. u8g2_DrawStr(fb, 2, 31, "Press Down to cancel");
  16. if(progress < COUNTER_VALUE) {
  17. size_t width = progress / (COUNTER_VALUE / 100);
  18. u8g2_DrawBox(fb, 14 + (50 - width / 2), 54, width, 3);
  19. }
  20. u8g2_SetPowerSave(fb, 0);
  21. u8g2_SendBuffer(fb);
  22. }
  23. void flipper_boot_recovery_exec() {
  24. u8g2_t* fb = malloc(sizeof(u8g2_t));
  25. u8g2_Setup_st756x_flipper(fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32);
  26. u8g2_InitDisplay(fb);
  27. size_t counter = COUNTER_VALUE;
  28. while(counter) {
  29. if(!furi_hal_gpio_read(&gpio_button_down)) {
  30. break;
  31. }
  32. if(!furi_hal_gpio_read(&gpio_button_right)) {
  33. counter--;
  34. } else {
  35. counter = COUNTER_VALUE;
  36. }
  37. flipper_boot_recovery_draw_splash(fb, counter);
  38. }
  39. if(!counter) {
  40. furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset);
  41. furi_hal_rtc_set_pin_fails(0);
  42. furi_hal_rtc_reset_flag(FuriHalRtcFlagLock);
  43. }
  44. }