gpio-tester.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include <furi.h>
  2. #include <furi-hal.h>
  3. #include <gui/gui.h>
  4. #include <notification/notification-messages.h>
  5. typedef struct {
  6. const char* name;
  7. const GpioPin* pin;
  8. } GpioItem;
  9. static const GpioItem GPIO_PINS[] = {
  10. {"1.2: PA7", &gpio_ext_pa7},
  11. {"1.3: PA6", &gpio_ext_pa6},
  12. {"1.4: PA4", &gpio_ext_pa4},
  13. {"1.5: PB3", &gpio_ext_pb3},
  14. {"1.6: PB2", &gpio_ext_pb2},
  15. {"1.7: PC3", &gpio_ext_pc3},
  16. {"2.7: PC1", &gpio_ext_pc1},
  17. {"2.8: PC0", &gpio_ext_pc0},
  18. };
  19. static const size_t GPIO_PINS_COUNT = sizeof(GPIO_PINS) / sizeof(GPIO_PINS[0]);
  20. typedef struct {
  21. osMessageQueueId_t input_queue;
  22. uint8_t gpio_index;
  23. ViewPort* view_port;
  24. Gui* gui;
  25. NotificationApp* notification;
  26. } GpioTest;
  27. static void gpio_test_render_callback(Canvas* canvas, void* ctx) {
  28. GpioTest* gpio_test = ctx;
  29. canvas_clear(canvas);
  30. canvas_set_color(canvas, ColorBlack);
  31. canvas_set_font(canvas, FontPrimary);
  32. canvas_draw_str(canvas, 2, 10, "GPIO Control");
  33. canvas_set_font(canvas, FontSecondary);
  34. canvas_draw_str(canvas, 2, 25, GPIO_PINS[gpio_test->gpio_index].name);
  35. }
  36. static void gpio_test_input_callback(InputEvent* input_event, void* ctx) {
  37. GpioTest* gpio_test = ctx;
  38. osMessageQueuePut(gpio_test->input_queue, input_event, 0, 0);
  39. }
  40. static void gpio_test_configure_pins(GpioMode mode) {
  41. for(size_t i = 0; i < GPIO_PINS_COUNT; i++) {
  42. hal_gpio_write(GPIO_PINS[i].pin, false);
  43. hal_gpio_init(GPIO_PINS[i].pin, mode, GpioPullNo, GpioSpeedLow);
  44. }
  45. }
  46. GpioTest* gpio_test_alloc() {
  47. GpioTest* instance = furi_alloc(sizeof(GpioTest));
  48. gpio_test_configure_pins(GpioModeOutputPushPull);
  49. instance->input_queue = osMessageQueueNew(8, sizeof(InputEvent), NULL);
  50. furi_check(instance->input_queue);
  51. instance->view_port = view_port_alloc();
  52. view_port_draw_callback_set(instance->view_port, gpio_test_render_callback, instance);
  53. view_port_input_callback_set(instance->view_port, gpio_test_input_callback, instance);
  54. instance->gui = furi_record_open("gui");
  55. gui_add_view_port(instance->gui, instance->view_port, GuiLayerFullscreen);
  56. instance->notification = furi_record_open("notification");
  57. return instance;
  58. }
  59. void gpio_test_free(GpioTest* instance) {
  60. furi_assert(instance);
  61. furi_record_close("notification");
  62. view_port_enabled_set(instance->view_port, false);
  63. gui_remove_view_port(instance->gui, instance->view_port);
  64. furi_record_close("gui");
  65. view_port_free(instance->view_port);
  66. osMessageQueueDelete(instance->input_queue);
  67. gpio_test_configure_pins(GpioModeAnalog);
  68. free(instance);
  69. }
  70. int32_t gpio_test_app(void* p) {
  71. GpioTest* gpio_test = gpio_test_alloc();
  72. InputEvent event;
  73. while(osMessageQueueGet(gpio_test->input_queue, &event, NULL, osWaitForever) == osOK) {
  74. if(event.type == InputTypeShort) {
  75. if(event.key == InputKeyBack) {
  76. notification_message(gpio_test->notification, &sequence_reset_green);
  77. break;
  78. }
  79. if(event.key == InputKeyRight) {
  80. if(gpio_test->gpio_index < (GPIO_PINS_COUNT - 1)) {
  81. gpio_test->gpio_index++;
  82. }
  83. }
  84. if(event.key == InputKeyLeft) {
  85. if(gpio_test->gpio_index > 0) {
  86. gpio_test->gpio_index--;
  87. }
  88. }
  89. } else {
  90. if(event.key == InputKeyOk) {
  91. if(event.type == InputTypePress) {
  92. hal_gpio_write(GPIO_PINS[gpio_test->gpio_index].pin, true);
  93. notification_message(gpio_test->notification, &sequence_set_green_255);
  94. } else if(event.type == InputTypeRelease) {
  95. hal_gpio_write(GPIO_PINS[gpio_test->gpio_index].pin, false);
  96. notification_message(gpio_test->notification, &sequence_reset_green);
  97. }
  98. }
  99. }
  100. view_port_update(gpio_test->view_port);
  101. }
  102. gpio_test_free(gpio_test);
  103. return 0;
  104. }