Berry async_webserver improvement (#22766)

This commit is contained in:
s-hadinger 2025-01-04 19:17:13 +01:00 committed by GitHub
parent bd7e47139c
commit a5610eea09
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 114 additions and 106 deletions

View File

@ -597,30 +597,38 @@ class webserver_async
############################################################# #############################################################
# Helper function to encode integer as int # Helper function to encode integer as int
static def bytes_format_int(b, i, default) static def bytes_append_int(b, i, default)
b.clear() var sz = size(b)
if (i == nil) b .. default return end if (i == 0) # just append '0'
var negative = false b.resize(sz + 1)
# sanity check b[sz] = 0x30
if (i < 0) i = -i negative = true end elif (i != nil) # we have a non-zero value
if (i < 0) return end # special case for MININT var negative = false
if (i == 0) b.resize(1) b[0] = 0x30 return end # return bytes("30") # sanity check
if (i < 0) i = -i negative = true end
if (i < 0) return b end # special case for MININT
if negative
b.resize(sz + 1)
b[sz] = 0x2D
sz += 1
end
var start = sz
while i > 0
var digit = i % 10
b.resize(sz + 1)
b[sz] = 0x30 + digit
sz += 1
i = (i / 10)
end
# reverse order starting where the integer is
b.reverse(start)
b.resize(11) # max size for 32 bits ints '-2147483647' else # i is `nil`, append default
var len = 0 b.append(default)
while i > 0
var digit = i % 10
b[len] = 0x30 + digit
len += 1
i = (i / 10)
end end
if negative return b
b[len] = 0x2D
len += 1
end
# reverse order
b.resize(len)
b.reverse()
end end
############################################################# #############################################################

View File

@ -1118,8 +1118,8 @@ be_local_class(webserver_async_dispatcher,
be_str_weak(webserver_async_dispatcher) be_str_weak(webserver_async_dispatcher)
); );
extern const bclass be_class_webserver_async; extern const bclass be_class_webserver_async;
// compact class 'webserver_async' ktab size: 47, total: 71 (saved 192 bytes) // compact class 'webserver_async' ktab size: 48, total: 71 (saved 184 bytes)
static const bvalue be_ktab_class_webserver_async[47] = { static const bvalue be_ktab_class_webserver_async[48] = {
/* K0 */ be_nested_str_weak(chunked), /* K0 */ be_nested_str_weak(chunked),
/* K1 */ be_nested_str_weak(re), /* K1 */ be_nested_str_weak(re),
/* K2 */ be_nested_str_weak(global), /* K2 */ be_nested_str_weak(global),
@ -1160,13 +1160,14 @@ static const bvalue be_ktab_class_webserver_async[47] = {
/* K37 */ be_nested_str_weak(add_fast_loop), /* K37 */ be_nested_str_weak(add_fast_loop),
/* K38 */ be_nested_str_weak(connected), /* K38 */ be_nested_str_weak(connected),
/* K39 */ be_nested_str_weak(remove), /* K39 */ be_nested_str_weak(remove),
/* K40 */ be_nested_str_weak(webserver_async_dispatcher), /* K40 */ be_nested_str_weak(append),
/* K41 */ be_nested_str_weak(dispatch), /* K41 */ be_nested_str_weak(webserver_async_dispatcher),
/* K42 */ be_nested_str_weak(send), /* K42 */ be_nested_str_weak(dispatch),
/* K43 */ be_nested_str_weak(text_X2Fplain), /* K43 */ be_nested_str_weak(send),
/* K44 */ be_nested_str_weak(write), /* K44 */ be_nested_str_weak(text_X2Fplain),
/* K45 */ be_nested_str_weak(Unsupported), /* K45 */ be_nested_str_weak(write),
/* K46 */ be_nested_str_weak(content_stop), /* K46 */ be_nested_str_weak(Unsupported),
/* K47 */ be_nested_str_weak(content_stop),
}; };
@ -1565,11 +1566,11 @@ be_local_closure(class_webserver_async_clean_connections, /* name */
/******************************************************************** /********************************************************************
** Solidified function: bytes_format_int ** Solidified function: bytes_append_int
********************************************************************/ ********************************************************************/
be_local_closure(class_webserver_async_bytes_format_int, /* name */ be_local_closure(class_webserver_async_bytes_append_int, /* name */
be_nested_proto( be_nested_proto(
9, /* nstack */ 11, /* nstack */
3, /* argc */ 3, /* argc */
12, /* varg */ 12, /* varg */
0, /* has upvals */ 0, /* has upvals */
@ -1578,58 +1579,62 @@ be_local_closure(class_webserver_async_bytes_format_int, /* name */
NULL, /* no sub protos */ NULL, /* no sub protos */
1, /* has constants */ 1, /* has constants */
&be_ktab_class_webserver_async, /* shared constants */ &be_ktab_class_webserver_async, /* shared constants */
be_str_weak(bytes_format_int), be_str_weak(bytes_append_int),
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[49]) { /* code */ ( &(const binstruction[53]) { /* code */
0x580C001A, // 0000 LDCONST R3 K26 0x580C001A, // 0000 LDCONST R3 K26
0x8C10011B, // 0001 GETMET R4 R0 K27 0x6010000C, // 0001 GETGBL R4 G12
0x7C100200, // 0002 CALL R4 1 0x5C140000, // 0002 MOVE R5 R0
0x4C100000, // 0003 LDNIL R4 0x7C100200, // 0003 CALL R4 1
0x1C100204, // 0004 EQ R4 R1 R4 0x1C14031C, // 0004 EQ R5 R1 K28
0x78120001, // 0005 JMPF R4 #0008 0x78160005, // 0005 JMPF R5 #000C
0x40100002, // 0006 CONNECT R4 R0 R2 0x8C14011D, // 0006 GETMET R5 R0 K29
0x80000800, // 0007 RET 0 0x001C091E, // 0007 ADD R7 R4 K30
0x50100000, // 0008 LDBOOL R4 0 0 0x7C140400, // 0008 CALL R5 2
0x1414031C, // 0009 LT R5 R1 K28 0x5416002F, // 0009 LDINT R5 48
0x78160001, // 000A JMPF R5 #000D 0x98000805, // 000A SETIDX R0 R4 R5
0x44040200, // 000B NEG R1 R1 0x70020027, // 000B JMP #0034
0x50100200, // 000C LDBOOL R4 1 0 0x4C140000, // 000C LDNIL R5
0x1414031C, // 000D LT R5 R1 K28 0x20140205, // 000D NE R5 R1 R5
0x78160000, // 000E JMPF R5 #0010 0x78160021, // 000E JMPF R5 #0031
0x80000A00, // 000F RET 0 0x50140000, // 000F LDBOOL R5 0 0
0x1C14031C, // 0010 EQ R5 R1 K28 0x1418031C, // 0010 LT R6 R1 K28
0x78160005, // 0011 JMPF R5 #0018 0x781A0001, // 0011 JMPF R6 #0014
0x8C14011D, // 0012 GETMET R5 R0 K29 0x44040200, // 0012 NEG R1 R1
0x581C001E, // 0013 LDCONST R7 K30 0x50140200, // 0013 LDBOOL R5 1 0
0x7C140400, // 0014 CALL R5 2 0x1418031C, // 0014 LT R6 R1 K28
0x5416002F, // 0015 LDINT R5 48 0x781A0000, // 0015 JMPF R6 #0017
0x98023805, // 0016 SETIDX R0 K28 R5 0x80040000, // 0016 RET 1 R0
0x80000A00, // 0017 RET 0 0x78160005, // 0017 JMPF R5 #001E
0x8C14011D, // 0018 GETMET R5 R0 K29 0x8C18011D, // 0018 GETMET R6 R0 K29
0x541E000A, // 0019 LDINT R7 11 0x0020091E, // 0019 ADD R8 R4 K30
0x7C140400, // 001A CALL R5 2 0x7C180400, // 001A CALL R6 2
0x5814001C, // 001B LDCONST R5 K28 0x541A002C, // 001B LDINT R6 45
0x2418031C, // 001C GT R6 R1 K28 0x98000806, // 001C SETIDX R0 R4 R6
0x781A0008, // 001D JMPF R6 #0027 0x0010091E, // 001D ADD R4 R4 K30
0x541A0009, // 001E LDINT R6 10 0x5C180800, // 001E MOVE R6 R4
0x10180206, // 001F MOD R6 R1 R6 0x241C031C, // 001F GT R7 R1 K28
0x541E002F, // 0020 LDINT R7 48 0x781E000B, // 0020 JMPF R7 #002D
0x001C0E06, // 0021 ADD R7 R7 R6 0x541E0009, // 0021 LDINT R7 10
0x98000A07, // 0022 SETIDX R0 R5 R7 0x101C0207, // 0022 MOD R7 R1 R7
0x00140B1E, // 0023 ADD R5 R5 K30 0x8C20011D, // 0023 GETMET R8 R0 K29
0x541E0009, // 0024 LDINT R7 10 0x0028091E, // 0024 ADD R10 R4 K30
0x0C040207, // 0025 DIV R1 R1 R7 0x7C200400, // 0025 CALL R8 2
0x7001FFF4, // 0026 JMP #001C 0x5422002F, // 0026 LDINT R8 48
0x78120002, // 0027 JMPF R4 #002B 0x00201007, // 0027 ADD R8 R8 R7
0x541A002C, // 0028 LDINT R6 45 0x98000808, // 0028 SETIDX R0 R4 R8
0x98000A06, // 0029 SETIDX R0 R5 R6 0x0010091E, // 0029 ADD R4 R4 K30
0x00140B1E, // 002A ADD R5 R5 K30 0x54220009, // 002A LDINT R8 10
0x8C18011D, // 002B GETMET R6 R0 K29 0x0C040208, // 002B DIV R1 R1 R8
0x5C200A00, // 002C MOVE R8 R5 0x7001FFF1, // 002C JMP #001F
0x7C180400, // 002D CALL R6 2 0x8C1C011F, // 002D GETMET R7 R0 K31
0x8C18011F, // 002E GETMET R6 R0 K31 0x5C240C00, // 002E MOVE R9 R6
0x7C180200, // 002F CALL R6 1 0x7C1C0400, // 002F CALL R7 2
0x80000000, // 0030 RET 0 0x70020002, // 0030 JMP #0034
0x8C140128, // 0031 GETMET R5 R0 K40
0x5C1C0400, // 0032 MOVE R7 R2
0x7C140400, // 0033 CALL R5 2
0x80040000, // 0034 RET 1 R0
}) })
) )
); );
@ -1653,7 +1658,7 @@ be_local_closure(class_webserver_async_on, /* name */
be_str_weak(on), be_str_weak(on),
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[11]) { /* code */ ( &(const binstruction[11]) { /* code */
0x8C140128, // 0000 GETMET R5 R0 K40 0x8C140129, // 0000 GETMET R5 R0 K41
0x5C1C0200, // 0001 MOVE R7 R1 0x5C1C0200, // 0001 MOVE R7 R1
0x5C200400, // 0002 MOVE R8 R2 0x5C200400, // 0002 MOVE R8 R2
0x5C240600, // 0003 MOVE R9 R3 0x5C240600, // 0003 MOVE R9 R3
@ -1695,7 +1700,7 @@ be_local_closure(class_webserver_async_dispatch, /* name */
0x7816000A, // 0005 JMPF R5 #0011 0x7816000A, // 0005 JMPF R5 #0011
0x88140120, // 0006 GETMBR R5 R0 K32 0x88140120, // 0006 GETMBR R5 R0 K32
0x94140A04, // 0007 GETIDX R5 R5 R4 0x94140A04, // 0007 GETIDX R5 R5 R4
0x8C140B29, // 0008 GETMET R5 R5 K41 0x8C140B2A, // 0008 GETMET R5 R5 K42
0x5C1C0200, // 0009 MOVE R7 R1 0x5C1C0200, // 0009 MOVE R7 R1
0x5C200400, // 000A MOVE R8 R2 0x5C200400, // 000A MOVE R8 R2
0x5C240600, // 000B MOVE R9 R3 0x5C240600, // 000B MOVE R9 R3
@ -1704,14 +1709,14 @@ be_local_closure(class_webserver_async_dispatch, /* name */
0x80000A00, // 000E RET 0 0x80000A00, // 000E RET 0
0x0010091E, // 000F ADD R4 R4 K30 0x0010091E, // 000F ADD R4 R4 K30
0x7001FFEF, // 0010 JMP #0001 0x7001FFEF, // 0010 JMP #0001
0x8C14032A, // 0011 GETMET R5 R1 K42 0x8C14032B, // 0011 GETMET R5 R1 K43
0x541E01F3, // 0012 LDINT R7 500 0x541E01F3, // 0012 LDINT R7 500
0x5820002B, // 0013 LDCONST R8 K43 0x5820002C, // 0013 LDCONST R8 K44
0x7C140600, // 0014 CALL R5 3 0x7C140600, // 0014 CALL R5 3
0x8C14032C, // 0015 GETMET R5 R1 K44 0x8C14032D, // 0015 GETMET R5 R1 K45
0x581C002D, // 0016 LDCONST R7 K45 0x581C002E, // 0016 LDCONST R7 K46
0x7C140400, // 0017 CALL R5 2 0x7C140400, // 0017 CALL R5 2
0x8C14032E, // 0018 GETMET R5 R1 K46 0x8C14032F, // 0018 GETMET R5 R1 K47
0x7C140200, // 0019 CALL R5 1 0x7C140200, // 0019 CALL R5 1
0x80000000, // 001A RET 0 0x80000000, // 001A RET 0
}) })
@ -1729,17 +1734,17 @@ be_local_class(webserver_async,
be_nested_map(21, be_nested_map(21,
( (struct bmapnode*) &(const bmapnode[]) { ( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key_weak(local_port, -1), be_const_var(0) }, { be_const_key_weak(local_port, -1), be_const_var(0) },
{ be_const_key_weak(dispatchers, 18), be_const_var(4) }, { be_const_key_weak(dispatchers, 11), be_const_var(4) },
{ be_const_key_weak(set_chunked, 10), be_const_closure(class_webserver_async_set_chunked_closure) }, { be_const_key_weak(set_chunked, 10), be_const_closure(class_webserver_async_set_chunked_closure) },
{ be_const_key_weak(webserver_async_cnx, 20), be_const_class(be_class_webserver_async_cnx) }, { be_const_key_weak(webserver_async_cnx, 20), be_const_class(be_class_webserver_async_cnx) },
{ be_const_key_weak(webserver_async_dispatcher, -1), be_const_class(be_class_webserver_async_dispatcher) }, { be_const_key_weak(webserver_async_dispatcher, -1), be_const_class(be_class_webserver_async_dispatcher) },
{ be_const_key_weak(compile_re, -1), be_const_closure(class_webserver_async_compile_re_closure) }, { be_const_key_weak(compile_re, -1), be_const_closure(class_webserver_async_compile_re_closure) },
{ be_const_key_weak(dispatch, 7), be_const_closure(class_webserver_async_dispatch_closure) }, { be_const_key_weak(dispatch, 7), be_const_closure(class_webserver_async_dispatch_closure) },
{ be_const_key_weak(cors, 11), be_const_var(6) }, { be_const_key_weak(cors, 16), be_const_var(6) },
{ be_const_key_weak(connections, -1), be_const_var(3) }, { be_const_key_weak(connections, -1), be_const_var(3) },
{ be_const_key_weak(set_cors, 1), be_const_closure(class_webserver_async_set_cors_closure) }, { be_const_key_weak(set_cors, 1), be_const_closure(class_webserver_async_set_cors_closure) },
{ be_const_key_weak(on, -1), be_const_closure(class_webserver_async_on_closure) }, { be_const_key_weak(on, -1), be_const_closure(class_webserver_async_on_closure) },
{ be_const_key_weak(bytes_format_int, 16), be_const_static_closure(class_webserver_async_bytes_format_int_closure) }, { be_const_key_weak(bytes_append_int, 18), be_const_static_closure(class_webserver_async_bytes_append_int_closure) },
{ be_const_key_weak(init, -1), be_const_closure(class_webserver_async_init_closure) }, { be_const_key_weak(init, -1), be_const_closure(class_webserver_async_init_closure) },
{ be_const_key_weak(p1, -1), be_const_var(7) }, { be_const_key_weak(p1, -1), be_const_var(7) },
{ be_const_key_weak(fastloop_cb, -1), be_const_var(2) }, { be_const_key_weak(fastloop_cb, -1), be_const_var(2) },

View File

@ -21,7 +21,7 @@ class debug_panel
var port var port
var web var web
var sampling_interval var sampling_interval
var p1, p2 var p1
static var SAMPLING = 100 static var SAMPLING = 100
static var HTML_HEAD1 = static var HTML_HEAD1 =
@ -69,12 +69,12 @@ class debug_panel
"</body></html>" "</body></html>"
def init(port) def init(port)
if (port == nil) port = 8887 end
self.port = port self.port = port
self.web = webserver_async(port) self.web = webserver_async(port)
self.sampling_interval = self.SAMPLING self.sampling_interval = self.SAMPLING
self.p1 = bytes(100) self.p1 = bytes(100)
self.p2 = bytes(100)
self.web.set_chunked(true) self.web.set_chunked(true)
self.web.set_cors(true) self.web.set_cors(true)
@ -136,7 +136,6 @@ class debug_panel
end end
var payload1 = self.app.p1 var payload1 = self.app.p1
var payload2 = self.app.p2
var server = self.cnx.server var server = self.cnx.server
if cnx.buf_out_empty() if cnx.buf_out_empty()
# if out buffer is not empty, do not send any new information # if out buffer is not empty, do not send any new information
@ -144,11 +143,9 @@ class debug_panel
# send free heap # send free heap
payload1.clear() payload1.clear()
payload1 .. "id:" payload1 .. "id:"
server.bytes_format_int(payload2, tasmota.millis()) server.bytes_append_int(payload1, tasmota.millis())
payload1 .. payload2
payload1 .. "\r\nevent:free_heap\r\ndata:" payload1 .. "\r\nevent:free_heap\r\ndata:"
server.bytes_format_int(payload2, tasmota.memory('heap_free'), '---') server.bytes_append_int(payload1, tasmota.memory('heap_free'), '---')
payload1 .. payload2
payload1 .. " KB\r\n\r\n" payload1 .. " KB\r\n\r\n"
# payload = f"id:{tasmota.millis()}\r\n" # payload = f"id:{tasmota.millis()}\r\n"
# "event:free_heap\r\n" # "event:free_heap\r\n"
@ -158,11 +155,9 @@ class debug_panel
# send wifi rssi # send wifi rssi
payload1.clear() payload1.clear()
payload1 .. "id:" payload1 .. "id:"
server.bytes_format_int(payload2, tasmota.millis()) server.bytes_append_int(payload1, tasmota.millis())
payload1 .. payload2
payload1 .. "\r\nevent:wifi_rssi\r\ndata:" payload1 .. "\r\nevent:wifi_rssi\r\ndata:"
server.bytes_format_int(payload2, tasmota.wifi('quality'), '--') server.bytes_append_int(payload1, tasmota.wifi('quality'), '--')
payload1 .. payload2
payload1 .. "%\r\n\r\n" payload1 .. "%\r\n\r\n"
# payload = f"id:{tasmota.millis()}\r\n" # payload = f"id:{tasmota.millis()}\r\n"
@ -219,7 +214,7 @@ end
return debug_panel return debug_panel
# if tasmota # if tasmota
# global.debug_panel = Debug_panel(8887) # global.debug_panel = debug_panel(8887)
# end # end
# return global.debug_panel # return global.debug_panel