view_port.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include "view_port_i.h"
  2. #include <furi.h>
  3. #include "gui.h"
  4. #include "gui_i.h"
  5. // TODO add mutex to view_port ops
  6. _Static_assert(ViewPortOrientationMAX == 4, "Incorrect ViewPortOrientation count");
  7. _Static_assert(
  8. (ViewPortOrientationHorizontal == 0 && ViewPortOrientationHorizontalFlip == 1 &&
  9. ViewPortOrientationVertical == 2 && ViewPortOrientationVerticalFlip == 3),
  10. "Incorrect ViewPortOrientation order");
  11. _Static_assert(InputKeyMAX == 6, "Incorrect InputKey count");
  12. _Static_assert(
  13. (InputKeyUp == 0 && InputKeyDown == 1 && InputKeyRight == 2 && InputKeyLeft == 3 &&
  14. InputKeyOk == 4 && InputKeyBack == 5),
  15. "Incorrect InputKey order");
  16. /** InputKey directional keys mappings for different screen orientations
  17. *
  18. */
  19. static const InputKey view_port_input_mapping[ViewPortOrientationMAX][InputKeyMAX] = {
  20. {InputKeyUp,
  21. InputKeyDown,
  22. InputKeyRight,
  23. InputKeyLeft,
  24. InputKeyOk,
  25. InputKeyBack}, //ViewPortOrientationHorizontal
  26. {InputKeyDown,
  27. InputKeyUp,
  28. InputKeyLeft,
  29. InputKeyRight,
  30. InputKeyOk,
  31. InputKeyBack}, //ViewPortOrientationHorizontalFlip
  32. {InputKeyRight,
  33. InputKeyLeft,
  34. InputKeyDown,
  35. InputKeyUp,
  36. InputKeyOk,
  37. InputKeyBack}, //ViewPortOrientationVertical
  38. {InputKeyLeft,
  39. InputKeyRight,
  40. InputKeyUp,
  41. InputKeyDown,
  42. InputKeyOk,
  43. InputKeyBack}, //ViewPortOrientationVerticalFlip
  44. };
  45. // Remaps directional pad buttons on Flipper based on ViewPort orientation
  46. static void view_port_map_input(InputEvent* event, ViewPortOrientation orientation) {
  47. furi_assert(orientation < ViewPortOrientationMAX && event->key < InputKeyMAX);
  48. event->key = view_port_input_mapping[orientation][event->key];
  49. }
  50. static void view_port_setup_canvas_orientation(const ViewPort* view_port, Canvas* canvas) {
  51. switch(view_port->orientation) {
  52. case ViewPortOrientationHorizontalFlip:
  53. canvas_set_orientation(canvas, CanvasOrientationHorizontalFlip);
  54. break;
  55. case ViewPortOrientationVertical:
  56. canvas_set_orientation(canvas, CanvasOrientationVertical);
  57. break;
  58. case ViewPortOrientationVerticalFlip:
  59. canvas_set_orientation(canvas, CanvasOrientationVerticalFlip);
  60. break;
  61. default:
  62. canvas_set_orientation(canvas, CanvasOrientationHorizontal);
  63. break;
  64. };
  65. }
  66. ViewPort* view_port_alloc() {
  67. ViewPort* view_port = malloc(sizeof(ViewPort));
  68. view_port->orientation = ViewPortOrientationHorizontal;
  69. view_port->is_enabled = true;
  70. return view_port;
  71. }
  72. void view_port_free(ViewPort* view_port) {
  73. furi_assert(view_port);
  74. furi_check(view_port->gui == NULL);
  75. free(view_port);
  76. }
  77. void view_port_set_width(ViewPort* view_port, uint8_t width) {
  78. furi_assert(view_port);
  79. view_port->width = width;
  80. }
  81. uint8_t view_port_get_width(ViewPort* view_port) {
  82. furi_assert(view_port);
  83. return view_port->width;
  84. }
  85. void view_port_set_height(ViewPort* view_port, uint8_t height) {
  86. furi_assert(view_port);
  87. view_port->height = height;
  88. }
  89. uint8_t view_port_get_height(ViewPort* view_port) {
  90. furi_assert(view_port);
  91. return view_port->height;
  92. }
  93. void view_port_enabled_set(ViewPort* view_port, bool enabled) {
  94. furi_assert(view_port);
  95. if(view_port->is_enabled != enabled) {
  96. view_port->is_enabled = enabled;
  97. if(view_port->gui) gui_update(view_port->gui);
  98. }
  99. }
  100. bool view_port_is_enabled(ViewPort* view_port) {
  101. furi_assert(view_port);
  102. return view_port->is_enabled;
  103. }
  104. void view_port_draw_callback_set(ViewPort* view_port, ViewPortDrawCallback callback, void* context) {
  105. furi_assert(view_port);
  106. view_port->draw_callback = callback;
  107. view_port->draw_callback_context = context;
  108. }
  109. void view_port_input_callback_set(
  110. ViewPort* view_port,
  111. ViewPortInputCallback callback,
  112. void* context) {
  113. furi_assert(view_port);
  114. view_port->input_callback = callback;
  115. view_port->input_callback_context = context;
  116. }
  117. void view_port_update(ViewPort* view_port) {
  118. furi_assert(view_port);
  119. if(view_port->gui && view_port->is_enabled) gui_update(view_port->gui);
  120. }
  121. void view_port_gui_set(ViewPort* view_port, Gui* gui) {
  122. furi_assert(view_port);
  123. view_port->gui = gui;
  124. }
  125. void view_port_draw(ViewPort* view_port, Canvas* canvas) {
  126. furi_assert(view_port);
  127. furi_assert(canvas);
  128. furi_check(view_port->gui);
  129. if(view_port->draw_callback) {
  130. view_port_setup_canvas_orientation(view_port, canvas);
  131. view_port->draw_callback(canvas, view_port->draw_callback_context);
  132. }
  133. }
  134. void view_port_input(ViewPort* view_port, InputEvent* event) {
  135. furi_assert(view_port);
  136. furi_assert(event);
  137. furi_check(view_port->gui);
  138. if(view_port->input_callback) {
  139. ViewPortOrientation orientation = view_port_get_orientation(view_port);
  140. view_port_map_input(event, orientation);
  141. view_port->input_callback(event, view_port->input_callback_context);
  142. }
  143. }
  144. void view_port_set_orientation(ViewPort* view_port, ViewPortOrientation orientation) {
  145. furi_assert(view_port);
  146. view_port->orientation = orientation;
  147. }
  148. ViewPortOrientation view_port_get_orientation(const ViewPort* view_port) {
  149. return view_port->orientation;
  150. }