elemes/velxio-deployer-firmware/main/led_button.c

124 lines
3.1 KiB
C

#include "esp_log.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#include "led_button.h"
static const char *TAG = "LED_BTN";
static led_pattern_t current_pattern = LED_OFF;
static bool button_previous_state = true;
static bool button_pressed_flag = false;
static int64_t last_toggle_time = 0;
static bool blink_state = false;
static void set_led(bool red, bool green, bool blue)
{
gpio_set_level(LED_GPIO_RED, red ? 1 : 0);
gpio_set_level(LED_GPIO_GREEN, green ? 1 : 0);
gpio_set_level(LED_GPIO_BLUE, blue ? 1 : 0);
}
void led_button_init(void)
{
gpio_set_direction(LED_GPIO_RED, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_GPIO_GREEN, GPIO_MODE_OUTPUT);
gpio_set_direction(LED_GPIO_BLUE, GPIO_MODE_OUTPUT);
gpio_set_direction(BTN_GPIO_RETRY, GPIO_MODE_INPUT);
gpio_set_pull_mode(BTN_GPIO_RETRY, GPIO_PULLUP_ONLY);
set_led(false, false, false);
button_previous_state = gpio_get_level(BTN_GPIO_RETRY);
ESP_LOGI(TAG, "LED + Button initialized");
}
void led_set_pattern(led_pattern_t pattern)
{
current_pattern = pattern;
switch (pattern) {
case LED_OFF:
set_led(false, false, false);
break;
case LED_GREEN:
set_led(false, true, false);
break;
case LED_RED:
set_led(true, false, false);
break;
case LED_BLUE:
set_led(false, false, true);
break;
case LED_GREEN_BLINK:
case LED_RED_BLINK:
case LED_BLUE_BLINK:
case LED_BLUE_BLINK_SLOW:
case LED_BLUE_BLINK_FAST:
/* Toggle handled by led_button_tick(). Start off. */
blink_state = false;
last_toggle_time = esp_timer_get_time() / 1000;
set_led(false, false, false);
break;
}
}
bool button_retry_pressed(void)
{
bool current = gpio_get_level(BTN_GPIO_RETRY);
if (button_previous_state && !current) {
button_previous_state = current;
ESP_LOGI(TAG, "Retry button pressed");
return true;
}
button_previous_state = current;
return false;
}
void led_button_tick(void)
{
if (current_pattern != LED_GREEN_BLINK &&
current_pattern != LED_RED_BLINK &&
current_pattern != LED_BLUE_BLINK &&
current_pattern != LED_BLUE_BLINK_SLOW &&
current_pattern != LED_BLUE_BLINK_FAST) {
return;
}
int64_t now = esp_timer_get_time() / 1000;
int64_t interval = 200;
switch (current_pattern) {
case LED_RED_BLINK:
case LED_BLUE_BLINK_FAST:
interval = 100;
break;
case LED_BLUE_BLINK_SLOW:
interval = 1000;
break;
default:
break;
}
if (now - last_toggle_time >= interval) {
last_toggle_time = now;
blink_state = !blink_state;
switch (current_pattern) {
case LED_BLUE_BLINK:
case LED_BLUE_BLINK_SLOW:
case LED_BLUE_BLINK_FAST:
set_led(false, false, blink_state);
break;
case LED_RED_BLINK:
set_led(blink_state, false, false);
break;
case LED_GREEN_BLINK:
set_led(false, blink_state, false);
break;
default:
break;
}
}
}