#include "config.h"
+#include "audio_controls.h"
-extern bool enable_bt_sink;
-extern bool enable_airplay;
-extern bool jack_mutes_amp;
static const char certs_namespace[] = "certificates";
static const char certs_key[] = "blob";
static const char certs_version[] = "version";
@@ -64,19 +62,13 @@ static const char TAG[] = "esp_app_main";
#define DEFAULT_HOST_NAME "squeezelite"
char * fwurl = NULL;
-#ifdef CONFIG_SQUEEZEAMP
-#define LED_GREEN_GPIO 12
-#define LED_RED_GPIO 13
-#else
-#define LED_GREEN_GPIO -1
-#define LED_RED_GPIO -1
-#endif
static bool bWifiConnected=false;
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");
-
-
+// as an exception _init function don't need include
+extern void services_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){
@@ -239,7 +231,6 @@ void register_default_nvs(){
esp_read_mac((uint8_t *)&mac, ESP_MAC_WIFI_STA);
snprintf(macStr, LOCAL_MAC_SIZE-1,"-%x%x%x", mac[3], mac[4], mac[5]);
-
DEFAULT_NAME_WITH_MAC(default_bt_name,CONFIG_BT_NAME);
ESP_LOGD(TAG,"Registering default value for key %s, value %s", "bt_name", default_bt_name);
config_set_default(NVS_TYPE_STR, "bt_name", default_bt_name, 0);
@@ -287,8 +278,8 @@ void register_default_nvs(){
ESP_LOGD(TAG,"Registering default value for key %s, value %s", "bypass_wm", "0");
config_set_default(NVS_TYPE_STR, "bypass_wm", "0", 0);
- ESP_LOGD(TAG,"Registering default value for key %s, value %s", "test_num", "0");
-
+ ESP_LOGD(TAG,"Registering default Audio control board type %s, value ","actrls_config");
+ config_set_default(NVS_TYPE_STR, "actrls_config", "", 0);
char number_buffer[101] = {};
snprintf(number_buffer,sizeof(number_buffer)-1,"%u",OTA_FLASH_ERASE_BLOCK);
@@ -304,35 +295,20 @@ void register_default_nvs(){
config_set_default(NVS_TYPE_STR, "ota_prio", number_buffer, 0);
ESP_LOGD(TAG,"Registering default value for key %s, value %s", "enable_bt_sink", STR(CONFIG_BT_SINK));
- char * flag = config_alloc_get_default(NVS_TYPE_STR, "enable_bt_sink", STR(CONFIG_BT_SINK), 0);
- if(flag !=NULL){
- enable_bt_sink= (strcmp(flag,"1")==0 ||strcasecmp(flag,"y")==0);
- free(flag);
- }
- else {
- ESP_LOGE(TAG,"Unable to get flag 'enable_bt_sink'");
- }
+ config_set_default(NVS_TYPE_STR, "enable_bt_sink", STR(CONFIG_BT_SINK), 0);
+
ESP_LOGD(TAG,"Registering default value for key %s, value %s", "enable_airplay", STR(CONFIG_AIRPLAY_SINK));
- flag = config_alloc_get_default(NVS_TYPE_STR, "enable_airplay", STR(CONFIG_AIRPLAY_SINK), 0);
- if(flag !=NULL){
- enable_airplay= (strcmp(flag,"1")==0 ||strcasecmp(flag,"y")==0);
- free(flag);
- }
- else {
- ESP_LOGE(TAG,"Unable to get flag 'enable_airplay'");
- }
+ config_set_default(NVS_TYPE_STR, "enable_airplay", STR(CONFIG_AIRPLAY_SINK), 0);
-
- ESP_LOGD(TAG,"Registering default value for key %s, value %s", "jack_mutes_amp", "n");
- flag = config_alloc_get_default(NVS_TYPE_STR, "jack_mutes_amp", "n", 0);
-
- if(flag !=NULL){
- jack_mutes_amp= (strcmp(flag,"1")==0 ||strcasecmp(flag,"y")==0);
- free(flag);
- }
- else {
- ESP_LOGE(TAG,"Unable to get flag 'jack_mutes_amp'");
- }
+ ESP_LOGD(TAG,"Registering default value for key %s, value %s", "display_config", STR(CONFIG_DISPLAY_CONFIG));
+ config_set_default(NVS_TYPE_STR, "display_config", STR(CONFIG_DISPLAY_CONFIG), 0);
+
+ ESP_LOGD(TAG,"Registering default value for key %s", "i2c_config");
+ config_set_default(NVS_TYPE_STR, "i2c_config", "", 0);
+
+ ESP_LOGD(TAG,"Registering default value for key %s", "Vcc_GPIO");
+ config_set_default(NVS_TYPE_STR, "Vcc_GPIO", "", 0);
+
ESP_LOGD(TAG,"Done setting default values in nvs.");
}
@@ -344,7 +320,7 @@ void app_main()
wifi_event_group = xEventGroupCreate();
ESP_LOGD(TAG,"Clearing CONNECTED_BIT from wifi group");
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
-
+
ESP_LOGI(TAG,"Starting app_main");
initialize_nvs();
@@ -354,6 +330,12 @@ void app_main()
ESP_LOGI(TAG,"Registering default values");
register_default_nvs();
+ ESP_LOGD(TAG,"Configuring services");
+ services_init();
+
+ ESP_LOGD(TAG,"Initializing display");
+ display_init("SqueezeESP32");
+
#if !RECOVERY_APPLICATION
ESP_LOGI(TAG,"Checking if certificates need to be updated");
update_certificates();
@@ -362,7 +344,6 @@ void app_main()
ESP_LOGD(TAG,"Getting firmware OTA URL (if any)");
fwurl = process_ota_url();
-
ESP_LOGD(TAG,"Getting value for WM bypass, nvs 'bypass_wm'");
char * bypass_wm = config_alloc_get_default(NVS_TYPE_STR, "bypass_wm", "0", 0);
if(bypass_wm==NULL)
@@ -374,11 +355,17 @@ void app_main()
bypass_wifi_manager=(strcmp(bypass_wm,"1")==0 ||strcasecmp(bypass_wm,"y")==0);
}
- ESP_LOGD(TAG,"Configuring Green led");
-
- led_config(LED_GREEN, LED_GREEN_GPIO, 0);
- ESP_LOGD(TAG,"Configuring Red led");
- led_config(LED_RED, LED_RED_GPIO, 0);
+ ESP_LOGD(TAG,"Getting audio control mapping ");
+ char *actrls_config = config_alloc_get_default(NVS_TYPE_STR, "actrls_config", NULL, 0);
+ if (actrls_config) {
+ if(actrls_config[0] !='\0'){
+ ESP_LOGD(TAG,"Initializing audio control buttons type %s", actrls_config);
+ actrls_init_json(actrls_config, true);
+ }
+ free(actrls_config);
+ } else {
+ ESP_LOGD(TAG,"No audio control buttons");
+ }
/* start the wifi manager */
ESP_LOGD(TAG,"Blinking led");
diff --git a/plugin/SqueezeESP32.zip b/plugin/SqueezeESP32.zip
new file mode 100644
index 00000000..d9a21459
Binary files /dev/null and b/plugin/SqueezeESP32.zip differ
diff --git a/plugin/SqueezeESP32/Graphics.pm b/plugin/SqueezeESP32/Graphics.pm
new file mode 100644
index 00000000..811e2008
--- /dev/null
+++ b/plugin/SqueezeESP32/Graphics.pm
@@ -0,0 +1,83 @@
+package Plugins::SqueezeESP32::Graphics;
+
+use strict;
+
+use base qw(Slim::Display::Squeezebox2);
+
+use Slim::Utils::Prefs;
+use Slim::Utils::Log;
+
+my $prefs = preferences('plugin.squeezeesp32');
+my $log = logger('plugin.squeezeesp32');
+
+my $VISUALIZER_NONE = 0;
+my $width = $prefs->get('width') || 128;
+
+my @modes = (
+ # mode 0
+ { desc => ['BLANK'],
+ bar => 0, secs => 0, width => $width,
+ params => [$VISUALIZER_NONE] },
+ # mode 1
+ { desc => ['PROGRESS_BAR'],
+ bar => 1, secs => 0, width => $width,
+ params => [$VISUALIZER_NONE] },
+ # mode 2
+ { desc => ['ELAPSED'],
+ bar => 0, secs => 1, width => $width,
+ params => [$VISUALIZER_NONE] },
+ # mode 3
+ { desc => ['ELAPSED', 'AND', 'PROGRESS_BAR'],
+ bar => 1, secs => 1, width => $width,
+ params => [$VISUALIZER_NONE] },
+ # mode 4
+ { desc => ['REMAINING'],
+ bar => 0, secs => -1, width => $width,
+ params => [$VISUALIZER_NONE] },
+ # mode 5
+ { desc => ['CLOCK'],
+ bar => 0, secs => 0, width => $width, clock => 1,
+ params => [$VISUALIZER_NONE] },
+ # mode 6
+ { desc => ['SETUP_SHOWBUFFERFULLNESS'],
+ bar => 0, secs => 0, width => $width, fullness => 1,
+ params => [$VISUALIZER_NONE] },
+);
+
+sub modes {
+ return \@modes;
+}
+
+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
+
+sub brightnessMap {
+ return (65535, 10, 50, 100, 200);
+}
+
+=comment
+sub bytesPerColumn {
+ return 4;
+}
+=cut
+
+sub displayHeight {
+ return 32;
+}
+
+sub displayWidth {
+ return shift->widthOverride(@_) || $width;
+}
+
+sub vfdmodel {
+ 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/Player.pm b/plugin/SqueezeESP32/Player.pm
new file mode 100644
index 00000000..38b4e6a2
--- /dev/null
+++ b/plugin/SqueezeESP32/Player.pm
@@ -0,0 +1,41 @@
+package Plugins::SqueezeESP32::Player;
+
+use strict;
+use base qw(Slim::Player::SqueezePlay);
+
+use Slim::Utils::Log;
+use Slim::Utils::Prefs;
+
+my $prefs = preferences('plugin.squeezeesp32');
+
+sub model { 'squeezeesp32' }
+sub modelName { 'SqueezeESP32' }
+sub hasIR { 0 }
+
+# We need to implement this to allow us to receive SETD commands
+# and we need SETD to support custom display widths
+sub directBodyFrame { 1 }
+
+# Allow the player to define it's display width (and probably more)
+sub playerSettingsFrame {
+ my $client = shift;
+ my $data_ref = shift;
+
+ my $value;
+ my $id = unpack('C', $$data_ref);
+
+ # New SETD command 0xfe for display width
+ if ($id == 0xfe) {
+ $value = (unpack('CC', $$data_ref))[1];
+ if ($value > 10 && $value < 200) {
+ $client->display->widthOverride(1, $value);
+ $client->update;
+ }
+ }
+}
+
+sub hasScrolling {
+ return 1;
+}
+
+1;
diff --git a/plugin/SqueezeESP32/Plugin.pm b/plugin/SqueezeESP32/Plugin.pm
new file mode 100644
index 00000000..893500b0
--- /dev/null
+++ b/plugin/SqueezeESP32/Plugin.pm
@@ -0,0 +1,34 @@
+package Plugins::SqueezeESP32::Plugin;
+
+use strict;
+
+use base qw(Slim::Plugin::Base);
+use Slim::Utils::Prefs;
+use Slim::Utils::Log;
+
+my $prefs = preferences('plugin.squeezeesp32');
+
+$prefs->init({
+ width => 128,
+});
+
+my $log = Slim::Utils::Log->addLogCategory({
+ 'category' => 'plugin.squeezeesp32',
+ 'defaultLevel' => 'INFO',
+ 'description' => Slim::Utils::Strings::string('SqueezeESP32'),
+});
+
+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' });
+ $log->info("Added class 100 for SqueezeESP32");
+}
+
+1;
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/Text.pm b/plugin/SqueezeESP32/Text.pm
new file mode 100644
index 00000000..3048c312
--- /dev/null
+++ b/plugin/SqueezeESP32/Text.pm
@@ -0,0 +1,12 @@
+package Plugins::SqueezeESP32::Text;
+
+use strict;
+
+use base qw(Slim::Display::Text);
+
+# we don't want the special Noritake codes
+sub vfdmodel {
+ return 'squeezeslave';
+}
+
+1;
\ No newline at end of file
diff --git a/plugin/SqueezeESP32/install.xml b/plugin/SqueezeESP32/install.xml
new file mode 100644
index 00000000..755b1edd
--- /dev/null
+++ b/plugin/SqueezeESP32/install.xml
@@ -0,0 +1,15 @@
+
+
+ enabled
+ philippe_44@outlook.com
+
+ *
+ *.*
+ SlimServer
+
+ PLUGIN_SQUEEZEESP32
+ PLUGIN_SQUEEZEESP32_DESC
+ Plugins::SqueezeESP32::Plugin
+ 0.7
+ Philippe
+
diff --git a/plugin/SqueezeESP32/strings.txt b/plugin/SqueezeESP32/strings.txt
new file mode 100644
index 00000000..ae441532
--- /dev/null
+++ b/plugin/SqueezeESP32/strings.txt
@@ -0,0 +1,11 @@
+WELCOME_TO_SQUEEZEESP32
+ EN Welcome to SqueezeESP32
+
+PLUGIN_SQUEEZEESP32
+ EN SqueezeESP32
+
+PLUGIN_SQUEEZEESP32_DESC
+ EN Adds a new player id (100) to enable display with SqueezeESP32
+
+PLUGIN_SQUEEZEESP32_WIDTH
+ EN Screen width
diff --git a/plugin/repo.xml b/plugin/repo.xml
new file mode 100644
index 00000000..65171627
--- /dev/null
+++ b/plugin/repo.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ https://github.com/sle118/squeezelite-esp32
+ Philippe
+ a1d676e7a3a2d241d17a39aff05bcb8377565a76
+ philippe_44@outlook.com
+ SqueezeESP32 additional player id (100)
+ http://github.com/sle118/squeezelite-esp32/raw/master/plugin/SqueezeESP32.zip
+ SqueezeESP32
+
+
+
+ SqueezeESP32 related plugins
+
+
diff --git a/repo.xml b/repo.xml
new file mode 100644
index 00000000..c0014836
--- /dev/null
+++ b/repo.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ 8f04d2d7bd3028e499af09184f51ee20254c550c
+ SqueezESP32 display extension
+ https://raw.githubusercontent.com/sle118/squeezelite-esp32/master/plugin/SqueezeESP32.zip
+ SqueezeESP32
+
+
+
+ Plugins for ESP32-based devices
+
+