/* * This file is part of the Pico Keys SDK distribution (https://github.com/polhenarejos/pico-keys-sdk). * Copyright (c) 2022 Pol Henarejos. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "pico_keys.h" #ifdef PICO_PLATFORM #include "bsp/board.h" #elif defined(ESP_PLATFORM) #include "esp_compat.h" #elif defined(ENABLE_EMULATION) #include "emulation.h" #endif led_driver_t *led_driver = NULL; static uint32_t led_mode = MODE_NOT_MOUNTED; void led_set_mode(uint32_t mode) { led_mode = mode; } uint32_t led_get_mode() { return led_mode; } void led_blinking_task() { #ifndef ENABLE_EMULATION static uint32_t start_ms = 0; static uint32_t stop_ms = 0; static uint32_t last_led_update_ms = 0; static uint8_t led_state = false; uint8_t state = led_state; #ifdef PICO_DEFAULT_LED_PIN_INVERTED state = !state; #endif uint32_t led_brightness = (led_mode & LED_BTNESS_MASK) >> LED_BTNESS_SHIFT; uint32_t led_color = (led_mode & LED_COLOR_MASK) >> LED_COLOR_SHIFT; uint32_t led_off = (led_mode & LED_OFF_MASK) >> LED_OFF_SHIFT; uint32_t led_on = (led_mode & LED_ON_MASK) >> LED_ON_SHIFT; float progress = 0; if (stop_ms > start_ms) { progress = (float)(board_millis() - start_ms) / (stop_ms - start_ms); } if (!state) { progress = 1. - progress; } if (phy_data.opts & PHY_OPT_LED_STEADY) { progress = 1; } // limit the frequency of LED status updates if (board_millis() - last_led_update_ms > 2) { led_driver->set_color(led_color, led_brightness, progress); last_led_update_ms = board_millis(); } if (board_millis() >= stop_ms){ start_ms = stop_ms; led_state ^= 1; // toggle stop_ms = start_ms + (led_state ? led_on : led_off); } #endif } void led_off_all() { #ifndef ENABLE_EMULATION led_driver->set_color(LED_COLOR_OFF, 0, 0); #endif } extern led_driver_t led_driver_pico; extern led_driver_t led_driver_cyw43; extern led_driver_t led_driver_ws2812; extern led_driver_t led_driver_neopixel; extern led_driver_t led_driver_pimoroni; void led_init() { #ifndef ENABLE_EMULATION # // Guess default driver #ifdef PICO_DEFAULT_LED_PIN led_driver = &led_driver_pico; #elif defined(CYW43_WL_GPIO_LED_PIN) led_driver = &led_driver_cyw43; #elif defined(PICO_DEFAULT_WS2812_PIN) led_driver = &led_driver_ws2812; #elif defined(ESP_PLATFORM) led_driver = &led_driver_neopixel; #elif defined(PIMORONI_TINY2040) || defined(PIMORONI_TINY2350) led_driver = &led_driver_pimoroni; #endif if (phy_data.led_driver_present) { switch (phy_data.led_driver) { #ifdef ESP_PLATFORM case PHY_LED_DRIVER_NEOPIXEL: led_driver = &led_driver_neopixel; break; #else case PHY_LED_DRIVER_PICO: led_driver = &led_driver_pico; break; #ifdef CYW43_WL_GPIO_LED_PIN case PHY_LED_DRIVER_CYW43: led_driver = &led_driver_cyw43; break; #endif case PHY_LED_DRIVER_WS2812: led_driver = &led_driver_ws2812; break; case PHY_LED_DRIVER_PIMORONI: led_driver = &led_driver_pimoroni; break; #endif default: break; } } led_driver->init(); led_set_mode(MODE_NOT_MOUNTED); #endif }