Adding new Kconfig options and updating LEDManager code for conditional debug LED and external error mirroring

This commit is contained in:
PhosphorosVR
2025-09-07 12:59:18 +02:00
parent 909a2779ac
commit 6f926306b5
8 changed files with 635 additions and 48 deletions
+4 -1
View File
@@ -67,7 +67,7 @@ CONFIG_MONITORING_LED_GAIN=11
CONFIG_MONITORING_LED_SHUNT_MILLIOHM=22000 CONFIG_MONITORING_LED_SHUNT_MILLIOHM=22000
CONFIG_MONITORING_LED_SAMPLES=10 CONFIG_MONITORING_LED_SAMPLES=10
CONFIG_MONITORING_LED_INTERVAL_MS=500 CONFIG_MONITORING_LED_INTERVAL_MS=500
CONFIG_GENERAL_BOARD="facefocusvr_eye" CONFIG_GENERAL_BOARD="facefocusvr_eye_l"
# CONFIG_GENERAL_ENABLE_WIRELESS is not set # CONFIG_GENERAL_ENABLE_WIRELESS is not set
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80=y CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80=y
# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set # CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set
@@ -77,3 +77,6 @@ CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80=y
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=80 CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=80
# CONFIG_LED_DEBUG_ENABLE is not set
CONFIG_LED_EXTERNAL_AS_DEBUG=y
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye L"
+4 -1
View File
@@ -67,7 +67,7 @@ CONFIG_MONITORING_LED_GAIN=11
CONFIG_MONITORING_LED_SHUNT_MILLIOHM=22000 CONFIG_MONITORING_LED_SHUNT_MILLIOHM=22000
CONFIG_MONITORING_LED_SAMPLES=10 CONFIG_MONITORING_LED_SAMPLES=10
CONFIG_MONITORING_LED_INTERVAL_MS=500 CONFIG_MONITORING_LED_INTERVAL_MS=500
CONFIG_GENERAL_BOARD="facefocusvr_eye" CONFIG_GENERAL_BOARD="facefocusvr_eye_r"
# CONFIG_GENERAL_ENABLE_WIRELESS is not set # CONFIG_GENERAL_ENABLE_WIRELESS is not set
CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80=y CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80=y
# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set # CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set
@@ -77,3 +77,6 @@ CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80=y
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=80 CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=80
# CONFIG_LED_DEBUG_ENABLE is not set
CONFIG_LED_EXTERNAL_AS_DEBUG=y
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Eye R"
+3
View File
@@ -77,3 +77,6 @@ CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80=y
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set # CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240 is not set
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=80 CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=80
# CONFIG_LED_DEBUG_ENABLE is not set
CONFIG_LED_EXTERNAL_AS_DEBUG=y
CONFIG_GENERAL_ADVERTISED_NAME="FFVR Face"
@@ -73,10 +73,13 @@ LEDManager::LEDManager(gpio_num_t pin, gpio_num_t illumninator_led_pin,
void LEDManager::setup() void LEDManager::setup()
{ {
ESP_LOGI(LED_MANAGER_TAG, "Setting up status led."); ESP_LOGI(LED_MANAGER_TAG, "Setting up status led.");
#ifdef CONFIG_LED_DEBUG_ENABLE
gpio_reset_pin(blink_led_pin); gpio_reset_pin(blink_led_pin);
/* Set the GPIO as a push/pull output */
gpio_set_direction(blink_led_pin, GPIO_MODE_OUTPUT); gpio_set_direction(blink_led_pin, GPIO_MODE_OUTPUT);
this->toggleLED(LED_OFF); this->toggleLED(LED_OFF);
#else
ESP_LOGI(LED_MANAGER_TAG, "Debug LED disabled via Kconfig (LED_DEBUG_ENABLE=n)");
#endif
#ifdef CONFIG_LED_EXTERNAL_CONTROL #ifdef CONFIG_LED_EXTERNAL_CONTROL
ESP_LOGI(LED_MANAGER_TAG, "Setting up illuminator led."); ESP_LOGI(LED_MANAGER_TAG, "Setting up illuminator led.");
@@ -168,6 +171,31 @@ void LEDManager::updateState(const LEDStates_e newState)
if (newState == this->currentState) if (newState == this->currentState)
return; return;
// Handle external LED mirroring transitions (store/restore duty)
#if defined(CONFIG_LED_EXTERNAL_CONTROL) && defined(CONFIG_LED_EXTERNAL_AS_DEBUG)
bool wasError = ledStateMap[this->currentState].isError;
bool willBeError = ledStateMap[newState].isError;
if (!wasError && willBeError)
{
// store current duty once
if (!hasStoredExternalDuty)
{
storedExternalDuty = ledc_get_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);
hasStoredExternalDuty = true;
}
}
else if (wasError && !willBeError)
{
// restore duty
if (hasStoredExternalDuty)
{
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, storedExternalDuty));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
hasStoredExternalDuty = false;
}
}
#endif
this->currentState = newState; this->currentState = newState;
this->currentPatternIndex = 0; this->currentPatternIndex = 0;
this->finishedPattern = false; this->finishedPattern = false;
@@ -175,7 +203,20 @@ void LEDManager::updateState(const LEDStates_e newState)
void LEDManager::toggleLED(const bool state) const void LEDManager::toggleLED(const bool state) const
{ {
#ifdef CONFIG_LED_DEBUG_ENABLE
gpio_set_level(blink_led_pin, state); gpio_set_level(blink_led_pin, state);
#endif
#if defined(CONFIG_LED_EXTERNAL_CONTROL) && defined(CONFIG_LED_EXTERNAL_AS_DEBUG)
// Mirror only for error states
if (ledStateMap.contains(this->currentState) && ledStateMap.at(this->currentState).isError)
{
// For pattern ON use 50%, OFF use 0%
uint32_t duty = (state == LED_ON) ? ((50 * 255) / 100) : 0;
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, duty));
ESP_ERROR_CHECK_WITHOUT_ABORT(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
}
#endif
} }
void LEDManager::setExternalLEDDutyCycle(uint8_t dutyPercent) void LEDManager::setExternalLEDDutyCycle(uint8_t dutyPercent)
@@ -70,6 +70,11 @@ private:
size_t currentPatternIndex = 0; size_t currentPatternIndex = 0;
size_t timeToDelayFor = 100; size_t timeToDelayFor = 100;
bool finishedPattern = false; bool finishedPattern = false;
#if defined(CONFIG_LED_EXTERNAL_CONTROL) && defined(CONFIG_LED_EXTERNAL_AS_DEBUG)
mutable bool hasStoredExternalDuty = false;
mutable uint32_t storedExternalDuty = 0; // raw 0-255
#endif
}; };
void HandleLEDDisplayTask(void *pvParameter); void HandleLEDDisplayTask(void *pvParameter);
+19
View File
@@ -109,6 +109,14 @@ endmenu
menu "OpenIris: LED Configuration" menu "OpenIris: LED Configuration"
config LED_DEBUG_ENABLE
bool "Enable debug/status LED"
default y
help
When disabled the firmware will not drive the dedicated debug/status GPIO.
Useful on boards without a discrete status LED. Error/state patterns can
optionally be mirrored onto the external IR LED if LED_EXTERNAL_AS_DEBUG is set.
config LED_DEBUG_GPIO config LED_DEBUG_GPIO
int "Debug LED GPIO number" int "Debug LED GPIO number"
range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
@@ -130,6 +138,17 @@ menu "OpenIris: LED Configuration"
help help
Enable this if your board can control external IR LEDs. Enable this if your board can control external IR LEDs.
config LED_EXTERNAL_AS_DEBUG
bool "Mirror error pattern on external LED"
depends on LED_EXTERNAL_CONTROL
default n
help
When enabled and an error LED pattern is active, the external IR LED PWM output
will blink (0% / 50% duty) to replicate the debug/status LED pattern. If
LED_DEBUG_ENABLE is disabled this provides visual error feedback using only
the external LED. Normal configured PWM brightness is restored when leaving
the error pattern.
config LED_EXTERNAL_PWM_FREQ config LED_EXTERNAL_PWM_FREQ
int "External LED PWM frequency (Hz)" int "External LED PWM frequency (Hz)"
default 5000 default 5000
+5
View File
@@ -28,7 +28,12 @@
#include <UVCStream.hpp> #include <UVCStream.hpp>
#endif #endif
#ifdef CONFIG_LED_DEBUG_ENABLE
#define BLINK_GPIO (gpio_num_t) CONFIG_LED_DEBUG_GPIO #define BLINK_GPIO (gpio_num_t) CONFIG_LED_DEBUG_GPIO
#else
// Use an invalid / unused GPIO when debug LED disabled to avoid accidental toggles
#define BLINK_GPIO (gpio_num_t) -1
#endif
#define CONFIG_LED_C_PIN_GPIO (gpio_num_t) CONFIG_LED_EXTERNAL_GPIO #define CONFIG_LED_C_PIN_GPIO (gpio_num_t) CONFIG_LED_EXTERNAL_GPIO
TaskHandle_t serialManagerHandle; TaskHandle_t serialManagerHandle;
+550 -42
View File
File diff suppressed because it is too large Load Diff