example_images.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include <gui/gui.h>
  4. #include <input/input.h>
  5. /* Magic happens here -- this file is generated by fbt.
  6. * Just set fap_icon_assets in application.fam and #include {APPID}_icons.h */
  7. #include "example_images_icons.h"
  8. typedef struct {
  9. uint8_t x, y;
  10. } ImagePosition;
  11. static ImagePosition image_position = {.x = 0, .y = 0};
  12. // Screen is 128x64 px
  13. static void app_draw_callback(Canvas* canvas, void* ctx) {
  14. UNUSED(ctx);
  15. canvas_clear(canvas);
  16. canvas_draw_icon(canvas, image_position.x % 128, image_position.y % 64, &I_dolphin_71x25);
  17. }
  18. static void app_input_callback(InputEvent* input_event, void* ctx) {
  19. furi_assert(ctx);
  20. FuriMessageQueue* event_queue = ctx;
  21. furi_message_queue_put(event_queue, input_event, FuriWaitForever);
  22. }
  23. int32_t example_images_main(void* p) {
  24. UNUSED(p);
  25. FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent));
  26. // Configure view port
  27. ViewPort* view_port = view_port_alloc();
  28. view_port_draw_callback_set(view_port, app_draw_callback, view_port);
  29. view_port_input_callback_set(view_port, app_input_callback, event_queue);
  30. // Register view port in GUI
  31. Gui* gui = furi_record_open(RECORD_GUI);
  32. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  33. InputEvent event;
  34. bool running = true;
  35. while(running) {
  36. if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) {
  37. if((event.type == InputTypePress) || (event.type == InputTypeRepeat)) {
  38. switch(event.key) {
  39. case InputKeyLeft:
  40. image_position.x -= 2;
  41. break;
  42. case InputKeyRight:
  43. image_position.x += 2;
  44. break;
  45. case InputKeyUp:
  46. image_position.y -= 2;
  47. break;
  48. case InputKeyDown:
  49. image_position.y += 2;
  50. break;
  51. default:
  52. running = false;
  53. break;
  54. }
  55. }
  56. }
  57. view_port_update(view_port);
  58. }
  59. view_port_enabled_set(view_port, false);
  60. gui_remove_view_port(gui, view_port);
  61. view_port_free(view_port);
  62. furi_message_queue_free(event_queue);
  63. furi_record_close(RECORD_GUI);
  64. return 0;
  65. }