desktop_first_start.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include <furi.h>
  2. #include "../desktop_i.h"
  3. #include "desktop_first_start.h"
  4. #define DESKTOP_FIRST_START_POWEROFF_SHORT 5000
  5. #define DESKTOP_FIRST_START_POWEROFF_LONG (60 * 60 * 1000)
  6. struct DesktopFirstStartView {
  7. View* view;
  8. DesktopFirstStartViewCallback callback;
  9. void* context;
  10. osTimerId_t timer;
  11. };
  12. typedef struct {
  13. uint8_t page;
  14. } DesktopFirstStartViewModel;
  15. static void desktop_first_start_draw(Canvas* canvas, void* model) {
  16. DesktopFirstStartViewModel* m = model;
  17. canvas_clear(canvas);
  18. canvas_set_color(canvas, ColorBlack);
  19. canvas_set_font(canvas, FontSecondary);
  20. uint8_t width = canvas_width(canvas);
  21. uint8_t height = canvas_height(canvas);
  22. const char* my_name = furi_hal_version_get_name_ptr();
  23. if(m->page == 0) {
  24. canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart0_70x53);
  25. elements_multiline_text_framed(canvas, 75, 20, "Hey m8,\npress > to\ncontinue");
  26. } else if(m->page == 1) {
  27. canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart1_59x53);
  28. elements_multiline_text_framed(canvas, 64, 20, "First Of All,\n... >");
  29. } else if(m->page == 2) {
  30. canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart2_59x51);
  31. elements_multiline_text_framed(canvas, 64, 20, "Thank you\nfor your\nsupport! >");
  32. } else if(m->page == 3) {
  33. canvas_draw_icon(canvas, width - 57, height - 48, &I_DolphinFirstStart3_57x48);
  34. elements_multiline_text_framed(canvas, 0, 20, "Kickstarter\ncampaign\nwas INSANE! >");
  35. } else if(m->page == 4) {
  36. canvas_draw_icon(canvas, width - 67, height - 50, &I_DolphinFirstStart4_67x53);
  37. elements_multiline_text_framed(canvas, 0, 17, "Now\nallow me\nto introduce\nmyself >");
  38. } else if(m->page == 5) {
  39. char buf[64];
  40. snprintf(
  41. buf,
  42. 64,
  43. "%s %s%s",
  44. "I am",
  45. my_name ? my_name : "Unknown",
  46. ",\ncyberdolphin\nliving in your\npocket >");
  47. canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart5_54x49);
  48. elements_multiline_text_framed(canvas, 60, 17, buf);
  49. } else if(m->page == 6) {
  50. canvas_draw_icon(canvas, 0, height - 48, &I_DolphinFirstStart6_58x54);
  51. elements_multiline_text_framed(
  52. canvas, 63, 17, "I can grow\nsmart'n'cool\nif you use me\noften >");
  53. } else if(m->page == 7) {
  54. canvas_draw_icon(canvas, width - 61, height - 48, &I_DolphinFirstStart7_61x51);
  55. elements_multiline_text_framed(
  56. canvas, 0, 17, "As long as\nyou read, write\nand emulate >");
  57. } else if(m->page == 8) {
  58. canvas_draw_icon(canvas, width - 56, height - 48, &I_DolphinFirstStart8_56x51);
  59. elements_multiline_text_framed(
  60. canvas, 0, 17, "You can check\nmy level and\nmood in the\nPassport menu");
  61. }
  62. }
  63. static bool desktop_first_start_input(InputEvent* event, void* context) {
  64. furi_assert(event);
  65. DesktopFirstStartView* instance = context;
  66. if(event->type == InputTypeShort) {
  67. DesktopFirstStartViewModel* model = view_get_model(instance->view);
  68. if(event->key == InputKeyLeft) {
  69. if(model->page > 0) model->page--;
  70. } else if(event->key == InputKeyRight) {
  71. uint32_t page = ++model->page;
  72. if(page > 8) {
  73. instance->callback(DesktopFirstStartCompleted, instance->context);
  74. }
  75. }
  76. view_commit_model(instance->view, true);
  77. }
  78. if(event->key == InputKeyOk) {
  79. if(event->type == InputTypePress) {
  80. osTimerStart(instance->timer, DESKTOP_FIRST_START_POWEROFF_SHORT);
  81. } else if(event->type == InputTypeRelease) {
  82. osTimerStop(instance->timer);
  83. }
  84. }
  85. return true;
  86. }
  87. static void desktop_first_start_timer_callback(void* context) {
  88. DesktopFirstStartView* instance = context;
  89. instance->callback(DesktopFirstStartPoweroff, instance->context);
  90. }
  91. static void desktop_first_start_enter(void* context) {
  92. DesktopFirstStartView* instance = context;
  93. furi_assert(instance->timer == NULL);
  94. instance->timer = osTimerNew(desktop_first_start_timer_callback, osTimerOnce, instance, NULL);
  95. osTimerStart(instance->timer, DESKTOP_FIRST_START_POWEROFF_LONG);
  96. }
  97. static void desktop_first_start_exit(void* context) {
  98. DesktopFirstStartView* instance = context;
  99. osTimerStop(instance->timer);
  100. osTimerDelete(instance->timer);
  101. instance->timer = NULL;
  102. }
  103. DesktopFirstStartView* desktop_first_start_alloc() {
  104. DesktopFirstStartView* instance = furi_alloc(sizeof(DesktopFirstStartView));
  105. instance->view = view_alloc();
  106. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(DesktopFirstStartViewModel));
  107. view_set_context(instance->view, instance);
  108. view_set_draw_callback(instance->view, (ViewDrawCallback)desktop_first_start_draw);
  109. view_set_input_callback(instance->view, desktop_first_start_input);
  110. view_set_enter_callback(instance->view, desktop_first_start_enter);
  111. view_set_exit_callback(instance->view, desktop_first_start_exit);
  112. return instance;
  113. }
  114. void desktop_first_start_free(DesktopFirstStartView* instance) {
  115. furi_assert(instance);
  116. view_free(instance->view);
  117. free(instance);
  118. }
  119. View* desktop_first_start_get_view(DesktopFirstStartView* instance) {
  120. furi_assert(instance);
  121. return instance->view;
  122. }
  123. void desktop_first_start_set_callback(
  124. DesktopFirstStartView* instance,
  125. DesktopFirstStartViewCallback callback,
  126. void* context) {
  127. furi_assert(instance);
  128. furi_assert(callback);
  129. instance->callback = callback;
  130. instance->context = context;
  131. }