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

View File

@@ -67,7 +67,7 @@ CONFIG_MONITORING_LED_GAIN=11
CONFIG_MONITORING_LED_SHUNT_MILLIOHM=22000
CONFIG_MONITORING_LED_SAMPLES=10
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_ESP_DEFAULT_CPU_FREQ_MHZ_80=y
# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set
@@ -76,4 +76,7 @@ CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=80
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80=y
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 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"

View File

@@ -67,7 +67,7 @@ CONFIG_MONITORING_LED_GAIN=11
CONFIG_MONITORING_LED_SHUNT_MILLIOHM=22000
CONFIG_MONITORING_LED_SAMPLES=10
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_ESP_DEFAULT_CPU_FREQ_MHZ_80=y
# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set
@@ -76,4 +76,7 @@ CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=80
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80=y
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 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"

View File

@@ -76,4 +76,7 @@ CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=80
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80=y
# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 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"

View File

@@ -73,10 +73,13 @@ LEDManager::LEDManager(gpio_num_t pin, gpio_num_t illumninator_led_pin,
void LEDManager::setup()
{
ESP_LOGI(LED_MANAGER_TAG, "Setting up status led.");
#ifdef CONFIG_LED_DEBUG_ENABLE
gpio_reset_pin(blink_led_pin);
/* Set the GPIO as a push/pull output */
gpio_set_direction(blink_led_pin, GPIO_MODE_OUTPUT);
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
ESP_LOGI(LED_MANAGER_TAG, "Setting up illuminator led.");
@@ -168,6 +171,31 @@ void LEDManager::updateState(const LEDStates_e newState)
if (newState == this->currentState)
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->currentPatternIndex = 0;
this->finishedPattern = false;
@@ -175,7 +203,20 @@ void LEDManager::updateState(const LEDStates_e newState)
void LEDManager::toggleLED(const bool state) const
{
#ifdef CONFIG_LED_DEBUG_ENABLE
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)

View File

@@ -70,6 +70,11 @@ private:
size_t currentPatternIndex = 0;
size_t timeToDelayFor = 100;
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);

View File

@@ -109,6 +109,14 @@ endmenu
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
int "Debug LED GPIO number"
range ENV_GPIO_RANGE_MIN ENV_GPIO_OUT_RANGE_MAX
@@ -130,6 +138,17 @@ menu "OpenIris: LED Configuration"
help
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
int "External LED PWM frequency (Hz)"
default 5000

View File

@@ -28,7 +28,12 @@
#include <UVCStream.hpp>
#endif
#ifdef CONFIG_LED_DEBUG_ENABLE
#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
TaskHandle_t serialManagerHandle;

592
sdkconfig

File diff suppressed because it is too large Load Diff