diff --git a/components/config/config.c b/components/config/config.c index 0776c282..62763fa7 100644 --- a/components/config/config.c +++ b/components/config/config.c @@ -25,7 +25,6 @@ #include #include #include "esp_system.h" -#include "ctype.h" #include "esp_log.h" #include "esp_console.h" #include "esp_vfs_dev.h" @@ -90,10 +89,10 @@ static void * free_fn(void * ptr){ } #endif void init_cJSON(){ + static cJSON_Hooks hooks; // initialize cJSON hooks it uses SPIRAM memory // as opposed to IRAM #if RECOVERY_APPLICATION==0 - static cJSON_Hooks hooks; // In squeezelite mode, allocate memory from PSRAM. Otherwise allocate from internal RAM // as recovery will lock flash access when erasing FLASH or writing to OTA partition. hooks.malloc_fn=&malloc_fn; @@ -705,39 +704,6 @@ esp_err_t config_set_value(nvs_type_t nvs_type, const char *key, void * value){ return result; } -#define IS_ALPHA(c) isalpha((int)c) -#define TO_UPPER(c) toupper((int)c) - - - - -char * strstri (const char * str1, const char * str2){ - char *cp = (char *) str1; - char *s1, *s2; - - if ( *str2=='\0' ) - return((char *)str1); - - while (*cp){ - s1 = cp; - s2 = (char *) str2; - while ( *s1!='\0' && *s2!='\0' && (IS_ALPHA(*s1) && IS_ALPHA(*s2))?!(TO_UPPER(*s1) - TO_UPPER(*s2)):!(*s1-*s2)){ - ESP_LOGW(TAG,"Matched [%c] = [%c] ", IS_ALPHA(*s1)?TO_UPPER(*s1):*s1,IS_ALPHA(*s2)?TO_UPPER(*s2):*s2); - ++s1, ++s2; - } - - - if (*s2=='\0'){ - ESP_LOGW(TAG,"String %s found!", str2); - return(cp); - } - - ++cp; - ESP_LOGW(TAG,"%s not found. s2 is [%c]. Moving forward to %s", str2, *s2, cp); - } - ESP_LOGW(TAG,"String %s not found", str2); - return(NULL); -} IMPLEMENT_SET_DEFAULT(uint8_t,NVS_TYPE_U8); IMPLEMENT_SET_DEFAULT(int8_t,NVS_TYPE_I8); IMPLEMENT_SET_DEFAULT(uint16_t,NVS_TYPE_U16); @@ -751,4 +717,3 @@ IMPLEMENT_GET_NUM(uint16_t,NVS_TYPE_U16); IMPLEMENT_GET_NUM(int16_t,NVS_TYPE_I16); IMPLEMENT_GET_NUM(uint32_t,NVS_TYPE_U32); IMPLEMENT_GET_NUM(int32_t,NVS_TYPE_I32); - diff --git a/components/config/config.h b/components/config/config.h index 3b4a74c7..f83c7276 100644 --- a/components/config/config.h +++ b/components/config/config.h @@ -37,4 +37,4 @@ void * config_alloc_get(nvs_type_t nvs_type, const char *key) ; bool wait_for_commit(); char * config_alloc_get_json(bool bFormatted); esp_err_t config_set_value(nvs_type_t nvs_type, const char *key, void * value); -char * strstri (const char * str1, const char * str2); + diff --git a/components/display/display.c b/components/display/display.c index 0b3b20df..33bf0b40 100644 --- a/components/display/display.c +++ b/components/display/display.c @@ -64,7 +64,7 @@ void display_init(char *welcome) { if (item && *item) { char * drivername=strstr(item,"driver"); - if( !drivername || (drivername && (strstr(drivername,"SSD1306") || strstr(drivername,"ssd1306")))){ + if (!drivername || (drivername && strcasestr(drivername,"SSD1306"))) { handle = &SSD1306_handle; if (handle->init(item, welcome)) { slimp_handler_chain = slimp_handler; @@ -73,7 +73,7 @@ void display_init(char *welcome) { } else { ESP_LOGE(TAG, "Display initialization failed"); } - }else { + } else { ESP_LOGE(TAG,"Unknown display driver name in display config: %s",item); } } else { diff --git a/components/display/driver_SSD1306.c b/components/display/driver_SSD1306.c index 126cdf86..d69d3bec 100644 --- a/components/display/driver_SSD1306.c +++ b/components/display/driver_SSD1306.c @@ -246,7 +246,7 @@ static void vfdc_handler( u8_t *_data, int bytes_read) { void grfe_handler( u8_t *data, int len) { data += 8; len -= 8; - + #ifndef FULL_REFRESH // force addressing mode by lines if (AddressMode != AddressMode_Horizontal) { @@ -255,7 +255,7 @@ void grfe_handler( u8_t *data, int len) { } // try to minmize I2C traffic which is very slow - int rows = Display.Height / 8; + int rows = (Display.Height > 32) ? 4 : Display.Height / 8; for (int r = 0; r < rows; r++) { uint8_t first = 0, last; uint8_t *optr = Display.Framebuffer + r*Display.Width, *iptr = data + r; @@ -281,12 +281,15 @@ void grfe_handler( u8_t *data, int len) { // to be verified, but this is as fast as using a pointer on data for (int i = len - 1; i >= 0; i--) data[i] = BitReverseTable256[data[i]]; + if (Display.Height > 32) SSD1306_SetPageAddress( &Display, 0, 32/8-1); + // force addressing mode by columns if (AddressMode != AddressMode_Vertical) { AddressMode = AddressMode_Vertical; SSD1306_SetDisplayAddressMode( &Display, AddressMode ); } - SSD1306_WriteRawData( &Display, data, len); + + SSD1306_WriteRawData(&Display, data, len); #endif } diff --git a/components/display/tarablessd1306/ssd1306.c b/components/display/tarablessd1306/ssd1306.c index c94fed83..343652cd 100644 --- a/components/display/tarablessd1306/ssd1306.c +++ b/components/display/tarablessd1306/ssd1306.c @@ -209,7 +209,7 @@ static bool SSD1306_Init( struct SSD1306_Device* DeviceHandle, int Width, int He SSD1306_HWReset( DeviceHandle ); /* Init sequence according to SSD1306.pdf */ - SSD1306_SetMuxRatio( DeviceHandle, 0x3F ); + SSD1306_SetMuxRatio( DeviceHandle, Height - 1 ); SSD1306_SetDisplayOffset( DeviceHandle, 0x00 ); SSD1306_SetDisplayStartLine( DeviceHandle, 0 ); SSD1306_SetHFlip( DeviceHandle, false ); diff --git a/components/services/audio_controls.c b/components/services/audio_controls.c index 5acc7db9..974e8d8f 100644 --- a/components/services/audio_controls.c +++ b/components/services/audio_controls.c @@ -89,7 +89,7 @@ static void control_handler(void *client, button_event_e event, button_press_e p ESP_LOGD(TAG, "control gpio:%u press:%u long:%u event:%u action:%u", key->gpio, press, long_press, event, action); if (action > ACTRLS_MAX) { - // need to do the remap here + // need to do the remap here using button_remap ESP_LOGD(TAG, "remapping buttons"); } else if (action != ACTRLS_NONE) { ESP_LOGD(TAG, "calling action %u", action); @@ -304,8 +304,6 @@ esp_err_t actrls_init_json(const char *config) { esp_err_t loc_err = actrls_process_button(button, cur_config); err = (err == ESP_OK) ? loc_err : err; if (loc_err == ESP_OK) { - - ESP_LOGI(TAG, "Calling button_create"); button_create((void*) cur_config, cur_config->gpio,cur_config->type, cur_config->pull,cur_config->debounce, control_handler, cur_config->long_press, cur_config->shifter_gpio); } diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip index 15126a7d..ddffccc8 100644 Binary files a/plugin/SqueezeESP32.zip and b/plugin/SqueezeESP32.zip differ diff --git a/plugin/SqueezeESP32/Graphics.pm b/plugin/SqueezeESP32/Graphics.pm index dadd335a..e1a61f9e 100644 --- a/plugin/SqueezeESP32/Graphics.pm +++ b/plugin/SqueezeESP32/Graphics.pm @@ -4,36 +4,42 @@ use strict; use base qw(Slim::Display::Squeezebox2); +use Slim::Utils::Prefs; +use Slim::Utils::Log; + +my $prefs = preferences('plugin.squeezeesp32'); + my $VISUALIZER_NONE = 0; +my $width = $prefs->get('width') || 128; my @modes = ( # mode 0 { desc => ['BLANK'], - bar => 0, secs => 0, width => 128, + bar => 0, secs => 0, width => $width, params => [$VISUALIZER_NONE] }, # mode 1 { desc => ['PROGRESS_BAR'], - bar => 1, secs => 0, width => 128, + bar => 1, secs => 0, width => $width, params => [$VISUALIZER_NONE] }, # mode 2 { desc => ['ELAPSED'], - bar => 0, secs => 1, width => 128, + bar => 0, secs => 1, width => $width, params => [$VISUALIZER_NONE] }, # mode 3 { desc => ['ELAPSED', 'AND', 'PROGRESS_BAR'], - bar => 1, secs => 1, width => 128, + bar => 1, secs => 1, width => $width, params => [$VISUALIZER_NONE] }, # mode 4 { desc => ['REMAINING'], - bar => 0, secs => -1, width => 128, + bar => 0, secs => -1, width => $width, params => [$VISUALIZER_NONE] }, # mode 5 { desc => ['CLOCK'], - bar => 0, secs => 0, width => 128, clock => 1, + bar => 0, secs => 0, width => $width, clock => 1, params => [$VISUALIZER_NONE] }, # mode 6 { desc => ['SETUP_SHOWBUFFERFULLNESS'], - bar => 0, secs => 0, width => 128, fullness => 1, + bar => 0, secs => 0, width => $width, fullness => 1, params => [$VISUALIZER_NONE] }, ); @@ -45,6 +51,12 @@ sub nmodes { return $#modes; } +# I don't think LMS renderer handles properly screens other than 32 pixels. It +# seems that all we get is a 32 pixel-tall data with anything else padded to 0 +# i.e. if we try 64 pixels height, bytes 0..3 and 4..7 will contains the same +# pattern than the 32 pixels version, where one would have expected bytes 4..7 +# to be empty + =comment sub bytesPerColumn { return 4; @@ -56,11 +68,11 @@ sub displayHeight { } sub displayWidth { - return shift->widthOverride(@_) || 128; + return shift->widthOverride(@_) || $width; } sub vfdmodel { - return 'graphic-128x32'; + return 'graphic-'.$width.'x32'; } 1; \ No newline at end of file diff --git a/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/basic.html b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/basic.html new file mode 100644 index 00000000..f6cffbe7 --- /dev/null +++ b/plugin/SqueezeESP32/HTML/EN/plugins/SqueezeESP32/settings/basic.html @@ -0,0 +1,11 @@ +[% PROCESS settings/header.html %] + +
+ + [% WRAPPER setting title="PLUGIN_SQUEEZEESP32_WIDTH" desc="PLUGIN_SQUEEZEESP32_WIDTH_DESC" %] + + [% END %] + +
+ +[% PROCESS settings/footer.html %] diff --git a/plugin/SqueezeESP32/Plugin.pm b/plugin/SqueezeESP32/Plugin.pm index 80a074fa..893500b0 100644 --- a/plugin/SqueezeESP32/Plugin.pm +++ b/plugin/SqueezeESP32/Plugin.pm @@ -8,7 +8,9 @@ use Slim::Utils::Log; my $prefs = preferences('plugin.squeezeesp32'); -$prefs->init(); +$prefs->init({ + width => 128, +}); my $log = Slim::Utils::Log->addLogCategory({ 'category' => 'plugin.squeezeesp32', @@ -18,6 +20,11 @@ my $log = Slim::Utils::Log->addLogCategory({ sub initPlugin { my $class = shift; + + if ( main::WEBUI ) { + require Plugins::SqueezeESP32::Settings; + Plugins::SqueezeESP32::Settings->new; + } $class->SUPER::initPlugin(@_); Slim::Networking::Slimproto::addPlayerClass($class, 100, 'squeezeesp32', { client => 'Plugins::SqueezeESP32::Player', display => 'Plugins::SqueezeESP32::Graphics' }); diff --git a/plugin/SqueezeESP32/Settings.pm b/plugin/SqueezeESP32/Settings.pm new file mode 100644 index 00000000..0281fb07 --- /dev/null +++ b/plugin/SqueezeESP32/Settings.pm @@ -0,0 +1,30 @@ +package Plugins::SqueezeESP32::Settings; +use base qw(Slim::Web::Settings); + +use strict; + +use Slim::Utils::Prefs; +use Slim::Utils::Log; + +my $log = logger('plugin.SqueezeESP32'); + +sub name { + return 'PLUGIN_SQUEEZEESP32'; +} + +sub page { + return 'plugins/SqueezeESP32/settings/basic.html'; +} + +sub prefs { + return (preferences('plugin.SqueezeESP32'), qw(width)); +} + +sub handler { + my ($class, $client, $params, $callback, @args) = @_; + + $callback->($client, $params, $class->SUPER::handler($client, $params), @args); +} + + +1; diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml index 626fd90d..544f5917 100644 --- a/plugin/SqueezeESP32/install.xml +++ b/plugin/SqueezeESP32/install.xml @@ -10,6 +10,6 @@ PLUGIN_SQUEEZEESP32 PLUGIN_SQUEEZEESP32_DESC Plugins::SqueezeESP32::Plugin - 0.3 + 0.4 Philippe diff --git a/plugin/SqueezeESP32/strings.txt b/plugin/SqueezeESP32/strings.txt index 2009781f..b2c86fb6 100644 --- a/plugin/SqueezeESP32/strings.txt +++ b/plugin/SqueezeESP32/strings.txt @@ -2,8 +2,11 @@ WELCOME_TO_SQUEEZEESP32 EN Welcome to SqueezeESP32 PLUGIN_SQUEEZEESP32 - SqueezeESP32 + EN SqueezeESP32 PLUGIN_SQUEEZEESP32_DESC - Adds a new player id (100) to enable display with SqueezeESP32 + EN Adds a new player id (100) to enable display with SqueezeESP32 + +PLUGIN_SQUEEZEESP32_WIDTH + EN Screen width \ No newline at end of file diff --git a/plugin/repo.xml b/plugin/repo.xml index 5d67e7c1..9467e48f 100644 --- a/plugin/repo.xml +++ b/plugin/repo.xml @@ -1,10 +1,10 @@ - + https://github.com/sle118/squeezelite-esp32 Philippe - 799ae4860f9c009ac25c2ec35eb4070c5f474659 + cec20d0489ed120d56ea2de836c616c7d970c0d5 philippe_44@outlook.com SqueezeESP32 additional player id (100) http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32.zip