applied platformio structure

This commit is contained in:
2026-03-13 17:03:22 +00:00
parent c5233cf15c
commit db7d90e736
3510 changed files with 691878 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
{
"presets": [
"@babel/preset-env",
"@babel/typescript"
],
"env": {
"production": {
"presets": [
"minify"
]
}
}
}
File diff suppressed because one or more lines are too long
+27
View File
@@ -0,0 +1,27 @@
{
"parser": "babel-eslint",
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": 2020,
"ecmaFeatures": {
"modules": true
}
},
"env": {
"browser": true,
"es6": true,
"jquery": true
} ,
"rules": {
"no-tabs": "off",
"semi": 0,
"comma-dangle": 0,
"require-jsdoc": ["off", {
"require": {
"FunctionDeclaration": true,
"MethodDefinition": false,
"ClassDeclaration": false
}
}]
}
}
@@ -0,0 +1,18 @@
{
"env": {
"browser": true,
"es6": true,
"jquery": true
},
"extends": "eslint:recommended",
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaVersion": 2018,
"sourceType": "module"
},
"rules": {
}
}
+4
View File
@@ -0,0 +1,4 @@
node_modules
.DS_Store
.idea
package-lock.json
+12
View File
@@ -0,0 +1,12 @@
{
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Debug",
"preLaunchTask": "webpack: dev server",
"sourceMaps": true,
"trace": true
}
]
}
+92
View File
@@ -0,0 +1,92 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"label": "webpack: dev server",
"script": "dev",
"promptOnClose": true,
"isBackground": true,
"problemMatcher": {
"owner": "webpack",
"severity": "error",
"fileLocation": "absolute",
"pattern": [
{
"regexp": "ERROR in (.*)",
"file": 1
},
{
"regexp": "\\((\\d+),(\\d+)\\):(.*)",
"line": 1,
"column": 2,
"message": 3
}
],
"background": {
"activeOnStart": true,
"beginsPattern": "Compiling\\.\\.\\.",
"endsPattern": "Compiled successfully\\."
}
}
},
{
"type": "npm",
"label": "webpack: prod server",
"script": "prod",
"promptOnClose": true,
"isBackground": true,
"problemMatcher": {
"owner": "webpack",
"severity": "error",
"fileLocation": "absolute",
"pattern": [
{
"regexp": "ERROR in (.*)",
"file": 1
},
{
"regexp": "\\((\\d+),(\\d+)\\):(.*)",
"line": 1,
"column": 2,
"message": 3
}
],
"background": {
"activeOnStart": true,
"beginsPattern": "Compiling\\.\\.\\.",
"endsPattern": "Compiled successfully\\."
}
}
},
{
"type": "npm",
"label": "webpack: build",
"script": "build",
"promptOnClose": true,
"isBackground": true,
"problemMatcher": {
"owner": "webpack",
"severity": "error",
"fileLocation": "absolute",
"pattern": [
{
"regexp": "ERROR in (.*)",
"file": 1
},
{
"regexp": "\\((\\d+),(\\d+)\\):(.*)",
"line": 1,
"column": 2,
"message": 3
}
],
"background": {
"activeOnStart": true,
"beginsPattern": "Compiling\\.\\.\\.",
"endsPattern": "Compiled successfully\\."
}
}
}
]
}
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 AndyKorek
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+204
View File
@@ -0,0 +1,204 @@
<h2 align="center">Boilerplate - Bootstrap v4 - SASS - JQuery - WebPack</h2>
<p align="center">
<a href="https://webpack.js.org/"><img alt="Webpack" src="https://img.shields.io/badge/Webpack-4.41.6-%238DD6F9.svg"></a>
<a href="https://babeljs.io/"><img alt="Webpack" src="https://img.shields.io/badge/Babel%2FCore-7.8.4-%23f5da55.svg"></a>
<a href="https://www.npmjs.com/package/gulp-sass"><img alt="node-sass" src="https://img.shields.io/badge/node--sass-v4.13.1-ff69b4.svg"></a>
<a href="https://jquery.com/"><img src="https://img.shields.io/badge/jQuery-3.3.1-blue.svg" alt="jquery"></a>
<a href="https://lodash.com/"><img src="https://img.shields.io/badge/lodash-4.17.15-blue.svg" alt="jquery"></a>
<a href="https://popper.js.org/"><img src="https://img.shields.io/badge/popper.js-2.0.6-blue.svg" alt="popper.js"></a>
<a href="https://eslint.org/"><img src="https://img.shields.io/badge/es--lint-5.15.1-%23463fd4.svg" alt="eslint"></a>
<a href="https://fontawesome.com/"><img alt="Font Awesome" src="https://img.shields.io/badge/Font--Awesome-5.12.1-blue.svg"></a>
<a href="https://icons8.com/line-awesome"><img alt="Line Awesome" src="https://img.shields.io/badge/Line%20Awesome-1.3.0-green"></a>
</p>
![webpack logo](https://abload.de/img/webpack1tkeb.png)
![bootstrap logo](https://abload.de/img/bootstrap-logo-vector78khf.png)
![babel logo](https://abload.de/img/2000px-babel_logo.svgrzkxw.png)
![sass logo](https://abload.de/img/1280px-sass_logo_colo0bjb4.png)
<p align="center">
<em>
SASS
· Babel
· Bootstrap
· JQuery
· PopperJS
· Font Awesome
</em>
</p>
This Webpack4-Sass Boilerplate contains the following features:
- Webpack4 & Dev-Server
- TypeScript 3.7.5
- Babel ES6 Compiler
- Bootstrap v4 - with Theme Support
- Font Awesome v5.7
- Animate.css Library v3.7.2
- JQuery v3.3.1
- PopperJS v2
- _lodash
- concentrate and minify JavaScript.
- Compile, minify, Autoprefix SASS.
- Optimize and Cache Images
- Preconfigured BootsWatch Template (YETI & Slate)
- Linting for your TS, JS and SASS
## Features
### Webpack Loaders & Plugins
This project contains the following loaders & plugins:
- `node-sass` for compiling sass (SCSS)
- `babel-loader` for compiling ES6 code
- `babel-eslint && eslint-loader` for Linting your .js
- `tslint` for Linting your .ts
- `lodash-webpack-plugin` create smaller Lodash builds by replacing feature sets of modules with noop, identity, or simpler alternatives.
- `webpack-dev-server` for serving & Hot-Reloading
- `css-loader` for compressing css
- `sass-loader` for compressing and loading scss & sass
- `url- & file-loader` for loading and optimizing images
- `xml and csv loader` for loading data files
- `html-loader` for loading & optimizing html files
- `clean-webpack-plugin` for keeping your dist folder clean
- `favicons-webpack-plugin` generate favicons form your "logo.png"
## Getting Started
### Dependencies
Make sure these are installed first.
- [Node.js](http://nodejs.org)
- [Webpack](https://webpack.js.org/guides/installation/)
`npm install --g webpack`
<hr/>
### Quick Start
1. Clone the repo :
`git clone https://github.com/AndyKorek/webpack-boilerplate-sass-ts-bootstrap4-fontawesome.git`
2. In bash/terminal/command line, `cd ` into project directory.
3. Run `npm i` to install required dependencies.
4. Run the Dev Server with (with Hot Reloading) `npm run dev`
<hr/>
### Build the Production Folder
`npm run build`
This will:
- Bundle and Minify SASS(scss) to css & Hash and Cash it
- generate GZip and Brodli Compressed Assets
- Bundle and Minify JS
- Optimize Images
- Optimize HTML
- generate Favicons
<hr/>
## Documentation
### Workflow structure
`src` - > source directory
`dist` -> build directory
```
├── src
│ ├── assets
│ │ └── images
│ ├── fonts
│ ├── sass
│ │ ├── layout
| | | └── _features.scss
│ │ ├── setup
| | | └── _normalize.scss
│ │ ├── themes
| | | ├── _slate.scss
| | | └── _yeti.scss
│ │ ├── utils
| | | ├── _mixins.scss
| | | └── _variables.scss
│ │ ├── _globals.scss
│ │ ├── _headings.scss
│ │ ├── _typography.scss
│ │ ├── _vendor.scss
│ │ └── main.scss
│ ├── ts
│ │ ├── custom.ts
│ │ ├── line-awesome.ts
│ │ ├── vendor.ts
│ |── .htaccess
│ |── 404.html
│ |── index.html
│ └── index.ts
├── dist
│ ├── assets
│ │ ├── images
│ │ └──
│ ├── css
│ │ ├── vendors.[contenthash].css
│ │ └── main.contenthash].css
│ ├── js
│ │ ├── main.[contenthash].js
│ │ ├── runtime.[contenthash].js
│ │ └── vendors.[contenthash].js
│ │
│ └── index.html
```
### Loading the Features you need
in `src/js/vendor/_boostrap.js` uncomment all Features you need
put your custom js to `src/js/_custom.js`
<hr/>
### Instructions
- Add `sass`(.scss) files to `src/_scss` folder.
- Make sure you import the scss file in `main.scss`
```
@import "filename";
```
- Add your assets to `src/assets/`
- Add `images` to `src/assets/images`
## TODO list
- [x] Bootstrap 4
- [x] Webpack 4
- [x] Jquery
- [x] PopperJS v2
- [x] Include ES-Lint
- [x] Font-Awesome
- [x] Assets Loader
- [x] Separated location for Bundled Files
- [x] Adding EsLint
- [ ] Code Optimising
- [x] Uglify and Minify JS with Terser
## Licence
Code released under the [MIT License](https://github.com/AndyKorek/webpack4_boilerplate/blob/master/LICENSE).
*</> with* :heart: *from Germany*
@@ -0,0 +1,24 @@
{
"extends": "stylelint-config-standard",
"rules": {
"no-duplicate-selectors": true,
"indentation": null,
"color-hex-case": "lower",
"color-hex-length": "long",
"selector-combinator-space-after": "never",
"declaration-block-trailing-semicolon": "always",
"declaration-colon-space-before": "never",
"declaration-colon-newline-after": null,
"comment-whitespace-inside": "always",
"comment-empty-line-before": null,
"selector-pseudo-class-parentheses-space-inside": "always",
"selector-list-comma-newline-after": null,
"media-feature-range-operator-space-before": "always",
"media-feature-range-operator-space-after": "always",
"media-feature-parentheses-space-inside": "always",
"media-feature-colon-space-before": "always",
"media-feature-colon-space-after": "always",
"no-eol-whitespace": null,
"no-missing-end-of-source-newline": null,
"number-leading-zero": "never" }
}
+3
View File
@@ -0,0 +1,3 @@
[1211/165128.604:ERROR:directory_reader_win.cc(43)] FindFirstFile: Le chemin daccès spécifié est introuvable. (0x3)
[1212/063417.746:ERROR:directory_reader_win.cc(43)] FindFirstFile: Le chemin daccès spécifié est introuvable. (0x3)
[1213/063413.475:ERROR:directory_reader_win.cc(43)] FindFirstFile: Le chemin daccès spécifié est introuvable. (0x3)
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
export {};
File diff suppressed because one or more lines are too long
+4
View File
@@ -0,0 +1,4 @@
import 'bootstrap';
import './sass/main.scss';
import './assets/images/favicon-32x32.png';
import './js/custom.js';
+1
View File
@@ -0,0 +1 @@
export {};
+252
View File
@@ -0,0 +1,252 @@
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare let sd: {};
declare let rf: boolean;
declare function refreshStatus(): void;
+3
View File
@@ -0,0 +1,3 @@
import 'bootstrap';
import './sass/main.scss';
import './js/test.js';
+1
View File
@@ -0,0 +1 @@
export {};
+1
View File
@@ -0,0 +1 @@
export {};
+2
View File
@@ -0,0 +1,2 @@
declare function _exports(env: any, options: any): {};
export = _exports;
@@ -0,0 +1,8 @@
export class BuildEventsHook {
constructor(name: any, fn: any, stage?: string);
name: any;
stage: string;
function: any;
apply(compiler: any): void;
}
export function createBuildEventsHook(options: any): BuildEventsHook;
View File
@@ -0,0 +1,6 @@
export const parser: string;
export const plugins: {
'postcss-import': {};
'postcss-cssnext': {};
cssnano: {};
};
+37
View File
@@ -0,0 +1,37 @@
declare const PORT: 5000;
import HtmlWebPackPlugin = require("html-webpack-plugin");
export namespace entry {
const test: string;
}
export namespace devServer {
export namespace _static {
const directory: string;
const staticOptions: {};
const publicPath: string;
const serveIndex: boolean;
const watch: boolean;
}
export { _static as static };
export namespace devMiddleware {
const publicPath_1: string;
export { publicPath_1 as publicPath };
}
export const open: boolean;
export const compress: boolean;
export { PORT as port };
export const host: string;
export const allowedHosts: string;
export const headers: {
'Access-Control-Allow-Origin': string;
'Accept-Encoding': string;
};
export namespace client {
const logging: string;
const overlay: boolean;
const progress: boolean;
}
export function onListening(devServer: any): void;
export function onBeforeSetupMiddleware(devServer: any): void;
}
export const plugins: HtmlWebPackPlugin[];
export {};
+13
View File
@@ -0,0 +1,13 @@
[
{"ssid":"Pantum-AP-A6D49F","chan":11,"rssi":-55,"auth":4, "known":false},
{"ssid":"a0308","chan":1,"rssi":-56,"auth":3, "known":false},
{"ssid":"dlink-D9D8","chan":11,"rssi":-82,"auth":4, "known":false},
{"ssid":"Linksys06730","chan":7,"rssi":-85,"auth":0, "known":false},
{"ssid":"SINGTEL-5171","chan":9,"rssi":-88,"auth":4, "known":false},
{"ssid":"1126-1","chan":11,"rssi":-89,"auth":4, "known":false},
{"ssid":"The Shah 5GHz-2","chan":1,"rssi":-90,"auth":0, "known":false},
{"ssid":"SINGTEL-1D28 (2G)","chan":11,"rssi":-91,"auth":3, "known":false},
{"ssid":"dlink-F864","chan":1,"rssi":-92,"auth":4, "known":false},
{"ssid":"dlink-74F0","chan":1,"rssi":-93,"auth":4, "known":false},
{"ssid":"MyTestSSID","chan":2,"rssi":-53,"auth":4, "known":true}
]
+783
View File
@@ -0,0 +1,783 @@
{
"commands": [{
"help": "Get the current size of free heap memory",
"hascb": false,
"name": "free"
}, {
"help": "Services",
"hascb": true,
"argtable": [{
"glossary": "Spotify (cspot)",
"longopts": "cspot",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Bluetooth Speaker",
"longopts": "BT_Speaker",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "AirPlay",
"longopts": "AirPlay",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "Disabled|Telnet Only|Telnet and Serial",
"glossary": "Telnet server. Use only for troubleshooting",
"longopts": "telnet",
"shortopts": "t",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "System Statistics. Use only for troubleshooting",
"longopts": "stats",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}],
"hint": " [--cspot] [--BT_Speaker] [--AirPlay] [-t Disabled|Telnet Only|Telnet and Serial] [--stats]",
"name": "cfg-syst-services"
}, {
"help": "Get minimum size of free heap memory found during execution",
"hascb": false,
"name": "heap"
}, {
"help": "Device Name",
"hascb": true,
"argtable": [{
"datatype": "squeezelite-1fe714",
"glossary": "New Name",
"longopts": "new_name",
"shortopts": "n",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}],
"hint": " [-n squeezelite-1fe714]",
"name": "cfg-syst-name"
}, {
"help": "Get version of chip and SDK",
"hascb": false,
"name": "version"
}, {
"help": "Reboot system",
"hascb": false,
"name": "restart"
}, {
"help": "Reboot system to Recovery",
"hascb": false,
"name": "recovery"
}, {
"help": "Reboot system to Squeezelite",
"hascb": false,
"name": "restart_ota"
}, {
"help": "Preset Options",
"hascb": true,
"argtable": [{
"datatype": "SqueezeAMP|T-WATCH2020 by LilyGo",
"glossary": "Known Board Name.\nFor known boards, several systems parameters will be updated",
"longopts": "model_config",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}],
"hint": " --model_config=SqueezeAMP|T-WATCH2020 by LilyGo",
"name": "cfg-hw-preset"
}, {
"help": "General Audio Options",
"hascb": true,
"argtable": [{
"datatype": "Headphones|Subwoofer",
"glossary": "On supported DAC, determines the audio jack behavior. Selecting headphones will cause the external amp to be muted on insert, while selecting Subwoofer will keep the amp active all the time.",
"longopts": "jack_behavior",
"shortopts": "j",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}],
"hint": " [-j Headphones|Subwoofer]",
"name": "cfg-audio-general"
}, {
"help": "Bluetooth Audio Output Options",
"hascb": true,
"argtable": [{
"datatype": "name",
"glossary": "Bluetooth audio device name. This applies when output mode is Bluetooth",
"longopts": "sink_name",
"shortopts": "n",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "pin",
"glossary": "Bluetooth security/pin code. Usually 0000. This applies when output mode is Bluetooth",
"longopts": "pin_code",
"shortopts": "p",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}],
"hint": " -n name -p pin",
"name": "cfg-audio-bt_source"
}, {
"help": "DAC Options",
"hascb": true,
"argtable": [{
"datatype": "TAS57xx|TAS5713|AC101|WM8978|ES8388|",
"glossary": "DAC Model Name",
"longopts": "model_name",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Clock GPIO. e.g. 33",
"longopts": "clock",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Word Select GPIO. e.g. 25",
"longopts": "wordselect",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Data GPIO. e.g. 32",
"longopts": "data",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Mute GPIO. e.g. 14",
"longopts": "mute_gpio",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Mute GPIO level. Checked=HIGH, Unchecked=LOW",
"longopts": "mute_level",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "SDA GPIO. e.g. 27",
"longopts": "dac_sda",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "SCL GPIO. e.g. 26",
"longopts": "dac_scl",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "I2C device address. e.g. 106",
"longopts": "dac_i2c",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Clear configuration",
"longopts": "clear",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}],
"hint": " --model_name=TAS57xx|TAS5713|AC101|WM8978|ES8388| [--clock=<n>] [--wordselect=<n>] [--data=<n>] [--mute_gpio=<n>] [--mute_level] [--dac_sda=<n>] [--dac_scl=<n>] [--dac_i2c=<n>] [--clear]",
"name": "cfg-hw-dac"
}, {
"help": "SPDIF Options",
"hascb": true,
"argtable": [{
"datatype": "<n>",
"glossary": "Clock GPIO. e.g. 33",
"longopts": "clock",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Word Select GPIO. e.g. 25",
"longopts": "wordselect",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Data GPIO. e.g. 32",
"longopts": "data",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"glossary": "Clear configuration",
"longopts": "clear",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}],
"hint": " --clock=<n> --wordselect=<n> --data=<n> [--clear]",
"name": "cfg-hw-spdif"
}, {
"help": "Rotary Control",
"hascb": true,
"argtable": [{
"datatype": "remark",
"glossary": "One rotary encoder is supported, quadrature shift with press. Such encoders usually have 2 pins for encoders (A and B), and common C that must be set to ground and an optional SW pin for press. A, B and SW must be pulled up, so automatic pull-up is provided by ESP32, but you can add your own resistors. A bit of filtering on A and B (~470nF) helps for debouncing which is not made by software.\r\nEncoder is normally hard-coded to respectively knob left, right and push on LMS and to volume down/up/play toggle on BT and AirPlay.",
"checkbox": false,
"remark": true,
"hasvalue": false,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "gpio",
"glossary": "A/DT gpio",
"longopts": "A",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "gpio",
"glossary": "B/CLK gpio",
"longopts": "B",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "gpio",
"glossary": "Switch gpio",
"longopts": "SW",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Force Volume down/up/play toggle all the time (even in LMS). ",
"longopts": "volume_lock",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Enable alternate mode mode on long-press. In that mode, left is previous, right is next and press is toggle. Every long press on SW alternates between modes (the main mode actual behavior depends on 'volume').",
"longopts": "longpress",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Single knob full navigation. Left, Right and Press is navigation, with Press always going to lower submenu item. Longpress is 'Play', Double press is 'Back', a quick left-right movement on the encoder is 'Pause'",
"longopts": "knobonly",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "ms",
"glossary": "The speed of double click (or left-right) when knob only option is enabled. Be aware that the longer you set double click speed, the less responsive the interface will be. ",
"longopts": "timer",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Clear configuration",
"longopts": "clear",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Send button events as raw values to LMS. No remapping is possible when this is enabled",
"longopts": "raw_mode",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}],
"hint": " remark --A=gpio --B=gpio [--SW=gpio] [--volume_lock] [--longpress] [--knobonly] [--timer=ms] [--clear] [--raw_mode]",
"name": "cfg-hw-rotary"
}, {
"help": "I2C Bus Parameters",
"hascb": true,
"argtable": [{
"datatype": "0|1",
"glossary": "Port",
"longopts": "port",
"shortopts": "p",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "int",
"glossary": "Frequency (Hz) e.g. 100000",
"longopts": "speed",
"shortopts": "f",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "SDA GPIO. e.g. 19",
"longopts": "sda",
"shortopts": "d",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "SCL GPIO. e.g. 18",
"longopts": "scl",
"shortopts": "c",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Clear configuration",
"longopts": "clear",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}],
"hint": " [-p 0|1] [-f int] [-d <n>] [-c <n>] [--clear]",
"name": "cfg-hw-i2c"
}, {
"help": "SPI Bus Parameters",
"hascb": true,
"argtable": [{
"datatype": "<n>",
"glossary": "Data OUT GPIO",
"longopts": "data",
"shortopts": "d",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Data IN GPIO",
"longopts": "miso",
"shortopts": "d",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Clock GPIO",
"longopts": "clk",
"shortopts": "k",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "DC GPIO",
"longopts": "dc",
"shortopts": "c",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "1|2",
"glossary": "SPI Host Number",
"longopts": "host",
"shortopts": "h",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Clear configuration",
"longopts": "clear",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}],
"hint": " [-d <n>] [-d <n>] [-k <n>] [-c <n>] [-h 1|2] [--clear]",
"name": "cfg-hw-spi"
}, {
"help": "Scan I2C bus for devices",
"hascb": false,
"name": "i2cdetect"
}, {
"help": "Read registers visible through the I2C bus",
"hascb": false,
"argtable": [{
"datatype": "<chip_addr>",
"glossary": "Specify the address of the chip on that bus",
"longopts": "chip",
"shortopts": "c",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "<register_addr>",
"glossary": "Specify the address on that chip to read from",
"longopts": "register",
"shortopts": "r",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<length>",
"glossary": "Specify the length to read from that data address",
"longopts": "length",
"shortopts": "l",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}],
"hint": " -c <chip_addr> [-r <register_addr>] [-l <length>]",
"name": "i2cget"
}, {
"help": "Set registers visible through the I2C bus",
"hascb": false,
"argtable": [{
"datatype": "<chip_addr>",
"glossary": "Specify the address of the chip on that bus",
"longopts": "chip",
"shortopts": "c",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Specify the i2c port (0|2)",
"longopts": "port",
"shortopts": "p",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<register_addr>",
"glossary": "Specify the address on that chip to read from",
"longopts": "register",
"shortopts": "r",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<data>",
"glossary": "Specify the data to write to that data address",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 256
}],
"hint": " -c <chip_addr> [-p <n>] [-r <register_addr>] [<data>]...",
"name": "i2cset"
}, {
"help": "Examine registers visible through the I2C bus",
"hascb": false,
"argtable": [{
"datatype": "<chip_addr>",
"glossary": "Specify the address of the chip on that bus",
"longopts": "chip",
"shortopts": "c",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "<size>",
"glossary": "Specify the size of each read",
"longopts": "size",
"shortopts": "s",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}],
"hint": " -c <chip_addr> [-s <size>]",
"name": "i2cdump"
}, {
"help": "Display",
"hascb": true,
"argtable": [{
"datatype": "<I2C|SPI>",
"glossary": "Interface (default I2C)",
"longopts": "type",
"shortopts": "t",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<SH1106|SSD1306|SSD1322|SSD1326|SSD1327|SSD1675|SSD1351|ST7735|ST7789|ILI9341|>",
"glossary": "Driver",
"longopts": "driver",
"shortopts": "d",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "-1|1|4",
"glossary": "Bit Depth (only for SSD1326 displays)",
"longopts": "depth",
"shortopts": "p",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "I2C address (default 60)",
"longopts": "address",
"shortopts": "a",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Width",
"longopts": "width",
"shortopts": "w",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Height",
"longopts": "height",
"shortopts": "h",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 1,
"maxcount": 1
}, {
"glossary": "Rotate 180 degrees",
"longopts": "rotate",
"shortopts": "r",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Flip horizontally",
"longopts": "hf",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "Flip vertically",
"longopts": "vf",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "SPI Only. Bus Speed (Default 8000000). SPI interface can work up to 26MHz~40MHz",
"longopts": "speed",
"shortopts": "s",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "SPI Only. CS GPIO (for SPI displays)",
"longopts": "cs",
"shortopts": "b",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Backlight GPIO (if applicable)",
"longopts": "back",
"shortopts": "b",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"datatype": "<n>",
"glossary": "Reset GPIO",
"longopts": "reset",
"checkbox": false,
"remark": false,
"hasvalue": true,
"mincount": 0,
"maxcount": 1
}, {
"glossary": "clear configuration and return",
"longopts": "clear",
"checkbox": true,
"remark": false,
"hasvalue": false,
"mincount": 0,
"maxcount": 1
}],
"hint": " [-r] [-t <I2C|SPI>] [-d <SH1106|SSD1306|SSD1322|SSD1326|SSD1327|SSD1675|SSD1351|ST7735|ST7789|ILI9341|>] [-p -1|1|4] [-a <n>] -w <n> -h <n> [--hf] [--vf] [-s <n>] [-b <n>] [-b <n>] [--reset=<n>] [--clear]",
"name": "cfg-hw-display"
}],
"values": {
"cfg-syst-services": {
"BT_Speaker": true,
"AirPlay": true,
"cspot": true,
"stats": false,
"telnet": "Telnet and Serial"
},
"cfg-syst-name": {
"new_name": "squeezelite-1fe714"
},
"cfg-hw-preset": {
"model_config": "previous config value"
},
"cfg-audio-general": {
"jack_behavior": "Subwoofer"
},
"cfg-audio-bt_source": {
"sink_name": "SMSL BT4.2",
"pin_code": "0000"
},
"cfg-hw-dac": {
"dac_sda": 33,
"dac_scl": 32,
"model_name": "AC101"
},
"cfg-hw-spdif": {
},
"cfg-hw-rotary": {
},
"cfg-hw-i2c": {
"speed": 400000
},
"cfg-hw-spi": {
"data": 13,
"clk": 14,
"host": 1
},
"cfg-hw-display": {
"rotate": false,
"hf": false,
"vf": false
}
}
}
+349
View File
@@ -0,0 +1,349 @@
{
"gpio": [
{
"gpio": 33,
"name": "bck",
"group": "spdif",
"fixed": false
},
{
"gpio": 25,
"name": "ws",
"group": "spdif",
"fixed": false
},
{
"gpio": 15,
"name": "do",
"group": "spdif",
"fixed": false
},
{
"gpio": -1,
"name": "bck",
"group": "dac",
"fixed": false
},
{
"gpio": -1,
"name": "ws",
"group": "dac",
"fixed": false
},
{
"gpio": -1,
"name": "do",
"group": "dac",
"fixed": false
},
{
"gpio": -1,
"name": "sda",
"group": "dac",
"fixed": false
},
{
"gpio": -1,
"name": "scl",
"group": "dac",
"fixed": false
},
{
"gpio": -1,
"name": "mute",
"group": "dac",
"fixed": false
},
{
"gpio": 17,
"name": "clk",
"group": "psram",
"fixed": true
},
{
"gpio": 16,
"name": "cs",
"group": "psram",
"fixed": true
},
{
"gpio": 7,
"name": "spiq_sd0_io",
"group": "psram",
"fixed": true
},
{
"gpio": 8,
"name": "spid_sd1_io",
"group": "psram",
"fixed": true
},
{
"gpio": 10,
"name": "spiwp_sd3_io",
"group": "psram",
"fixed": true
},
{
"gpio": 9,
"name": "spihd_sd2_io",
"group": "psram",
"fixed": true
},
{
"gpio": 6,
"name": "clk",
"group": "flash",
"fixed": true
},
{
"gpio": 11,
"name": "cs",
"group": "flash",
"fixed": true
}
],
"config": {
"a2dp_sink_name": {
"type": 33,
"value": "SMSL BT4.2",
"chg": false
},
"a2dp_ctmt": {
"type": 33,
"value": "1000",
"chg": false
},
"a2dp_ctrld": {
"type": 33,
"value": "500",
"chg": false
},
"bt_sink_pin": {
"type": 33,
"value": "1234",
"chg": false
},
"release_url": {
"type": 33,
"value": "https://github.com/sle118/squeezelite-esp32/releases",
"chg": false
},
"ap_ip_address": {
"type": 33,
"value": "192.168.4.1",
"chg": false
},
"ap_ip_gateway": {
"type": 33,
"value": "192.168.4.1",
"chg": false
},
"ap_ip_netmask": {
"type": 33,
"value": "255.255.255.0",
"chg": false
},
"ap_channel": {
"type": 33,
"value": "1",
"chg": false
},
"ap_pwd": {
"type": 33,
"value": "squeezelite",
"chg": false
},
"airplay_port": {
"type": 33,
"value": "5000",
"chg": false
},
"bypass_wm": {
"type": 33,
"value": "0",
"chg": false
},
"actrls_config": {
"type": 33,
"value": "",
"chg": false
},
"lms_ctrls_raw": {
"type": 33,
"value": "n",
"chg": false
},
"rotary_config": {
"type": 33,
"value": "",
"chg": false
},
"ota_erase_blk": {
"type": 33,
"value": "249856",
"chg": false
},
"ota_stack": {
"type": 33,
"value": "10240",
"chg": false
},
"ota_prio": {
"type": 33,
"value": "6",
"chg": false
},
"display_config": {
"type": 33,
"value": "",
"chg": false
},
"i2c_config": {
"type": 33,
"value": "",
"chg": false
},
"spi_config": {
"type": 33,
"value": "",
"chg": false
},
"set_GPIO": {
"type": 33,
"value": "",
"chg": false
},
"led_brightness": {
"type": 33,
"value": "",
"chg": false
},
"dac_config": {
"type": 33,
"value": "",
"chg": false
},
"dac_controlset": {
"type": 33,
"value": "",
"chg": false
},
"jack_mutes_amp": {
"type": 33,
"value": "n",
"chg": false
},
"bat_config": {
"type": 33,
"value": "",
"chg": false
},
"metadata_config": {
"type": 33,
"value": "",
"chg": false
},
"telnet_buffer": {
"type": 33,
"value": "40000",
"chg": false
},
"telnet_block": {
"type": 33,
"value": "500",
"chg": false
},
"spdif_config": {
"type": 33,
"value": "bck=33,ws=25,do=15",
"chg": false
},
"enable_bt_sink": {
"type": 33,
"value": "N",
"chg": false
},
"enable_airplay": {
"type": 33,
"value": "N",
"chg": false
},
"disable_ps": {
"type": 33,
"value": "n",
"chg": false
},
"stats": {
"type": 33,
"value": "Y",
"chg": false
},
"autoexec": {
"type": 33,
"value": "1",
"chg": false
},
"autoexec1_spdif": {
"type": 33,
"value": "squeezelite -b 500:2000 -d all=info -C 30 -W -n \"squeezelite-test3\" -o SPDIF -Z 192000",
"chg": false
},
"autoexec1_i2s": {
"type": 33,
"value": "squeezelite -b 500:2000 -d all=info -C 30 -W -n \"squeezelite-test3\" -o I2S",
"chg": false
},
"autoexec1_bt": {
"type": 33,
"value": "squeezelite -b 500:2000 -d all=info -C 30 -W -n \"squeezelite-test3\" -o \"BT -n 'test'\" -Z 192000",
"chg": false
},
"autoexec1": {
"type": 33,
"value": "squeezelite -b 500:2000 -d all=info -C 30 -W -n \"squeezelite-test3\" -o \"BT -n 'test'\" -Z 192000",
"chg": false
},
"bt_name": {
"type": 33,
"value": "squeezelite-test3",
"chg": false
},
"host_name": {
"type": 33,
"value": "squeezelite-test3",
"chg": false
},
"airplay_name": {
"type": 33,
"value": "squeezelite-test3",
"chg": false
},
"ap_ssid": {
"type": 33,
"value": "squeezelite-test3",
"chg": false
},
"a2dp_dev_name": {
"type": 33,
"value": "squeezelite-test3",
"chg": false
},
"telnet_enable": {
"type": 33,
"value": "D",
"chg": false
},
"rel_api": {
"type": 33,
"value": "https://api.github.com/repos/sle118/squeezelite-esp32/releases",
"chg": false
},
"enable_cspot": {
"type": 33,
"value": "Y",
"chg": false
}
}
}
@@ -0,0 +1,85 @@
[{
"message": "{\"free_iram\":190232,\"min_free_iram\":184520,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":3468,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":2,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 61257,
"current_time": 147316
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":3468,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 71255,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 81256,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 91255,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 101255,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":98,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 111255,
"current_time": 147318
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 121256,
"current_time": 147318
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183872,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 131255,
"current_time": 147318
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183872,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 141256,
"current_time": 147319
},
{
"message": "Network connected",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_SYSTEM",
"sent_time": 141256,
"current_time": 147319
},
{
"message": "[{\n\t\t\"name\":\t\"SMSL BT4.2\",\n\t\t\"rssi\":\t-64\n\t}]",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_BT",
"sent_time": 6245,
"current_time": 6364
}, {
"message": "[{\n\t\t\"name\":\t\"BOSE BT\",\n\t\t\"rssi\":\t-129\n\t}]",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_BT",
"sent_time": 6259,
"current_time": 6364
}
, {
"message": "[{\n\t\t\"name\":\t\"BOSE2 BT\",\n\t\t\"rssi\":\t-50\n\t}]",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_BT",
"sent_time": 6259,
"current_time": 6364
}
]
@@ -0,0 +1,123 @@
[
{
"message": "Save Success",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_SYSTEM",
"sent_time": 14084,
"current_time": 16958
}, {
"message": "{\"ota_dsc\":\"Initializing...\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 14110,
"current_time": 16958
}, {
"message": "{\"ota_dsc\":\"Starting OTA...\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 14146,
"current_time": 16958
}, {
"message": "{\"ota_dsc\":\"Downloading firmware\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 15208,
"current_time": 16958
},
{
"message": "{\"ota_dsc\":\"Download success\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 18825,
"current_time": 22219
}, {
"message": "{\"ota_dsc\":\"New version is : mock version \",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 18849,
"current_time": 22220
}, {
"message": "{\"ota_dsc\":\"Formatting OTA partition\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 18850,
"current_time": 22220
}, {
"message": "{\"ota_dsc\":\"Erasing flash (1/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 22217,
"current_time": 22220
},
{
"message": "{\"ota_dsc\":\"Erasing flash (5/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 29896,
"current_time": 29902
},
{
"message": "{\"ota_dsc\":\"Erasing flash (7/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 33395,
"current_time": 33408
},
{
"message": "{\"ota_dsc\":\"Erasing flash (9/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 36843,
"current_time": 54597
}, {
"message": "{\"ota_dsc\":\"Erasing flash complete.\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 39463,
"current_time": 54597
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":5}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 41862,
"current_time": 54597
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":10}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 44003,
"current_time": 54597
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":40}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 56678,
"current_time": 65185
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":70}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 69407,
"current_time": 77858
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":95}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 80010,
"current_time": 82592
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":100}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 82084,
"current_time": 82592
},
{
"message": "{\"ota_dsc\":\"Success!\",\"ota_pct\":100}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 119255,
"current_time": 121838
}
]
@@ -0,0 +1,21 @@
[{
"message": "{\"ota_dsc\":\"Initializing...\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 119203,
"current_time": 121837
}, {
"message": "{\"ota_dsc\":\"Starting OTA...\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 119255,
"current_time": 121838
},
{
"message": "{\"ota_dsc\":\"Error: Failed to execute HTTP download. ERROR\",\"ota_pct\":0}",
"type": "MESSAGING_ERROR",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 121954,
"current_time": 124911
}
]
@@ -0,0 +1,117 @@
[
{
"message": "{\"ota_dsc\":\"Initializing...\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 14110,
"current_time": 16958
}, {
"message": "{\"ota_dsc\":\"Starting OTA...\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 14146,
"current_time": 16958
}, {
"message": "{\"ota_dsc\":\"New version is : mock version \",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 18849,
"current_time": 22220
}, {
"message": "{\"ota_dsc\":\"Formatting OTA partition\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 18850,
"current_time": 22220
}, {
"message": "{\"ota_dsc\":\"Erasing flash (1/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 22217,
"current_time": 22220
},
{
"message": "{\"ota_dsc\":\"Erasing flash (5/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 29896,
"current_time": 29902
},
{
"message": "{\"ota_dsc\":\"Erasing flash (7/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 33395,
"current_time": 33408
},
{
"message": "{\"ota_dsc\":\"Erasing flash (9/11)\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 36843,
"current_time": 54597
}, {
"message": "{\"ota_dsc\":\"Erasing flash complete.\",\"ota_pct\":0}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 39463,
"current_time": 54597
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":5}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 41862,
"current_time": 54597
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":25}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 50307,
"current_time": 54598
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":30}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 52455,
"current_time": 54598
},
{
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":35}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 54603,
"current_time": 65184
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":55}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 63042,
"current_time": 65185
},
{
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":60}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 65190,
"current_time": 77858
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":95}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 80010,
"current_time": 82592
}, {
"message": "{\"ota_dsc\":\"Writing binary file\",\"ota_pct\":100}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 82084,
"current_time": 82592
},
{
"message": "{\"ota_dsc\":\"Success!\",\"ota_pct\":100}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_OTA",
"sent_time": 119255,
"current_time": 121838
}
]
@@ -0,0 +1,90 @@
[{
"message": "{\"free_iram\":190232,\"min_free_iram\":184520,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":3468,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":2,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 61257,
"current_time": 147316
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":3468,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 71255,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 81256,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 91255,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 101255,
"current_time": 147317
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":98,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 111255,
"current_time": 147318
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183992,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 121256,
"current_time": 147318
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183872,\"free_spiram\":4048488,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 131255,
"current_time": 147318
}, {
"message": "{\"free_iram\":190232,\"min_free_iram\":183872,\"free_spiram\":4048492,\"min_free_spiram\":4026220,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":400,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":97,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":1580,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":0,\"minstk\":708,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":3436,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 141256,
"current_time": 147319
},
{
"message": "Info Message",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_SYSTEM",
"sent_time": 3519,
"current_time": 24674
},
{
"message": "Warning Message",
"type": "MESSAGING_WARNING",
"class": "MESSAGING_CLASS_SYSTEM",
"sent_time": 3519,
"current_time": 24674
},
{
"message": "Warning Message",
"type": "MESSAGING_ERROR",
"class": "MESSAGING_CLASS_SYSTEM",
"sent_time": 3519,
"current_time": 24674
},
{
"message": "{\"free_iram\":194144,\"min_free_iram\":185048,\"free_spiram\":4061372,\"min_free_spiram\":4050012,\"ntasks\":13,\"tasks\":[]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 11201,
"current_time": 24674
}, {
"message": "{\"free_iram\":193848,\"min_free_iram\":185048,\"free_spiram\":4049576,\"min_free_spiram\":4049576,\"ntasks\":13,\"tasks\":[{\"cpu\":0,\"minstk\":480,\"bprio\":1,\"cprio\":1,\"nme\":\"Tmr Svc\",\"st\":1,\"num\":8},{\"cpu\":99,\"minstk\":1000,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE1\",\"st\":1,\"num\":7},{\"cpu\":98,\"minstk\":992,\"bprio\":0,\"cprio\":0,\"nme\":\"IDLE0\",\"st\":1,\"num\":6},{\"cpu\":0,\"minstk\":2184,\"bprio\":18,\"cprio\":18,\"nme\":\"tiT\",\"st\":2,\"num\":12},{\"cpu\":0,\"minstk\":1948,\"bprio\":5,\"cprio\":5,\"nme\":\"console\",\"st\":2,\"num\":18},{\"cpu\":0,\"minstk\":528,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc0\",\"st\":2,\"num\":2},{\"cpu\":0,\"minstk\":676,\"bprio\":20,\"cprio\":20,\"nme\":\"sys_evt\",\"st\":2,\"num\":13},{\"cpu\":0,\"minstk\":2096,\"bprio\":5,\"cprio\":5,\"nme\":\"wifi_manager\",\"st\":2,\"num\":15},{\"cpu\":0,\"minstk\":3468,\"bprio\":22,\"cprio\":22,\"nme\":\"esp_timer\",\"st\":2,\"num\":1},{\"cpu\":0,\"minstk\":2524,\"bprio\":5,\"cprio\":5,\"nme\":\"httpd\",\"st\":2,\"num\":16},{\"cpu\":1,\"minstk\":868,\"bprio\":23,\"cprio\":23,\"nme\":\"wifi\",\"st\":2,\"num\":14},{\"cpu\":0,\"minstk\":536,\"bprio\":24,\"cprio\":24,\"nme\":\"ipc1\",\"st\":2,\"num\":3},{\"cpu\":0,\"minstk\":7244,\"bprio\":1,\"cprio\":1,\"nme\":\"telnet\",\"st\":2,\"num\":17}]}",
"type": "MESSAGING_INFO",
"class": "MESSAGING_CLASS_STATS",
"sent_time": 21267,
"current_time": 24674
}
]
+1
View File
@@ -0,0 +1 @@
{}
@@ -0,0 +1,16 @@
{
"project_name": "recovery",
"version": "custom.build",
"recovery": 1,
"Jack": "1",
"Voltage": 0,
"disconnect_count": 0,
"avg_conn_time": 0,
"is_i2c_locked": false,
"urc": 0,
"bt_status": 0,
"ssid": "MyTestSSID",
"ip": "192.168.10.225",
"netmask": "255.255.255.0",
"gw": "192.168.10.1"
}
+28
View File
@@ -0,0 +1,28 @@
{
"project_name": "SqueezeAMP",
"version": "local.500.cmake-master",
"recovery": 1,
"Jack": "1",
"Voltage": 0,
"disconnect_count": 0,
"avg_conn_time": 0,
"is_i2c_locked": false,
"urc": 0,
"bt_status": 0,
"bt_sub_status": 0,
"rssi": -59,
"ssid": "MyTestSSID",
"ip": "192.168.10.225",
"netmask": "255.255.255.0",
"gw": "192.168.10.1",
"lms_cport": 9090,
"lms_port": 9100,
"lms_ip": "127.0.0.1",
"if": "eth",
"platform_name": "SqueezeAmp",
"mock_plugin_has_proxy": "x",
"mock_fail_fw_update":"",
"mock_fail_recovery":"",
"mock_old_recovery":"",
"depth": 16
}
@@ -0,0 +1,26 @@
{
"urc": {
"Wifi Connection OK": 0,
"Wifi Failed Connect Attempt": 1,
"WiFi User Disconnect": 2,
"WiFi Lost Connection": 3,
"Wifi update failed attempt and restore" : 4,
"Ethernet Connected": 5
},
"bt_status": {
"Idle": 0,
"Discovering": 1,
"Discovered": 2,
"Unconnected": 3,
"Connecting": 4,
"Connected": 5,
"Disconnecting": 6
},
"bt_sub_status": {
"Default": 0,
"Connected - Starting": 1,
"Connected - Started": 2,
"Connected - Pause": 3,
"Connected - Stop": 4
}
}
+98
View File
@@ -0,0 +1,98 @@
{
"name": "squeezelite-esp32",
"version": "0.5.0",
"main": "src/index.html",
"repository": "git@github.com:sle118/squeezelite-esp32.git",
"author": "Sebastien L",
"license": "MIT",
"scripts": {
"prod": "webpack serve --open --mode=production",
"build": "webpack --mode=production ",
"stats": "webpack --env ANALYZE_SIZE=1 --mode=production ",
"watch": "webpack --progress --watch --mode=development ",
"dev": "webpack serve --open --mode=development"
},
"devDependencies": {
"@babel/core": "^7.16.12",
"@babel/plugin-transform-runtime": "^7.16.10",
"@babel/preset-env": "^7.16.11",
"@babel/preset-typescript": "^7.16.7",
"@squoosh/lib": "^0.4.0",
"autoprefixer": "^10.4.2",
"babel": "^6.23.0",
"babel-loader": "^8.2.3",
"babel-runtime": "^6.26.0",
"clean-webpack-plugin": "^4.0.0",
"commander": "^8.3.0",
"compression-webpack-plugin": "^9.2.0",
"copy-webpack-plugin": "^10.2.1",
"css-loader": "^6.5.1",
"css-minimizer-webpack-plugin": "^3.4.1",
"ejs-loader": "^0.5.0",
"es6-promise": "^4.2.8",
"file-loader": "^6.2.0",
"glob": "^7.2.0",
"glob-all": "^3.2.1",
"google-fonts-webpack-plugin": "^0.4.4",
"html-loader": "^3.1.0",
"html-minimizer-webpack-plugin": "^3.5.0",
"html-webpack-plugin": "^5.5.0",
"image-minimizer-webpack-plugin": "^3.2.3",
"imagemin": "^8.0.1",
"imagemin-gifsicle": "^7.0.0",
"imagemin-jpegtran": "^7.0.0",
"imagemin-mozjpeg": "^10.0.0",
"imagemin-optipng": "^8.0.0",
"imagemin-pngquant": "^9.0.2",
"imagemin-svgo": "^10.0.1",
"js-cookie": "^3.0.1",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"lodash-webpack-plugin": "^0.11.6",
"mini-css-extract-plugin": "^2.5.2",
"node-sass": "^7.0.1",
"open": "^9.1.0",
"postcss": "^8.4.5",
"postcss-loader": "^6.2.1",
"purgecss-webpack-plugin": "^4.1.3",
"purgecss-whitelister": "^2.4.0",
"purify-css": "^1.2.5",
"purifycss-webpack": "^0.7.0",
"remixicon": "^2.5.0",
"sass-loader": "^12.4.0",
"string-argv": "^0.3.1",
"style-loader": "^3.3.1",
"terser-webpack-plugin": "^5.3.0",
"ts-loader": "^9.2.6",
"typescript": "^4.5.5",
"webpack": "^5.67.0",
"webpack-bundle-analyzer": "^4.8.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.7.3"
},
"dependencies": {
"@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"
},
"keywords": [
"webppack4",
"sass",
"bootstrap4",
"jquery",
"popperjs",
"livereload",
"dev-server",
"font-awesome",
"es-lint",
"typescript",
"line-awesome"
]
}
+141
View File
@@ -0,0 +1,141 @@
{
"name": "squeezelite-esp32",
"version": "0.5.0",
"main": "src/index.html",
"repository": "git@github.com:sle118/squeezelite-esp32.git",
"author": "Andy K., Sebastien",
"license": "MIT",
"scripts": {
"dev": "webpack-dev-server --open --config webpack/webpack.dev.js",
"build": "webpack --config webpack/webpack.prod.js",
"prod": "webpack-dev-server --open --config webpack/webpack.prod.js"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"dependencies": {
"@popperjs/core": "^2.11.2",
"@types/bootstrap": "^5.1.8",
"animate.css": "^4.1.1",
"bootstrap": "^5.1.3",
"bootswatch": "^5.1.3",
"commander": "^8.3.0",
"expose-loader": "^3.1.0",
"hamburgers": "^1.1.3",
"jquery": "^3.6.0",
"line-awesome": "^1.3.0",
"lodash": "^4.17.21",
"perfect-scrollbar": "^1.5.3",
"popper": "^1.0.1",
"react": "^17.0.2",
"remixicon": "^2.5.0",
"string-argv": "^0.3.1",
"stylelint-config-standard": "^24.0.0",
"svgo": "^2.8.0",
"underscore": "^1.13.2",
"webpack-icons-installer": "^2.0.0"
},
"devDependencies": {
"@babel/core": "^7.16.7",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
"@babel/plugin-proposal-optional-chaining": "^7.16.7",
"@babel/plugin-transform-runtime": "^7.16.8",
"@babel/preset-env": "^7.16.8",
"@babel/preset-typescript": "^7.16.7",
"@fullhuman/postcss-purgecss": "^4.1.3",
"@types/lodash": "^4.14.178",
"autoprefixer": "^10.4.2",
"babel-eslint": "^10.0.3",
"babel-loader": "^8.2.3",
"babel-preset-minify": "^0.5.1",
"body-parser": "^1.19.1",
"browser-sync": "^2.27.7",
"browser-sync-webpack-plugin": "^2.3.0",
"browserlist": "^1.0.1",
"compression-webpack-plugin": "^9.2.0",
"cross-env": "^7.0.3",
"css-loader": "^6.5.1",
"cssnano": "^5.0.15",
"eslint": "^8.6.0",
"eslint-config-google": "^0.14.0",
"eslint-webpack-plugin": "^3.1.1",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"favicons-webpack-plugin": "5.0.2",
"file-loader": "^6.2.0",
"glob": "^7.2.0",
"glob-all": "^3.2.1",
"hook-shell-script-webpack-plugin": "^0.1.4",
"html-loader": "^3.1.0",
"html-webpack-plugin": "^5.5.0",
"image-minimizer-webpack-plugin": "^3.2.2",
"image-webpack-loader": "^8.1.0",
"imagemin": "^8.0.1",
"imagemin-gifsicle": "^7.0.0",
"imagemin-mozjpeg": "^10.0.0",
"imagemin-pngquant": "^9.0.2",
"imagemin-svgo": "^10.0.1",
"imagemin-webpack-plugin": "^2.4.2",
"img-loader": "^4.0.0",
"install": "^0.13.0",
"less": "^4.1.2",
"lodash-webpack-plugin": "^0.11.6",
"mini-css-extract-plugin": "^2.4.6",
"miragejs": "^0.1.43",
"node-sass": "^7.0.1",
"offline-plugin": "^5.0.7",
"on-build-webpack": "^0.1.0",
"optimize-css-assets-webpack-plugin": "^6.0.1",
"postcss-loader": "^6.2.1",
"preload-webpack-plugin": "^2.3.0",
"promise": "^8.1.0",
"purgecss-webpack-plugin": "^4.1.3",
"purify-css": "^1.2.5",
"purifycss-webpack": "^0.7.0",
"raw-loader": "^4.0.2",
"resolve-url-loader": "^4.0.0",
"sass-loader": "^12.4.0",
"script-ext-html-webpack-plugin": "^2.1.5",
"source-map-loader": "^3.0.1",
"style-loader": "^3.3.1",
"stylelint": "^14.2.0",
"stylelint-config-recommended": "^6.0.0",
"stylelint-webpack-plugin": "^3.1.0",
"svg-sprite-loader": "^6.0.11",
"svg-transform-loader": "^2.0.13",
"svgo-loader": "^3.0.0",
"terser-webpack-plugin": "^5.3.0",
"ts-loader": "^9.2.6",
"tslint": "^5.20.1",
"tslint-webpack-plugin": "^2.1.1",
"typescript": "^4.5.4",
"url-loader": "^4.1.1",
"webpack": "^5.65.0",
"webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.1",
"webpack-dev-server": "^4.7.3",
"webpack-merge": "^5.8.0",
"xml-loader": "^1.2.1"
},
"keywords": [
"webppack4",
"sass",
"bootstrap4",
"jquery",
"popperjs",
"livereload",
"dev-server",
"font-awesome",
"es-lint",
"typescript",
"line-awesome"
]
}
@@ -0,0 +1,3 @@
module.exports = {
};
+37
View File
@@ -0,0 +1,37 @@
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 days"
ExpiresByType text/html "access plus 5 minutes"
ExpiresByType text/xml "access plus 6 hours"
ExpiresByType text/css "access plus 1 weeks"
ExpiresByType text/javascript "access plus 1 weeks"
ExpiresByType application/javascript "access plus 1 weeks"
ExpiresByType application/x-javascript "access plus 1 weeks"
ExpiresByType text/ecmascript "access plus 1 weeks"
ExpiresByType image/gif "access plus 1 years"
ExpiresByType image/png "access plus 1 years"
ExpiresByType image/jpeg "access plus 1 years"
ExpiresByType image/ico "access plus 1 years"
ExpiresByType image/icon "access plus 1 years"
ExpiresByType image/x-icon "access plus 1 years"
ExpiresByType video/x-flv "access plus 1 years"
ExpiresByType video/quicktime "access plus 1 years"
ExpiresByType application/x-shockwave-flash "access plus 1 years"
ExpiresByType application/pdf "access plus 1 years"
</IfModule>
# gzip Compression if availiable
AddEncoding gzip .gzip
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-shockwave-flash
</IfModule>
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

+590
View File
@@ -0,0 +1,590 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<meta name="apple-mobile-web-app-capable" content="yes" />
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet">
<title></title>
</head>
<body class="d-flex flex-column">
<header class="navbar navbar-expand-sm navbar-dark bg-primary sticky-top border-bottom border-dark" id="mainnav">
<a class="navbar-brand" id="navtitle" href="#"></a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="nav navbar-nav mr-auto" role="tablist">
<li class="nav-item"><a class="nav-link active" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-wifi">WiFi</a></li>
<li class="nav-item omsg"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-syslog">Status<span class="badge badge-pill badge-success" id="msgcnt"></span></a>
</li>
<li class="nav-item orec"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-cfg-audio">Audio</a></li>
<li class="nav-item orec"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-cfg-syst">System</a></li>
<li class="nav-item orec"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-cfg-hw">Hardware</a></li>
<li class="nav-item"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-cfg-fw">Updates</a></li>
<div class="dropdown-divider"></div>
<li class="nav-item"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-nvs">NVS Editor</a></li>
<li class="nav-item"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-commands">Advanced</a></li>
<li class="nav-item"><a class="nav-link" data-bs-toggle="tab" aria-controls="profile" role="tab"
href="#tab-credits">Credits</a></li>
</ul>
</div>
<div class="info navbar-right" style="display: inline-flex;">
<span class="recovery_element material-icons " style="color:orange; display: none"
aria-label="🛑">system_update_alt</span>
<span id="battery" class="material-icons" style="fill:white; display: none"
aria-label="🔋">battery_full</span>
<span id="o_jack" class="material-icons" style="fill:white; display: none" aria-label="🎧">headphones</span>
<span id="s_airplay" class="material-icons" style="fill:white; display: none" aria-label="🍎">airplay</span>
<em id="s_cspot" class="fab fa-spotify" style="fill:white; display: inline"></em>
<span data-bs-toggle="tooltip" id="o_type" data-bs-placement="top" title="">
<span id="o_bt" class="material-icons" style="fill:white; display: none" aria-label="">bluetooth</span>
<span id="o_spdif" class="material-icons" style="fill:white; display: none"
aria-label="">graphic_eq</span>
<span id="o_i2s" class="material-icons" style="fill:white; display: none" aria-label="🔈">speaker</span>
</span>
<span id="ethernet" class="material-icons if_eth" style="fill:white; display: none"
aria-label="ETH">cable</span>
<span id="wifiStsIcon" class="material-icons if_wifi" style="fill:white; display: none"
aria-label=""></span>
</div>
</header>
<main role="main" class="flex-grow mt-1 mb-12" style="margin-bottom: 7rem;" id="content">
<!-- Button trigger modal -->
<!-- Modal -->
<div class="modal" id="otadiv" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="fwProgressLabel">Upgrade Progress</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<span id="flash-status"></span>
<div class="progress" id="progress">
<div class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuemax="100"
style="width:0%">
0%
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade" id="tab-cfg-hw"> </div>
<div class="tab-pane fade" id="tab-cfg-syst"></div>
<div class="tab-pane fade" id="tab-cfg-gen"></div>
<div class="tab-pane fade" id="tab-cfg-fw">
<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">
<thead>
<tr>
<th class="border-bottom-0 pb-0" scope="col">Version</th>
<th class="border-bottom-0 pb-0" scope="col">Date/Time</th>
<th class="border-bottom-0 pb-0" scope="col">Platform</th>
<th class="border-bottom-0 pb-0" scope="col">Branch</th>
<th class="border-bottom-0 pb-0" scope="col">Bit Depth</th>
</tr>
<tr>
<th class="border-top-0 pt-0" scope="col"><input class="form-control-sm upSrch"
id="svrs" type="text" placeholder="search releases"></th>
<th class="border-top-0 pt-0" scope="col"></th>
<th class="border-top-0 pt-0" scope="col"><input class="form-control-sm upSrch"
id="splf" type="text" placeholder="search platform"></th>
<th class="border-top-0 pt-0" scope="col"><select class="form-control-sm upSrch"
id="fwbranch">
<option selected="">Choose FW branch</option>
</select>
<th class="border-top-0 pt-0" scope="col"><input class="form-control-sm upSrch"
id="bits" type="text" placeholder="search bit depth"></th>
</th>
</tr>
</thead>
<tbody id="rTable"></tbody>
</table>
<div class="form-group row">
<div class="col-auto">
<button type="button" id="chkUpdates" class="btn btn-info btn-sm">Check for
updates</button>
</div>
<label class="col-auto col-form-label" for="fw-url-input">Firmware URL</label>
<div class="col">
<input type="text" class="form-control"
placeholder="select entry from list or enter known url" id="fw-url-input">
</div>
<div class="col-auto">
<button type="button" id='start-flash' data-bs-toggle="modal" data-bs-target="#uCnfrm"
class="btn btn-warning btn-sm flact" style="display: none;">Flash Firmware</button>
</div>
<div class="col-auto">
<button id="btn_reboot_recovery" class="btn-warning ota_element"
type="submit">Recovery</button>
</div>
</div>
</div>
</div>
<div class="modal" id="uCnfrm">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Firmware Flash</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Flash URL <span id="selectedFWURL" class="text-break"></span> to device?</p>
</div>
<div class="modal-footer ">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button id="btn_flash" type="button" class="btn btn-warning"
data-bs-dismiss="modal">Ok</button>
</div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-header">Local Firmware Upload</div>
<div class="card-body">
<div id="uploaddiv" class="form-group row ">
<label for="flashfilename" class="col-auto col-form-label">Local File</label>
<div class="col">
<input type="file" class="form-control-file" id="flashfilename"
aria-describedby="fileHelp">
</div>
<div class="col-auto">
<div class="buttons">
<button type="button" class="btn btn-danger flact" id="fwUpload">Upload!</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="tab-nvs">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Key</th>
<th scope="col">Value</th>
</tr>
</thead>
<tbody id="nvsTable">
</tbody>
</table>
<div class="buttons">
<button button id="btn_reboot" class="btn btn-primary" style="float:right"
type="submit">Reboot</button>
<input id="save-nvs" type="button" class="btn btn-success" value="Commit">
<input id="save-as-nvs" type="button" class="btn btn-success" value="Download config">
<input id="load-nvs" type="button" class="btn btn-success" value="Load File">
<input aria-describedby="fileHelp" id="nvsfilename" type="file" style="display:none">
</div>
</div>
<div class="tab-pane fade" id="tab-cfg-audio">
<div class="card mb-3">
<div class="card-header">Usage Templates</div>
<div class="card-body">
<fieldset class="form-group" id="output-tmpl">
<label>Output</label><br>
<div class="form-check form-check-inline">
<label class="form-check-label">
<input type="radio" class="form-check-input" name="output-tmpl" id="i2s">
I2S Dac
</label>
</div>
<div class="form-check form-check-inline">
<label class="form-check-label">
<input type="radio" class="form-check-input" name="output-tmpl" id="spdif">
SPDIF
</label>
</div>
<div class="form-check form-check-inline">
<label class="form-check-label">
<input type="radio" class="form-check-input" name="output-tmpl" id="bt">
Bluetooth
</label>
</div>
</fieldset>
<fieldset>
<div id="options">
<div class="form-group"><label for="cmd_opt_n">Set the player name</label><input
type="text" class="form-control sqcmd" placeholder="name" id="cmd_opt_n"></div>
<div class="form-group"><label for="cmd_opt_s">Server</label><input type="text"
class="form-control sqcmd" placeholder="server[:port]" id="cmd_opt_s"></div>
<div class="form-group"><label for="cmd_opt_b">Stream and Output buffer sizes (in
Kbytes)</label><input type="text" class="form-control sqcmd"
placeholder="stream:output" id="cmd_opt_b"></div>
<div class="form-group"><label for="cmd_opt_c">Restrict codecs </label><input
type="text" class="form-control sqcmd" placeholder="codec1,codec2"
id="cmd_opt_c"><small class="form-text text-muted">Supported: flac,pcm,mp3,ogg
(mad,mpg for specific mp3 codec)</small></div>
<div class="form-group"><label for="cmd_opt_C">Ouput device close timeout</label><input
type="text" class="form-control sqcmd" placeholder="timeout"
id="cmd_opt_C"><small class="form-text text-muted">Close output device after
timeout seconds, default
is to keep it open while player is 'on'</small></div>
<div class="form-group"><label for="cmd_opt_d">Set logging level</label><input
type="text" class="form-control sqcmd" placeholder="log=level"
id="cmd_opt_d"><small class="form-text text-muted">Logs:
all|slimproto|stream|decode|output, level:
info|debug|sdebug</small></div>
<div class="form-group"><label for="cmd_opt_e">Explicitly exclude native support of one
or more codecs</label><input type="text" class="form-control sqcmd"
placeholder="codec1,codec2" id="cmd_opt_e"><small
class="form-text text-muted">Supported: flac,pcm,mp3,ogg (mad,mpg for specific
mp3 codec)</small></div>
<div class="form-group"><label for="cmd_opt_m">Set mac address</label><input type="text"
class="form-control sqcmd" placeholder="mac addr" id="cmd_opt_m"><small
class="form-text text-muted">Format: ab:cd:ef:12:34:56</small></div>
<div class="form-group"><label for="cmd_opt_r">Sample rates supported, allows output to
be off when squeezelite is started</label><input type="text"
class="form-control sqcmd" placeholder="rates" id="cmd_opt_r"><small
class="form-text text-muted">&lt;maxrate&gt;|&lt;minrate&gt;&lt;maxrate&gt;&lt;rate1&gt;&lt;rate2&gt;&lt;rate3&gt;</small>
</div>
<div class="form-group hide" id="cmd_opt_R">
<label>Resample</label><br>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="resample" id="resample_none"
suffix="" checked aint="false">
<label class="form-check-label" for="resampleNone">No resampling</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="resample" id="resample"
suffix=' -R' aint="false">
<label class="form-check-label" for="resampleNone">Default</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="resample" id="resample_b"
suffix=' -R -u b' aint="true">
<label class="form-check-label" for="resampleBasic">Basic linear
interpolation</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="resample" id="resample_l"
suffix=' -R -u l' aint="true">
<label class="form-check-label" for="resample13Taps">13 taps</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="resample" id="resample_m"
suffix=' -R -u m' aint="true">
<label class="form-check-label" for="resample21Taps">21 taps</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" name="interpolate"
id="resample_i" suffix=":i">
<label class="form-check-label" for="interpolate">Interpolate filter
coefficients</label>
</div>
</div>
<div class="form-group"><label for="cmd_opt_Z">Report rate to server in helo as the
maximum sample rate we can support</label><input type="text"
class="form-control" placeholder="rate" id="cmd_opt_Z"></div>
<div class="form-group">
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" id="cmd_opt_W" value=""
checked="">
Read wave and aiff format from header, ignore server parameters
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="form-check">
<label class="form-check-label">
<input class="form-check-input" type="checkbox" id="disable-squeezelite" value="" >
Disable Squeezelite
</label>
</div>
</div>
<div style="margin-top: 16px;">
<div class="toast hide" role="alert" aria-live="assertive" aria-atomic="true"
id="toast_cfg-audio-tmpl">
<div class="toast-header"><strong class="mr-auto">Result</strong>
<button type="button" class="btn-close" data-bs-dismiss="toast"
aria-label="Close"></button>
</div>
<div class="toast-body" id="msg_cfg-audio-tmpl"></div>
</div>
</div>
<button id="save-autoexec1" type="submit" class="btn btn-info"
cmdname="cfg-audio-tmpl">Save</button>
<button id="commit-autoexec1" type="submit" class="btn btn-warning"
cmdname="cfg-audio-tmpl">Apply</button>
</fieldset>
</div>
</div>
</div>
<div class="tab-pane fade active show" id="tab-wifi">
<div class="card mb-3">
<div class="card-header">WiFi Status</div>
<div class="card-body if_eth" style="display: none">
<h2>Connected to Ethernet</h2>
<p>WiFi is inactive while connected to a wired network.
</div>
<div class="card-body if_wifi" style="display: none">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Joined</th>
<th scope="col">Name</th>
<th scope="col">Signal</th>
<th scope="col">Security</th>
</tr>
</thead>
<tbody id="wifiTable"></tbody>
</table>
<button type="button" id="updateAP" class="btn btn-info btn-sm">Scan</button>
</div>
<div class="modal" id="WiFiDisconnectConfirm">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Disconnect</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Disconnect from network? After disconnecting, the system won't be accessible from
the current address and will expose itself as access point name <span
id="apName"></span> with password <span id="apPass"></span> </p>
</div>
<div class="modal-footer connecting-success connecting-status">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">Cancel</button>
<button id="btn_disconnect" type="button" class="btn btn-warning"
data-bs-dismiss="modal">Ok</button>
</div>
</div>
</div>
</div>
<div class="modal" id="WifiConnectDialog" aria-hidden="true">
<div class="modal-dialog ">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title connecting connecting-init connecting-fail">Connect to WiFi
</h5>
<h5 class="modal-title connecting-status connecting-success">Status</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<fieldset class="connecting-init connecting-fail">
<div class="form-group"><label for="manual_ssid">Wifi Name</label><input
type="text" class="form-control" placeholder="Enter Name"
id="manual_ssid"></div>
<div class="form-group"><label for="manual_pwd">Password</label><input
type="password" class="form-control" placeholder="Enter Name"
id="manual_pwd"></div>
</fieldset>
<div id="connect-wait" class="connecting">
<div>Connecting to <span id="ssid-wait"></span> </div>
<div>
You may lose wifi access while the esp32 recalibrates
its radio. Please
wait until your device automatically reconnects. This can take up to
30s.
</div>
</div>
<div id="connect-success" class="connecting-success connecting-status">
<div> Connected to Access Point : <span id="connectedToSSID"></span></div>
<div> Device IP address : <span id="ipAddress"></span></div>
<div>Subnet Mask:<span id="netmask"></span></div>
<div>Default Gateway:<span id="gateway"></span></div>
</div>
<div id="connect-fail" class="connecting-fail">
<h3 class="text-error">Connection failed</h3>
<p>Please double-check wifi password if any and make sure the access point has
good signal.</p>
</div>
</div>
<div class="modal-footer ">
<button type="button"
class="btn btn-secondary connecting-init connecting-fail connecting"
data-bs-dismiss="modal">Close</button>
<button type="button" id="btnJoin"
class="btn btn-primary connecting-init connecting-fail">Join</button>
<button type="button" class="connecting btn btn-primary" disabled>
<span class="spinner-border spinner-border-sm" role="status"
aria-hidden="true"></span>
<span class="sr-only">Connecting...</span></button>
</div>
<div class="modal-footer connecting-success connecting-status justify-content-between"
style=""><button type="button" class="btn btn-primary"
data-bs-dismiss="modal">Ok</button><button type="button" class="btn btn-danger"
data-bs-toggle="modal" data-bs-dismiss="modal"
data-bs-target="#WiFiDisconnectConfirm">Disconnect</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane fade " id="tab-commands">
<fieldset id="commands-list"></fieldset>
</div>
<!-- Status -->
<div class="tab-pane fade " id="tab-syslog">
<div class="card border-primary mb-3">
<div class="card-header">Logs</div>
<div class="card-body">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Timestamp</th>
<th scope="col">Message</th>
</tr>
</thead>
<tbody id="syslogTable">
</tbody>
</table>
<div class="buttons">
<input id="clear-syslog" type="button" class="btn btn-danger btn-sm" value="Clear" />
</div>
</div>
</div>
<div class="card border-primary mb-3" id="pins" style="display: none;">
<div class="card-header">Pin Assignments</div>
<div class="card-body">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Device</th>
<th scope="col">Pin Name</th>
<th scope="col">GPIO Number</th>
<th scope="col">Type</th>
</tr>
</thead>
<tbody id="gpiotable"></tbody>
</table>
</div>
</div>
<div class="card border-primary mb-3" style="visibility: collapse;" id="tasks_sect">
<div class="card-header">Tasks</div>
<div class="card-body">
<table class="table table-hover">
<!-- console.log(msg_time.toLocaleString() + '\tname' + '\tcpu' + '\tstate' + '\tminstk' + '\tbprio' + '\tcprio' + '\tnum'); -->
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Task Name</th>
<th scope="col">CPU</th>
<th scope="col">State</th>
<th scope="col">Min Stack</th>
<th scope="col">Base Priority</th>
<th scope="col">Cur Priority</th>
</tr>
</thead>
<tbody id="tasks"></tbody>
</table>
</div>
</div>
</div>
<!-- syslog -->
<div class="tab-pane fade " id="tab-credits">
<div class="card mb-3">
<div class="card-header">Credits</div>
<div class="card-body">
<p><strong><a
href="https://github.com/sle118/squeezelite-esp32">squeezelite-esp32</a><br></strong>&copy;
2020, philippe44, sle118, daduke<br /><a href="https://opensource.org/licenses/MIT">This
software is released under the MIT License.</a></p>
<p>
This app would not be possible without the following libraries:
</p>
<ul>
<li>squeezelite, &copy; 2012-2019, Adrian Smith and Ralph Irving. Licensed under the GPL
License.</li>
<li>esp32-wifi-manager, &copy; 2017-2019, Tony Pottier. Licensed under the MIT License.</li>
<li>SpinKit, &copy; 2015, Tobias Ahlin. Licensed under the MIT License.</li>
<li>jQuery, The jQuery Foundation. Licensed under the MIT License.</li>
<li>cJSON, &copy; 2009-2017, Dave Gamble and cJSON contributors. Licensed under the MIT
License.
</li>
<li>esp32-rotary-encoder, &copy; 2011-2019, David Antliff and Ben Buxton. Licensed under the
GPL
License.</li>
<li>tarablessd1306, &copy; 2017-2018, Tara Keeling. Licensed under the MIT license.</li>
<li>CSpot, &copy; 2020 feelfreelinux & alufers. Licensed under the GPL License</li>
</ul>
</div>
</div>
<div class="card mb-3">
<div class="card-header">Extras/Overrides</div>
<div class="card-body">
<fieldset>
<div class="form-check">
<label class="form-check-label"><input type="checkbox" id="show-nvs"
class="form-check-input " value="">Show NVS Editor</label>
</div>
</fieldset>
<fieldset>
<div class="form-check">
<label class="form-check-label"><input type="checkbox" id="show-commands"
class="form-check-input " value="">Show Advanced Commands</label>
</div>
</fieldset>
</div>
</div>
</div>
<!-- credits -->
</div>
</div>
</main>
<footer>
<div class="fixed-bottom d-flex justify-content-between border-top border-dark p-3 bg-primary">
<span class="text-center" id="foot-fw"></span><button class="btn-warning ota_element " id="reboot_nav"
type="submit" style="display: none;">Reboot</button>
<button class="btn-warning recovery_element" id="reboot_ota_nav" type="submit" style="display: none;">Exit
Recovery</button><span class="text-center" id="foot-if"></span>
</div>
</footer>
</body>
</html>
+6
View File
@@ -0,0 +1,6 @@
import 'bootstrap';
import './sass/main.scss';
import './assets/images/favicon-32x32.png';
import './js/custom.js';
File diff suppressed because it is too large Load Diff
+135
View File
@@ -0,0 +1,135 @@
let sd = {};
let rf=false;
function getStatus() {
const config = {};
$(`#valuesTable input:text, #valuesTable input:checked`).each(function(_index, entry) {
switch (entry.attributes.dtype.value) {
case 'string':
config[entry.name] = entry.value;
break;
case 'number':
config[entry.name] = Number(entry.value);
break;
case 'boolean':
config[entry.name] = entry.value=='true';
break;
default:
break;
}
});
return config;
}
// function getOptions(entry) {
// let output='';
// for (const property in entry) {
// output+=`<option value="${entry[property]}">${property}</option>`;
// }
// return output;
// }
function getRadioButton(entry){
let output='';
for (const property in sd[entry]) {
output+=`
<div class="custom-control custom-radio">
<input type="radio" class="custom-control-input" id="${entry}_${sd[entry][property]}" name="${entry}" value="${sd[entry][property]}" dtype='${typeof(sd[entry][property])}'>
<label class="custom-control-label" for="${entry}_${sd[entry][property]}">${property}</label>
</div>
`;
}
return output;
}
var refreshStatus = function() {
if(Object.keys(sd).length>0){
if(rf) return;
rf=true;
$.getJSON('/status.json', function(data) {
for (const property in data) {
const val = data[property];
let input = $(`#val_${property}, #valuesTable input[name="${property}"]`) ;
if(input.length>0){
if(input.is(':radio') ){
$(`#${property}_${val ?? 0}`).prop('checked',true);
}
else {
if(input.val() !==val && !input.is(":focus")){
input.val(val);
}
}
}
else {
if(sd[property]){
$('#valuesTable').append(
`<tr><td>${property}</td>
<td >
${getRadioButton(property)}
</td></tr>`);
$(`#${property}_${val ?? 0}`).prop('checked',true);
}
else {
$('#valuesTable').append(`<tr><td>${property}</td><td><input type='text' class='value form-control nvs' id="val_${property}" name='${property}' dtype='${typeof(val)}' ></input></td></tr>`);
$(`#val_${property}`).val(val);
}
}
}
})
.fail(function() {
})
.done(function(){
rf=false;
});
}
else {
$.getJSON('/statusdefinition.json', function(data) {
sd=data;
})
.fail(function() {
})
.done(function(){
});
}
}
function pushStatus(){
const data = {
timestamp: Date.now(),
status: getStatus()
};
$.ajax({
url: '/status.json',
dataType: 'text',
method: 'POST',
cache: false,
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(data),
});
console.log('sent config JSON with data:', JSON.stringify(data));
}
$(document).ready(function() {
$('#save_status').on('click', function() {
pushStatus();
});
$( "#valuesTable" ).change(function() {
pushStatus();
});
setInterval(refreshStatus, 1000);
$('svg >> symbol').each(function() {
$('#allIcons').append( `<svg style="fill:white; width:1.5rem; height: 1.5rem;">
<use xlink:href="#${this.id}"></use>
</svg>`);
});
}) ;
@@ -0,0 +1,42 @@
// @import "~bootswatch/dist/darkly/variables"; -- remove darkly until bootswatch color is resolved
@import "utils/variables";
@import "~bootstrap/scss/bootstrap";
// @import "~bootstrap/scss/functions";
// @import "~bootstrap/scss/variables";
// @import "~bootstrap/scss/mixins";
// @import "~bootstrap/scss/utilities";
// // Layout & components
// @import "~bootstrap/scss/root";
// @import "~bootstrap/scss/reboot";
// @import "~bootstrap/scss/type";
// @import "~bootstrap/scss/images";
// @import "~bootstrap/scss/containers";
// @import "~bootstrap/scss/grid";
// @import "~bootstrap/scss/tables";
// @import "~bootstrap/scss/forms";
// @import "~bootstrap/scss/buttons";
// @import "~bootstrap/scss/transitions";
// @import "~bootstrap/scss/dropdown";
// @import "~bootstrap/scss/button-group";
// @import "~bootstrap/scss/nav";
// @import "~bootstrap/scss/navbar";
// @import "~bootstrap/scss/card";
// @import "~bootstrap/scss/badge";
// @import "~bootstrap/scss/alert";
// @import "~bootstrap/scss/progress";
// //@import "~bootstrap/scss/list-group";
// @import "~bootstrap/scss/close";
// @import "~bootstrap/scss/toasts";
// @import "~bootstrap/scss/modal";
// @import "~bootstrap/scss/tooltip";
// @import "~bootstrap/scss/placeholders";
// // Helpers
// @import "~bootstrap/scss/helpers";
// // Utilities
// @import "~bootstrap/scss/utilities/api";
// @import "~bootswatch/dist/darkly/bootswatch"; -- remove darkly until bootswatch color is resolved
@import "utils/style";
@@ -0,0 +1,24 @@
body {
min-height: 100vh;
}
.border-bottom {
border-width:3px !important;
}
.xl { font-size: 1.5em; line-height: 1em; vertical-align: -.075em; }
.border-top {
border-width:3px !important;
}
tr.hide {
display: none;
}
.rebooting {
display: none;
}
td.value {
width: 80%;
}
#boot-div {
float: right;
}
@@ -0,0 +1,3 @@
$enable-gradients: false;
// This is needed below, otherwise colors look washed out
$table-bg-level: 0;
+134
View File
@@ -0,0 +1,134 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>esp32-wifi-manager testing</title>
<link rel="icon" type="image/png" sizes="32x32" href="assets/images/favicon-32x32.png">
</head>
<body>
<div style="display:none">
<% if (htmlWebpackPlugin.files.sprites) { %>
<% for (var spriteFileName in htmlWebpackPlugin.files.sprites) { %>
<%= htmlWebpackPlugin.files.sprites[spriteFileName] %>
<% } %>
<% } %>
</div>
<div id="allIcons"><i class="recovery_element ri-device-recover-fill ri-xl" style="color:orange; " ></i>
<i class="ri-battery-fill ri-xl" style="fill:white; " ></i>
<i class= "ri-headphone-fill ri-xl" style="fill:white; "></i>
<i class= "ri-bluetooth-fill ri-xl" style="fill:white; " ></i>
<i class= "ri-speaker-fill ri-xl" style="fill:white; " ></i>
<i class= "ri-voiceprint ri-xl" style="fill:white; " ></i>
<i class= "ri-signal-wifi-fill ri-xl" style="fill:white; " ></i>
<i class= "ri-signal-wifi-3-fill ri-xl" style="fill:white; " ></i>
<i class= "ri-signal-wifi-2-fill ri-xl" style="fill:white; " ></i>
<i class= "ri-signal-wifi-1-fill ri-xl" style="fill:white; " ></i>
<i class= "ri-signal-wifi-line ri-xl" style="fill:white; " ></i>
</div>
<div class="card border-primary mb-3">
<div class="card-header">Status Variables</div>
<div class="card-body">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Variable</th>
<th scope="col">Value</th>
</tr>
</thead>
<tbody id="valuesTable">
</tbody>
</table>
<input id="save_status" type="button" class="btn btn-success" value="Commit">
</div>
</div>
<div>
<table class="table table-hover">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">BT State</th>
<th scope="col">Sub state #</th>
<th scope="col">Sub state</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>Idle</td>
<td>0</td>
<td>bt_neutral</td>
</tr>
<tr>
<td>1</td>
<td>Discovering</td>
<td>0</td>
<td>bt_searching</td>
</tr>
<tr>
<td>2</td>
<td>Discovered</td>
<td>0</td>
<td>bt_searching</td>
</tr>
<tr>
<td>3</td>
<td>Unconnected</td>
<td>0</td>
<td>bt_disabled</td>
</tr>
<tr>
<td>4</td>
<td>Connecting</td>
<td>0</td>
<td>bt_disabled</td>
</tr>
<tr>
<td>5</td>
<td>Connected</td>
<td>0</td>
<td>bt_connected</td>
</tr>
<tr>
<td></td>
<td></td>
<td>1</td>
<td>play_circle_outline</td>
</tr>
<tr>
<td></td>
<td></td>
<td>2</td>
<td>bt_playing</td>
</tr>
<tr>
<td></td>
<td></td>
<td>3</td>
<td>pause</td>
</tr>
<tr>
<td></td>
<td></td>
<td>4</td>
<td>stop</td>
</tr>
<tr>
<td>6</td>
<td>Disconnecting</td>
<td>0</td>
<td>bt_neutral</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
+5
View File
@@ -0,0 +1,5 @@
import 'bootstrap';
import './sass/main.scss';
import './js/test.js';
+55
View File
@@ -0,0 +1,55 @@
const stats='';
// Merges webpack.common config with this production config
const fs = require('fs');
const glob = require('glob');
var getDirectories = function (src, callback) {
glob(src + '/**/*.gz', callback);
};
getDirectories('./webpack/', function (err, list) {
if (err) {
console.log('Error', err);
} else {
const regex = /^(.*\/)([^\/]*)$/
const relativeRegex = /(\w+\/[^\/]*)$/
const makePathRegex = /([^\.].*)$/
let exportDefHead=
'/***********************************\n'+
'webpack_headers\n'+
stats+'\n'+
'***********************************/\n'+
'#pragma once\n'+
'#include <inttypes.h>\n'+
'extern const char * resource_lookups[];\n'+
'extern const uint8_t * resource_map_start[];\n'+
'extern const uint8_t * resource_map_end[];\n';
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(fileName=>{
console.log(fileName);
let exportName=fileName.match(regex)[2].replace(/[\. \-]/gm,'_');
let relativeName=fileName.match(relativeRegex)[1];
exportDef+= 'extern const uint8_t '+exportName+'_start[] asm("_binary_'+exportName+'_start");\n'+
'extern const uint8_t '+exportName+'_end[] asm("_binary_'+exportName+'_end");\n';
lookupDef+='\t"/'+relativeName+'",\n';
lookupMapStart+='\t'+ exportName+'_start,\n';
lookupMapEnd+= '\t'+ exportName+'_end,\n';
cMake+='target_add_binary_data( __idf_wifi-manager ./webapp'+fileName.match(makePathRegex)[1]+' BINARY)\n';
});
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 (err) {
console.error(err);
}
}
});
+1
View File
@@ -0,0 +1 @@
Some content!
+8
View File
@@ -0,0 +1,8 @@
var assert = require('assert');
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -1 when the value is not present', function() {
assert.equal([1, 2, 3].indexOf(4), -1);
});
});
});
+21
View File
@@ -0,0 +1,21 @@
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": [ "src/*"],
"@node_modules/*" : ["./node_modules/*"]},
"outDir": "./dist/",
"noImplicitAny": true,
"target": "es6",
"module": "CommonJS",
"composite": true,
// "jsx": "react",
"allowJs": true,
"allowSyntheticDefaultImports" : true,
"esModuleInterop" : true
},
"exclude": [
"./node_modules"
]
}
+22
View File
@@ -0,0 +1,22 @@
{
"defaultSeverity": "error",
"extends": [
"tslint:recommended"
],
"jsRules": {},
"rules": {
"eofline": false,
"no-trailing-whitespace": false,
"comment-format": false,
"quotemark": false,
"no-console": false,
"one-line": false,
"no-consecutive-blank-lines": false,
"curly": false,
"ordered-imports": [false],
"object-literal-sort-keys": [false],
"only-arrow-functions": false,
"indent": false
},
"rulesDirectory": []
}
+5
View File
@@ -0,0 +1,5 @@
target_add_binary_data( __idf_wifi-manager webapp/dist/css/index.3b0bbfde52d921a84f9b.css.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/favicon-32x32.png BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/index.html.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.d35fda.bundle.js.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.d35fda.bundle.js.gz BINARY)
@@ -0,0 +1,8 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}
+34
View File
@@ -0,0 +1,34 @@
// Automatically generated. Do not edit manually!.
#include <inttypes.h>
extern const uint8_t _index_3b0bbfde52d921a84f9b_css_gz_start[] asm("_binary_index_3b0bbfde52d921a84f9b_css_gz_start");
extern const uint8_t _index_3b0bbfde52d921a84f9b_css_gz_end[] asm("_binary_index_3b0bbfde52d921a84f9b_css_gz_end");
extern const uint8_t _favicon_32x32_png_start[] asm("_binary_favicon_32x32_png_start");
extern const uint8_t _favicon_32x32_png_end[] asm("_binary_favicon_32x32_png_end");
extern const uint8_t _index_html_gz_start[] asm("_binary_index_html_gz_start");
extern const uint8_t _index_html_gz_end[] asm("_binary_index_html_gz_end");
extern const uint8_t _index_d35fda_bundle_js_gz_start[] asm("_binary_index_d35fda_bundle_js_gz_start");
extern const uint8_t _index_d35fda_bundle_js_gz_end[] asm("_binary_index_d35fda_bundle_js_gz_end");
extern const uint8_t _node_vendors_d35fda_bundle_js_gz_start[] asm("_binary_node_vendors_d35fda_bundle_js_gz_start");
extern const uint8_t _node_vendors_d35fda_bundle_js_gz_end[] asm("_binary_node_vendors_d35fda_bundle_js_gz_end");
const char * resource_lookups[] = {
"/css/index.3b0bbfde52d921a84f9b.css.gz",
"/favicon-32x32.png",
"/index.html.gz",
"/js/index.d35fda.bundle.js.gz",
"/js/node_vendors.d35fda.bundle.js.gz",
""
};
const uint8_t * resource_map_start[] = {
_index_3b0bbfde52d921a84f9b_css_gz_start,
_favicon_32x32_png_start,
_index_html_gz_start,
_index_d35fda_bundle_js_gz_start,
_node_vendors_d35fda_bundle_js_gz_start
};
const uint8_t * resource_map_end[] = {
_index_3b0bbfde52d921a84f9b_css_gz_end,
_favicon_32x32_png_end,
_index_html_gz_end,
_index_d35fda_bundle_js_gz_end,
_node_vendors_d35fda_bundle_js_gz_end
};
+426
View File
@@ -0,0 +1,426 @@
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CopyPlugin = require("copy-webpack-plugin");
const HtmlMinimizerPlugin = require("html-minimizer-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CompressionPlugin = require("compression-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
const webpack = require("webpack");
const path = require("path");
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const globSync = require("glob").sync;
const glob = require('glob');
const { merge } = require('webpack-merge');
const devserver = require('./webpack/webpack.dev.js');
const fs = require('fs');
const zlib = require("zlib");
const PurgeCSSPlugin = require('purgecss-webpack-plugin')
const whitelister = require('purgecss-whitelister');
const PATHS = {
src: path.join(__dirname, 'src')
}
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);
}
}
module.exports = (env, options) => (
merge(
env.WEBPACK_SERVE ? devserver : {},
env.ANALYZE_SIZE?{ plugins: [ new BundleAnalyzerPlugin(
{
analyzerMode: 'static',
generateStatsFile: true,
statsFilename: 'stats.json',
}
) ]}:{},
{
entry:
{
index: './src/index.ts'
},
devtool:"source-map",
module: {
rules: [
{
test: /\.ejs$/,
loader: 'ejs-loader',
options: {
variable: 'data',
interpolate : '\\{\\{(.+?)\\}\\}',
evaluate : '\\[\\[(.+?)\\]\\]'
}
},
{
test: /\.(woff(2)?|ttf|eot)(\?v=\d+\.\d+\.\d+)?$/,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[ext]',
outputPath: 'fonts/'
}
}
]
},
// {
// test: /\.s[ac]ss$/i,
// use: [{
// loader: 'style-loader', // inject CSS to page
// },
// {
// loader: MiniCssExtractPlugin.loader,
// options: {
// publicPath: "../",
// },
// },
// "css-loader",
// {
// loader: "postcss-loader",
// options: {
// postcssOptions: {
// plugins: [["autoprefixer"]],
// },
// },
// },
// "sass-loader",
// ]
// },
{
test: /\.(scss)$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: "../",
},
},
// {
// // inject CSS to page
// loader: 'style-loader'
// },
{
// translates CSS into CommonJS modules
loader: 'css-loader'
},
{
// Run postcss actions
loader: 'postcss-loader',
options: {
// `postcssOptions` is needed for postcss 8.x;
// if you use postcss 7.x skip the key
postcssOptions: {
// postcss plugins, can be exported to postcss.config.js
plugins: function () {
return [
require('autoprefixer')
];
}
}
}
}, {
// compiles Sass to CSS
loader: 'sass-loader'
}]
},
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env"],
plugins: ['@babel/plugin-transform-runtime']
},
},
},
{
test: /\.(jpe?g|png|gif|svg)$/i,
type: "asset",
},
// {
// test: /\.html$/i,
// type: "asset/resource",
// },
{
test: /\.html$/i,
loader: "html-loader",
options: {
minimize: true,
}
},
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
],
},
plugins: [
new HtmlWebpackPlugin({
title: 'SqueezeESP32',
template: './src/index.ejs',
filename: 'index.html',
inject: 'body',
minify: {
html5 : true,
collapseWhitespace : true,
minifyCSS : true,
minifyJS : true,
minifyURLs : false,
removeAttributeQuotes : true,
removeComments : true, // false for Vue SSR to find app placeholder
removeEmptyAttributes : true,
removeOptionalTags : true,
removeRedundantAttributes : true,
removeScriptTypeAttributes : true,
removeStyleLinkTypeAttributese : true,
useShortDoctype : true
},
favicon: "./src/assets/images/favicon-32x32.png",
excludeChunks: ['test'],
}),
// new CompressionPlugin({
// test: /\.(js|css|html|svg)$/,
// //filename: '[path].br[query]',
// filename: "[path][base].br",
// algorithm: 'brotliCompress',
// compressionOptions: { level: 11 },
// threshold: 100,
// minRatio: 0.8,
// deleteOriginalAssets: false
// }),
new MiniCssExtractPlugin({
filename: "css/[name].[contenthash].css",
}),
new PurgeCSSPlugin({
keyframes: false,
paths: glob.sync(`${path.join(__dirname, 'src')}/**/*`, {
nodir: true
}),
whitelist: whitelister('bootstrap/dist/css/bootstrap.css')
}),
new webpack.ProvidePlugin({
$: "jquery",
// jQuery: "jquery",
// "window.jQuery": "jquery",
// Popper: ["popper.js", "default"],
// Util: "exports-loader?Util!bootstrap/js/dist/util",
// Dropdown: "exports-loader?Dropdown!bootstrap/js/dist/dropdown",
}),
new CompressionPlugin({
//filename: '[path].gz[query]',
test: /\.js$|\.css$|\.html$/,
filename: "[path][base].gz",
algorithm: 'gzip',
threshold: 100,
minRatio: 0.8,
}),
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
}));
var getDirectories = function (src, callback) {
var searchPath = path.posix.join(src, '/**/*(*.gz|favicon-32x32.png)');
console.log(`Post build: Getting file list from ${searchPath}`);
glob(searchPath, callback);
};
var 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.');
})
],
optimization: {
minimize: true,
providedExports: true,
usedExports: true,
minimizer: [
new TerserPlugin({
terserOptions: {
format: {
comments: false,
},
},
extractComments: false,
// enable parallel running
parallel: true,
}),
new HtmlMinimizerPlugin({
minimizerOptions: {
removeComments: true,
removeOptionalTags: true,
}
}
),
new CssMinimizerPlugin(),
new ImageMinimizerPlugin({
minimizer: {
implementation: ImageMinimizerPlugin.imageminMinify,
options: {
// Lossless optimization with custom option
// Feel free to experiment with options for better result for you
plugins: [
["gifsicle", { interlaced: true }],
["jpegtran", { progressive: true }],
["optipng", { optimizationLevel: 5 }],
// Svgo configuration here https://github.com/svg/svgo#configuration
[
"svgo",
{
plugins: [
{
name: 'preset-default',
params: {
overrides: {
// customize default plugin options
inlineStyles: {
onlyMatchedOnce: false,
},
// or disable plugins
removeDoctype: false,
},
},
}
],
},
],
],
},
},
}),
],
splitChunks: {
cacheGroups: {
vendor: {
name: "node_vendors",
test: /[\\/]node_modules[\\/]/,
chunks: "all",
}
}
}
},
// output: {
// filename: "[name].js",
// path: path.resolve(__dirname, "dist"),
// publicPath: "",
// },
resolve: {
extensions: ['.tsx', '.ts', '.js', '.ejs' ],
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: './js/[name].[fullhash:6].bundle.js',
clean: true
},
}
)
);
+9
View File
@@ -0,0 +1,9 @@
/***********************************
webpack_headers
dist/css/index.3b0bbfde52d921a84f9b.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.d35fda.bundle.js.gz,dist/js/node_vendors.d35fda.bundle.js.gz
***********************************/
#pragma once
#include <inttypes.h>
extern const char * resource_lookups[];
extern const uint8_t * resource_map_start[];
extern const uint8_t * resource_map_end[];
@@ -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
}
@@ -0,0 +1,9 @@
module.exports = {
parser: 'sugarss',
// syntax: 'postcss-scss',
plugins: {
'postcss-import': {},
'postcss-cssnext': {},
cssnano: {}
}
}
@@ -0,0 +1,464 @@
/* eslint-disable */
var path = require('path');
const bodyParser = require('body-parser')
const { config } = require('process');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const { Command } = require('commander');
let cmdLines= { };
var { parseArgsStringToArgv } = require('string-argv');
const PORT = 5000;
const data = {
messages: require("../mock/messages.json"),
messagequeue: require("../mock/messages.json"),
message_queue_sequence: [],
status_queue_sequence:[],
message_queue_sequence_post_empty: null,
status_queue_sequence_post_empty: null,
commands: require("../mock/commands.json"),
scan: require("../mock/scan.json"),
ap: require("../mock/ap.json"),
config: require("../mock/config.json"),
statusdefinition: require("../mock/statusdefinition.json"),
status: require("../mock/status.json"),
messages_ota_fail: require("../mock/messages_ota_fail.json"),
messages_ota_flash: require("../mock/messages_ota_flash.json"),
messages_ota: require("../mock/messages_ota.json"),
rebooting: false,
reboottime: Date.now(),
devServer:{}
};
const messagingTypes= {
MESSAGING_INFO : 'MESSAGING_INFO',
MESSAGING_WARNING : 'MESSAGING_WARNING',
MESSAGING_ERROR : 'MESSAGING_ERROR'
};
const messagingClass= {
MESSAGING_CLASS_OTA : 'MESSAGING_CLASS_OTA',
MESSAGING_CLASS_SYSTEM : 'MESSAGING_CLASS_SYSTEM',
MESSAGING_CLASS_STATS : 'MESSAGING_CLASS_STATS',
MESSAGING_CLASS_CFGCMD: 'MESSAGING_CLASS_CFGCMD',
MESSAGING_CLASS_BT: 'MESSAGING_CLASS_BT'
} ;
function rebooting(){
let duration=10000;
console.log(`Simulating a reboot of ${duration}ms`);
data.reboottime = Date.now() + duration;
data.rebooting=true;
setTimeout(() => {
data.rebooting=false;
console.log("Reboot completed!");
}, duration);
}
function sleep(milliseconds) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
function waitForReboot(){
while(Date.now() < data.reboottime){
sleep(500);
console.log(`Waiting for reboot to finish.`);
}
}
function requeueMessages(){
data.messagequeue = [];
data.messagequeue.push(...data.messages);
console.log(`Re-queued ${data.messages.length} messages. Total queue length is: ${data.messagequeue.length}`);
}
function sendMessaging(cmdname,msgtype,msgClass,msg){
let message_txt=`${cmdname}\n${msg}`;
var d = new Date();
var n = d.getMilliseconds();
data.messagequeue.push({
message: message_txt,
type: msgtype,
class: msgClass,
sent_time: n,
current_time: n});
console.log(`Queued message ~${data.messagequeue.length} type ${msgtype}, class ${msgClass}: ${message_txt}`);
}
Array.prototype.filter = function(fun /*, thisp*/) {
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = [];
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in this) {
var val = this[i];
if (fun.call(thisp, val, i, this))
res.push(val);
}
}
return res;
};
for(const cmdIdx in data.commands.commands){
const cmd = data.commands.commands[cmdIdx];
//console.log(`Creating command structure for ${cmd.name}`);
cmdLines[cmd.name] = {
cmd: new Command(),
};
cmdLines[cmd.name].cmd
.storeOptionsAsProperties(true)
.name(cmd.name)
.exitOverride();
for(const argIdx in cmd.argtable){
const arg=cmd.argtable[argIdx];
const optstr=((arg.shortopts?'-'+arg.shortopts:'')+
(arg.shortopts && arg.longopts?', ':'')+
(arg.longopts?'--'+arg.longopts:'') +
(arg.hasvalue?`${(arg.shortopts || arg.longopts?' ':'')}<${arg.datatype.replace(/[<>]/gm,'')}>`:''));
//console.log(` Option: ${optstr}, Glossary: ${arg.glossary}`);
if(arg.remark) continue;
if(arg.mincount>0){
cmdLines[cmd.name].cmd.requiredOption( optstr,arg.glossary);
}
else {
cmdLines[cmd.name].cmd.option( optstr,arg.glossary);
}
}
}
const connectReturnCode = {
UPDATE_CONNECTION_OK : 0,
UPDATE_FAILED_ATTEMPT : 1,
UPDATE_USER_DISCONNECT : 2,
UPDATE_LOST_CONNECTION : 3,
UPDATE_FAILED_ATTEMPT_AND_RESTORE : 4
}
module.exports ={
entry: {
test: './src/test.ts'
},
devServer: {
static: {
directory: path.resolve(__dirname, './dist'),
staticOptions: {},
// Don't be confused with `devMiddleware.publicPath`, it is `publicPath` for static directory
// Can be:
// publicPath: ['/static-public-path-one/', '/static-public-path-two/'],
publicPath: "/",
// Can be:
// serveIndex: {} (options for the `serveIndex` option you can find https://github.com/expressjs/serve-index)
serveIndex: true,
// Can be:
// watch: {} (options for the `watch` option you can find https://github.com/paulmillr/chokidar)
watch: true,
},
devMiddleware: {
publicPath: "/",
},
open: true,
compress: true,
port: PORT,
host: '0.0.0.0',
allowedHosts: "all",
headers: {'Access-Control-Allow-Origin': '*', 'Accept-Encoding': 'identity'},
client: {
logging: "verbose",
// Can be used only for `errors`/`warnings`
//
// overlay: {
// errors: true,
// warnings: true,
// }
overlay: true,
progress: true,
},
onListening: function (devServer) {
if (!devServer) {
throw new Error('webpack-dev-server is not defined');
}
const PORT = devServer.server.address().port;
// get the path to the test page
const compiler = devServer.compiler;
const entry = compiler.options.entry;
const testEntry = entry['test'].import[0];
const testPath = testEntry.replace('./src/', '').replace('.ts', '.html');
// open the test page
import('open').then((open) => open.default(`http://localhost:${PORT}/${testPath}`));
},
onBeforeSetupMiddleware: function (devServer) {
data.devServer=devServer;
devServer.app.use(bodyParser.json()) // for parsing application/json
devServer.app.use(bodyParser.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
devServer.app.get('/ap.json', function(req, res) { waitForReboot(); res.json( data.ap ); });
devServer.app.get('/scan.json', function(req, res) { waitForReboot(); res.json( data.scan ); });
devServer.app.get('/config.json', function(req, res) {
waitForReboot();
if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
res.json( data.config.config );
console.log('Mock old recovery - return config structure without gpio');
}
else {
res.json( data.config );
}
});
devServer.app.get('/status.json', function(req, res) {
waitForReboot();
if(data.status_queue_sequence.length>0){
const curstatus = JSON.parse(data.status_queue_sequence_queue_sequence.shift());
data.status.ota_pct=curstatus.ota_pct??0;
data.status.ota_dsc=curstatus.ota_dsc??'';
console.log(`Mock firmware update @${data.status.ota_pct}%, ${data.status.ota_dsc}`)
}
else if (data.status_queue_sequence_post_empty){
data.status_queue_sequence_post_emptyy();
console.log(`Mock old firmware update: simulating a restart`);
data.status_queue_sequence_post_empty = null;
}
else if(data.status.ota_pct!=undefined || data.status.ota_dsc!=undefined) {
if(data.status.ota_pct!=undefined) delete data.status.ota_pct;
if(data.status.ota_dsc!=undefined) delete data.status.ota_dsc;
}
if(data.status.message) delete data.status.message;
if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
if(data.message_queue_sequence.length>0){
const msgpayload = JSON.parse(data.message_queue_sequence.shift());
data.status.message = msgpayload.message??'';
console.log(`Mocking recovery, setting status message to ${data.status.message}`)
}
else if (data.message_queue_sequence_post_empty){
data.message_queue_sequence_post_empty();
data.message_queue_sequence_post_empty = null;
}
}
res.json( data.status );
});
devServer.app.get('/plugins/SqueezeESP32/firmware/-99', function(req, res) {
waitForReboot();
let has_proxy= data.status.mock_plugin_has_proxy ?? 'n';
const statusCode='xy'.includes((has_proxy).toLowerCase())?200:500;
console.log(`Checking if plugin has proxy enabled with option mock_plugin_has_proxy = ${data.status.mock_plugin_has_proxy}. Returning status ${statusCode} `);
res.status(statusCode ).json();
});
devServer.app.get('/messages.json', function(req, res) {
waitForReboot();
if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
console.log('Mocking old recovery, with no commands backend' );
res.status(404).end();
return;
}
if(data.message_queue_sequence.length>0){
data.messagequeue.push(data.message_queue_sequence.shift());
}
else if (data.message_queue_sequence_post_empty){
data.message_queue_sequence_post_empty();
data.message_queue_sequence_post_empty = null;
}
res.json( data.messagequeue ) ;
data.messagequeue=[];
});
devServer.app.get('/statusdefinition.json', function(req, res) {
waitForReboot();
res.json( data.statusdefinition );
});
devServer.app.get('/commands.json', function(req, res) {
waitForReboot();
if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
console.log('Mocking old recovery, with no commands backend' );
res.status(404).end();
}
else {
res.json( data.commands );
}
});
devServer.app.post('/commands.json', function(req, res) {
waitForReboot();
if(data.status.recovery==1 && (data.status.mock_old_recovery??'')!==''){
console.log('Mocking old recovery, with no commands backend' );
res.status(404).end();
return;
}
console.log(req.body.command);
try {
const cmdName=req.body.command.split(" ")[0];
const args=parseArgsStringToArgv(req.body.command,'node ');
let cmd=cmdLines[cmdName].cmd;
if(cmd){
for (const property in cmd.opts()) {
delete cmd[property];
}
cmd.parse(args);
const msg=`Received Options: ${JSON.stringify(cmd.opts())}\n`;
console.log('Options: ', cmd.opts());
console.log('Remaining arguments: ', cmd.args);
sendMessaging(cmdName,messagingTypes.MESSAGING_INFO,messagingClass.MESSAGING_CLASS_CFGCMD,msg);
}
} catch (error) {
console.error(error);
}
res.json( { 'Result' : 'Success' } );
});
devServer.app.post('/config.json', function(req, res) {
waitForReboot();
var fwurl='';
console.log(`Processing config.json with request body: ${req.body}`);
console.log(data.config.config);
for (const property in req.body.config) {
console.log(`${property}: ${req.body.config[property].value}`);
if(property=='fwurl'){
fwurl=req.body.config[property].value;
}
else {
if(data.config.config[property]=== undefined){
console.log(`Added config value ${property} [${req.body.config[property].value}]`);
data.config.config[property] = {value: req.body.config[property].value};
}
else if (data.config.config[property].value!=req.body.config[property].value){
console.log(`Updated config value ${property}\n From: ${data.config.config[property].value}\n To: ${req.body.config[property].value}]`);
data.config.config[property].value=req.body.config[property].value;
}
}
}
res.json( {"result" : "OK" });
if(fwurl!=='' ){
const ota_msg_list= ((data.status.mock_fail_fw_update ?? '')!=='')?data.messages_ota_fail:data.messages_ota;
if(data.status.recovery!=1) {
// we're not yet in recovery. Simulate reboot to recovery
data.status.recovery=1;
if((data.status.mock_old_recovery??'')===''){
// older recovery partitions possibly aren't
// sending messages
requeueMessages();
}
}
var targetQueue='message_queue_sequence';
var targetPostEmpty='message_queue_sequence_post_empty';
if((data.status.mock_old_recovery??'')!==''){
console.log('Mocking old firmware flashing mechanism. Starting!');
targetQueue='status_queue_sequence';
targetPostEmpty='status_queue_sequence_post_empty';
}
console.log(`queuing ${ota_msg_list.length} ota messages `);
data[targetQueue].push(...ota_msg_list);
data[targetPostEmpty] = function(){
data.status.recovery=0;
requeueMessages();
}
}
});
devServer.app.post('/status.json', function(req, res) {
waitForReboot();
for (const property in req.body.status) {
if(data.status[property]=== undefined){
console.log(`Added status value ${property} [${req.body.status[property]}]`);
data.status[property] = {value: req.body.status[property]};
}
else if (data.status[property]!==req.body.status[property]){
console.log(`Updated status value ${property}\nFrom: ${data.status[property]}\nTo: ${req.body.status[property]}`);
data.status[property]=req.body.status[property];
}
}
res.json( {"result" : "OK" } );
});
devServer.app.post('/connect.json', function(req, res) {
waitForReboot();
setTimeout(function(r){
if(r.body.ssid.search('fail')>=0){
if(data.status.ssid){
// in this case, the same ssid will be reused - the ESP32 would restore its previous state on failure
data.status.urc=connectReturnCode.UPDATE_FAILED_ATTEMPT_AND_RESTORE;
}
else {
data.status.urc=connectReturnCode.UPDATE_FAILED_ATTEMPT;
}
}
else {
data.status.ssid=r.body.ssid;
data.status.urc=connectReturnCode.UPDATE_CONNECTION_OK;
}
}, 1000, req);
res.json( {"result" : "OK" } );
});
devServer.app.post('/reboot_ota.json', function(req, res) {
waitForReboot();
data.status.recovery=0;
requeueMessages();
rebooting();
res.json( {"result" : "OK" } );
});
devServer.app.post('/reboot.json', function(req, res) {
waitForReboot();
res.json( {"result" : "OK" } );
rebooting();
requeueMessages();
});
devServer.app.post('/recovery.json', function(req, res) {
waitForReboot();
if((data.status.mock_fail_recovery ?? '')!==''){
res.status(404).end();
}
else {
data.status.recovery=1;
requeueMessages();
rebooting();
res.json( {"result" : "OK" } );
}
});
devServer.app.post('/flash.json', function(req, res) {
waitForReboot();
if(data.status.recovery>0){
if((data.status.mock_fail_fw_update ?? '')!=='' || (data.status.mock_old_recovery??'')!==''){
console.log('Old recovery mock, or fw fail requested' );
res.status(404).end();
}
else {
console.log(`queuing ${data.messages_ota_flash.length} flash ota messages `);
data.message_queue_sequence.push(...data.messages_ota_flash);
data.message_queue_sequence_post_empty = function(){
data.status.recovery=0;
rebooting();
requeueMessages();
}
res.json({"result" : "OK" });
}
}
else {
res.status(404).end();
}
});
devServer.app.delete('/connect.json', function(req, res) {
waitForReboot();
data.status.ssid='';
res.json({"result" : "OK" }); });
devServer.app.get('/reboot', function(req, res) {
waitForReboot();
res.json({"result" : "OK" }); });
},
},
plugins: [
new HtmlWebPackPlugin({
title: 'SqueezeESP32-test',
template: './src/test.ejs',
filename: 'test.html',
minify: false,
inject: 'body',
excludeChunks: ['index','main'],
})
],
}