diff options
Diffstat (limited to 'main/main.c')
| -rw-r--r-- | main/main.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/main/main.c b/main/main.c new file mode 100644 index 0000000..36e7ed9 --- /dev/null +++ b/main/main.c @@ -0,0 +1,71 @@ +#include <freertos/FreeRTOS.h> +#include <freertos/task.h> +#include <freertos/queue.h> + +#include <driver/gpio.h> +#include <esp_log.h> + +#include "epd.h" +#include "util.h" +#include "pocorgtfo21.h" + +#define IO_PG_PREV GPIO_NUM_21 +#define IO_PG_NEXT GPIO_NUM_22 +#define IO_INTR_FLAG_DEFAULT 0 + +static const char* TAG = "app"; + +static size_t page = 0; +static QueueHandle_t gpio_evt_queue = NULL; + +static void gpio_task(void* arg) +{ + uint32_t io_num; + + for(;;) { + if(xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { + if (io_num == IO_PG_NEXT && page < data_len - 1) + epd_draw(data[++page]); + else if (io_num == IO_PG_PREV && page > 0) + epd_draw(data[--page]); + else + delay_ms(500); + gpio_intr_enable(IO_PG_NEXT); + gpio_intr_enable(IO_PG_PREV); + } + } +} + +static void gpio_isr_handler(void *arg) +{ + gpio_intr_disable(IO_PG_PREV); + gpio_intr_disable(IO_PG_NEXT); + uint32_t gpio_num = (uint32_t) arg; + xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); +} + +void app_main(void) +{ + epd_init(); + ESP_LOGI(TAG, "initialized e-paper display"); + + gpio_config_t io_cfg = { + .pin_bit_mask = ((1ULL << IO_PG_PREV) | (1ULL << IO_PG_NEXT)), + .mode = GPIO_MODE_INPUT, + .pull_up_en = true, + .intr_type = GPIO_INTR_NEGEDGE + }; + ESP_ERROR_CHECK(gpio_config(&io_cfg)); + + gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t)); + xTaskCreate(gpio_task, "gpio_task", 2048, NULL, 10, NULL); + + gpio_install_isr_service(IO_INTR_FLAG_DEFAULT); + gpio_isr_handler_add(IO_PG_PREV, gpio_isr_handler, (void *) IO_PG_PREV); + gpio_isr_handler_add(IO_PG_NEXT, gpio_isr_handler, (void *) IO_PG_NEXT); + + epd_clear(); + delay_ms(500); + epd_draw(data[0]); +} + |
