Fix recovery

This commit is contained in:
Sebastien L
2023-10-28 22:48:12 -04:00
parent 9619b1d792
commit c76bbc3524
16 changed files with 2360 additions and 2253 deletions

View File

@@ -25,7 +25,11 @@ ENV GCC_TOOLS_BASE=/opt/esp/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtens
# pushd components/wifi-manager/webapp/ && npm install && npm run-script build && popd # pushd components/wifi-manager/webapp/ && npm install && npm run-script build && popd
# #
# to run the docker with netwotrk port published on the host: # to run the docker with netwotrk port published on the host:
# (windows)
# docker run --rm -p 5000:5000/tcp -v %cd%:/project -w /project -it sle118/squeezelite-esp32-idfv435 # docker run --rm -p 5000:5000/tcp -v %cd%:/project -w /project -it sle118/squeezelite-esp32-idfv435
# (linux)
# docker run --rm -p 5000:5000/tcp -v `pwd`:/project -w /project -it sle118/squeezelite-esp32-idfv435
ARG IDF_CLONE_URL=https://github.com/espressif/esp-idf.git ARG IDF_CLONE_URL=https://github.com/espressif/esp-idf.git
ARG IDF_CLONE_BRANCH_OR_TAG=master ARG IDF_CLONE_BRANCH_OR_TAG=master

View File

