Browse Source

add "power" gpio

philippe44 1 year ago
parent
commit
b3ee25e3be

+ 6 - 0
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
 #

+ 6 - 0
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
 #

+ 6 - 0
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
 #

+ 46 - 5
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);

+ 1 - 0
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)

+ 4 - 0
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) {

+ 17 - 3
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