From a5a0cbc557efee3874eaafe4523a7a75bbe4d266 Mon Sep 17 00:00:00 2001 From: Philippe G Date: Wed, 27 May 2020 17:01:33 -0700 Subject: [PATCH 1/3] brightness log 0..5 + log - release --- components/squeezelite/display.c | 7 ++++--- plugin/SqueezeESP32.zip | Bin 10334 -> 10327 bytes plugin/SqueezeESP32/Graphics.pm | 2 +- plugin/SqueezeESP32/Plugin.pm | 2 +- plugin/SqueezeESP32/install.xml | 4 ++-- plugin/repo.xml | 4 ++-- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/components/squeezelite/display.c b/components/squeezelite/display.c index ed64fbaa..4af7afd8 100644 --- a/components/squeezelite/display.c +++ b/components/squeezelite/display.c @@ -646,12 +646,13 @@ static void grfb_handler(u8_t *data, int len) { pkt->brightness = htons(pkt->brightness); xSemaphoreTake(displayer.mutex, portMAX_DELAY); - - if (pkt->brightness < 0) { + + // LMS driver sends 0..5 value, we assume driver is highly log + if (pkt->brightness <= 0) { GDS_DisplayOff(display); } else { GDS_DisplayOn(display); - GDS_SetContrast(display, pkt->brightness); + GDS_SetContrast(display, 255 * powf(pkt->brightness / 5.0f, 3)); } xSemaphoreGive(displayer.mutex); diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index 93471368e975d02282586ec806a0b93eaf278fd4..1d8b8c75c2a623b291aa0cb813f54b63fb7e3c63 100644 GIT binary patch delta 3970 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 DW_@wB delta 3966 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 L2%a3vzgPSh`b=eU diff --git a/plugin/SqueezeESP32/Graphics.pm b/plugin/SqueezeESP32/Graphics.pm index 2597a557..b23cf95b 100644 --- a/plugin/SqueezeESP32/Graphics.pm +++ b/plugin/SqueezeESP32/Graphics.pm @@ -88,7 +88,7 @@ sub displayWidth { } sub brightnessMap { - return (65535, 10, 50, 100, 200); + return (0 .. 5); } =comment diff --git a/plugin/SqueezeESP32/Plugin.pm b/plugin/SqueezeESP32/Plugin.pm index e7e3a779..e2b13573 100644 --- a/plugin/SqueezeESP32/Plugin.pm +++ b/plugin/SqueezeESP32/Plugin.pm @@ -13,7 +13,7 @@ my $prefs = preferences('plugin.squeezeesp32'); my $log = Slim::Utils::Log->addLogCategory({ 'category' => 'plugin.squeezeesp32', 'defaultLevel' => 'INFO', - 'description' => Slim::Utils::Strings::string('SqueezeESP32'), + 'description' => 'PLUGIN_SQUEEZEESP32', }); # migrate 'eq' pref, as that's a reserved word and could cause problems in the future diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml index 0e7ced4b..7d20081e 100644 --- a/plugin/SqueezeESP32/install.xml +++ b/plugin/SqueezeESP32/install.xml @@ -3,13 +3,13 @@ enabled philippe_44@outlook.com - 7.5 + 7.9 * SlimServer PLUGIN_SQUEEZEESP32 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.92 + 0.94 Philippe diff --git a/plugin/repo.xml b/plugin/repo.xml index 48588d33..f13e8830 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,10 +1,10 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - 274c9278af12e79edb8c3273f19f3fc7a9703795 + a9bf10b47d13508ba051e4067cdabc2c283f4824 philippe_44@outlook.com SqueezeESP32 additional player id (100) http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32.zip From 0521ecb2505f509426d1ce0520ee7a3fc935334c Mon Sep 17 00:00:00 2001 From: Philippe G Date: Sat, 30 May 2020 00:08:31 -0700 Subject: [PATCH 2/3] tweak command line (wav) and equalizer warning messages --- build-scripts/ESP32-A1S-sdkconfig.defaults | 2 +- build-scripts/I2S-4MFlash-sdkconfig.defaults | 2 +- build-scripts/SqueezeAmp4MBFlash-sdkconfig.defaults | 2 +- build-scripts/SqueezeAmp8MBFlash-sdkconfig.defaults | 2 +- components/squeezelite/equalizer.c | 6 ++++-- components/wifi-manager/code.js | 2 +- components/wifi-manager/index.html | 2 +- 7 files changed, 10 insertions(+), 8 deletions(-) diff --git a/build-scripts/ESP32-A1S-sdkconfig.defaults b/build-scripts/ESP32-A1S-sdkconfig.defaults index b764c5fa..1dc76820 100644 --- a/build-scripts/ESP32-A1S-sdkconfig.defaults +++ b/build-scripts/ESP32-A1S-sdkconfig.defaults @@ -115,7 +115,7 @@ CONFIG_DEFAULT_AP_GATEWAY="192.168.4.1" CONFIG_DEFAULT_AP_NETMASK="255.255.255.0" CONFIG_DEFAULT_AP_MAX_CONNECTIONS=4 CONFIG_DEFAULT_AP_BEACON_INTERVAL=100 -CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30" +CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30 -W" # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y diff --git a/build-scripts/I2S-4MFlash-sdkconfig.defaults b/build-scripts/I2S-4MFlash-sdkconfig.defaults index be49304a..21b4dec3 100644 --- a/build-scripts/I2S-4MFlash-sdkconfig.defaults +++ b/build-scripts/I2S-4MFlash-sdkconfig.defaults @@ -116,7 +116,7 @@ CONFIG_DEFAULT_AP_GATEWAY="192.168.4.1" CONFIG_DEFAULT_AP_NETMASK="255.255.255.0" CONFIG_DEFAULT_AP_MAX_CONNECTIONS=4 CONFIG_DEFAULT_AP_BEACON_INTERVAL=100 -CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30" +CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30 -W" # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y diff --git a/build-scripts/SqueezeAmp4MBFlash-sdkconfig.defaults b/build-scripts/SqueezeAmp4MBFlash-sdkconfig.defaults index f17a4681..4f9a217f 100644 --- a/build-scripts/SqueezeAmp4MBFlash-sdkconfig.defaults +++ b/build-scripts/SqueezeAmp4MBFlash-sdkconfig.defaults @@ -128,7 +128,7 @@ CONFIG_DEFAULT_AP_GATEWAY="192.168.4.1" CONFIG_DEFAULT_AP_NETMASK="255.255.255.0" CONFIG_DEFAULT_AP_MAX_CONNECTIONS=4 CONFIG_DEFAULT_AP_BEACON_INTERVAL=100 -CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30" +CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30 -W" # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y diff --git a/build-scripts/SqueezeAmp8MBFlash-sdkconfig.defaults b/build-scripts/SqueezeAmp8MBFlash-sdkconfig.defaults index c174d334..f89f9d80 100644 --- a/build-scripts/SqueezeAmp8MBFlash-sdkconfig.defaults +++ b/build-scripts/SqueezeAmp8MBFlash-sdkconfig.defaults @@ -127,7 +127,7 @@ CONFIG_DEFAULT_AP_GATEWAY="192.168.4.1" CONFIG_DEFAULT_AP_NETMASK="255.255.255.0" CONFIG_DEFAULT_AP_MAX_CONNECTIONS=4 CONFIG_DEFAULT_AP_BEACON_INTERVAL=100 -CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30" +CONFIG_DEFAULT_COMMAND_LINE="squeezelite -o I2S -b 500:2000 -d all=info -C 30 -W" # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y diff --git a/components/squeezelite/equalizer.c b/components/squeezelite/equalizer.c index ac038ef9..f0364257 100644 --- a/components/squeezelite/equalizer.c +++ b/components/squeezelite/equalizer.c @@ -26,14 +26,16 @@ static struct { * open equalizer */ void equalizer_open(u32_t sample_rate) { + // in any case, need to clear update flag + equalizer.update = false; + if (sample_rate != 11025 && sample_rate != 22050 && sample_rate != 44100 && sample_rate != 48000) { LOG_WARN("equalizer only supports 11025, 22050, 44100 and 48000 sample rates, not %u", sample_rate); return; } equalizer.handle = esp_equalizer_init(2, sample_rate, EQ_BANDS, 0); - equalizer.update = false; - + if (equalizer.handle) { bool active = false; diff --git a/components/wifi-manager/code.js b/components/wifi-manager/code.js index bf065e7a..ab34d109 100644 --- a/components/wifi-manager/code.js +++ b/components/wifi-manager/code.js @@ -50,7 +50,7 @@ var releaseURL = 'https://api.github.com/repos/sle118/squeezelite-esp32/releases var recovery = false; var enableAPTimer = true; var enableStatusTimer = true; -var commandHeader = 'squeezelite -b 500:2000 -d all=info '; +var commandHeader = 'squeezelite -b 500:2000 -d all=info -C 30 -W'; var pname, ver, otapct, otadsc; var blockAjax = false; var blockFlashButton = false; diff --git a/components/wifi-manager/index.html b/components/wifi-manager/index.html index 8c235350..a2813831 100644 --- a/components/wifi-manager/index.html +++ b/components/wifi-manager/index.html @@ -232,7 +232,7 @@

Squeezelite command to run

- +
From 0999d439dde65761713b4558d93aaaa9a7e31b18 Mon Sep 17 00:00:00 2001 From: Philippe G Date: Fri, 5 Jun 2020 16:46:38 -0700 Subject: [PATCH 3/3] knob-only navigation --- components/services/audio_controls.c | 64 +++++++++++++++++++++++++--- components/squeezelite/controls.c | 43 +++++++++++-------- 2 files changed, 83 insertions(+), 24 deletions(-) diff --git a/components/services/audio_controls.c b/components/services/audio_controls.c index f2447993..85ecd1ec 100644 --- a/components/services/audio_controls.c +++ b/components/services/audio_controls.c @@ -11,11 +11,13 @@ #include #include #include +#include "freertos/FreeRTOS.h" +#include "freertos/timers.h" #include "esp_system.h" #include "esp_log.h" #include "cJSON.h" #include "buttons.h" -#include "platform_config.h" +#include "config.h" #include "accessors.h" #include "audio_controls.h" @@ -35,6 +37,7 @@ static esp_err_t actrls_process_action (const cJSON * member, actrls_config_t *c static esp_err_t actrls_init_json(const char *profile_name, bool create); static void control_rotary_handler(void *client, rotary_event_e event, bool long_press); +static void rotary_timer( TimerHandle_t xTimer ); static const actrls_config_map_t actrls_config_map[] = { @@ -70,6 +73,9 @@ static actrls_ir_handler_t *default_ir_handler, *current_ir_handler; static struct { bool long_state; bool volume_lock; + TimerHandle_t timer; + bool click_pending; + int left_count; } rotary; static const struct ir_action_map_s{ @@ -132,8 +138,16 @@ esp_err_t actrls_init(const char *profile_name) { if ((p = strcasestr(config, "A")) != NULL) A = atoi(strchr(p, '=') + 1); if ((p = strcasestr(config, "B")) != NULL) B = atoi(strchr(p, '=') + 1); if ((p = strcasestr(config, "SW")) != NULL) SW = atoi(strchr(p, '=') + 1); - if ((p = strcasestr(config, "volume")) != NULL) rotary.volume_lock = true; - if ((p = strcasestr(config, "longpress")) != NULL) longpress = 1000; + if ((p = strcasestr(config, "knobonly")) != NULL) { + p = strchr(p, '='); + int double_press = p ? atoi(p + 1) : 350; + rotary.timer = xTimerCreate("knobTimer", double_press / portTICK_RATE_MS, pdFALSE, NULL, rotary_timer); + longpress = 500; + ESP_LOGI(TAG, "single knob navigation %d", double_press); + } else { + if ((p = strcasestr(config, "volume")) != NULL) rotary.volume_lock = true; + if ((p = strcasestr(config, "longpress")) != NULL) longpress = 1000; + } // create rotary (no handling of long press) err = create_rotary(NULL, A, B, SW, longpress, control_rotary_handler) ? ESP_OK : ESP_FAIL; @@ -222,17 +236,42 @@ static void control_rotary_handler(void *client, rotary_event_e event, bool long switch(event) { case ROTARY_LEFT: - if (rotary.long_state) action = ACTRLS_PREV; + if (rotary.timer) { + if (rotary.left_count) { + action = KNOB_LEFT; + // need to add a left button the first time + if (rotary.left_count == 1) (*current_controls[KNOB_LEFT])(true); + } + xTimerStart(rotary.timer, 20 / portTICK_RATE_MS); + rotary.left_count++; + } + else if (rotary.long_state) action = ACTRLS_PREV; else if (rotary.volume_lock) action = ACTRLS_VOLDOWN; else action = KNOB_LEFT; break; case ROTARY_RIGHT: - if (rotary.long_state) action = ACTRLS_NEXT; + if (rotary.timer) { + if (rotary.left_count == 1) { + action = ACTRLS_PAUSE; + rotary.left_count = 0; + xTimerStop(rotary.timer, 0); + } else action = KNOB_RIGHT; + } + else if (rotary.long_state) action = ACTRLS_NEXT; else if (rotary.volume_lock) action = ACTRLS_VOLUP; else action = KNOB_RIGHT; break; case ROTARY_PRESSED: - if (long_press) rotary.long_state = !rotary.long_state; + if (rotary.timer) { + if (long_press) action = ACTRLS_PLAY; + else if (rotary.click_pending) { + action = BCTRLS_LEFT; + xTimerStop(rotary.timer, 0); + } + else xTimerStart(rotary.timer, 20 / portTICK_RATE_MS); + rotary.click_pending = !rotary.click_pending; + } + else if (long_press) rotary.long_state = !rotary.long_state; else if (rotary.volume_lock) action = ACTRLS_TOGGLE; else action = KNOB_PUSH; break; @@ -243,6 +282,19 @@ static void control_rotary_handler(void *client, rotary_event_e event, bool long if (action != ACTRLS_NONE) (*current_controls[action])(pressed); } +/**************************************************************************************** + * + */ +static void rotary_timer( TimerHandle_t xTimer ) { + if (rotary.click_pending) { + (*current_controls[KNOB_PUSH])(true); + rotary.click_pending = false; + } else if (rotary.left_count) { + if (rotary.left_count == 1) (*current_controls[KNOB_LEFT])(true); + rotary.left_count = 0; + } +} + /**************************************************************************************** * */ diff --git a/components/squeezelite/controls.c b/components/squeezelite/controls.c index 7c1ff03a..fb6c63ae 100644 --- a/components/squeezelite/controls.c +++ b/components/squeezelite/controls.c @@ -7,7 +7,7 @@ */ #include "squeezelite.h" -#include "platform_config.h" +#include "config.h" #include "audio_controls.h" static log_level loglevel = lINFO; @@ -49,6 +49,7 @@ struct IR_header { static in_addr_t server_ip; static u16_t server_hport; static u16_t server_cport; +static int cli_sock = -1; static u8_t mac[6]; static void (*chained_notify)(in_addr_t, u16_t, u16_t); static bool raw_mode; @@ -243,38 +244,44 @@ const actrls_t LMS_controls = { * */ static void cli_send_cmd(char *cmd) { - char packet[64]; - struct sockaddr_in addr; - socklen_t addrlen = sizeof(addr); - int len, sock = socket(AF_INET, SOCK_STREAM, 0); + char packet[96]; + int len; - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = server_ip; - addr.sin_port = htons(server_cport); - - if (connect(sock, (struct sockaddr *) &addr, addrlen) < 0) { - LOG_ERROR("unable to connect to server %s:%hu with cli", inet_ntoa(server_ip), server_cport); - return; - } - len = sprintf(packet, "%02x:%02x:%02x:%02x:%02x:%02x %s\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], cmd); LOG_DEBUG("sending command %s at %s:%hu", packet, inet_ntoa(server_ip), server_cport); - if (send(sock, packet, len, 0) < 0) { + if (send(cli_sock, packet, len, MSG_DONTWAIT) < 0) { LOG_WARN("cannot send CLI %s", packet); } - - closesocket(sock); + + // need to empty the RX buffer otherwise we'll lock the TCP/IP stack + len = recv(cli_sock, packet, 96, MSG_DONTWAIT); } /**************************************************************************************** * Notification when server changes */ static void notify(in_addr_t ip, u16_t hport, u16_t cport) { + struct sockaddr_in addr; + socklen_t addrlen = sizeof(addr); + server_ip = ip; server_hport = hport; server_cport = cport; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = server_ip; + addr.sin_port = htons(server_cport); + + // close existing CLI connection and open new one + if (cli_sock >= 0) closesocket(cli_sock); + cli_sock = socket(AF_INET, SOCK_STREAM, 0); + + if (connect(cli_sock, (struct sockaddr *) &addr, addrlen) < 0) { + LOG_ERROR("unable to connect to server %s:%hu with cli", inet_ntoa(server_ip), server_cport); + cli_sock = -1; + } + LOG_INFO("notified server %s hport %hu cport %hu", inet_ntoa(ip), hport, cport); if (chained_notify) (*chained_notify)(ip, hport, cport); @@ -303,4 +310,4 @@ void sb_controls_init(void) { chained_notify = server_notify; server_notify = notify; -} +} \ No newline at end of file