canvas.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include "canvas.h"
  2. #include "canvas_i.h"
  3. #include "icon.h"
  4. #include "icon_i.h"
  5. #include <flipper.h>
  6. #include <flipper_v2.h>
  7. typedef struct {
  8. CanvasApi api;
  9. u8g2_t fb;
  10. uint8_t offset_x;
  11. uint8_t offset_y;
  12. uint8_t width;
  13. uint8_t height;
  14. } Canvas;
  15. uint8_t canvas_width(CanvasApi* api);
  16. uint8_t canvas_height(CanvasApi* api);
  17. void canvas_clear(CanvasApi* api);
  18. void canvas_color_set(CanvasApi* api, uint8_t color);
  19. void canvas_font_set(CanvasApi* api, Font font);
  20. void canvas_str_draw(CanvasApi* api, uint8_t x, uint8_t y, const char* str);
  21. void canvas_icon_draw(CanvasApi* api, uint8_t x, uint8_t y, Icon* icon);
  22. void canvas_dot_draw(CanvasApi* api, uint8_t x, uint8_t y);
  23. void canvas_box_draw(CanvasApi* api, uint8_t x, uint8_t y, uint8_t width, uint8_t height);
  24. void canvas_draw_frame(CanvasApi* api, uint8_t x, uint8_t y, uint8_t width, uint8_t height);
  25. void canvas_draw_line(CanvasApi* api, uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2);
  26. void canvas_draw_xbm(
  27. CanvasApi* canvas,
  28. uint8_t x,
  29. uint8_t y,
  30. uint8_t w,
  31. uint8_t h,
  32. const uint8_t* bitmap);
  33. void canvas_draw_glyph(CanvasApi* canvas, uint8_t x, uint8_t y, uint16_t ch);
  34. uint8_t u8g2_gpio_and_delay_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr);
  35. uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_ptr);
  36. CanvasApi* canvas_api_init() {
  37. Canvas* canvas = furi_alloc(sizeof(Canvas));
  38. u8g2_Setup_st7565_erc12864_alt_f(
  39. &canvas->fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32);
  40. // send init sequence to the display, display is in sleep mode after this
  41. u8g2_InitDisplay(&canvas->fb);
  42. u8g2_SetContrast(&canvas->fb, 36);
  43. u8g2_SetPowerSave(&canvas->fb, 0); // wake up display
  44. u8g2_SendBuffer(&canvas->fb);
  45. canvas->api.width = canvas_width;
  46. canvas->api.height = canvas_height;
  47. canvas->api.clear = canvas_clear;
  48. canvas->api.set_color = canvas_color_set;
  49. canvas->api.set_font = canvas_font_set;
  50. canvas->api.draw_str = canvas_str_draw;
  51. canvas->api.draw_icon = canvas_icon_draw;
  52. canvas->api.draw_dot = canvas_dot_draw;
  53. canvas->api.draw_box = canvas_box_draw;
  54. canvas->api.draw_frame = canvas_draw_frame;
  55. canvas->api.draw_line = canvas_draw_line;
  56. canvas->api.draw_xbm = canvas_draw_xbm;
  57. canvas->api.draw_glyph = canvas_draw_glyph;
  58. return (CanvasApi*)canvas;
  59. }
  60. void canvas_api_free(CanvasApi* api) {
  61. furi_assert(api);
  62. free(api);
  63. }
  64. void canvas_reset(CanvasApi* api) {
  65. assert(api);
  66. canvas_color_set(api, ColorBlack);
  67. canvas_font_set(api, FontSecondary);
  68. }
  69. void canvas_commit(CanvasApi* api) {
  70. furi_assert(api);
  71. Canvas* canvas = (Canvas*)api;
  72. u8g2_SetPowerSave(&canvas->fb, 0); // wake up display
  73. u8g2_SendBuffer(&canvas->fb);
  74. }
  75. void canvas_frame_set(
  76. CanvasApi* api,
  77. uint8_t offset_x,
  78. uint8_t offset_y,
  79. uint8_t width,
  80. uint8_t height) {
  81. furi_assert(api);
  82. Canvas* canvas = (Canvas*)api;
  83. canvas->offset_x = offset_x;
  84. canvas->offset_y = offset_y;
  85. canvas->width = width;
  86. canvas->height = height;
  87. }
  88. uint8_t canvas_width(CanvasApi* api) {
  89. furi_assert(api);
  90. Canvas* canvas = (Canvas*)api;
  91. return canvas->width;
  92. }
  93. uint8_t canvas_height(CanvasApi* api) {
  94. furi_assert(api);
  95. Canvas* canvas = (Canvas*)api;
  96. return canvas->height;
  97. }
  98. void canvas_clear(CanvasApi* api) {
  99. furi_assert(api);
  100. Canvas* canvas = (Canvas*)api;
  101. u8g2_ClearBuffer(&canvas->fb);
  102. }
  103. void canvas_color_set(CanvasApi* api, Color color) {
  104. furi_assert(api);
  105. Canvas* canvas = (Canvas*)api;
  106. u8g2_SetDrawColor(&canvas->fb, color);
  107. }
  108. void canvas_font_set(CanvasApi* api, Font font) {
  109. furi_assert(api);
  110. Canvas* canvas = (Canvas*)api;
  111. u8g2_SetFontMode(&canvas->fb, 1);
  112. if(font == FontPrimary) {
  113. u8g2_SetFont(&canvas->fb, u8g2_font_helvB08_tf);
  114. } else if(font == FontSecondary) {
  115. u8g2_SetFont(&canvas->fb, u8g2_font_haxrcorp4089_tr);
  116. } else if(font == FontGlyph) {
  117. u8g2_SetFont(&canvas->fb, u8g2_font_unifont_t_symbols);
  118. } else {
  119. furi_check(0);
  120. }
  121. }
  122. void canvas_str_draw(CanvasApi* api, uint8_t x, uint8_t y, const char* str) {
  123. furi_assert(api);
  124. if(!str) return;
  125. Canvas* canvas = (Canvas*)api;
  126. x += canvas->offset_x;
  127. y += canvas->offset_y;
  128. u8g2_DrawStr(&canvas->fb, x, y, str);
  129. }
  130. void canvas_icon_draw(CanvasApi* api, uint8_t x, uint8_t y, Icon* icon) {
  131. furi_assert(api);
  132. if(!icon) return;
  133. Canvas* canvas = (Canvas*)api;
  134. x += canvas->offset_x;
  135. y += canvas->offset_y;
  136. u8g2_DrawXBM(
  137. &canvas->fb, x, y, icon_get_width(icon), icon_get_height(icon), icon_get_data(icon));
  138. }
  139. void canvas_dot_draw(CanvasApi* api, uint8_t x, uint8_t y) {
  140. furi_assert(api);
  141. Canvas* canvas = (Canvas*)api;
  142. x += canvas->offset_x;
  143. y += canvas->offset_y;
  144. u8g2_DrawPixel(&canvas->fb, x, y);
  145. }
  146. void canvas_box_draw(CanvasApi* api, uint8_t x, uint8_t y, uint8_t width, uint8_t height) {
  147. furi_assert(api);
  148. Canvas* canvas = (Canvas*)api;
  149. x += canvas->offset_x;
  150. y += canvas->offset_y;
  151. u8g2_DrawBox(&canvas->fb, x, y, width, height);
  152. }
  153. void canvas_draw_frame(CanvasApi* api, uint8_t x, uint8_t y, uint8_t width, uint8_t height) {
  154. furi_assert(api);
  155. Canvas* canvas = (Canvas*)api;
  156. x += canvas->offset_x;
  157. y += canvas->offset_y;
  158. u8g2_DrawFrame(&canvas->fb, x, y, width, height);
  159. }
  160. void canvas_draw_line(CanvasApi* api, uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2) {
  161. furi_assert(api);
  162. Canvas* canvas = (Canvas*)api;
  163. x1 += canvas->offset_x;
  164. y1 += canvas->offset_y;
  165. x2 += canvas->offset_x;
  166. y2 += canvas->offset_y;
  167. u8g2_DrawLine(&canvas->fb, x1, y1, x2, y2);
  168. }
  169. void canvas_draw_xbm(
  170. CanvasApi* api,
  171. uint8_t x,
  172. uint8_t y,
  173. uint8_t w,
  174. uint8_t h,
  175. const uint8_t* bitmap) {
  176. furi_assert(api);
  177. Canvas* canvas = (Canvas*)api;
  178. x += canvas->offset_x;
  179. y += canvas->offset_y;
  180. u8g2_DrawXBM(&canvas->fb, x, y, w, h, bitmap);
  181. }
  182. void canvas_draw_glyph(CanvasApi* api, uint8_t x, uint8_t y, uint16_t ch) {
  183. furi_assert(api);
  184. Canvas* canvas = (Canvas*)api;
  185. x += canvas->offset_x;
  186. y += canvas->offset_y;
  187. u8g2_DrawGlyph(&canvas->fb, x, y, ch);
  188. }