gba_cartridge_startscreen.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "../gba_cartridge_app.h"
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #include <input/input.h>
  5. #include <gui/elements.h>
  6. #include <notification/notification_messages.h>
  7. struct GBACartridgeStartscreen {
  8. View* view;
  9. GBACartridgeStartscreenCallback callback;
  10. void* context;
  11. };
  12. typedef struct {
  13. int some_value;
  14. } GBACartridgeStartscreenModel;
  15. static const NotificationSequence sequence_alarm = {
  16. // &message_note_c5,
  17. // &message_delay_100,
  18. &message_sound_off,
  19. // &message_note_c7,
  20. // &message_delay_500,
  21. &message_sound_off,
  22. NULL,
  23. };
  24. void gba_cartridge_startscreen_set_callback(
  25. GBACartridgeStartscreen* instance,
  26. GBACartridgeStartscreenCallback callback,
  27. void* context) {
  28. furi_assert(instance);
  29. furi_assert(callback);
  30. instance->callback = callback;
  31. instance->context = context;
  32. }
  33. // void screen_gameboy_connect(Canvas* const canvas) {
  34. // canvas_draw_frame(canvas, 0, 0, 128, 64);
  35. // canvas_draw_icon(canvas, 1, 21, &I_Connect_me_62x31);
  36. // canvas_draw_icon(canvas, 0, 53, &I_Background_128x11);
  37. // canvas_draw_icon(canvas, 80, 0, &I_game_boy);
  38. // canvas_draw_icon(canvas, 8, 2, &I_Space_65x18);
  39. // canvas_draw_str(canvas, 18, 13, "Connect GB");
  40. // }
  41. // void screen_gameboy_connected(Canvas* const canvas) {
  42. // canvas_draw_frame(canvas, 0, 0, 128, 64);
  43. // canvas_draw_icon(canvas, 1, 21, &I_Connected_62x31);
  44. // canvas_draw_icon(canvas, 0, 53, &I_Background_128x11);
  45. // canvas_draw_icon(canvas, 80, 0, &I_game_boy);
  46. // canvas_draw_icon(canvas, 8, 2, &I_Space_65x18);
  47. // canvas_draw_str(canvas, 18, 13, "Connected!");
  48. // }
  49. void gba_cartridge_startscreen_draw(Canvas* canvas, GBACartridgeStartscreenModel* model) {
  50. UNUSED(model);
  51. canvas_clear(canvas);
  52. canvas_set_color(canvas, ColorBlack);
  53. canvas_draw_icon(canvas, 0 /*128/2 - (42/2)*/, 64 / 2 - (64 / 2), &I_cartridge_gba_42x64);
  54. canvas_set_font(canvas, FontPrimary);
  55. canvas_draw_str_aligned(canvas, 64 + 20, 6, AlignCenter, AlignTop, "Connect Malveke");
  56. canvas_set_font(canvas, FontSecondary);
  57. canvas_draw_str_aligned(canvas, 64 + 20, 18, AlignCenter, AlignTop, "to the Flipper and");
  58. canvas_draw_str_aligned(canvas, 64 + 20, 28, AlignCenter, AlignTop, "and Insert GBA");
  59. canvas_draw_str_aligned(canvas, 64 + 20, 38, AlignCenter, AlignTop, "Cartridge");
  60. elements_button_center(canvas, "Ok");
  61. }
  62. static void gba_cartridge_startscreen_model_init(GBACartridgeStartscreenModel* const model) {
  63. model->some_value = 1;
  64. }
  65. bool gba_cartridge_startscreen_input(InputEvent* event, void* context) {
  66. furi_assert(context);
  67. GBACartridgeStartscreen* instance = context;
  68. if(event->type == InputTypeRelease) {
  69. switch(event->key) {
  70. case InputKeyBack:
  71. with_view_model(
  72. instance->view,
  73. GBACartridgeStartscreenModel * model,
  74. {
  75. UNUSED(model);
  76. instance->callback(GBACartridgeCustomEventStartscreenBack, instance->context);
  77. },
  78. true);
  79. break;
  80. case InputKeyLeft:
  81. case InputKeyRight:
  82. case InputKeyUp:
  83. case InputKeyDown:
  84. case InputKeyOk:
  85. notification_message(
  86. ((GBACartridge*)instance->context)->notification, &sequence_alarm);
  87. with_view_model(
  88. instance->view,
  89. GBACartridgeStartscreenModel * model,
  90. {
  91. UNUSED(model);
  92. instance->callback(GBACartridgeCustomEventStartscreenOk, instance->context);
  93. },
  94. true);
  95. break;
  96. case InputKeyMAX:
  97. break;
  98. }
  99. }
  100. return true;
  101. }
  102. void gba_cartridge_startscreen_exit(void* context) {
  103. furi_assert(context);
  104. }
  105. void gba_cartridge_startscreen_enter(void* context) {
  106. furi_assert(context);
  107. GBACartridgeStartscreen* instance = (GBACartridgeStartscreen*)context;
  108. with_view_model(
  109. instance->view,
  110. GBACartridgeStartscreenModel * model,
  111. { gba_cartridge_startscreen_model_init(model); },
  112. true);
  113. }
  114. GBACartridgeStartscreen* gba_cartridge_startscreen_alloc() {
  115. GBACartridgeStartscreen* instance = malloc(sizeof(GBACartridgeStartscreen));
  116. instance->view = view_alloc();
  117. view_allocate_model(
  118. instance->view, ViewModelTypeLocking, sizeof(GBACartridgeStartscreenModel));
  119. view_set_context(instance->view, instance); // furi_assert crashes in events without this
  120. view_set_draw_callback(instance->view, (ViewDrawCallback)gba_cartridge_startscreen_draw);
  121. view_set_input_callback(instance->view, gba_cartridge_startscreen_input);
  122. //view_set_enter_callback(instance->view, gba_cartridge_startscreen_enter);
  123. //view_set_exit_callback(instance->view, gba_cartridge_startscreen_exit);
  124. with_view_model(
  125. instance->view,
  126. GBACartridgeStartscreenModel * model,
  127. { gba_cartridge_startscreen_model_init(model); },
  128. true);
  129. return instance;
  130. }
  131. void gba_cartridge_startscreen_free(GBACartridgeStartscreen* instance) {
  132. furi_assert(instance);
  133. with_view_model(
  134. instance->view, GBACartridgeStartscreenModel * model, { UNUSED(model); }, true);
  135. view_free(instance->view);
  136. free(instance);
  137. }
  138. View* gba_cartridge_startscreen_get_view(GBACartridgeStartscreen* instance) {
  139. furi_assert(instance);
  140. return instance->view;
  141. }