blink_test.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "furi/common_defines.h"
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #include <gui/gui.h>
  5. #include <input/input.h>
  6. #include <notification/notification_messages.h>
  7. typedef enum {
  8. BlinkEventTypeTick,
  9. BlinkEventTypeInput,
  10. } BlinkEventType;
  11. typedef struct {
  12. BlinkEventType type;
  13. InputEvent input;
  14. } BlinkEvent;
  15. static const NotificationSequence blink_test_sequence_hw_blink_start_red = {
  16. &message_blink_start_10,
  17. &message_blink_set_color_red,
  18. &message_do_not_reset,
  19. NULL,
  20. };
  21. static const NotificationSequence blink_test_sequence_hw_blink_green = {
  22. &message_blink_set_color_green,
  23. NULL,
  24. };
  25. static const NotificationSequence blink_test_sequence_hw_blink_blue = {
  26. &message_blink_set_color_blue,
  27. NULL,
  28. };
  29. static const NotificationSequence blink_test_sequence_hw_blink_stop = {
  30. &message_blink_stop,
  31. NULL,
  32. };
  33. static const NotificationSequence* blink_test_colors[] = {
  34. &sequence_blink_red_100,
  35. &sequence_blink_green_100,
  36. &sequence_blink_blue_100,
  37. &sequence_blink_yellow_100,
  38. &sequence_blink_cyan_100,
  39. &sequence_blink_magenta_100,
  40. &sequence_blink_white_100,
  41. &blink_test_sequence_hw_blink_start_red,
  42. &blink_test_sequence_hw_blink_green,
  43. &blink_test_sequence_hw_blink_blue,
  44. &blink_test_sequence_hw_blink_stop,
  45. };
  46. static void blink_test_update(void* ctx) {
  47. furi_assert(ctx);
  48. osMessageQueueId_t event_queue = ctx;
  49. BlinkEvent event = {.type = BlinkEventTypeTick};
  50. // It's OK to loose this event if system overloaded
  51. osMessageQueuePut(event_queue, &event, 0, 0);
  52. }
  53. static void blink_test_draw_callback(Canvas* canvas, void* ctx) {
  54. UNUSED(ctx);
  55. canvas_clear(canvas);
  56. canvas_set_font(canvas, FontPrimary);
  57. canvas_draw_str(canvas, 2, 10, "Blink application");
  58. }
  59. static void blink_test_input_callback(InputEvent* input_event, void* ctx) {
  60. furi_assert(ctx);
  61. osMessageQueueId_t event_queue = ctx;
  62. BlinkEvent event = {.type = BlinkEventTypeInput, .input = *input_event};
  63. osMessageQueuePut(event_queue, &event, 0, osWaitForever);
  64. }
  65. int32_t blink_test_app(void* p) {
  66. UNUSED(p);
  67. osMessageQueueId_t event_queue = osMessageQueueNew(8, sizeof(BlinkEvent), NULL);
  68. // Configure view port
  69. ViewPort* view_port = view_port_alloc();
  70. view_port_draw_callback_set(view_port, blink_test_draw_callback, NULL);
  71. view_port_input_callback_set(view_port, blink_test_input_callback, event_queue);
  72. osTimerId_t timer = osTimerNew(blink_test_update, osTimerPeriodic, event_queue, NULL);
  73. osTimerStart(timer, osKernelGetTickFreq());
  74. // Register view port in GUI
  75. Gui* gui = furi_record_open("gui");
  76. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  77. NotificationApp* notifications = furi_record_open("notification");
  78. uint8_t state = 0;
  79. BlinkEvent event;
  80. while(1) {
  81. furi_check(osMessageQueueGet(event_queue, &event, NULL, osWaitForever) == osOK);
  82. if(event.type == BlinkEventTypeInput) {
  83. if((event.input.type == InputTypeShort) && (event.input.key == InputKeyBack)) {
  84. break;
  85. }
  86. } else {
  87. notification_message(notifications, blink_test_colors[state]);
  88. state++;
  89. if(state >= COUNT_OF(blink_test_colors)) {
  90. state = 0;
  91. }
  92. }
  93. }
  94. notification_message(notifications, &blink_test_sequence_hw_blink_stop);
  95. osTimerDelete(timer);
  96. gui_remove_view_port(gui, view_port);
  97. view_port_free(view_port);
  98. osMessageQueueDelete(event_queue);
  99. furi_record_close("notification");
  100. furi_record_close("gui");
  101. return 0;
  102. }