mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-08 12:37:01 +03:00
Merge with master
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# Squeezelite-esp32
|
# Squeezelite-esp32
|
||||||
## Supported Hardware
|
## Supported Hardware
|
||||||
### SqueezeAMP
|
### 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.
|
Use the `squeezelite-esp32-SqueezeAmp-sdkconfig.defaults` configuration file.
|
||||||
|
|
||||||
|
|||||||
@@ -26,17 +26,19 @@
|
|||||||
#include "embedded.h"
|
#include "embedded.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
|
|
||||||
#define TAG "display"
|
static const char *TAG = "display";
|
||||||
|
|
||||||
static bool (*slimp_handler_chain)(u8_t *data, int len);
|
static bool (*slimp_handler_chain)(u8_t *data, int len);
|
||||||
static struct display_handle_s *handle;
|
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);
|
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");
|
char *item = config_alloc_get(NVS_TYPE_STR, "display_config");
|
||||||
|
|
||||||
if (item && *item) {
|
if (item && *item) {
|
||||||
@@ -52,15 +54,27 @@ void display_init(void) {
|
|||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
ESP_LOGE(TAG,"Unknown display driver name in display config: %s",item);
|
ESP_LOGE(TAG,"Unknown display driver name in display config: %s",item);
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGW(TAG, "no display");
|
ESP_LOGW(TAG, "no display");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chained_notify = server_notify;
|
||||||
|
server_notify = server_attach;
|
||||||
|
|
||||||
if (item) free(item);
|
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
|
* Process graphic display data
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -19,7 +19,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
struct display_handle_s {
|
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 (*vfdc_handler)(u8_t *data, int len);
|
||||||
void (*grfe_handler)(u8_t *data, int len);
|
void (*grfe_handler)(u8_t *data, int len);
|
||||||
void (*grfb_handler)(u8_t *data, int len);
|
void (*grfb_handler)(u8_t *data, int len);
|
||||||
|
|||||||
@@ -32,14 +32,16 @@
|
|||||||
#define I2C_PORT 1
|
#define I2C_PORT 1
|
||||||
#define I2C_ADDRESS 0x3C
|
#define I2C_ADDRESS 0x3C
|
||||||
#define LINELEN 40
|
#define LINELEN 40
|
||||||
#define TAG "display"
|
static const char *TAG = "display";
|
||||||
|
|
||||||
static void vfdc_handler( u8_t *_data, int bytes_read);
|
static void vfdc_handler( u8_t *_data, int bytes_read);
|
||||||
void grfe_handler( u8_t *data, int len);
|
static void grfe_handler( u8_t *data, int len);
|
||||||
static bool display_init(char *config);
|
static bool display_init(char *config, char *welcome);
|
||||||
|
static void print_message(char *msg);
|
||||||
|
|
||||||
struct display_handle_s SSD1306_handle = {
|
struct display_handle_s SSD1306_handle = {
|
||||||
display_init,
|
display_init,
|
||||||
|
print_message,
|
||||||
vfdc_handler,
|
vfdc_handler,
|
||||||
grfe_handler,
|
grfe_handler,
|
||||||
NULL, NULL,
|
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;
|
bool res = false;
|
||||||
|
|
||||||
if (strstr(config, "I2C")) {
|
if (strstr(config, "I2C")) {
|
||||||
@@ -105,6 +107,7 @@ static bool display_init(char *config) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(res){
|
if(res){
|
||||||
|
print_message(welcome);
|
||||||
ESP_LOGI(TAG, "Initialized I2C display %dx%d (sda:%d, scl:%d, address:%02x)", width, height, sda, scl, address);
|
ESP_LOGI(TAG, "Initialized I2C display %dx%d (sda:%d, scl:%d, address:%02x)", width, height, sda, scl, address);
|
||||||
} else {
|
} else {
|
||||||
ESP_LOGE(TAG, "Cannot initialized I2C display %s [%dx%d sda:%d, scl:%d, address:%02x]", config, width, height, sda, scl, address);
|
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;
|
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
|
* Change special LCD chars to something more printable on screen
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -200,7 +200,8 @@ static bool SSD1306_Init( struct SSD1306_Device* DeviceHandle, int Width, int He
|
|||||||
DeviceHandle->Height = Height;
|
DeviceHandle->Height = Height;
|
||||||
DeviceHandle->FramebufferSize = ( DeviceHandle->Width * Height ) / 8;
|
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 );
|
NullCheck( DeviceHandle->Framebuffer, return false );
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
#define BATTERY_TIMER (10*1000)
|
#define BATTERY_TIMER (10*1000)
|
||||||
|
|
||||||
static const char TAG[] = "battery";
|
static const char *TAG = "battery";
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
float sum, avg;
|
float sum, avg;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
#define MAX_LED 8
|
#define MAX_LED 8
|
||||||
#define BLOCKTIME 10 // up to portMAX_DELAY
|
#define BLOCKTIME 10 // up to portMAX_DELAY
|
||||||
|
|
||||||
static const char TAG[] = "led";
|
static const char *TAG = "led";
|
||||||
|
|
||||||
static struct led_s {
|
static struct led_s {
|
||||||
gpio_num_t gpio;
|
gpio_num_t gpio;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
#define MONITOR_TIMER (10*1000)
|
#define MONITOR_TIMER (10*1000)
|
||||||
|
|
||||||
static const char TAG[] = "monitor";
|
static const char *TAG = "monitor";
|
||||||
|
|
||||||
static TimerHandle_t monitor_timer;
|
static TimerHandle_t monitor_timer;
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,8 @@ static void sendHELO(bool reconnect, const char *fixed_cap, const char *var_cap,
|
|||||||
base_cap = BASE_CAP;
|
base_cap = BASE_CAP;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!reconnect) player_id = PLAYER_ID;
|
||||||
|
|
||||||
memset(&pkt, 0, sizeof(pkt));
|
memset(&pkt, 0, sizeof(pkt));
|
||||||
memcpy(&pkt.opcode, "HELO", 4);
|
memcpy(&pkt.opcode, "HELO", 4);
|
||||||
pkt.length = htonl(sizeof(struct HELO_packet) - 8 + strlen(base_cap) + strlen(fixed_cap) + strlen(var_cap));
|
pkt.length = htonl(sizeof(struct HELO_packet) - 8 + strlen(base_cap) + strlen(fixed_cap) + strlen(var_cap));
|
||||||
|
|||||||
@@ -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 const uint8_t server_cert_pem_end[] asm("_binary_github_pem_end");
|
||||||
|
|
||||||
extern void services_init(void);
|
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 */
|
/* 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){
|
void cb_connection_got_ip(void *pvParameter){
|
||||||
@@ -337,7 +337,7 @@ void app_main()
|
|||||||
services_init();
|
services_init();
|
||||||
|
|
||||||
ESP_LOGD(TAG,"Initializing display");
|
ESP_LOGD(TAG,"Initializing display");
|
||||||
display_init();
|
display_init("SqueezeESP32");
|
||||||
|
|
||||||
#if !RECOVERY_APPLICATION
|
#if !RECOVERY_APPLICATION
|
||||||
ESP_LOGI(TAG,"Checking if certificates need to be updated");
|
ESP_LOGI(TAG,"Checking if certificates need to be updated");
|
||||||
|
|||||||
@@ -4,6 +4,47 @@ use strict;
|
|||||||
|
|
||||||
use base qw(Slim::Display::Squeezebox2);
|
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
|
=comment
|
||||||
sub bytesPerColumn {
|
sub bytesPerColumn {
|
||||||
return 4;
|
return 4;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ sub initPlugin {
|
|||||||
my $class = shift;
|
my $class = shift;
|
||||||
|
|
||||||
$class->SUPER::initPlugin(@_);
|
$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");
|
$log->info("Added class 100 for SqueezeESP32");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
plugin/SqueezeESP32/SqueezeESP32.zip
Normal file
BIN
plugin/SqueezeESP32/SqueezeESP32.zip
Normal file
Binary file not shown.
@@ -7,7 +7,9 @@
|
|||||||
<maxVersion>*.*</maxVersion>
|
<maxVersion>*.*</maxVersion>
|
||||||
<id>SlimServer</id>
|
<id>SlimServer</id>
|
||||||
</targetApplication>
|
</targetApplication>
|
||||||
|
<name>PLUGIN_SQUEEZEESP32</name>
|
||||||
|
<description>PLUGIN_SQUEEZEESP32_DESC</description>
|
||||||
<module>Plugins::SqueezeESP32::Plugin</module>
|
<module>Plugins::SqueezeESP32::Plugin</module>
|
||||||
<version>0.1</version>
|
<version>0.3</version>
|
||||||
<creator>Philippe</creator>
|
<creator>Philippe</creator>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|||||||
@@ -1,2 +1,9 @@
|
|||||||
WELCOME_TO_SQUEEZEESP32
|
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
plugin/repo.xml
Normal file
17
plugin/repo.xml
Normal file
@@ -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>
|
||||||
Reference in New Issue
Block a user