desktop_view_first_start.c 5.9 KB

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