Compare commits
2 Commits
1012d3bb2f
...
d33bda52d0
| Author | SHA1 | Date | |
|---|---|---|---|
| d33bda52d0 | |||
| 0dd26fdcde |
@ -11,6 +11,7 @@
|
|||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "nvs_flash.h"
|
#include "nvs_flash.h"
|
||||||
#include "nvs.h"
|
#include "nvs.h"
|
||||||
|
#include "soc/gpio_num.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -26,6 +27,7 @@ static const char *TAG = "CONFIG";
|
|||||||
#define HARDCODED_CONFIG_LED_STRIP_A_COUNT 7U
|
#define HARDCODED_CONFIG_LED_STRIP_A_COUNT 7U
|
||||||
#define HARDCODED_CONFIG_LED_STRIP_B_COUNT 7U
|
#define HARDCODED_CONFIG_LED_STRIP_B_COUNT 7U
|
||||||
#define HARDCODED_CONFIG_PWM_PIN 13U
|
#define HARDCODED_CONFIG_PWM_PIN 13U
|
||||||
|
#define HARDCODED_CONFIG_LOCALBTN_PIN GPIO_NUM_0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Global state
|
// Global state
|
||||||
@ -35,6 +37,7 @@ static config_t current_config = {
|
|||||||
.led_count_strip_a = -1,
|
.led_count_strip_a = -1,
|
||||||
.led_count_strip_b = -1,
|
.led_count_strip_b = -1,
|
||||||
.pwm_pin = -1,
|
.pwm_pin = -1,
|
||||||
|
.localBtn_pin = -1,
|
||||||
.magic = CONFIG_MAGIC};
|
.magic = CONFIG_MAGIC};
|
||||||
|
|
||||||
// NVS Functions
|
// NVS Functions
|
||||||
@ -61,7 +64,10 @@ static esp_err_t load_config_from_nvs(void)
|
|||||||
ESP_LOGI(TAG, "Loaded config from NVS");
|
ESP_LOGI(TAG, "Loaded config from NVS");
|
||||||
ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a);
|
ESP_LOGI(TAG, " Strip A: GPIO%d", current_config.led_pin_strip_a);
|
||||||
ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b);
|
ESP_LOGI(TAG, " Strip B: GPIO%d", current_config.led_pin_strip_b);
|
||||||
|
ESP_LOGI(TAG, " Strip A LED count: %d", current_config.led_count_strip_a);
|
||||||
|
ESP_LOGI(TAG, " Strip B LED count: %d", current_config.led_count_strip_b);
|
||||||
ESP_LOGI(TAG, " PWM Pin: GPIO%d", current_config.pwm_pin);
|
ESP_LOGI(TAG, " PWM Pin: GPIO%d", current_config.pwm_pin);
|
||||||
|
ESP_LOGI(TAG, " Local btn Pin: GPIO%d", current_config.localBtn_pin);
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
@ -103,6 +109,7 @@ esp_err_t config_reset_config(void)
|
|||||||
current_config.led_count_strip_a = -1;
|
current_config.led_count_strip_a = -1;
|
||||||
current_config.led_count_strip_b = -1;
|
current_config.led_count_strip_b = -1;
|
||||||
current_config.pwm_pin = -1;
|
current_config.pwm_pin = -1;
|
||||||
|
current_config.localBtn_pin = -1;
|
||||||
current_config.magic = CONFIG_MAGIC;
|
current_config.magic = CONFIG_MAGIC;
|
||||||
|
|
||||||
return save_config_to_nvs();
|
return save_config_to_nvs();
|
||||||
@ -115,6 +122,7 @@ void config_get_config(config_t *const cnf)
|
|||||||
cnf->led_count_strip_a = current_config.led_count_strip_a;
|
cnf->led_count_strip_a = current_config.led_count_strip_a;
|
||||||
cnf->led_count_strip_b = current_config.led_count_strip_b;
|
cnf->led_count_strip_b = current_config.led_count_strip_b;
|
||||||
cnf->pwm_pin = current_config.pwm_pin;
|
cnf->pwm_pin = current_config.pwm_pin;
|
||||||
|
cnf->localBtn_pin = current_config.localBtn_pin;
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t config_update_config(const config_t *config)
|
esp_err_t config_update_config(const config_t *config)
|
||||||
@ -127,7 +135,7 @@ esp_err_t config_update_config(const config_t *config)
|
|||||||
// Reinitialize if pins changed
|
// Reinitialize if pins changed
|
||||||
bool pins_changed = (current_config.led_pin_strip_a != config->led_pin_strip_a) ||
|
bool pins_changed = (current_config.led_pin_strip_a != config->led_pin_strip_a) ||
|
||||||
(current_config.led_pin_strip_b != config->led_pin_strip_b) ||
|
(current_config.led_pin_strip_b != config->led_pin_strip_b) ||
|
||||||
(current_config.pwm_pin != config->pwm_pin);
|
(current_config.pwm_pin != config->pwm_pin); // TODO: Count? LocalBtn? Needed?
|
||||||
|
|
||||||
memcpy(¤t_config, config, sizeof(config_t));
|
memcpy(¤t_config, config, sizeof(config_t));
|
||||||
esp_err_t err = save_config_to_nvs();
|
esp_err_t err = save_config_to_nvs();
|
||||||
@ -164,6 +172,7 @@ esp_err_t config_init(void)
|
|||||||
current_config.led_count_strip_a = HARDCODED_CONFIG_LED_STRIP_A_COUNT;
|
current_config.led_count_strip_a = HARDCODED_CONFIG_LED_STRIP_A_COUNT;
|
||||||
current_config.led_count_strip_b = HARDCODED_CONFIG_LED_STRIP_B_COUNT;
|
current_config.led_count_strip_b = HARDCODED_CONFIG_LED_STRIP_B_COUNT;
|
||||||
current_config.pwm_pin = HARDCODED_CONFIG_PWM_PIN;
|
current_config.pwm_pin = HARDCODED_CONFIG_PWM_PIN;
|
||||||
|
current_config.localBtn_pin = HARDCODED_CONFIG_LOCALBTN_PIN;
|
||||||
current_config.magic = CONFIG_MAGIC;
|
current_config.magic = CONFIG_MAGIC;
|
||||||
|
|
||||||
save_config_to_nvs();
|
save_config_to_nvs();
|
||||||
|
|||||||
@ -21,6 +21,7 @@ typedef struct
|
|||||||
int8_t led_count_strip_a; // LED count for LED strip A (-1 = not configured)
|
int8_t led_count_strip_a; // LED count for LED strip A (-1 = not configured)
|
||||||
int8_t led_count_strip_b; // LED count for LED strip B (-1 = not configured)
|
int8_t led_count_strip_b; // LED count for LED strip B (-1 = not configured)
|
||||||
int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured)
|
int8_t pwm_pin; // GPIO pin for PWM input (-1 = not configured)
|
||||||
|
int8_t localBtn_pin; // GPIO pin for local btn input (-1 = not configured)
|
||||||
uint32_t magic; // Magic number to validate config (0xDEADBEEF) //TODO: use sha256
|
uint32_t magic; // Magic number to validate config (0xDEADBEEF) //TODO: use sha256
|
||||||
} config_t;
|
} config_t;
|
||||||
|
|
||||||
|
|||||||
@ -14,18 +14,20 @@
|
|||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
|
|
||||||
|
#define MAX_MODES 14 // TODO
|
||||||
|
|
||||||
static const char *TAG = "CONTROL";
|
static const char *TAG = "CONTROL";
|
||||||
|
|
||||||
static uint8_t current_animation_mode = 0;
|
static uint8_t current_animation_mode = 0;
|
||||||
|
|
||||||
// Forward declarations
|
// Forward declarations
|
||||||
static void on_mode_change(uint8_t new_mode);
|
static void on_mode_change();
|
||||||
|
|
||||||
// Animation mode change callback
|
// Animation mode change callback
|
||||||
static void on_mode_change(uint8_t new_mode)
|
static void on_mode_change()
|
||||||
{
|
{
|
||||||
current_animation_mode = new_mode;
|
current_animation_mode = (current_animation_mode + 1) % MAX_MODES;
|
||||||
animation_set_mode((animation_mode_t)new_mode);
|
animation_set_mode((animation_mode_t)current_animation_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void control_set_animation_mode(uint8_t mode)
|
void control_set_animation_mode(uint8_t mode)
|
||||||
@ -42,11 +44,6 @@ uint8_t control_get_animation_mode(void)
|
|||||||
return current_animation_mode;
|
return current_animation_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void control_emulate_pwm_pulse(void)
|
|
||||||
{
|
|
||||||
rcsignal_trigger_mode_change();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Main initialization
|
// Main initialization
|
||||||
esp_err_t control_init(void)
|
esp_err_t control_init(void)
|
||||||
{
|
{
|
||||||
@ -91,7 +88,7 @@ esp_err_t control_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Initialize local BTN
|
// Initialize local BTN
|
||||||
ret = localbtn_init();
|
ret = localbtn_init(current_config.localBtn_pin);
|
||||||
if (ret != ESP_OK)
|
if (ret != ESP_OK)
|
||||||
{
|
{
|
||||||
ESP_LOGE(TAG, "Local BTN init failed: %s", esp_err_to_name(ret));
|
ESP_LOGE(TAG, "Local BTN init failed: %s", esp_err_to_name(ret));
|
||||||
|
|||||||
@ -10,37 +10,27 @@
|
|||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "soc/gpio_num.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static const char *TAG = "LOCALBTN";
|
static const char *TAG = "LOCALBTN";
|
||||||
uint8_t current_mode;
|
uint8_t current_mode;
|
||||||
|
int8_t current_localBtnPin;
|
||||||
|
bool initialized;
|
||||||
|
TaskHandle_t localbtnTaskhandle;
|
||||||
localbtn_mode_change_callback_t callback;
|
localbtn_mode_change_callback_t callback;
|
||||||
|
|
||||||
#define BOOT_BTN GPIO_NUM_0
|
static void localbtn_task(void *arg)
|
||||||
#define MAX_MODES 14 // TODO: get from control
|
|
||||||
|
|
||||||
bool boot_button_pressed(void)
|
|
||||||
{
|
|
||||||
return gpio_get_level(BOOT_BTN) == 0; // active LOW
|
|
||||||
}
|
|
||||||
|
|
||||||
static void monitor_task(void *arg)
|
|
||||||
{
|
{
|
||||||
bool lastState = false;
|
bool lastState = false;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
vTaskDelay(pdMS_TO_TICKS(10));
|
vTaskDelay(pdMS_TO_TICKS(100)); // TODO:Get btn state via interrupt instead of polling
|
||||||
|
|
||||||
bool currentState = boot_button_pressed();
|
bool currentState = (gpio_get_level(current_localBtnPin) == 0);
|
||||||
if ((currentState) && (lastState != currentState))
|
if ((currentState) && (lastState != currentState))
|
||||||
{
|
{
|
||||||
printf("BOOT button pressed\n");
|
ESP_LOGI(TAG, "Local button pressed");
|
||||||
|
|
||||||
current_mode = (current_mode + 1) % MAX_MODES;
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Mode changed to: %d ", current_mode);
|
|
||||||
|
|
||||||
if (callback)
|
if (callback)
|
||||||
{
|
{
|
||||||
@ -52,11 +42,11 @@ static void monitor_task(void *arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t localbtn_init()
|
esp_err_t localbtn_init(int8_t pin_localbtn)
|
||||||
{
|
{
|
||||||
|
current_localBtnPin = pin_localbtn;
|
||||||
gpio_config_t io_conf = {
|
gpio_config_t io_conf = {
|
||||||
.pin_bit_mask = 1ULL << BOOT_BTN,
|
.pin_bit_mask = 1ULL << current_localBtnPin,
|
||||||
.mode = GPIO_MODE_INPUT,
|
.mode = GPIO_MODE_INPUT,
|
||||||
.pull_up_en = GPIO_PULLUP_ENABLE, // safe even if external pull-up exists
|
.pull_up_en = GPIO_PULLUP_ENABLE, // safe even if external pull-up exists
|
||||||
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
.pull_down_en = GPIO_PULLDOWN_DISABLE,
|
||||||
@ -64,21 +54,31 @@ esp_err_t localbtn_init()
|
|||||||
ESP_ERROR_CHECK(gpio_config(&io_conf));
|
ESP_ERROR_CHECK(gpio_config(&io_conf));
|
||||||
|
|
||||||
// Create monitor task
|
// Create monitor task
|
||||||
BaseType_t ret = xTaskCreate(monitor_task, "localbtn_monitor", 2048, NULL, 5, NULL);
|
BaseType_t ret = xTaskCreate(localbtn_task, "localbtn_task", 2048, NULL, 5, &localbtnTaskhandle);
|
||||||
if (ret != pdPASS)
|
if (ret != pdPASS)
|
||||||
{
|
{
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: rcsignal.initialized = true;
|
initialized = true;
|
||||||
ESP_LOGI(TAG, "local btn initialized on GPIO%d", BOOT_BTN);
|
ESP_LOGI(TAG, "local btn initialized on GPIO%d", current_localBtnPin);
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void localbtn_deinit(void)
|
void localbtn_deinit(void)
|
||||||
{
|
{
|
||||||
// TODO:
|
if (!initialized)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (localbtnTaskhandle)
|
||||||
|
{
|
||||||
|
vTaskDelete(localbtnTaskhandle);
|
||||||
|
localbtnTaskhandle = NULL;
|
||||||
|
}
|
||||||
|
initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void localbtn_register_callback(localbtn_mode_change_callback_t cb)
|
void localbtn_register_callback(localbtn_mode_change_callback_t cb)
|
||||||
|
|||||||
@ -13,15 +13,14 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Callback function type for mode changes
|
* @brief Callback function type for mode changes
|
||||||
* @param new_mode New animation mode (0-13)
|
|
||||||
*/
|
*/
|
||||||
typedef void (*localbtn_mode_change_callback_t)(uint8_t new_mode);
|
typedef void (*localbtn_mode_change_callback_t)();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize local btn reading
|
* @brief Initialize local btn reading
|
||||||
* @return ESP_OK on success
|
* @return ESP_OK on success
|
||||||
*/
|
*/
|
||||||
esp_err_t localbtn_init();
|
esp_err_t localbtn_init(int8_t pin_localbtn);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Deinitialize local btn reading
|
* @brief Deinitialize local btn reading
|
||||||
|
|||||||
@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
static const char *TAG = "RCSIGNAL";
|
static const char *TAG = "RCSIGNAL";
|
||||||
|
|
||||||
#define MAX_MODES 14 //TODO: Get from config
|
|
||||||
#define PULSE_THRESHOLD_US 1500
|
#define PULSE_THRESHOLD_US 1500
|
||||||
#define SIGNAL_TIMEOUT_MS 100
|
#define SIGNAL_TIMEOUT_MS 100
|
||||||
static struct
|
static struct
|
||||||
@ -99,14 +98,10 @@ static void monitor_task(void *arg)
|
|||||||
{
|
{
|
||||||
// Mode change detected
|
// Mode change detected
|
||||||
rcsignal.pull_detected = false;
|
rcsignal.pull_detected = false;
|
||||||
rcsignal.current_mode = (rcsignal.current_mode + 1) % MAX_MODES;
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Mode changed to: %d (pulse: %lu us)",
|
|
||||||
rcsignal.current_mode, rcsignal.pulse_width_us);
|
|
||||||
|
|
||||||
if (rcsignal.callback)
|
if (rcsignal.callback)
|
||||||
{
|
{
|
||||||
rcsignal.callback(rcsignal.current_mode);
|
rcsignal.callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,17 +181,6 @@ bool rcsignal_is_active(void)
|
|||||||
return rcsignal.signal_active;
|
return rcsignal.signal_active;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rcsignal_trigger_mode_change(void)
|
|
||||||
{
|
|
||||||
rcsignal.current_mode = (rcsignal.current_mode + 1) % MAX_MODES;
|
|
||||||
ESP_LOGI(TAG, "Manual mode change to: %d", rcsignal.current_mode);
|
|
||||||
|
|
||||||
if (rcsignal.callback)
|
|
||||||
{
|
|
||||||
rcsignal.callback(rcsignal.current_mode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t rcsignal_get_current_mode(void)
|
uint8_t rcsignal_get_current_mode(void)
|
||||||
{
|
{
|
||||||
return rcsignal.current_mode;
|
return rcsignal.current_mode;
|
||||||
|
|||||||
@ -13,9 +13,8 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Callback function type for mode changes
|
* @brief Callback function type for mode changes
|
||||||
* @param new_mode New animation mode (0-13)
|
|
||||||
*/
|
*/
|
||||||
typedef void (*rcsignal_mode_change_callback_t)(uint8_t new_mode);
|
typedef void (*rcsignal_mode_change_callback_t)();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize RC signal reading
|
* @brief Initialize RC signal reading
|
||||||
@ -47,11 +46,6 @@ uint32_t rcsignal_get_pulse_width(void);
|
|||||||
*/
|
*/
|
||||||
bool rcsignal_is_active(void);
|
bool rcsignal_is_active(void);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Manually trigger mode change (for emulation)
|
|
||||||
*/
|
|
||||||
void rcsignal_trigger_mode_change(void);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get current mode
|
* @brief Get current mode
|
||||||
* @return Current animation mode (0-13)
|
* @return Current animation mode (0-13)
|
||||||
|
|||||||
Reference in New Issue
Block a user