mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-06 03:27:01 +03:00
Fix recovery
This commit is contained in:
@@ -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
|
||||
#
|
||||
# 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
|
||||
# (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_BRANCH_OR_TAG=master
|
||||
|
||||
@@ -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_rotary_config(void);
|
||||
extern void register_ledvu_config(void);
|
||||
extern void register_nvs();
|
||||
|
||||
void register_optional_cmd(void) {
|
||||
#if CONFIG_WITH_CONFIG_UI
|
||||
register_rotary_config();
|
||||
register_ledvu_config();
|
||||
#endif
|
||||
register_audio_config();
|
||||
register_ledvu_config();
|
||||
register_nvs();
|
||||
}
|
||||
|
||||
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
@@ -73,24 +73,42 @@ static void register_set_services();
|
||||
static void register_tasks();
|
||||
#endif
|
||||
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()
|
||||
{
|
||||
register_free();
|
||||
|
||||
register_setdevicename();
|
||||
register_set_services();
|
||||
register_free();
|
||||
register_heap();
|
||||
register_dump_heap();
|
||||
register_setdevicename();
|
||||
register_version();
|
||||
register_restart();
|
||||
register_deep_sleep();
|
||||
register_light_sleep();
|
||||
register_factory_boot();
|
||||
register_restart_ota();
|
||||
#if WITH_TASKS_INFO
|
||||
register_tasks();
|
||||
#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 */
|
||||
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(partition_subtype ==ESP_PARTITION_SUBTYPE_APP_FACTORY){
|
||||
log_send_messaging(MESSAGING_WARNING,"RECOVERY application is already active");
|
||||
if(!wait_for_commit()){
|
||||
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration. ");
|
||||
}
|
||||
|
||||
vTaskDelay(750/ portTICK_PERIOD_MS);
|
||||
esp_restart();
|
||||
return ESP_OK;
|
||||
// log_send_messaging(MESSAGING_WARNING,"RECOVERY application is already active");
|
||||
simple_restart();
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(partition_subtype !=ESP_PARTITION_SUBTYPE_APP_FACTORY){
|
||||
log_send_messaging(MESSAGING_WARNING,"SQUEEZELITE application is already active");
|
||||
if(!wait_for_commit()){
|
||||
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration. ");
|
||||
}
|
||||
|
||||
vTaskDelay(750/ portTICK_PERIOD_MS);
|
||||
esp_restart();
|
||||
return ESP_OK;
|
||||
// log_send_messaging(MESSAGING_WARNING,"SQUEEZELITE application is already active");
|
||||
simple_restart();
|
||||
}
|
||||
}
|
||||
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;
|
||||
esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_APP, partition_subtype, 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
|
||||
{
|
||||
@@ -166,15 +171,11 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
|
||||
ESP_LOGD(TAG, "Releasing partition iterator");
|
||||
esp_partition_iterator_release(it);
|
||||
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);
|
||||
if(err!=ESP_OK){
|
||||
bFound=false;
|
||||
log_send_messaging(MESSAGING_ERROR,"Unable to select partition for reboot: %s",esp_err_to_name(err));
|
||||
}
|
||||
else{
|
||||
bFound=true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -183,13 +184,7 @@ esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
|
||||
}
|
||||
ESP_LOGD(TAG, "Yielding to other processes");
|
||||
taskYIELD();
|
||||
if(bFound) {
|
||||
if(!wait_for_commit()){
|
||||
log_send_messaging(MESSAGING_WARNING,"Unable to commit configuration changes. ");
|
||||
}
|
||||
vTaskDelay(750/ portTICK_PERIOD_MS);
|
||||
esp_restart();
|
||||
}
|
||||
simple_restart();
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
log_send_messaging(MESSAGING_WARNING, "\n\nPerforming a simple restart to the currently active partition.");
|
||||
if(!wait_for_commit()){
|
||||
cmd_send_messaging(argv[0],MESSAGING_WARNING,"Unable to commit configuration. ");
|
||||
}
|
||||
vTaskDelay(750/ portTICK_PERIOD_MS);
|
||||
esp_restart();
|
||||
simple_restart();
|
||||
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(){
|
||||
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);
|
||||
return ESP_FAIL; // return fail. This should never return... we're rebooting!
|
||||
}
|
||||
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);
|
||||
return ESP_FAIL; // return fail. This should never return... we're rebooting!
|
||||
}
|
||||
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);
|
||||
return 0; // return fail. This should never return... we're rebooting!
|
||||
}
|
||||
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);
|
||||
return 0; // return fail. This should never return... we're rebooting!
|
||||
}
|
||||
@@ -248,7 +228,9 @@ static void register_restart()
|
||||
.hint = NULL,
|
||||
.func = &restart,
|
||||
};
|
||||
#if CONFIG_WITH_CONFIG_UI
|
||||
cmd_to_json(&cmd);
|
||||
#endif
|
||||
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
|
||||
}
|
||||
static void register_restart_ota()
|
||||
@@ -259,7 +241,9 @@ static void register_restart_ota()
|
||||
.hint = NULL,
|
||||
.func = &restart_ota,
|
||||
};
|
||||
#if CONFIG_WITH_CONFIG_UI
|
||||
cmd_to_json(&cmd);
|
||||
#endif
|
||||
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
|
||||
}
|
||||
|
||||
@@ -271,7 +255,9 @@ static void register_factory_boot()
|
||||
.hint = NULL,
|
||||
.func = &restart_factory,
|
||||
};
|
||||
#if CONFIG_WITH_CONFIG_UI
|
||||
cmd_to_json(&cmd);
|
||||
#endif
|
||||
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
|
||||
}
|
||||
/** 'free' command prints available heap memory */
|
||||
@@ -287,11 +273,14 @@ static void register_free()
|
||||
{
|
||||
const esp_console_cmd_t cmd = {
|
||||
.command = "free",
|
||||
.help = "Get the current size of free heap memory",
|
||||
.help = "Get free heap memory",
|
||||
.hint = NULL,
|
||||
.func = &free_mem,
|
||||
};
|
||||
#if CONFIG_WITH_CONFIG_UI
|
||||
cmd_to_json(&cmd);
|
||||
#endif
|
||||
|
||||
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
|
||||
}
|
||||
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 */
|
||||
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)",
|
||||
heap_caps_get_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_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_free_size(MALLOC_CAP_DMA),
|
||||
heap_caps_get_minimum_free_size(MALLOC_CAP_DMA),
|
||||
heap_caps_get_largest_free_block(MALLOC_CAP_DMA));
|
||||
// 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_minimum_free_size(MALLOC_CAP_INTERNAL),
|
||||
// heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL),
|
||||
// heap_caps_get_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_free_size(MALLOC_CAP_DMA),
|
||||
// heap_caps_get_minimum_free_size(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)",
|
||||
heap_caps_get_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;
|
||||
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) {
|
||||
cmd_send_messaging(argv[0],MESSAGING_ERROR,"Unable to open memory stream.");
|
||||
return 1;
|
||||
}
|
||||
nerrors+=setnamevar("a2dp_dev_name", f, name);
|
||||
@@ -488,11 +476,13 @@ static void register_heap()
|
||||
{
|
||||
const esp_console_cmd_t heap_cmd = {
|
||||
.command = "heap",
|
||||
.help = "Get minimum size of free heap memory found during execution",
|
||||
.help = "Get minimum size of free heap memory",
|
||||
.hint = NULL,
|
||||
.func = &heap_size,
|
||||
};
|
||||
#if CONFIG_WITH_CONFIG_UI
|
||||
cmd_to_json(&heap_cmd);
|
||||
#endif
|
||||
ESP_ERROR_CHECK( esp_console_cmd_register(&heap_cmd) );
|
||||
|
||||
}
|
||||
@@ -521,6 +511,7 @@ static void register_setdevicename()
|
||||
.func = &setdevicename,
|
||||
.argtable = &name_args
|
||||
};
|
||||
|
||||
cmd_to_json_with_cb(&set_name,&setdevicename_cb);
|
||||
ESP_ERROR_CHECK(esp_console_cmd_register(&set_name));
|
||||
}
|
||||
@@ -618,9 +609,7 @@ static void register_deep_sleep()
|
||||
|
||||
const esp_console_cmd_t cmd = {
|
||||
.command = "deep_sleep",
|
||||
.help = "Enter deep sleep mode. "
|
||||
"Two wakeup modes are supported: timer and GPIO. "
|
||||
"If no wakeup option is specified, will sleep indefinitely.",
|
||||
.help = "Enter deep sleep mode. ",
|
||||
.hint = NULL,
|
||||
.func = &deep_sleep,
|
||||
.argtable = &deep_sleep_args
|
||||
@@ -649,9 +638,8 @@ static int do_set_services(int argc, char **argv)
|
||||
}
|
||||
char *buf = NULL;
|
||||
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) {
|
||||
cmd_send_messaging(argv[0],MESSAGING_ERROR,"Unable to open memory stream.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -674,7 +662,7 @@ static int do_set_services(int argc, char **argv)
|
||||
|
||||
if(err!=ESP_OK){
|
||||
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 {
|
||||
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
|
||||
console_set_bool_parameter(values,"stats",set_services_args.stats);
|
||||
#endif
|
||||
|
||||
if ((p = config_alloc_get(NVS_TYPE_STR, "telnet_enable")) != NULL) {
|
||||
if(strcasestr("YX",p)!=NULL){
|
||||
cJSON_AddStringToObject(values,set_services_args.telnet->hdr.longopts,"Telnet Only");
|
||||
@@ -717,7 +704,6 @@ cJSON * set_services_cb(){
|
||||
else {
|
||||
cJSON_AddStringToObject(values,set_services_args.telnet->hdr.longopts,"Disabled");
|
||||
}
|
||||
|
||||
FREE_AND_NULL(p);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ void register_system();
|
||||
esp_err_t guided_factory();
|
||||
esp_err_t guided_restart_ota();
|
||||
void simple_restart();
|
||||
FILE * system_open_memstream(const char * cmdname,char **buf,size_t *buf_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -204,8 +204,10 @@ void register_wifi_join()
|
||||
|
||||
void register_wifi()
|
||||
{
|
||||
#ifdef WIFI_CMDLINE
|
||||
register_wifi_join();
|
||||
if(bypass_network_manager){
|
||||
initialise_wifi();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "driver/i2s.h"
|
||||
#include "driver/spi_master.h"
|
||||
#include "gpio_exp.h"
|
||||
|
||||
#include "cJSON.h"
|
||||
extern const char *i2c_name_type;
|
||||
extern const char *spi_name_type;
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
"babel": "^6.23.0",
|
||||
"babel-loader": "^8.2.3",
|
||||
"babel-runtime": "^6.26.0",
|
||||
"bootswatch": "file:src/bootswatch",
|
||||
"clean-webpack-plugin": "^4.0.0",
|
||||
"commander": "^8.3.0",
|
||||
"compression-webpack-plugin": "^9.2.0",
|
||||
@@ -75,8 +74,10 @@
|
||||
"@babel/runtime": "^7.16.7",
|
||||
"async-mutex": "^0.3.2",
|
||||
"bootstrap": "^5.1.3",
|
||||
"bootswatch": "^5.3.2",
|
||||
"jquery": "^3.6.0",
|
||||
"npm": "^10.1.0",
|
||||
"optipng-bin": "^9.0.0",
|
||||
"popper.js": "^1.16.1",
|
||||
"webpack-visualizer-plugin": "^0.1.11",
|
||||
"webpack-visualizer-plugin2": "^1.0.0"
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
<div class="tab-pane fade" id="tab-cfg-gen"></div>
|
||||
<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-body">
|
||||
<table class="table table-hover table-striped table-dark">
|
||||
@@ -171,7 +171,7 @@
|
||||
</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-body">
|
||||
<div id="uploaddiv" class="form-group row ">
|
||||
@@ -216,7 +216,7 @@
|
||||
</div>
|
||||
|
||||
<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-body">
|
||||
<fieldset class="form-group" id="output-tmpl">
|
||||
@@ -355,7 +355,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<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-body if_eth" style="display: none">
|
||||
@@ -527,7 +527,7 @@
|
||||
</div>
|
||||
<!-- syslog -->
|
||||
<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-body">
|
||||
<p><strong><a
|
||||
@@ -554,7 +554,7 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card text-white mb-3">
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">Extras/Overrides</div>
|
||||
<div class="card-body">
|
||||
<fieldset>
|
||||
|
||||
@@ -2097,7 +2097,7 @@ function getCommands() {
|
||||
const isConfig = cmdParts[0] === 'cfg';
|
||||
const targetDiv = '#tab-' + cmdParts[0] + '-' + cmdParts[1];
|
||||
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) {
|
||||
command.argtable.forEach(function (arg) {
|
||||
let placeholder = arg.datatype || '';
|
||||
|
||||
@@ -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 "~bootstrap/scss/bootstrap";
|
||||
// @import "~bootstrap/scss/functions";
|
||||
@@ -38,5 +38,5 @@
|
||||
|
||||
// // Utilities
|
||||
// @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";
|
||||
117
components/wifi-manager/webapp/webpack/BuildEventsHook.js
Normal file
117
components/wifi-manager/webapp/webpack/BuildEventsHook.js
Normal 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
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ const HtmlWebPackPlugin = require('html-webpack-plugin');
|
||||
const { Command } = require('commander');
|
||||
let cmdLines= { };
|
||||
var { parseArgsStringToArgv } = require('string-argv');
|
||||
const PORT = 9100;
|
||||
const PORT = 5000;
|
||||
|
||||
const data = {
|
||||
messages: require("../mock/messages.json"),
|
||||
@@ -159,7 +159,7 @@ module.exports ={
|
||||
open: true,
|
||||
compress: true,
|
||||
port: PORT,
|
||||
host: '127.0.0.1',//your ip address
|
||||
host: '0.0.0.0',
|
||||
allowedHosts: "all",
|
||||
headers: {'Access-Control-Allow-Origin': '*', 'Accept-Encoding': 'identity'},
|
||||
client: {
|
||||
|
||||
91
docker/ToggleGitTracking.ps1
Normal file
91
docker/ToggleGitTracking.ps1
Normal 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."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,68 @@ bool cold_boot=true;
|
||||
extern const char _ctype_[];
|
||||
const char* __ctype_ptr__ = _ctype_;
|
||||
#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;
|
||||
|
||||
// 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_null(const char * str) { return (str?str:null_string_placeholder); }
|
||||
bool is_recovery_running;
|
||||
|
||||
bool is_network_connected(){
|
||||
return bNetworkConnected;
|
||||
}
|
||||
void cb_connection_got_ip(nm_state_t new_state, int sub_state){
|
||||
const char *hostname;
|
||||
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)
|
||||
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 );
|
||||
ESP_LOGD(TAG,"Register default called with: %s= %s",key,value );
|
||||
if(!existing) {
|
||||
@@ -175,7 +238,15 @@ void register_default_string_val(const char * key, char * value){
|
||||
}
|
||||
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) {
|
||||
uint8_t mac[6];
|
||||
char macStr[LOCAL_MAC_SIZE + 1];
|
||||
@@ -220,77 +291,25 @@ void register_default_nvs(){
|
||||
else {
|
||||
register_default_string_val("cspot_config", "");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AIRPLAY_SINK
|
||||
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
|
||||
|
||||
#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_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
|
||||
|
||||
register_default_with_mac("host_name", DEFAULT_HOST_NAME);
|
||||
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);
|
||||
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();
|
||||
ESP_LOGD(TAG,"Done setting default values in nvs.");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user