@@ -43,11 +43,15 @@ const __attribute__((section(".rodata_desc"))) esp_app_desc_t esp_app_desc = {
extern void register_audio_config(void); extern void register_audio_config(void);
extern void register_rotary_config(void); extern void register_rotary_config(void);
extern void register_ledvu_config(void); extern void register_ledvu_config(void);
extern void register_nvs();
void register_optional_cmd(void) { void register_optional_cmd(void) {
#if CONFIG_WITH_CONFIG_UI
register_rotary_config(); register_rotary_config();
register_ledvu_config(); #endif
register_audio_config(); register_audio_config();
register_ledvu_config();
register_nvs();
} }
extern int squeezelite_main(int argc, char **argv); extern int squeezelite_main(int argc, char **argv);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -73,24 +73,42 @@ static void register_set_services();
static void register_tasks(); static void register_tasks();
#endif #endif
extern BaseType_t network_manager_task; extern BaseType_t network_manager_task;
FILE * system_open_memstream(const char * cmdname,char **buf,size_t *buf_size){
FILE *f = open_memstream(buf, buf_size);
if (f == NULL) {
cmd_send_messaging(cmdname,MESSAGING_ERROR,"Unable to open memory stream.");
}
return f;
}
void register_system() void register_system()
{ {
register_free();
register_setdevicename();
register_set_services(); register_set_services();
register_free();
register_heap(); register_heap();
register_dump_heap(); register_dump_heap();
register_setdevicename();
register_version(); register_version();
register_restart(); register_restart();
register_deep_sleep();
register_light_sleep();
register_factory_boot(); register_factory_boot();
register_restart_ota(); register_restart_ota();
#if WITH_TASKS_INFO #if WITH_TASKS_INFO
register_tasks(); register_tasks();
#endif #endif
#if CONFIG_WITH_CONFIG_UI
register_deep_sleep();
register_light_sleep();
#endif
}
void simple_restart()
{
log_send_messaging(MESSAGING_WARNING,"Rebooting.");
if(!wait_for_commit()){
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration. ");
}
vTaskDelay(750/ portTICK_PERIOD_MS);
esp_restart();
} }
/* 'version' command */ /* 'version' command */
static int get_version(int argc, char **argv) static int get_version(int argc, char **argv)
{ {
@@ -128,36 +146,23 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
{ {
if(is_recovery_running){ if(is_recovery_running){
if(partition_subtype ==ESP_PARTITION_SUBTYPE_APP_FACTORY){ if(partition_subtype ==ESP_PARTITION_SUBTYPE_APP_FACTORY){
log_send_messaging(MESSAGING_WARNING,"RECOVERY application is already active"); // log_send_messaging(MESSAGING_WARNING,"RECOVERY application is already active");
if(!wait_for_commit()){ simple_restart();
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration. ");
}
vTaskDelay(750/ portTICK_PERIOD_MS);
esp_restart();
return ESP_OK;
} }
} }
else { else {
if(partition_subtype !=ESP_PARTITION_SUBTYPE_APP_FACTORY){ if(partition_subtype !=ESP_PARTITION_SUBTYPE_APP_FACTORY){
log_send_messaging(MESSAGING_WARNING,"SQUEEZELITE application is already active"); // log_send_messaging(MESSAGING_WARNING,"SQUEEZELITE application is already active");
if(!wait_for_commit()){ simple_restart();
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration. ");
}
vTaskDelay(750/ portTICK_PERIOD_MS);
esp_restart();
return ESP_OK;
} }
} }
esp_err_t err = ESP_OK; esp_err_t err = ESP_OK;
bool bFound=false; // log_send_messaging(MESSAGING_INFO, "Looking for partition type %u",partition_subtype);
log_send_messaging(MESSAGING_INFO, "Looking for partition type %u",partition_subtype);
const esp_partition_t *partition; const esp_partition_t *partition;
esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_APP, partition_subtype, NULL); esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_APP, partition_subtype, NULL);
if(it == NULL){ if(it == NULL){
log_send_messaging(MESSAGING_ERROR,"Reboot failed. Cannot iterate through partitions"); log_send_messaging(MESSAGING_ERROR,"Reboot failed. Partitions error");
} }
else else
{ {
@@ -166,15 +171,11 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
ESP_LOGD(TAG, "Releasing partition iterator"); ESP_LOGD(TAG, "Releasing partition iterator");
esp_partition_iterator_release(it); esp_partition_iterator_release(it);
if(partition != NULL){ if(partition != NULL){
log_send_messaging(MESSAGING_INFO, "Found application partition %s sub type %u", partition->label,partition_subtype); log_send_messaging(MESSAGING_INFO, "Rebooting to %s", partition->label);
err=esp_ota_set_boot_partition(partition); err=esp_ota_set_boot_partition(partition);
if(err!=ESP_OK){ if(err!=ESP_OK){
bFound=false;
log_send_messaging(MESSAGING_ERROR,"Unable to select partition for reboot: %s",esp_err_to_name(err)); log_send_messaging(MESSAGING_ERROR,"Unable to select partition for reboot: %s",esp_err_to_name(err));
} }
else{
bFound=true;
}
} }
else else
{ {
@@ -183,13 +184,7 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
} }
ESP_LOGD(TAG, "Yielding to other processes"); ESP_LOGD(TAG, "Yielding to other processes");
taskYIELD(); taskYIELD();
if(bFound) { simple_restart();
if(!wait_for_commit()){
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration changes. ");
}
vTaskDelay(750/ portTICK_PERIOD_MS);
esp_restart();
}
} }
return ESP_OK; return ESP_OK;
@@ -197,46 +192,31 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
static int restart(int argc, char **argv) static int restart(int argc, char **argv)
{ {
log_send_messaging(MESSAGING_WARNING, "\n\nPerforming a simple restart to the currently active partition."); simple_restart();
if(!wait_for_commit()){
cmd_send_messaging(argv[0],MESSAGING_WARNING,"Unable to commit configuration. ");
}
vTaskDelay(750/ portTICK_PERIOD_MS);
esp_restart();
return 0; return 0;
} }
void simple_restart()
{
log_send_messaging(MESSAGING_WARNING,"System reboot requested.");
if(!wait_for_commit()){
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration. ");
}
vTaskDelay(750/ portTICK_PERIOD_MS);
esp_restart();
}
esp_err_t guided_restart_ota(){ esp_err_t guided_restart_ota(){
log_send_messaging(MESSAGING_WARNING,"System reboot to Application requested"); log_send_messaging(MESSAGING_WARNING,"Booting to Squeezelite");
guided_boot(ESP_PARTITION_SUBTYPE_APP_OTA_0); guided_boot(ESP_PARTITION_SUBTYPE_APP_OTA_0);
return ESP_FAIL; // return fail. This should never return... we're rebooting! return ESP_FAIL; // return fail. This should never return... we're rebooting!
} }
esp_err_t guided_factory(){ esp_err_t guided_factory(){
log_send_messaging(MESSAGING_WARNING,"System reboot to recovery requested"); log_send_messaging(MESSAGING_WARNING,"Booting to recovery");
guided_boot(ESP_PARTITION_SUBTYPE_APP_FACTORY); guided_boot(ESP_PARTITION_SUBTYPE_APP_FACTORY);
return ESP_FAIL; // return fail. This should never return... we're rebooting! return ESP_FAIL; // return fail. This should never return... we're rebooting!
} }
static int restart_factory(int argc, char **argv) static int restart_factory(int argc, char **argv)
{ {
cmd_send_messaging(argv[0],MESSAGING_WARNING, "Executing guided boot into recovery"); cmd_send_messaging(argv[0],MESSAGING_WARNING, "Booting to Recovery");
guided_boot(ESP_PARTITION_SUBTYPE_APP_FACTORY); guided_boot(ESP_PARTITION_SUBTYPE_APP_FACTORY);
return 0; // return fail. This should never return... we're rebooting! return 0; // return fail. This should never return... we're rebooting!
} }
static int restart_ota(int argc, char **argv) static int restart_ota(int argc, char **argv)
{ {
cmd_send_messaging(argv[0],MESSAGING_WARNING, "Executing guided boot into ota app 0"); cmd_send_messaging(argv[0],MESSAGING_WARNING, "Booting to Squeezelite");
guided_boot(ESP_PARTITION_SUBTYPE_APP_OTA_0); guided_boot(ESP_PARTITION_SUBTYPE_APP_OTA_0);
return 0; // return fail. This should never return... we're rebooting! return 0; // return fail. This should never return... we're rebooting!
} }
@@ -248,7 +228,9 @@ static void register_restart()
.hint = NULL, .hint = NULL,
.func = &restart, .func = &restart,
}; };
#if CONFIG_WITH_CONFIG_UI
cmd_to_json(&cmd); cmd_to_json(&cmd);
#endif
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) ); ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
} }
static void register_restart_ota() static void register_restart_ota()
@@ -259,7 +241,9 @@ static void register_restart_ota()
.hint = NULL, .hint = NULL,
.func = &restart_ota, .func = &restart_ota,
}; };
#if CONFIG_WITH_CONFIG_UI
cmd_to_json(&cmd); cmd_to_json(&cmd);
#endif
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) ); ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
} }
@@ -271,7 +255,9 @@ static void register_factory_boot()
.hint = NULL, .hint = NULL,
.func = &restart_factory, .func = &restart_factory,
}; };
#if CONFIG_WITH_CONFIG_UI
cmd_to_json(&cmd); cmd_to_json(&cmd);
#endif
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) ); ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
} }
/** 'free' command prints available heap memory */ /** 'free' command prints available heap memory */
@@ -287,11 +273,14 @@ static void register_free()
{ {
const esp_console_cmd_t cmd = { const esp_console_cmd_t cmd = {
.command = "free", .command = "free",
.help = "Get the current size of free heap memory", .help = "Get free heap memory",
.hint = NULL, .hint = NULL,
.func = &free_mem, .func = &free_mem,
}; };
#if CONFIG_WITH_CONFIG_UI
cmd_to_json(&cmd); cmd_to_json(&cmd);
#endif
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) ); ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
} }
static int dump_heap(int argc, char **argv) static int dump_heap(int argc, char **argv)
@@ -303,16 +292,16 @@ static int dump_heap(int argc, char **argv)
/* 'heap' command prints minumum heap size */ /* 'heap' command prints minumum heap size */
static int heap_size(int argc, char **argv) static int heap_size(int argc, char **argv)
{ {
ESP_LOGI(TAG,"Heap internal:%zu (min:%zu) (largest block:%zu)\nexternal:%zu (min:%zu) (largest block:%zd)\ndma :%zu (min:%zu) (largest block:%zd)", // ESP_LOGI(TAG,"Heap internal:%zu (min:%zu) (largest block:%zu)\nexternal:%zu (min:%zu) (largest block:%zd)\ndma :%zu (min:%zu) (largest block:%zd)",
heap_caps_get_free_size(MALLOC_CAP_INTERNAL), // heap_caps_get_free_size(MALLOC_CAP_INTERNAL),
heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL), // heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL),
heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL), // heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL),
heap_caps_get_free_size(MALLOC_CAP_SPIRAM), // heap_caps_get_free_size(MALLOC_CAP_SPIRAM),
heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM), // heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM),
heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM), // heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM),
heap_caps_get_free_size(MALLOC_CAP_DMA), // heap_caps_get_free_size(MALLOC_CAP_DMA),
heap_caps_get_minimum_free_size(MALLOC_CAP_DMA), // heap_caps_get_minimum_free_size(MALLOC_CAP_DMA),
heap_caps_get_largest_free_block(MALLOC_CAP_DMA)); // heap_caps_get_largest_free_block(MALLOC_CAP_DMA));
cmd_send_messaging(argv[0],MESSAGING_INFO,"Heap internal:%zu (min:%zu) (largest block:%zu)\nexternal:%zu (min:%zu) (largest block:%zd)\ndma :%zu (min:%zu) (largest block:%zd)", cmd_send_messaging(argv[0],MESSAGING_INFO,"Heap internal:%zu (min:%zu) (largest block:%zu)\nexternal:%zu (min:%zu) (largest block:%zd)\ndma :%zu (min:%zu) (largest block:%zd)",
heap_caps_get_free_size(MALLOC_CAP_INTERNAL), heap_caps_get_free_size(MALLOC_CAP_INTERNAL),
heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL), heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL),
@@ -457,9 +446,8 @@ static int setdevicename(int argc, char **argv)
char *buf = NULL; char *buf = NULL;
size_t buf_size = 0; size_t buf_size = 0;
FILE *f = open_memstream(&buf, &buf_size); FILE *f = system_open_memstream(argv[0],&buf, &buf_size);
if (f == NULL) { if (f == NULL) {
cmd_send_messaging(argv[0],MESSAGING_ERROR,"Unable to open memory stream.");
return 1; return 1;
} }
nerrors+=setnamevar("a2dp_dev_name", f, name); nerrors+=setnamevar("a2dp_dev_name", f, name);
@@ -488,11 +476,13 @@ static void register_heap()
{ {
const esp_console_cmd_t heap_cmd = { const esp_console_cmd_t heap_cmd = {
.command = "heap", .command = "heap",
.help = "Get minimum size of free heap memory found during execution", .help = "Get minimum size of free heap memory",
.hint = NULL, .hint = NULL,
.func = &heap_size, .func = &heap_size,
}; };
#if CONFIG_WITH_CONFIG_UI
cmd_to_json(&heap_cmd); cmd_to_json(&heap_cmd);
#endif
ESP_ERROR_CHECK( esp_console_cmd_register(&heap_cmd) ); ESP_ERROR_CHECK( esp_console_cmd_register(&heap_cmd) );
} }
@@ -521,6 +511,7 @@ static void register_setdevicename()
.func = &setdevicename, .func = &setdevicename,
.argtable = &name_args .argtable = &name_args
}; };
cmd_to_json_with_cb(&set_name,&setdevicename_cb); cmd_to_json_with_cb(&set_name,&setdevicename_cb);
ESP_ERROR_CHECK(esp_console_cmd_register(&set_name)); ESP_ERROR_CHECK(esp_console_cmd_register(&set_name));
} }
@@ -618,9 +609,7 @@ static void register_deep_sleep()
const esp_console_cmd_t cmd = { const esp_console_cmd_t cmd = {
.command = "deep_sleep", .command = "deep_sleep",
.help = "Enter deep sleep mode. " .help = "Enter deep sleep mode. ",
"Two wakeup modes are supported: timer and GPIO. "
"If no wakeup option is specified, will sleep indefinitely.",
.hint = NULL, .hint = NULL,
.func = &deep_sleep, .func = &deep_sleep,
.argtable = &deep_sleep_args .argtable = &deep_sleep_args
@@ -649,9 +638,8 @@ static int do_set_services(int argc, char **argv)
} }
char *buf = NULL; char *buf = NULL;
size_t buf_size = 0; size_t buf_size = 0;
FILE *f = open_memstream(&buf, &buf_size); FILE *f = system_open_memstream(argv[0],&buf, &buf_size);
if (f == NULL) { if (f == NULL) {
cmd_send_messaging(argv[0],MESSAGING_ERROR,"Unable to open memory stream.");
return 1; return 1;
} }
@@ -674,7 +662,7 @@ static int do_set_services(int argc, char **argv)
if(err!=ESP_OK){ if(err!=ESP_OK){
nerrors++; nerrors++;
fprintf(f,"Error setting telnet service to %s. %s\n",set_services_args.telnet->sval[0], esp_err_to_name(err)); fprintf(f,"Error setting telnet to %s. %s\n",set_services_args.telnet->sval[0], esp_err_to_name(err));
} }
else { else {
fprintf(f,"Telnet service changed to %s\n",set_services_args.telnet->sval[0]); fprintf(f,"Telnet service changed to %s\n",set_services_args.telnet->sval[0]);
@@ -706,7 +694,6 @@ cJSON * set_services_cb(){
#if WITH_TASKS_INFO #if WITH_TASKS_INFO
console_set_bool_parameter(values,"stats",set_services_args.stats); console_set_bool_parameter(values,"stats",set_services_args.stats);
#endif #endif
if ((p = config_alloc_get(NVS_TYPE_STR, "telnet_enable")) != NULL) { if ((p = config_alloc_get(NVS_TYPE_STR, "telnet_enable")) != NULL) {
if(strcasestr("YX",p)!=NULL){ if(strcasestr("YX",p)!=NULL){
cJSON_AddStringToObject(values,set_services_args.telnet->hdr.longopts,"Telnet Only"); cJSON_AddStringToObject(values,set_services_args.telnet->hdr.longopts,"Telnet Only");
@@ -717,7 +704,6 @@ cJSON * set_services_cb(){
else { else {
cJSON_AddStringToObject(values,set_services_args.telnet->hdr.longopts,"Disabled"); cJSON_AddStringToObject(values,set_services_args.telnet->hdr.longopts,"Disabled");
} }
FREE_AND_NULL(p); FREE_AND_NULL(p);
} }

View File

@@ -17,6 +17,7 @@ void register_system();
esp_err_t guided_factory(); esp_err_t guided_factory();
esp_err_t guided_restart_ota(); esp_err_t guided_restart_ota();
void simple_restart(); void simple_restart();
FILE * system_open_memstream(const char * cmdname,char **buf,size_t *buf_size);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -204,8 +204,10 @@ void register_wifi_join()
void register_wifi() void register_wifi()
{ {
#ifdef WIFI_CMDLINE
register_wifi_join(); register_wifi_join();
if(bypass_network_manager){ if(bypass_network_manager){
initialise_wifi(); initialise_wifi();
} }
#endif
} }

View File

@@ -13,7 +13,7 @@
#include "driver/i2s.h" #include "driver/i2s.h"
#include "driver/spi_master.h" #include "driver/spi_master.h"
#include "gpio_exp.h" #include "gpio_exp.h"
#include "cJSON.h"
extern const char *i2c_name_type; extern const char *i2c_name_type;
extern const char *spi_name_type; extern const char *spi_name_type;

View File

@@ -22,7 +22,6 @@
"babel": "^6.23.0", "babel": "^6.23.0",
"babel-loader": "^8.2.3", "babel-loader": "^8.2.3",
"babel-runtime": "^6.26.0", "babel-runtime": "^6.26.0",
"bootswatch": "file:src/bootswatch",
"clean-webpack-plugin": "^4.0.0", "clean-webpack-plugin": "^4.0.0",
"commander": "^8.3.0", "commander": "^8.3.0",
"compression-webpack-plugin": "^9.2.0", "compression-webpack-plugin": "^9.2.0",
@@ -75,8 +74,10 @@
"@babel/runtime": "^7.16.7", "@babel/runtime": "^7.16.7",
"async-mutex": "^0.3.2", "async-mutex": "^0.3.2",
"bootstrap": "^5.1.3", "bootstrap": "^5.1.3",
"bootswatch": "^5.3.2",
"jquery": "^3.6.0", "jquery": "^3.6.0",
"npm": "^10.1.0", "npm": "^10.1.0",
"optipng-bin": "^9.0.0",
"popper.js": "^1.16.1", "popper.js": "^1.16.1",
"webpack-visualizer-plugin": "^0.1.11", "webpack-visualizer-plugin": "^0.1.11",
"webpack-visualizer-plugin2": "^1.0.0" "webpack-visualizer-plugin2": "^1.0.0"

View File

@@ -99,7 +99,7 @@
<div class="tab-pane fade" id="tab-cfg-gen"></div> <div class="tab-pane fade" id="tab-cfg-gen"></div>
<div class="tab-pane fade" id="tab-cfg-fw"> <div class="tab-pane fade" id="tab-cfg-fw">
<div class="card text-white mb-3"> <div class="card mb-3">
<div class="card-header">Software Updates</div> <div class="card-header">Software Updates</div>
<div class="card-body"> <div class="card-body">
<table class="table table-hover table-striped table-dark"> <table class="table table-hover table-striped table-dark">
@@ -171,7 +171,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="card text-white mb-3"> <div class="card mb-3">
<div class="card-header">Local Firmware Upload</div> <div class="card-header">Local Firmware Upload</div>
<div class="card-body"> <div class="card-body">
<div id="uploaddiv" class="form-group row "> <div id="uploaddiv" class="form-group row ">
@@ -216,7 +216,7 @@
</div> </div>
<div class="tab-pane fade" id="tab-cfg-audio"> <div class="tab-pane fade" id="tab-cfg-audio">
<div class="card text-white mb-3"> <div class="card mb-3">
<div class="card-header">Usage Templates</div> <div class="card-header">Usage Templates</div>
<div class="card-body"> <div class="card-body">
<fieldset class="form-group" id="output-tmpl"> <fieldset class="form-group" id="output-tmpl">
@@ -355,7 +355,7 @@
</div> </div>
</div> </div>
<div class="tab-pane fade active show" id="tab-wifi"> <div class="tab-pane fade active show" id="tab-wifi">
<div class="card text-white mb-3"> <div class="card mb-3">
<div class="card-header">WiFi Status</div> <div class="card-header">WiFi Status</div>
<div class="card-body if_eth" style="display: none"> <div class="card-body if_eth" style="display: none">
@@ -527,7 +527,7 @@
</div> </div>
<!-- syslog --> <!-- syslog -->
<div class="tab-pane fade " id="tab-credits"> <div class="tab-pane fade " id="tab-credits">
<div class="card text-white mb-3"> <div class="card mb-3">
<div class="card-header">Credits</div> <div class="card-header">Credits</div>
<div class="card-body"> <div class="card-body">
<p><strong><a <p><strong><a
@@ -554,7 +554,7 @@
</ul> </ul>
</div> </div>
</div> </div>
<div class="card text-white mb-3"> <div class="card mb-3">
<div class="card-header">Extras/Overrides</div> <div class="card-header">Extras/Overrides</div>
<div class="card-body"> <div class="card-body">
<fieldset> <fieldset>

View File

@@ -2097,7 +2097,7 @@ function getCommands() {
const isConfig = cmdParts[0] === 'cfg'; const isConfig = cmdParts[0] === 'cfg';
const targetDiv = '#tab-' + cmdParts[0] + '-' + cmdParts[1]; const targetDiv = '#tab-' + cmdParts[0] + '-' + cmdParts[1];
let innerhtml = ''; let innerhtml = '';
innerhtml += `<div class="card text-white mb-3"><div class="card-header">${command.help.encodeHTML().replace(/\n/g, '<br />')}</div><div class="card-body"><fieldset id="flds-${command.name}">`; innerhtml += `<div class="card mb-3"><div class="card-header">${command.help.encodeHTML().replace(/\n/g, '<br />')}</div><div class="card-body"><fieldset id="flds-${command.name}">`;
if (command.argtable) { if (command.argtable) {
command.argtable.forEach(function (arg) { command.argtable.forEach(function (arg) {
let placeholder = arg.datatype || ''; let placeholder = arg.datatype || '';

View File

@@ -1,5 +1,5 @@
@import "~bootswatch/dist/darkly/variables"; // @import "~bootswatch/dist/darkly/variables"; -- remove darkly until bootswatch color is resolved
@import "utils/variables"; @import "utils/variables";
@import "~bootstrap/scss/bootstrap"; @import "~bootstrap/scss/bootstrap";
// @import "~bootstrap/scss/functions"; // @import "~bootstrap/scss/functions";
@@ -38,5 +38,5 @@
// // Utilities // // Utilities
// @import "~bootstrap/scss/utilities/api"; // @import "~bootstrap/scss/utilities/api";
@import "~bootswatch/dist/darkly/bootswatch"; // @import "~bootswatch/dist/darkly/bootswatch"; -- remove darkly until bootswatch color is resolved
@import "utils/style"; @import "utils/style";

View File

@@ -0,0 +1,117 @@
const path = require("path");
const fs = require('fs');
const zlib = require("zlib");
const glob = require('glob');
class BuildEventsHook {
constructor(name, fn, stage = 'afterEmit') {
this.name = name;
this.stage = stage;
this.function = fn;
}
apply(compiler) {
compiler.hooks[this.stage].tap(this.name, this.function);
}
}
function createBuildEventsHook(options){
return new BuildEventsHook('Update C App',
function (stats, arguments) {
if (options.mode !== "production") return;
let buildRootPath = path.join(process.cwd(), '..', '..', '..');
let wifiManagerPath = glob.sync(path.join(buildRootPath, 'components/**/wifi-manager*'))[0];
let buildCRootPath = glob.sync(buildRootPath)[0];
fs.appendFileSync('./dist/index.html.gz',
zlib.gzipSync(fs.readFileSync('./dist/index.html'),
{
chunckSize: 65536,
level: zlib.constants.Z_BEST_COMPRESSION
}));
let getDirectories = function getDirectories (src, callback) {
let searchPath = path.posix.join(src, '/**/*(*.gz|favicon-32x32.png)');
console.log(`Post build: Getting file list from ${searchPath}`);
glob(searchPath, callback);
};
let cleanUpPath = path.posix.join(buildCRootPath, '/build/*.S');
console.log(`Post build: Cleaning up previous builds in ${cleanUpPath}`);
glob(cleanUpPath, function (err, list) {
if (err) {
console.error('Error', err);
} else {
list.forEach(fileName => {
try {
console.log(`Post build: Purging old binary file ${fileName} from C project.`);
fs.unlinkSync(fileName)
//file removed
} catch (ferr) {
console.error(ferr)
}
});
}
},
'afterEmit'
);
console.log('Generating C include files from webpack build output');
getDirectories('./dist', function (err, list) {
console.log(`Post build: found ${list.length} files. Relative path: ${wifiManagerPath}.`);
if (err) {
console.log('Error', err);
} else {
let exportDefHead =
`/***********************************
webpack_headers
${arguments[1]}
***********************************/
#pragma once
#include <inttypes.h>
extern const char * resource_lookups[];
extern const uint8_t * resource_map_start[];
extern const uint8_t * resource_map_end[];`;
let exportDef = '// Automatically generated. Do not edit manually!.\n' +
'#include <inttypes.h>\n';
let lookupDef = 'const char * resource_lookups[] = {\n';
let lookupMapStart = 'const uint8_t * resource_map_start[] = {\n';
let lookupMapEnd = 'const uint8_t * resource_map_end[] = {\n';
let cMake = '';
list.forEach(foundFile => {
let exportName = path.basename(foundFile).replace(/[\. \-]/gm, '_');
//take the full path of the file and make it relative to the build directory
let cmakeFileName = path.posix.relative(wifiManagerPath, glob.sync(path.resolve(foundFile))[0]);
let httpRelativePath = path.posix.join('/', path.posix.relative('dist', foundFile));
exportDef += `extern const uint8_t _${exportName}_start[] asm("_binary_${exportName}_start");\nextern const uint8_t _${exportName}_end[] asm("_binary_${exportName}_end");\n`;
lookupDef += `\t"${httpRelativePath}",\n`;
lookupMapStart += '\t_' + exportName + '_start,\n';
lookupMapEnd += '\t_' + exportName + '_end,\n';
cMake += `target_add_binary_data( __idf_wifi-manager ${cmakeFileName} BINARY)\n`;
console.log(`Post build: adding cmake file reference to ${cmakeFileName} from C project, with web path ${httpRelativePath}.`);
});
lookupDef += '""\n};\n';
lookupMapStart = lookupMapStart.substring(0, lookupMapStart.length - 2) + '\n};\n';
lookupMapEnd = lookupMapEnd.substring(0, lookupMapEnd.length - 2) + '\n};\n';
try {
fs.writeFileSync('webapp.cmake', cMake);
fs.writeFileSync('webpack.c', exportDef + lookupDef + lookupMapStart + lookupMapEnd);
fs.writeFileSync('webpack.h', exportDefHead);
//file written successfully
} catch (e) {
console.error(e);
}
}
});
console.log('Post build completed.');
})
}
module.exports = {
BuildEventsHook,
createBuildEventsHook
}

View File

@@ -6,7 +6,7 @@ const HtmlWebPackPlugin = require('html-webpack-plugin');
const { Command } = require('commander'); const { Command } = require('commander');
let cmdLines= { }; let cmdLines= { };
var { parseArgsStringToArgv } = require('string-argv'); var { parseArgsStringToArgv } = require('string-argv');
const PORT = 9100; const PORT = 5000;
const data = { const data = {
messages: require("../mock/messages.json"), messages: require("../mock/messages.json"),
@@ -159,7 +159,7 @@ module.exports ={
open: true, open: true,
compress: true, compress: true,
port: PORT, port: PORT,
host: '127.0.0.1',//your ip address host: '0.0.0.0',
allowedHosts: "all", allowedHosts: "all",
headers: {'Access-Control-Allow-Origin': '*', 'Accept-Encoding': 'identity'}, headers: {'Access-Control-Allow-Origin': '*', 'Accept-Encoding': 'identity'},
client: { client: {

View File

@@ -0,0 +1,91 @@
param (
[Parameter(Position=0, Mandatory=$false)]
[ValidateSet("t", "u", "d")]
[string]$option
)
# Get the current directory
$currentDir = Get-Location
# Define target directories
$targetDir = "components\wifi-manager\webapp"
$distDir = "$targetDir\dist"
# Get list of files from the 'dist' directory
$fsFiles = Get-ChildItem -Recurse $distDir -File | ForEach-Object {
$_.FullName.Substring($currentDir.Path.Length + 1).Replace("\", "/")
}
# Define additional files to include
$additionalFiles = @("webpack.c", "webpack.h", "webapp.cmake")
# Check if additional files exist in $targetDir and format them
$additionalFilesFormatted = @()
Get-ChildItem $targetDir -File | ForEach-Object {
if ($additionalFiles -contains $_.Name) {
$formatted = $_.FullName.Substring($currentDir.Path.Length + 1).Replace("\", "/")
$additionalFilesFormatted += $formatted
Write-Host "Found $formatted"
}
}
# Get list of files from the Git index
$indexFiles = git ls-files -s $distDir | ForEach-Object {
($_ -split "\s+")[3]
}
# Combine and remove duplicates
$allFiles = $fsFiles + $additionalFilesFormatted + $indexFiles | Sort-Object -Unique
# ... (previous code remains unchanged)
# Apply the git command based on the option
$allFiles | ForEach-Object {
$relativePath = $_
$isInIndex = $indexFiles -contains $relativePath
if ($null -eq $option) {
$gitStatus = & git status --porcelain -- $relativePath
if ($gitStatus) {
$status = ($gitStatus -split "\s")[0]
Write-Host "$relativePath has Git status: $status"
} else {
Write-Host "$relativePath is not tracked"
}
}
elseif ($isInIndex) {
if ($option -eq "d") {
$resetResult = & git reset -- $relativePath 2>&1
if ($resetResult -match 'error:') {
Write-Host "Error resetting ${relativePath}: $resetResult"
continue
}
$checkoutResult = & git checkout -- $relativePath 2>&1
if ($checkoutResult -match 'error:') {
Write-Host "Error checking out ${relativePath}: $checkoutResult"
continue
}
Write-Host "Discarded changes in $relativePath"
}
# ... (rest of the code remains unchanged)
}
# else {
# # if ($option -eq "d") {
# # Remove-Item -Path $relativePath -Force
# # Write-Host "Removed untracked file $relativePath"
# # } else {
# # Write-Host "File $relativePath is not tracked."
# # }
# }
else {
if ($option -eq "t") {
git add $relativePath
git update-index --no-skip-worktree $relativePath
Write-Host "Started tracking changes in $relativePath"
} else {
Write-Host "File $relativePath is not tracked."
}
}
}

View File

@@ -68,7 +68,68 @@ bool cold_boot=true;
extern const char _ctype_[]; extern const char _ctype_[];
const char* __ctype_ptr__ = _ctype_; const char* __ctype_ptr__ = _ctype_;
#endif #endif
typedef struct {
const char *key;
const char *value;
} DefaultStringVal;
typedef struct {
const char *key;
unsigned int uint_value;
bool is_signed;
} DefaultNumVal;
const DefaultNumVal defaultNumVals[] = {
{"ota_erase_blk", OTA_FLASH_ERASE_BLOCK, 0},
{"ota_stack", OTA_STACK_SIZE, 0},
{"ota_prio", OTA_TASK_PRIOTITY, 1}
};
const DefaultStringVal defaultStringVals[] = {
{"equalizer", ""},
{"loudness", "0"},
{"actrls_config", ""},
{"lms_ctrls_raw", "n"},
{"rotary_config", CONFIG_ROTARY_ENCODER},
{"display_config", CONFIG_DISPLAY_CONFIG},
{"eth_config", CONFIG_ETH_CONFIG},
{"i2c_config", CONFIG_I2C_CONFIG},
{"spi_config", CONFIG_SPI_CONFIG},
{"set_GPIO", CONFIG_SET_GPIO},
{"sleep_config", ""},
{"led_brightness", ""},
{"spdif_config", ""},
{"dac_config", ""},
{"dac_controlset", ""},
{"jack_mutes_amp", "n"},
{"gpio_exp_config", CONFIG_GPIO_EXP_CONFIG},
{"bat_config", ""},
{"metadata_config", ""},
{"telnet_enable", ""},
{"telnet_buffer", "40000"},
{"telnet_block", "500"},
{"stats", "n"},
{"rel_api", CONFIG_RELEASE_API},
{"pollmx", "600"},
{"pollmin", "15"},
{"ethtmout", "8"},
{"dhcp_tmout", "8"},
{"target", CONFIG_TARGET},
{"led_vu_config", ""},
#ifdef CONFIG_BT_SINK
{"bt_sink_pin", STR(CONFIG_BT_SINK_PIN)},
{"bt_sink_volume", "127"},
// Note: register_default_with_mac("bt_name", CONFIG_BT_NAME); is a special case
{"enable_bt_sink", STR(CONFIG_BT_SINK)},
{"a2dp_dev_name", CONFIG_A2DP_DEV_NAME},
{"a2dp_ctmt", STR(CONFIG_A2DP_CONNECT_TIMEOUT_MS)},
{"a2dp_ctrld", STR(CONFIG_A2DP_CONTROL_DELAY_MS)},
{"a2dp_sink_name", CONFIG_A2DP_SINK_NAME},
{"autoexec", "1"},
#ifdef CONFIG_AIRPLAY_SINK
{"airplay_port", CONFIG_AIRPLAY_PORT},
{"enable_airplay", STR(CONFIG_AIRPLAY_SINK)}
#endif
#endif
};
static bool bNetworkConnected=false; static bool bNetworkConnected=false;
// as an exception _init function don't need include // as an exception _init function don't need include
@@ -80,7 +141,9 @@ extern void target_init(char *target);
const char * str_or_unknown(const char * str) { return (str?str:unknown_string_placeholder); } const char * str_or_unknown(const char * str) { return (str?str:unknown_string_placeholder); }
const char * str_or_null(const char * str) { return (str?str:null_string_placeholder); } const char * str_or_null(const char * str) { return (str?str:null_string_placeholder); }
bool is_recovery_running; bool is_recovery_running;
bool is_network_connected(){
return bNetworkConnected;
}
void cb_connection_got_ip(nm_state_t new_state, int sub_state){ void cb_connection_got_ip(nm_state_t new_state, int sub_state){
const char *hostname; const char *hostname;
static ip4_addr_t ip; static ip4_addr_t ip;
@@ -163,7 +226,7 @@ void set_log_level(char * tag, char * level){
} }
#define DEFAULT_NAME_WITH_MAC(var,defval) char var[strlen(defval)+sizeof(macStr)]; strcpy(var,defval); strcat(var,macStr) #define DEFAULT_NAME_WITH_MAC(var,defval) char var[strlen(defval)+sizeof(macStr)]; strcpy(var,defval); strcat(var,macStr)
void register_default_string_val(const char * key, char * value){ void register_default_string_val(const char * key, const char * value){
char * existing =(char *)config_alloc_get(NVS_TYPE_STR,key ); char * existing =(char *)config_alloc_get(NVS_TYPE_STR,key );
ESP_LOGD(TAG,"Register default called with: %s= %s",key,value ); ESP_LOGD(TAG,"Register default called with: %s= %s",key,value );
if(!existing) { if(!existing) {
@@ -175,7 +238,15 @@ void register_default_string_val(const char * key, char * value){
} }
FREE_AND_NULL(existing); FREE_AND_NULL(existing);
} }
void register_single_default_num_val(const DefaultNumVal *entry) {
char number_buffer[101] = {};
if (entry->is_signed) {
snprintf(number_buffer, sizeof(number_buffer) - 1, "%d", entry->uint_value);
} else {
snprintf(number_buffer, sizeof(number_buffer) - 1, "%u", entry->uint_value);
}
register_default_string_val(entry->key, number_buffer);
}
char * alloc_get_string_with_mac(const char * val) { char * alloc_get_string_with_mac(const char * val) {
uint8_t mac[6]; uint8_t mac[6];
char macStr[LOCAL_MAC_SIZE + 1]; char macStr[LOCAL_MAC_SIZE + 1];
@@ -220,77 +291,25 @@ void register_default_nvs(){
else { else {
register_default_string_val("cspot_config", ""); register_default_string_val("cspot_config", "");
} }
} }
#endif #endif
#ifdef CONFIG_AIRPLAY_SINK #ifdef CONFIG_AIRPLAY_SINK
register_default_with_mac("airplay_name", CONFIG_AIRPLAY_NAME); register_default_with_mac("airplay_name", CONFIG_AIRPLAY_NAME);
register_default_string_val("airplay_port", CONFIG_AIRPLAY_PORT);
register_default_string_val( "enable_airplay", STR(CONFIG_AIRPLAY_SINK));
#endif #endif
#ifdef CONFIG_BT_SINK #ifdef CONFIG_BT_SINK
register_default_string_val( "bt_sink_pin", STR(CONFIG_BT_SINK_PIN));
register_default_string_val( "bt_sink_volume", "127");
register_default_with_mac("bt_name", CONFIG_BT_NAME); register_default_with_mac("bt_name", CONFIG_BT_NAME);
register_default_string_val( "enable_bt_sink", STR(CONFIG_BT_SINK));
register_default_string_val("a2dp_dev_name", CONFIG_A2DP_DEV_NAME);
register_default_string_val("a2dp_ctmt", STR(CONFIG_A2DP_CONNECT_TIMEOUT_MS));
register_default_string_val("a2dp_ctrld", STR(CONFIG_A2DP_CONTROL_DELAY_MS));
register_default_string_val("a2dp_sink_name", CONFIG_A2DP_SINK_NAME);
#endif #endif
register_default_with_mac("host_name", DEFAULT_HOST_NAME); register_default_with_mac("host_name", DEFAULT_HOST_NAME);
register_default_with_mac("ap_ssid", CONFIG_DEFAULT_AP_SSID); register_default_with_mac("ap_ssid", CONFIG_DEFAULT_AP_SSID);
register_default_string_val("autoexec","1");
register_default_with_mac("autoexec1",CONFIG_DEFAULT_COMMAND_LINE " -n " DEFAULT_HOST_NAME); register_default_with_mac("autoexec1",CONFIG_DEFAULT_COMMAND_LINE " -n " DEFAULT_HOST_NAME);
for (int i = 0; i < sizeof(defaultStringVals) / sizeof(DefaultStringVal); ++i) {
register_default_string_val(defaultStringVals[i].key, defaultStringVals[i].value);
}
for (int i = 0; i < sizeof(defaultNumVals) / sizeof(DefaultNumVal); ++i) {
register_single_default_num_val(&defaultNumVals[i]);
}
register_default_string_val("release_url", CONFIG_SQUEEZELITE_ESP32_RELEASE_URL);
register_default_string_val("ap_ip_address",CONFIG_DEFAULT_AP_IP);
register_default_string_val("ap_ip_gateway",CONFIG_DEFAULT_AP_GATEWAY );
register_default_string_val("ap_ip_netmask",CONFIG_DEFAULT_AP_NETMASK);
register_default_string_val("ap_channel",STR(CONFIG_DEFAULT_AP_CHANNEL));
register_default_string_val("ap_pwd", CONFIG_DEFAULT_AP_PASSWORD);
register_default_string_val("bypass_wm", "0");
register_default_string_val("equalizer", "");
register_default_string_val("loudness", "0");
register_default_string_val("actrls_config", "");
register_default_string_val("lms_ctrls_raw", "n");
register_default_string_val("rotary_config", CONFIG_ROTARY_ENCODER);
char number_buffer[101] = {};
snprintf(number_buffer,sizeof(number_buffer)-1,"%u",OTA_FLASH_ERASE_BLOCK);
register_default_string_val( "ota_erase_blk", number_buffer);
snprintf(number_buffer,sizeof(number_buffer)-1,"%u",OTA_STACK_SIZE);
register_default_string_val( "ota_stack", number_buffer);
snprintf(number_buffer,sizeof(number_buffer)-1,"%d",OTA_TASK_PRIOTITY);
register_default_string_val( "ota_prio", number_buffer);
register_default_string_val( "display_config", CONFIG_DISPLAY_CONFIG);
register_default_string_val( "eth_config", CONFIG_ETH_CONFIG);
register_default_string_val( "i2c_config", CONFIG_I2C_CONFIG);
register_default_string_val( "spi_config", CONFIG_SPI_CONFIG);
register_default_string_val( "set_GPIO", CONFIG_SET_GPIO);
register_default_string_val( "sleep_config", "");
register_default_string_val( "led_brightness", "");
register_default_string_val( "spdif_config", "");
register_default_string_val( "dac_config", "");
register_default_string_val( "dac_controlset", "");
register_default_string_val( "jack_mutes_amp", "n");
register_default_string_val("gpio_exp_config", CONFIG_GPIO_EXP_CONFIG);
register_default_string_val( "bat_config", "");
register_default_string_val( "metadata_config", "");
register_default_string_val( "telnet_enable", "");
register_default_string_val( "telnet_buffer", "40000");
register_default_string_val( "telnet_block", "500");
register_default_string_val( "stats", "n");
register_default_string_val( "rel_api", CONFIG_RELEASE_API);
register_default_string_val("pollmx","600");
register_default_string_val("pollmin","15");
register_default_string_val("ethtmout","8");
register_default_string_val("dhcp_tmout","8");
register_default_string_val("target", CONFIG_TARGET);
register_default_string_val("led_vu_config", "");
wait_for_commit(); wait_for_commit();
ESP_LOGD(TAG,"Done setting default values in nvs."); ESP_LOGD(TAG,"Done setting default values in nvs.");
} }