Skip to content

Commit 1907cf0

Browse files
committed
upd
1 parent f82ed61 commit 1907cf0

File tree

7 files changed

+387
-357
lines changed

7 files changed

+387
-357
lines changed

README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
ESP8266, ESP32
2525

2626
### Зависимости
27-
- GTL v1.0.11+
28-
- GyverDB v1.0.6+
29-
- StringUtils v1.4.23+
30-
- GyverHTTP v1.0.11+
31-
- GSON v1.5.6+
27+
- GTL v1.1.1+
28+
- GyverDB v1.1.2+
29+
- StringUtils v1.4.24+
30+
- GyverHTTP v1.0.17+
31+
- GSON v1.5.9+
3232

3333
<details>
3434
<summary>platformio.ini</summary>
@@ -145,7 +145,9 @@ void loop() {
145145
```
146146
147147
### Билдер
148-
Пакет собирается устройством в билдере - функция в программе, которая вызывается когда приходит запрос от вебморды. Внутри билдера нужно вызвать методы компонентов в том порядке, в котором они должны находиться в вебморде. Вызов компонента добавляет информацию о нём в пакет. На этом этапе также происходит чтение значения для виджета по его id из базы данных, если она подключена и значение не указано явно.
148+
Пакет собирается устройством в билдере - функция в программе, которая вызывается когда приходит запрос от вебморды. Внутри билдера нужно вызвать методы компонентов в том порядке, в котором они должны находиться в вебморде. Вызов компонента добавляет информацию о нём в пакет. На этом этапе также происходит чтение значения для виджета по его id из базы данных, если она подключена и *значение не указано явно*.
149+
150+
> Если нужно, чтобы параметр читался из БД, но нужно указать аргумент после него - значением нужно указать `Text()` как и сделано в функции по умолчанию. Например цвет для Label `b.Label(key, "Label!", Text(), sets::Colors::Mint);`. Если указать пустую строку (`b.Label(key, "Label!", "", sets::Colors::Mint);`) - в качестве значения и отправится пустая строка, т.е. значение не из БД.
149151
150152
```cpp
151153
GyverDB db;

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Settings
2-
version=1.0.7
2+
version=1.0.8
33
author=AlexGyver <[email protected]>
44
maintainer=AlexGyver <[email protected]>
55
sentence=Simple UI webface builder for esp8266/esp32

src/web/settings.h

Lines changed: 295 additions & 290 deletions
Large diffs are not rendered by default.

web/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "settings",
3-
"version": "1.0.7",
3+
"version": "1.0.8",
44
"main": "index.js",
55
"scripts": {
66
"build": "webpack --config ./webpack.single.js & webpack --config ./webpack.index.js",

web/src/script/bson.js

Lines changed: 37 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,20 @@
1-
const codes = [
2-
'id',
3-
'type',
4-
'content',
5-
'group',
6-
'menu',
7-
'buttons',
8-
9-
'build',
10-
'reload',
11-
'update',
12-
'ping',
13-
'granted',
14-
'fs',
15-
'error',
16-
'gzip',
17-
'used',
18-
'total',
19-
20-
'label',
21-
'title',
22-
'text',
23-
'value',
24-
'color',
25-
'min',
26-
'max',
27-
'step',
28-
'unit',
29-
30-
'input',
31-
'pass',
32-
'select',
33-
'slider',
34-
'toggle',
35-
'time',
36-
'date',
37-
'datetime',
38-
'button',
39-
'paragraph',
40-
'confirm',
41-
'led',
42-
];
43-
44-
export default function decodeBson(b) {
1+
export default function decodeBson(b, codes = []) {
452
if (!b || !(b instanceof Uint8Array)) return null;
463
if (!b.length) return {};
4+
let bins = [];
475

486
const BS_KEY_CODE = (0 << 5);
497
const BS_KEY_STR = (1 << 5);
508
const BS_VAL_CODE = (2 << 5);
519
const BS_VAL_STR = (3 << 5);
5210
const BS_VAL_INT = (4 << 5);
5311
const BS_VAL_FLOAT = (5 << 5);
54-
const BS_CONT_OPEN = (6 << 5);
55-
const BS_CONT_CLOSE = (7 << 5);
56-
const BS_CONT_OBJ = (1);
57-
const BS_CONT_ARR = (0);
12+
const BS_CONTAINER = (6 << 5);
13+
const BS_BINARY = (7 << 5);
14+
const BS_BIN_PREFIX = "__BSON_BINARY";
15+
16+
const BS_CONT_OBJ = (1 << 4);
17+
const BS_CONT_OPEN = (1 << 3);
5818

5919
function ieee32ToFloat(intval) {
6020
var fval = 0.0;
@@ -83,21 +43,31 @@ export default function decodeBson(b) {
8343
function unpack5(msb5, lsb) {
8444
return ((msb5 << 8) | lsb) >>> 0;
8545
}
46+
function makeBins(obj) {
47+
if (typeof obj !== 'object') return;
48+
for (let k in obj) {
49+
if (typeof obj[k] === "object" && obj[k] !== null) {
50+
makeBins(obj[k]);
51+
} else if (typeof obj[k] === "string" && obj[k].startsWith(BS_BIN_PREFIX)) {
52+
obj[k] = bins[obj[k].split('#')[1]];
53+
}
54+
}
55+
}
8656

8757
let s = '';
8858
for (let i = 0; i < b.length; i++) {
8959
const type = b[i] & 0b11100000;
9060
const data = b[i] & 0b00011111;
9161

9262
switch (type) {
93-
case BS_CONT_CLOSE:
94-
if (s[s.length - 1] == ',') s = s.slice(0, -1);
95-
s += (data == BS_CONT_OBJ) ? '}' : ']';
96-
s += ',';
97-
break;
98-
99-
case BS_CONT_OPEN:
100-
s += (data == BS_CONT_OBJ) ? '{' : '[';
63+
case BS_CONTAINER:
64+
if (data & BS_CONT_OPEN) {
65+
s += (data & BS_CONT_OBJ) ? '{' : '[';
66+
} else {
67+
if (s[s.length - 1] == ',') s = s.slice(0, -1);
68+
s += (data & BS_CONT_OBJ) ? '}' : ']';
69+
s += ',';
70+
}
10171
break;
10272

10373
case BS_KEY_CODE:
@@ -140,12 +110,22 @@ export default function decodeBson(b) {
140110
s += ieee32ToFloat(v).toFixed(data);
141111
s += ',';
142112
} break;
113+
114+
case BS_BINARY: {
115+
let len = unpack5(data, b[++i]);
116+
i++;
117+
s += '"' + BS_BIN_PREFIX + '#' + bins.length + '",';
118+
bins.push(b.slice(i, i + len));
119+
i += len - 1;
120+
} break;
143121
}
144122
}
145123
if (s[s.length - 1] == ',') s = s.slice(0, -1);
146124

147125
try {
148-
return JSON.parse(s);
126+
let obj = JSON.parse(s);
127+
makeBins(obj);
128+
return obj;
149129
} catch (e) {
150130
throw new Error("JSON error")
151131
}

web/src/script/codes.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
export const codes = [
2+
'id',
3+
'type',
4+
'content',
5+
'group',
6+
'menu',
7+
'buttons',
8+
9+
'build',
10+
'reload',
11+
'update',
12+
'ping',
13+
'granted',
14+
'fs',
15+
'error',
16+
'gzip',
17+
'used',
18+
'total',
19+
20+
'label',
21+
'title',
22+
'text',
23+
'value',
24+
'color',
25+
'min',
26+
'max',
27+
'step',
28+
'unit',
29+
30+
'input',
31+
'pass',
32+
'select',
33+
'slider',
34+
'toggle',
35+
'time',
36+
'date',
37+
'datetime',
38+
'button',
39+
'paragraph',
40+
'confirm',
41+
'led',
42+
];

web/src/script/settings.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import Page from './page';
33
import { Arrow, hash, http_post } from './utils';
44
import popup from './ui/popup';
55
import decodeBson from './bson';
6+
import { codes } from './codes';
67
import unMap from './unmap';
78
import { AsyncConfirm, AsyncPrompt } from './ui/dialog';
89

@@ -107,7 +108,7 @@ export default class Settings {
107108
events: {
108109
click: () => {
109110
document.body.classList.toggle('theme_dark');
110-
localStorage.setItem('dark', document.body.classList.contains('theme_dark') | 0);
111+
localStorage.setItem('dark', Number(document.body.classList.contains('theme_dark')));
111112
},
112113
}
113114
}
@@ -289,7 +290,7 @@ export default class Settings {
289290
if (!res || !res.ok) return null;
290291

291292
try {
292-
return decodeBson(new Uint8Array(await res.arrayBuffer()));
293+
return decodeBson(new Uint8Array(await res.arrayBuffer()), codes);
293294
} catch (e) {
294295
popup(e);
295296
}

0 commit comments

Comments
 (0)