| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include "gpio_test.h"
- #include "../gpio_item.h"
- #include <gui/elements.h>
- struct GpioTest {
- View* view;
- GpioTestOkCallback callback;
- void* context;
- };
- typedef struct {
- uint8_t pin_idx;
- } GpioTestModel;
- static bool gpio_test_process_left(GpioTest* gpio_test);
- static bool gpio_test_process_right(GpioTest* gpio_test);
- static bool gpio_test_process_ok(GpioTest* gpio_test, InputEvent* event);
- static void gpio_test_draw_callback(Canvas* canvas, void* _model) {
- GpioTestModel* model = _model;
- canvas_set_font(canvas, FontPrimary);
- elements_multiline_text_aligned(canvas, 64, 2, AlignCenter, AlignTop, "GPIO Output Mode Test");
- canvas_set_font(canvas, FontSecondary);
- elements_multiline_text_aligned(
- canvas, 64, 16, AlignCenter, AlignTop, "Press < or > to change pin");
- elements_multiline_text_aligned(
- canvas, 64, 32, AlignCenter, AlignTop, gpio_item_get_pin_name(model->pin_idx));
- }
- static bool gpio_test_input_callback(InputEvent* event, void* context) {
- furi_assert(context);
- GpioTest* gpio_test = context;
- bool consumed = false;
- if(event->type == InputTypeShort) {
- if(event->key == InputKeyRight) {
- consumed = gpio_test_process_right(gpio_test);
- } else if(event->key == InputKeyLeft) {
- consumed = gpio_test_process_left(gpio_test);
- }
- } else if(event->key == InputKeyOk) {
- consumed = gpio_test_process_ok(gpio_test, event);
- }
- return consumed;
- }
- static bool gpio_test_process_left(GpioTest* gpio_test) {
- with_view_model(
- gpio_test->view,
- GpioTestModel * model,
- {
- if(model->pin_idx) {
- model->pin_idx--;
- }
- },
- true);
- return true;
- }
- static bool gpio_test_process_right(GpioTest* gpio_test) {
- with_view_model(
- gpio_test->view,
- GpioTestModel * model,
- {
- if(model->pin_idx < GPIO_ITEM_COUNT) {
- model->pin_idx++;
- }
- },
- true);
- return true;
- }
- static bool gpio_test_process_ok(GpioTest* gpio_test, InputEvent* event) {
- bool consumed = false;
- with_view_model(
- gpio_test->view,
- GpioTestModel * model,
- {
- if(event->type == InputTypePress) {
- if(model->pin_idx < GPIO_ITEM_COUNT) {
- gpio_item_set_pin(model->pin_idx, true);
- } else {
- gpio_item_set_all_pins(true);
- }
- consumed = true;
- } else if(event->type == InputTypeRelease) {
- if(model->pin_idx < GPIO_ITEM_COUNT) {
- gpio_item_set_pin(model->pin_idx, false);
- } else {
- gpio_item_set_all_pins(false);
- }
- consumed = true;
- }
- gpio_test->callback(event->type, gpio_test->context);
- },
- true);
- return consumed;
- }
- GpioTest* gpio_test_alloc() {
- GpioTest* gpio_test = malloc(sizeof(GpioTest));
- gpio_test->view = view_alloc();
- view_allocate_model(gpio_test->view, ViewModelTypeLocking, sizeof(GpioTestModel));
- view_set_context(gpio_test->view, gpio_test);
- view_set_draw_callback(gpio_test->view, gpio_test_draw_callback);
- view_set_input_callback(gpio_test->view, gpio_test_input_callback);
- return gpio_test;
- }
- void gpio_test_free(GpioTest* gpio_test) {
- furi_assert(gpio_test);
- view_free(gpio_test->view);
- free(gpio_test);
- }
- View* gpio_test_get_view(GpioTest* gpio_test) {
- furi_assert(gpio_test);
- return gpio_test->view;
- }
- void gpio_test_set_ok_callback(GpioTest* gpio_test, GpioTestOkCallback callback, void* context) {
- furi_assert(gpio_test);
- furi_assert(callback);
- with_view_model(
- gpio_test->view,
- GpioTestModel * model,
- {
- UNUSED(model);
- gpio_test->callback = callback;
- gpio_test->context = context;
- },
- false);
- }
|