浏览代码

Merge with master

Sebastien 5 年之前
父节点
当前提交
b0594b9df0

+ 1 - 1
README.md

@@ -1,7 +1,7 @@
 # Squeezelite-esp32
 ## Supported Hardware 
 ### SqueezeAMP
-Works with the SqueezeAMP see [here](https://forums.slimdevices.com/showthread.php?110926-pre-ANNOUNCE-SqueezeAMP-and-SqueezeliteESP32) and [here](https://github.com/philippe44/SqueezeAMP/blob/master/README.md)
+Works with the SqueezeAMP see [here](https://forums.slimdevices.com/showthread.php?110926-pre-ANNOUNCE-SqueezeAMP-and-SqueezeliteESP32) and [here](https://github.com/philippe44/SqueezeAMP/blob/master/README.md). Add repository https://raw.githubusercontent.com/sle118/squeezelite-esp32/master/plugin/repo.xml to LMS if you want to have a display
 
 Use the `squeezelite-esp32-SqueezeAmp-sdkconfig.defaults` configuration file.
 

+ 17 - 3
components/display/display.c

@@ -26,17 +26,19 @@
 #include "embedded.h"
 #include "display.h"
 
-#define TAG 		"display"
+static const char *TAG = "display";
 
 static bool (*slimp_handler_chain)(u8_t *data, int len);
 static struct display_handle_s *handle;
+static void (*chained_notify)(in_addr_t ip, u16_t hport, u16_t cport);
 
+static void server_attach(in_addr_t ip, u16_t hport, u16_t cport);
 static bool display_handler(u8_t *data, int len);
 
 /****************************************************************************************
  * 
  */
-void display_init(void) {
+void display_init(char *welcome) {
 	char *item = config_alloc_get(NVS_TYPE_STR, "display_config");
 
 	if (item && *item) {
@@ -52,15 +54,27 @@ void display_init(void) {
 			}
 		}else {
 			ESP_LOGE(TAG,"Unknown display driver name in display config: %s",item);
-
 		}
 	} else {
 		ESP_LOGW(TAG, "no display");
 	}
+	
+	chained_notify = server_notify;
+	server_notify = server_attach;
 
 	if (item) free(item);
 }
 
+/****************************************************************************************
+ * 
+ */
+static void server_attach(in_addr_t ip, u16_t hport, u16_t cport) {
+	char msg[32];
+	sprintf(msg, "%s:%hu", inet_ntoa(ip), hport);
+	handle->print_message(msg);
+	if (chained_notify) (*chained_notify)(ip, hport, cport);
+}
+
 /****************************************************************************************
  * Process graphic display data
  */

+ 2 - 1
components/display/display.h

@@ -19,7 +19,8 @@
 #pragma once
 
 struct display_handle_s {
-	bool (*init)(char *config);
+	bool (*init)(char *config, char* welcome);
+	void (*print_message)(char *msg);
 	void (*vfdc_handler)(u8_t *data, int len);
 	void (*grfe_handler)(u8_t *data, int len);
 	void (*grfb_handler)(u8_t *data, int len);

+ 20 - 4
components/display/driver_SSD1306.c

@@ -32,14 +32,16 @@
 #define I2C_PORT 	1
 #define I2C_ADDRESS	0x3C
 #define LINELEN		40
-#define TAG 		"display"
+static const char *TAG = "display";
 
 static void 	vfdc_handler( u8_t *_data, int bytes_read);
-void 			grfe_handler( u8_t *data, int len);
-static bool 	display_init(char *config);
+static void 	grfe_handler( u8_t *data, int len);
+static bool 	display_init(char *config, char *welcome);
+static void 	print_message(char *msg);
 
 struct display_handle_s SSD1306_handle = {
 	display_init,
+	print_message, 
 	vfdc_handler,
 	grfe_handler,
 	NULL, NULL,
@@ -71,7 +73,7 @@ static const unsigned char BitReverseTable256[] =
 /****************************************************************************************
  * 
  */
-static bool display_init(char *config) {
+static bool display_init(char *config, char *welcome) {
 	bool res = false;
 
 	if (strstr(config, "I2C")) {
@@ -105,6 +107,7 @@ static bool display_init(char *config) {
 			}
 		}
 		if(res){
+			print_message(welcome);
 			ESP_LOGI(TAG, "Initialized I2C display %dx%d (sda:%d, scl:%d, address:%02x)", width, height, sda, scl, address);
 		} else {
 			ESP_LOGE(TAG, "Cannot initialized I2C display %s [%dx%d sda:%d, scl:%d, address:%02x]", config, width, height, sda, scl, address);
@@ -116,6 +119,19 @@ static bool display_init(char *config) {
 	return res;
 }
 
+/****************************************************************************************
+ * 
+ */
+static void print_message(char *msg) {
+	if (!msg) return;
+	SSD1306_AddressMode Mode = AddressMode;
+	SSD1306_Clear( &I2CDisplay, SSD_COLOR_BLACK );
+	SSD1306_SetDisplayAddressMode( &I2CDisplay, AddressMode_Horizontal );
+	SSD1306_FontDrawAnchoredString( &I2CDisplay, TextAnchor_Center, msg, SSD_COLOR_WHITE );
+	SSD1306_Update( &I2CDisplay );
+	SSD1306_SetDisplayAddressMode( &I2CDisplay, Mode );
+}
+
 /****************************************************************************************
  * Change special LCD chars to something more printable on screen 
  */

+ 2 - 1
components/display/tarablessd1306/ssd1306.c

@@ -200,7 +200,8 @@ static bool SSD1306_Init( struct SSD1306_Device* DeviceHandle, int Width, int He
     DeviceHandle->Height = Height;
     DeviceHandle->FramebufferSize = ( DeviceHandle->Width * Height ) / 8;
 
-    DeviceHandle->Framebuffer = heap_caps_calloc( 1, DeviceHandle->FramebufferSize, MALLOC_CAP_DMA | MALLOC_CAP_8BIT );
+    // DeviceHandle->Framebuffer = heap_caps_calloc( 1, DeviceHandle->FramebufferSize, MALLOC_CAP_INTERNAL );
+	DeviceHandle->Framebuffer = calloc( 1, DeviceHandle->FramebufferSize );
 
     NullCheck( DeviceHandle->Framebuffer, return false );
 

+ 1 - 1
components/services/battery.c

@@ -19,7 +19,7 @@
 
 #define BATTERY_TIMER	(10*1000)
 
-static const char TAG[] = "battery";
+static const char *TAG = "battery";
 
 static struct {
 	float sum, avg;

+ 1 - 1
components/services/led.c

@@ -21,7 +21,7 @@
 #define MAX_LED	8
 #define BLOCKTIME	10	// up to portMAX_DELAY
 
-static const char TAG[] = "led";
+static const char *TAG = "led";
 
 static struct led_s {
 	gpio_num_t gpio;

+ 1 - 1
components/services/monitor.c

@@ -26,7 +26,7 @@
 
 #define MONITOR_TIMER	(10*1000)
 
-static const char TAG[] = "monitor";
+static const char *TAG = "monitor";
 
 static TimerHandle_t monitor_timer;
 

+ 2 - 0
components/squeezelite/slimproto.c

@@ -134,6 +134,8 @@ static void sendHELO(bool reconnect, const char *fixed_cap, const char *var_cap,
 	base_cap = BASE_CAP;
 #endif	
 
+	if (!reconnect) player_id = PLAYER_ID;
+
 	memset(&pkt, 0, sizeof(pkt));
 	memcpy(&pkt.opcode, "HELO", 4);
 	pkt.length = htonl(sizeof(struct HELO_packet) - 8 + strlen(base_cap) + strlen(fixed_cap) + strlen(var_cap));

+ 2 - 2
main/esp_app_main.c

@@ -71,7 +71,7 @@ extern const uint8_t server_cert_pem_start[] asm("_binary_github_pem_start");
 extern const uint8_t server_cert_pem_end[] asm("_binary_github_pem_end");
 
 extern void services_init(void);
-extern void	display_init(void);
+extern void	display_init(char *welcome);
 
 /* brief this is an exemple of a callback that you can setup in your own app to get notified of wifi manager event */
 void cb_connection_got_ip(void *pvParameter){
@@ -337,7 +337,7 @@ void app_main()
 	services_init();
 
 	ESP_LOGD(TAG,"Initializing display");	
-	display_init();
+	display_init("SqueezeESP32");
 
 #if !RECOVERY_APPLICATION
 	ESP_LOGI(TAG,"Checking if certificates need to be updated");

+ 41 - 0
plugin/SqueezeESP32/Graphics.pm

@@ -4,6 +4,47 @@ use strict;
 
 use base qw(Slim::Display::Squeezebox2);
 
+my $VISUALIZER_NONE = 0;
+
+my @modes = (
+	# mode 0
+	{ desc => ['BLANK'],
+	  bar => 0, secs => 0,  width => 128, 
+	  params => [$VISUALIZER_NONE] },
+	# mode 1
+	{ desc => ['PROGRESS_BAR'],
+	  bar => 1, secs => 0,  width => 128,
+	  params => [$VISUALIZER_NONE] },
+	# mode 2
+	{ desc => ['ELAPSED'],
+	  bar => 0, secs => 1,  width => 128,
+	  params => [$VISUALIZER_NONE] },
+	# mode 3
+	{ desc => ['ELAPSED', 'AND', 'PROGRESS_BAR'],
+	  bar => 1, secs => 1,  width => 128, 
+	  params => [$VISUALIZER_NONE] },
+	# mode 4
+	{ desc => ['REMAINING'],
+	  bar => 0, secs => -1, width => 128,
+	  params => [$VISUALIZER_NONE] },
+	# mode 5  
+    { desc => ['CLOCK'],
+	  bar => 0, secs => 0, width => 128, clock => 1,
+	  params => [$VISUALIZER_NONE] },
+	# mode 6	  
+	{ desc => ['SETUP_SHOWBUFFERFULLNESS'],
+	  bar => 0, secs => 0,  width => 128, fullness => 1,
+	  params => [$VISUALIZER_NONE] },
+);
+
+sub modes {
+	return \@modes;
+}
+
+sub nmodes {
+	return $#modes;
+}
+
 =comment
 sub bytesPerColumn {
 	return 4;

+ 1 - 1
plugin/SqueezeESP32/Plugin.pm

@@ -20,7 +20,7 @@ sub initPlugin {
 	my $class = shift;
 
 	$class->SUPER::initPlugin(@_);
-	Slim::Networking::Slimproto::addPlayerClass($class, 100, 'squeeze2esp32', { client => 'Plugins::SqueezeESP32::Player', display => 'Plugins::SqueezeESP32::Graphics' });
+	Slim::Networking::Slimproto::addPlayerClass($class, 100, 'squeezeesp32', { client => 'Plugins::SqueezeESP32::Player', display => 'Plugins::SqueezeESP32::Graphics' });
 	$log->info("Added class 100 for SqueezeESP32");
 }
 

二进制
plugin/SqueezeESP32/SqueezeESP32.zip


+ 3 - 1
plugin/SqueezeESP32/install.xml

@@ -7,7 +7,9 @@
     <maxVersion>*.*</maxVersion>
     <id>SlimServer</id>
   </targetApplication>
+  <name>PLUGIN_SQUEEZEESP32</name>
+  <description>PLUGIN_SQUEEZEESP32_DESC</description>
   <module>Plugins::SqueezeESP32::Plugin</module>
-    <version>0.1</version>
+    <version>0.3</version>
   <creator>Philippe</creator>
 </extensions>

+ 8 - 1
plugin/SqueezeESP32/strings.txt

@@ -1,2 +1,9 @@
 WELCOME_TO_SQUEEZEESP32
-	EN	Welcome to SqueezeESP32
+	EN	Welcome to SqueezeESP32
+	
+PLUGIN_SQUEEZEESP32
+	SqueezeESP32
+	
+PLUGIN_SQUEEZEESP32_DESC
+	Adds a new player id (100) to enable display with SqueezeESP32
+	

+ 17 - 0
plugin/repo.xml

@@ -0,0 +1,17 @@
+<?xml version='1.0' standalone='yes'?>
+<extensions>
+  <plugins>
+    <plugin version="0.3" name="SqueezeESP32" minTarget="7.9" maxTarget="7.*">
+      <link>https://github.com/sle118/squeezelite-esp32</link>
+      <creator>Philippe</creator>
+      <sha>799ae4860f9c009ac25c2ec35eb4070c5f474659</sha>
+      <email>philippe_44@outlook.com</email>
+      <desc lang="EN">SqueezeESP32 additional player id (100)</desc>
+      <url>http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32/SqueezeESP32.zip</url>
+      <title lang="EN">SqueezeESP32</title>
+    </plugin>
+  </plugins>
+  <details>
+    <title lang="EN">SqueezeESP32 related plugins</title>
+  </details>
+</extensions>