gb_cartridge_startscreen.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "../gb_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 GBCartridgeStartscreen {
  8. View* view;
  9. GBCartridgeStartscreenCallback callback;
  10. void* context;
  11. };
  12. typedef struct {
  13. int some_value;
  14. } GBCartridgeStartscreenModel;
  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 gb_cartridge_startscreen_set_callback(
  25. GBCartridgeStartscreen* instance,
  26. GBCartridgeStartscreenCallback 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 gb_cartridge_startscreen_draw(Canvas* canvas, GBCartridgeStartscreenModel* 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_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 Game Boy");
  59. canvas_draw_str_aligned(canvas, 64 + 20, 38, AlignCenter, AlignTop, "Cartridge");
  60. elements_button_center(canvas, "Ok");
  61. }
  62. static void gb_cartridge_startscreen_model_init(GBCartridgeStartscreenModel* const model) {
  63. model->some_value = 1;
  64. }
  65. bool gb_cartridge_startscreen_input(InputEvent* event, void* context) {
  66. furi_assert(context);
  67. GBCartridgeStartscreen* instance = context;
  68. if(event->type == InputTypeRelease) {
  69. switch(event->key) {
  70. case InputKeyBack:
  71. with_view_model(
  72. instance->view,
  73. GBCartridgeStartscreenModel * model,
  74. {
  75. UNUSED(model);
  76. instance->callback(GBCartridgeCustomEventStartscreenBack, 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(((GBCartridge*)instance->context)->notification, &sequence_alarm);
  86. with_view_model(
  87. instance->view,
  88. GBCartridgeStartscreenModel * model,
  89. {
  90. UNUSED(model);
  91. instance->callback(GBCartridgeCustomEventStartscreenOk, instance->context);
  92. },
  93. true);
  94. break;
  95. case InputKeyMAX:
  96. break;
  97. }
  98. }
  99. return true;
  100. }
  101. void gb_cartridge_startscreen_exit(void* context) {
  102. furi_assert(context);
  103. }
  104. void gb_cartridge_startscreen_enter(void* context) {
  105. furi_assert(context);
  106. GBCartridgeStartscreen* instance = (GBCartridgeStartscreen*)context;
  107. with_view_model(
  108. instance->view,
  109. GBCartridgeStartscreenModel * model,
  110. { gb_cartridge_startscreen_model_init(model); },
  111. true);
  112. }
  113. GBCartridgeStartscreen* gb_cartridge_startscreen_alloc() {
  114. GBCartridgeStartscreen* instance = malloc(sizeof(GBCartridgeStartscreen));
  115. instance->view = view_alloc();
  116. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(GBCartridgeStartscreenModel));
  117. view_set_context(instance->view, instance); // furi_assert crashes in events without this
  118. view_set_draw_callback(instance->view, (ViewDrawCallback)gb_cartridge_startscreen_draw);
  119. view_set_input_callback(instance->view, gb_cartridge_startscreen_input);
  120. //view_set_enter_callback(instance->view, gb_cartridge_startscreen_enter);
  121. //view_set_exit_callback(instance->view, gb_cartridge_startscreen_exit);
  122. with_view_model(
  123. instance->view,
  124. GBCartridgeStartscreenModel * model,
  125. { gb_cartridge_startscreen_model_init(model); },
  126. true);
  127. return instance;
  128. }
  129. void gb_cartridge_startscreen_free(GBCartridgeStartscreen* instance) {
  130. furi_assert(instance);
  131. with_view_model(
  132. instance->view, GBCartridgeStartscreenModel * model, { UNUSED(model); }, true);
  133. view_free(instance->view);
  134. free(instance);
  135. }
  136. View* gb_cartridge_startscreen_get_view(GBCartridgeStartscreen* instance) {
  137. furi_assert(instance);
  138. return instance->view;
  139. }