blink.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <furi.h>
  2. #include <api-hal.h>
  3. #include <gui/gui.h>
  4. #include <input/input.h>
  5. typedef enum {
  6. EventTypeTick,
  7. EventTypeKey,
  8. } EventType;
  9. typedef struct {
  10. EventType type;
  11. InputEvent input;
  12. } BlinkEvent;
  13. void rgb_set(bool r, bool g, bool b) {
  14. api_hal_light_set(LightRed, r ? 0xFF : 0x00);
  15. api_hal_light_set(LightGreen, g ? 0xFF : 0x00);
  16. api_hal_light_set(LightBlue, b ? 0xFF : 0x00);
  17. }
  18. void blink_update(void* ctx) {
  19. furi_assert(ctx);
  20. osMessageQueueId_t event_queue = ctx;
  21. BlinkEvent event = {.type = EventTypeTick};
  22. osMessageQueuePut(event_queue, &event, 0, 0);
  23. }
  24. void blink_draw_callback(Canvas* canvas, void* ctx) {
  25. canvas_clear(canvas);
  26. canvas_set_font(canvas, FontPrimary);
  27. canvas_draw_str(canvas, 2, 10, "Blink application");
  28. }
  29. void blink_input_callback(InputEvent* input_event, void* ctx) {
  30. furi_assert(ctx);
  31. osMessageQueueId_t event_queue = ctx;
  32. BlinkEvent event = {.type = EventTypeKey, .input = *input_event};
  33. osMessageQueuePut(event_queue, &event, 0, 0);
  34. }
  35. int32_t application_blink(void* p) {
  36. osMessageQueueId_t event_queue = osMessageQueueNew(8, sizeof(BlinkEvent), NULL);
  37. // Configure view port
  38. ViewPort* view_port = view_port_alloc();
  39. furi_check(view_port);
  40. view_port_draw_callback_set(view_port, blink_draw_callback, NULL);
  41. view_port_input_callback_set(view_port, blink_input_callback, event_queue);
  42. osTimerId_t timer = osTimerNew(blink_update, osTimerPeriodic, event_queue, NULL);
  43. osTimerStart(timer, 500);
  44. // Register view port in GUI
  45. Gui* gui = furi_record_open("gui");
  46. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  47. bool blink_color[][3] = {
  48. {1, 0, 0},
  49. {0, 1, 0},
  50. {0, 0, 1},
  51. {1, 1, 0},
  52. {0, 1, 1},
  53. {1, 0, 1},
  54. {1, 1, 1},
  55. {0, 0, 0},
  56. };
  57. uint8_t state = 0;
  58. BlinkEvent event;
  59. while(1) {
  60. furi_check(osMessageQueueGet(event_queue, &event, NULL, osWaitForever) == osOK);
  61. if(event.type == EventTypeKey) {
  62. if((event.input.type == InputTypeShort) && (event.input.key == InputKeyBack)) {
  63. rgb_set(0, 0, 0);
  64. view_port_enabled_set(view_port, false);
  65. gui_remove_view_port(gui, view_port);
  66. view_port_free(view_port);
  67. osMessageQueueDelete(event_queue);
  68. osTimerDelete(timer);
  69. return 0;
  70. }
  71. } else {
  72. if(state < sizeof(blink_color) / sizeof(blink_color[0])) {
  73. state++;
  74. } else {
  75. state = 0;
  76. }
  77. rgb_set(blink_color[state][0], blink_color[state][1], blink_color[state][2]);
  78. }
  79. }
  80. return 0;
  81. }