From b3ee25e3be0f25d9618fe70da76669a833d5b6b8 Mon Sep 17 00:00:00 2001 From: philippe44 Date: Tue, 12 Sep 2023 15:03:58 -0700 Subject: [PATCH] add "power" gpio --- build-scripts/I2S-4MFlash-sdkconfig.defaults | 6 +++ build-scripts/Muse-sdkconfig.defaults | 6 +++ build-scripts/SqueezeAmp-sdkconfig.defaults | 6 +++ components/squeezelite/embedded.c | 51 ++++++++++++++++++-- components/squeezelite/embedded.h | 1 + components/squeezelite/slimproto.c | 4 ++ main/Kconfig.projbuild | 20 ++++++-- 7 files changed, 86 insertions(+), 8 deletions(-) diff --git a/build-scripts/I2S-4MFlash-sdkconfig.defaults b/build-scripts/I2S-4MFlash-sdkconfig.defaults index 20e876ba..4a6633e4 100644 --- a/build-scripts/I2S-4MFlash-sdkconfig.defaults +++ b/build-scripts/I2S-4MFlash-sdkconfig.defaults @@ -297,6 +297,12 @@ CONFIG_AUDIO_CONTROLS="" CONFIG_AMP_GPIO=-1 # end of AMP configuration +# +# POWER configuration +# +CONFIG_POWER_GPIO=-1 +# end of POWER configuration + # # Audio JACK # diff --git a/build-scripts/Muse-sdkconfig.defaults b/build-scripts/Muse-sdkconfig.defaults index 76bad083..68ab922d 100644 --- a/build-scripts/Muse-sdkconfig.defaults +++ b/build-scripts/Muse-sdkconfig.defaults @@ -264,6 +264,12 @@ CONFIG_CSPOT_SINK=y # # end of Display Screen +# +# POWER configuration +# +CONFIG_POWER_GPIO=-1 +# end of POWER configuration + # # Various I/O # diff --git a/build-scripts/SqueezeAmp-sdkconfig.defaults b/build-scripts/SqueezeAmp-sdkconfig.defaults index 1b5fdd5d..d02fbd2a 100644 --- a/build-scripts/SqueezeAmp-sdkconfig.defaults +++ b/build-scripts/SqueezeAmp-sdkconfig.defaults @@ -288,6 +288,12 @@ CONFIG_AUDIO_CONTROLS="" CONFIG_AMP_GPIO=-1 # end of AMP configuration +# +# POWER configuration +# +CONFIG_POWER_GPIO=-1 +# end of POWER configuration + # # Compiler options # diff --git a/components/squeezelite/embedded.c b/components/squeezelite/embedded.c index 75e54f00..2b9bd2c3 100644 --- a/components/squeezelite/embedded.c +++ b/components/squeezelite/embedded.c @@ -15,13 +15,41 @@ #include "esp_system.h" #include "esp_timer.h" #include "esp_wifi.h" +#include "esp_log.h" #include "monitor.h" #include "platform_config.h" #include "messaging.h" +#include "gpio_exp.h" +#include "accessors.h" + +#ifndef CONFIG_POWER_GPIO_LEVEL +#define CONFIG_POWER_GPIO_LEVEL 1 +#endif + +static const char TAG[] = "embedded"; + +static struct { + int gpio, active; +} power_control = { CONFIG_POWER_GPIO, CONFIG_POWER_GPIO_LEVEL }; + +extern void sb_controls_init(void); +extern bool sb_displayer_init(void); + +u8_t custom_player_id = 12; mutex_type slimp_mutex; static jmp_buf jumpbuf; +#ifndef POWER_LOCKED +static void set_power_gpio(int gpio, char *value) { + if (strcasestr(value, "power")) { + char *p = strchr(value, ':'); + if (p) power_control.active = atoi(p + 1); + power_control.gpio = gpio; + } +} +#endif + void get_mac(u8_t mac[]) { esp_read_mac(mac, ESP_MAC_WIFI_STA); } @@ -56,16 +84,22 @@ uint32_t _gettime_ms_(void) { return (uint32_t) (esp_timer_get_time() / 1000); } -extern void sb_controls_init(void); -extern bool sb_displayer_init(void); - -u8_t custom_player_id = 12; - int embedded_init(void) { mutex_create(slimp_mutex); sb_controls_init(); custom_player_id = sb_displayer_init() ? 100 : 101; +#ifndef POWER_LOCKED + parse_set_GPIO(set_power_gpio); +#endif + + if (power_control.gpio != -1) { + gpio_pad_select_gpio_x(power_control.gpio); + gpio_set_direction_x(power_control.gpio, GPIO_MODE_OUTPUT); + gpio_set_level_x(power_control.gpio, !power_control.active); + ESP_LOGI(TAG, "setting power GPIO %d (active:%d)", power_control.gpio, power_control.active); + } + return setjmp(jumpbuf); } @@ -73,6 +107,13 @@ void embedded_exit(int code) { longjmp(jumpbuf, code + 1); } +void powering(bool on) { + if (power_control.gpio != -1) { + ESP_LOGI(TAG, "powering player %s", on ? "ON" : "OFF"); + gpio_set_level_x(power_control.gpio, on ? power_control.active : !power_control.active); + } +} + u16_t get_RSSI(void) { wifi_ap_record_t wifidata; esp_wifi_sta_get_ap_info(&wifidata); diff --git a/components/squeezelite/embedded.h b/components/squeezelite/embedded.h index 53e06ebc..5c27a7e7 100644 --- a/components/squeezelite/embedded.h +++ b/components/squeezelite/embedded.h @@ -71,6 +71,7 @@ int embedded_init(void); void register_external(void); void deregister_external(void); void decode_restore(int external); +void powering(bool on); // used when other client wants to use slimproto socket to send messages extern mutex_type slimp_mutex; #define LOCK_P mutex_lock(slimp_mutex) diff --git a/components/squeezelite/slimproto.c b/components/squeezelite/slimproto.c index 6a83176a..64e73ba0 100644 --- a/components/squeezelite/slimproto.c +++ b/components/squeezelite/slimproto.c @@ -441,6 +441,10 @@ static void process_aude(u8_t *pkt, int len) { struct aude_packet *aude = (struct aude_packet *)pkt; LOG_DEBUG("enable spdif: %d dac: %d", aude->enable_spdif, aude->enable_dac); + +#if EMBEDDED + powering(aude->enable_spdif), +#endif LOCK_O; if (!aude->enable_spdif && output.state != OUTPUT_OFF) { diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index ec022358..2e4f6990 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -148,6 +148,9 @@ menu "Squeezelite-ESP32" int default 21 if MUSE default -1 + config POWER_GPIO + int + default -1 config JACK_GPIO int default 34 if SQUEEZEAMP || MUSE @@ -405,18 +408,29 @@ menu "Squeezelite-ESP32" default 0 endmenu - menu "Amplifier" - visible if !TARGET_LOCKED + menu "External amplifier control" + visible if !AMP_LOCKED config AMP_GPIO int "Amplifier GPIO" help - GPIO to switch on/off amplifier. Set to -1 for no amplifier. + GPIO to switch on/off external amplifier. Set to -1 for no amplifier. config AMP_GPIO_LEVEL depends on AMP_GPIO != -1 int "Active level(0/1)" default 1 endmenu + menu "Power on/off status" + config POWER_GPIO + int "Power on/off GPIO" + help + GPIO that is switched when LMS turns player one. Set to -1 to disable + config POWER_GPIO_LEVEL + depends on POWER_GPIO != -1 + int "Active level(0/1)" + default 1 + endmenu + menu "Speaker Fault" visible if !TARGET_LOCKED config SPKFAULT_GPIO