From dba4782871a9a8d5b15fd307da1f4ab4af28ff42 Mon Sep 17 00:00:00 2001 From: philippe44 Date: Mon, 13 Jan 2020 19:19:55 -0800 Subject: [PATCH] display improvements, reset player_id when switching server --- components/display/display.c | 19 +++++++++++++++++-- components/display/display.h | 3 ++- components/display/driver_SSD1306.c | 20 +++++++++++++++++--- components/squeezelite/slimproto.c | 2 ++ main/esp_app_main.c | 4 ++-- plugin/SqueezeESP32/Plugin.pm | 2 +- 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/components/display/display.c b/components/display/display.c index 831e1d06..041d29ca 100644 --- a/components/display/display.c +++ b/components/display/display.c @@ -30,18 +30,20 @@ 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) { handle = &SSD1306_handle; - if (handle->init(item)) { + if (handle->init(item, welcome)) { slimp_handler_chain = slimp_handler; slimp_handler = display_handler; ESP_LOGI(TAG, "Display initialization successful"); @@ -51,10 +53,23 @@ void display_init(void) { } else { ESP_LOGI(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 */ diff --git a/components/display/display.h b/components/display/display.h index 058121da..a2ea64ca 100644 --- a/components/display/display.h +++ b/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); diff --git a/components/display/driver_SSD1306.c b/components/display/driver_SSD1306.c index cdcc72ef..59a1a518 100644 --- a/components/display/driver_SSD1306.c +++ b/components/display/driver_SSD1306.c @@ -35,11 +35,13 @@ #define 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")) { @@ -89,6 +91,7 @@ static bool display_init(char *config) { SSD1306_I2CMasterInitDefault( I2C_PORT, sda, scl ); SSD1306_I2CMasterAttachDisplayDefault( &I2CDisplay, width, height, I2C_ADDRESS, -1); SSD1306_SetFont( &I2CDisplay, &Font_droid_sans_fallback_15x17 ); + print_message(welcome); ESP_LOGI(TAG, "Initialized I2C display %dx%d (sda:%d, scl:%d)", width, height, sda, scl); res = true; } else { @@ -101,6 +104,17 @@ static bool display_init(char *config) { return res; } +/**************************************************************************************** + * + */ +static void print_message(char *msg) { + if (!msg) return; + SSD1306_Clear( &I2CDisplay, SSD_COLOR_BLACK ); + SSD1306_SetDisplayAddressMode( &I2CDisplay, AddressMode_Horizontal ); + SSD1306_FontDrawAnchoredString( &I2CDisplay, TextAnchor_Center, msg, SSD_COLOR_WHITE ); + SSD1306_Update( &I2CDisplay ); +} + /**************************************************************************************** * Change special LCD chars to something more printable on screen */ diff --git a/components/squeezelite/slimproto.c b/components/squeezelite/slimproto.c index b53a1961..7a45b6ac 100644 --- a/components/squeezelite/slimproto.c +++ b/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)); diff --git a/main/esp_app_main.c b/main/esp_app_main.c index 1470ada8..dc775c44 100644 --- a/main/esp_app_main.c +++ b/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"); diff --git a/plugin/SqueezeESP32/Plugin.pm b/plugin/SqueezeESP32/Plugin.pm index 623ebbea..80a074fa 100644 --- a/plugin/SqueezeESP32/Plugin.pm +++ b/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"); }