mirror of
https://github.com/arendst/Tasmota.git
synced 2025-04-19 20:37:20 +00:00
Compare commits
1120 Commits
v14.0.0
...
developmen
Author | SHA1 | Date | |
---|---|---|---|
![]() |
015fa1da89 | ||
![]() |
a11e269ca0 | ||
![]() |
2831bbfd18 | ||
![]() |
92b3f7d37c | ||
![]() |
a2d1915692 | ||
![]() |
082170374c | ||
![]() |
c2628c95f3 | ||
![]() |
2bc5f682b0 | ||
![]() |
cea46bb660 | ||
![]() |
b67231483a | ||
![]() |
e6918d8b9c | ||
![]() |
7ea95ec6b2 | ||
![]() |
8921a42f79 | ||
![]() |
c8181e3290 | ||
![]() |
117e503aaa | ||
![]() |
3baa110f9d | ||
![]() |
a4096ab049 | ||
![]() |
83118b9e05 | ||
![]() |
3a28938b91 | ||
![]() |
68f019cf43 | ||
![]() |
4707cc068f | ||
![]() |
0604fac3bc | ||
![]() |
c12974366b | ||
![]() |
cced48d824 | ||
![]() |
1a8903578f | ||
![]() |
230ce2c539 | ||
![]() |
6b7606c958 | ||
![]() |
cfe1cee4d3 | ||
![]() |
2999eed8b9 | ||
![]() |
3f82228905 | ||
![]() |
7ddf8abf90 | ||
![]() |
215b37bf69 | ||
![]() |
342bb2cb7b | ||
![]() |
2096411be6 | ||
![]() |
929582b1af | ||
![]() |
4ed48feaa2 | ||
![]() |
c121dbcd4a | ||
![]() |
e8baea464f | ||
![]() |
2bf67b96a6 | ||
![]() |
0cb6a8ba24 | ||
![]() |
39494f1287 | ||
![]() |
90c690e67a | ||
![]() |
08f20b9404 | ||
![]() |
dfabe8cc0f | ||
![]() |
b43d360d37 | ||
![]() |
2f7793ddcf | ||
![]() |
3c70b728ac | ||
![]() |
289120ee92 | ||
![]() |
b77b622fbe | ||
![]() |
a47e6f1496 | ||
![]() |
74757ee7da | ||
![]() |
ea2baee3b8 | ||
![]() |
f4bb9d98b6 | ||
![]() |
87b95f798a | ||
![]() |
da4dc56b16 | ||
![]() |
714ad233e0 | ||
![]() |
2da631e442 | ||
![]() |
6f47f23f7a | ||
![]() |
69fca99ac1 | ||
![]() |
a3b564f4f3 | ||
![]() |
52f3306f15 | ||
![]() |
9d6640a42e | ||
![]() |
307e1d9c29 | ||
![]() |
f71ca3e0a2 | ||
![]() |
a3d86eebf0 | ||
![]() |
f331a64ac3 | ||
![]() |
caac9f1257 | ||
![]() |
b47a1bc1e2 | ||
![]() |
9e3ad52356 | ||
![]() |
38ceafe789 | ||
![]() |
ddc1439edf | ||
![]() |
3827bca3cc | ||
![]() |
8183a9ed3b | ||
![]() |
00e2d1d430 | ||
![]() |
863c6d1214 | ||
![]() |
73cace5274 | ||
![]() |
1ada6da6b8 | ||
![]() |
fbb752d8c2 | ||
![]() |
fb6640b91f | ||
![]() |
c0d15de965 | ||
![]() |
3764e88ed2 | ||
![]() |
0ea1f8e632 | ||
![]() |
234c5ea170 | ||
![]() |
ce92723c41 | ||
![]() |
e1f7ee26fa | ||
![]() |
a97d306a16 | ||
![]() |
508992258f | ||
![]() |
1b51aef911 | ||
![]() |
6486ba3b26 | ||
![]() |
9b4eb64caa | ||
![]() |
6d376a079e | ||
![]() |
69c3863b14 | ||
![]() |
ac8236abe1 | ||
![]() |
16e9d105ba | ||
![]() |
f3ae3bec4b | ||
![]() |
cae4551762 | ||
![]() |
007608914c | ||
![]() |
758ba17dde | ||
![]() |
08fae4bcd6 | ||
![]() |
f305113d6d | ||
![]() |
7b8d2fe93d | ||
![]() |
714435be1c | ||
![]() |
e3eb47078f | ||
![]() |
a0c8ac4f80 | ||
![]() |
c926b4b3a6 | ||
![]() |
3f93d2deee | ||
![]() |
06aa356bc3 | ||
![]() |
58632d67db | ||
![]() |
e26a2cdac9 | ||
![]() |
72535db185 | ||
![]() |
f2bf8b96e7 | ||
![]() |
549ca6e32f | ||
![]() |
72520e0743 | ||
![]() |
aed82dc8b2 | ||
![]() |
2e35a2ab93 | ||
![]() |
3c171c1ed8 | ||
![]() |
481f2cd8e1 | ||
![]() |
9a98db9773 | ||
![]() |
e92e411040 | ||
![]() |
aecba92da4 | ||
![]() |
4ee4b5908f | ||
![]() |
3f74bc83e5 | ||
![]() |
fd0501035d | ||
![]() |
670fab7ead | ||
![]() |
375864b23b | ||
![]() |
788ac574ac | ||
![]() |
5aa7d08c91 | ||
![]() |
b4c61325cb | ||
![]() |
d10eafc500 | ||
![]() |
90ebff552d | ||
![]() |
0c26698ba6 | ||
![]() |
1db796c40f | ||
![]() |
b8459eb685 | ||
![]() |
b1f3d6268d | ||
![]() |
7a4d8a5fb1 | ||
![]() |
0ab5548615 | ||
![]() |
1af1057e66 | ||
![]() |
039960153a | ||
![]() |
b4c1cd654f | ||
![]() |
c6b975561f | ||
![]() |
4306823ba6 | ||
![]() |
9b258cadcf | ||
![]() |
871723b6f7 | ||
![]() |
3c66ace01b | ||
![]() |
41af475cdb | ||
![]() |
3c5f22b31f | ||
![]() |
cb333a5a38 | ||
![]() |
c39a7d924a | ||
![]() |
f07af885a9 | ||
![]() |
f1be1b8ba9 | ||
![]() |
cfc11b5e83 | ||
![]() |
a939b4973e | ||
![]() |
d805cef66e | ||
![]() |
64ec55db4e | ||
![]() |
a2af12c969 | ||
![]() |
f383c877c6 | ||
![]() |
cc14f721f9 | ||
![]() |
ccf8902515 | ||
![]() |
f3dc35e9ca | ||
![]() |
0b3be314e7 | ||
![]() |
a9150dc703 | ||
![]() |
c076331fad | ||
![]() |
8621b9adf4 | ||
![]() |
bc7a1f5dbc | ||
![]() |
3ef9fe9f6e | ||
![]() |
1910aba79f | ||
![]() |
dbcfe486af | ||
![]() |
214b392839 | ||
![]() |
b9bc3580f4 | ||
![]() |
b07bd68046 | ||
![]() |
7a97a8fa98 | ||
![]() |
1b2fc5eccc | ||
![]() |
e7f5ecc2d0 | ||
![]() |
ff5b4956c8 | ||
![]() |
5a6b219971 | ||
![]() |
99cbdf687d | ||
![]() |
57e4d18d26 | ||
![]() |
d4a8952c34 | ||
![]() |
28b22de7e4 | ||
![]() |
f65646ba80 | ||
![]() |
f014299adc | ||
![]() |
af4ec3e0d0 | ||
![]() |
f1e5b576ba | ||
![]() |
c4dd9839c9 | ||
![]() |
db96993e50 | ||
![]() |
35a27d4541 | ||
![]() |
f727013373 | ||
![]() |
d54dfa6bc4 | ||
![]() |
a07973e866 | ||
![]() |
23ae0db9a8 | ||
![]() |
89b1df6a81 | ||
![]() |
117c1f68b7 | ||
![]() |
1988cd620d | ||
![]() |
470065e36b | ||
![]() |
d94e680b51 | ||
![]() |
c7d4a2a104 | ||
![]() |
8bf10f0b9a | ||
![]() |
ed52e711a9 | ||
![]() |
6ffb783321 | ||
![]() |
c4d2f010ef | ||
![]() |
1c0327e2c1 | ||
![]() |
63845ad3e8 | ||
![]() |
268a7267ac | ||
![]() |
a9c39fe098 | ||
![]() |
ea584f60c8 | ||
![]() |
2c0172d7d5 | ||
![]() |
94e2a91bbd | ||
![]() |
dcc407889a | ||
![]() |
97cf0a4baa | ||
![]() |
6421d6b1ab | ||
![]() |
b02ac268ad | ||
![]() |
2ac886a7f8 | ||
![]() |
8f641238b6 | ||
![]() |
2c8c5ae6b9 | ||
![]() |
892e29f599 | ||
![]() |
a9996ecc40 | ||
![]() |
9be9bb8af3 | ||
![]() |
518df07ba1 | ||
![]() |
c9cd6aae1d | ||
![]() |
ab9ad562cb | ||
![]() |
0b95779947 | ||
![]() |
0ba224bf9a | ||
![]() |
427db230fc | ||
![]() |
670d7bd8eb | ||
![]() |
cba8723c59 | ||
![]() |
c773a95ff7 | ||
![]() |
35e2d43191 | ||
![]() |
8a0e2d0604 | ||
![]() |
66a1f04414 | ||
![]() |
0c898b8d75 | ||
![]() |
299f983610 | ||
![]() |
aaa49f84ab | ||
![]() |
def7ede895 | ||
![]() |
e8ca96008f | ||
![]() |
943a0b1e6c | ||
![]() |
0bc319acb5 | ||
![]() |
d72ec454c0 | ||
![]() |
0288157fdb | ||
![]() |
7dd6b999ca | ||
![]() |
34b173e953 | ||
![]() |
9d963ce599 | ||
![]() |
f4bc628940 | ||
![]() |
0dcd38186f | ||
![]() |
9bb7b7913a | ||
![]() |
60570dec76 | ||
![]() |
95e93b8f33 | ||
![]() |
9613004bb4 | ||
![]() |
b167955e87 | ||
![]() |
18d99daa72 | ||
![]() |
4d9dd0aa3f | ||
![]() |
53dee5b002 | ||
![]() |
1065db5831 | ||
![]() |
0471f0f3c5 | ||
![]() |
beb967ccd4 | ||
![]() |
a91771e0cf | ||
![]() |
5cbe5fe9e4 | ||
![]() |
b253b344c2 | ||
![]() |
fa4f2123cf | ||
![]() |
9f3f234ac9 | ||
![]() |
4b69d30a5f | ||
![]() |
cd0743c6ed | ||
![]() |
ed1c6e2d9e | ||
![]() |
a7ee6054b5 | ||
![]() |
a49e924b53 | ||
![]() |
ebbef97cde | ||
![]() |
3068a48d90 | ||
![]() |
5ac1fdb8fe | ||
![]() |
866ffc8967 | ||
![]() |
3efdfae845 | ||
![]() |
6d7aab4662 | ||
![]() |
ec8cf6e2f0 | ||
![]() |
d176a1d65b | ||
![]() |
ddcdc85520 | ||
![]() |
fc8485d91b | ||
![]() |
e5e4c336b5 | ||
![]() |
6b3719bd9e | ||
![]() |
d0ef026bb9 | ||
![]() |
03e8497211 | ||
![]() |
cf739e9522 | ||
![]() |
e299035266 | ||
![]() |
83b09f4de1 | ||
![]() |
3365fd0d0b | ||
![]() |
ed21cfd487 | ||
![]() |
f42cb555c3 | ||
![]() |
e57b3e8b05 | ||
![]() |
76fb95b166 | ||
![]() |
d6ce776c98 | ||
![]() |
dce79fd0c3 | ||
![]() |
d3da193e39 | ||
![]() |
b73f50be6b | ||
![]() |
1fc6f5c707 | ||
![]() |
fe2f4d031f | ||
![]() |
b472e821cf | ||
![]() |
17ab5a5e83 | ||
![]() |
2263305bee | ||
![]() |
0d0b9de474 | ||
![]() |
77d98868bf | ||
![]() |
a5610eea09 | ||
![]() |
bd7e47139c | ||
![]() |
c084719b0e | ||
![]() |
124f55ca70 | ||
![]() |
50f0f8a651 | ||
![]() |
64a2fe8aee | ||
![]() |
ed7b58291a | ||
![]() |
aafe528682 | ||
![]() |
d5d757fd3d | ||
![]() |
b5c326d772 | ||
![]() |
884e795dff | ||
![]() |
8fa33ff4da | ||
![]() |
a2752bf500 | ||
![]() |
01154e9497 | ||
![]() |
1a482364bc | ||
![]() |
5f95b33220 | ||
![]() |
dc531de02b | ||
![]() |
a1aef6b39f | ||
![]() |
02225ea7c4 | ||
![]() |
2d2c732e2e | ||
![]() |
9fb8065fac | ||
![]() |
1ad89ccb3e | ||
![]() |
de3a7f3909 | ||
![]() |
17924392fa | ||
![]() |
f4d0606d06 | ||
![]() |
6d5a33772c | ||
![]() |
d1a7d70ca0 | ||
![]() |
7f8f61423a | ||
![]() |
b729886a16 | ||
![]() |
4d3a780eb1 | ||
![]() |
64f0acb0c5 | ||
![]() |
2143082aa4 | ||
![]() |
1d244fcd28 | ||
![]() |
02ae53cec5 | ||
![]() |
94f3744235 | ||
![]() |
8a37df10c6 | ||
![]() |
2024bf88ac | ||
![]() |
fc3ad45836 | ||
![]() |
4fd3d9465c | ||
![]() |
3412761881 | ||
![]() |
3457d66d1e | ||
![]() |
3b48a1c16a | ||
![]() |
27e85809b5 | ||
![]() |
f3fcbea6d1 | ||
![]() |
f59c1675eb | ||
![]() |
6745bc1b48 | ||
![]() |
9f3c7859d7 | ||
![]() |
52d4e84b39 | ||
![]() |
8311bff7ee | ||
![]() |
fde529fac4 | ||
![]() |
af724a6149 | ||
![]() |
0d9ce6de12 | ||
![]() |
df79533611 | ||
![]() |
e4ff66192f | ||
![]() |
9b6dc1f0f1 | ||
![]() |
2d3a049e59 | ||
![]() |
b7da75da30 | ||
![]() |
db29cb7152 | ||
![]() |
97b375fd57 | ||
![]() |
2c3785c1c6 | ||
![]() |
69d3fc1003 | ||
![]() |
90e0595b7f | ||
![]() |
fba6a806ac | ||
![]() |
ef7b2404d4 | ||
![]() |
6468b6edcd | ||
![]() |
c40b707b76 | ||
![]() |
af3bb96a2a | ||
![]() |
da7473e07c | ||
![]() |
b0c505d171 | ||
![]() |
6fbf8c58f7 | ||
![]() |
b3b9699782 | ||
![]() |
615c6763f6 | ||
![]() |
7cd0908c89 | ||
![]() |
bd6e7d220d | ||
![]() |
8d1b4094db | ||
![]() |
67ae7c2fe1 | ||
![]() |
5294b99ba7 | ||
![]() |
53e2fab34c | ||
![]() |
ab5208d216 | ||
![]() |
f135f46990 | ||
![]() |
9650d0f1ef | ||
![]() |
7834dbf6b6 | ||
![]() |
1099babb16 | ||
![]() |
3e3b568aeb | ||
![]() |
620fade73c | ||
![]() |
6268066bac | ||
![]() |
dc7cb05cab | ||
![]() |
d08aafd3fb | ||
![]() |
ee3fbdf4e0 | ||
![]() |
4008a4e5e6 | ||
![]() |
3c51793d5c | ||
![]() |
bdf880cf84 | ||
![]() |
c1834bd898 | ||
![]() |
a12c934a4b | ||
![]() |
71dfae2d9d | ||
![]() |
23e5a4dec2 | ||
![]() |
09f0b89ab0 | ||
![]() |
d6c1617fc5 | ||
![]() |
2969ee91a4 | ||
![]() |
364fa21fc4 | ||
![]() |
ed520140a1 | ||
![]() |
523f803b06 | ||
![]() |
aeb965435e | ||
![]() |
7df2c703a1 | ||
![]() |
54d28c9d35 | ||
![]() |
dd555a0641 | ||
![]() |
0a2fa4ec41 | ||
![]() |
6e6305f5e9 | ||
![]() |
57fc179709 | ||
![]() |
3a62cc6050 | ||
![]() |
789bbb8b97 | ||
![]() |
4ffc53b465 | ||
![]() |
f341f8d35a | ||
![]() |
9317e02f25 | ||
![]() |
b80cc6a3e6 | ||
![]() |
ccd76b26ed | ||
![]() |
f72769252e | ||
![]() |
6b753cff44 | ||
![]() |
570e2052d3 | ||
![]() |
62e4bf1acd | ||
![]() |
4046cd8ec0 | ||
![]() |
62d6a03335 | ||
![]() |
341cc87527 | ||
![]() |
ebff2d2d38 | ||
![]() |
baeaad7558 | ||
![]() |
e2bae09ded | ||
![]() |
0ea8889997 | ||
![]() |
e1fc36361e | ||
![]() |
bed14174bc | ||
![]() |
fbb2c84f29 | ||
![]() |
a838ec09f8 | ||
![]() |
038e62b72c | ||
![]() |
f176ede65d | ||
![]() |
3316bc5e70 | ||
![]() |
db0287e566 | ||
![]() |
8cb9345a97 | ||
![]() |
e8d5e442bf | ||
![]() |
5a32df5e81 | ||
![]() |
5dd132bb5f | ||
![]() |
2322646773 | ||
![]() |
155dea98cd | ||
![]() |
3ab87273e6 | ||
![]() |
e397c11e70 | ||
![]() |
2402f7cbd1 | ||
![]() |
3448e17317 | ||
![]() |
25f13e434f | ||
![]() |
b9414008df | ||
![]() |
3c703ac4d4 | ||
![]() |
f255233f90 | ||
![]() |
fb0666e6c8 | ||
![]() |
4925e9c9a8 | ||
![]() |
16b6d353f4 | ||
![]() |
bf872defab | ||
![]() |
1e9c5ad40e | ||
![]() |
3c5cbade63 | ||
![]() |
6d0467489a | ||
![]() |
fe658424b8 | ||
![]() |
ae7cba2f13 | ||
![]() |
3778f22d7b | ||
![]() |
320ad0e1d3 | ||
![]() |
3114c75a1d | ||
![]() |
873bd3f211 | ||
![]() |
7615b3c8f7 | ||
![]() |
f3bf8998ae | ||
![]() |
4e40bbf3b6 | ||
![]() |
099c68678a | ||
![]() |
6821293819 | ||
![]() |
14c0a42203 | ||
![]() |
5de16c1cca | ||
![]() |
de45fda781 | ||
![]() |
09c43fa729 | ||
![]() |
d3df759514 | ||
![]() |
0947860c83 | ||
![]() |
996ea17fb6 | ||
![]() |
ef7cd80ed8 | ||
![]() |
aeceace546 | ||
![]() |
1dff29f367 | ||
![]() |
0dcfa74ef3 | ||
![]() |
dd99642cf7 | ||
![]() |
b195bcd88d | ||
![]() |
551c919ae2 | ||
![]() |
50b6f74295 | ||
![]() |
88810fc92c | ||
![]() |
0fb39b9bac | ||
![]() |
77f9fb0783 | ||
![]() |
7dd1e2a028 | ||
![]() |
cf94ccf59c | ||
![]() |
b903c6a843 | ||
![]() |
5c3d450195 | ||
![]() |
331fd14268 | ||
![]() |
bdc7e0a65b | ||
![]() |
caa63f437c | ||
![]() |
a766947724 | ||
![]() |
043d80809b | ||
![]() |
6c4e314adc | ||
![]() |
a013c7e36d | ||
![]() |
08f99de2a5 | ||
![]() |
1b9d206dd8 | ||
![]() |
0744bf7f2b | ||
![]() |
0536cc87a0 | ||
![]() |
c86f74d456 | ||
![]() |
b40e2ec8e9 | ||
![]() |
343d9b9758 | ||
![]() |
448ca1c109 | ||
![]() |
5f9912665a | ||
![]() |
fd7554d96e | ||
![]() |
a97aeeedb7 | ||
![]() |
7e3f093dc9 | ||
![]() |
669c6e49ea | ||
![]() |
a5c33eba5e | ||
![]() |
3bc90175db | ||
![]() |
a836e841ad | ||
![]() |
c2091d7082 | ||
![]() |
7c82d3a7ae | ||
![]() |
df293dad82 | ||
![]() |
a35bb5a5c9 | ||
![]() |
19e15e21aa | ||
![]() |
feff388f03 | ||
![]() |
2f3808adc9 | ||
![]() |
5fac24a5f6 | ||
![]() |
245da3918a | ||
![]() |
ff0d003a24 | ||
![]() |
4f90c3764a | ||
![]() |
98cf7f33f7 | ||
![]() |
2fd1c0b7fb | ||
![]() |
a571ca1db5 | ||
![]() |
94c45689a6 | ||
![]() |
57d8bea761 | ||
![]() |
490c48eefe | ||
![]() |
56243ef720 | ||
![]() |
133cca3fd5 | ||
![]() |
5aaeecdbe8 | ||
![]() |
8e34864ead | ||
![]() |
2dc5c6e234 | ||
![]() |
66d69e09c9 | ||
![]() |
a463761090 | ||
![]() |
49d706f54c | ||
![]() |
deca4d9e06 | ||
![]() |
789c990c19 | ||
![]() |
5892fef63d | ||
![]() |
b89909991c | ||
![]() |
e30d88e013 | ||
![]() |
0ba0b8dada | ||
![]() |
3f4b2331ee | ||
![]() |
79a7c71145 | ||
![]() |
ccfbdd50e0 | ||
![]() |
2669cd35cf | ||
![]() |
2925836a9c | ||
![]() |
18bfda50ab | ||
![]() |
fc0dc5dfec | ||
![]() |
27db263493 | ||
![]() |
ef3c061ecf | ||
![]() |
104fec83fb | ||
![]() |
e14f014c96 | ||
![]() |
e731738385 | ||
![]() |
4f2c1f3499 | ||
![]() |
37f42b474f | ||
![]() |
faf6e66e32 | ||
![]() |
19fcaf8866 | ||
![]() |
bca4211500 | ||
![]() |
227e5f24b6 | ||
![]() |
98b04f5029 | ||
![]() |
b5a487a595 | ||
![]() |
0f2b3b1898 | ||
![]() |
41442a54ce | ||
![]() |
33e1da84e7 | ||
![]() |
73cd5cee25 | ||
![]() |
16a145f809 | ||
![]() |
0fd16f8725 | ||
![]() |
886221a1d6 | ||
![]() |
80686a8c52 | ||
![]() |
bbba5b9196 | ||
![]() |
e4f431dc7b | ||
![]() |
fd37801d53 | ||
![]() |
73897ef755 | ||
![]() |
7f6dbfbeac | ||
![]() |
5200aca185 | ||
![]() |
02972ad3ea | ||
![]() |
6b094ede16 | ||
![]() |
2b6acff4f4 | ||
![]() |
4dfa016855 | ||
![]() |
f6699b529c | ||
![]() |
bd88ddc56d | ||
![]() |
7ea96eb005 | ||
![]() |
923ed91c9c | ||
![]() |
9c24258530 | ||
![]() |
148f8350b6 | ||
![]() |
04c0aa13ea | ||
![]() |
91604b9f2a | ||
![]() |
f320ca2982 | ||
![]() |
813dc27360 | ||
![]() |
66213c88c1 | ||
![]() |
92a56a80b4 | ||
![]() |
73f755dda2 | ||
![]() |
ad65448e09 | ||
![]() |
58e3297b07 | ||
![]() |
7c3f83215a | ||
![]() |
fa7e0f938e | ||
![]() |
5a204aea48 | ||
![]() |
a35b7a9f82 | ||
![]() |
4948b70acd | ||
![]() |
e39f1cc83f | ||
![]() |
0f84211898 | ||
![]() |
aed98a6b64 | ||
![]() |
69f7f155dd | ||
![]() |
3569a22dab | ||
![]() |
763cc8319d | ||
![]() |
6a7f8b11ed | ||
![]() |
8a9bf94e58 | ||
![]() |
76d8836e6e | ||
![]() |
150d0e6220 | ||
![]() |
fa82a48789 | ||
![]() |
3969c80242 | ||
![]() |
314fcd0dbc | ||
![]() |
0c7e8c67f3 | ||
![]() |
c07b8a59c0 | ||
![]() |
63d44c8b30 | ||
![]() |
4b06cb27b0 | ||
![]() |
b53ac4a14e | ||
![]() |
154f478b5c | ||
![]() |
f9ee4198e1 | ||
![]() |
8ea4c7887f | ||
![]() |
a839144491 | ||
![]() |
f2c61c4496 | ||
![]() |
d6a15aa5dc | ||
![]() |
cc6ec3648f | ||
![]() |
db47b92bc1 | ||
![]() |
c7845f1864 | ||
![]() |
04f3df8bf6 | ||
![]() |
50ccaede60 | ||
![]() |
1ab53aabc8 | ||
![]() |
8e7c7c3af6 | ||
![]() |
f8fbe15300 | ||
![]() |
1a5e6db02d | ||
![]() |
6bc2e50d9c | ||
![]() |
0468b0e3f1 | ||
![]() |
c1f535207f | ||
![]() |
d986f7f7c7 | ||
![]() |
3e0d36af9d | ||
![]() |
abc6e46354 | ||
![]() |
4196f753c8 | ||
![]() |
efce07086c | ||
![]() |
0240da2bf7 | ||
![]() |
b5b11d6227 | ||
![]() |
d9f246f0f0 | ||
![]() |
ba687deaf5 | ||
![]() |
b09b3560b9 | ||
![]() |
bf0f7316b9 | ||
![]() |
4cbb1b1c58 | ||
![]() |
6fa38e4b83 | ||
![]() |
69c19d95ae | ||
![]() |
2d80f87fc9 | ||
![]() |
59c8d39724 | ||
![]() |
75001a024d | ||
![]() |
5d4230d39b | ||
![]() |
19d3984d6e | ||
![]() |
b2b839fa83 | ||
![]() |
5909eec188 | ||
![]() |
452031fbbd | ||
![]() |
692a0ca4b1 | ||
![]() |
1248bd138c | ||
![]() |
d716a275bf | ||
![]() |
08d75a5fe3 | ||
![]() |
27a4ea0f70 | ||
![]() |
61aeea9132 | ||
![]() |
622b8b10c0 | ||
![]() |
a306d77a5e | ||
![]() |
e3c47851b7 | ||
![]() |
ef1cbeae21 | ||
![]() |
64de5497f4 | ||
![]() |
a6075b2855 | ||
![]() |
17cc9e18b4 | ||
![]() |
2d5545997e | ||
![]() |
f3aed72f97 | ||
![]() |
330cfe8b4d | ||
![]() |
3707d4b239 | ||
![]() |
7ef93b20fd | ||
![]() |
6bb046726e | ||
![]() |
03b57179ac | ||
![]() |
8d7a27df76 | ||
![]() |
bf4d0d0890 | ||
![]() |
b00d7fd0ac | ||
![]() |
d5289e8ba9 | ||
![]() |
694691e34a | ||
![]() |
83eb8aeaa7 | ||
![]() |
be46b95d62 | ||
![]() |
f43d23e59a | ||
![]() |
a5b4490ba0 | ||
![]() |
3f56ab68ad | ||
![]() |
5d0cc8144a | ||
![]() |
3b28542d9c | ||
![]() |
9238ee73d6 | ||
![]() |
a9f0623769 | ||
![]() |
d0d075a1b4 | ||
![]() |
a30f47a901 | ||
![]() |
0dfab3684c | ||
![]() |
27611a1698 | ||
![]() |
717bc01df8 | ||
![]() |
a5730a76f9 | ||
![]() |
4f2b24f53d | ||
![]() |
fd7d2fc0a4 | ||
![]() |
97970974fc | ||
![]() |
c61dd0fd2c | ||
![]() |
a3892ecbc4 | ||
![]() |
1bfbe02a29 | ||
![]() |
1dff0b4b27 | ||
![]() |
6e4517de02 | ||
![]() |
7b8308c36a | ||
![]() |
9d012f64c8 | ||
![]() |
1edc4b57b7 | ||
![]() |
d8f01ed4c0 | ||
![]() |
07eb51764a | ||
![]() |
f0da077e78 | ||
![]() |
05e59b048e | ||
![]() |
1c730aab86 | ||
![]() |
5675f00d70 | ||
![]() |
2d522485c4 | ||
![]() |
7247cd6c44 | ||
![]() |
a75a58d591 | ||
![]() |
6650dee578 | ||
![]() |
28bbf11dbb | ||
![]() |
9ac2a69603 | ||
![]() |
1bf6a13d7c | ||
![]() |
744e50acf7 | ||
![]() |
4717d1986c | ||
![]() |
fade4f867d | ||
![]() |
2c5e8749e3 | ||
![]() |
8956b25de4 | ||
![]() |
b5f26e9210 | ||
![]() |
069f59d13f | ||
![]() |
c41e9fe010 | ||
![]() |
5f80251414 | ||
![]() |
4164887412 | ||
![]() |
b6e81c1edd | ||
![]() |
caa501b1af | ||
![]() |
d1bd31b341 | ||
![]() |
428fa95dfd | ||
![]() |
1ab9bee312 | ||
![]() |
71f0a06356 | ||
![]() |
2292006fe3 | ||
![]() |
220778a3c0 | ||
![]() |
11ed65560b | ||
![]() |
e7f120d443 | ||
![]() |
f85a96dd2d | ||
![]() |
f62496d164 | ||
![]() |
e8cdeaba6b | ||
![]() |
a44443f184 | ||
![]() |
888e1d5bb1 | ||
![]() |
a10e3b9bc5 | ||
![]() |
969611835c | ||
![]() |
f0c12b6e9c | ||
![]() |
fefd49c663 | ||
![]() |
1ad4a1377b | ||
![]() |
88c9ae3273 | ||
![]() |
c35c493809 | ||
![]() |
5c30d92627 | ||
![]() |
8d6a4bd7be | ||
![]() |
645ce4a1ee | ||
![]() |
d084be23db | ||
![]() |
e143438552 | ||
![]() |
831597e7d9 | ||
![]() |
4144f5c5ca | ||
![]() |
798edc20c2 | ||
![]() |
ba7161fb00 | ||
![]() |
ab2d6c1169 | ||
![]() |
c5b92d3ab1 | ||
![]() |
4f62a0deab | ||
![]() |
e74142724c | ||
![]() |
903686f7b5 | ||
![]() |
c0eb28dae9 | ||
![]() |
652b9cef87 | ||
![]() |
bb0db6d8f8 | ||
![]() |
6d2647fd5f | ||
![]() |
1b24378da5 | ||
![]() |
851f11dcdd | ||
![]() |
30cffa1acc | ||
![]() |
43a8e2464f | ||
![]() |
d525200a11 | ||
![]() |
102428f768 | ||
![]() |
b93e6cee7b | ||
![]() |
ff46745252 | ||
![]() |
8f75684cd7 | ||
![]() |
5bac2a2331 | ||
![]() |
cc2ea328d5 | ||
![]() |
d3f6d7d844 | ||
![]() |
85da678132 | ||
![]() |
bcd1a9c986 | ||
![]() |
de59b036d0 | ||
![]() |
663fc88373 | ||
![]() |
77669f7e20 | ||
![]() |
040ffb33e0 | ||
![]() |
6ffcc69e2d | ||
![]() |
f88a635d5d | ||
![]() |
4f035d18f6 | ||
![]() |
3473c3c1b0 | ||
![]() |
bdec6aed67 | ||
![]() |
469f12abbc | ||
![]() |
82add09bf9 | ||
![]() |
f6c3064890 | ||
![]() |
c7faff7ac6 | ||
![]() |
e5485288eb | ||
![]() |
73357b6cfd | ||
![]() |
3c884118ed | ||
![]() |
d8cac9c811 | ||
![]() |
db26f180ec | ||
![]() |
6b98a320b1 | ||
![]() |
8f74a226e7 | ||
![]() |
010ca34622 | ||
![]() |
40ee4cc316 | ||
![]() |
74551c873f | ||
![]() |
836ce9ef9b | ||
![]() |
a3ed99e549 | ||
![]() |
67fcb71c6d | ||
![]() |
ba596993a0 | ||
![]() |
4101ad7303 | ||
![]() |
b4a0e27852 | ||
![]() |
eb71fcfd2e | ||
![]() |
0c52b40f49 | ||
![]() |
b8c5e22e1b | ||
![]() |
a9a55b3ccd | ||
![]() |
a98399367b | ||
![]() |
88293d7414 | ||
![]() |
87ec0cce21 | ||
![]() |
7c1cf6a81f | ||
![]() |
0dda8fc224 | ||
![]() |
5b8638b6b8 | ||
![]() |
068e8e6cbe | ||
![]() |
a4e592c776 | ||
![]() |
a9651e1bf1 | ||
![]() |
d7c6474104 | ||
![]() |
9f99633f43 | ||
![]() |
5abff54bc6 | ||
![]() |
a95e52b375 | ||
![]() |
d4a63f791e | ||
![]() |
f1a898c5ca | ||
![]() |
e02615827b | ||
![]() |
035daa663b | ||
![]() |
4cf741e6eb | ||
![]() |
9af25c73d6 | ||
![]() |
55cb473e13 | ||
![]() |
1b12656955 | ||
![]() |
f97c47c511 | ||
![]() |
b8d7b5e2fa | ||
![]() |
1b887d7202 | ||
![]() |
2f33f8e5a8 | ||
![]() |
b9fcfa86c9 | ||
![]() |
5096a13620 | ||
![]() |
bf7fbf2cbe | ||
![]() |
db3e29dd47 | ||
![]() |
0784637f4f | ||
![]() |
ddcc7d9990 | ||
![]() |
b62b2d0d93 | ||
![]() |
8a7642f122 | ||
![]() |
895fbb2e8a | ||
![]() |
401d7b9b41 | ||
![]() |
c84faa79fb | ||
![]() |
e085cfd3ab | ||
![]() |
f42e44a69d | ||
![]() |
58485dec2a | ||
![]() |
9878a96c0b | ||
![]() |
8c9040919d | ||
![]() |
da169336ee | ||
![]() |
990a0e4257 | ||
![]() |
e2fdf18625 | ||
![]() |
00a00a3505 | ||
![]() |
ebed3ded37 | ||
![]() |
a0893c9aae | ||
![]() |
105d18b9b6 | ||
![]() |
a448f538aa | ||
![]() |
98a5bc95a9 | ||
![]() |
b23a2f2304 | ||
![]() |
85bff67d9b | ||
![]() |
9c8f3826b2 | ||
![]() |
69f1ea5627 | ||
![]() |
6673fb906b | ||
![]() |
e9fdbea091 | ||
![]() |
8f6a0b15c3 | ||
![]() |
a18be12b77 | ||
![]() |
3d34097275 | ||
![]() |
7e22861090 | ||
![]() |
36329827fc | ||
![]() |
db3d292cae | ||
![]() |
d27ca0bc89 | ||
![]() |
279d9e5824 | ||
![]() |
f68ac4377a | ||
![]() |
59de2fd979 | ||
![]() |
13330eb085 | ||
![]() |
23de275dbe | ||
![]() |
27083e3664 | ||
![]() |
5df51a9365 | ||
![]() |
b56e3c43a8 | ||
![]() |
a3048a0b25 | ||
![]() |
105a08dd20 | ||
![]() |
09b2670c45 | ||
![]() |
60d0c2208b | ||
![]() |
7cb8a3f968 | ||
![]() |
99374ae45b | ||
![]() |
2f62c156f9 | ||
![]() |
fee5251bd4 | ||
![]() |
363cd8d79e | ||
![]() |
be40830bc0 | ||
![]() |
152239c3ac | ||
![]() |
522d7f6ee4 | ||
![]() |
dfa5b46494 | ||
![]() |
04a6d5513b | ||
![]() |
843dd17aec | ||
![]() |
243df3f2cf | ||
![]() |
a260d334d0 | ||
![]() |
b1422ff6b5 | ||
![]() |
59fc68026b | ||
![]() |
9b537d81e0 | ||
![]() |
ac011132ee | ||
![]() |
1fd8de6762 | ||
![]() |
640aabe1b3 | ||
![]() |
0b54d49181 | ||
![]() |
0e6e4e8949 | ||
![]() |
344fdf94f7 | ||
![]() |
b6c488a883 | ||
![]() |
c8e29dafc6 | ||
![]() |
2cc785bf20 | ||
![]() |
6842b53425 | ||
![]() |
65588b8126 | ||
![]() |
33062dc839 | ||
![]() |
171d641092 | ||
![]() |
8d2d121b6d | ||
![]() |
117eb79953 | ||
![]() |
c58607a5b5 | ||
![]() |
8a0493b659 | ||
![]() |
8364eca708 | ||
![]() |
271446fd66 | ||
![]() |
96a45a6dde | ||
![]() |
3371fde11e | ||
![]() |
2c03980365 | ||
![]() |
621f6f59e1 | ||
![]() |
178d42c286 | ||
![]() |
20d0207890 | ||
![]() |
97017017a4 | ||
![]() |
33225bfabb | ||
![]() |
bf1dace55d | ||
![]() |
a38b885275 | ||
![]() |
0df56eaffa | ||
![]() |
af1fa724af | ||
![]() |
0bddfad14e | ||
![]() |
aa39e000f7 | ||
![]() |
ddf762b7cc | ||
![]() |
17ea732753 | ||
![]() |
25f17d7141 | ||
![]() |
f3dcbdcea9 | ||
![]() |
904fb01e75 | ||
![]() |
b853886cb7 | ||
![]() |
c96a48b9e1 | ||
![]() |
0ea245805b | ||
![]() |
3701a8cedc | ||
![]() |
5decd01299 | ||
![]() |
40fb8fa7df | ||
![]() |
9ac4712527 | ||
![]() |
aa380ea190 | ||
![]() |
d18925897a | ||
![]() |
3537d18483 | ||
![]() |
fe280fe6aa | ||
![]() |
2115e09839 | ||
![]() |
d15b88f746 | ||
![]() |
0d267a546a | ||
![]() |
2ce513f50c | ||
![]() |
bdfe3524a9 | ||
![]() |
d3f8afed29 | ||
![]() |
9499211d7d | ||
![]() |
711e283925 | ||
![]() |
94aded8d5c | ||
![]() |
b16b3859e3 | ||
![]() |
2cf0eda870 | ||
![]() |
767ac60266 | ||
![]() |
342ba2bd44 | ||
![]() |
2c1f6b24d3 | ||
![]() |
0c49262d54 | ||
![]() |
7cb8c0259d | ||
![]() |
75c47b6948 | ||
![]() |
9451f20b43 | ||
![]() |
cbff86695f | ||
![]() |
95f6032d86 | ||
![]() |
fe31d84ac6 | ||
![]() |
4fbe3590be | ||
![]() |
6e8e3cc740 | ||
![]() |
7bde0b89d1 | ||
![]() |
bd47d99ceb | ||
![]() |
87148ae0c1 | ||
![]() |
7e8bcd896a | ||
![]() |
4858ec0aef | ||
![]() |
a02e3aa651 | ||
![]() |
ae9d2a2c85 | ||
![]() |
0471ba24c1 | ||
![]() |
7471d754f7 | ||
![]() |
aa217e13b9 | ||
![]() |
d046f9c25f | ||
![]() |
ae499eb73a | ||
![]() |
a53e057d54 | ||
![]() |
9546390a1f | ||
![]() |
e4bf2a5c27 | ||
![]() |
c86e4db3a9 | ||
![]() |
bdc15960ad | ||
![]() |
ea5c9bc9b6 | ||
![]() |
8cfa6f28ea | ||
![]() |
3cae94d710 | ||
![]() |
c556c06413 | ||
![]() |
01140d3013 | ||
![]() |
c909aecd93 | ||
![]() |
4c5c6f726f | ||
![]() |
1e33b45ea8 | ||
![]() |
ff961df336 | ||
![]() |
7c48ab710a | ||
![]() |
02cd72403d | ||
![]() |
5a1ae70549 | ||
![]() |
8479da0afb | ||
![]() |
9350f68ac5 | ||
![]() |
d16a502f36 | ||
![]() |
a99c6d67bb | ||
![]() |
c7083629e1 | ||
![]() |
f68e2285e8 | ||
![]() |
0bcb981556 | ||
![]() |
e198ffb22d | ||
![]() |
f3fa9dfd9b | ||
![]() |
9e168d84d7 | ||
![]() |
89b4376e31 | ||
![]() |
7ae86d336b | ||
![]() |
dcc7021384 | ||
![]() |
7d87bf0dcc | ||
![]() |
01f9097acb | ||
![]() |
4f732477dd | ||
![]() |
a51c511d52 | ||
![]() |
243411916b | ||
![]() |
7b678ba2c8 | ||
![]() |
2d33a77ba5 | ||
![]() |
fd02f5aefc | ||
![]() |
132b98f0c2 | ||
![]() |
0249f66066 | ||
![]() |
b58615183f | ||
![]() |
979dd86730 | ||
![]() |
e13c0a7114 | ||
![]() |
8c4388bf47 | ||
![]() |
fc7638e684 | ||
![]() |
0bd5f6b27a | ||
![]() |
90e21a5902 | ||
![]() |
4d9e9198b5 | ||
![]() |
533b86d890 | ||
![]() |
ec696509b9 | ||
![]() |
f5ed2e0845 | ||
![]() |
2771827c15 | ||
![]() |
b61ea17ce1 | ||
![]() |
d134b88c68 | ||
![]() |
2347f37269 | ||
![]() |
7c98e0d303 | ||
![]() |
adcc50ac6e | ||
![]() |
b88ec44d15 | ||
![]() |
27c35befdf | ||
![]() |
f132663dfe | ||
![]() |
bc6faa733c | ||
![]() |
a4dbc57448 | ||
![]() |
7b478f718c | ||
![]() |
bb40642225 | ||
![]() |
0a2990de59 | ||
![]() |
1e42b5d131 | ||
![]() |
5085a8bbbb | ||
![]() |
2aa8787884 | ||
![]() |
0fe893b01d | ||
![]() |
33f491a8e6 | ||
![]() |
00694abbde | ||
![]() |
e07b0e42b3 | ||
![]() |
e56f6a150d | ||
![]() |
a78169b43a | ||
![]() |
25a2a46917 | ||
![]() |
662b84947b | ||
![]() |
688f3ffb19 | ||
![]() |
c161f63c9a | ||
![]() |
0d3e888147 | ||
![]() |
3e0b70af10 | ||
![]() |
e5521bb763 | ||
![]() |
1ca91a8170 | ||
![]() |
01bd6ec52a | ||
![]() |
a9e7426cff | ||
![]() |
522f6c5e00 | ||
![]() |
a14aad93cb | ||
![]() |
784bc3ea5f | ||
![]() |
da4fab66c1 | ||
![]() |
3b4035b3e2 | ||
![]() |
73350da88c | ||
![]() |
140e4791aa | ||
![]() |
08afd40823 | ||
![]() |
00a389bbb2 | ||
![]() |
a4c7add8df | ||
![]() |
2e51860464 | ||
![]() |
7824378755 | ||
![]() |
4e6ba4fccc | ||
![]() |
dc107a1a6e | ||
![]() |
2eccc96c62 | ||
![]() |
7253e83a04 | ||
![]() |
e7f69ebc5f | ||
![]() |
62af6f3a7c | ||
![]() |
239ddfc15c | ||
![]() |
7f7bcd0ab6 | ||
![]() |
009aa8d481 | ||
![]() |
ec97552c8b | ||
![]() |
0e5b2a86b8 | ||
![]() |
285a6f3532 | ||
![]() |
60a42f015e | ||
![]() |
33b0c1d5c2 | ||
![]() |
b69f9b77a7 | ||
![]() |
27c731c7b6 | ||
![]() |
ea5cc628a8 | ||
![]() |
5b207209a5 | ||
![]() |
0d225839da | ||
![]() |
2ddbc7c7fa | ||
![]() |
b9bd558abe | ||
![]() |
6ba59385d4 | ||
![]() |
f602470aeb | ||
![]() |
85a9eda143 | ||
![]() |
ec6448b353 | ||
![]() |
e4ea62cc0d | ||
![]() |
ac06195907 | ||
![]() |
1d7f3e8f07 | ||
![]() |
17a299dd00 | ||
![]() |
2705e6177d | ||
![]() |
0322eb370c | ||
![]() |
9105b56ffd |
1
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
1
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
@ -32,6 +32,7 @@ _Make sure your have performed every step and checked the applicable boxes befor
|
||||
- [ ] Searched the problem in [discussions](https://github.com/arendst/Tasmota/discussions)
|
||||
- [ ] Searched the problem in the [docs](https://tasmota.github.io/docs/FAQ)
|
||||
- [ ] Searched the problem in the [chat](https://discord.gg/Ks2Kzd4)
|
||||
- [ ] Problem is not scripter related, in this case open a discussion and tag gemu2015
|
||||
- [ ] Device used (e.g., Sonoff Basic): _____
|
||||
- [ ] Tasmota binary firmware version number used: _____
|
||||
- [ ] Pre-compiled
|
||||
|
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -6,8 +6,8 @@
|
||||
- [ ] The pull request is done against the latest development branch
|
||||
- [ ] Only relevant files were touched
|
||||
- [ ] Only one feature/fix was added per PR and the code change compiles without warnings
|
||||
- [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.6
|
||||
- [ ] The code change is tested and works with Tasmota core ESP32 V.3.0.0
|
||||
- [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.8
|
||||
- [ ] The code change is tested and works with Tasmota core ESP32 V.3.1.3.250411
|
||||
- [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla).
|
||||
|
||||
_NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_
|
||||
|
99
.github/workflows/Tasmota_build_devel.yml
vendored
99
.github/workflows/Tasmota_build_devel.yml
vendored
@ -25,35 +25,31 @@ jobs:
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: Install clang compiler
|
||||
run: |
|
||||
sudo apt-get install -f clang
|
||||
- name: Make Berry and Tasmota Berry code
|
||||
|
||||
- name: Make Berry and Solidify code
|
||||
run: |
|
||||
cd lib/libesp32/berry
|
||||
make
|
||||
cd ../berry_tasmota
|
||||
../berry/berry -s -g solidify_all.be
|
||||
- name: Matter Berry Code
|
||||
run: |
|
||||
cd lib/libesp32/berry_matter
|
||||
cd ../berry_matter
|
||||
../berry/berry -s -g solidify_all.be
|
||||
- name: Berry Animate Code
|
||||
run: |
|
||||
cd lib/libesp32/berry_animate
|
||||
cd ../berry_animate
|
||||
../berry/berry -s -g solidify_all.be
|
||||
- name: LVGL Berry Code
|
||||
run: |
|
||||
cd lib/libesp32_lvgl/lv_binding_berry
|
||||
cd ../../libesp32_lvgl/lv_binding_berry
|
||||
../../libesp32/berry/berry -s -g solidify_all.be
|
||||
- name: HASPmota Berry Code
|
||||
run: |
|
||||
cd lib/libesp32_lvgl/lv_haspmota
|
||||
cd ../lv_haspmota
|
||||
../../libesp32/berry/berry -s -g solidify_all.be
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: '["berry_tasmota", "berry_matter", "berry_animate", "berry_lvgl", "berry_haspmota", "berry_header"]'
|
||||
path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_animate/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32_lvgl/lv_haspmota/src/solidify", "./lib/libesp32/berry/generate"]'
|
||||
name: berry
|
||||
path: |
|
||||
./lib/libesp32/berry_tasmota/src/solidify
|
||||
./lib/libesp32/berry_matter/src/solidify
|
||||
./lib/libesp32/berry_animate/src/solidify
|
||||
./lib/libesp32_lvgl/lv_binding_berry/src/solidify
|
||||
./lib/libesp32_lvgl/lv_haspmota/src/solidify
|
||||
./lib/libesp32/berry/generate
|
||||
|
||||
push_solidified:
|
||||
needs: be_solidify
|
||||
@ -66,22 +62,19 @@ jobs:
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- uses: jason2866/download-artifact@v3.0.4
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: |
|
||||
berry_tasmota
|
||||
berry_matter
|
||||
berry_animate
|
||||
berry_lvgl
|
||||
berry_haspmota
|
||||
berry_header
|
||||
path: |
|
||||
./lib/libesp32/berry_tasmota/src/solidify
|
||||
./lib/libesp32/berry_matter/src/solidify
|
||||
./lib/libesp32/berry_animate/src/solidify
|
||||
./lib/libesp32_lvgl/lv_binding_berry/src/solidify
|
||||
./lib/libesp32_lvgl/lv_haspmota/src/solidify
|
||||
./lib/libesp32/berry/generate
|
||||
pattern: berry
|
||||
path: berry
|
||||
- name: Move solidified Berry files back
|
||||
run: |
|
||||
ls -R ./berry
|
||||
mv berry/berry/libesp32/berry_tasmota/src/solidify/* ./lib/libesp32/berry_tasmota/src/solidify
|
||||
mv berry/berry/libesp32/berry_matter/src/solidify/* ./lib/libesp32/berry_matter/src/solidify
|
||||
mv berry/berry/libesp32/berry_animate/src/solidify/* ./lib/libesp32/berry_animate/src/solidify
|
||||
mv berry/berry/libesp32_lvgl/lv_binding_berry/src/solidify/* ./lib/libesp32_lvgl/lv_binding_berry/src/solidify
|
||||
mv berry/berry/libesp32_lvgl/lv_haspmota/src/solidify/* ./lib/libesp32_lvgl/lv_haspmota/src/solidify
|
||||
mv berry/berry/libesp32/berry/generate/* ./lib/libesp32/berry/generate
|
||||
- uses: stefanzweifel/git-auto-commit-action@v5
|
||||
with:
|
||||
commit_message: Solidified Code updated
|
||||
@ -129,9 +122,9 @@ jobs:
|
||||
#run: |
|
||||
#cp ./build_output/firmware/tasmota32solo1-safeboot.bin ./build_output/firmware/tasmota32-safeboot.bin
|
||||
- name: Upload safeboot firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base-images:
|
||||
@ -172,9 +165,9 @@ jobs:
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base32-images:
|
||||
@ -214,10 +207,14 @@ jobs:
|
||||
pip install -U platformio
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add SHA to footer
|
||||
run: |
|
||||
COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "")
|
||||
@ -226,9 +223,9 @@ jobs:
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
language-images:
|
||||
@ -239,7 +236,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
variant: [ tasmota, tasmota32 ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@ -254,10 +251,14 @@ jobs:
|
||||
pip install -U platformio
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add SHA to footer
|
||||
run: |
|
||||
COMMIT_SHA_LONG=$(git rev-parse --short HEAD || echo "")
|
||||
@ -266,9 +267,9 @@ jobs:
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }}
|
||||
- name: Upload language firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}-${{ matrix.language }}
|
||||
path: ./build_output
|
||||
|
||||
Start_final_copy:
|
||||
|
64
.github/workflows/Tasmota_build_master.yml
vendored
64
.github/workflows/Tasmota_build_master.yml
vendored
@ -51,9 +51,9 @@ jobs:
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload safeboot firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base-images:
|
||||
@ -92,9 +92,9 @@ jobs:
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base32-images:
|
||||
@ -134,22 +134,23 @@ jobs:
|
||||
pip install -U platformio
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
- name: Display downloaded files
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
ls -R ./firmware/
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add "release" to footer
|
||||
run: |
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- name: Upload firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
language-images:
|
||||
@ -160,7 +161,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
variant: [ tasmota, tasmota32 ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@ -175,22 +176,23 @@ jobs:
|
||||
pip install -U platformio
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./firmware
|
||||
- name: Display downloaded files
|
||||
pattern: tasmota32*
|
||||
path: ./temp
|
||||
- name: Move safeboot files
|
||||
run: |
|
||||
ls -R ./firmware/
|
||||
mkdir -p ./firmware/firmware
|
||||
find ./temp -type f -exec cp -t ./firmware/firmware {} +
|
||||
- name: Add "release" to footer
|
||||
run: |
|
||||
sed -i -e "s/TASMOTA_SHA_SHORT/TASMOTA_SHA_SHORT release-/g" ./tasmota/include/tasmota_version.h
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }}
|
||||
- name: Upload language firmware artifacts
|
||||
uses: jason2866/upload-artifact@v2.0.3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}-${{ matrix.language }}
|
||||
path: ./build_output
|
||||
|
||||
Release:
|
||||
@ -199,28 +201,24 @@ jobs:
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Download Tasmota firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
- name: Download all Tasmota artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
path: ./mv_firmware
|
||||
- name: Download safeboot firmwares
|
||||
uses: jason2866/download-artifact@v3.0.4
|
||||
with:
|
||||
name: firmware_safeboot
|
||||
path: ./mv_firmware
|
||||
pattern: tasmota*
|
||||
path: ./temp
|
||||
- name: Move files
|
||||
run: |
|
||||
mkdir -p ./release
|
||||
find ./temp -type f -exec cp -t ./release {} +
|
||||
- name: Display structure of downloaded files
|
||||
run: ls -R ./mv_firmware/
|
||||
- name: Zip all map.gz files in one file -> map_all.zip
|
||||
run: 7z a -mx=9 -tzip -xr'!.*' map_all.zip mv_firmware/map
|
||||
run: ls -R ./release/
|
||||
- name: Release
|
||||
uses: jason2866/action-gh-release@v1.2
|
||||
#if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
tag_name: ${{ github.run_number }}
|
||||
files: |
|
||||
./mv_firmware/firmware/*
|
||||
map_all.zip
|
||||
./release/tasmota*
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
22
.github/workflows/build_all_the_things.yml
vendored
22
.github/workflows/build_all_the_things.yml
vendored
@ -25,7 +25,7 @@ jobs:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
variant:
|
||||
- tasmota32solo1-safeboot
|
||||
- tasmota32-webcam
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
@ -41,9 +41,9 @@ jobs:
|
||||
#platformio update
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
os-check-mac:
|
||||
@ -53,7 +53,7 @@ jobs:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
variant:
|
||||
- tasmota32-webcam
|
||||
- tasmota32solo1-safeboot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
@ -69,9 +69,9 @@ jobs:
|
||||
#platformio update
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
base-images:
|
||||
@ -128,9 +128,9 @@ jobs:
|
||||
cp ./platformio_override_sample.ini ./platformio_override.ini
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}
|
||||
path: ./build_output
|
||||
|
||||
language-images:
|
||||
@ -140,7 +140,7 @@ jobs:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
variant: [ tasmota ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
language: [ AD, AF, BG, BR, CN, CZ, DE, ES, FR, FY, GR, HE, HU, IT, KO, LT, NL, PL, PT, RO, RU, SE, SK, TR, TW, UK, VN ]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python
|
||||
@ -156,7 +156,7 @@ jobs:
|
||||
#platformio update
|
||||
- name: Run PlatformIO
|
||||
run: platformio run -e ${{ matrix.variant }}-${{ matrix.language }}
|
||||
- uses: jason2866/upload-artifact@v2.0.3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: firmware
|
||||
name: ${{ matrix.variant }}-${{ matrix.language }}
|
||||
path: ./build_output
|
||||
|
13
.gitignore
vendored
13
.gitignore
vendored
@ -8,17 +8,23 @@
|
||||
*.o
|
||||
*.gcno
|
||||
*.gcda
|
||||
dependencies.lock
|
||||
|
||||
## Project files ######
|
||||
managed_components
|
||||
.platformio
|
||||
.pio
|
||||
.clang_complete
|
||||
.gcc-flags.json
|
||||
.cache
|
||||
.dummy
|
||||
sdkconfig.*
|
||||
data
|
||||
unpacked_fs
|
||||
unpacked_boards
|
||||
tasmota/user_config_override.h
|
||||
tasmota/include/local_ca_data.h
|
||||
tasmota/include/local_ca_descriptor.h
|
||||
variants
|
||||
variants3
|
||||
build
|
||||
@ -42,3 +48,10 @@ lib/libesp32/berry/berry
|
||||
.vscode/extensions.json
|
||||
*.bak
|
||||
*.code-workspace
|
||||
|
||||
## IntelliJ ######
|
||||
.idea
|
||||
|
||||
## Python virtual environments for Platformio ##
|
||||
venv
|
||||
.venv
|
||||
|
43
BUILDS.md
43
BUILDS.md
@ -8,16 +8,19 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| ------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | --------------------------- |
|
||||
| MY_LANGUAGE en_GB | x | x / x | x | x | x | x |
|
||||
| USE_IMPROV | x | x / x | x | x | x | x |
|
||||
| USE_UFILESYS | - | - / x | - | - | - | - |
|
||||
| USE_UFILESYS | - | - / x | - | - | - | - | Every ESP8266 > 1MB |
|
||||
| USE_ARDUINO_OTA | - | - / - | - | - | - | - |
|
||||
| USE_DOMOTICZ | - | x / x | x | x | x | - |
|
||||
| USE_HOME_ASSISTANT | - | - / - | - | - | - | - |
|
||||
| USE_TASMOTA_DISCOVERY | x | x / x | x | x | x | x |
|
||||
| USE_MQTT_TLS\* | - | - / x | - | - | - | - |
|
||||
| USE_MQTT_CLIENT_CERT | - | - / - | - | - | - | - |
|
||||
| USE_MQTT_AWS_IOT | - | - / - | - | - | - | - |
|
||||
| USE_4K_RSA | - | - / - | - | - | - | - |
|
||||
| USE_TELEGRAM | - | - / - | - | - | - | - |
|
||||
| USE_KNX | - | - / x | x | - | - | - |
|
||||
| USE_TELNET | - | - / - | - | - | - | - |
|
||||
| USE_XYZMODEM | - | - / - | - | - | - | - |
|
||||
| USE_WEBSERVER | x | x / x | x | x | x | x |
|
||||
| USE_WEBSEND_RESPONSE | - | - / - | - | - | - | - |
|
||||
| USE_EMULATION_HUE | x | x / x | - | x | - | - |
|
||||
@ -30,11 +33,14 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| USE_SUNRISE | x | x / x | x | x | x | x |
|
||||
| USE_RULES | x | x / x | x | x | x | x |
|
||||
| USE_SCRIPT | - | - / - | - | - | - | - |
|
||||
| USE_EXPRESSION | - | - / x | - | - | - | - | Every ESP32 + ESP8266 > 1MB |
|
||||
| SUPPORT_IF_STATEMENT | - | - / x | - | - | - | - | Every ESP32 + ESP8266 > 1MB |
|
||||
| USE_EXPRESSION | - | x / x | - | - | - | - |
|
||||
| SUPPORT_IF_STATEMENT | - | x / x | - | - | - | - |
|
||||
| USE_HOTPLUG | - | - / - | - | - | - | - |
|
||||
| USE_PROMETHEUS | - | - / - | - | - | - | - |
|
||||
| USE_PING | - | - / - | - | - | - | - |
|
||||
| USE_HDMI_CEC | - | - / - | - | - | - | - |
|
||||
| USE_MAGIC_SWITCH | - | - / x | - | - | - | - |
|
||||
| USE_GPIO_VIEWER | - | - / x | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| ROTARY_V1 | - | x / x | - | x | - | - |
|
||||
@ -101,10 +107,19 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_I2C | - | x / x | x | x | - | x |
|
||||
| USE_RTC_CHIPS | - | - / x | - | - | - | - |
|
||||
| -USE_BM8563 | - | - / x | - | - | - | - |
|
||||
| -USE_DS3231 | - | - / - | - | - | - | - |
|
||||
| -USE_PCF85063 | - | - / - | - | - | - | - |
|
||||
| -USE_PCF85363 | - | - / - | - | - | - | - |
|
||||
| -USE_RX8010 | - | - / - | - | - | - | - |
|
||||
| USE_SHT | - | - / x | - | x | - | - |
|
||||
| USE_HTU | - | - / x | - | x | - | - |
|
||||
| USE_BMP | - | - / x | - | x | - | - |
|
||||
| USE_BME68X | - | - / x | - | x | - | - |
|
||||
| -USE_BME68X | - | - / x | - | x | - | - |
|
||||
| USE_AMSX915 | - | - / - | - | - | - | - |
|
||||
| USE_SPL06_007 | - | - / - | - | - | - | - |
|
||||
| USE_QMP6988 | - | - / - | - | - | - | - |
|
||||
| USE_BH1750 | - | - / x | - | x | - | - |
|
||||
| USE_VEML6070 | - | - / x | - | x | - | - |
|
||||
| USE_ADS1115 | - | - / x | - | x | - | - |
|
||||
@ -133,7 +148,6 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| USE_ENS16x | - | - / - | - | - | - | - |
|
||||
| USE_ENS210 | - | - / - | - | - | - | - |
|
||||
| USE_MPU6050 | - | - / - | - | - | - | - |
|
||||
| USE_DS3231 | - | - / - | - | - | - | - |
|
||||
| USE_MGC3130 | - | - / - | - | - | - | - |
|
||||
| USE_MAX44009 | - | - / - | - | - | - | - |
|
||||
| USE_SCD30 | - | - / x | - | x | - | - |
|
||||
@ -181,22 +195,22 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| USE_EZORTD | - | - / - | - | - | - | - |
|
||||
| USE_SEESAW_SOIL | - | - / - | - | - | - | - |
|
||||
| USE_TOF10120 | - | - / - | - | - | - | - |
|
||||
| USE_BM8563 | - | - / - | - | - | - | - |
|
||||
| USE_AM2320 | - | - / - | - | - | - | - |
|
||||
| USE_T67XX | - | - / - | - | - | - | - |
|
||||
| USE_HM330X | - | - / - | - | - | - | - |
|
||||
| USE_HDC2010 | - | - / - | - | - | - | - |
|
||||
| USE_PCF85363 | - | - / - | - | - | - | - |
|
||||
| USE_DS3502 | - | - / - | - | - | - | - |
|
||||
| USE_HYT | - | - / - | - | - | - | - |
|
||||
| USE_LUXV30B | - | - / - | - | - | - | - |
|
||||
| USE_HMC5883L | - | - / - | - | - | - | - |
|
||||
| USE_QMC5883L | - | - / - | - | - | - | - |
|
||||
| USE_MAX17043 | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| **Feature or Sensor** | **l** | **t** | **k** | **s** | **i** | **d** | **Remarks** |
|
||||
| USE_SPI | - | - / - | - | - | - | x |
|
||||
| USE_SPI | - | - / x | - | - | - | x |
|
||||
| USE_RC522 | - | - / - | - | - | - | - |
|
||||
| USE_CANSNIFFER | - | - / - | - | - | - | - |
|
||||
| USE_SPI_LORA | - | - / x | - | - | - | - |
|
||||
| USE_MHZ19 | - | - / x | - | x | - | - |
|
||||
| USE_SENSEAIR | - | - / x | - | x | - | - |
|
||||
| USE_PMS5003 | - | - / x | - | x | - | - |
|
||||
@ -217,9 +231,15 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| USE_MIEL_HVAC | - | - / - | - | - | - | - |
|
||||
| USE_PROJECTOR_CTRL | - | - / - | - | - | - | - |
|
||||
| USE_AS608 | - | - / - | - | - | - | - |
|
||||
| USE_LD2402 | - | - / - | - | - | - | - |
|
||||
| USE_LD2410 | - | - / - | - | - | - | - |
|
||||
| USE_LD2410S | - | - / - | - | - | - | - |
|
||||
| USE_GM861 | - | - / - | - | - | - | - |
|
||||
| USE_TCP_BRIDGE | - | - / - | - | - | - | - | zbbridge / zbbrdgpro |
|
||||
| USE_HC8 | - | - / - | - | - | - | - |
|
||||
| USE_PIPSOLAR | - | - / - | - | - | - | - |
|
||||
| USE_WOOLIIS | - | - / - | - | - | - | - |
|
||||
| USE_C8_CO2_5K | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_NRF24 | - | - / - | - | - | - | - |
|
||||
| USE_MIBLE | - | - / - | - | - | - | - |
|
||||
@ -231,11 +251,14 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| USE_IR_RECEIVE | - | x / - | x | x | x | x |
|
||||
| USE_IR_REMOTE_FULL | - | - / - | - | - | x | - | Enable ALL protocols |
|
||||
| | | | | | | |
|
||||
| USE_WIZMOTE | - | - / - | - | - | - | - |
|
||||
| | | | | | | |
|
||||
| USE_SR04 | - | - / - | - | x | - | - |
|
||||
| USE_ME007 | - | - / - | - | - | - | - |
|
||||
| USE_DYP | - | - / - | - | - | - | - |
|
||||
| USE_TM1638 | - | - / x | - | x | - | - |
|
||||
| USE_HX711 | - | - / x | - | x | - | - |
|
||||
| -USE_HX711_M5SCALES | - | - / - | - | - | - | - |
|
||||
| USE_TX2x_WIND_SENSOR | - | - / - | - | - | - | - |
|
||||
| USE_WINDMETER | - | - / - | - | - | - | - |
|
||||
| USE_RC_SWITCH | - | - / x | - | x | - | - |
|
||||
@ -267,11 +290,11 @@ Note: the `minimal` variant is not listed as it shouldn't be used outside of the
|
||||
| USE_WEBCAM | | / - | | | | |
|
||||
| USE_ETHERNET | | / x | | | | |
|
||||
| USE_I2S_AUDIO | | / - | | | | |
|
||||
| USE_TTGO_WATCH | | / - | | | | |
|
||||
| USE_SONOFF_SPM | | / x | | | | |
|
||||
| USE_DISPLAY_TM1621_SONOFF | | / x | | | | |
|
||||
| USE_SHELLY_PRO | | / x | | | | |
|
||||
| USE_DALI | | / - | | | | |
|
||||
| USE_ESP32_TWAI | | / x | | | | |
|
||||
| USE_DALI | | / x | | | | |
|
||||
| USE_DINGTIAN_RELAY | | / - | | | | |
|
||||
| USE_MATTER_DEVICE | | / x | | | | | See SetOption151 |
|
||||
|
||||
|
784
CHANGELOG.md
784
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
8
CMakeLists.txt
Normal file
8
CMakeLists.txt
Normal file
@ -0,0 +1,8 @@
|
||||
cmake_minimum_required(VERSION 3.16.0)
|
||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||
|
||||
project(tasmota)
|
||||
|
||||
if(CONFIG_IDF_TARGET_ESP32C2)
|
||||
include(relinker)
|
||||
endif()
|
@ -85,12 +85,13 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xdrv_71_magic_switch | @barbudor
|
||||
| xdrv_72_pipsolar | @chefpro
|
||||
| xdrv_73_lora | @arendst
|
||||
| xdrv_74 |
|
||||
| xdrv_75 |
|
||||
| xdrv_76 |
|
||||
| xdrv_77 |
|
||||
| xdrv_78 |
|
||||
| xdrv_74_lorawan | @arendst
|
||||
| xdrv_75_dali | @eeak, @arendst
|
||||
| xdrv_76_serial_i2c | @s-hadinger
|
||||
| xdrv_77_wizmote | @arendst
|
||||
| xdrv_78_telnet | @arendst
|
||||
| xdrv_79_esp32_ble | @staars, @btsimonh
|
||||
| xdrv_80 |
|
||||
| xdrv_81_esp32_webcam | @gemu, @philrich
|
||||
| xdrv_82_esp32_ethernet | @arendst
|
||||
| xdrv_83_esp32_watch | @gemu
|
||||
@ -98,13 +99,14 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xdrv_86_esp32_sonoff_spm | @arendst
|
||||
| xdrv_87_esp32_sonoff_tm1621 | @arendst
|
||||
| xdrv_88_esp32_shelly_pro | @arendst
|
||||
| xdrv_89_esp32_dali | @eeak
|
||||
| xdrv_89_ |
|
||||
| xdrv_90_esp32_dingtian_relay | @barbudor
|
||||
| xdrv_91_ |
|
||||
| xdrv_92_ |
|
||||
| xdrv_93_ |
|
||||
| xdrv_94_ |
|
||||
| |
|
||||
| xdrv_120_xyzmodem | @arendst
|
||||
| xdrv_121_gpioviewer | @arendst
|
||||
| xdrv_122_file_settings_demo | @arendst
|
||||
| xdrv_122_file_json_settings_demo | @arendst
|
||||
@ -139,7 +141,7 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xsns_25_spl06-007_sensor | @rai68
|
||||
| xsns_26_lm75ad | Andre Thomas
|
||||
| xsns_27_apds9960 | Shawn Hymel
|
||||
| xsns_28 |
|
||||
| xsns_28_qmp6988 | @arendst
|
||||
| xsns_29_mcp230xx | Andre Thomas
|
||||
| xsns_30_mpr121 | Rene 'Renne' Bartsch
|
||||
| xsns_31_ccs811 | Gerhard Mutz
|
||||
@ -229,6 +231,8 @@ In addition to @arendst the following code is mainly owned by:
|
||||
| xsns_112_ens210 | Christoph Friese
|
||||
| xsns_113_hc8 | Daniel Maier
|
||||
| xsns_114_amsx915 | Bastian Urschel
|
||||
| xsns_115_wooliis | Luca Melette
|
||||
| xsns_117_c8_co2_5k | @jeroenvermeulen
|
||||
| |
|
||||
| xsns_127_esp32_sensors | @arendst
|
||||
| |
|
||||
|
@ -14,11 +14,11 @@ If you like **Tasmota**, give it a star, or fork it and contribute!
|
||||
[](https://github.com/arendst/Tasmota/network)
|
||||
[](https://paypal.me/tasmota)
|
||||
|
||||
See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/tasmota/CHANGELOG.md) for changes since last release.
|
||||
See [CHANGELOG.md](https://github.com/arendst/Tasmota/blob/development/CHANGELOG.md) for changes since last release.
|
||||
|
||||
## Development
|
||||
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](http://ota.tasmota.com/tasmota/)
|
||||
[](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+CI%22)
|
||||
[](https://github.com/arendst/Tasmota/actions?query=workflow%3A%22Tasmota+ESP32+CI%22)
|
||||
|
@ -32,7 +32,7 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
||||
13 | USE_ADS1115 | xsns_12 | ADS1115 | 0x48 - 0x4B | Yes | 4-channel 16-bit A/D converter
|
||||
14 | USE_INA219 | xsns_13 | INA219 | 0x40 - 0x41, 0x44 - 0x45 | | Low voltage current sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHT3X | 0x44 - 0x45 | Yes | Temperature and Humidity sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHT4X | 0x44 - 0x45 | Yes | Temperature and Humidity sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHT4X | 0x44 - 0x46 | Yes | Temperature and Humidity sensor
|
||||
15 | USE_SHT3X | xsns_14 | SHTCX | 0x70 | Yes | Temperature and Humidity sensor
|
||||
16 | USE_TSL2561 | xsns_16 | TSL2561 | 0x29, 0x39, 0x49 | | Light intensity sensor
|
||||
17 | USE_MGS | xsns_19 | Grove | 0x04 | | Multichannel gas sensor
|
||||
@ -123,7 +123,12 @@ Index | Define | Driver | Device | Address(es) | Bus2 | Descrip
|
||||
83 | USE_MAX17043 | xsns_110 | MAX17043 | 0x36 | | Fuel-gauge for 3.7 Volt Lipo battery
|
||||
84 | USE_ENS16x | xsns_111 | ENS16x | 0x52 - 0x53 | | Gas (TVOC, eCO2) and air quality sensor
|
||||
85 | USE_ENS210 | xsns_112 | ENS210 | 0x43 - 0x44 | | Temperature and humidity sensor
|
||||
86 | USE_AMSX915 | xsns_114 | AMS5915 | 0x28 | | Pressure (absolute/differential) and temperature sensor
|
||||
86 | USE_AMSX915 | xsns_114 | AMS6915 | 0x28 | | Pressure (absolute/differential) and temperature sensor
|
||||
87 | USE_SPL06_007 | xsns_25 | SPL06-007 | 0x76 | | Pressure and temperature sensor
|
||||
87 | USE_SPL06_007 | xsns_25 | SPL06-007 | 0x76 | | Pressure and temperature sensor
|
||||
88 | USE_QMP6988 | xsns_28 | QMP6988 | 0x56, 0x70 | Yes | Pressure and temperature sensor
|
||||
89 | USE_HX711_M5SCALES | xsns_34 | M5SCALES | 0x26 | Yes | M5Unit (Mini)Scales(HX711 STM32) U177
|
||||
90 | USE_RX8010 | xdrv_56 | RX8010 | 0x32 | Yes | RX8010 RTC from IOTTIMER
|
||||
91 | USE_MS5837 | xsns_116 | MS5837 | 0x76 | | Pressure and temperature sensor
|
||||
92 | USE_PCF85063 | xdrv_56 | PCF85063 | 0x51 | | PCF85063 Real time clock
|
||||
|
||||
NOTE: Bus2 supported on ESP32 only.
|
||||
|
@ -94,4 +94,4 @@ Module | LCode | Description
|
||||
06 TTGO Watch | x | TTGO Watch
|
||||
07 M5Stack Core2 | x | M5Stack Core2
|
||||
|
||||
Over 2500 additional devices are supported using [templates](TEMPLATES.md).
|
||||
Over 2800 additional devices are supported using [templates](TEMPLATES.md).
|
||||
|
@ -31,7 +31,7 @@ Firmware binaries can be downloaded from http://ota.tasmota.com/tasmota/release/
|
||||
|
||||
## Development
|
||||
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](https://github.com/arendst/Tasmota)
|
||||
[](http://ota.tasmota.com/tasmota/)
|
||||
[](https://github.com/arendst/Tasmota/actions/workflows/build_all_the_things.yml)
|
||||
[](https://github.com/arendst/Tasmota/actions/workflows/Tasmota_build_devel.yml)
|
||||
|
151
RELEASENOTES.md
151
RELEASENOTES.md
@ -34,16 +34,11 @@ While fallback or downgrading is common practice it was never supported due to S
|
||||
|
||||
## Supported Core versions
|
||||
|
||||
This release will be supported from ESP8266/Arduino library Core version **2.7.6** due to reported security and stability issues on previous Core version. This will also support gzipped binaries.
|
||||
This release will be supported from ESP8266/Arduino library Core version **2.7.8** due to reported security and stability issues on previous Core version. This will also support gzipped binaries.
|
||||
|
||||
This release will be supported from ESP32/Arduino library Core version **3.0.0**.
|
||||
This release will be supported from ESP32/Arduino library Core version **v3.1.3.250411**.
|
||||
|
||||
Support of ESP8266 Core versions before 2.7.6 and ESP32 Core versions before 3.0.0 have been removed.
|
||||
|
||||
### Known issues with v14.0.0
|
||||
|
||||
Due to the change from ESP32 Arduino Core2/IDF4 to Arduino Core3/IDF5 not all functionality has been restored. The following features are known not to work on ESP32:
|
||||
- Wifi Range Extender [#21200](https://github.com/arendst/Tasmota/issues/21200)
|
||||
Support of ESP8266 Core versions before 2.7.8 and ESP32 Core versions before v3.1.3.250411 have been removed.
|
||||
|
||||
## Support of TLS
|
||||
|
||||
@ -60,7 +55,7 @@ Easy initial installation of Tasmota can be performed using the [Tasmota WebInst
|
||||
## Provided Binary Downloads
|
||||
|
||||
### ESP8266 or ESP8285 based
|
||||
The following binary downloads have been compiled with ESP8266/Arduino library core version **2.7.6**.
|
||||
The following binary downloads have been compiled with ESP8266/Arduino library core version **2.7.8**.
|
||||
|
||||
- **tasmota.bin** = The Tasmota version with most drivers for 1M+ flash. **RECOMMENDED RELEASE BINARY**
|
||||
- **tasmota-4M.bin** = The Tasmota version with most drivers and filesystem for 4M+ flash.
|
||||
@ -80,12 +75,12 @@ Latest released binaries can be downloaded from
|
||||
- http://ota.tasmota.com/tasmota/release
|
||||
|
||||
Historical binaries can be downloaded from
|
||||
- http://ota.tasmota.com/tasmota/release-13.4.0
|
||||
- http://ota.tasmota.com/tasmota/release-14.6.0
|
||||
|
||||
The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz``
|
||||
|
||||
### ESP32, ESP32-C2, ESP32-C3, ESP32-C6, ESP32-S2 and ESP32-S3 based
|
||||
The following binary downloads have been compiled with ESP32/Arduino library core version **3.0.0**.
|
||||
The following binary downloads have been compiled with ESP32/Arduino library core version **v3.1.3.250411**.
|
||||
|
||||
- **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY**
|
||||
- **tasmota32solo1.bin** = The Tasmota version with most drivers including additional sensors and KNX for single core ESP32 and 4M+ flash.
|
||||
@ -93,7 +88,7 @@ The following binary downloads have been compiled with ESP32/Arduino library cor
|
||||
- **tasmota32s2cdc.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-S2 with serial over embedded USB CDC only and 4M+ flash.
|
||||
- **tasmota32s3.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-S3 with USB HWCDC and fallback to serial and 4M+ flash.
|
||||
- **tasmota32c2.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C2 with serial and 4M+ flash.
|
||||
- **tasmota32c3.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C2 with USB HWCDC and fallback to serial and 4M+ flash.
|
||||
- **tasmota32c3.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3 with USB HWCDC and fallback to serial and 4M+ flash.
|
||||
- **tasmota32c6.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C6 with USB HWCDC and fallback to serial and 4M+ flash.
|
||||
- **tasmota32-AD.bin** to **tasmota32-VN.bin** = The Tasmota version in different languages for 4M+ flash.
|
||||
- **tasmota32-bluetooth.bin** = The Bluetooth version adds BLE support for 4M+ flash.
|
||||
@ -109,7 +104,7 @@ Latest released binaries can be downloaded from
|
||||
- https://ota.tasmota.com/tasmota32/release
|
||||
|
||||
Historical binaries can be downloaded from
|
||||
- https://ota.tasmota.com/tasmota32/release-13.4.0
|
||||
- https://ota.tasmota.com/tasmota32/release-14.6.0
|
||||
|
||||
The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasmota.com/tasmota32/release/tasmota32.bin``
|
||||
|
||||
@ -119,137 +114,17 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
|
||||
|
||||
[Complete list](BUILDS.md) of available feature and sensors.
|
||||
|
||||
## Changelog v13.4.1.2
|
||||
## Changelog v14.6.0.1
|
||||
### Added
|
||||
- PlatformIO target reset [#21292](https://github.com/arendst/Tasmota/issues/21292)
|
||||
- Command ``Wifi 6`` to enable 11ax on ESP32
|
||||
- Command ``PowerLock`` to disable power control of selected outputs [#21081](https://github.com/arendst/Tasmota/issues/21081)
|
||||
- Command ``Publish3`` to send binary data encoded as Hex, disabled in safeboot [#21329](https://github.com/arendst/Tasmota/issues/21329)
|
||||
- Support for calculated heat index if temperature and humidity is available with ``#define USE_HEAT_INDEX`` [#4771](https://github.com/arendst/Tasmota/issues/4771)
|
||||
- Support for LoRa and single channel EU863-870 LoRaWanBridge [#17790](https://github.com/arendst/Tasmota/issues/17790)
|
||||
- Support for AMS5915/AMS6915 temperature and pressure sensors [#20814](https://github.com/arendst/Tasmota/issues/20814)
|
||||
- Support for LWT messages in TasMesh [#20392](https://github.com/arendst/Tasmota/issues/20392)
|
||||
- Support IR data larger than 64 bits [#20831](https://github.com/arendst/Tasmota/issues/20831)
|
||||
- Support for MCP23S08 [#20971](https://github.com/arendst/Tasmota/issues/20971)
|
||||
- Support for ESP32-S3 120Mhz [#20973](https://github.com/arendst/Tasmota/issues/20973)
|
||||
- Support Azure iothub direct method [#21013](https://github.com/arendst/Tasmota/issues/21013)
|
||||
- Support for Domoticz non-persistent ``DzIdx5`` to ``DzIdx32`` and disabling DOMOTICZ_OUT_TOPIC subscribe using command ``DzIdx0 0`` [#21019](https://github.com/arendst/Tasmota/issues/21019)
|
||||
- Support SPI GPIO configuration for Universal Touch Screen [#21025](https://github.com/arendst/Tasmota/issues/21025)
|
||||
- Support for SPL06_007 pressure and temperature sensor [#21185](https://github.com/arendst/Tasmota/issues/21185)
|
||||
- Support for AHT30 Temperature and Humidity Sensor [#19922](https://github.com/arendst/Tasmota/issues/19922)
|
||||
- Support for compile time hostname with `#define WIFI_DEFAULT_HOSTNAME` (#21236)[#21236](https://github.com/arendst/Tasmota/issues/21236)
|
||||
- GPIOViewer pin mode support
|
||||
- Zigbee support for attributes of type `uint48` used by energy monitoring [#20992](https://github.com/arendst/Tasmota/issues/20992)
|
||||
- QMC5883l check for overflow and scale reading [#20643](https://github.com/arendst/Tasmota/issues/20643)
|
||||
- TCP Serial bridge GPIO type `TCP Tx En` [#21269](https://github.com/arendst/Tasmota/issues/21269)
|
||||
- ESP32 esp32_partition_app3904k_fs3392k partition scheme for 8MB ESP32S3 [#21241](https://github.com/arendst/Tasmota/issues/21241)
|
||||
- ESP32 Compile option disabling PSRam check to avoid "blinking" of GPIO 16/17 at startup [#21282](https://github.com/arendst/Tasmota/issues/21282)
|
||||
- Berry explicit error log when memory allocation fails [#20807](https://github.com/arendst/Tasmota/issues/20807)
|
||||
- Berry `path.rename()` [#20840](https://github.com/arendst/Tasmota/issues/20840)
|
||||
- Berry `string.startswith`, `string.endswith` and `%q` format [#20909](https://github.com/arendst/Tasmota/issues/20909)
|
||||
- Berry `close()` to class `serial` [#21042](https://github.com/arendst/Tasmota/issues/21042)
|
||||
- Berry `flash.current_ota` [#21097](https://github.com/arendst/Tasmota/issues/21097)
|
||||
- Berry `webserver.content_close()` [#21276](https://github.com/arendst/Tasmota/issues/21276)
|
||||
- Berry wave file recorder [#21315](https://github.com/arendst/Tasmota/issues/21315)
|
||||
- Berry `after_teleperiod` event matching `FUNC_AFTER_TELEPERIOD` [#21351](https://github.com/arendst/Tasmota/issues/21351)
|
||||
- LVGL and HASPmota typicons font [#20742](https://github.com/arendst/Tasmota/issues/20742)
|
||||
- LVGL `lv.draw_label_dsc` and `lv_bar.get_indic_area` [#20936](https://github.com/arendst/Tasmota/issues/20936)
|
||||
- HASPmota `p<x>b<y>.delete` to delete an object [#20735](https://github.com/arendst/Tasmota/issues/20735)
|
||||
- HASPmota improve arc and img [#20894](https://github.com/arendst/Tasmota/issues/20894)
|
||||
- HASPmota support for scale, percentages [#20974](https://github.com/arendst/Tasmota/issues/20974)
|
||||
- HASPmota `dropdown_list` and fixes [#21208](https://github.com/arendst/Tasmota/issues/21208)
|
||||
- HASPmota demo of Renaissance Watch for 480x480 displays [#21290](https://github.com/arendst/Tasmota/issues/21290)
|
||||
- Command `JsonPP 0..7` to enable (>0) JSON Pretty Print on user interfaces and set number of indents
|
||||
- Command `JsonPP <command>|backlog <command>;...` to enable JSON PP only once
|
||||
|
||||
### Breaking Changed
|
||||
- Drop support for old (insecure) fingerprint format [#20842](https://github.com/arendst/Tasmota/issues/20842)
|
||||
- Removed dedicated touch drivers in favour of Universal Touch driver [#21146](https://github.com/arendst/Tasmota/issues/21146)
|
||||
- ESP32-C3 OTA binary name from `tasmota32c3cdc.bin` to `tasmota32c3.bin` with USB HWCDC and fallback to serial [#21212](https://github.com/arendst/Tasmota/issues/21212)
|
||||
- ESP32-C6 OTA binary name from `tasmota32c6cdc.bin` to `tasmota32c6.bin` with USB HWCDC and fallback to serial [#21212](https://github.com/arendst/Tasmota/issues/21212)
|
||||
- ESP32-S3 OTA binary name from `tasmota32s3cdc.bin` to `tasmota32s3.bin` with USB HWCDC and fallback to serial [#21212](https://github.com/arendst/Tasmota/issues/21212)
|
||||
- Berry loading .be file does not generated .bec anymore [#21075](https://github.com/arendst/Tasmota/issues/21075)
|
||||
- LVGL remove embedded typicons font [#20872](https://github.com/arendst/Tasmota/issues/20872)
|
||||
- LVGL remove `textarea` and `spinbox` from binaries [#20916](https://github.com/arendst/Tasmota/issues/20916)
|
||||
|
||||
### Changed
|
||||
- ESP32 Framework (Arduino Core) from v2.0.14 to v3.0.0
|
||||
- ESP32 platform update from 2024.01.12 to 2024.05.11 [#21381](https://github.com/arendst/Tasmota/issues/21381)
|
||||
- ESP32 LVGL library from v9.0.0 to v9.1.0 [#21008](https://github.com/arendst/Tasmota/issues/21008)
|
||||
- GPIOViewer from v1.5.0 to v1.5.2
|
||||
- Seriallog set to `SERIAL_LOG_LEVEL` at boot [#21363](https://github.com/arendst/Tasmota/issues/21363)
|
||||
- TLS Letsencrypt replace R3 CA with long-term ISRG_Root_X1 CA, which works with R3 and R10-R14 [#21352](https://github.com/arendst/Tasmota/issues/21352)
|
||||
- Command ``Pixels`` initiates a restart before activation due to changed NeoPixelBus library [#21406](https://github.com/arendst/Tasmota/issues/21406)
|
||||
- Command ``EthType`` option selection [#21317](https://github.com/arendst/Tasmota/issues/21317)
|
||||
- Refactor Platformio script `post_esp32.py` [#20966](https://github.com/arendst/Tasmota/issues/20966)
|
||||
- SGP4x Domoticz air quality value from raw to computed [#18880](https://github.com/arendst/Tasmota/issues/18880)
|
||||
- NeoPool webUI pH alarms (4 & 5) completed [#20743](https://github.com/arendst/Tasmota/issues/20743)
|
||||
- Prevent shutter MQTT broadcast with activated ShutterLock [#20827](https://github.com/arendst/Tasmota/issues/20827)
|
||||
- Some `display.ini` to utouch [#21029](https://github.com/arendst/Tasmota/issues/21029)
|
||||
- KNX format of energy to match specifications [#21074](https://github.com/arendst/Tasmota/issues/21074)
|
||||
- Internal macro `APP_SLEEP` to `TASMOTA_SLEEP` to specify default sleep in ms [#21324](https://github.com/arendst/Tasmota/issues/21324)
|
||||
- uDisplay fast drawing on RGB displays [#21257](https://github.com/arendst/Tasmota/issues/21257)
|
||||
- HDMI CEC synchronously sends messages [#21270](https://github.com/arendst/Tasmota/issues/21270)
|
||||
- Refactor I2S [#21291](https://github.com/arendst/Tasmota/issues/21291)
|
||||
- Zigbee startup event triggered after plugins are loaded [#21320](https://github.com/arendst/Tasmota/issues/21320)
|
||||
- Refactor Tensorflow [#21327](https://github.com/arendst/Tasmota/issues/21327)
|
||||
- ESP32 refactored Wifi for ESP32 Core3 release [#21106](https://github.com/arendst/Tasmota/issues/21106)
|
||||
- ESP32 WiFi phy modes 11n and 11ax represented as HT20, HT40 and HE20 [#19350](https://github.com/arendst/Tasmota/issues/19350)
|
||||
- berry.exe (pre-compiled for Windows) updated to latest Berry patches [#21024](https://github.com/arendst/Tasmota/issues/21024)
|
||||
- Berry class `int64` made immutable [#20727](https://github.com/arendst/Tasmota/issues/20727)
|
||||
- Berry `Leds` uses native WS2812 driver by default [#21406](https://github.com/arendst/Tasmota/issues/21406)
|
||||
- Matter reduce memory usage when reading with wildcards [#20809](https://github.com/arendst/Tasmota/issues/20809)
|
||||
- LVGL make lv_touch_3_buttons more responsive [#20728](https://github.com/arendst/Tasmota/issues/20728)
|
||||
- LVGL optimize fonts and add icons [#20880](https://github.com/arendst/Tasmota/issues/20880)
|
||||
- LVGL improved readability of montserrat-10 [#20900](https://github.com/arendst/Tasmota/issues/20900)
|
||||
- HASPmota fix and improve demo with pixel-perfect fonts [#20734](https://github.com/arendst/Tasmota/issues/20734)
|
||||
- HASPmota more attributes [#20744](https://github.com/arendst/Tasmota/issues/20744)
|
||||
- HASPmota support for spangroup (styled text) [#20852](https://github.com/arendst/Tasmota/issues/20852)
|
||||
- HASPmota support for led [#20857](https://github.com/arendst/Tasmota/issues/20857)
|
||||
- HASPmota moved to a distinct library `lv_haspmota` [#20929](https://github.com/arendst/Tasmota/issues/20929)
|
||||
- HASPmota solidify server-side [#20938](https://github.com/arendst/Tasmota/issues/20938)
|
||||
|
||||
### Fixed
|
||||
- Filesystem save of JSON settings data
|
||||
- Fade out on CCT bulb with `SO92 1` [#21159](https://github.com/arendst/Tasmota/issues/21159)
|
||||
- Shutter inverted using internal commands [#20752](https://github.com/arendst/Tasmota/issues/20752)
|
||||
- TuyaV2 suppressed dimmer updates from MQTT [#20950](https://github.com/arendst/Tasmota/issues/20950)
|
||||
- Scripter google char memory leak [#20995](https://github.com/arendst/Tasmota/issues/20995)
|
||||
- Too restrictive checksum checks in Lib_teleinfo [#21033](https://github.com/arendst/Tasmota/issues/21033)
|
||||
- Color swap option for rgb displaytext [#21049](https://github.com/arendst/Tasmota/issues/21049)
|
||||
- NeoPool hydrolysis unit for Hidrolife, Bionet and Generic device [#21098](https://github.com/arendst/Tasmota/issues/21098)
|
||||
- Neopool prevent possible multiple bus requests [#21267](https://github.com/arendst/Tasmota/issues/21267)
|
||||
- Async HMDI CEC [#21287](https://github.com/arendst/Tasmota/issues/21287)
|
||||
- ESP8266 physical button/switch control when no rules activated [#21187](https://github.com/arendst/Tasmota/issues/21187)
|
||||
- jpeg compile core3 [#21387](https://github.com/arendst/Tasmota/issues/21387)
|
||||
- ESP32 PWM activity on unconfigured PWM GPIOs [#20732](https://github.com/arendst/Tasmota/issues/20732)
|
||||
- Avoid unwanted OTA upgrade when safeboot starts for the first time [#21360](https://github.com/arendst/Tasmota/issues/21360)
|
||||
- BTHome, prep BLE5 [#20989](https://github.com/arendst/Tasmota/issues/20989)
|
||||
- Conflicting log_level definitions in NimBLE [#21337](https://github.com/arendst/Tasmota/issues/21337)
|
||||
- Berry Memory leak in `import re` [#20823](https://github.com/arendst/Tasmota/issues/20823)
|
||||
- Berry bug when parsing ternary operator [#20839](https://github.com/arendst/Tasmota/issues/20839)
|
||||
- Berry walrus with member or index [#20939](https://github.com/arendst/Tasmota/issues/20939)
|
||||
- Berry walrus bug when assigning to self [#21015](https://github.com/arendst/Tasmota/issues/21015)
|
||||
- Berry `web_add_handler` called before `Webserver` is initialized [#21272](https://github.com/arendst/Tasmota/issues/21272)
|
||||
- Berry `math.inf`, `math.isinf()` and fixed json ouput for `inf` and `nan` [#21304](https://github.com/arendst/Tasmota/issues/21304)
|
||||
- Berry `gpio.dac_voltage()` [#21403](https://github.com/arendst/Tasmota/issues/21403)
|
||||
- Matter broken NOCStruct types preventing pairing with HA [#21365](https://github.com/arendst/Tasmota/issues/21365)
|
||||
- LVGL restore `lv_palette` functions [#21232](https://github.com/arendst/Tasmota/issues/21232)
|
||||
- LVGL fix memory allocation of flush buffers [#21256](https://github.com/arendst/Tasmota/issues/21256)
|
||||
- HASPmota PSRAM memory leak [#20818](https://github.com/arendst/Tasmota/issues/20818)
|
||||
- HASPmota widgets line, btnmatrix, qrcode, bar, checkbox [#20881](https://github.com/arendst/Tasmota/issues/20881)
|
||||
- HASPmota demo and robotocondensed fonts [#21014](https://github.com/arendst/Tasmota/issues/21014)
|
||||
- HASPmota dropdown class "options" attribute [#21203](https://github.com/arendst/Tasmota/issues/21203)
|
||||
- HASPmota `align` attribute and expand PNG cache [#21228](https://github.com/arendst/Tasmota/issues/21228)
|
||||
- Berry `bytes().asstring()` now truncates a string if buffer contains NULL [#23311](https://github.com/arendst/Tasmota/issues/23311)
|
||||
- Berry string literals containing NULL are truncated [#23312](https://github.com/arendst/Tasmota/issues/23312)
|
||||
|
||||
### Removed
|
||||
- Support for ESP32 Arduino Core 2 [#21180](https://github.com/arendst/Tasmota/issues/21180)
|
||||
- Unused `#define MQTT_DATA_STRING` support
|
||||
- ILI9341 driver replaced with uDisplay [#21169](https://github.com/arendst/Tasmota/issues/21169)
|
||||
- SSD1306 driver replaced with uDisplay [#21176](https://github.com/arendst/Tasmota/issues/21176)
|
||||
- SSD1331 driver replaced with uDisplay [#21177](https://github.com/arendst/Tasmota/issues/21177)
|
||||
- SSH1106 driver replaced with uDisplay [#21183](https://github.com/arendst/Tasmota/issues/21183)
|
||||
- SSD1351 driver replaced with uDisplay [#21184](https://github.com/arendst/Tasmota/issues/21184)
|
||||
- ST7789 driver replaced with uDisplay [#21184](https://github.com/arendst/Tasmota/issues/21184)
|
||||
- ESP32 IDF 4.4 based I2S code [#21188](https://github.com/arendst/Tasmota/issues/21188)
|
||||
- Crash recorder from safeboot [#21332](https://github.com/arendst/Tasmota/issues/21332)
|
||||
- Berry `print "a"` syntax no longer supported [#21048](https://github.com/arendst/Tasmota/issues/21048)
|
||||
- LVGL disabled vector graphics [#21242](https://github.com/arendst/Tasmota/issues/21242)
|
||||
|
74
TEMPLATES.md
74
TEMPLATES.md
@ -5,7 +5,7 @@
|
||||
|
||||
# Templates
|
||||
|
||||
Find below the available templates as of May 2024. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
|
||||
Find below the available templates as of April 2025. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates)
|
||||
|
||||
## Adapter Board
|
||||
```
|
||||
@ -97,7 +97,7 @@ Iotton 9W 700lm {"NAME":"Iotton Light","GPIO":[0,0,0,0,416,417,0,0,
|
||||
iQtech 10W 900lm {"NAME":"iQ-Tech CCT 10W 900LM","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
iView 10W 1050lm {"NAME":"iView ISB1000-D","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 10W Cool & Warm White 1050lm {"NAME":"Kogan 10W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Kogan 4.5W 330lm 110 {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 4.5W 330lm 110° {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 5W {"NAME":"Kogan Co/Wa","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kruidvat A60 9W 806lm {"NAME":"Kruidvat E27 806 Lumens","GPIO":[0,0,0,0,416,449,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Laser 10W 1000lm {"NAME":"Laser 10W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
@ -131,7 +131,7 @@ Nedis C10 350lm {"NAME":"WIFILW10WTE14","GPIO":[0,0,0,0,0,416,0,0,0
|
||||
Nedis G125 5.5W 350lm Twisted Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 330lm {"NAME":"Nedis WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 4,5W 380lm {"NAME":"Nedis WIFILW10WTGU10","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 4.5W 330lm 110 {"NAME":"WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 4.5W 330lm 110° {"NAME":"WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nous P2 {"NAME":"NOUS-P2","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":37}
|
||||
Philips Zhirui Candle 250lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,417,0,0,416,0,0],"FLAG":0,"BASE":48}
|
||||
Phillips Zhirui 450lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,417,0,0,416,0,0],"FLAG":0,"BASE":48}
|
||||
@ -150,7 +150,7 @@ Sulion Morgan C37 5W 470lm {"NAME":"Sulion Bombilla C37","GPIO":[0,0,0,0,0,0,0
|
||||
Swisstone 806lm {"NAME":"SwisstoneSH330","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18}
|
||||
Swisstone SH 310 {"NAME":"Swisstone SH 310","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Treatlife A19 9W 800lm {"NAME":"Treatlife SL20","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac PAR16 4.5W 300lm 110 {"NAME":"V-TAC VT-5174","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac PAR16 4.5W 300lm 110° {"NAME":"V-TAC VT-5174","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vestaiot BR30 800lm {"NAME":"Vesta BR30 CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Wipro Garnet NS9100 810lm {"NAME":"Wipro 9W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Wyze A19 800lm {"NAME":"Wyze Bulb","GPIO":[5728,0,0,0,0,0,0,0,0,416,417,0,0,0],"FLAG":0,"BASE":48}
|
||||
@ -186,7 +186,6 @@ LE lampUX 15W RGBCCT {"NAME":"LE lampUX 15W","GPIO":[0,0,0,0,416,419,0,0
|
||||
LightZone MeLiTec {"NAME":"LightZone MeLiTec D114 Light ","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Lohas ZN026CL10 RGBCCT {"NAME":"Lohas LED Lamp","GPIO":[0,0,0,0,417,416,0,0,419,418,420,0,0,0],"FLAG":0,"BASE":18}
|
||||
LOLAsmart Uranus White 70 cm {"NAME":"lola smart","GPIO":[0,0,0,1088,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
LSC 20W 1400lm White Ambiance {"NAME":"LSC RGBCW LED","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18}
|
||||
Luminea 24W CCT {"NAME":"Luminea NX6205-944","GPIO":[0,0,0,0,0,0,0,0,449,0,416,0,0,0],"FLAG":0,"BASE":48}
|
||||
LVL 300mm Round {"NAME":"LVL 300m Round 24W Ceiling LED","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":48}
|
||||
Nedis CCT 800lm {"NAME":"NEDIS WIFILAW10WT","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -266,6 +265,9 @@ EARU DIN Circuit Breaker 2P 63/80A eWeLink White {"NAME":"RDCBC-2P","GPIO":[32,
|
||||
Hoch Circuit Breaker 1P {"NAME":"HOCH ZJSB9","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Ketotek Single Phase Energy Monitor {"NAME":"Ketotek KTEM06","GPIO":[0,2272,0,2304,0,0,0,0,0,0,320,0,32,0],"FLAG":0,"BASE":54}
|
||||
Martin Jerry 30A Circuit Breaker {"NAME":"30A Breaker","GPIO":[0,0,0,0,7584,224,0,0,2720,32,2656,2624,320,0],"FLAG":0,"BASE":18}
|
||||
Nous DIN Smart Switch 16A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous DIN Smart Switch 20A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous DIN Smart Switch 25A {"NAME":"Nous D1T","GPIO":[32,1,9312,1,1,320,1,1,9313,8160,3200,544,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,4736,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
OpenEnergyMonitor WiFi MQTT Thermostat {"NAME":"MQTT-RELAY","GPIO":[32,0,1,0,0,224,0,0,0,0,0,0,320,0],"FLAG":0,"BASE":18}
|
||||
RocketController ASTRA Controller {"NAME":"ASTRA R4A4","GPIO":[1,1,1,1,576,1,1,1,480,1,1,1,3232,3200,1,1,0,640,608,1,0,224,225,1152,0,0,0,0,227,226,160,161,162,0,0,163],"FLAG":0,"BASE":1}
|
||||
Shelly Pro 1 {"NAME":"Shelly Pro 1","GPIO":[0,1,0,1,768,0,0,0,672,704,736,0,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,0,0,0,32,4736,0,160,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,10000,10000,3350"}
|
||||
@ -311,7 +313,7 @@ LilyGo 4G GPS {"NAME":"LiLyGo A7608EH","GPIO":[1,1,672,1,226,225,
|
||||
LilyGO RGB LED Ring Encoder {"NAME":"T-Encoder","GPIO":[0,0,1,0,1,0,0,0,1,1,1,1,0,0,0,480,6212,0,0,0,0,449,450,448,0,0,0,0,0,0,0,0,3296,3264,32,0],"FLAG":0,"BASE":1,"CMND":"BuzzerPwm 1"}
|
||||
LilyGO T7 Mini32 V1.5 {"NAME":"LilyGO T7 V1.5","GPIO":[1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,544,0,0,0,1,0,1,1,1,0,0,0,0,0,1,1,4704,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LilyGO TTGO ESP32 Ethernet {"NAME":"T-Internet-POE v1.2","GPIO":[0,1,1,1,1,1,1,1,1,1,1,1,1,1,5600,1,0,1,1,5568,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1,"CMND":"EthType 0|EthClockMode 1|EthAddress 0"}
|
||||
M5Stack Atom Lite ESP32 {"NAME":"M5Stack Atom Lite","GPIO":[1,1,1,1,1,1,1,1,1056,1,1,1,1,1,1,1,0,1,1,1,0,1,640,1376,0,0,0,0,608,1,1,1,1,0,0,32],"FLAG":0,"BASE":1}
|
||||
M5Stack Atom Lite ESP32 {"NAME":"M5Stack Atom Lite","GPIO":[0,0,0,0,0,0,0,0,1056,0,0,0,0,0,0,1,0,1,1,1,0,1,1,1376,0,0,0,0,1,1,1,0,0,0,0,32],"FLAG":0,"BASE":1}
|
||||
M5Stack AtomU USB-A ESP32 "Not available"
|
||||
Mostly Robots Wemos D1 4 Channel MOSFET Shield {"NAME":"MOSFET","GPIO":[1,1,288,1,1,1,1,1,226,225,227,224,1,1],"FLAG":0,"BASE":18}
|
||||
Olimex ESP32-POE Ethernet {"NAME":"Olimex ESP32-PoE","GPIO":[1,1,1,1,1,1,0,0,5536,1,1,1,1,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
@ -395,7 +397,7 @@ Nedis A60 Warm White 9W 800lm {"NAME":"WIFILW11WTE27","GPIO":[0,0,0,0,0,416,0,0
|
||||
Nedis G125 Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PAR16 330lm {"NAME":"Nedis WIFILW31","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis ST64 5W 500lm Filament {"NAME":"WIFILF10GDST64","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Positivo Smart Lampada Retro {"NAME":"POSITIVO SMART LAMPADA RETRO","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Positivo Smart Lâmpada Retrô {"NAME":"POSITIVO SMART LAMPADA RETRO","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Sealight Vintage Edison A19 {"NAME":"SealightEdison","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Vintage 4W 260lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Vintage 7W 750lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -558,7 +560,7 @@ Goldair SleepSmart GCPF315 {"NAME":"Goldair Fan","GPIO":[0,0,0,0,0,0,0,0,0,230
|
||||
Holmes 36" Oscillating Tower {"NAME":"Generic","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":54,"CMND":"TuyaMcu 11,1 | TuyaMcu 12,5 | WebButton1 Power | WebButton2 Oscillation "}
|
||||
Lucci Connect Remote Control {"NAME":"Lucci Fan","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
|
||||
QuietCool Gable Mount Attic {"NAME":"QuietCool-AFG-SMT-PRO-2.0","GPIO":[0,0,0,0,0,224,0,0,0,0,0,0,0,0,640,608,0,0,0,225,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Interlock 1|WebButton1 Low|WebButton2 High|SO8 1"}
|
||||
Sichler Haushaltsgeraete Column {"NAME":"Sichler Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Sichler Haushaltsgeräte Column {"NAME":"Sichler Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Technical Pro {"NAME":"FXA16 Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 12,8"}
|
||||
Zemismart Bladeless {"NAME":"Bladeless Fan","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54}
|
||||
```
|
||||
@ -601,6 +603,7 @@ EBERG ROT 720 Infrared {"NAME":"Tuya MCU","GPIO":[0,2272,0,2304,0,0,0,0,0,
|
||||
Klarstein Bornholm Smart 2000W {"NAME":"Klarstein Bornholm","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Kogan 1500W Panel {"NAME":"Kogan Panel Heater","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54}
|
||||
LSC Smart Connect 500W IR Panel {"NAME":"LSC Connect Smart IR Panel Heater","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Mursche 450W Infrared Heater {"NAME":"Mursche Infrared Heater","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
SmartMi Electric Air {"NAME":"ZNNFJ07ZM","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0,3200,3232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
```
|
||||
|
||||
@ -656,6 +659,10 @@ Uniplay Universal Remote {"NAME":"Uniplay IR","GPIO":[1,3200,1,3232,576,1088
|
||||
YTF Universal Remote {"NAME":"YTF IR Controller","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62}
|
||||
```
|
||||
|
||||
## IR Remote
|
||||
```
|
||||
```
|
||||
|
||||
## Illuminance Sensor
|
||||
```
|
||||
Tuya {"NAME":"Lightsensor","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
@ -873,7 +880,7 @@ PCI-e Desktop PC Remote Control {"NAME":"PC-Switch-01","GPIO":[32,0,0,0,0,0,0,0
|
||||
Petoneer Smart Dot Cat Toy {"NAME":"Petoneer Smart Dot","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Proscenic T21 Air Fryer {"NAME":"Proscenic T21","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
RainPoint Indoor Water Pump {"NAME":"RainPoint","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 81,107|TuyaMCU 12,109|TuyaMCU 11,1|TuyaMCU 82,104"}
|
||||
Sinilink PCIe Computer Remote {"NAME":"XY-WPCE","GPIO":[1,1,320,1,32,224,0,0,160,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO114 1 | SwitchMode1 2"}
|
||||
Sinilink PCIe Computer Remote {"NAME":"XY-WPCE","GPIO":[1,1,320,1,160,224,0,161,162,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO114 1 | Pulsetime 10 | SwitchMode1 2 | SwitchMode2 2 | SwitchMode3 2"}
|
||||
Sinilink USB Computer Remote {"NAME":"XY-WPCL","GPIO":[0,0,320,0,0,224,0,32,160,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SO114 1 | Pulsetime 10 | SwitchMode1 2"}
|
||||
Sinilink XY-Clock Clock Alarm Module {"NAME":"XY-Clock","GPIO":[288,0,289,0,0,416,32,33,608,640,0,0,34,0],"FLAG":0,"BASE":18}
|
||||
Sunbeam LoftTec Electric Blanket {"NAME":"Sunbeam Heated Blanket","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
@ -923,7 +930,7 @@ Zemismart Updated RF Remote Roller Shade {"NAME":"Zemismart M515EGB","GPIO":[1,
|
||||
## Other
|
||||
```
|
||||
Kogan SmarterHome 1.9L Pet Water Fountain {"NAME":"WaterFountain","GPIO":[257,0,259,0,576,32,0,0,224,161,0,480,226,4704],"FLAG":0,"BASE":18}
|
||||
Tetra Connect Automatic Feeder {"NAME":"Tetra Connect","GPIO":[0,0,0,0,224,288,0,0,98,96,97,0,289,0],"FLAG":0,"BASE":18}
|
||||
Tetra® Connect Automatic Feeder {"NAME":"Tetra Connect","GPIO":[0,0,0,0,224,288,0,0,98,96,97,0,289,0],"FLAG":0,"BASE":18}
|
||||
```
|
||||
|
||||
## Outdoor Plug
|
||||
@ -985,6 +992,8 @@ Merkury {"NAME":"Merkury Switch","GPIO":[0,0,0,0,32,0,0,0,0
|
||||
Meross MSS620 16A IP44 {"NAME":"MSS620","GPIO":[0,320,0,320,225,0,0,0,224,576,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
Minoston MP22W {"NAME":"Minoston MP22W","GPIO":[0,0,0,0,320,0,0,0,224,64,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis PO120 IP44 {"NAME":"WIFIPO120FWT","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49}
|
||||
Nous A6T Smart Socket {"NAME":"NOUS A5T","GPIO":[0,3072,544,3104,0,259,0,0,225,226,224,0,35,4704],"FLAG":1,"BASE":18}
|
||||
Nous Dual Smart Socket {"NAME":"NOUS A4T","GPIO":[0,2624,0,576,2656,2720,0,0,224,225,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
Obi Stecker IP44 {"NAME":"OBI-Outdoor-Socket2","GPIO":[0,0,0,0,224,32,0,0,576,288,1,1,1,1],"FLAG":0,"BASE":18}
|
||||
Oittm IP44 15A {"NAME":"Oittm Outdoor","GPIO":[576,0,320,0,2688,2656,0,0,224,2592,0,0,0,0],"FLAG":0,"BASE":57}
|
||||
Oittm Outdoor {"NAME":"Oittm Outdoor","GPIO":[32,0,0,0,0,0,0,0,0,0,320,224,1,0],"FLAG":0,"BASE":18}
|
||||
@ -1069,6 +1078,7 @@ Arlec Twin Socket with Energy Meter {"NAME":"Arlec PC287HA","GPIO":[0,32,0,320,
|
||||
Athom 16A {"NAME":"Athom Power Monitoring Plug","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,1],"FLAG":0,"BASE":18}
|
||||
Athom 16A AU {"NAME":"Athom PG05-AU16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A AU {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A AU V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A BR V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A Brazil {"NAME":"Athom PG05-BR16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A EU V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1078,8 +1088,10 @@ Athom 16A Italy {"NAME":"Athom PG05-IT16A","GPIO":[0,0,0,32,2720,26
|
||||
Athom 16A Switzerland v2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A UK {"NAME":"Athom PG04-UK16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A UK V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A UK V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1}
|
||||
Athom 16A US {"NAME":"Athom PG03-US16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A US V2 {"NAME":"Athom Plug V2","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 16A US V3 {"NAME":"Athom Plug V3","GPIO":[0,0,0,32,0,224,576,0,0,0,0,0,0,0,0,0,0,0,0,0,3104,0],"FLAG":0,"BASE":1}
|
||||
Atlantis {"NAME":"Atlantis Smart Plug","GPIO":[32,0,0,0,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Atomi AT1217 {"NAME":"AT1217","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Aubess 16A {"NAME":"Aubess 16A Power Monitoring Plug","GPIO":[0,32,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1221,8 +1233,8 @@ Epicka {"NAME":"Epicka","GPIO":[1,1,1,1,321,320,0,0,224,32
|
||||
Eques Elf Smart Plug {"NAME":"EQP01WTGY","GPIO":[0,0,0,320,0,0,0,0,96,0,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
Esicoo JSM-WF02 {"NAME":"Esicoo Plug","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Estink C178 {"NAME":"Estink C178","GPIO":[0,0,0,0,288,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Etekcity 15A {"NAME":"ESW15-US","GPIO":[0,0,0,0,0,224,0,0,2656,2688,32,2592,288,0],"FLAG":0,"BASE":18}
|
||||
Etekcity 8A {"NAME":"ESW01-USA","GPIO":[0,0,0,0,224,544,0,0,2656,2688,32,2592,288,0],"FLAG":0,"BASE":55}
|
||||
ETEKCITY Voltson Smart Wi-Fi Outlet {"NAME":"ESW15-USA","GPIO":[0,0,0,0,416,224,0,0,2656,2688,32,2592,544,4704],"FLAG":0,"BASE":18}
|
||||
EU3S {"NAME":"AWOW BSD33","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18}
|
||||
Eva Logik {"NAME":"EVA LOGIK Plug","GPIO":[1,32,1,1,1,1,0,0,1,288,224,1,1,0],"FLAG":0,"BASE":18}
|
||||
Ewelink EU 20A {"NAME":"Ewelink Smart Socket 20A","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1454,6 +1466,7 @@ Nishica SM-PW701I {"NAME":"SM-PW701I","GPIO":[1,1,1,1,1,1,1,1,224,288
|
||||
Nivian {"NAME":"Nivian Smart Socket","GPIO":[0,0,320,0,0,2688,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18}
|
||||
Nous A1 {"NAME":"NOUS A1","GPIO":[320,0,576,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45}
|
||||
Nous A1T 16A {"NAME":"NOUS A1T","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49}
|
||||
Nous A8T 10A {"NAME":"NOUS A8T","GPIO":[1,1,320,1,32,1,1,1,1,224,2624,1,1,1,1,1,0,1,1,1,0,1,2656,2720,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
NX-SM112 {"NAME":"NX-SM112v3","GPIO":[0,0,0,0,2720,2656,0,0,576,32,2592,224,0,0],"FLAG":0,"BASE":45}
|
||||
NX-SM200 {"NAME":"NX-SM200","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,321,2624,0],"FLAG":0,"BASE":18}
|
||||
NX-SM210 {"NAME":"NX-SM210","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -1829,6 +1842,7 @@ ZLD64-EU-W {"NAME":"ZLD64-EU-W","GPIO":[0,320,0,32,225,224,0,0
|
||||
|
||||
## Presence Sensor
|
||||
```
|
||||
Athom Human Presence Sensor {"NAME":"Athom PS01 Sensor","GPIO":[32,0,0,0,640,608,0,0,161,3232,160,3200,576,0],"FLAG":0,"BASE":18}
|
||||
Everything Presence Lite {"NAME":"Everything Presence Lite","GPIO":[0,0,0,0,0,0,0,0,0,0,544,0,3232,3200,160,161,0,640,608,0,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Everything Presence One {"NAME":"Everything Presence One","GPIO":[0,0,0,0,0,0,0,0,0,3200,3232,160,0,1,1,1,0,0,1,1,0,608,640,0,0,0,0,0,544,161,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"SO114 1 | SwitchMode1 1 | SwitchMode2 1"}
|
||||
Tuya mmWave {"NAME":"ZY-M100","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54,"CMND":"SO97 1 | TuyaMCU 99,1 | TuyaMCU 75,104"}
|
||||
@ -2033,7 +2047,7 @@ Teckin SB53 1300lm {"NAME":"Teckin SB53","GPIO":[0,0,0,0,416,419,0,0,4
|
||||
Treatlife A19 8W 650lm {"NAME":"Treatlife RGBW","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-TAC 10W 806lm {"NAME":"V-TAC VT-5119","GPIO":[0,0,0,0,4032,0,0,0,0,0,4064,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac A60 10W 806lm {"NAME":"V-Tac A60","GPIO":[0,0,0,0,416,417,0,0,418,419,420,0,0,0],"FLAG":0,"BASE":18,"CMND":"SetOption37 13"}
|
||||
V-Tac PAR16 4.5W 400lm 100 {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18}
|
||||
V-Tac PAR16 4.5W 400lm 100° {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18}
|
||||
Vizia 5W GU10 {"NAME":"Vizia RGBWW","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,1],"FLAG":0,"BASE":18}
|
||||
WdtPro 8W 800lm {"NAME":"WdtPro","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Wipro Garnet 9W 810lm {"NAME":"Wipro","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2136,7 +2150,7 @@ Kainsy 600lm {"NAME":"KAINSY","GPIO":[32,0,0,0,3008,3040,0,0,0,0
|
||||
Kkmoon 9W 800lm {"NAME":"KKMOON V21","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18}
|
||||
Koaanw 650lm {"NAME":"KOAANW Bulb","GPIO":[0,0,0,0,3008,3040,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":27}
|
||||
Kogan 10W Ambient 1050lm {"NAME":"Kogan RGB","GPIO":[0,0,0,0,2912,416,0,0,0,0,2944,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 4.5W 330lm 110 {"NAME":"Kogan_GU10","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan 4.5W 330lm 110° {"NAME":"Kogan_GU10","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kogan Ambient Candle {"NAME":"Kogan_E14","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Kuled 800lm {"NAME":"KULED 60W RGB","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,4704],"FLAG":0,"BASE":18}
|
||||
Laideyi 7W {"NAME":"7W-E14-RGBW-La","GPIO":[0,0,0,0,417,416,0,0,418,0,419,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2205,7 +2219,7 @@ Rogoei EBE-QPZ04 6.5W 450lm {"NAME":"EBE-QPZ04","GPIO":[0,0,0,0,4032,0,0,0,0,0,
|
||||
Saudio 7W 700lm {"NAME":"X002BU0DOL","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Sengled {"NAME":"Sengled RGBW","GPIO":[0,0,0,0,0,0,0,0,417,416,419,418,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Duo RGBW 5W 400lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Duo RGBW 9W 800lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Shelly Duo RGBW 9W 800lm {"NAME":"Shelly Duo RGBW","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,4736],"FLAG":0,"BASE":18,"CMND":"AdcParam 2, 32000, 1000, 3950|SetOption37 128|SetOption106 1|SetOption107 0|WebButton1 COLOR|WebButton2 WHITE|SetOption42 85|Fade ON|Speed 2|SetOption91 1|Rule1 ON POWER2#state=1 DO POWER1 OFF ENDON ON POWER1#state=1 DO POWER2 OFF ENDON ON Dimmer1#State DO POWER2 OFF ENDON ON Dimmer2#State DO POWER1 OFF ENDON|Rule1 ON"}
|
||||
Smart 810lm {"NAME":"OOOLED 60W RGB","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,4704],"FLAG":0,"BASE":18}
|
||||
SmartLED 9W 400lm {"NAME":"SmartLED RGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
Smartyfi 600lm {"NAME":"SMARTYFI 9W","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2262,11 +2276,13 @@ Anmbest 2 Channel Inching Self-locking Switch Module {"NAME":"Generic","GPIO":[
|
||||
Aptinex IOT RelayNode 4 Channel {"NAME":"APTINEX","GPIO":[0,0,1,0,0,0,0,0,224,225,226,227,0,0],"FLAG":0,"BASE":18}
|
||||
Armtronix Quad {"NAME":"Armtronix Wifi Four Relay Board","GPIO":[1,0,0,0,224,1,0,0,225,226,227,0,1,0],"FLAG":0,"BASE":7}
|
||||
Athom 1Ch Inching/Self-locking {"NAME":"Athom R01","GPIO":[1,1,1,1,1,224,1,1,1,1,1,1,576,0],"FLAG":0,"BASE":18}
|
||||
Athom 8Ch Inching/Self-locking 10A {"NAME":"Athom R08","GPIO":[229,1,1,1,230,231,1,1,226,227,225,228,224,0],"FLAG":0,"BASE":18}
|
||||
Athom 8Ch Inching/Self-locking 10A {"NAME":"Athom 8CH Relay Board","GPIO":[0,0,228,0,229,230,1,1,226,227,225,544,1,1152,231,0,0,0,0,0,0,33,32,224,0,0,0,0,35,34,37,36,39,0,0,38],"FLAG":0,"BASE":1}
|
||||
Claudy 5V {"NAME":"CLAUDY","GPIO":[0,0,225,0,0,0,0,0,0,0,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
Devantech 8x16A {"NAME":"ESP32LR88","GPIO":[0,0,231,0,32,35,0,0,229,230,228,0,33,34,36,37,0,38,39,544,0,225,226,227,0,0,0,0,0,224,3232,3200,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Dingtian 16 Channel {"NAME":"Dingtian DT-R008","GPIO":[1,9408,1,9440,1,1,1,1,1,9760,9729,9856,9792,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,9824,9952,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Dingtian 2 Channel {"NAME":"Dingtian DT-R002","GPIO":[5536,9408,225,9440,0,0,0,0,0,9952,0,0,224,0,5600,0,0,0,0,5568,0,0,0,0,0,0,0,0,576,0,0,0,160,0,0,161],"FLAG":0,"BASE":1}
|
||||
Dingtian 32 Channel {"NAME":"Dingtian DT-R008","GPIO":[1,9408,1,9440,1,1,1,1,1,9760,9731,9856,9792,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,9824,9952,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Dingtian 4 Channel {"NAME":"Dingtian DT-R004","GPIO":[0,9408,225,9440,0,0,0,0,227,9952,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,162,0,163,160,0,0,161],"FLAG":0,"BASE":1}
|
||||
Dingtian 8 Channel {"NAME":"Dingtian DT-R008","GPIO":[1,9408,1,9440,1,1,1,1,1,9760,9728,9856,9792,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,9824,9952,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
DoHome HomeKit DIY Switch {"NAME":"DoHome DIY","GPIO":[1,1,0,1,96,544,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Eachen ST-DC2 {"NAME":"Garage Control","GPIO":[162,0,0,0,226,225,33,0,224,288,163,227,0,4704],"FLAG":0,"BASE":18}
|
||||
@ -2315,7 +2331,7 @@ LC Technology 5V/8-80V 1 Channel {"NAME":"LC-Relay-ESP12-1R-MV","GPIO":[1,1,544
|
||||
LC Technology 5V/8-80V 1 Channel {"NAME":"LC-Relay-ESP12-1R-D8","GPIO":[1,1,544,1,1,224,1,1,1,1,1,1,321,1],"FLAG":0,"BASE":18}
|
||||
LC Technology AC90V-250V 1 Channel {"NAME":"ESP32_Relay_AC_X1","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,224,1,1,1,0,1,1,544,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 1 Channel {"NAME":"ESP32_Relay_X1","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,224,1,1,1,0,1,1,544,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 2 Channel {"NAME":"ESP32_Relay_X2","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,544,0,225,224,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 2 Channel {"NAME":"ESP32_Relay_X2","GPIO":[0,0,0,0,0,0,0,0,0,0,0,0,224,225,0,0,0,0,0,544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
LC Technology DC5-60V 4 Channel {"NAME":"ESP32_Relay_X4","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,544,0,226,227,1,0,0,0,0,224,225,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
LC Technology ESP8266 5V {"NAME":"ESP8266-01S","GPIO":[224,3200,0,3232,0,0,0,0,0,0,0,0,0,4704],"FLAG":0,"BASE":18}
|
||||
LilyGo T-Relay 5V 8 Channel {"NAME":"LilyGo ESP32 Relay 8","GPIO":[1,1,1,1,1,231,1,1,227,226,1,1,1,1,230,229,0,228,1,1,0,544,1,1,0,0,0,0,225,224,1,1,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
@ -2360,6 +2376,10 @@ Connex Smart Indoor {"NAME":"Connex Siren","GPIO":[0,2272,0,2304,0,0,0,
|
||||
NEO Coolcam Temperature and Humidity 3in1 Alarm {"NAME":"Neo Siren 3in1","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
```
|
||||
|
||||
## Smart Meter
|
||||
```
|
||||
```
|
||||
|
||||
## Smoke Sensor
|
||||
```
|
||||
Nedis Smoke Detector {"NAME":"Nedis WIFIDS10WT","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
@ -2436,7 +2456,6 @@ Connect SmartHome 3 Gang Wall Switch () {"NAME":"CSH-SWTCH3","GPIO":[0,0,288,0,
|
||||
Csmart US-B2 {"NAME":"Csmart US-B2","GPIO":[0,544,0,33,32,0,0,0,0,225,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
Delock WLAN EASY-USB {"NAME":"Delock 11828","GPIO":[0,0,0,32,0,0,0,0,0,576,224,0,0,0],"FLAG":0,"BASE":53}
|
||||
Deta 1 Gang {"NAME":"Deta 1G Switch","GPIO":[0,0,0,0,544,0,0,0,0,224,0,0,64,0],"FLAG":0,"BASE":18}
|
||||
Deta 2 Gang {"NAME":"DETA 2G Switch","GPIO":[0,0,0,0,544,0,0,0,65,224,225,0,64,0],"FLAG":0,"BASE":18}
|
||||
Deta 3 Gang {"NAME":"DETA 3G Switch","GPIO":[544,0,0,66,65,224,0,0,226,0,225,0,64,0],"FLAG":0,"BASE":18}
|
||||
Deta 4 Gang {"NAME":"Deta 4G Switch","GPIO":[576,0,0,34,33,224,0,0,226,35,225,227,32,0],"FLAG":0,"BASE":18}
|
||||
DETA Mechanism {"NAME":"Deta 6014HA","GPIO":[0,0,0,0,0,0,0,0,320,0,32,0,224,0],"FLAG":0,"BASE":18}
|
||||
@ -2585,7 +2604,7 @@ Nedis Dual {"NAME":"SM-SW102U-2","GPIO":[576,0,0,33,225,0,0,0,
|
||||
NEO Coolcam 2Ch Touch Light {"NAME":"Neo NAS-SC01W-2","GPIO":[0,0,0,0,225,0,0,0,32,224,33,0,544,0],"FLAG":0,"BASE":18}
|
||||
Nexete DS-123 {"NAME":"DS-123","GPIO":[544,321,1,32,224,33,0,0,1,225,320,1,1,0],"FLAG":0,"BASE":18}
|
||||
Nexete DS-123 Single {"NAME":"DS-123","GPIO":[544,0,1,33,0,32,0,0,1,224,320,1,1,0],"FLAG":0,"BASE":18}
|
||||
Novadigital Interruptor Touch Led 1 Boto {"NAME":"Nova Digital Switch 1 Gang","GPIO":[544,0,0,32,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
|
||||
Novadigital Interruptor Touch Led 1 Botão {"NAME":"Nova Digital Switch 1 Gang","GPIO":[544,0,0,32,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
|
||||
PNI SmartHome 1 Key {"NAME":"Tuya Switch 1 key","GPIO":[544,1,1,32,224,1,1,1,1,1,288,1,1,1],"FLAG":0,"BASE":18}
|
||||
PNI SmartHome 2 Keys {"NAME":"Tuya switch 2 key","GPIO":[544,0,289,0,0,32,0,0,33,225,0,224,288,0],"FLAG":0,"BASE":18}
|
||||
Prosto {"NAME":"Prosto WFS-T10","GPIO":[0,0,0,0,0,224,0,0,320,0,64,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2598,7 +2617,7 @@ QNCX Smart Breaker {"NAME":"QNCX Smart breaker","GPIO":[0,0,0,0,160,22
|
||||
Qualitel 1 Gang {"NAME":"Qualitel 1 Gang","GPIO":[544,0,0,160,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18}
|
||||
Qualitel 2-Gang {"NAME":"Qualitel 2 Gang","GPIO":[544,0,289,0,0,161,0,0,160,224,0,225,288,0],"FLAG":0,"BASE":18}
|
||||
Qualitel 3 Gang {"NAME":"Qualitel 3 Gang","GPIO":[544,0,290,161,225,162,0,0,160,224,289,226,288,0],"FLAG":0,"BASE":18}
|
||||
Refoss AC/DC {"NAME":"Refoss-R10","GPIO":[0,1,3104,0,224,192,0,0,2720,0,0,0,0,4736],"FLAG":0,"BASE":18}
|
||||
Refoss AC/DC {"NAME":"Refoss-R10","GPIO":[1,1,0,1,224,192,0,0,2656,2720,32,1,2624,4736],"FLAG":0,"BASE":18}
|
||||
RY-RSM104 Light Touch {"NAME":"RY-RSM104","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54}
|
||||
Sainko 1-Way {"NAME":"SAINKO 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28}
|
||||
Sainko 2 Way {"NAME":"Sainko 2-Way","GPIO":[0,1,320,0,0,32,0,0,224,225,0,0,33,0],"FLAG":0,"BASE":18}
|
||||
@ -2631,7 +2650,7 @@ Smatrul 5A RF433MHz 4 Gang Touch {"NAME":"Smatrul RF433MHz 3 Gang Touch Switch
|
||||
Smatrul Infrared Sensor {"NAME":"WHS-2","GPIO":[0,0,0,160,288,0,0,0,0,224,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"SwitchMode1 4 | SO13 1"}
|
||||
Sonoff IW101 {"NAME":"Sonoff IW101","GPIO":[32,3072,0,3104,0,0,0,0,224,544,0,0,0,0],"FLAG":0,"BASE":41}
|
||||
Sonoff SwitchMan M5-1C 1 Gang {"NAME":"Sonoff SwitchMan M5-1C-86","GPIO":[32,0,0,0,288,576,0,0,0,0,0,0,0,0,416,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Sonoff SwitchMan M5-2C 2 Gang {"NAME":"Sonoff SwitchMan 2C","GPIO":[0,0,0,0,32,576,0,0,0,0,0,33,0,0,416,225,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Sonoff SwitchMan M5-2C 2 Gang {"NAME":"Sonoff SwitchMan 2C","GPIO":[0,0,0,0,32,576,0,0,0,0,0,33,0,0,416,225,0,0,289,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,288],"FLAG":0,"BASE":1}
|
||||
Sonoff SwitchMan M5-3C 3 Gang {"NAME":"Sonoff M5-3C","GPIO":[33,0,0,0,32,576,0,0,0,0,0,34,0,0,416,225,0,0,226,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1}
|
||||
Sonoff T1 EU 1 Gang {"NAME":"Sonoff T1 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28}
|
||||
Sonoff T1 EU 2 Gang {"NAME":"Sonoff T1 2CH","GPIO":[32,1,1,1,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":29}
|
||||
@ -2734,12 +2753,12 @@ ZUCZUG 3 Gang {"NAME":"2ph105626a x3","GPIO":[0,288,0,32,34,33,0,
|
||||
## Switch Module
|
||||
```
|
||||
2 CH Smart Switch {"NAME":"Generic","GPIO":[32,1,1,1,1,225,33,1,224,288,1,1,1,1],"FLAG":0,"BASE":18}
|
||||
AGL Modulo Relay 01 Canal {"NAME":"AGL-Basic","GPIO":[0,1,0,0,224,32,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18}
|
||||
AGL Módulo Relé 01 Canal {"NAME":"AGL-Basic","GPIO":[0,1,0,0,224,32,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18}
|
||||
Albohes 2 Channel {"NAME":"Albohes SH-08","GPIO":[0,3200,33,3232,321,320,0,0,224,544,32,0,225,1],"FLAG":0,"BASE":18}
|
||||
Athom 10A {"NAME":"CB01-TAS-1","GPIO":[0,0,0,32,320,0,0,0,0,224,0,0,0,1],"FLAG":0,"BASE":18}
|
||||
Athom 2Ch Inching/Self-locking {"NAME":"Athom R02","GPIO":[1,1,1,1,225,224,1,1,1,1,1,1,576,0],"FLAG":0,"BASE":18}
|
||||
Athom 2Ch Inching/Self-locking {"NAME":"Athom 2CH Relay Board","GPIO":[0,0,0,0,0,0,1,1,0,0,225,544,1,1152,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,32,0,0,33],"FLAG":0,"BASE":1}
|
||||
Athom 3-Way Mini Relay {"NAME":"RS01-TAS-1","GPIO":[0,0,0,32,576,0,0,0,0,224,160,0,0,0],"FLAG":0,"BASE":18}
|
||||
Athom 4Ch Inching/Self-locking 10A {"NAME":"Athom R04","GPIO":[1,1,1,1,32,576,1,1,226,227,225,1,224,0],"FLAG":0,"BASE":18}
|
||||
Athom 4Ch Inching/Self-locking 10A {"NAME":"Athom 4CH Relay Board","GPIO":[0,0,0,0,0,0,1,1,226,227,225,544,1,1152,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,34,35,32,0,0,33],"FLAG":0,"BASE":1}
|
||||
Athom 4Ch Inching/Self-locking 30A {"NAME":"Athom R04-30A","GPIO":[1,1,1,1,32,576,1,1,226,227,225,1,224,0],"FLAG":0,"BASE":18}
|
||||
ATMS1601 230VAC DIN Timer/Switch {"NAME":"ATMS1601","GPIO":[1,1,1,1,544,320,1,1,224,32,1,1,1,1],"FLAG":0,"BASE":18}
|
||||
Aubess Power Monitor Switch 16A {"NAME":"Aubess with (BL0942)","GPIO":[0,3200,0,7520,0,0,0,0,160,0,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2753,7 +2772,7 @@ Century Aoke Smart Switch {"NAME":"CenturyAoke","GPIO":[0,1,0,1,224,0,0,0,32,
|
||||
Deta 6000HA Smart Inline Switch {"NAME":"DETA-6000HA","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18}
|
||||
dewenwils Outdoor Timer Box {"NAME":"Dewenwils50054","GPIO":[0,0,290,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18}
|
||||
EDM Low Voltage {"NAME":"HVAC Switch","GPIO":[0,0,0,0,288,321,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo 2 Channel {"NAME":"eMylo XL9252WI","GPIO":[0,1,0,0,320,225,0,0,224,0,163,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo 2 Channel {"NAME":"eMylo XL9252WI","GPIO":[0,1,0,0,320,225,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo Single Channel Switch {"NAME":"eMylo XL9251WI","GPIO":[0,1,0,0,320,0,0,0,224,0,35,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo SS-8839-02 {"NAME":"SS-8839-02","GPIO":[0,1,0,1,320,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
eMylo SS-8839-03 {"NAME":"SS-8839-03","GPIO":[0,1,0,1,288,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18}
|
||||
@ -2777,8 +2796,11 @@ Moes {"NAME":"Moes MS-104B","GPIO":[0,0,32,0,480,0,0,0,1
|
||||
Moes 10A {"NAME":"Moes MS-101","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
Moes Mini 3 Gang 1/2 Way {"NAME":"Moes MS-104C","GPIO":[0,0,0,34,32,33,0,0,224,225,226,0,0,0],"FLAG":0,"BASE":18}
|
||||
Nedis 10A {"NAME":"Nedis WIFIPS10WT","GPIO":[0,0,0,0,224,0,0,0,32,321,0,288,0,0],"FLAG":0,"BASE":18}
|
||||
Nous 1 Channel {"NAME":"NOUS B1T","GPIO":[544,0,1,0,32,160,1,1,224,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous 1 Channel Touch {"NAME":"NOUS L1T","GPIO":[544,0,1,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
|
||||
Nous 1/2 Channel {"NAME":"NOUS L13T Smart Switch Module","GPIO":[1,161,1,160,225,224,1,1,544,1,32,1,1,1],"FLAG":0,"BASE":18}
|
||||
Nous 2 Channel {"NAME":"NOUS B2T","GPIO":[544,3200,1,8160,32,160,1,1,224,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous 2 Channel / Curtain {"NAME":"NOUS B3T","GPIO":[544,3200,1,8128,32,160,1,1,224,225,0,1,1,1,161,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1],"FLAG":0,"BASE":1}
|
||||
Nous 2 Channel Touch {"NAME":"NOUS L2T","GPIO":[544,289,1,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1}
|
||||
Nova Digital Basic 1 MS101 {"NAME":"NovaDigBasic1","GPIO":[0,1,0,1,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18}
|
||||
ONiOFF Smart Switch {"NAME":"ONOFF SmartSwitch","GPIO":[1,320,1,1,1,32,0,0,224,1,1,0,0,0],"FLAG":0,"BASE":1}
|
||||
@ -2932,6 +2954,10 @@ Xenon {"NAME":"Xenon SM-PM801-K1","GPIO":[0,320,0,32,2720
|
||||
Xenon 2AC 1USB {"NAME":"Xenon SM-PW801-U1","GPIO":[0,0,0,0,288,32,0,0,224,0,225,0,226,0],"FLAG":0,"BASE":18}
|
||||
```
|
||||
|
||||
## Wall Switch
|
||||
```
|
||||
```
|
||||
|
||||
## Water Sensor
|
||||
```
|
||||
Nedis SmartLife Water Detector {"NAME":"Nedis WIFIDW10WT","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 51,21"}
|
||||
|
@ -19,7 +19,8 @@
|
||||
"openocd_target": "esp32.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32 >= 4M Flash, PSRAM with fix, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -19,7 +19,8 @@
|
||||
"openocd_target": "esp32-solo-1.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-solo1 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
@ -19,7 +19,8 @@
|
||||
"openocd_target": "esp32.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32 >= 4M Flash PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -17,7 +17,8 @@
|
||||
"openocd_target": "esp32c2.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-C2 = 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -17,7 +17,8 @@
|
||||
"openocd_target": "esp32c2.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-C2 = 2M Flash, Tasmota 1245kB Code/OTA, 64k FS",
|
||||
"upload": {
|
||||
|
@ -14,14 +14,11 @@
|
||||
"bluetooth"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32c3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-C3 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -17,7 +17,8 @@
|
||||
"openocd_target": "esp32c3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-C3 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -14,14 +14,11 @@
|
||||
"bluetooth"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32c6.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-C6 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -17,7 +17,8 @@
|
||||
"openocd_target": "esp32c6.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-C6 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -16,7 +16,8 @@
|
||||
"openocd_target": "esp32s2.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S2 >= 4M Flash PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -16,7 +16,8 @@
|
||||
"openocd_target": "esp32s2.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S2 >= 4M Flash PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -8,12 +8,6 @@
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "dout",
|
||||
"hwids": [
|
||||
[
|
||||
"0x303A",
|
||||
"0x1001"
|
||||
]
|
||||
],
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
@ -24,14 +18,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -20,14 +20,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -8,12 +8,6 @@
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
"hwids": [
|
||||
[
|
||||
"0x303A",
|
||||
"0x1001"
|
||||
]
|
||||
],
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
@ -24,14 +18,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -20,14 +20,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M QIO Flash + OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -8,12 +8,6 @@
|
||||
"f_cpu": "240000000L",
|
||||
"f_flash": "80000000L",
|
||||
"flash_mode": "qio",
|
||||
"hwids": [
|
||||
[
|
||||
"0x303A",
|
||||
"0x1001"
|
||||
]
|
||||
],
|
||||
"mcu": "esp32s3",
|
||||
"variant": "esp32s3",
|
||||
"partitions": "partitions/esp32_partition_app2880k_fs320k.csv"
|
||||
@ -24,14 +18,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash QSPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -20,14 +20,11 @@
|
||||
"ethernet"
|
||||
],
|
||||
"debug": {
|
||||
"default_tool": "esp-builtin",
|
||||
"onboard_tools": [
|
||||
"esp-builtin"
|
||||
],
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M QIO Flash + QSPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -21,7 +21,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -23,7 +23,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M OPI Flash + PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -21,7 +21,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -23,7 +23,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M QIO Flash + OPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -21,7 +21,8 @@
|
||||
"openocd_target": "esp32s3.cfg"
|
||||
},
|
||||
"frameworks": [
|
||||
"arduino"
|
||||
"arduino",
|
||||
"espidf"
|
||||
],
|
||||
"name": "Espressif Generic ESP32-S3 >= 4M Flash QSPI PSRAM, Tasmota 2880k Code/OTA, 320k FS",
|
||||
"upload": {
|
||||
|
@ -70,3 +70,10 @@
|
||||
#define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x)
|
||||
|
||||
#endif // TARGET
|
||||
|
||||
// This trick makes sure that 'lto' optimizer does not inline `delay()
|
||||
// so we can override it with `-Wl,--wrap=delay` linker directive
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif // _cplusplus
|
||||
void delay(__UINT32_TYPE__ ms) __attribute__((noinline)) __attribute__ ((noclone));
|
||||
|
@ -177,6 +177,22 @@ char * ToBinary(uint32_t value, char *str, int32_t digits) {
|
||||
return str;
|
||||
}
|
||||
|
||||
char * U64toStr(uint64_t value, char *str) {
|
||||
// str must be at least 24 bytes long
|
||||
uint32_t i = 23;
|
||||
str[--i] = 0; // end of string
|
||||
do {
|
||||
uint64_t m = value;
|
||||
value /= 10;
|
||||
char c = m - 10 * value;
|
||||
str[--i] = c < 10 ? c + '0' : c + 'A' - 10;
|
||||
} while (value);
|
||||
if (i) {
|
||||
memmove(str, str +i, 23 -i);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
char * U64toHex(uint64_t value, char *str, uint32_t zeroleads) {
|
||||
// str must be at least 17 bytes long
|
||||
str[16] = 0; // end of string
|
||||
@ -310,6 +326,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'B': // Pointer to SBuffer
|
||||
{
|
||||
if (cur_val < min_valid_ptr) { new_val_str = ext_invalid_mem; }
|
||||
@ -326,6 +343,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// '%_b' outputs a uint32_t to binary
|
||||
// '%8_b' outputs a uint8_t to binary
|
||||
case 'b': // Binary, decimals indicates the zero prefill
|
||||
@ -416,6 +434,7 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// '%_X' outputs a 64 bits unsigned int to uppercase HEX with 16 digits
|
||||
case 'X': // input is `uint64_t*`, printed as 16 hex digits (no prefix 0x)
|
||||
{
|
||||
@ -429,6 +448,20 @@ int32_t ext_vsnprintf_P(char * out_buf, size_t buf_len, const char * fmt_P, va_l
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// '%_U' outputs a 64 bits unsigned int to decimal
|
||||
case 'U': // input is `uint64_t*`, printed as decimal
|
||||
{
|
||||
if (cur_val < min_valid_ptr) { new_val_str = ext_invalid_mem; }
|
||||
else {
|
||||
U64toStr(*(uint64_t*)cur_val, hex);
|
||||
new_val_str = copyStr(hex);
|
||||
if (new_val_str == nullptr) { goto free_allocs; }
|
||||
allocs[alloc_idx++] = new_val_str;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
*cur_val_ptr = new_val_str;
|
||||
*fmt = 's'; // replace `%_X` with `%0s` to display a string instead
|
||||
|
@ -66,11 +66,14 @@ void test_ext_snprintf_P(void) {
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
ext_snprintf_P(c, sizeof(c), "Float default=%*_f, int(3)=%*_f, int(3)=%*_f, int(3)=%*_f, 6dec=%*_f", 1, &fpi, 4, &f3, -4, &f3, -4, &f31, -8, &fpi);
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
uint64_t u641 = 0x1122334455667788LL;
|
||||
uint64_t u642 = 0x0123456789ABCDEFLL;
|
||||
uint64_t u643 = 0xFEDCBA9876543210LL;
|
||||
|
||||
uint64_t u641 = 0x1122334455667788LL; // 1234605616436508552
|
||||
uint64_t u642 = 0x0123456789ABCDEFLL; // 81985529216486895
|
||||
uint64_t u643 = 0xFEDCBA9876543210LL; // 18364758544493064720
|
||||
ext_snprintf_P(c, sizeof(c), "Int64 0x%_X 0x%_X 0x%_X", &u641, &u642, &u643);
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
ext_snprintf_P(c, sizeof(c), "Int64 decimal %_U %_U %_U", &u641, &u642, &u643);
|
||||
Serial.printf("--> out=%s\n", c);
|
||||
|
||||
// ext_snprintf_P(c, sizeof(c), "Float default=%*_f, int(3)=%*_f, int(3)=%*_f, int(3)=%*_f, 6dec=%*_f", &fpi, &f3, &f3, &f31, &fpi);
|
||||
|
||||
|
@ -123,7 +123,9 @@ void TasmotaSerial::end(void) {
|
||||
}
|
||||
|
||||
TasmotaSerial::~TasmotaSerial(void) {
|
||||
end();
|
||||
if (m_valid) {
|
||||
end();
|
||||
}
|
||||
}
|
||||
|
||||
bool TasmotaSerial::isValidGPIOpin(int pin) {
|
||||
@ -136,7 +138,12 @@ bool TasmotaSerial::isValidGPIOpin(int pin) {
|
||||
}
|
||||
|
||||
void TasmotaSerial::setTransmitEnablePin(int tx_enable_pin) {
|
||||
#ifdef ESP8266
|
||||
if ((tx_enable_pin > -1) && (isValidGPIOpin(tx_enable_pin) || (16 == tx_enable_pin))) {
|
||||
#endif
|
||||
#ifdef ESP32
|
||||
if ((tx_enable_pin > -1) && isValidGPIOpin(tx_enable_pin)) {
|
||||
#endif
|
||||
m_tx_enable_pin = tx_enable_pin;
|
||||
pinMode(m_tx_enable_pin, OUTPUT);
|
||||
digitalWrite(m_tx_enable_pin, LOW);
|
||||
@ -145,9 +152,9 @@ void TasmotaSerial::setTransmitEnablePin(int tx_enable_pin) {
|
||||
|
||||
#ifdef ESP32
|
||||
bool TasmotaSerial::freeUart(void) {
|
||||
for (uint32_t i = SOC_UART_NUM -1; i >= 0; i--) {
|
||||
for (uint32_t i = SOC_UART_HP_NUM -1; i >= 0; i--) {
|
||||
if (0 == bitRead(tasmota_serial_uart_bitmap, i)) {
|
||||
m_uart = i;
|
||||
m_uart = uart_port_t(i);
|
||||
bitSet(tasmota_serial_uart_bitmap, m_uart);
|
||||
return true;
|
||||
}
|
||||
@ -161,15 +168,25 @@ void TasmotaSerial::Esp32Begin(void) {
|
||||
if (m_speed <= 9600) {
|
||||
// At 9600, 10 chars are ~10ms
|
||||
uart_set_rx_full_threshold(m_uart, 10);
|
||||
} else {
|
||||
// At 19200, 120 chars are ~60ms
|
||||
// At 76800, 120 chars are ~15ms
|
||||
uart_set_rx_full_threshold(m_uart, 120);
|
||||
}
|
||||
/*
|
||||
} else if (m_speed < 115200) {
|
||||
// At 19200, 120 chars are ~60ms
|
||||
// At 76800, 120 chars are ~15ms
|
||||
uart_set_rx_full_threshold(m_uart, 120);
|
||||
} else {
|
||||
} else if (m_speed == 115200) {
|
||||
// At 115200, 256 chars are ~20ms
|
||||
// Zigbee requires to keep frames together, i.e. 256 bytes max
|
||||
uart_set_rx_full_threshold(m_uart, 256);
|
||||
} else {
|
||||
// At even higher speeds set 75% of the buffer
|
||||
uart_set_rx_full_threshold(m_uart, serial_buffer_size * 3 / 4);
|
||||
}
|
||||
*/
|
||||
// For bitrate below 115200, set the Rx time out to 6 chars instead of the default 10
|
||||
if (m_speed < 115200) {
|
||||
// At 76800 the timeout is ~1ms
|
||||
@ -469,6 +486,42 @@ size_t TasmotaSerial::write(uint8_t b) {
|
||||
return size;
|
||||
}
|
||||
|
||||
#ifdef ESP32
|
||||
// Add ability to change parity on the fly, for RS-485
|
||||
// See https://github.com/arendst/Tasmota/discussions/22272
|
||||
int32_t TasmotaSerial::setConfig(uint32_t config) {
|
||||
|
||||
uint32_t data_bits_before = (m_config & 0xc) >> 2;
|
||||
uint32_t parity_before = m_config & 0x3;
|
||||
uint32_t stop_bits_before = (m_config & 0x30) >> 4;
|
||||
|
||||
uint32_t data_bits = (config & 0xc) >> 2;
|
||||
uint32_t parity = config & 0x3;
|
||||
uint32_t stop_bits = (config & 0x30) >> 4;
|
||||
|
||||
esp_err_t err;
|
||||
|
||||
if (data_bits_before != data_bits) {
|
||||
if (err = uart_set_word_length(m_uart, (uart_word_length_t) data_bits)) {
|
||||
return (int32_t) err;
|
||||
}
|
||||
}
|
||||
if (parity_before != parity) {
|
||||
if (err = uart_set_parity(m_uart, (uart_parity_t) parity)) {
|
||||
return (int32_t) err;
|
||||
}
|
||||
}
|
||||
if (stop_bits_before != stop_bits) {
|
||||
if (err = uart_set_stop_bits(m_uart, (uart_stop_bits_t) stop_bits)) {
|
||||
return (int32_t) err;
|
||||
}
|
||||
}
|
||||
|
||||
m_config = config;
|
||||
return 0; // no error
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ESP8266
|
||||
void IRAM_ATTR TasmotaSerial::rxRead(void) {
|
||||
if (!m_nwmode) {
|
||||
|
@ -33,6 +33,12 @@
|
||||
|
||||
#ifdef ESP32
|
||||
#include <HardwareSerial.h>
|
||||
|
||||
// IDF 5.2 has changed counting UART channels, SOC_UART_NUM includes now LP UARTS too for ESP32-C6 and -P4
|
||||
#ifndef SOC_UART_HP_NUM
|
||||
#define SOC_UART_HP_NUM SOC_UART_NUM // Set new define SOC_UART_HP_NUM in pre IDF 5.2 to SOC_UART_NUM
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
class TasmotaSerial : public Stream {
|
||||
@ -66,6 +72,7 @@ class TasmotaSerial : public Stream {
|
||||
#ifdef ESP32
|
||||
uint32_t getUart(void) const { return m_uart; }
|
||||
HardwareSerial *getesp32hws(void) { return TSerial; }
|
||||
int32_t setConfig(uint32_t config);
|
||||
#endif
|
||||
bool isValid(void) { return m_valid; }
|
||||
bool overflow(void);
|
||||
@ -109,7 +116,7 @@ class TasmotaSerial : public Stream {
|
||||
uint32_t m_speed;
|
||||
uint32_t m_config;
|
||||
HardwareSerial *TSerial;
|
||||
int m_uart = 0;
|
||||
uart_port_t m_uart = uart_port_t(0);
|
||||
#endif
|
||||
|
||||
};
|
||||
|
@ -59,7 +59,7 @@ typedef enum WiFiPhyMode
|
||||
class WiFiHelper {
|
||||
public:
|
||||
#ifdef ESP32
|
||||
static wl_status_t begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity=NULL, const char* wpa2_username=NULL, const char *wpa2_password=NULL, const char* ca_pem=NULL, const char* client_crt=NULL, const char* client_key=NULL, int32_t channel=0, const uint8_t* bssid=0, bool connect=true);
|
||||
static wl_status_t begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity=NULL, const char* wpa2_username=NULL, const char *wpa2_password=NULL, const char* ca_pem=NULL, const char* client_crt=NULL, const char* client_key=NULL, int ttls_phase2_type=-1, int32_t channel=0, const uint8_t* bssid=0, bool connect=true);
|
||||
#endif
|
||||
static wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
|
||||
static wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
|
||||
@ -83,8 +83,15 @@ public:
|
||||
// With ESP32 Core3, the WiFi mac address is not valid until the wifi is actually started
|
||||
// this helper function always provide a valid mac address
|
||||
static String macAddress(void);
|
||||
|
||||
// Auto-fix zone
|
||||
//
|
||||
// After a reconnect, the zone id may not be valid anymore
|
||||
// In such case we detect any "%st<n>" or "%en<n>" zone identifier
|
||||
// and replace with the current zone id
|
||||
static void IPv6ZoneAutoFix(IPAddress &addr, const char* aHostname);
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // WIFIHELPER_H
|
||||
#endif // WIFIHELPER_H
|
||||
|
@ -34,12 +34,14 @@ ip_addr_t dns_save6[DNS_MAX_SERVERS] = {}; // IPv6 DNS servers
|
||||
#include "tasmota_options.h"
|
||||
#include "lwip/dns.h"
|
||||
|
||||
wl_status_t WiFiHelper::begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity, const char* wpa2_username, const char *wpa2_password, const char* ca_pem, const char* client_crt, const char* client_key, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
#if CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT
|
||||
wl_status_t WiFiHelper::begin(const char *wpa2_ssid, wpa2_auth_method_t method, const char *wpa2_identity, const char *wpa2_username, const char *wpa2_password, const char *ca_pem, const char *client_crt, const char *client_key, int ttls_phase2_type, int32_t channel, const uint8_t *bssid, bool connect) {
|
||||
WiFiHelper::scrubDNS();
|
||||
wl_status_t ret = WiFi.begin(wpa2_ssid, method, wpa2_identity, wpa2_username, wpa2_password, ca_pem, client_crt, client_key, channel, bssid, connect);
|
||||
wl_status_t ret = WiFi.begin(wpa2_ssid, method, wpa2_identity, wpa2_username, wpa2_password, ca_pem, client_crt, client_key, ttls_phase2_type, channel, bssid, connect);
|
||||
WiFiHelper::scrubDNS();
|
||||
return ret;
|
||||
}
|
||||
#endif // CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT
|
||||
|
||||
wl_status_t WiFiHelper::begin(const char* ssid, const char *passphrase, int32_t channel, const uint8_t* bssid, bool connect) {
|
||||
WiFiHelper::scrubDNS();
|
||||
@ -240,6 +242,44 @@ static void wifi32_dns_found_callback(const char *name, const ip_addr_t *ipaddr,
|
||||
// AddLog(LOG_LEVEL_DEBUG, "WIF: dns_found=%s", ipaddr ? IPAddress(*ipaddr).toString().c_str() : "<null>");
|
||||
}
|
||||
|
||||
// Auto-fix zone
|
||||
//
|
||||
// After a reconnect, the zone id may not be valid anymore
|
||||
// In such case we detect any "%st<n>" or "%en<n>" zone identifier
|
||||
// and replace with the current zone id
|
||||
extern bool WifiGetIPv6LinkLocal(IPAddress *ip);
|
||||
extern bool EthernetGetIPv6LinkLocal(IPAddress *ip);
|
||||
void WiFiHelper::IPv6ZoneAutoFix(IPAddress &addr, const char* aHostname) {
|
||||
#ifdef USE_IPV6
|
||||
if ((addr.type() == IPv6) && (addr.zone() == 0)) {
|
||||
// check if hostname contains '%'
|
||||
const char *zone_identifier = strchr(aHostname, '%');
|
||||
if (zone_identifier != nullptr) {
|
||||
uint8_t zone_id = 0;
|
||||
// check if zone id is valid
|
||||
if (strncmp(zone_identifier, "%st", 3) == 0) {
|
||||
IPAddress wifi_link_local;
|
||||
if (WifiGetIPv6LinkLocal(&wifi_link_local)) {
|
||||
zone_id = wifi_link_local.zone();
|
||||
}
|
||||
} else if (strncmp(zone_identifier, "%en", 3) == 0) {
|
||||
IPAddress eth_link_local;
|
||||
if (EthernetGetIPv6LinkLocal(ð_link_local)) {
|
||||
zone_id = eth_link_local.zone();
|
||||
}
|
||||
}
|
||||
if (zone_id) {
|
||||
// convert to ip_addr_t which is currently the only way to change the zone_id
|
||||
ip_addr_t ip_addr;
|
||||
addr.to_ip_addr_t(&ip_addr);
|
||||
ip_addr.u_addr.ip6.zone = zone_id;
|
||||
addr = IPAddress(&ip_addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the given hostname to an IP address.
|
||||
* @param aHostname Name to be resolved
|
||||
@ -281,6 +321,7 @@ int WiFiHelper::hostByName(const char* aHostname, IPAddress& aResult, int32_t ti
|
||||
if (!ip_addr_isany_val(dns_ipaddr)) {
|
||||
#ifdef USE_IPV6
|
||||
aResult.from_ip_addr_t(&dns_ipaddr);
|
||||
WiFiHelper::IPv6ZoneAutoFix(aResult, aHostname);
|
||||
#else // USE_IPV6
|
||||
aResult = ip_addr_get_ip4_u32(&dns_ipaddr);
|
||||
#endif // USE_IPV6
|
||||
|
@ -77,4 +77,6 @@ String WiFiHelper::macAddress(void) {
|
||||
return WiFi.macAddress();
|
||||
}
|
||||
|
||||
void WiFiHelper::IPv6ZoneAutoFix(IPAddress &addr, const char* aHostname) {
|
||||
}
|
||||
#endif // ESP8266
|
||||
|
128
lib/default/base64-1.1.1/src/base64.cpp
Normal file
128
lib/default/base64-1.1.1/src/base64.cpp
Normal file
@ -0,0 +1,128 @@
|
||||
/**
|
||||
* Base64 encoding and decoding of strings. Uses '+' for 62, '/' for 63, '=' for padding
|
||||
*/
|
||||
|
||||
#include "base64.hpp"
|
||||
|
||||
unsigned char binary_to_base64(unsigned char v) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if(v < 26) return v + 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if(v < 52) return v + 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if(v < 62) return v - 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(v == 62) return '+';
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(v == 63) return '/';
|
||||
|
||||
return 64;
|
||||
}
|
||||
|
||||
unsigned char base64_to_binary(unsigned char c) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if('A' <= c && c <= 'Z') return c - 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if('a' <= c && c <= 'z') return c - 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if('0' <= c && c <= '9') return c + 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(c == '+') return 62;
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(c == '/') return 63;
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
unsigned int encode_base64_length(unsigned int input_length) {
|
||||
return (input_length + 2)/3*4;
|
||||
}
|
||||
|
||||
unsigned int decode_base64_length(unsigned char input[]) {
|
||||
unsigned char *start = input;
|
||||
|
||||
while(base64_to_binary(input[0]) < 64) {
|
||||
++input;
|
||||
}
|
||||
|
||||
unsigned int input_length = input - start;
|
||||
|
||||
unsigned int output_length = input_length/4*3;
|
||||
|
||||
switch(input_length % 4) {
|
||||
default: return output_length;
|
||||
case 2: return output_length + 1;
|
||||
case 3: return output_length + 2;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int encode_base64(unsigned char input[], unsigned int input_length, unsigned char output[]) {
|
||||
unsigned int full_sets = input_length/3;
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 0; i < full_sets; ++i) {
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2 | input[2] >> 6);
|
||||
output[3] = binary_to_base64( input[2] & 0x3F);
|
||||
|
||||
input += 3;
|
||||
output += 4;
|
||||
}
|
||||
|
||||
switch(input_length % 3) {
|
||||
case 0:
|
||||
output[0] = '\0';
|
||||
break;
|
||||
case 1:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4);
|
||||
output[2] = '=';
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
case 2:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2);
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
}
|
||||
|
||||
return encode_base64_length(input_length);
|
||||
}
|
||||
|
||||
unsigned int decode_base64(unsigned char input[], unsigned char output[]) {
|
||||
unsigned int output_length = decode_base64_length(input);
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 2; i < output_length; i += 3) {
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
output[2] = base64_to_binary(input[2]) << 6 | base64_to_binary(input[3]);
|
||||
|
||||
input += 4;
|
||||
output += 3;
|
||||
}
|
||||
|
||||
switch(output_length % 3) {
|
||||
case 1:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
break;
|
||||
case 2:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
return output_length;
|
||||
}
|
@ -69,127 +69,4 @@ unsigned int encode_base64(unsigned char input[], unsigned int input_length, uns
|
||||
*/
|
||||
unsigned int decode_base64(unsigned char input[], unsigned char output[]);
|
||||
|
||||
unsigned char binary_to_base64(unsigned char v) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if(v < 26) return v + 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if(v < 52) return v + 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if(v < 62) return v - 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(v == 62) return '+';
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(v == 63) return '/';
|
||||
|
||||
return 64;
|
||||
}
|
||||
|
||||
unsigned char base64_to_binary(unsigned char c) {
|
||||
// Capital letters - 'A' is ascii 65 and base64 0
|
||||
if('A' <= c && c <= 'Z') return c - 'A';
|
||||
|
||||
// Lowercase letters - 'a' is ascii 97 and base64 26
|
||||
if('a' <= c && c <= 'z') return c - 71;
|
||||
|
||||
// Digits - '0' is ascii 48 and base64 52
|
||||
if('0' <= c && c <= '9') return c + 4;
|
||||
|
||||
// '+' is ascii 43 and base64 62
|
||||
if(c == '+') return 62;
|
||||
|
||||
// '/' is ascii 47 and base64 63
|
||||
if(c == '/') return 63;
|
||||
|
||||
return 255;
|
||||
}
|
||||
|
||||
unsigned int encode_base64_length(unsigned int input_length) {
|
||||
return (input_length + 2)/3*4;
|
||||
}
|
||||
|
||||
unsigned int decode_base64_length(unsigned char input[]) {
|
||||
unsigned char *start = input;
|
||||
|
||||
while(base64_to_binary(input[0]) < 64) {
|
||||
++input;
|
||||
}
|
||||
|
||||
unsigned int input_length = input - start;
|
||||
|
||||
unsigned int output_length = input_length/4*3;
|
||||
|
||||
switch(input_length % 4) {
|
||||
default: return output_length;
|
||||
case 2: return output_length + 1;
|
||||
case 3: return output_length + 2;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int encode_base64(unsigned char input[], unsigned int input_length, unsigned char output[]) {
|
||||
unsigned int full_sets = input_length/3;
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 0; i < full_sets; ++i) {
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2 | input[2] >> 6);
|
||||
output[3] = binary_to_base64( input[2] & 0x3F);
|
||||
|
||||
input += 3;
|
||||
output += 4;
|
||||
}
|
||||
|
||||
switch(input_length % 3) {
|
||||
case 0:
|
||||
output[0] = '\0';
|
||||
break;
|
||||
case 1:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4);
|
||||
output[2] = '=';
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
case 2:
|
||||
output[0] = binary_to_base64( input[0] >> 2);
|
||||
output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4);
|
||||
output[2] = binary_to_base64((input[1] & 0x0F) << 2);
|
||||
output[3] = '=';
|
||||
output[4] = '\0';
|
||||
break;
|
||||
}
|
||||
|
||||
return encode_base64_length(input_length);
|
||||
}
|
||||
|
||||
unsigned int decode_base64(unsigned char input[], unsigned char output[]) {
|
||||
unsigned int output_length = decode_base64_length(input);
|
||||
|
||||
// While there are still full sets of 24 bits...
|
||||
for(unsigned int i = 2; i < output_length; i += 3) {
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
output[2] = base64_to_binary(input[2]) << 6 | base64_to_binary(input[3]);
|
||||
|
||||
input += 4;
|
||||
output += 3;
|
||||
}
|
||||
|
||||
switch(output_length % 3) {
|
||||
case 1:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
break;
|
||||
case 2:
|
||||
output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4;
|
||||
output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
return output_length;
|
||||
}
|
||||
|
||||
#endif // ifndef
|
||||
|
@ -1,4 +1,3 @@
|
||||
|
||||
#if defined(CAMERA_MODEL_WROVER_KIT)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
@ -14,6 +13,7 @@
|
||||
#define Y4_GPIO_NUM 18
|
||||
#define Y3_GPIO_NUM 5
|
||||
#define Y2_GPIO_NUM 4
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 23
|
||||
#define PCLK_GPIO_NUM 22
|
||||
@ -33,12 +33,12 @@
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
|
||||
#elif defined(CAMERA_MODEL_ESP32S3_EYE)
|
||||
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 15
|
||||
@ -73,6 +73,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -92,6 +93,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -111,6 +113,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -130,6 +133,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 17
|
||||
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -149,6 +153,7 @@
|
||||
#define Y4_GPIO_NUM 34
|
||||
#define Y3_GPIO_NUM 35
|
||||
#define Y2_GPIO_NUM 32
|
||||
|
||||
#define VSYNC_GPIO_NUM 22
|
||||
#define HREF_GPIO_NUM 26
|
||||
#define PCLK_GPIO_NUM 21
|
||||
@ -168,6 +173,7 @@
|
||||
#define Y4_GPIO_NUM 19
|
||||
#define Y3_GPIO_NUM 18
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 25
|
||||
#define HREF_GPIO_NUM 23
|
||||
#define PCLK_GPIO_NUM 22
|
||||
@ -187,6 +193,7 @@
|
||||
#define Y4_GPIO_NUM 4
|
||||
#define Y3_GPIO_NUM 14
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 27
|
||||
#define HREF_GPIO_NUM 25
|
||||
#define PCLK_GPIO_NUM 19
|
||||
@ -206,6 +213,7 @@
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
@ -225,6 +233,7 @@
|
||||
#define Y4_GPIO_NUM 14
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
@ -244,6 +253,7 @@
|
||||
#define Y4_GPIO_NUM 4
|
||||
#define Y3_GPIO_NUM 14
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 27
|
||||
#define HREF_GPIO_NUM 25
|
||||
#define PCLK_GPIO_NUM 19
|
||||
@ -263,6 +273,7 @@
|
||||
#define Y4_GPIO_NUM 4
|
||||
#define Y3_GPIO_NUM 14
|
||||
#define Y2_GPIO_NUM 5
|
||||
|
||||
#define VSYNC_GPIO_NUM 27
|
||||
#define HREF_GPIO_NUM 25
|
||||
#define PCLK_GPIO_NUM 19
|
||||
@ -282,6 +293,7 @@
|
||||
#define Y4_GPIO_NUM 26
|
||||
#define Y3_GPIO_NUM 13
|
||||
#define Y2_GPIO_NUM 34
|
||||
|
||||
#define VSYNC_GPIO_NUM 5
|
||||
#define HREF_GPIO_NUM 27
|
||||
#define PCLK_GPIO_NUM 25
|
||||
@ -302,12 +314,12 @@
|
||||
#define Y4_GPIO_NUM 8
|
||||
#define Y3_GPIO_NUM 9
|
||||
#define Y2_GPIO_NUM 11
|
||||
|
||||
#define VSYNC_GPIO_NUM 6
|
||||
#define HREF_GPIO_NUM 7
|
||||
#define PCLK_GPIO_NUM 13
|
||||
|
||||
#elif defined(CAMERA_MODEL_TTGO_T_CAM_SIM)
|
||||
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM 18
|
||||
#define XCLK_GPIO_NUM 14
|
||||
@ -322,6 +334,7 @@
|
||||
#define Y4_GPIO_NUM 8
|
||||
#define Y3_GPIO_NUM 9
|
||||
#define Y2_GPIO_NUM 11
|
||||
|
||||
#define VSYNC_GPIO_NUM 6
|
||||
#define HREF_GPIO_NUM 7
|
||||
#define PCLK_GPIO_NUM 13
|
||||
@ -332,6 +345,27 @@
|
||||
#define PCIE_TX_PIN 45
|
||||
#define PCIE_RX_PIN 46
|
||||
#define PCIE_LED_PIN 21
|
||||
|
||||
#elif defined(CAMERA_MODEL_XIAO_ESP32S3_SENSE)
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
#define XCLK_GPIO_NUM 10
|
||||
#define SIOD_GPIO_NUM 40
|
||||
#define SIOC_GPIO_NUM 39
|
||||
|
||||
#define Y9_GPIO_NUM 48
|
||||
#define Y8_GPIO_NUM 11
|
||||
#define Y7_GPIO_NUM 12
|
||||
#define Y6_GPIO_NUM 14
|
||||
#define Y5_GPIO_NUM 16
|
||||
#define Y4_GPIO_NUM 18
|
||||
#define Y3_GPIO_NUM 17
|
||||
#define Y2_GPIO_NUM 15
|
||||
|
||||
#define VSYNC_GPIO_NUM 38
|
||||
#define HREF_GPIO_NUM 47
|
||||
#define PCLK_GPIO_NUM 13
|
||||
|
||||
#else
|
||||
#define PWDN_GPIO_NUM -1
|
||||
#define RESET_GPIO_NUM -1
|
||||
@ -347,6 +381,7 @@
|
||||
#define Y4_GPIO_NUM -1
|
||||
#define Y3_GPIO_NUM -1
|
||||
#define Y2_GPIO_NUM -1
|
||||
|
||||
#define VSYNC_GPIO_NUM -1
|
||||
#define HREF_GPIO_NUM -1
|
||||
#define PCLK_GPIO_NUM -1
|
||||
|
@ -45,17 +45,15 @@ bool AudioFileSourceICYStream::open(const char *url)
|
||||
{
|
||||
static const char *hdr[] = { "icy-metaint", "icy-name", "icy-genre", "icy-br" };
|
||||
pos = 0;
|
||||
http.begin(client, url);
|
||||
if (!http.begin(client, url)) {
|
||||
cb.st(STATUS_HTTPFAIL, PSTR("Can't connect to url"));
|
||||
return false;
|
||||
}
|
||||
http.addHeader("Icy-MetaData", "1");
|
||||
http.collectHeaders( hdr, 4 );
|
||||
http.setReuse(true);
|
||||
http.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS);
|
||||
int code = http.GET();
|
||||
if (code != HTTP_CODE_OK) {
|
||||
http.end();
|
||||
cb.st(STATUS_HTTPFAIL, PSTR("Can't open HTTP request"));
|
||||
return false;
|
||||
}
|
||||
if (http.hasHeader(hdr[0])) {
|
||||
String ret = http.header(hdr[0]);
|
||||
icyMetaInt = ret.toInt();
|
||||
|
@ -18,7 +18,7 @@
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma GCC optimize ("O3")
|
||||
#pragma GCC optimize ("Os")
|
||||
|
||||
#include "AudioGeneratorAAC.h"
|
||||
|
||||
|
@ -58,6 +58,10 @@
|
||||
|
||||
#include "AudioGeneratorMIDI.h"
|
||||
|
||||
#if defined(ESP32)
|
||||
// Do not build, Espressif's GCC8+ has a compiler bug
|
||||
#else // __GNUC__ == 8
|
||||
|
||||
#pragma GCC optimize ("O3")
|
||||
|
||||
#define TSF_NO_STDIO
|
||||
@ -637,3 +641,4 @@ void AudioGeneratorMIDI::MakeStreamFromAFS(AudioFileSource *src, tsf_stream *afs
|
||||
afs->size = &afs_size;
|
||||
}
|
||||
|
||||
#endif //__GNUC__ == 8
|
||||
|
@ -21,6 +21,10 @@
|
||||
#ifndef _AUDIOGENERATORMIDI_H
|
||||
#define _AUDIOGENERATORMIDI_H
|
||||
|
||||
#if defined(ESP32)
|
||||
// Do not build, Espressif's GCC8+ has a compiler bug
|
||||
#else // __GNUC__ == 8
|
||||
|
||||
#include "AudioGenerator.h"
|
||||
|
||||
#define TSF_NO_STDIO
|
||||
@ -90,7 +94,7 @@ class AudioGeneratorMIDI : public AudioGenerator
|
||||
unsigned long earliest_time = 0;
|
||||
|
||||
struct tonegen_status { /* current status of a tone generator */
|
||||
bool playing; /* is it playing? */
|
||||
bool playing; /* is it playing? */
|
||||
char track; /* if so, which track is the note from? */
|
||||
char note; /* what note is playing? */
|
||||
char instrument; /* what instrument? */
|
||||
@ -176,6 +180,7 @@ class AudioGeneratorMIDI : public AudioGenerator
|
||||
short samplesRendered[256];
|
||||
};
|
||||
|
||||
#endif //__GNUC__ == 8
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -186,7 +186,9 @@ bool AudioGeneratorMP3::GetOneSample(int16_t sample[2])
|
||||
// If we're here, we have one decoded frame and sent 0 or more samples out
|
||||
if (samplePtr < synth->pcm.length) {
|
||||
sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr];
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
if(lastChannels == 2) {
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
}
|
||||
samplePtr++;
|
||||
} else {
|
||||
samplePtr = 0;
|
||||
@ -200,7 +202,9 @@ bool AudioGeneratorMP3::GetOneSample(int16_t sample[2])
|
||||
}
|
||||
// for IGNORE and CONTINUE, just play what we have now
|
||||
sample[AudioOutput::LEFTCHANNEL ] = synth->pcm.samples[0][samplePtr];
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
if(lastChannels == 2) {
|
||||
sample[AudioOutput::RIGHTCHANNEL] = synth->pcm.samples[1][samplePtr];
|
||||
}
|
||||
samplePtr++;
|
||||
}
|
||||
return true;
|
||||
|
@ -190,7 +190,7 @@ bool AudioOutputMixer::loop()
|
||||
}
|
||||
}
|
||||
if (avail) {
|
||||
int16_t s[2];
|
||||
int16_t s[2] = {0};
|
||||
if (leftAccum[readPtr] > 32767) {
|
||||
s[LEFTCHANNEL] = 32767;
|
||||
} else if (leftAccum[readPtr] < -32767) {
|
||||
|
@ -54,7 +54,7 @@
|
||||
#define AAC_ENABLE_SBR 1
|
||||
#endif
|
||||
|
||||
#pragma GCC optimize ("O3")
|
||||
#pragma GCC optimize ("Os")
|
||||
|
||||
#include "aacdec.h"
|
||||
#include "statname.h"
|
||||
|
@ -482,7 +482,7 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch)
|
||||
int pitch_index;
|
||||
VARDECL( opus_val16, lp_pitch_buf );
|
||||
SAVE_STACK;
|
||||
opus_val16 *lp_pitch_buf = (opus_val16*)malloc((DECODE_BUFFER_SIZE>>1) * sizeof(opus_val16)); //ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
|
||||
ALLOC( lp_pitch_buf, DECODE_BUFFER_SIZE>>1, opus_val16 );
|
||||
pitch_downsample(decode_mem, lp_pitch_buf,
|
||||
DECODE_BUFFER_SIZE, C, arch);
|
||||
pitch_search(lp_pitch_buf+(PLC_PITCH_LAG_MAX>>1), lp_pitch_buf,
|
||||
@ -490,7 +490,6 @@ static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch)
|
||||
PLC_PITCH_LAG_MAX-PLC_PITCH_LAG_MIN, &pitch_index, arch);
|
||||
pitch_index = PLC_PITCH_LAG_MAX-pitch_index;
|
||||
RESTORE_STACK;
|
||||
free(lp_pitch_buf);
|
||||
return pitch_index;
|
||||
}
|
||||
|
||||
|
@ -207,4 +207,3 @@
|
||||
# define __restrict__
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -171,7 +171,7 @@ extern "C" {
|
||||
#define OPUS_GET_IN_DTX_REQUEST 4049
|
||||
|
||||
/** Defines for the presence of extended APIs. */
|
||||
#define OPUS_HAVE_OPUS_PROJECTION_H
|
||||
// #define OPUS_HAVE_OPUS_PROJECTION_H
|
||||
|
||||
/* Macros to trigger compilation errors when the wrong types are provided to a CTL */
|
||||
#define __opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x))
|
||||
|
@ -239,30 +239,21 @@ opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus
|
||||
|
||||
int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len)
|
||||
{
|
||||
OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer));
|
||||
OpusRepacketizer rp;
|
||||
opus_int32 ret;
|
||||
if (len < 1) {
|
||||
free(rp);
|
||||
if (len < 1)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
if (len==new_len) {
|
||||
free(rp);
|
||||
if (len==new_len)
|
||||
return OPUS_OK;
|
||||
}
|
||||
else if (len > new_len) {
|
||||
free(rp);
|
||||
else if (len > new_len)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
opus_repacketizer_init(rp);
|
||||
opus_repacketizer_init(&rp);
|
||||
/* Moving payload to the end of the packet so we can do in-place padding */
|
||||
OPUS_MOVE(data+new_len-len, data, len);
|
||||
ret = opus_repacketizer_cat(rp, data+new_len-len, len);
|
||||
if (ret != OPUS_OK) {
|
||||
free(rp);
|
||||
ret = opus_repacketizer_cat(&rp, data+new_len-len, len);
|
||||
if (ret != OPUS_OK)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, new_len, 0, 1);
|
||||
free(rp);
|
||||
ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, new_len, 0, 1);
|
||||
if (ret > 0)
|
||||
return OPUS_OK;
|
||||
else
|
||||
@ -271,20 +262,15 @@ int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len)
|
||||
|
||||
opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len)
|
||||
{
|
||||
OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer));
|
||||
OpusRepacketizer rp;
|
||||
opus_int32 ret;
|
||||
if (len < 1) {
|
||||
free(rp);
|
||||
if (len < 1)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
opus_repacketizer_init(rp);
|
||||
ret = opus_repacketizer_cat(rp, data, len);
|
||||
if (ret < 0) {
|
||||
free(rp);
|
||||
opus_repacketizer_init(&rp);
|
||||
ret = opus_repacketizer_cat(&rp, data, len);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, data, len, 0, 0);
|
||||
free(rp);
|
||||
ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, data, len, 0, 0);
|
||||
celt_assert(ret > 0 && ret <= len);
|
||||
return ret;
|
||||
}
|
||||
@ -326,14 +312,12 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in
|
||||
unsigned char toc;
|
||||
opus_int16 size[48];
|
||||
opus_int32 packet_offset;
|
||||
OpusRepacketizer *rp = (OpusRepacketizer*)malloc(sizeof(OpusRepacketizer));
|
||||
OpusRepacketizer rp;
|
||||
unsigned char *dst;
|
||||
opus_int32 dst_len;
|
||||
|
||||
if (len < 1){
|
||||
free(rp);
|
||||
if (len < 1)
|
||||
return OPUS_BAD_ARG;
|
||||
}
|
||||
dst = data;
|
||||
dst_len = 0;
|
||||
/* Unpad all frames */
|
||||
@ -341,34 +325,25 @@ opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, in
|
||||
{
|
||||
opus_int32 ret;
|
||||
int self_delimited = s!=nb_streams-1;
|
||||
if (len<=0) {
|
||||
free(rp);
|
||||
if (len<=0)
|
||||
return OPUS_INVALID_PACKET;
|
||||
}
|
||||
opus_repacketizer_init(rp);
|
||||
opus_repacketizer_init(&rp);
|
||||
ret = opus_packet_parse_impl(data, len, self_delimited, &toc, NULL,
|
||||
size, NULL, &packet_offset);
|
||||
if (ret<0) {
|
||||
free(rp);
|
||||
if (ret<0)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_cat_impl(rp, data, packet_offset, self_delimited);
|
||||
if (ret < 0) {
|
||||
free(rp);
|
||||
ret = opus_repacketizer_cat_impl(&rp, data, packet_offset, self_delimited);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
ret = opus_repacketizer_out_range_impl(rp, 0, rp->nb_frames, dst, len, self_delimited, 0);
|
||||
if (ret < 0) {
|
||||
free(rp);
|
||||
ret = opus_repacketizer_out_range_impl(&rp, 0, rp.nb_frames, dst, len, self_delimited, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
dst_len += ret;
|
||||
dst += ret;
|
||||
data += packet_offset;
|
||||
len -= packet_offset;
|
||||
}
|
||||
free(rp);
|
||||
return dst_len;
|
||||
}
|
||||
|
||||
|
@ -80,11 +80,10 @@ void silk_NLSF2A(
|
||||
};
|
||||
const unsigned char *ordering;
|
||||
opus_int k, i, dd;
|
||||
opus_int32 *cos_LSF_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC );
|
||||
opus_int32 *P = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1));
|
||||
opus_int32 *Q= (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC / 2 + 1));
|
||||
opus_int32 cos_LSF_QA[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 P[ SILK_MAX_ORDER_LPC / 2 + 1 ], Q[ SILK_MAX_ORDER_LPC / 2 + 1 ];
|
||||
opus_int32 Ptmp, Qtmp, f_int, f_frac, cos_val, delta;
|
||||
opus_int32 *a32_QA1 = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC );
|
||||
opus_int32 a32_QA1[ SILK_MAX_ORDER_LPC ];
|
||||
|
||||
silk_assert( LSF_COS_TAB_SZ_FIX == 128 );
|
||||
celt_assert( d==10 || d==16 );
|
||||
@ -138,9 +137,5 @@ void silk_NLSF2A(
|
||||
a_Q12[ k ] = (opus_int16)silk_RSHIFT_ROUND( a32_QA1[ k ], QA + 1 - 12 ); /* QA+1 -> Q12 */
|
||||
}
|
||||
}
|
||||
free(cos_LSF_QA);
|
||||
free(P);
|
||||
free(Q);
|
||||
free(a32_QA1);
|
||||
}
|
||||
|
||||
|
@ -57,12 +57,12 @@ void silk_burg_modified_c(
|
||||
opus_int k, n, s, lz, rshifts, reached_max_gain;
|
||||
opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2;
|
||||
const opus_int16 *x_ptr;
|
||||
opus_int32 *C_first_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 *C_last_row = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 *Af_QA = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 *CAf = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1));
|
||||
opus_int32 *CAb = (opus_int32*)malloc(sizeof(opus_int32) * (SILK_MAX_ORDER_LPC+1));
|
||||
opus_int32 *xcorr = (opus_int32*)malloc(sizeof(opus_int32) * SILK_MAX_ORDER_LPC);
|
||||
opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ];
|
||||
opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ];
|
||||
opus_int32 xcorr[ SILK_MAX_ORDER_LPC ];
|
||||
opus_int64 C0_64;
|
||||
|
||||
celt_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE );
|
||||
@ -277,10 +277,4 @@ void silk_burg_modified_c(
|
||||
*res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */
|
||||
*res_nrg_Q = -rshifts;
|
||||
}
|
||||
free(C_first_row);
|
||||
free(C_last_row);
|
||||
free(Af_QA);
|
||||
free(CAf);
|
||||
free(CAb);
|
||||
free(xcorr);
|
||||
}
|
||||
|
@ -49,8 +49,8 @@ void silk_warped_autocorrelation_FIX_c(
|
||||
{
|
||||
opus_int n, i, lsh;
|
||||
opus_int32 tmp1_QS, tmp2_QS;
|
||||
opus_int32 *state_QS = (opus_int32*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int32));
|
||||
opus_int64 *corr_QC = (opus_int64*)calloc(MAX_SHAPE_LPC_ORDER + 1, sizeof(opus_int64));
|
||||
opus_int32 state_QS[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
|
||||
opus_int64 corr_QC[ MAX_SHAPE_LPC_ORDER + 1 ] = { 0 };
|
||||
|
||||
/* Order must be even */
|
||||
celt_assert( ( order & 1 ) == 0 );
|
||||
@ -88,7 +88,5 @@ void silk_warped_autocorrelation_FIX_c(
|
||||
}
|
||||
}
|
||||
silk_assert( corr_QC[ 0 ] >= 0 ); /* If breaking, decrease QC*/
|
||||
free(state_QS);
|
||||
free(corr_QC);
|
||||
}
|
||||
#endif /* OVERRIDE_silk_warped_autocorrelation_FIX_c */
|
||||
|
@ -48,8 +48,7 @@ void silk_resampler_down2_3(
|
||||
opus_int32 *buf_ptr;
|
||||
SAVE_STACK;
|
||||
|
||||
// ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 );
|
||||
opus_int32 *buf = (opus_int32*)malloc((RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR) * sizeof(opus_int32));
|
||||
ALLOC( buf, RESAMPLER_MAX_BATCH_SIZE_IN + ORDER_FIR, opus_int32 );
|
||||
|
||||
/* Copy buffered samples to start of buffer */
|
||||
silk_memcpy( buf, S, ORDER_FIR * sizeof( opus_int32 ) );
|
||||
@ -100,6 +99,5 @@ void silk_resampler_down2_3(
|
||||
|
||||
/* Copy last part of filtered signal to the state for the next call */
|
||||
silk_memcpy( S, &buf[ nSamplesIn ], ORDER_FIR * sizeof( opus_int32 ) );
|
||||
free(buf);
|
||||
RESTORE_STACK;
|
||||
}
|
||||
|
@ -42,6 +42,16 @@
|
||||
|
||||
*/
|
||||
|
||||
// ESP32 as of 3.x has a compiler bug in this section, with the G++ generated assembly
|
||||
// being illegal. There's nothing wrong with the code here, it just looks like an
|
||||
// Xtensa backend issue. Until that's fixed, no MIDI for you!
|
||||
///home/earle/Arduino/libraries/ESP8266Audio/src/libtinysoundfont/tsf.h: In function 'void tsf_channel_midi_control(tsf*, int, int, int)':
|
||||
// /home/earle/Arduino/libraries/ESP8266Audio/src/libtinysoundfont/tsf.h:2101:1: error: insn does not satisfy its constraints:
|
||||
// 2101 | }
|
||||
// | ^
|
||||
|
||||
#if !defined(ESP32)
|
||||
|
||||
#ifndef TSF_INCLUDE_TSF_INL
|
||||
#define TSF_INCLUDE_TSF_INL
|
||||
|
||||
@ -2149,3 +2159,5 @@ TSFDEF float tsf_channel_get_tuning(tsf* f, int channel)
|
||||
#endif
|
||||
|
||||
#endif //TSF_IMPLEMENTATION
|
||||
|
||||
#endif // ! ESP32
|
||||
|
35
lib/lib_audio/ESP8266Audio/src/libwebm/.clang-format
Normal file
35
lib/lib_audio/ESP8266Audio/src/libwebm/.clang-format
Normal file
@ -0,0 +1,35 @@
|
||||
---
|
||||
Language: Cpp
|
||||
BasedOnStyle: Google
|
||||
AlignTrailingComments: false
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
|
||||
# A separate 'Other libraries' grouping is added before libwebm's headers for
|
||||
# gtest and gmock includes. This is based on the suggested grouping in the
|
||||
# Google C++ Style Guide:
|
||||
# https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes
|
||||
# The other categories come from `clang-format-14 --dump-config --style=Google`.
|
||||
# See the clang-format documentation for more information on this option:
|
||||
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html#includecategories
|
||||
IncludeCategories:
|
||||
- Regex: '^<ext/.*\.h>'
|
||||
Priority: 2
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^<.*\.h>'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^<.*'
|
||||
Priority: 2
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '^((<|")(gtest|gmock)/)'
|
||||
Priority: 3
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
||||
- Regex: '.*'
|
||||
Priority: 4
|
||||
SortPriority: 0
|
||||
CaseSensitive: false
|
6
lib/lib_audio/ESP8266Audio/src/libwebm/.gitattributes
vendored
Normal file
6
lib/lib_audio/ESP8266Audio/src/libwebm/.gitattributes
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
*.sln eol=crlf
|
||||
*.vcproj eol=crlf
|
||||
*.vsprops eol=crlf
|
||||
*.vcxproj eol=crlf
|
||||
*.mkv -text -diff
|
||||
*.webm -text -diff
|
36
lib/lib_audio/ESP8266Audio/src/libwebm/.gitignore
vendored
Normal file
36
lib/lib_audio/ESP8266Audio/src/libwebm/.gitignore
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
*.MKV
|
||||
*.a
|
||||
*.cmake
|
||||
*.d
|
||||
*.exe
|
||||
*.mkv
|
||||
*.ncb
|
||||
*.o
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.so*
|
||||
*.suo
|
||||
*.swp
|
||||
*.user
|
||||
*~
|
||||
.vscode
|
||||
/*.webm
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
Debug
|
||||
Makefile
|
||||
Release
|
||||
core
|
||||
dumpvtt
|
||||
ipch
|
||||
mkvmuxer_sample
|
||||
mkvmuxer_tests
|
||||
mkvparser_sample
|
||||
mkvparser_tests
|
||||
vp9_header_parser_tests
|
||||
vp9_level_stats_tests
|
||||
vttdemux
|
||||
webm2pes
|
||||
webm2pes_tests
|
||||
webm2ts
|
||||
webm_info
|
6
lib/lib_audio/ESP8266Audio/src/libwebm/.mailmap
Normal file
6
lib/lib_audio/ESP8266Audio/src/libwebm/.mailmap
Normal file
@ -0,0 +1,6 @@
|
||||
Hui Su <huisu@google.com>
|
||||
Matthew Heaney <matthewjheaney@google.com>
|
||||
Neil Birkbeck <birkbeck@google.com>
|
||||
Patrik Carlsson <patrik2.carlsson@sonymobile.com>
|
||||
Roberto Alanis Baez <alanisbaez@google.com>
|
||||
Tom Finegan <tomfinegan@google.com> <tomfinegan@chromium.org>
|
441
lib/lib_audio/ESP8266Audio/src/libwebm/.pylintrc
Normal file
441
lib/lib_audio/ESP8266Audio/src/libwebm/.pylintrc
Normal file
@ -0,0 +1,441 @@
|
||||
# This Pylint rcfile contains a best-effort configuration to uphold the
|
||||
# best-practices and style described in the Google Python style guide:
|
||||
# https://google.github.io/styleguide/pyguide.html
|
||||
#
|
||||
# Its canonical open-source location is:
|
||||
# https://google.github.io/styleguide/pylintrc
|
||||
|
||||
[MASTER]
|
||||
|
||||
# Files or directories to be skipped. They should be base names, not paths.
|
||||
ignore=third_party
|
||||
|
||||
# Files or directories matching the regex patterns are skipped. The regex
|
||||
# matches against base names, not paths.
|
||||
ignore-patterns=
|
||||
|
||||
# Pickle collected data for later comparisons.
|
||||
persistent=no
|
||||
|
||||
# List of plugins (as comma separated values of python modules names) to load,
|
||||
# usually to register additional checkers.
|
||||
load-plugins=
|
||||
|
||||
# Use multiple processes to speed up Pylint.
|
||||
jobs=4
|
||||
|
||||
# Allow loading of arbitrary C extensions. Extensions are imported into the
|
||||
# active Python interpreter and may run arbitrary code.
|
||||
unsafe-load-any-extension=no
|
||||
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
# Only show warnings with the listed confidence levels. Leave empty to show
|
||||
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
|
||||
confidence=
|
||||
|
||||
# Enable the message, report, category or checker with the given id(s). You can
|
||||
# either give multiple identifier separated by comma (,) or put this option
|
||||
# multiple time (only on the command line, not in the configuration file where
|
||||
# it should appear only once). See also the "--disable" option for examples.
|
||||
#enable=
|
||||
|
||||
# Disable the message, report, category or checker with the given id(s). You
|
||||
# can either give multiple identifiers separated by comma (,) or put this
|
||||
# option multiple times (only on the command line, not in the configuration
|
||||
# file where it should appear only once).You can also use "--disable=all" to
|
||||
# disable everything first and then reenable specific checks. For example, if
|
||||
# you want to run only the similarities checker, you can use "--disable=all
|
||||
# --enable=similarities". If you want to run only the classes checker, but have
|
||||
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||
# --disable=W"
|
||||
disable=abstract-method,
|
||||
apply-builtin,
|
||||
arguments-differ,
|
||||
attribute-defined-outside-init,
|
||||
backtick,
|
||||
bad-option-value,
|
||||
basestring-builtin,
|
||||
buffer-builtin,
|
||||
c-extension-no-member,
|
||||
consider-using-enumerate,
|
||||
cmp-builtin,
|
||||
cmp-method,
|
||||
coerce-builtin,
|
||||
coerce-method,
|
||||
delslice-method,
|
||||
div-method,
|
||||
duplicate-code,
|
||||
eq-without-hash,
|
||||
execfile-builtin,
|
||||
file-builtin,
|
||||
filter-builtin-not-iterating,
|
||||
fixme,
|
||||
getslice-method,
|
||||
global-statement,
|
||||
hex-method,
|
||||
idiv-method,
|
||||
implicit-str-concat-in-sequence,
|
||||
import-error,
|
||||
import-self,
|
||||
import-star-module-level,
|
||||
inconsistent-return-statements,
|
||||
input-builtin,
|
||||
intern-builtin,
|
||||
invalid-str-codec,
|
||||
locally-disabled,
|
||||
long-builtin,
|
||||
long-suffix,
|
||||
map-builtin-not-iterating,
|
||||
misplaced-comparison-constant,
|
||||
missing-function-docstring,
|
||||
metaclass-assignment,
|
||||
next-method-called,
|
||||
next-method-defined,
|
||||
no-absolute-import,
|
||||
no-else-break,
|
||||
no-else-continue,
|
||||
no-else-raise,
|
||||
no-else-return,
|
||||
no-init, # added
|
||||
no-member,
|
||||
no-name-in-module,
|
||||
no-self-use,
|
||||
nonzero-method,
|
||||
oct-method,
|
||||
old-division,
|
||||
old-ne-operator,
|
||||
old-octal-literal,
|
||||
old-raise-syntax,
|
||||
parameter-unpacking,
|
||||
print-statement,
|
||||
raising-string,
|
||||
range-builtin-not-iterating,
|
||||
raw_input-builtin,
|
||||
rdiv-method,
|
||||
reduce-builtin,
|
||||
relative-import,
|
||||
reload-builtin,
|
||||
round-builtin,
|
||||
setslice-method,
|
||||
signature-differs,
|
||||
standarderror-builtin,
|
||||
suppressed-message,
|
||||
sys-max-int,
|
||||
too-few-public-methods,
|
||||
too-many-ancestors,
|
||||
too-many-arguments,
|
||||
too-many-boolean-expressions,
|
||||
too-many-branches,
|
||||
too-many-instance-attributes,
|
||||
too-many-locals,
|
||||
too-many-nested-blocks,
|
||||
too-many-public-methods,
|
||||
too-many-return-statements,
|
||||
too-many-statements,
|
||||
trailing-newlines,
|
||||
unichr-builtin,
|
||||
unicode-builtin,
|
||||
unnecessary-pass,
|
||||
unpacking-in-except,
|
||||
useless-else-on-loop,
|
||||
useless-object-inheritance,
|
||||
useless-suppression,
|
||||
using-cmp-argument,
|
||||
wrong-import-order,
|
||||
xrange-builtin,
|
||||
zip-builtin-not-iterating,
|
||||
|
||||
|
||||
[REPORTS]
|
||||
|
||||
# Set the output format. Available formats are text, parseable, colorized, msvs
|
||||
# (visual studio) and html. You can also give a reporter class, eg
|
||||
# mypackage.mymodule.MyReporterClass.
|
||||
output-format=text
|
||||
|
||||
# Put messages in a separate file for each module / package specified on the
|
||||
# command line instead of printing them on stdout. Reports (if any) will be
|
||||
# written in a file name "pylint_global.[txt|html]". This option is deprecated
|
||||
# and it will be removed in Pylint 2.0.
|
||||
files-output=no
|
||||
|
||||
# Tells whether to display a full report or only the messages
|
||||
reports=no
|
||||
|
||||
# Python expression which should return a note less than 10 (10 is the highest
|
||||
# note). You have access to the variables errors warning, statement which
|
||||
# respectively contain the number of errors / warnings messages and the total
|
||||
# number of statements analyzed. This is used by the global evaluation report
|
||||
# (RP0004).
|
||||
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||
|
||||
# Template used to display messages. This is a python new-style format string
|
||||
# used to format the message information. See doc for all details
|
||||
#msg-template=
|
||||
|
||||
|
||||
[BASIC]
|
||||
|
||||
# Good variable names which should always be accepted, separated by a comma
|
||||
good-names=main,_,PRESUBMIT
|
||||
|
||||
# Bad variable names which should always be refused, separated by a comma
|
||||
bad-names=
|
||||
|
||||
# Colon-delimited sets of names that determine each other's naming style when
|
||||
# the name regexes allow several styles.
|
||||
name-group=
|
||||
|
||||
# Include a hint for the correct naming format with invalid-name
|
||||
include-naming-hint=no
|
||||
|
||||
# List of decorators that produce properties, such as abc.abstractproperty. Add
|
||||
# to this list to register other decorators that produce valid properties.
|
||||
property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl
|
||||
|
||||
# Regular expression matching correct function names
|
||||
function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*)|(?P<snake_case>_?[a-z][a-z0-9_]*))$
|
||||
|
||||
# Regular expression matching correct variable names
|
||||
variable-rgx=^[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct constant names
|
||||
const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
|
||||
|
||||
# Regular expression matching correct attribute names
|
||||
attr-rgx=^_{0,2}[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct argument names
|
||||
argument-rgx=^[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct class attribute names
|
||||
class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
|
||||
|
||||
# Regular expression matching correct inline iteration names
|
||||
inlinevar-rgx=^[a-z][a-z0-9_]*$
|
||||
|
||||
# Regular expression matching correct class names
|
||||
class-rgx=^_?[A-Z][a-zA-Z0-9]*$
|
||||
|
||||
# Regular expression matching correct module names
|
||||
module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$
|
||||
|
||||
# Regular expression matching correct method names
|
||||
method-rgx=(?x)^(?:(?P<exempt>_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P<camel_case>_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P<snake_case>_{0,2}[a-z][a-z0-9_]*))$
|
||||
|
||||
# Regular expression which should only match function or class names that do
|
||||
# not require a docstring.
|
||||
no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$
|
||||
|
||||
# Minimum line length for functions/classes that require docstrings, shorter
|
||||
# ones are exempt.
|
||||
docstring-min-length=10
|
||||
|
||||
|
||||
[TYPECHECK]
|
||||
|
||||
# List of decorators that produce context managers, such as
|
||||
# contextlib.contextmanager. Add to this list to register other decorators that
|
||||
# produce valid context managers.
|
||||
contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager
|
||||
|
||||
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||
ignore-mixin-members=yes
|
||||
|
||||
# List of module names for which member attributes should not be checked
|
||||
# (useful for modules/projects where namespaces are manipulated during runtime
|
||||
# and thus existing member attributes cannot be deduced by static analysis. It
|
||||
# supports qualified module names, as well as Unix pattern matching.
|
||||
ignored-modules=
|
||||
|
||||
# List of class names for which member attributes should not be checked (useful
|
||||
# for classes with dynamically set attributes). This supports the use of
|
||||
# qualified names.
|
||||
ignored-classes=optparse.Values,thread._local,_thread._local
|
||||
|
||||
# List of members which are set dynamically and missed by pylint inference
|
||||
# system, and so shouldn't trigger E1101 when accessed. Python regular
|
||||
# expressions are accepted.
|
||||
generated-members=
|
||||
|
||||
|
||||
[FORMAT]
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=80
|
||||
|
||||
# TODO(https://github.com/PyCQA/pylint/issues/3352): Direct pylint to exempt
|
||||
# lines made too long by directives to pytype.
|
||||
|
||||
# Regexp for a line that is allowed to be longer than the limit.
|
||||
ignore-long-lines=(?x)(
|
||||
^\s*(\#\ )?<?https?://\S+>?$|
|
||||
^\s*(from\s+\S+\s+)?import\s+.+$)
|
||||
|
||||
# Allow the body of an if to be on the same line as the test if there is no
|
||||
# else.
|
||||
single-line-if-stmt=yes
|
||||
|
||||
# List of optional constructs for which whitespace checking is disabled. `dict-
|
||||
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
|
||||
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
|
||||
# `empty-line` allows space-only lines.
|
||||
no-space-check=
|
||||
|
||||
# Maximum number of lines in a module
|
||||
max-module-lines=99999
|
||||
|
||||
# String used as indentation unit. The internal Google style guide mandates 2
|
||||
# spaces. Google's externaly-published style guide says 4, consistent with
|
||||
# PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google
|
||||
# projects (like TensorFlow).
|
||||
indent-string=' '
|
||||
|
||||
# Number of spaces of indent required inside a hanging or continued line.
|
||||
indent-after-paren=4
|
||||
|
||||
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
|
||||
expected-line-ending-format=
|
||||
|
||||
|
||||
[MISCELLANEOUS]
|
||||
|
||||
# List of note tags to take in consideration, separated by a comma.
|
||||
notes=TODO
|
||||
|
||||
|
||||
[STRING]
|
||||
|
||||
# This flag controls whether inconsistent-quotes generates a warning when the
|
||||
# character used as a quote delimiter is used inconsistently within a module.
|
||||
check-quote-consistency=yes
|
||||
|
||||
|
||||
[VARIABLES]
|
||||
|
||||
# Tells whether we should check for unused import in __init__ files.
|
||||
init-import=no
|
||||
|
||||
# A regular expression matching the name of dummy variables (i.e. expectedly
|
||||
# not used).
|
||||
dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_)
|
||||
|
||||
# List of additional names supposed to be defined in builtins. Remember that
|
||||
# you should avoid to define new builtins when possible.
|
||||
additional-builtins=
|
||||
|
||||
# List of strings which can identify a callback function by name. A callback
|
||||
# name must start or end with one of those strings.
|
||||
callbacks=cb_,_cb
|
||||
|
||||
# List of qualified module names which can have objects that can redefine
|
||||
# builtins.
|
||||
redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools
|
||||
|
||||
|
||||
[LOGGING]
|
||||
|
||||
# Logging modules to check that the string format arguments are in logging
|
||||
# function parameter format
|
||||
logging-modules=logging,absl.logging,tensorflow.io.logging
|
||||
|
||||
|
||||
[SIMILARITIES]
|
||||
|
||||
# Minimum lines number of a similarity.
|
||||
min-similarity-lines=4
|
||||
|
||||
# Ignore comments when computing similarities.
|
||||
ignore-comments=yes
|
||||
|
||||
# Ignore docstrings when computing similarities.
|
||||
ignore-docstrings=yes
|
||||
|
||||
# Ignore imports when computing similarities.
|
||||
ignore-imports=no
|
||||
|
||||
|
||||
[SPELLING]
|
||||
|
||||
# Spelling dictionary name. Available dictionaries: none. To make it working
|
||||
# install python-enchant package.
|
||||
spelling-dict=
|
||||
|
||||
# List of comma separated words that should not be checked.
|
||||
spelling-ignore-words=
|
||||
|
||||
# A path to a file that contains private dictionary; one word per line.
|
||||
spelling-private-dict-file=
|
||||
|
||||
# Tells whether to store unknown words to indicated private dictionary in
|
||||
# --spelling-private-dict-file option instead of raising a message.
|
||||
spelling-store-unknown-words=no
|
||||
|
||||
|
||||
[IMPORTS]
|
||||
|
||||
# Deprecated modules which should not be used, separated by a comma
|
||||
deprecated-modules=regsub,
|
||||
TERMIOS,
|
||||
Bastion,
|
||||
rexec,
|
||||
sets
|
||||
|
||||
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||
# given file (report RP0402 must not be disabled)
|
||||
import-graph=
|
||||
|
||||
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
ext-import-graph=
|
||||
|
||||
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
int-import-graph=
|
||||
|
||||
# Force import order to recognize a module as part of the standard
|
||||
# compatibility libraries.
|
||||
known-standard-library=
|
||||
|
||||
# Force import order to recognize a module as part of a third party library.
|
||||
known-third-party=enchant, absl
|
||||
|
||||
# Analyse import fallback blocks. This can be used to support both Python 2 and
|
||||
# 3 compatible code, which means that the block might have code that exists
|
||||
# only in one or another interpreter, leading to false positives when analysed.
|
||||
analyse-fallback-blocks=no
|
||||
|
||||
|
||||
[CLASSES]
|
||||
|
||||
# List of method names used to declare (i.e. assign) instance attributes.
|
||||
defining-attr-methods=__init__,
|
||||
__new__,
|
||||
setUp
|
||||
|
||||
# List of member names, which should be excluded from the protected access
|
||||
# warning.
|
||||
exclude-protected=_asdict,
|
||||
_fields,
|
||||
_replace,
|
||||
_source,
|
||||
_make
|
||||
|
||||
# List of valid names for the first argument in a class method.
|
||||
valid-classmethod-first-arg=cls,
|
||||
class_
|
||||
|
||||
# List of valid names for the first argument in a metaclass class method.
|
||||
valid-metaclass-classmethod-first-arg=mcs
|
||||
|
||||
|
||||
[EXCEPTIONS]
|
||||
|
||||
# Exceptions that will emit a warning when being caught. Defaults to
|
||||
# "Exception"
|
||||
overgeneral-exceptions=StandardError,
|
||||
Exception,
|
||||
BaseException
|
5
lib/lib_audio/ESP8266Audio/src/libwebm/AUTHORS.TXT
Normal file
5
lib/lib_audio/ESP8266Audio/src/libwebm/AUTHORS.TXT
Normal file
@ -0,0 +1,5 @@
|
||||
# Names should be added to this file like so:
|
||||
# Name or Organization <email address>
|
||||
|
||||
Google Inc.
|
||||
Elijah Cirioli <eli.cirioli@gmail.com>
|
41
lib/lib_audio/ESP8266Audio/src/libwebm/CONTRIBUTING.md
Normal file
41
lib/lib_audio/ESP8266Audio/src/libwebm/CONTRIBUTING.md
Normal file
@ -0,0 +1,41 @@
|
||||
# How to Contribute
|
||||
|
||||
We'd love to accept your patches and contributions to this project. There are
|
||||
just a few small guidelines you need to follow.
|
||||
|
||||
## Contributor License Agreement
|
||||
|
||||
Contributions to this project must be accompanied by a Contributor License
|
||||
Agreement. You (or your employer) retain the copyright to your contribution;
|
||||
this simply gives us permission to use and redistribute your contributions as
|
||||
part of the project. Head over to <https://cla.developers.google.com/> to see
|
||||
your current agreements on file or to sign a new one.
|
||||
|
||||
You generally only need to submit a CLA once, so if you've already submitted one
|
||||
(even if it was for a different project), you probably don't need to do it
|
||||
again.
|
||||
|
||||
## Code reviews
|
||||
|
||||
All submissions, including submissions by project members, require review. We
|
||||
use a [Gerrit](https://www.gerritcodereview.com) instance hosted at
|
||||
https://chromium-review.googlesource.com for this purpose. See the
|
||||
[WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/)
|
||||
for additional details.
|
||||
|
||||
## Code Style
|
||||
|
||||
The C++ code style is based on the
|
||||
[Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) and
|
||||
`clang-format --style=Google`. `clang-format -i --style=file` can be used to
|
||||
format individual files, it will use the settings from `.clang-format`.
|
||||
|
||||
CMake files are formatted with
|
||||
[cmake-format](https://cmake-format.readthedocs.io/en/latest/). `cmake-format
|
||||
-i` can be used to format individual files, it will use the settings from
|
||||
`.cmake-format.py`.
|
||||
|
||||
## Community Guidelines
|
||||
|
||||
This project follows
|
||||
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
|
30
lib/lib_audio/ESP8266Audio/src/libwebm/LICENSE.TXT
Normal file
30
lib/lib_audio/ESP8266Audio/src/libwebm/LICENSE.TXT
Normal file
@ -0,0 +1,30 @@
|
||||
Copyright (c) 2010, Google Inc. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of Google nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
23
lib/lib_audio/ESP8266Audio/src/libwebm/PATENTS.TXT
Normal file
23
lib/lib_audio/ESP8266Audio/src/libwebm/PATENTS.TXT
Normal file
@ -0,0 +1,23 @@
|
||||
Additional IP Rights Grant (Patents)
|
||||
------------------------------------
|
||||
|
||||
"These implementations" means the copyrightable works that implement the WebM
|
||||
codecs distributed by Google as part of the WebM Project.
|
||||
|
||||
Google hereby grants to you a perpetual, worldwide, non-exclusive, no-charge,
|
||||
royalty-free, irrevocable (except as stated in this section) patent license to
|
||||
make, have made, use, offer to sell, sell, import, transfer, and otherwise
|
||||
run, modify and propagate the contents of these implementations of WebM, where
|
||||
such license applies only to those patent claims, both currently owned by
|
||||
Google and acquired in the future, licensable by Google that are necessarily
|
||||
infringed by these implementations of WebM. This grant does not include claims
|
||||
that would be infringed only as a consequence of further modification of these
|
||||
implementations. If you or your agent or exclusive licensee institute or order
|
||||
or agree to the institution of patent litigation or any other patent
|
||||
enforcement activity against any entity (including a cross-claim or
|
||||
counterclaim in a lawsuit) alleging that any of these implementations of WebM
|
||||
or any code incorporated within any of these implementations of WebM
|
||||
constitute direct or contributory patent infringement, or inducement of
|
||||
patent infringement, then any patent rights granted to you under this License
|
||||
for these implementations of WebM shall terminate as of the date such
|
||||
litigation is filed.
|
202
lib/lib_audio/ESP8266Audio/src/libwebm/PRESUBMIT.py
Normal file
202
lib/lib_audio/ESP8266Audio/src/libwebm/PRESUBMIT.py
Normal file
@ -0,0 +1,202 @@
|
||||
# Copyright (c) 2021, Google Inc. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
#
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
#
|
||||
# * Neither the name of Google nor the names of its contributors may
|
||||
# be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""Top-level presubmit script for libwebm.
|
||||
|
||||
See https://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
|
||||
details on the presubmit API built into depot_tools.
|
||||
"""
|
||||
import re
|
||||
import subprocess2
|
||||
|
||||
USE_PYTHON3 = True
|
||||
_BASH_INDENTATION = "2"
|
||||
_GIT_COMMIT_SUBJECT_LENGTH = 65
|
||||
_INCLUDE_BASH_FILES_ONLY = [r".*\.sh$"]
|
||||
_INCLUDE_SOURCE_FILES_ONLY = [r".*\.(c|cc|[hc]pp|h)$"]
|
||||
_LIBWEBM_MAX_LINE_LENGTH = 80
|
||||
|
||||
|
||||
def _CheckCommitSubjectLength(input_api, output_api):
|
||||
"""Ensures commit's subject length is no longer than 65 chars."""
|
||||
name = "git-commit subject"
|
||||
cmd = ["git", "log", "-1", "--pretty=%s"]
|
||||
start = input_api.time.time()
|
||||
proc = subprocess2.Popen(
|
||||
cmd,
|
||||
stderr=subprocess2.PIPE,
|
||||
stdout=subprocess2.PIPE,
|
||||
universal_newlines=True)
|
||||
|
||||
stdout, _ = proc.communicate()
|
||||
duration = input_api.time.time() - start
|
||||
|
||||
if not re.match(r"^Revert",
|
||||
stdout) and (len(stdout) - 1) > _GIT_COMMIT_SUBJECT_LENGTH:
|
||||
failure_msg = (
|
||||
"The commit subject: %s is too long (%d chars)\n"
|
||||
"Try to keep this to 50 or less (up to 65 is permitted for "
|
||||
"non-reverts).\n"
|
||||
"https://www.git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-"
|
||||
"Project#_commit_guidelines") % (stdout, len(stdout) - 1)
|
||||
return output_api.PresubmitError("%s\n (%4.2fs) failed\n%s" %
|
||||
(name, duration, failure_msg))
|
||||
|
||||
return output_api.PresubmitResult("%s\n (%4.2fs) success" % (name, duration))
|
||||
|
||||
|
||||
def _GetFilesToSkip(input_api):
|
||||
"""Skips libwebm-specific files."""
|
||||
return list(input_api.DEFAULT_FILES_TO_SKIP) + [
|
||||
r"\.pylintrc$",
|
||||
]
|
||||
|
||||
|
||||
def _CheckChangeLintsClean(input_api, output_api):
|
||||
"""Makes sure that libwebm/ code is cpplint clean."""
|
||||
sources = lambda x: input_api.FilterSourceFile(
|
||||
x, files_to_check=_INCLUDE_SOURCE_FILES_ONLY, files_to_skip=None)
|
||||
return input_api.canned_checks.CheckChangeLintsClean(input_api, output_api,
|
||||
sources)
|
||||
|
||||
|
||||
def _RunShellCheckCmd(input_api, output_api, bash_file):
|
||||
"""shellcheck command wrapper."""
|
||||
cmd = ["shellcheck", "-x", "-oall", "-sbash", bash_file]
|
||||
name = "Check %s file." % bash_file
|
||||
start = input_api.time.time()
|
||||
output, rc = subprocess2.communicate(
|
||||
cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
|
||||
duration = input_api.time.time() - start
|
||||
if rc == 0:
|
||||
return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
|
||||
(name, " ".join(cmd), duration))
|
||||
return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
|
||||
(name, " ".join(cmd), duration, output[1]))
|
||||
|
||||
|
||||
def _RunShfmtCheckCmd(input_api, output_api, bash_file):
|
||||
"""shfmt command wrapper."""
|
||||
cmd = [
|
||||
"shfmt", "-i", _BASH_INDENTATION, "-bn", "-ci", "-sr", "-kp", "-d",
|
||||
bash_file
|
||||
]
|
||||
name = "Check %s file." % bash_file
|
||||
start = input_api.time.time()
|
||||
output, rc = subprocess2.communicate(
|
||||
cmd, stdout=None, stderr=subprocess2.PIPE, universal_newlines=True)
|
||||
duration = input_api.time.time() - start
|
||||
if rc == 0:
|
||||
return output_api.PresubmitResult("%s\n%s (%4.2fs)\n" %
|
||||
(name, " ".join(cmd), duration))
|
||||
return output_api.PresubmitError("%s\n%s (%4.2fs) failed\n%s" %
|
||||
(name, " ".join(cmd), duration, output[1]))
|
||||
|
||||
|
||||
def _RunCmdOnCheckedFiles(input_api, output_api, run_cmd, files_to_check):
|
||||
"""Ensure that libwebm/ files are clean."""
|
||||
file_filter = lambda x: input_api.FilterSourceFile(
|
||||
x, files_to_check=files_to_check, files_to_skip=None)
|
||||
|
||||
affected_files = input_api.change.AffectedFiles(file_filter=file_filter)
|
||||
results = [
|
||||
run_cmd(input_api, output_api, f.AbsoluteLocalPath())
|
||||
for f in affected_files
|
||||
]
|
||||
return results
|
||||
|
||||
|
||||
def _CommonChecks(input_api, output_api):
|
||||
results = []
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol(
|
||||
input_api, output_api))
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckChangeHasNoTabs(input_api, output_api))
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
|
||||
input_api, output_api))
|
||||
results.append(_CheckCommitSubjectLength(input_api, output_api))
|
||||
|
||||
source_file_filter = lambda x: input_api.FilterSourceFile(
|
||||
x, files_to_skip=_GetFilesToSkip(input_api))
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckLongLines(
|
||||
input_api,
|
||||
output_api,
|
||||
maxlen=_LIBWEBM_MAX_LINE_LENGTH,
|
||||
source_file_filter=source_file_filter))
|
||||
|
||||
results.extend(
|
||||
input_api.canned_checks.CheckPatchFormatted(
|
||||
input_api,
|
||||
output_api,
|
||||
check_clang_format=True,
|
||||
check_python=True,
|
||||
result_factory=output_api.PresubmitError))
|
||||
results.extend(_CheckChangeLintsClean(input_api, output_api))
|
||||
|
||||
# Run pylint.
|
||||
results.extend(
|
||||
input_api.canned_checks.RunPylint(
|
||||
input_api,
|
||||
output_api,
|
||||
files_to_skip=_GetFilesToSkip(input_api),
|
||||
pylintrc=".pylintrc",
|
||||
version="2.7"))
|
||||
|
||||
# Binaries shellcheck and shfmt are not installed in depot_tools.
|
||||
# Installation is needed
|
||||
try:
|
||||
subprocess2.communicate(["shellcheck", "--version"])
|
||||
results.extend(
|
||||
_RunCmdOnCheckedFiles(input_api, output_api, _RunShellCheckCmd,
|
||||
_INCLUDE_BASH_FILES_ONLY))
|
||||
print("shfmt")
|
||||
subprocess2.communicate(["shfmt", "-version"])
|
||||
results.extend(
|
||||
_RunCmdOnCheckedFiles(input_api, output_api, _RunShfmtCheckCmd,
|
||||
_INCLUDE_BASH_FILES_ONLY))
|
||||
except OSError as os_error:
|
||||
results.append(
|
||||
output_api.PresubmitPromptWarning(
|
||||
"%s\nPlease install missing binaries locally." % os_error.args[0]))
|
||||
return results
|
||||
|
||||
|
||||
def CheckChangeOnUpload(input_api, output_api):
|
||||
results = []
|
||||
results.extend(_CommonChecks(input_api, output_api))
|
||||
return results
|
||||
|
||||
|
||||
def CheckChangeOnCommit(input_api, output_api):
|
||||
results = []
|
||||
results.extend(_CommonChecks(input_api, output_api))
|
||||
return results
|
148
lib/lib_audio/ESP8266Audio/src/libwebm/README.libwebm
Normal file
148
lib/lib_audio/ESP8266Audio/src/libwebm/README.libwebm
Normal file
@ -0,0 +1,148 @@
|
||||
Building Libwebm
|
||||
|
||||
To build libwebm you must first create project files. To do this run cmake
|
||||
and pass it the path to your libwebm repo.
|
||||
|
||||
Makefile.unix can be used as a fallback on systems that cmake does not
|
||||
support.
|
||||
|
||||
|
||||
CMake Basics
|
||||
|
||||
To generate project/make files for the default toolchain on your system simply
|
||||
run cmake with the path to the libwebm repo:
|
||||
|
||||
$ cmake path/to/libwebm
|
||||
|
||||
On Windows the above command will produce Visual Studio project files for the
|
||||
newest Visual Studio detected on the system. On Mac OS X and Linux systems, the
|
||||
above command will produce a makefile.
|
||||
|
||||
To control what types of projects are generated the -G parameter is added to
|
||||
the cmake command line. This argument must be followed by the name of a
|
||||
generator. Running cmake with the --help argument will list the available
|
||||
generators for your system.
|
||||
|
||||
On Mac OS X you would run the following command to generate Xcode projects:
|
||||
|
||||
$ cmake path/to/libwebm -G Xcode
|
||||
|
||||
On a Windows box you would run the following command to generate Visual Studio
|
||||
2013 projects:
|
||||
|
||||
$ cmake path/to/libwebm -G "Visual Studio 12"
|
||||
|
||||
To generate 64-bit Windows Visual Studio 2013 projects:
|
||||
|
||||
$ cmake path/to/libwebm "Visual Studio 12 Win64"
|
||||
|
||||
|
||||
CMake Makefiles: Debugging and Optimization
|
||||
|
||||
Unlike Visual Studio and Xcode projects, the build configuration for make builds
|
||||
is controlled when you run cmake. The following examples demonstrate various
|
||||
build configurations.
|
||||
|
||||
Omitting the build type produces makefiles that use build flags containing
|
||||
neither optimization nor debug flags:
|
||||
$ cmake path/to/libwebm
|
||||
|
||||
A makefile using release (optimized) flags is produced like this:
|
||||
$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=release
|
||||
|
||||
A release build with debug info can be produced as well:
|
||||
$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=relwithdebinfo
|
||||
|
||||
And your standard debug build will be produced using:
|
||||
$ cmake path/to/libwebm -DCMAKE_BUILD_TYPE=debug
|
||||
|
||||
|
||||
Tests
|
||||
|
||||
To enable libwebm tests add -DENABLE_TESTS=ON CMake generation command line. For
|
||||
example:
|
||||
|
||||
$ cmake path/to/libwebm -G Xcode -DENABLE_TESTS=ON
|
||||
|
||||
Libwebm tests depend on googletest. By default googletest is expected to be a
|
||||
sibling directory of the Libwebm repository. To change that, update your CMake
|
||||
command to be similar to the following:
|
||||
|
||||
$ cmake path/to/libwebm -G Xcode -DENABLE_TESTS=ON \
|
||||
-DGTEST_SRC_DIR=/path/to/googletest
|
||||
|
||||
The tests rely upon the LIBWEBM_TEST_DATA_PATH environment variable to locate
|
||||
test input. The following example demonstrates running the muxer tests from the
|
||||
build directory:
|
||||
|
||||
$ LIBWEBM_TEST_DATA_PATH=path/to/libwebm/testing/testdata ./mkvmuxer_tests
|
||||
|
||||
Note: Libwebm Googletest integration was built with googletest from
|
||||
https://github.com/google/googletest.git at git revision
|
||||
ddb8012eb48bc203aa93dcc2b22c1db516302b29.
|
||||
|
||||
|
||||
CMake Include-what-you-use integration
|
||||
|
||||
Include-what-you-use is an analysis tool that helps ensure libwebm includes the
|
||||
C/C++ header files actually in use. To enable the integration support
|
||||
ENABLE_IWYU must be turned on at cmake run time:
|
||||
|
||||
$ cmake path/to/libwebm -G "Unix Makefiles" -DENABLE_IWYU=ON
|
||||
|
||||
This adds the iwyu target to the build. To run include-what-you-use:
|
||||
|
||||
$ make iwyu
|
||||
|
||||
The following requirements must be met for ENABLE_IWYU to enable the iwyu
|
||||
target:
|
||||
|
||||
1. include-what-you-use and iwyu_tool.py must be in your PATH.
|
||||
2. A python interpreter must be on the system and available to CMake.
|
||||
|
||||
The values of the following variables are used to determine if the requirements
|
||||
have been met. Values to the right of the equals sign are what a successful run
|
||||
might look like:
|
||||
iwyu_path=/path/to/iwyu_tool.py
|
||||
iwyu_tool_path=/path/to/include-what-you-use
|
||||
PYTHONINTERP_FOUND=TRUE
|
||||
|
||||
An empty PYTHONINTERP_FOUND, or iwyu_path/iwyu_tool_path suffixed with NOTFOUND
|
||||
are failures.
|
||||
|
||||
For Include-what-you-use setup instructions, see:
|
||||
https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/InstructionsForUsers.md
|
||||
|
||||
If, when building the iwyu target, compile errors reporting failures loading
|
||||
standard include files occur, one solution can be found here:
|
||||
https://github.com/include-what-you-use/include-what-you-use/issues/100
|
||||
|
||||
|
||||
CMake cross compile
|
||||
To cross compile libwebm for Windows using mingw-w64 run cmake with the
|
||||
following arguments:
|
||||
|
||||
$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \
|
||||
path/to/libwebm
|
||||
|
||||
Note1: As of this writing googletest will not build via mingw-w64 without
|
||||
disabling pthreads.
|
||||
googletest hash: d225acc90bc3a8c420a9bcd1f033033c1ccd7fe0
|
||||
|
||||
To build with tests when using mingw-w64 use the following arguments when
|
||||
running CMake:
|
||||
|
||||
$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \
|
||||
-DENABLE_TESTS=ON -Dgtest_disable_pthreads=ON path/to/libwebm
|
||||
|
||||
Note2: i686-w64-mingw32 is the default compiler. This can be controlled using
|
||||
the MINGW_PREFIX variable:
|
||||
|
||||
$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/libwebm/build/mingw-w64_toolchain.cmake \
|
||||
-DMINGW_PREFIX=x86_64-w64-mingw32 path/to/libwebm
|
||||
|
||||
Bug reports
|
||||
|
||||
Bug reports can be filed in the libwebm issue tracker:
|
||||
https://issues.webmproject.org/.
|
||||
For security reports, select 'Security report' from the Template dropdown.
|
@ -0,0 +1,4 @@
|
||||
# This file is used by git cl to get repository specific information.
|
||||
GERRIT_HOST: True
|
||||
CODE_REVIEW_SERVER: chromium-review.googlesource.com
|
||||
GERRIT_SQUASH_UPLOADS: False
|
193
lib/lib_audio/ESP8266Audio/src/libwebm/common/webmids.h
Normal file
193
lib/lib_audio/ESP8266Audio/src/libwebm/common/webmids.h
Normal file
@ -0,0 +1,193 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#ifndef COMMON_WEBMIDS_H_
|
||||
#define COMMON_WEBMIDS_H_
|
||||
|
||||
namespace libwebm {
|
||||
|
||||
enum MkvId {
|
||||
kMkvEBML = 0x1A45DFA3,
|
||||
kMkvEBMLVersion = 0x4286,
|
||||
kMkvEBMLReadVersion = 0x42F7,
|
||||
kMkvEBMLMaxIDLength = 0x42F2,
|
||||
kMkvEBMLMaxSizeLength = 0x42F3,
|
||||
kMkvDocType = 0x4282,
|
||||
kMkvDocTypeVersion = 0x4287,
|
||||
kMkvDocTypeReadVersion = 0x4285,
|
||||
kMkvVoid = 0xEC,
|
||||
kMkvSignatureSlot = 0x1B538667,
|
||||
kMkvSignatureAlgo = 0x7E8A,
|
||||
kMkvSignatureHash = 0x7E9A,
|
||||
kMkvSignaturePublicKey = 0x7EA5,
|
||||
kMkvSignature = 0x7EB5,
|
||||
kMkvSignatureElements = 0x7E5B,
|
||||
kMkvSignatureElementList = 0x7E7B,
|
||||
kMkvSignedElement = 0x6532,
|
||||
// segment
|
||||
kMkvSegment = 0x18538067,
|
||||
// Meta Seek Information
|
||||
kMkvSeekHead = 0x114D9B74,
|
||||
kMkvSeek = 0x4DBB,
|
||||
kMkvSeekID = 0x53AB,
|
||||
kMkvSeekPosition = 0x53AC,
|
||||
// Segment Information
|
||||
kMkvInfo = 0x1549A966,
|
||||
kMkvTimecodeScale = 0x2AD7B1,
|
||||
kMkvDuration = 0x4489,
|
||||
kMkvDateUTC = 0x4461,
|
||||
kMkvTitle = 0x7BA9,
|
||||
kMkvMuxingApp = 0x4D80,
|
||||
kMkvWritingApp = 0x5741,
|
||||
// Cluster
|
||||
kMkvCluster = 0x1F43B675,
|
||||
kMkvTimecode = 0xE7,
|
||||
kMkvPrevSize = 0xAB,
|
||||
kMkvBlockGroup = 0xA0,
|
||||
kMkvBlock = 0xA1,
|
||||
kMkvBlockDuration = 0x9B,
|
||||
kMkvReferenceBlock = 0xFB,
|
||||
kMkvLaceNumber = 0xCC,
|
||||
kMkvSimpleBlock = 0xA3,
|
||||
kMkvBlockAdditions = 0x75A1,
|
||||
kMkvBlockMore = 0xA6,
|
||||
kMkvBlockAddID = 0xEE,
|
||||
kMkvBlockAdditional = 0xA5,
|
||||
kMkvDiscardPadding = 0x75A2,
|
||||
// Track
|
||||
kMkvTracks = 0x1654AE6B,
|
||||
kMkvTrackEntry = 0xAE,
|
||||
kMkvTrackNumber = 0xD7,
|
||||
kMkvTrackUID = 0x73C5,
|
||||
kMkvTrackType = 0x83,
|
||||
kMkvFlagEnabled = 0xB9,
|
||||
kMkvFlagDefault = 0x88,
|
||||
kMkvFlagForced = 0x55AA,
|
||||
kMkvFlagLacing = 0x9C,
|
||||
kMkvDefaultDuration = 0x23E383,
|
||||
kMkvMaxBlockAdditionID = 0x55EE,
|
||||
kMkvName = 0x536E,
|
||||
kMkvLanguage = 0x22B59C,
|
||||
kMkvCodecID = 0x86,
|
||||
kMkvCodecPrivate = 0x63A2,
|
||||
kMkvCodecName = 0x258688,
|
||||
kMkvCodecDelay = 0x56AA,
|
||||
kMkvSeekPreRoll = 0x56BB,
|
||||
// video
|
||||
kMkvVideo = 0xE0,
|
||||
kMkvFlagInterlaced = 0x9A,
|
||||
kMkvStereoMode = 0x53B8,
|
||||
kMkvAlphaMode = 0x53C0,
|
||||
kMkvPixelWidth = 0xB0,
|
||||
kMkvPixelHeight = 0xBA,
|
||||
kMkvPixelCropBottom = 0x54AA,
|
||||
kMkvPixelCropTop = 0x54BB,
|
||||
kMkvPixelCropLeft = 0x54CC,
|
||||
kMkvPixelCropRight = 0x54DD,
|
||||
kMkvDisplayWidth = 0x54B0,
|
||||
kMkvDisplayHeight = 0x54BA,
|
||||
kMkvDisplayUnit = 0x54B2,
|
||||
kMkvAspectRatioType = 0x54B3,
|
||||
kMkvColourSpace = 0x2EB524,
|
||||
kMkvFrameRate = 0x2383E3,
|
||||
// end video
|
||||
// colour
|
||||
kMkvColour = 0x55B0,
|
||||
kMkvMatrixCoefficients = 0x55B1,
|
||||
kMkvBitsPerChannel = 0x55B2,
|
||||
kMkvChromaSubsamplingHorz = 0x55B3,
|
||||
kMkvChromaSubsamplingVert = 0x55B4,
|
||||
kMkvCbSubsamplingHorz = 0x55B5,
|
||||
kMkvCbSubsamplingVert = 0x55B6,
|
||||
kMkvChromaSitingHorz = 0x55B7,
|
||||
kMkvChromaSitingVert = 0x55B8,
|
||||
kMkvRange = 0x55B9,
|
||||
kMkvTransferCharacteristics = 0x55BA,
|
||||
kMkvPrimaries = 0x55BB,
|
||||
kMkvMaxCLL = 0x55BC,
|
||||
kMkvMaxFALL = 0x55BD,
|
||||
// mastering metadata
|
||||
kMkvMasteringMetadata = 0x55D0,
|
||||
kMkvPrimaryRChromaticityX = 0x55D1,
|
||||
kMkvPrimaryRChromaticityY = 0x55D2,
|
||||
kMkvPrimaryGChromaticityX = 0x55D3,
|
||||
kMkvPrimaryGChromaticityY = 0x55D4,
|
||||
kMkvPrimaryBChromaticityX = 0x55D5,
|
||||
kMkvPrimaryBChromaticityY = 0x55D6,
|
||||
kMkvWhitePointChromaticityX = 0x55D7,
|
||||
kMkvWhitePointChromaticityY = 0x55D8,
|
||||
kMkvLuminanceMax = 0x55D9,
|
||||
kMkvLuminanceMin = 0x55DA,
|
||||
// end mastering metadata
|
||||
// end colour
|
||||
// projection
|
||||
kMkvProjection = 0x7670,
|
||||
kMkvProjectionType = 0x7671,
|
||||
kMkvProjectionPrivate = 0x7672,
|
||||
kMkvProjectionPoseYaw = 0x7673,
|
||||
kMkvProjectionPosePitch = 0x7674,
|
||||
kMkvProjectionPoseRoll = 0x7675,
|
||||
// end projection
|
||||
// audio
|
||||
kMkvAudio = 0xE1,
|
||||
kMkvSamplingFrequency = 0xB5,
|
||||
kMkvOutputSamplingFrequency = 0x78B5,
|
||||
kMkvChannels = 0x9F,
|
||||
kMkvBitDepth = 0x6264,
|
||||
// end audio
|
||||
// ContentEncodings
|
||||
kMkvContentEncodings = 0x6D80,
|
||||
kMkvContentEncoding = 0x6240,
|
||||
kMkvContentEncodingOrder = 0x5031,
|
||||
kMkvContentEncodingScope = 0x5032,
|
||||
kMkvContentEncodingType = 0x5033,
|
||||
kMkvContentCompression = 0x5034,
|
||||
kMkvContentCompAlgo = 0x4254,
|
||||
kMkvContentCompSettings = 0x4255,
|
||||
kMkvContentEncryption = 0x5035,
|
||||
kMkvContentEncAlgo = 0x47E1,
|
||||
kMkvContentEncKeyID = 0x47E2,
|
||||
kMkvContentSignature = 0x47E3,
|
||||
kMkvContentSigKeyID = 0x47E4,
|
||||
kMkvContentSigAlgo = 0x47E5,
|
||||
kMkvContentSigHashAlgo = 0x47E6,
|
||||
kMkvContentEncAESSettings = 0x47E7,
|
||||
kMkvAESSettingsCipherMode = 0x47E8,
|
||||
kMkvAESSettingsCipherInitData = 0x47E9,
|
||||
// end ContentEncodings
|
||||
// Cueing Data
|
||||
kMkvCues = 0x1C53BB6B,
|
||||
kMkvCuePoint = 0xBB,
|
||||
kMkvCueTime = 0xB3,
|
||||
kMkvCueTrackPositions = 0xB7,
|
||||
kMkvCueTrack = 0xF7,
|
||||
kMkvCueClusterPosition = 0xF1,
|
||||
kMkvCueBlockNumber = 0x5378,
|
||||
// Chapters
|
||||
kMkvChapters = 0x1043A770,
|
||||
kMkvEditionEntry = 0x45B9,
|
||||
kMkvChapterAtom = 0xB6,
|
||||
kMkvChapterUID = 0x73C4,
|
||||
kMkvChapterStringUID = 0x5654,
|
||||
kMkvChapterTimeStart = 0x91,
|
||||
kMkvChapterTimeEnd = 0x92,
|
||||
kMkvChapterDisplay = 0x80,
|
||||
kMkvChapString = 0x85,
|
||||
kMkvChapLanguage = 0x437C,
|
||||
kMkvChapCountry = 0x437E,
|
||||
// Tags
|
||||
kMkvTags = 0x1254C367,
|
||||
kMkvTag = 0x7373,
|
||||
kMkvSimpleTag = 0x67C8,
|
||||
kMkvTagName = 0x45A3,
|
||||
kMkvTagString = 0x4487
|
||||
};
|
||||
|
||||
} // namespace libwebm
|
||||
|
||||
#endif // COMMON_WEBMIDS_H_
|
4207
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.cc
Normal file
4207
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.cc
Normal file
File diff suppressed because it is too large
Load Diff
1926
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.h
Normal file
1926
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxer.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,28 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#ifndef MKVMUXER_MKVMUXERTYPES_H_
|
||||
#define MKVMUXER_MKVMUXERTYPES_H_
|
||||
|
||||
namespace mkvmuxer {
|
||||
typedef unsigned char uint8;
|
||||
typedef short int16;
|
||||
typedef int int32;
|
||||
typedef unsigned int uint32;
|
||||
typedef long long int64;
|
||||
typedef unsigned long long uint64;
|
||||
} // namespace mkvmuxer
|
||||
|
||||
// Copied from Chromium basictypes.h
|
||||
// A macro to disallow the copy constructor and operator= functions
|
||||
// This should be used in the private: declarations for a class
|
||||
#define LIBWEBM_DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
||||
TypeName(const TypeName&); \
|
||||
void operator=(const TypeName&)
|
||||
|
||||
#endif // MKVMUXER_MKVMUXERTYPES_HPP_
|
739
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.cc
Normal file
739
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.cc
Normal file
@ -0,0 +1,739 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#include "mkvmuxerutil.h"
|
||||
#ifdef ESP32
|
||||
|
||||
#ifdef __ANDROID__
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <ctime>
|
||||
#include <new>
|
||||
|
||||
#include "../common/webmids.h"
|
||||
#include "mkvmuxer.h"
|
||||
#include "mkvwriter.h"
|
||||
|
||||
namespace mkvmuxer {
|
||||
|
||||
namespace {
|
||||
|
||||
// Date elements are always 8 octets in size.
|
||||
const int kDateElementSize = 8;
|
||||
|
||||
uint64 WriteBlock(IMkvWriter* writer, const Frame* const frame, int64 timecode,
|
||||
uint64 timecode_scale) {
|
||||
uint64 block_additional_elem_size = 0;
|
||||
uint64 block_addid_elem_size = 0;
|
||||
uint64 block_more_payload_size = 0;
|
||||
uint64 block_more_elem_size = 0;
|
||||
uint64 block_additions_payload_size = 0;
|
||||
uint64 block_additions_elem_size = 0;
|
||||
if (frame->additional()) {
|
||||
block_additional_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvBlockAdditional, frame->additional(),
|
||||
frame->additional_length());
|
||||
block_addid_elem_size = EbmlElementSize(
|
||||
libwebm::kMkvBlockAddID, static_cast<uint64>(frame->add_id()));
|
||||
|
||||
block_more_payload_size =
|
||||
block_addid_elem_size + block_additional_elem_size;
|
||||
block_more_elem_size =
|
||||
EbmlMasterElementSize(libwebm::kMkvBlockMore, block_more_payload_size) +
|
||||
block_more_payload_size;
|
||||
block_additions_payload_size = block_more_elem_size;
|
||||
block_additions_elem_size =
|
||||
EbmlMasterElementSize(libwebm::kMkvBlockAdditions,
|
||||
block_additions_payload_size) +
|
||||
block_additions_payload_size;
|
||||
}
|
||||
|
||||
uint64 discard_padding_elem_size = 0;
|
||||
if (frame->discard_padding() != 0) {
|
||||
discard_padding_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvDiscardPadding,
|
||||
static_cast<int64>(frame->discard_padding()));
|
||||
}
|
||||
|
||||
const uint64 reference_block_timestamp =
|
||||
frame->reference_block_timestamp() / timecode_scale;
|
||||
uint64 reference_block_elem_size = 0;
|
||||
if (!frame->is_key()) {
|
||||
reference_block_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvReferenceBlock, reference_block_timestamp);
|
||||
}
|
||||
|
||||
const uint64 duration = frame->duration() / timecode_scale;
|
||||
uint64 block_duration_elem_size = 0;
|
||||
if (duration > 0)
|
||||
block_duration_elem_size =
|
||||
EbmlElementSize(libwebm::kMkvBlockDuration, duration);
|
||||
|
||||
const uint64 block_payload_size = 4 + frame->length();
|
||||
const uint64 block_elem_size =
|
||||
EbmlMasterElementSize(libwebm::kMkvBlock, block_payload_size) +
|
||||
block_payload_size;
|
||||
|
||||
const uint64 block_group_payload_size =
|
||||
block_elem_size + block_additions_elem_size + block_duration_elem_size +
|
||||
discard_padding_elem_size + reference_block_elem_size;
|
||||
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockGroup,
|
||||
block_group_payload_size)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlock, block_payload_size))
|
||||
return 0;
|
||||
|
||||
if (WriteUInt(writer, frame->track_number()))
|
||||
return 0;
|
||||
|
||||
if (SerializeInt(writer, timecode, 2))
|
||||
return 0;
|
||||
|
||||
// For a Block, flags is always 0.
|
||||
if (SerializeInt(writer, 0, 1))
|
||||
return 0;
|
||||
|
||||
if (writer->Write(frame->frame(), static_cast<uint32>(frame->length())))
|
||||
return 0;
|
||||
|
||||
if (frame->additional()) {
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockAdditions,
|
||||
block_additions_payload_size)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockMore,
|
||||
block_more_payload_size))
|
||||
return 0;
|
||||
|
||||
if (!WriteEbmlElement(writer, libwebm::kMkvBlockAddID,
|
||||
static_cast<uint64>(frame->add_id())))
|
||||
return 0;
|
||||
|
||||
if (!WriteEbmlElement(writer, libwebm::kMkvBlockAdditional,
|
||||
frame->additional(), frame->additional_length())) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (frame->discard_padding() != 0 &&
|
||||
!WriteEbmlElement(writer, libwebm::kMkvDiscardPadding,
|
||||
static_cast<int64>(frame->discard_padding()))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!frame->is_key() && !WriteEbmlElement(writer, libwebm::kMkvReferenceBlock,
|
||||
reference_block_timestamp)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (duration > 0 &&
|
||||
!WriteEbmlElement(writer, libwebm::kMkvBlockDuration, duration)) {
|
||||
return false;
|
||||
}
|
||||
return EbmlMasterElementSize(libwebm::kMkvBlockGroup,
|
||||
block_group_payload_size) +
|
||||
block_group_payload_size;
|
||||
}
|
||||
|
||||
uint64 WriteSimpleBlock(IMkvWriter* writer, const Frame* const frame,
|
||||
int64 timecode) {
|
||||
if (WriteID(writer, libwebm::kMkvSimpleBlock))
|
||||
return 0;
|
||||
|
||||
const int32 size = static_cast<int32>(frame->length()) + 4;
|
||||
if (WriteUInt(writer, size))
|
||||
return 0;
|
||||
|
||||
if (WriteUInt(writer, static_cast<uint64>(frame->track_number())))
|
||||
return 0;
|
||||
|
||||
if (SerializeInt(writer, timecode, 2))
|
||||
return 0;
|
||||
|
||||
uint64 flags = 0;
|
||||
if (frame->is_key())
|
||||
flags |= 0x80;
|
||||
|
||||
if (SerializeInt(writer, flags, 1))
|
||||
return 0;
|
||||
|
||||
if (writer->Write(frame->frame(), static_cast<uint32>(frame->length())))
|
||||
return 0;
|
||||
|
||||
return GetUIntSize(libwebm::kMkvSimpleBlock) + GetCodedUIntSize(size) + 4 +
|
||||
frame->length();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int32 GetCodedUIntSize(uint64 value) {
|
||||
if (value < 0x000000000000007FULL)
|
||||
return 1;
|
||||
else if (value < 0x0000000000003FFFULL)
|
||||
return 2;
|
||||
else if (value < 0x00000000001FFFFFULL)
|
||||
return 3;
|
||||
else if (value < 0x000000000FFFFFFFULL)
|
||||
return 4;
|
||||
else if (value < 0x00000007FFFFFFFFULL)
|
||||
return 5;
|
||||
else if (value < 0x000003FFFFFFFFFFULL)
|
||||
return 6;
|
||||
else if (value < 0x0001FFFFFFFFFFFFULL)
|
||||
return 7;
|
||||
return 8;
|
||||
}
|
||||
|
||||
int32 GetUIntSize(uint64 value) {
|
||||
if (value < 0x0000000000000100ULL)
|
||||
return 1;
|
||||
else if (value < 0x0000000000010000ULL)
|
||||
return 2;
|
||||
else if (value < 0x0000000001000000ULL)
|
||||
return 3;
|
||||
else if (value < 0x0000000100000000ULL)
|
||||
return 4;
|
||||
else if (value < 0x0000010000000000ULL)
|
||||
return 5;
|
||||
else if (value < 0x0001000000000000ULL)
|
||||
return 6;
|
||||
else if (value < 0x0100000000000000ULL)
|
||||
return 7;
|
||||
return 8;
|
||||
}
|
||||
|
||||
int32 GetIntSize(int64 value) {
|
||||
// Doubling the requested value ensures positive values with their high bit
|
||||
// set are written with 0-padding to avoid flipping the signedness.
|
||||
const uint64 v = (value < 0) ? value ^ -1LL : value;
|
||||
return GetUIntSize(2 * v);
|
||||
}
|
||||
|
||||
uint64 EbmlMasterElementSize(uint64 type, uint64 value) {
|
||||
// Size of EBML ID
|
||||
int32 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += GetCodedUIntSize(value);
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, int64 value) {
|
||||
// Size of EBML ID
|
||||
int32 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += GetIntSize(value);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value) {
|
||||
return EbmlElementSize(type, value, 0);
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value, uint64 fixed_size) {
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += (fixed_size > 0) ? fixed_size : GetUIntSize(value);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, float /* value */) {
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += sizeof(float);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, const char* value) {
|
||||
if (!value)
|
||||
return 0;
|
||||
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += strlen(value);
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size += GetCodedUIntSize(strlen(value));
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size) {
|
||||
if (!value)
|
||||
return 0;
|
||||
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += size;
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size += GetCodedUIntSize(size);
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
uint64 EbmlDateElementSize(uint64 type) {
|
||||
// Size of EBML ID
|
||||
uint64 ebml_size = GetUIntSize(type);
|
||||
|
||||
// Datasize
|
||||
ebml_size += kDateElementSize;
|
||||
|
||||
// Size of Datasize
|
||||
ebml_size++;
|
||||
|
||||
return ebml_size;
|
||||
}
|
||||
|
||||
int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) {
|
||||
if (!writer || size < 1 || size > 8)
|
||||
return -1;
|
||||
|
||||
for (int32 i = 1; i <= size; ++i) {
|
||||
const int32 byte_count = size - i;
|
||||
const int32 bit_count = byte_count * 8;
|
||||
|
||||
const int64 bb = value >> bit_count;
|
||||
const uint8 b = static_cast<uint8>(bb);
|
||||
|
||||
const int32 status = writer->Write(&b, 1);
|
||||
|
||||
if (status < 0)
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32 SerializeFloat(IMkvWriter* writer, float f) {
|
||||
if (!writer)
|
||||
return -1;
|
||||
|
||||
assert(sizeof(uint32) == sizeof(float));
|
||||
// This union is merely used to avoid a reinterpret_cast from float& to
|
||||
// uint32& which will result in violation of strict aliasing.
|
||||
union U32 {
|
||||
uint32 u32;
|
||||
float f;
|
||||
} value;
|
||||
value.f = f;
|
||||
|
||||
for (int32 i = 1; i <= 4; ++i) {
|
||||
const int32 byte_count = 4 - i;
|
||||
const int32 bit_count = byte_count * 8;
|
||||
|
||||
const uint8 byte = static_cast<uint8>(value.u32 >> bit_count);
|
||||
|
||||
const int32 status = writer->Write(&byte, 1);
|
||||
|
||||
if (status < 0)
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32 WriteUInt(IMkvWriter* writer, uint64 value) {
|
||||
if (!writer)
|
||||
return -1;
|
||||
|
||||
int32 size = GetCodedUIntSize(value);
|
||||
|
||||
return WriteUIntSize(writer, value, size);
|
||||
}
|
||||
|
||||
int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size) {
|
||||
if (!writer || size < 0 || size > 8)
|
||||
return -1;
|
||||
|
||||
if (size > 0) {
|
||||
const uint64 bit = 1LL << (size * 7);
|
||||
|
||||
if (value > (bit - 2))
|
||||
return -1;
|
||||
|
||||
value |= bit;
|
||||
} else {
|
||||
size = 1;
|
||||
int64 bit;
|
||||
|
||||
for (;;) {
|
||||
bit = 1LL << (size * 7);
|
||||
const uint64 max = bit - 2;
|
||||
|
||||
if (value <= max)
|
||||
break;
|
||||
|
||||
++size;
|
||||
}
|
||||
|
||||
if (size > 8)
|
||||
return false;
|
||||
|
||||
value |= bit;
|
||||
}
|
||||
|
||||
return SerializeInt(writer, value, size);
|
||||
}
|
||||
|
||||
int32 WriteID(IMkvWriter* writer, uint64 type) {
|
||||
if (!writer)
|
||||
return -1;
|
||||
|
||||
writer->ElementStartNotify(type, writer->Position());
|
||||
|
||||
const int32 size = GetUIntSize(type);
|
||||
|
||||
return SerializeInt(writer, type, size);
|
||||
}
|
||||
|
||||
bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 type, uint64 size) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value) {
|
||||
return WriteEbmlElement(writer, type, value, 0);
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value,
|
||||
uint64 fixed_size) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
uint64 size = GetUIntSize(value);
|
||||
if (fixed_size > 0) {
|
||||
if (size > fixed_size)
|
||||
return false;
|
||||
size = fixed_size;
|
||||
}
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
if (SerializeInt(writer, value, static_cast<int32>(size)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return 0;
|
||||
|
||||
const uint64 size = GetIntSize(value);
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
if (SerializeInt(writer, value, static_cast<int32>(size)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, 4))
|
||||
return false;
|
||||
|
||||
if (SerializeFloat(writer, value))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value) {
|
||||
if (!writer || !value)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
const uint64 length = strlen(value);
|
||||
if (WriteUInt(writer, length))
|
||||
return false;
|
||||
|
||||
if (writer->Write(value, static_cast<uint32>(length)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value,
|
||||
uint64 size) {
|
||||
if (!writer || !value || size < 1)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, size))
|
||||
return false;
|
||||
|
||||
if (writer->Write(value, static_cast<uint32>(size)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
if (WriteID(writer, type))
|
||||
return false;
|
||||
|
||||
if (WriteUInt(writer, kDateElementSize))
|
||||
return false;
|
||||
|
||||
if (SerializeInt(writer, value, kDateElementSize))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame,
|
||||
Cluster* cluster) {
|
||||
if (!writer || !frame || !frame->IsValid() || !cluster ||
|
||||
!cluster->timecode_scale())
|
||||
return 0;
|
||||
|
||||
// Technically the timecode for a block can be less than the
|
||||
// timecode for the cluster itself (remember that block timecode
|
||||
// is a signed, 16-bit integer). However, as a simplification we
|
||||
// only permit non-negative cluster-relative timecodes for blocks.
|
||||
const int64 relative_timecode = cluster->GetRelativeTimecode(
|
||||
frame->timestamp() / cluster->timecode_scale());
|
||||
if (relative_timecode < 0 || relative_timecode > kMaxBlockTimecode)
|
||||
return 0;
|
||||
|
||||
return frame->CanBeSimpleBlock()
|
||||
? WriteSimpleBlock(writer, frame, relative_timecode)
|
||||
: WriteBlock(writer, frame, relative_timecode,
|
||||
cluster->timecode_scale());
|
||||
}
|
||||
|
||||
uint64 WriteVoidElement(IMkvWriter* writer, uint64 size) {
|
||||
if (!writer)
|
||||
return false;
|
||||
|
||||
// Subtract one for the void ID and the coded size.
|
||||
uint64 void_entry_size = size - 1 - GetCodedUIntSize(size - 1);
|
||||
uint64 void_size = EbmlMasterElementSize(libwebm::kMkvVoid, void_entry_size) +
|
||||
void_entry_size;
|
||||
|
||||
if (void_size != size)
|
||||
return 0;
|
||||
|
||||
const int64 payload_position = writer->Position();
|
||||
if (payload_position < 0)
|
||||
return 0;
|
||||
|
||||
if (WriteID(writer, libwebm::kMkvVoid))
|
||||
return 0;
|
||||
|
||||
if (WriteUInt(writer, void_entry_size))
|
||||
return 0;
|
||||
|
||||
const uint8 value = 0;
|
||||
for (int32 i = 0; i < static_cast<int32>(void_entry_size); ++i) {
|
||||
if (writer->Write(&value, 1))
|
||||
return 0;
|
||||
}
|
||||
|
||||
const int64 stop_position = writer->Position();
|
||||
if (stop_position < 0 ||
|
||||
stop_position - payload_position != static_cast<int64>(void_size))
|
||||
return 0;
|
||||
|
||||
return void_size;
|
||||
}
|
||||
|
||||
void GetVersion(int32_t* major, int32_t* minor, int32_t* build, int32_t* revision) {
|
||||
*major = 0;
|
||||
*minor = 3;
|
||||
*build = 3;
|
||||
*revision = 0;
|
||||
}
|
||||
|
||||
uint64 MakeUID(unsigned int* seed) {
|
||||
uint64 uid = 0;
|
||||
|
||||
for (int i = 0; i < 7; ++i) { // avoid problems with 8-byte values
|
||||
uid <<= 8;
|
||||
|
||||
// TODO(fgalligan): Move random number generation to platform specific code.
|
||||
#ifdef _WIN32
|
||||
(void)seed;
|
||||
const int32 nn = rand();
|
||||
#elif defined(__ANDROID__)
|
||||
(void)seed;
|
||||
int32 temp_num = 1;
|
||||
int fd = open("/dev/urandom", O_RDONLY);
|
||||
if (fd != -1) {
|
||||
read(fd, &temp_num, sizeof(temp_num));
|
||||
close(fd);
|
||||
}
|
||||
const int32 nn = temp_num;
|
||||
#else
|
||||
const int32 nn = rand_r(seed);
|
||||
#endif
|
||||
const int32 n = 0xFF & (nn >> 4); // throw away low-order bits
|
||||
|
||||
uid |= n;
|
||||
}
|
||||
|
||||
return uid;
|
||||
}
|
||||
|
||||
bool IsMatrixCoefficientsValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kGbr:
|
||||
case mkvmuxer::Colour::kBt709:
|
||||
case mkvmuxer::Colour::kUnspecifiedMc:
|
||||
case mkvmuxer::Colour::kReserved:
|
||||
case mkvmuxer::Colour::kFcc:
|
||||
case mkvmuxer::Colour::kBt470bg:
|
||||
case mkvmuxer::Colour::kSmpte170MMc:
|
||||
case mkvmuxer::Colour::kSmpte240MMc:
|
||||
case mkvmuxer::Colour::kYcocg:
|
||||
case mkvmuxer::Colour::kBt2020NonConstantLuminance:
|
||||
case mkvmuxer::Colour::kBt2020ConstantLuminance:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsChromaSitingHorzValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kUnspecifiedCsh:
|
||||
case mkvmuxer::Colour::kLeftCollocated:
|
||||
case mkvmuxer::Colour::kHalfCsh:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsChromaSitingVertValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kUnspecifiedCsv:
|
||||
case mkvmuxer::Colour::kTopCollocated:
|
||||
case mkvmuxer::Colour::kHalfCsv:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsColourRangeValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kUnspecifiedCr:
|
||||
case mkvmuxer::Colour::kBroadcastRange:
|
||||
case mkvmuxer::Colour::kFullRange:
|
||||
case mkvmuxer::Colour::kMcTcDefined:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsTransferCharacteristicsValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kIturBt709Tc:
|
||||
case mkvmuxer::Colour::kUnspecifiedTc:
|
||||
case mkvmuxer::Colour::kReservedTc:
|
||||
case mkvmuxer::Colour::kGamma22Curve:
|
||||
case mkvmuxer::Colour::kGamma28Curve:
|
||||
case mkvmuxer::Colour::kSmpte170MTc:
|
||||
case mkvmuxer::Colour::kSmpte240MTc:
|
||||
case mkvmuxer::Colour::kLinear:
|
||||
case mkvmuxer::Colour::kLog:
|
||||
case mkvmuxer::Colour::kLogSqrt:
|
||||
case mkvmuxer::Colour::kIec6196624:
|
||||
case mkvmuxer::Colour::kIturBt1361ExtendedColourGamut:
|
||||
case mkvmuxer::Colour::kIec6196621:
|
||||
case mkvmuxer::Colour::kIturBt202010bit:
|
||||
case mkvmuxer::Colour::kIturBt202012bit:
|
||||
case mkvmuxer::Colour::kSmpteSt2084:
|
||||
case mkvmuxer::Colour::kSmpteSt4281Tc:
|
||||
case mkvmuxer::Colour::kAribStdB67Hlg:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsPrimariesValueValid(uint64_t value) {
|
||||
switch (value) {
|
||||
case mkvmuxer::Colour::kReservedP0:
|
||||
case mkvmuxer::Colour::kIturBt709P:
|
||||
case mkvmuxer::Colour::kUnspecifiedP:
|
||||
case mkvmuxer::Colour::kReservedP3:
|
||||
case mkvmuxer::Colour::kIturBt470M:
|
||||
case mkvmuxer::Colour::kIturBt470Bg:
|
||||
case mkvmuxer::Colour::kSmpte170MP:
|
||||
case mkvmuxer::Colour::kSmpte240MP:
|
||||
case mkvmuxer::Colour::kFilm:
|
||||
case mkvmuxer::Colour::kIturBt2020:
|
||||
case mkvmuxer::Colour::kSmpteSt4281P:
|
||||
case mkvmuxer::Colour::kJedecP22Phosphors:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace mkvmuxer
|
||||
#endif // ESP32
|
117
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.h
Normal file
117
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvmuxerutil.h
Normal file
@ -0,0 +1,117 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
#ifndef MKVMUXER_MKVMUXERUTIL_H_
|
||||
#define MKVMUXER_MKVMUXERUTIL_H_
|
||||
#ifdef ESP32
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "mkvmuxertypes.h"
|
||||
|
||||
namespace mkvmuxer {
|
||||
class Cluster;
|
||||
class Frame;
|
||||
class IMkvWriter;
|
||||
|
||||
// TODO(tomfinegan): mkvmuxer:: integer types continue to be used here because
|
||||
// changing them causes pain for downstream projects. It would be nice if a
|
||||
// solution that allows removal of the mkvmuxer:: integer types while avoiding
|
||||
// pain for downstream users of libwebm. Considering that mkvmuxerutil.{cc,h}
|
||||
// are really, for the great majority of cases, EBML size calculation and writer
|
||||
// functions, perhaps a more EBML focused utility would be the way to go as a
|
||||
// first step.
|
||||
|
||||
const uint64 kEbmlUnknownValue = 0x01FFFFFFFFFFFFFFULL;
|
||||
const int64 kMaxBlockTimecode = 0x07FFFLL;
|
||||
|
||||
// Writes out |value| in Big Endian order. Returns 0 on success.
|
||||
int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size);
|
||||
|
||||
// Writes out |f| in Big Endian order. Returns 0 on success.
|
||||
int32 SerializeFloat(IMkvWriter* writer, float f);
|
||||
|
||||
// Returns the size in bytes of the element.
|
||||
int32 GetUIntSize(uint64 value);
|
||||
int32 GetIntSize(int64 value);
|
||||
int32 GetCodedUIntSize(uint64 value);
|
||||
uint64 EbmlMasterElementSize(uint64 type, uint64 value);
|
||||
uint64 EbmlElementSize(uint64 type, int64 value);
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value);
|
||||
uint64 EbmlElementSize(uint64 type, float value);
|
||||
uint64 EbmlElementSize(uint64 type, const char* value);
|
||||
uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size);
|
||||
uint64 EbmlDateElementSize(uint64 type);
|
||||
|
||||
// Returns the size in bytes of the element assuming that the element was
|
||||
// written using |fixed_size| bytes. If |fixed_size| is set to zero, then it
|
||||
// computes the necessary number of bytes based on |value|.
|
||||
uint64 EbmlElementSize(uint64 type, uint64 value, uint64 fixed_size);
|
||||
|
||||
// Creates an EBML coded number from |value| and writes it out. The size of
|
||||
// the coded number is determined by the value of |value|. |value| must not
|
||||
// be in a coded form. Returns 0 on success.
|
||||
int32 WriteUInt(IMkvWriter* writer, uint64 value);
|
||||
|
||||
// Creates an EBML coded number from |value| and writes it out. The size of
|
||||
// the coded number is determined by the value of |size|. |value| must not
|
||||
// be in a coded form. Returns 0 on success.
|
||||
int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size);
|
||||
|
||||
// Output an Mkv master element. Returns true if the element was written.
|
||||
bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 value, uint64 size);
|
||||
|
||||
// Outputs an Mkv ID, calls |IMkvWriter::ElementStartNotify|, and passes the
|
||||
// ID to |SerializeInt|. Returns 0 on success.
|
||||
int32 WriteID(IMkvWriter* writer, uint64 type);
|
||||
|
||||
// Output an Mkv non-master element. Returns true if the element was written.
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value);
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value,
|
||||
uint64 size);
|
||||
bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value);
|
||||
|
||||
// Output an Mkv non-master element using fixed size. The element will be
|
||||
// written out using exactly |fixed_size| bytes. If |fixed_size| is set to zero
|
||||
// then it computes the necessary number of bytes based on |value|. Returns true
|
||||
// if the element was written.
|
||||
bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value,
|
||||
uint64 fixed_size);
|
||||
|
||||
// Output a Mkv Frame. It decides the correct element to write (Block vs
|
||||
// SimpleBlock) based on the parameters of the Frame.
|
||||
uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame,
|
||||
Cluster* cluster);
|
||||
|
||||
// Output a void element. |size| must be the entire size in bytes that will be
|
||||
// void. The function will calculate the size of the void header and subtract
|
||||
// it from |size|.
|
||||
uint64 WriteVoidElement(IMkvWriter* writer, uint64 size);
|
||||
|
||||
// Returns the version number of the muxer in |major|, |minor|, |build|,
|
||||
// and |revision|.
|
||||
void GetVersion(int32_t* major, int32_t* minor, int32_t* build, int32_t* revision);
|
||||
|
||||
// Returns a random number to be used for UID, using |seed| to seed
|
||||
// the random-number generator (see POSIX rand_r() for semantics).
|
||||
uint64 MakeUID(unsigned int* seed);
|
||||
|
||||
// Colour field validation helpers. All return true when |value| is valid.
|
||||
bool IsMatrixCoefficientsValueValid(uint64_t value);
|
||||
bool IsChromaSitingHorzValueValid(uint64_t value);
|
||||
bool IsChromaSitingVertValueValid(uint64_t value);
|
||||
bool IsColourRangeValueValid(uint64_t value);
|
||||
bool IsTransferCharacteristicsValueValid(uint64_t value);
|
||||
bool IsPrimariesValueValid(uint64_t value);
|
||||
|
||||
} // namespace mkvmuxer
|
||||
|
||||
#endif // ESP32
|
||||
#endif // MKVMUXER_MKVMUXERUTIL_H_
|
101
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.cc
Normal file
101
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.cc
Normal file
@ -0,0 +1,101 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#include "mkvwriter.h"
|
||||
#ifdef ESP32
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#include <share.h> // for _SH_DENYWR
|
||||
#endif
|
||||
|
||||
namespace mkvmuxer {
|
||||
|
||||
MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {}
|
||||
|
||||
MkvWriter::MkvWriter(File* fp) : file_(fp), writer_owns_file_(false), use_write_cb_(false) {}
|
||||
|
||||
MkvWriter::MkvWriter(void* userdata, int(*cb)(void* userdata, const void* buffer, uint32 length)) : write_cb_(cb), cb_userdata_(userdata), writer_owns_file_(false), use_write_cb_(true) {}
|
||||
|
||||
MkvWriter::~MkvWriter() { Close(); }
|
||||
|
||||
int32 MkvWriter::Write(const void* buffer, uint32 length) {
|
||||
if (!file_ && !write_cb_)
|
||||
return -1;
|
||||
|
||||
if (length == 0)
|
||||
return 0;
|
||||
|
||||
if (buffer == NULL)
|
||||
return -1;
|
||||
|
||||
size_t bytes_written = 0;
|
||||
if(!use_write_cb_){
|
||||
bytes_written = file_->write((const uint8_t *)buffer, (size_t)length);
|
||||
} else {
|
||||
bytes_written = write_cb_(cb_userdata_, buffer, length);
|
||||
write_cb_written_ += bytes_written;
|
||||
}
|
||||
|
||||
return (bytes_written == length) ? 0 : -1;
|
||||
}
|
||||
|
||||
bool MkvWriter::Open(const char* filename) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void MkvWriter::Close() {
|
||||
if (file_ && writer_owns_file_) {
|
||||
file_->close();
|
||||
}
|
||||
file_ = NULL;
|
||||
}
|
||||
|
||||
int64 MkvWriter::Position() const {
|
||||
if (!file_ || use_write_cb_)
|
||||
return write_cb_written_;
|
||||
|
||||
return file_->position();
|
||||
}
|
||||
|
||||
int32 MkvWriter::Position(int64 position) {
|
||||
if (use_write_cb_ && write_cb_written_ == position)
|
||||
return 0;
|
||||
if (!file_ || use_write_cb_)
|
||||
return -1;
|
||||
|
||||
return file_->seek(position);
|
||||
|
||||
// #ifdef _MSC_VER
|
||||
// return _fseeki64(file_, position, SEEK_SET);
|
||||
// #elif defined(_WIN32)
|
||||
// return fseeko64(file_, static_cast<off_t>(position), SEEK_SET);
|
||||
// #elif !(defined(__ANDROID__) && __ANDROID_API__ < 24 && !defined(__LP64__) && \
|
||||
// defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64)
|
||||
// // POSIX.1 has fseeko and ftello. fseeko and ftello are not available before
|
||||
// // Android API level 24. See
|
||||
// // https://android.googlesource.com/platform/bionic/+/main/docs/32-bit-abi.md
|
||||
// // return fseeko(file_, static_cast<off_t>(position), SEEK_SET);
|
||||
// #else
|
||||
// return fseek(file_, static_cast<long>(position), SEEK_SET);
|
||||
// #endif
|
||||
// return -1;
|
||||
}
|
||||
|
||||
bool MkvWriter::Seekable() const {
|
||||
if (!file_ || use_write_cb_)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MkvWriter::ElementStartNotify(uint64, int64) {}
|
||||
|
||||
} // namespace mkvmuxer
|
||||
#endif // ESP32
|
60
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.h
Normal file
60
lib/lib_audio/ESP8266Audio/src/libwebm/mkvmuxer/mkvwriter.h
Normal file
@ -0,0 +1,60 @@
|
||||
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
|
||||
#ifndef MKVMUXER_MKVWRITER_H_
|
||||
#define MKVMUXER_MKVWRITER_H_
|
||||
|
||||
#ifdef ESP32
|
||||
#include <stdio.h>
|
||||
|
||||
#include <FS.h>
|
||||
#include "mkvmuxer.h"
|
||||
#include "mkvmuxertypes.h"
|
||||
|
||||
namespace mkvmuxer {
|
||||
|
||||
// Default implementation of the IMkvWriter interface on Windows.
|
||||
class MkvWriter : public IMkvWriter {
|
||||
public:
|
||||
MkvWriter();
|
||||
MkvWriter(File* fp);
|
||||
MkvWriter(void* userdata, int(*cb)(void* userdata, const void* buffer, uint32 length));
|
||||
virtual ~MkvWriter();
|
||||
|
||||
// IMkvWriter interface
|
||||
virtual int64 Position() const;
|
||||
virtual int32 Position(int64 position);
|
||||
virtual bool Seekable() const;
|
||||
virtual int32 Write(const void* buffer, uint32 length);
|
||||
virtual void ElementStartNotify(uint64 element_id, int64 position);
|
||||
|
||||
// Creates and opens a file for writing. |filename| is the name of the file
|
||||
// to open. This function will overwrite the contents of |filename|. Returns
|
||||
// true on success.
|
||||
bool Open(const char* filename);
|
||||
|
||||
// Closes an opened file.
|
||||
void Close();
|
||||
|
||||
private:
|
||||
// File handle to output file.
|
||||
File* file_;
|
||||
// Callback function to output stream.
|
||||
int(*write_cb_)(void* userdata, const void* buffer, uint32 length);
|
||||
void* cb_userdata_;
|
||||
bool writer_owns_file_;
|
||||
bool use_write_cb_;
|
||||
uint32_t write_cb_written_ = 0;
|
||||
|
||||
LIBWEBM_DISALLOW_COPY_AND_ASSIGN(MkvWriter);
|
||||
};
|
||||
|
||||
} // namespace mkvmuxer
|
||||
|
||||
#endif // ESP32
|
||||
#endif // MKVMUXER_MKVWRITER_H_
|
8107
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.cc
Normal file
8107
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.cc
Normal file
File diff suppressed because it is too large
Load Diff
1147
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.h
Normal file
1147
lib/lib_audio/ESP8266Audio/src/libwebm/mkvparser/mkvparser.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -90,12 +90,12 @@ int op_test(OpusHead *_head,
|
||||
ogg_sync_init(&oy);
|
||||
data=ogg_sync_buffer(&oy,(long)_initial_bytes);
|
||||
if(data!=NULL){
|
||||
ogg_stream_state *os = (ogg_stream_state*)malloc(sizeof(ogg_stream_state));
|
||||
ogg_stream_state os;
|
||||
ogg_page og;
|
||||
int ret;
|
||||
memcpy(data,_initial_data,_initial_bytes);
|
||||
ogg_sync_wrote(&oy,(long)_initial_bytes);
|
||||
ogg_stream_init(os,-1);
|
||||
ogg_stream_init(&os,-1);
|
||||
err=OP_FALSE;
|
||||
do{
|
||||
ogg_packet op;
|
||||
@ -104,11 +104,11 @@ int op_test(OpusHead *_head,
|
||||
if(ret<0)continue;
|
||||
/*Stop if we run out of data.*/
|
||||
if(!ret)break;
|
||||
ogg_stream_reset_serialno(os,ogg_page_serialno(&og));
|
||||
ogg_stream_pagein(os,&og);
|
||||
ogg_stream_reset_serialno(&os,ogg_page_serialno(&og));
|
||||
ogg_stream_pagein(&os,&og);
|
||||
/*Only process the first packet on this page (if it's a BOS packet,
|
||||
it's required to be the only one).*/
|
||||
if(ogg_stream_packetout(os,&op)==1){
|
||||
if(ogg_stream_packetout(&os,&op)==1){
|
||||
if(op.b_o_s){
|
||||
ret=opus_head_parse(_head,op.packet,op.bytes);
|
||||
/*If this didn't look like Opus, keep going.*/
|
||||
@ -122,8 +122,7 @@ int op_test(OpusHead *_head,
|
||||
}
|
||||
}
|
||||
while(err==OP_FALSE);
|
||||
ogg_stream_clear(os);
|
||||
free(os);
|
||||
ogg_stream_clear(&os);
|
||||
}
|
||||
else err=OP_EFAULT;
|
||||
ogg_sync_clear(&oy);
|
||||
@ -836,7 +835,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
ogg_int64_t cur_page_gp;
|
||||
ogg_uint32_t serialno;
|
||||
opus_int32 total_duration;
|
||||
int *durations = (int*)malloc(255 * sizeof(int));
|
||||
int durations[255];
|
||||
int cur_page_eos;
|
||||
int op_count;
|
||||
int pi;
|
||||
@ -853,31 +852,26 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
Otherwise there are no audio data packets in the whole logical stream.*/
|
||||
if(OP_UNLIKELY(page_offset<0)){
|
||||
/*Fail if there was a read error.*/
|
||||
if(page_offset<OP_FALSE) { free(durations); return (int)page_offset; }
|
||||
if(page_offset<OP_FALSE)return (int)page_offset;
|
||||
/*Fail if the pre-skip is non-zero, since it's asking us to skip more
|
||||
samples than exist.*/
|
||||
if(_link->head.pre_skip>0) {free(durations); return OP_EBADTIMESTAMP;}
|
||||
if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP;
|
||||
_link->pcm_file_offset=0;
|
||||
/*Set pcm_end and end_offset so we can skip the call to
|
||||
op_find_final_pcm_offset().*/
|
||||
_link->pcm_start=_link->pcm_end=0;
|
||||
_link->end_offset=_link->data_offset;
|
||||
free(durations);
|
||||
return 0;
|
||||
}
|
||||
/*Similarly, if we hit the next link in the chain, we've gone too far.*/
|
||||
if(OP_UNLIKELY(ogg_page_bos(_og))){
|
||||
if(_link->head.pre_skip>0) {
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
if(_link->head.pre_skip>0)return OP_EBADTIMESTAMP;
|
||||
/*Set pcm_end and end_offset so we can skip the call to
|
||||
op_find_final_pcm_offset().*/
|
||||
_link->pcm_file_offset=0;
|
||||
_link->pcm_start=_link->pcm_end=0;
|
||||
_link->end_offset=_link->data_offset;
|
||||
/*Tell the caller we've got a buffered page for them.*/
|
||||
free(durations);
|
||||
return 1;
|
||||
}
|
||||
/*Ignore pages from other streams (not strictly necessary, because of the
|
||||
@ -907,10 +901,7 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
cur_page_gp=_of->op[op_count-1].granulepos;
|
||||
/*But getting a packet without a valid granule position on the page is not
|
||||
okay.*/
|
||||
if(cur_page_gp==-1) {
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
if(cur_page_gp==-1)return OP_EBADTIMESTAMP;
|
||||
cur_page_eos=_of->op[op_count-1].e_o_s;
|
||||
if(OP_LIKELY(!cur_page_eos)){
|
||||
/*The EOS flag wasn't set.
|
||||
@ -919,7 +910,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
if(OP_UNLIKELY(op_granpos_add(&pcm_start,cur_page_gp,-total_duration)<0)){
|
||||
/*The starting granule position MUST not be smaller than the amount of
|
||||
audio on the first page with completed packets.*/
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
}
|
||||
@ -933,7 +923,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
/*However, the end-trimming MUST not ask us to trim more samples than
|
||||
exist after applying the pre-skip.*/
|
||||
if(OP_UNLIKELY(op_granpos_cmp(cur_page_gp,_link->head.pre_skip)<0)){
|
||||
free(durations);
|
||||
return OP_EBADTIMESTAMP;
|
||||
}
|
||||
}
|
||||
@ -968,7 +957,6 @@ static int op_find_initial_pcm_offset(OggOpusFile *_of,
|
||||
_link->pcm_file_offset=0;
|
||||
_of->prev_packet_gp=_link->pcm_start=pcm_start;
|
||||
_of->prev_page_offset=page_offset;
|
||||
free(durations);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1403,34 +1391,32 @@ static int op_open_seekable2_impl(OggOpusFile *_of){
|
||||
/*64 seek records should be enough for anybody.
|
||||
Actually, with a bisection search in a 63-bit range down to OP_CHUNK_SIZE
|
||||
granularity, much more than enough.*/
|
||||
OpusSeekRecord *sr = (OpusSeekRecord*)malloc(64 * sizeof(OpusSeekRecord));
|
||||
OpusSeekRecord sr[64];
|
||||
opus_int64 data_offset;
|
||||
int ret;
|
||||
/*We can seek, so set out learning all about this file.*/
|
||||
(*_of->callbacks.seek)(_of->stream,0,SEEK_END);
|
||||
_of->offset=_of->end=(*_of->callbacks.tell)(_of->stream);
|
||||
if(OP_UNLIKELY(_of->end<0)){free(sr); return OP_EREAD;}
|
||||
if(OP_UNLIKELY(_of->end<0))return OP_EREAD;
|
||||
data_offset=_of->links[0].data_offset;
|
||||
if(OP_UNLIKELY(_of->end<data_offset)){ free(sr); return OP_EBADLINK;}
|
||||
if(OP_UNLIKELY(_of->end<data_offset))return OP_EBADLINK;
|
||||
/*Get the offset of the last page of the physical bitstream, or, if we're
|
||||
lucky, the last Opus page of the first link, as most Ogg Opus files will
|
||||
contain a single logical bitstream.*/
|
||||
ret=op_get_prev_page_serial(_of,sr,_of->end,
|
||||
_of->links[0].serialno,_of->serialnos,_of->nserialnos);
|
||||
if(OP_UNLIKELY(ret<0)){free(sr); return ret;}
|
||||
if(OP_UNLIKELY(ret<0))return ret;
|
||||
/*If there's any trailing junk, forget about it.*/
|
||||
_of->end=sr[0].offset+sr[0].size;
|
||||
if(OP_UNLIKELY(_of->end<data_offset)){free(sr); return OP_EBADLINK;}
|
||||
if(OP_UNLIKELY(_of->end<data_offset))return OP_EBADLINK;
|
||||
/*Now enumerate the bitstream structure.*/
|
||||
ret = op_bisect_forward_serialno(_of,data_offset,sr,sizeof(sr)/sizeof(*sr),
|
||||
return op_bisect_forward_serialno(_of,data_offset,sr,sizeof(sr)/sizeof(*sr),
|
||||
&_of->serialnos,&_of->nserialnos,&_of->cserialnos);
|
||||
free(sr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int op_open_seekable2(OggOpusFile *_of){
|
||||
ogg_sync_state oy_start;
|
||||
ogg_stream_state *os_start = (ogg_stream_state*)malloc(sizeof(ogg_stream_state));
|
||||
ogg_stream_state os_start;
|
||||
ogg_packet *op_start;
|
||||
opus_int64 prev_page_offset;
|
||||
opus_int64 start_offset;
|
||||
@ -1449,9 +1435,9 @@ static int op_open_seekable2(OggOpusFile *_of){
|
||||
start_op_count=_of->op_count;
|
||||
/*This is a bit too large to put on the stack unconditionally.*/
|
||||
op_start=(ogg_packet *)_ogg_malloc(sizeof(*op_start)*start_op_count);
|
||||
if(op_start==NULL){free(os_start); return OP_EFAULT;}
|
||||
if(op_start==NULL)return OP_EFAULT;
|
||||
*&oy_start=_of->oy;
|
||||
*os_start=_of->os;
|
||||
*&os_start=_of->os;
|
||||
prev_page_offset=_of->prev_page_offset;
|
||||
start_offset=_of->offset;
|
||||
memcpy(op_start,_of->op,sizeof(*op_start)*start_op_count);
|
||||
@ -1463,7 +1449,7 @@ static int op_open_seekable2(OggOpusFile *_of){
|
||||
ogg_stream_clear(&_of->os);
|
||||
ogg_sync_clear(&_of->oy);
|
||||
*&_of->oy=*&oy_start;
|
||||
*&_of->os=*os_start;
|
||||
*&_of->os=*&os_start;
|
||||
_of->offset=start_offset;
|
||||
_of->op_count=start_op_count;
|
||||
memcpy(_of->op,op_start,sizeof(*_of->op)*start_op_count);
|
||||
@ -1471,10 +1457,9 @@ static int op_open_seekable2(OggOpusFile *_of){
|
||||
_of->prev_packet_gp=_of->links[0].pcm_start;
|
||||
_of->prev_page_offset=prev_page_offset;
|
||||
_of->cur_discard_count=_of->links[0].head.pre_skip;
|
||||
if(OP_UNLIKELY(ret<0)){free(os_start); return ret;}
|
||||
if(OP_UNLIKELY(ret<0))return ret;
|
||||
/*And restore the position indicator.*/
|
||||
ret=(*_of->callbacks.seek)(_of->stream,op_position(_of),SEEK_SET);
|
||||
free(os_start);
|
||||
return OP_UNLIKELY(ret<0)?OP_EREAD:0;
|
||||
}
|
||||
|
||||
@ -1995,7 +1980,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of,
|
||||
ogg_stream_pagein(&_of->os,&og);
|
||||
if(OP_LIKELY(_of->ready_state>=OP_INITSET)){
|
||||
opus_int32 total_duration;
|
||||
int *durations = (int*)malloc(255 * sizeof(int));
|
||||
int durations[255];
|
||||
int op_count;
|
||||
int report_hole;
|
||||
report_hole=0;
|
||||
@ -2052,7 +2037,7 @@ static int op_fetch_and_process_page(OggOpusFile *_of,
|
||||
Proceed to the next link, rather than risk playing back some
|
||||
samples that shouldn't have been played.*/
|
||||
_of->op_count=0;
|
||||
if(report_hole){ free(durations); return OP_HOLE; }
|
||||
if(report_hole)return OP_HOLE;
|
||||
continue;
|
||||
}
|
||||
/*By default discard 80 ms of data after a seek, unless we seek
|
||||
@ -2160,9 +2145,9 @@ static int op_fetch_and_process_page(OggOpusFile *_of,
|
||||
_of->prev_page_offset=_page_offset;
|
||||
_of->op_count=op_count=pi;
|
||||
}
|
||||
if(report_hole) { free(durations); return OP_HOLE; }
|
||||
if(report_hole)return OP_HOLE;
|
||||
/*If end-trimming didn't trim all the packets, we're done.*/
|
||||
if(op_count>0) { free(durations); return 0; }
|
||||
if(op_count>0)return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3016,7 +3001,7 @@ static const float OP_STEREO_DOWNMIX[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={
|
||||
#endif
|
||||
|
||||
#if defined(OP_FIXED_POINT)
|
||||
#if 0
|
||||
|
||||
/*Matrices for downmixing from the supported channel counts to stereo.
|
||||
The matrices with 5 or more channels are normalized to a total volume of 2.0,
|
||||
since most mixes sound too quiet if normalized to 1.0 (as there is generally
|
||||
@ -3025,6 +3010,7 @@ static const float OP_STEREO_DOWNMIX[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={
|
||||
32-bit number.*/
|
||||
static const opus_int16 OP_STEREO_DOWNMIX_Q14
|
||||
[OP_NCHANNELS_MAX-2][OP_NCHANNELS_MAX][2]={
|
||||
#if OP_NCHANNELS_MAX>2
|
||||
/*3.0*/
|
||||
{
|
||||
{9598,0},{6786,6786},{0,9598}
|
||||
@ -3051,8 +3037,9 @@ static const opus_int16 OP_STEREO_DOWNMIX_Q14
|
||||
{6368,0},{4502,4502},{0,6368},{5515,3183},{3183,5515},{5515,3183},
|
||||
{3183,5515},{4502,4502}
|
||||
}
|
||||
#endif // OP_NCHANNELS_MAX>2
|
||||
};
|
||||
#endif
|
||||
|
||||
int op_read(OggOpusFile *_of,opus_int16 *_pcm,int _buf_size,int *_li){
|
||||
return op_read_native(_of,_pcm,_buf_size,_li);
|
||||
}
|
||||
@ -3070,7 +3057,6 @@ static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz,
|
||||
for(i=0;i<_nsamples;i++)dst[2*i+0]=dst[2*i+1]=_src[i];
|
||||
}
|
||||
else{
|
||||
#if 0
|
||||
for(i=0;i<_nsamples;i++){
|
||||
opus_int32 l;
|
||||
opus_int32 r;
|
||||
@ -3086,8 +3072,6 @@ static int op_stereo_filter(OggOpusFile *_of,void *_dst,int _dst_sz,
|
||||
dst[2*i+0]=(opus_int16)OP_CLAMP(-32768,l+8192>>14,32767);
|
||||
dst[2*i+1]=(opus_int16)OP_CLAMP(-32768,r+8192>>14,32767);
|
||||
}
|
||||
#endif
|
||||
// noop, removed for RAM savings
|
||||
}
|
||||
}
|
||||
return _nsamples;
|
||||
|
@ -729,7 +729,7 @@ struct OpusServerInfo{
|
||||
/**The software used by the origin server (Server).
|
||||
This is <code>NULL</code> if there was no <code>Server</code> header.*/
|
||||
char *server;
|
||||
/**The media type of the entity sent to the recipient (Content-Type).
|
||||
/**The media type of the entity sent to the recepient (Content-Type).
|
||||
This is <code>NULL</code> if there was no <code>Content-Type</code>
|
||||
header.*/
|
||||
char *content_type;
|
||||
|
@ -9,11 +9,7 @@
|
||||
},
|
||||
"version": "2.6.7",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "*",
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "SPI"
|
||||
}
|
||||
]
|
||||
"libCompatMode": "strict",
|
||||
"platforms": ["espressif8266"]
|
||||
}
|
||||
|
||||
|
@ -69,7 +69,7 @@ typedef struct {
|
||||
rmt_symbol_word_t reset_code;
|
||||
} rmt_led_strip_encoder_t;
|
||||
|
||||
static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state)
|
||||
static IRAM_ATTR size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state)
|
||||
{
|
||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
||||
rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;
|
||||
|
18
lib/lib_basic/TasmotaLED/library.json
Normal file
18
lib/lib_basic/TasmotaLED/library.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "TasmotaLED",
|
||||
"version": "0.1",
|
||||
"keywords": [
|
||||
"ws2816", "sk6812", "leds"
|
||||
],
|
||||
"description": "Lightweight implementation for adressable leds.",
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/arendst/Tasmota/lib/lib_basic/TasmotaLED"
|
||||
},
|
||||
"frameworks": "arduino",
|
||||
"libCompatMode": "strict",
|
||||
"platforms": [
|
||||
"espressif32"
|
||||
]
|
||||
}
|
264
lib/lib_basic/TasmotaLED/src/TasmotaLED.cpp
Normal file
264
lib/lib_basic/TasmotaLED/src/TasmotaLED.cpp
Normal file
@ -0,0 +1,264 @@
|
||||
/*
|
||||
TasmotaLED.cpp - Lightweight implementation for adressable leds.
|
||||
|
||||
Copyright (C) 2024 Stephan Hadinger
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#ifdef ESP32
|
||||
|
||||
#include "TasmotaLEDPusher.h"
|
||||
#include "TasmotaLED.h"
|
||||
|
||||
// DRAM_ATTR to force in IRAM because we use this in show loop
|
||||
static const DRAM_ATTR uint8_t TASMOTALED_CHANNEL_ORDERS[8][3] = {
|
||||
{1, 0, 2}, // Def=GRB (0)
|
||||
{1, 0, 2}, // GRB (1)
|
||||
{0, 1, 2}, // RGB (2)
|
||||
{0, 2, 1}, // RBG (3)
|
||||
{2, 1, 0}, // BRG (4)
|
||||
{1, 2, 0}, // BGR (5)
|
||||
{2, 0, 1}, // GBR (6)
|
||||
{1, 0, 2} // GRB (7) // fallback if erroneous value
|
||||
};
|
||||
|
||||
static const TasmotaLED_Timing TasmotaLED_Timings[] = {
|
||||
// WS2812
|
||||
// RmtBit0 0x00228010 RmtBit1 0x00128020 RmtReset 0x800207D0
|
||||
{
|
||||
.T0H = 400,
|
||||
.T0L = 850,
|
||||
.T1H = 800,
|
||||
.T1L = 450,
|
||||
.Reset = 80000 // it is 50000 for WS2812, but for compatibility with SK6812, we raise to 80000
|
||||
},
|
||||
// SK6812
|
||||
// RmtBit0 0x0024800C RmtBit1 0x00188018 RmtReset 0x80020C80
|
||||
{
|
||||
.T0H = 300,
|
||||
.T0L = 900,
|
||||
.T1H = 600,
|
||||
.T1L = 600,
|
||||
.Reset = 80000
|
||||
},
|
||||
};
|
||||
|
||||
// enable AddLog
|
||||
extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
|
||||
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
|
||||
|
||||
|
||||
TasmotaLED::TasmotaLED(uint16_t type, uint16_t num_leds) :
|
||||
_type(type),
|
||||
_timing((type >> 8) & 0xFF),
|
||||
_started(false),
|
||||
_dirty(true),
|
||||
_raw_format(false),
|
||||
_pixel_count(num_leds),
|
||||
_buf_work(nullptr),
|
||||
_buf_show(nullptr),
|
||||
_pusher(nullptr)
|
||||
{
|
||||
_adjustSubType(); // compute values for _pixel_order, _w_before, _pixel_matrix
|
||||
if (_timing > (TasmotaLed_TimingEnd >> 8)) {
|
||||
_timing = 0;
|
||||
}
|
||||
switch (_type & 0x0F) {
|
||||
case TasmotaLed_4_WRGB:
|
||||
_pixel_size = 4;
|
||||
break;
|
||||
case TasmotaLed_1_Def:
|
||||
case TasmotaLed_3_RGB:
|
||||
default: // fallback
|
||||
_pixel_size = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
_pixel_matrix = &TASMOTALED_CHANNEL_ORDERS[_pixel_order];
|
||||
|
||||
_buf_work = new uint8_t[_pixel_count * _pixel_size];
|
||||
memset(_buf_work, 0, _pixel_count * _pixel_size);
|
||||
_buf_show = new uint8_t[_pixel_count * _pixel_size];
|
||||
memset(_buf_show, 0, _pixel_count * _pixel_size);
|
||||
// AddLog(LOG_LEVEL_DEBUG, "LED: type=0x%04X pixel_order=0x%02X _timing=%i ", _type, _pixel_order, _timing);
|
||||
}
|
||||
|
||||
TasmotaLED::~TasmotaLED() {
|
||||
if (_pusher) {
|
||||
delete _pusher;
|
||||
_pusher = nullptr;
|
||||
}
|
||||
delete _buf_work;
|
||||
_buf_work = nullptr;
|
||||
delete _buf_show;
|
||||
_buf_show = nullptr;
|
||||
}
|
||||
|
||||
// Adjust all internal parameters accouring to sub-type
|
||||
void TasmotaLED::_adjustSubType(void) {
|
||||
_pixel_order = (_type >> 4) & 0x07;
|
||||
_pixel_matrix = &TASMOTALED_CHANNEL_ORDERS[_pixel_order];
|
||||
_w_before = _type & 0x08;
|
||||
}
|
||||
|
||||
void TasmotaLED::SetPixelCount(uint16_t num_leds) {
|
||||
if (num_leds != _pixel_count) {
|
||||
_pixel_count = num_leds;
|
||||
delete _buf_work;
|
||||
_buf_work = new uint8_t[_pixel_count * _pixel_size];
|
||||
memset(_buf_work, 0, _pixel_count * _pixel_size);
|
||||
delete _buf_show;
|
||||
_buf_show = new uint8_t[_pixel_count * _pixel_size];
|
||||
memset(_buf_show, 0, _pixel_count * _pixel_size);
|
||||
if (_pusher) {
|
||||
_pusher->SetPixelCount(_pixel_count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TasmotaLED::SetPixelSubType(uint8_t subtype) {
|
||||
// subtype is only the 8 lower bits of _type
|
||||
_type = (_type & 0xFF00) | (subtype & 0xFF);
|
||||
_adjustSubType();
|
||||
}
|
||||
|
||||
|
||||
// Color is passed as 0xWWRRGGBB and copied as WWRRGGBB in _buf_work
|
||||
void TasmotaLED::ClearTo(uint32_t wrgb, int32_t first, int32_t last) {
|
||||
// adjust first and last to be in range of 0 to _pixel_count-1
|
||||
if (first <0) { first += _pixel_count; }
|
||||
if (last <0) { last += _pixel_count; }
|
||||
if (first < 0) { first = 0; }
|
||||
if (last >= _pixel_count) { last = _pixel_count - 1; }
|
||||
if (first > last) { return; }
|
||||
// adjust to pixel format
|
||||
uint8_t b0 = (wrgb >> 24) & 0xFF;
|
||||
uint8_t b1 = (wrgb >> 16) & 0xFF;
|
||||
uint8_t b2 = (wrgb >> 8) & 0xFF;
|
||||
uint8_t b3 = (wrgb ) & 0xFF;
|
||||
|
||||
if ((b0 | b1 | b2 | b3) == 0) {
|
||||
// special version for clearing to black
|
||||
memset(_buf_work + first * _pixel_size, 0, (last - first + 1) * _pixel_size);
|
||||
} else {
|
||||
// fill sub-buffer with RRGGBB or WWRRGGBB (or raw)
|
||||
uint8_t *buf = _buf_work + first * _pixel_size;
|
||||
for (uint32_t i = first; i <= last; i++) {
|
||||
if (_pixel_size == 4) { *buf++ = b0;}
|
||||
*buf++ = b1;
|
||||
*buf++ = b2;
|
||||
*buf++ = b3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TasmotaLED::Show(void) {
|
||||
if (_pusher) {
|
||||
_dirty = false; // we don't use the _dirty attribute and always show
|
||||
|
||||
// copy the input buffer to the work buffer in format to be understood by LED strip
|
||||
if (_raw_format) {
|
||||
memmove(_buf_show, _buf_work, _pixel_count * _pixel_size); // copy buffer in next buffer so we start with the current content
|
||||
} else {
|
||||
uint8_t *buf_from = _buf_work;
|
||||
uint8_t *buf_to = _buf_show;
|
||||
if (_pixel_size == 3) {
|
||||
// copying with swapping 512 pixels (1536 bytes) takes 124 microseconds to copy, so it's negligeable
|
||||
for (uint32_t i = 0; i < _pixel_count; i++) {
|
||||
buf_to[(*_pixel_matrix)[0]] = buf_from[0]; // R
|
||||
buf_to[(*_pixel_matrix)[1]] = buf_from[1]; // G
|
||||
buf_to[(*_pixel_matrix)[2]] = buf_from[2]; // B
|
||||
buf_to += 3;
|
||||
buf_from += 3;
|
||||
}
|
||||
} else if (_pixel_size == 4) {
|
||||
for (uint32_t i = 0; i < _pixel_count; i++) {
|
||||
if (_w_before) { *buf_to++ = buf_from[3]; }
|
||||
buf_to[(*_pixel_matrix)[0]] = buf_from[0]; // R
|
||||
buf_to[(*_pixel_matrix)[1]] = buf_from[1]; // G
|
||||
buf_to[(*_pixel_matrix)[2]] = buf_from[2]; // B
|
||||
if (!_w_before) { *buf_to++ = buf_from[3]; }
|
||||
buf_to += 3; // one increment already happened
|
||||
buf_from += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
_pusher->Push(_buf_show); // push to leds
|
||||
}
|
||||
}
|
||||
|
||||
void TasmotaLED::SetPixelColor(int32_t index, uint32_t wrgb) {
|
||||
if (index < 0) { index += _pixel_count; }
|
||||
if ((index >= 0) && (index < _pixel_count)) {
|
||||
uint8_t *buf = _buf_work + index * _pixel_size;
|
||||
uint8_t b0 = (wrgb >> 24) & 0xFF;
|
||||
uint8_t b1 = (wrgb >> 16) & 0xFF;
|
||||
uint8_t b2 = (wrgb >> 8) & 0xFF;
|
||||
uint8_t b3 = (wrgb ) & 0xFF;
|
||||
|
||||
if (_pixel_size == 4) { *buf++ = b0;}
|
||||
*buf++ = b1;
|
||||
*buf++ = b2;
|
||||
*buf++ = b3;
|
||||
_dirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t TasmotaLED::GetPixelColor(int32_t index) {
|
||||
if (index < 0) { index += _pixel_count; }
|
||||
if ((index >= 0) && (index < _pixel_count)) {
|
||||
uint8_t *buf = _buf_work + index * _pixel_size;
|
||||
uint32_t wrgb = 0;
|
||||
if (_pixel_size == 4) { wrgb = (*buf++) << 24; }
|
||||
wrgb |= (*buf++) << 16;
|
||||
wrgb |= (*buf++) << 8;
|
||||
wrgb |= (*buf++);
|
||||
return wrgb;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void TasmotaLED::SetPusher(TasmotaLEDPusher *pusher) {
|
||||
if (_pusher) {
|
||||
delete _pusher;
|
||||
}
|
||||
_pusher = pusher;
|
||||
_started = false;
|
||||
}
|
||||
|
||||
bool TasmotaLED::Begin(void) {
|
||||
if (_pusher) {
|
||||
if (_started) {
|
||||
return true;
|
||||
} else {
|
||||
const TasmotaLED_Timing * timing = &TasmotaLED_Timings[_timing];
|
||||
// AddLog(LOG_LEVEL_DEBUG, "LED: T0H=%i T0L=%i T1H=%i T1L=%i Reset=%i", timing.T0H, timing.T0L, timing.T1H, timing.T1L, timing.Reset);
|
||||
return _pusher->Begin(_pixel_count, _pixel_size, timing);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool TasmotaLED::CanShow(void) const {
|
||||
if (_pusher) {
|
||||
return _pusher->CanShow();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif // ESP32
|
134
lib/lib_basic/TasmotaLED/src/TasmotaLED.h
Normal file
134
lib/lib_basic/TasmotaLED/src/TasmotaLED.h
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
TasmotaLED.h - Lightweight implementation for adressable leds.
|
||||
|
||||
Copyright (C) 2024 Stephan Hadinger
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __TASMOTALED_H__
|
||||
#define __TASMOTALED_H__
|
||||
|
||||
enum TasmotaLEDTypesEncoding : uint16_t {
|
||||
// bits 0..3 encode for number of bytes per pixel
|
||||
TasmotaLed_1_Def = 0x0, // Default value - identical to TasmotaLed_3_RGB
|
||||
TasmotaLed_3_RGB = 0x1, // 3 bytes per pixel
|
||||
TasmotaLed_4_WRGB = 0x2, // 4 bytes per pixel
|
||||
// bits 4..6 encode for pixel order
|
||||
TasmotaLed_Def = 0b000 << 4, // Default value - identical to TasmotaLed_GRB
|
||||
TasmotaLed_GRB = 0b001 << 4,
|
||||
TasmotaLed_RGB = 0b010 << 4,
|
||||
TasmotaLed_RBG = 0b011 << 4,
|
||||
TasmotaLed_BRG = 0b100 << 4,
|
||||
TasmotaLed_BGR = 0b101 << 4,
|
||||
TasmotaLed_GBR = 0b110 << 4,
|
||||
// bit 7 sets the position for W channel
|
||||
TasmotaLed_xxxW = 0b0 << 7, // W channel after color
|
||||
TasmotaLed_Wxxx = 0b1 << 7, // W channel before color
|
||||
// bits 8..15 encode for timing specifics
|
||||
TasmotaLed_WS2812 = 0 << 8,
|
||||
TasmotaLed_SK6812 = 1 << 8,
|
||||
TasmotaLed_TimingEnd = 2 << 8,
|
||||
};
|
||||
|
||||
enum TasmotaLEDHardware : uint32_t {
|
||||
// low-order bits are reserved for channels numbers and hardware flags - currenlty not useds
|
||||
// bits 16..23
|
||||
TasmotaLed_HW_Default = 0x000000,
|
||||
TasmotaLed_RMT = (1 << 0) << 16,
|
||||
TasmotaLed_SPI = (1 << 1) << 16,
|
||||
TasmotaLed_I2S = (1 << 2) << 16,
|
||||
TasmotaLed_HW_None = 0xFF << 16, // indicates that the specified HW is not supported
|
||||
};
|
||||
|
||||
// Below is the encoding for full strips
|
||||
// We need to keep backwards compatibility so:
|
||||
// 0 = WS2812 (GRB)
|
||||
// 1 = SK6812 with White (GRBW)
|
||||
enum TasmotaLEDTypes : uint16_t {
|
||||
ws2812_grb = TasmotaLed_3_RGB | TasmotaLed_GRB | TasmotaLed_WS2812, // 1 for backwards compatibility
|
||||
sk6812_grbw = TasmotaLed_4_WRGB | TasmotaLed_GRB | TasmotaLed_xxxW | TasmotaLed_SK6812, // 2 for backwards compatibility
|
||||
sk6812_grb = TasmotaLed_3_RGB | TasmotaLed_GRB | TasmotaLed_SK6812,
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
/*******************************************************************************************\
|
||||
* class TasmotaLED
|
||||
*
|
||||
* This class is a lightweight replacement for NeoPixelBus library with a smaller
|
||||
* implementation focusing only on pushing a buffer to the leds.
|
||||
*
|
||||
* It supports:
|
||||
* - RMT and I2S hardware support
|
||||
* Possible enhancements could be considered with SPI and Serial
|
||||
* - Led size of 3 bytes (GRB) and 4 bytes (GRBW)
|
||||
* APIs take 0xRRGGBB or 0xRRGGBBWW as input
|
||||
* but Internal buffers use GGRRBB and GGRRBBWW
|
||||
* - Led type of WS2812 and SK6812
|
||||
* - There is no buffer swapping, the working buffer is copied to an internal
|
||||
* buffer just before display, so you can keep a reference to the buffer
|
||||
* and modify it without having to worry about the display
|
||||
* - buffer is cleared at start
|
||||
* - "Dirty" is kept for API compatibility with NeoPixelBus but is glbally ignored
|
||||
* so any call to `Show()` pushes the pixels even if they haven't changed.
|
||||
* Control for dirty pixels should be done by the caller if required.
|
||||
* - We tried to keep as close as possible to NeoPixelBus method names to ease transition
|
||||
\*******************************************************************************************/
|
||||
class TasmotaLEDPusher; // forward definition
|
||||
class TasmotaLED {
|
||||
public:
|
||||
TasmotaLED(uint16_t type, uint16_t num_leds);
|
||||
~TasmotaLED();
|
||||
|
||||
void SetPixelCount(uint16_t num_leds);
|
||||
void SetPixelSubType(uint8_t type); // change only Pixel order and pixel size
|
||||
void _adjustSubType(void);
|
||||
|
||||
bool Begin(void);
|
||||
void SetPusher(TasmotaLEDPusher *pusher); // needs to be called before `Begin()`, sets the hardware implementation
|
||||
void Show(void); // pushes the pixels to the LED strip
|
||||
inline void SetRawFormat(bool raw_format) { _raw_format = raw_format; }
|
||||
|
||||
void ClearTo(uint32_t rgbw, int32_t first = 0, int32_t last = -1);
|
||||
void SetPixelColor(int32_t index, uint32_t wrgb);
|
||||
uint32_t GetPixelColor(int32_t index);
|
||||
|
||||
uint8_t GetType(void) const { return _type; }
|
||||
uint16_t PixelCount(void) const { return _pixel_count; }
|
||||
uint8_t PixelSize(void) const { return _pixel_size; }
|
||||
inline uint8_t * Pixels(void) const { return _buf_work; }
|
||||
inline bool IsDirty(void) const { return _dirty; }
|
||||
inline void Dirty(void) { _dirty = true; }
|
||||
|
||||
bool CanShow(void) const;
|
||||
|
||||
protected:
|
||||
uint16_t _type; // the composite type
|
||||
uint8_t _pixel_order; // permutation between RGB and position of W
|
||||
bool _w_before; // true if W channel comes first (4 channels only)
|
||||
uint8_t _timing; // timing code for strip, 0=WS2812, 1=SK6812...
|
||||
bool _started; // true if the hardware implementation is configured
|
||||
bool _dirty; // for NeoPixelBus compatibility, but ignored by `Push()`
|
||||
bool _raw_format; // if true, copy raw to leds, if false, convert from RGB to GRB or LED format
|
||||
uint16_t _pixel_count; // how many pixels in the strip
|
||||
uint8_t _pixel_size; // how many bytes per pixels, only 3 and 4 are supported
|
||||
uint8_t *_buf_work; // buffer used to draw into, can be modified directly by the caller
|
||||
uint8_t *_buf_show; // copy of the buffer used to push to leds, private to this class
|
||||
const uint8_t (*_pixel_matrix)[3]; // pointer to the pixer_order_matrix
|
||||
TasmotaLEDPusher *_pusher; // pixels pusher implementation based on hardware (RMT, I2S...)
|
||||
};
|
||||
|
||||
#endif // __cplusplus
|
||||
#endif // __TASMOTALED_H__
|
98
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.cpp
Normal file
98
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.cpp
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
TasmotaLEDPusher.cpp - Implementation to push Leds via hardware acceleration
|
||||
|
||||
Copyright (C) 2024 Stephan Hadinger
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef ESP32
|
||||
|
||||
#include "TasmotaLEDPusher.h"
|
||||
#include "TasmotaLED.h"
|
||||
|
||||
//**************************************************************************************************************
|
||||
// enable AddLog support within a C++ library
|
||||
extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
|
||||
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
|
||||
//**************************************************************************************************************
|
||||
|
||||
|
||||
// convert to the appropriate hardware acceleration based on capacities of the SOC
|
||||
uint32_t TasmotaLEDPusher::ResolveHardware(uint32_t hw_input) {
|
||||
// Step 1. discard any unsupported hardware, and replace with TasmotaLed_HW_Default
|
||||
uint32_t hw = hw_input & 0xFF0000; // discard bits 0..15
|
||||
#if !TASMOTALED_HARDWARE_RMT
|
||||
hw &= ~TasmotaLed_RMT; // remove RMT flag if not supported by hardware
|
||||
#endif // TASMOTALED_HARDWARE_RMT
|
||||
#if !TASMOTALED_HARDWARE_SPI
|
||||
hw &= ~TasmotaLed_SPI; // remove SPI flag if not supported by hardware
|
||||
#endif // TASMOTALED_HARDWARE_SPI
|
||||
#if !TASMOTALED_HARDWARE_I2S
|
||||
hw &= ~TasmotaLed_I2S; // remove I2S flag if not supported by hardware
|
||||
#endif // TASMOTALED_HARDWARE_I2S
|
||||
|
||||
// Step 2. If TasmotaLed_HW_Default, find a suitable scheme, RMT preferred
|
||||
#if TASMOTALED_HARDWARE_RMT
|
||||
if (hw == TasmotaLed_HW_Default) {
|
||||
hw |= TasmotaLed_RMT;
|
||||
}
|
||||
#endif // TASMOTALED_HARDWARE_RMT
|
||||
#if TASMOTALED_HARDWARE_I2S
|
||||
if (hw == TasmotaLed_HW_Default) {
|
||||
hw |= TasmotaLed_I2S;
|
||||
}
|
||||
#endif // TASMOTALED_HARDWARE_I2S
|
||||
#if TASMOTALED_HARDWARE_SPI
|
||||
if (hw == TasmotaLed_HW_Default) {
|
||||
hw |= TasmotaLed_SPI;
|
||||
}
|
||||
#endif // TASMOTALED_HARDWARE_SPI
|
||||
return hw;
|
||||
}
|
||||
|
||||
|
||||
TasmotaLEDPusher * TasmotaLEDPusher::Create(uint32_t hw, int8_t gpio) {
|
||||
TasmotaLEDPusher * pusher = nullptr;
|
||||
|
||||
hw = TasmotaLEDPusher::ResolveHardware(hw);
|
||||
|
||||
#if TASMOTALED_HARDWARE_RMT
|
||||
if (pusher == nullptr && (hw & TasmotaLed_RMT)) {
|
||||
pusher = new TasmotaLEDPusherRMT(gpio);
|
||||
if (pusher->Initialized()) {
|
||||
AddLog(LOG_LEVEL_DEBUG, "LED: RMT gpio %i", gpio);
|
||||
} else {
|
||||
AddLog(LOG_LEVEL_INFO, "LED: Error create %s bus failed %i err=%i", "RMT", gpio, pusher->Error());
|
||||
delete pusher;
|
||||
pusher = nullptr;
|
||||
}
|
||||
}
|
||||
#endif // TASMOTALED_HARDWARE_RMT
|
||||
#if TASMOTALED_HARDWARE_SPI
|
||||
if (pusher == nullptr && (hw & TasmotaLed_SPI)) {
|
||||
pusher = new TasmotaLEDPusherSPI(gpio);
|
||||
if (pusher->Initialized()) {
|
||||
AddLog(LOG_LEVEL_DEBUG, "LED: SPI gpio %i", gpio);
|
||||
} else {
|
||||
AddLog(LOG_LEVEL_INFO, "LED: Error create %s bus failed %i err=%i", "SPI", gpio, pusher->Error());
|
||||
delete pusher;
|
||||
pusher = nullptr;
|
||||
}
|
||||
}
|
||||
#endif // TASMOTALED_HARDWARE_SPI
|
||||
return pusher;
|
||||
}
|
||||
|
||||
#endif // ESP32
|
169
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.h
Normal file
169
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusher.h
Normal file
@ -0,0 +1,169 @@
|
||||
/*
|
||||
TasmotaLEDPusher.h - Abstract class for Leds pusher (RMT, SPI, I2S...)
|
||||
|
||||
Copyright (C) 2024 Stephan Hadinger
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __TASMOTALEDPUSHER_H__
|
||||
#define __TASMOTALEDPUSHER_H__
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
// Below are flags to enable of disable each hardware support: RMT, I2S, SPI
|
||||
// By default, only enable RMT support, and SPI is used as fallback if no protocol works
|
||||
//
|
||||
// Use de defines below:
|
||||
// #define TASMOTALED_HARDWARE_RMT 0/1
|
||||
// #define TASMOTALED_HARDWARE_I2S 0/1
|
||||
// #define TASMOTALED_HARDWARE_SPI 0/1
|
||||
//
|
||||
#ifndef TASMOTALED_HARDWARE_RMT
|
||||
#define TASMOTALED_HARDWARE_RMT 1
|
||||
#endif
|
||||
|
||||
#ifndef TASMOTALED_HARDWARE_I2S
|
||||
#define TASMOTALED_HARDWARE_I2S 0
|
||||
#endif
|
||||
|
||||
#ifndef TASMOTALED_HARDWARE_SPI
|
||||
#define TASMOTALED_HARDWARE_SPI 0
|
||||
#endif
|
||||
|
||||
// Disable any hardware if not supported by the SOC
|
||||
#if TASMOTALED_HARDWARE_RMT && !defined(SOC_RMT_SUPPORTED)
|
||||
#undef TASMOTALED_HARDWARE_RMT
|
||||
#define TASMOTALED_HARDWARE_RMT 0
|
||||
#endif
|
||||
|
||||
#if TASMOTALED_HARDWARE_I2S && !defined(SOC_I2S_SUPPORTED)
|
||||
#undef TASMOTALED_HARDWARE_I2S
|
||||
#define TASMOTALED_HARDWARE_I2S 0
|
||||
#endif
|
||||
|
||||
#if TASMOTALED_HARDWARE_SPI && !defined(SOC_GPSPI_SUPPORTED)
|
||||
#undef TASMOTALED_HARDWARE_SPI
|
||||
#define TASMOTALED_HARDWARE_SPI 0
|
||||
#endif
|
||||
|
||||
// if no protocol is defined, use SPI as fallback
|
||||
#if !TASMOTALED_HARDWARE_RMT && !TASMOTALED_HARDWARE_I2S && !TASMOTALED_HARDWARE_SPI
|
||||
#undef TASMOTALED_HARDWARE_SPI
|
||||
#define TASMOTALED_HARDWARE_SPI 1
|
||||
#endif
|
||||
|
||||
// Timing structure for LEDS - in nanoseconds
|
||||
// It is passed by TasmotaLed to the pushers
|
||||
typedef struct TasmotaLED_Timing {
|
||||
uint16_t T0H, T0L, T1H, T1L;
|
||||
uint32_t Reset;
|
||||
} TasmotaLED_Timing;
|
||||
|
||||
/*******************************************************************************************\
|
||||
* class TasmotaLEDPusher
|
||||
*
|
||||
* This is an virtual abstract class for Leds pusher (RMT, SPI, I2S...)
|
||||
*
|
||||
* Below are interfaces for current implementations
|
||||
\*******************************************************************************************/
|
||||
class TasmotaLEDPusher {
|
||||
public:
|
||||
TasmotaLEDPusher() : _initialized(false), _err(ESP_OK), _pixel_count(0), _pixel_size(0), _led_timing(nullptr) {};
|
||||
virtual ~TasmotaLEDPusher() {};
|
||||
|
||||
bool Initialized(void) const { return _initialized; }
|
||||
esp_err_t Error(void) const { return _err; }
|
||||
virtual bool Begin(uint16_t pixel_count, uint16_t pixel_size, const TasmotaLED_Timing * led_timing) {
|
||||
_pixel_count = pixel_count;
|
||||
_pixel_size = pixel_size;
|
||||
_led_timing = led_timing;
|
||||
return true;
|
||||
}
|
||||
virtual bool Push(uint8_t *buf) = 0;
|
||||
virtual bool CanShow(void) = 0;
|
||||
virtual bool SetPixelCount(uint16_t pixel_count) = 0;
|
||||
|
||||
static uint32_t ResolveHardware(uint32_t hw); // convert to the appropriate hardware acceleration based on capacities of the SOC
|
||||
static TasmotaLEDPusher * Create(uint32_t hw, int8_t gpio); // create instance for the provided type, or nullptr if failed
|
||||
|
||||
protected:
|
||||
bool _initialized; // did the hardware got correctly initialized
|
||||
esp_err_t _err;
|
||||
uint16_t _pixel_count;
|
||||
uint16_t _pixel_size;
|
||||
const TasmotaLED_Timing * _led_timing;
|
||||
};
|
||||
|
||||
/*******************************************************************************************\
|
||||
* class TasmotaLEDPusherRMT
|
||||
*
|
||||
* Implementation based on RMT driver
|
||||
\*******************************************************************************************/
|
||||
#if TASMOTALED_HARDWARE_RMT
|
||||
#include "driver/rmt_tx.h"
|
||||
class TasmotaLEDPusherRMT : public TasmotaLEDPusher {
|
||||
public:
|
||||
TasmotaLEDPusherRMT(int8_t pin);
|
||||
~TasmotaLEDPusherRMT();
|
||||
|
||||
bool Begin(uint16_t pixel_count, uint16_t pixel_size, const TasmotaLED_Timing * led_timing) override;
|
||||
bool SetPixelCount(uint16_t pixel_count) override;
|
||||
|
||||
bool Push(uint8_t *buf) override;
|
||||
bool CanShow(void) override;
|
||||
protected:
|
||||
int8_t _pin;
|
||||
rmt_transmit_config_t _tx_config = {};
|
||||
rmt_channel_handle_t _channel = nullptr;;
|
||||
rmt_encoder_handle_t _led_encoder = nullptr;
|
||||
};
|
||||
#endif // TASMOTALED_HARDWARE_RMT
|
||||
|
||||
/*******************************************************************************************\
|
||||
* class TasmotaLEDPusherSPI
|
||||
*
|
||||
* Implementation based on SPI driver, mandatory for C2
|
||||
\*******************************************************************************************/
|
||||
#if TASMOTALED_HARDWARE_SPI
|
||||
#include <driver/spi_master.h>
|
||||
|
||||
typedef struct led_strip_spi_obj_t {
|
||||
uint8_t * pixel_buf;
|
||||
uint16_t strip_len;
|
||||
uint8_t bytes_per_pixel;
|
||||
spi_host_device_t spi_host;
|
||||
spi_device_handle_t spi_device;
|
||||
spi_transaction_t tx_conf; // transaction in process if any
|
||||
} led_strip_spi_obj;
|
||||
|
||||
class TasmotaLEDPusherSPI : public TasmotaLEDPusher {
|
||||
public:
|
||||
TasmotaLEDPusherSPI(int8_t pin);
|
||||
~TasmotaLEDPusherSPI();
|
||||
|
||||
bool Begin(uint16_t pixel_count, uint16_t pixel_size, const TasmotaLED_Timing * led_timing) override;
|
||||
bool SetPixelCount(uint16_t pixel_count) override;
|
||||
|
||||
bool Push(uint8_t *buf) override;
|
||||
bool CanShow(void) override;
|
||||
|
||||
protected:
|
||||
int8_t _pin;
|
||||
struct led_strip_spi_obj_t _spi_strip = {};;
|
||||
const bool _with_dma = true;
|
||||
};
|
||||
#endif // TASMOTALED_HARDWARE_SPI
|
||||
|
||||
#endif // __TASMOTALEDPUSHER_H__
|
252
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherRMT.cpp
Normal file
252
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherRMT.cpp
Normal file
@ -0,0 +1,252 @@
|
||||
/*
|
||||
TasmotaLEDPusherRMT.cpp - Implementation to push Leds via RMT channel
|
||||
|
||||
Copyright (C) 2024 Stephan Hadinger
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef ESP32
|
||||
|
||||
#include "TasmotaLEDPusher.h"
|
||||
#include "TasmotaLED.h"
|
||||
|
||||
#if TASMOTALED_HARDWARE_RMT
|
||||
#include <rom/gpio.h>
|
||||
#include <esp_check.h>
|
||||
|
||||
//**************************************************************************************************************
|
||||
// enable AddLog support within a C++ library
|
||||
extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
|
||||
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
|
||||
//**************************************************************************************************************
|
||||
|
||||
/*******************************************************************************************\
|
||||
* Implementation for TasmotaLEDPusherRMT
|
||||
*
|
||||
* Code mostly copied from Tasmota patch to NeoPixelBus applied to support esp-idf 5.x
|
||||
* itself inspired from esp-idf example for RMT encoder from
|
||||
* https://github.com/espressif/esp-idf/tree/v5.3.1/examples/peripherals/rmt/ir_nec_transceiver
|
||||
\*******************************************************************************************/
|
||||
#define RMT_LED_STRIP_RESOLUTION_HZ 40000000 // 40MHz resolution, steps of 25 nanoseconds
|
||||
|
||||
// structure used to pass arguments to `rmt_new_led_strip_encoder`
|
||||
// currently only the encoder resolution in Hz
|
||||
typedef struct {
|
||||
uint32_t resolution; /*!< Encoder resolution, in Hz */
|
||||
} led_strip_encoder_config_t;
|
||||
|
||||
// structure used to store all the necessary information for the RMT encoder
|
||||
typedef struct {
|
||||
rmt_encoder_t base;
|
||||
rmt_encoder_t *bytes_encoder;
|
||||
rmt_encoder_t *copy_encoder;
|
||||
int32_t state;
|
||||
rmt_symbol_word_t reset_code;
|
||||
} rmt_led_strip_encoder_t;
|
||||
|
||||
static IRAM_ATTR size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state)
|
||||
{
|
||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
||||
rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;
|
||||
rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder;
|
||||
rmt_encode_state_t session_state = RMT_ENCODING_RESET;
|
||||
rmt_encode_state_t state = RMT_ENCODING_RESET;
|
||||
size_t encoded_symbols = 0;
|
||||
switch (led_encoder->state) {
|
||||
case 0: // send RGB data
|
||||
encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state);
|
||||
if (session_state & RMT_ENCODING_COMPLETE) {
|
||||
led_encoder->state = 1; // switch to next state when current encoding session finished
|
||||
}
|
||||
if (session_state & RMT_ENCODING_MEM_FULL) {
|
||||
state = static_cast<rmt_encode_state_t>(static_cast<uint8_t>(state) | static_cast<uint8_t>(RMT_ENCODING_MEM_FULL));
|
||||
goto out; // yield if there's no free space for encoding artifacts
|
||||
}
|
||||
// fall-through
|
||||
case 1: // send reset code
|
||||
encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code, sizeof(led_encoder->reset_code), &session_state);
|
||||
if (session_state & RMT_ENCODING_COMPLETE) {
|
||||
led_encoder->state = RMT_ENCODING_RESET; // back to the initial encoding session
|
||||
state = static_cast<rmt_encode_state_t>(static_cast<uint8_t>(state) | static_cast<uint8_t>(RMT_ENCODING_COMPLETE));
|
||||
}
|
||||
if (session_state & RMT_ENCODING_MEM_FULL) {
|
||||
state = static_cast<rmt_encode_state_t>(static_cast<uint8_t>(state) | static_cast<uint8_t>(RMT_ENCODING_MEM_FULL));
|
||||
goto out; // yield if there's no free space for encoding artifacts
|
||||
}
|
||||
}
|
||||
out:
|
||||
*ret_state = state;
|
||||
return encoded_symbols;
|
||||
}
|
||||
|
||||
static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder) {
|
||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
||||
rmt_del_encoder(led_encoder->bytes_encoder);
|
||||
rmt_del_encoder(led_encoder->copy_encoder);
|
||||
delete led_encoder;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder) {
|
||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
||||
rmt_encoder_reset(led_encoder->bytes_encoder);
|
||||
rmt_encoder_reset(led_encoder->copy_encoder);
|
||||
led_encoder->state = RMT_ENCODING_RESET;
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
static esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder, rmt_symbol_word_t bit0, rmt_symbol_word_t bit1, rmt_symbol_word_t reset_code) {
|
||||
static const char* TAG = "TASMOTA_RMT";
|
||||
esp_err_t ret = ESP_OK;
|
||||
rmt_led_strip_encoder_t *led_encoder = NULL;
|
||||
rmt_bytes_encoder_config_t bytes_encoder_config;
|
||||
rmt_copy_encoder_config_t copy_encoder_config = {};
|
||||
|
||||
ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
|
||||
led_encoder = new rmt_led_strip_encoder_t();
|
||||
ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, "no mem for led strip encoder");
|
||||
led_encoder->base.encode = rmt_encode_led_strip;
|
||||
led_encoder->base.del = rmt_del_led_strip_encoder;
|
||||
led_encoder->base.reset = rmt_led_strip_encoder_reset;
|
||||
led_encoder->reset_code = reset_code;
|
||||
|
||||
bytes_encoder_config.bit0 = bit0;
|
||||
bytes_encoder_config.bit1 = bit1;
|
||||
bytes_encoder_config.flags.msb_first = 1; // WS2812 transfer bit order: G7...G0R7...R0B7...B0 - TODO: more checks
|
||||
|
||||
ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed");
|
||||
ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed");
|
||||
|
||||
*ret_encoder = &led_encoder->base;
|
||||
return ret;
|
||||
err:
|
||||
AddLog(LOG_LEVEL_INFO, "RMT: could not init led encoder");
|
||||
if (led_encoder) {
|
||||
if (led_encoder->bytes_encoder) { rmt_del_encoder(led_encoder->bytes_encoder); }
|
||||
if (led_encoder->copy_encoder) { rmt_del_encoder(led_encoder->copy_encoder); }
|
||||
delete led_encoder;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
TasmotaLEDPusherRMT::~TasmotaLEDPusherRMT() {
|
||||
if (_channel) {
|
||||
rmt_tx_wait_all_done(_channel, 10000 / portTICK_PERIOD_MS);
|
||||
rmt_del_channel(_channel);
|
||||
_channel = nullptr;
|
||||
}
|
||||
|
||||
if (_pin >= 0) {
|
||||
gpio_matrix_out(_pin, 0x100, false, false);
|
||||
pinMode(_pin, INPUT);
|
||||
_pin = -1;
|
||||
}
|
||||
}
|
||||
|
||||
TasmotaLEDPusherRMT::TasmotaLEDPusherRMT(int8_t pin) : _pin(pin) {
|
||||
esp_err_t ret = ESP_OK;
|
||||
rmt_tx_channel_config_t config = {};
|
||||
config.clk_src = RMT_CLK_SRC_DEFAULT;
|
||||
config.gpio_num = static_cast<gpio_num_t>(_pin);
|
||||
config.mem_block_symbols = 192; // memory block size, 64 * 4 = 256 Bytes
|
||||
config.resolution_hz = RMT_LED_STRIP_RESOLUTION_HZ; // 40 MHz tick resolution, i.e., 1 tick = 0.025 µs or 25 ns
|
||||
config.trans_queue_depth = 4; // set the number of transactions that can pend in the background
|
||||
config.flags.invert_out = false; // do not invert output signal
|
||||
config.flags.with_dma = false; // do not need DMA backend
|
||||
|
||||
_err = rmt_new_tx_channel(&config, &_channel);
|
||||
if (_err == ESP_OK) {
|
||||
_initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherRMT::Begin(uint16_t pixel_count, uint16_t pixel_size, const TasmotaLED_Timing * led_timing) {
|
||||
if (!_initialized) { return false; }
|
||||
TasmotaLEDPusher::Begin(pixel_count, pixel_size, led_timing);
|
||||
led_strip_encoder_config_t encoder_config = {
|
||||
.resolution = RMT_LED_STRIP_RESOLUTION_HZ,
|
||||
};
|
||||
|
||||
_tx_config.loop_count = 0; // no loop
|
||||
|
||||
rmt_symbol_word_t RmtBit0 = {
|
||||
.duration0 = (uint16_t) (led_timing->T0H * (RMT_LED_STRIP_RESOLUTION_HZ / 1000000) / 1000),
|
||||
.level0 = 1,
|
||||
.duration1 = (uint16_t) (led_timing->T0L * (RMT_LED_STRIP_RESOLUTION_HZ / 1000000) / 1000),
|
||||
.level1 = 0,
|
||||
};
|
||||
rmt_symbol_word_t RmtBit1 = {
|
||||
.duration0 = (uint16_t) (led_timing->T1H * (RMT_LED_STRIP_RESOLUTION_HZ / 1000000) / 1000),
|
||||
.level0 = 1,
|
||||
.duration1 = (uint16_t) (led_timing->T1L * (RMT_LED_STRIP_RESOLUTION_HZ / 1000000) / 1000),
|
||||
.level1 = 0,
|
||||
};
|
||||
rmt_symbol_word_t RmtReset = {
|
||||
.duration0 = (uint16_t) (led_timing->Reset * (RMT_LED_STRIP_RESOLUTION_HZ / 1000000) / 1000),
|
||||
.level0 = 0,
|
||||
.duration1 = 50 * (RMT_LED_STRIP_RESOLUTION_HZ / 1000000) / 1000,
|
||||
.level1 = 1,
|
||||
};
|
||||
// AddLog(LOG_LEVEL_INFO, "RMT: RmtBit0 0x%08X RmtBit1 0x%08X RmtReset 0x%08X", RmtBit0.val, RmtBit1.val, RmtReset.val);
|
||||
_err = rmt_new_led_strip_encoder(&encoder_config, &_led_encoder, RmtBit0, RmtBit1, RmtReset);
|
||||
if (_err != ESP_OK) {
|
||||
// AddLog(LOG_LEVEL_INFO, "RMT: cannot initialize led strip encoder err=%i", ret);
|
||||
return false;
|
||||
}
|
||||
_err = rmt_enable(_channel);
|
||||
if (_err != ESP_OK) {
|
||||
// AddLog(LOG_LEVEL_INFO, "RMT: cannot enable channel err=%i", ret);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherRMT::SetPixelCount(uint16_t pixel_count) {
|
||||
if (!_initialized) { return false; }
|
||||
if (pixel_count > 0 && _pixel_count != pixel_count) {
|
||||
_pixel_count = pixel_count;
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherRMT::CanShow(void) {
|
||||
if (_channel && _initialized) {
|
||||
return (ESP_OK == rmt_tx_wait_all_done(_channel, 0));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherRMT::Push(uint8_t *buf) {
|
||||
if (!_initialized) { return false; }
|
||||
|
||||
// wait for not actively sending data
|
||||
// this will time out at 1 second, an arbitrarily long period of time
|
||||
// and do nothing if this happens
|
||||
esp_err_t ret = rmt_tx_wait_all_done(_channel, 1000 / portTICK_PERIOD_MS);
|
||||
if (ESP_OK == ret) {
|
||||
// now start the RMT transmit with the editing buffer before we swap
|
||||
ret = rmt_transmit(_channel, _led_encoder, buf, _pixel_count * _pixel_size, &_tx_config);
|
||||
if (ESP_OK != ret) {
|
||||
AddLog(LOG_LEVEL_DEBUG, "RMT: cannot transmit err=%i", ret);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // TASMOTALED_HARDWARE_RMT
|
||||
#endif // ESP32
|
225
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherSPI.cpp
Normal file
225
lib/lib_basic/TasmotaLED/src/TasmotaLEDPusherSPI.cpp
Normal file
@ -0,0 +1,225 @@
|
||||
/*
|
||||
TasmotaLEDPusherRMT.cpp - Implementation to push Leds via SPI channel
|
||||
|
||||
Copyright (C) 2024 Stephan Hadinger
|
||||
|
||||
This library is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifdef ESP32
|
||||
|
||||
#include "TasmotaLEDPusher.h"
|
||||
#include "TasmotaLED.h"
|
||||
|
||||
#if TASMOTALED_HARDWARE_SPI
|
||||
#include <rom/gpio.h>
|
||||
|
||||
//**************************************************************************************************************
|
||||
// enable AddLog support within a C++ library
|
||||
extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
|
||||
enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
|
||||
//**************************************************************************************************************
|
||||
|
||||
/*******************************************************************************************\
|
||||
* Implementation for TasmotaLEDPusherSPI
|
||||
*
|
||||
\*******************************************************************************************/
|
||||
|
||||
#define LED_STRIP_SPI_DEFAULT_RESOLUTION (25 * 100 * 1000) // 2.5MHz resolution
|
||||
#define LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE 4
|
||||
|
||||
#define SPI_BYTES_PER_COLOR_BYTE 3
|
||||
#define SPI_BITS_PER_COLOR_BYTE (SPI_BYTES_PER_COLOR_BYTE * 8)
|
||||
|
||||
static void __led_strip_spi_bit(uint8_t data, uint8_t *buf)
|
||||
{
|
||||
// Each color of 1 bit is represented by 3 bits of SPI, low_level:100 ,high_level:110
|
||||
// So a color byte occupies 3 bytes of SPI.
|
||||
buf[0] = (data & BIT(5) ? BIT(1) | BIT(0) : BIT(1)) | (data & BIT(6) ? BIT(4) | BIT(3) : BIT(4)) | (data & BIT(7) ? BIT(7) | BIT(6) : BIT(7));
|
||||
buf[1] = (BIT(0)) | (data & BIT(3) ? BIT(3) | BIT(2) : BIT(3)) | (data & BIT(4) ? BIT(6) | BIT(5) : BIT(6));
|
||||
buf[2] = (data & BIT(0) ? BIT(2) | BIT(1) : BIT(2)) | (data & BIT(1) ? BIT(5) | BIT(4) : BIT(5)) | (data & BIT(2) ? BIT(7) : 0x00);
|
||||
}
|
||||
|
||||
esp_err_t led_strip_spi_refresh(led_strip_spi_obj * spi_strip)
|
||||
{
|
||||
spi_strip->tx_conf.length = spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BITS_PER_COLOR_BYTE;
|
||||
spi_strip->tx_conf.tx_buffer = spi_strip->pixel_buf;
|
||||
spi_strip->tx_conf.rx_buffer = NULL;
|
||||
spi_device_transmit(spi_strip->spi_device, &spi_strip->tx_conf);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
void led_strip_transmit_buffer(led_strip_spi_obj * spi_strip, uint8_t * buffer_rgbw) {
|
||||
// Timing for 512 pixels (extreme test)
|
||||
// Copying to buffer: 418 us
|
||||
// sending pixels: 16.2 ms
|
||||
uint8_t * buf = buffer_rgbw;
|
||||
uint8_t * pix_buf = spi_strip->pixel_buf;
|
||||
for (int i = 0; i < spi_strip->strip_len; i++) {
|
||||
// LED_PIXEL_FORMAT_GRB takes 72bits(9bytes)
|
||||
__led_strip_spi_bit(*buf++, pix_buf); pix_buf += SPI_BYTES_PER_COLOR_BYTE;
|
||||
__led_strip_spi_bit(*buf++, pix_buf); pix_buf += SPI_BYTES_PER_COLOR_BYTE;
|
||||
__led_strip_spi_bit(*buf++, pix_buf); pix_buf += SPI_BYTES_PER_COLOR_BYTE;
|
||||
if (spi_strip->bytes_per_pixel > 3) {
|
||||
__led_strip_spi_bit(*buf++, pix_buf); pix_buf += SPI_BYTES_PER_COLOR_BYTE;
|
||||
}
|
||||
}
|
||||
/* Refresh the strip to send data */
|
||||
led_strip_spi_refresh(spi_strip);
|
||||
}
|
||||
|
||||
|
||||
TasmotaLEDPusherSPI::~TasmotaLEDPusherSPI() {
|
||||
if (_spi_strip.spi_device) {
|
||||
spi_bus_remove_device(_spi_strip.spi_device);
|
||||
}
|
||||
if (_spi_strip.spi_host) {
|
||||
spi_bus_free(_spi_strip.spi_host);
|
||||
}
|
||||
|
||||
if (_pin >= 0) {
|
||||
gpio_matrix_out(_pin, 0x100, false, false);
|
||||
pinMode(_pin, INPUT);
|
||||
_pin = -1;
|
||||
}
|
||||
}
|
||||
|
||||
TasmotaLEDPusherSPI::TasmotaLEDPusherSPI(int8_t pin) : _pin(pin) {
|
||||
spi_host_device_t spi_host = SPI2_HOST;
|
||||
spi_bus_config_t spi_bus_cfg = {
|
||||
.mosi_io_num = _pin,
|
||||
//Only use MOSI to generate the signal, set -1 when other pins are not used.
|
||||
.miso_io_num = -1,
|
||||
.sclk_io_num = -1,
|
||||
.quadwp_io_num = -1,
|
||||
.quadhd_io_num = -1,
|
||||
.max_transfer_sz = 0, // _pixel_count * _pixel_size * SPI_BYTES_PER_COLOR_BYTE,
|
||||
};
|
||||
_err = spi_bus_initialize(spi_host, &spi_bus_cfg, _with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED);
|
||||
if (_err == ESP_OK) {
|
||||
_spi_strip.spi_host = spi_host; // confirmed working, so keep it's value to free it later
|
||||
_initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherSPI::Begin(uint16_t pixel_count, uint16_t pixel_size, const TasmotaLED_Timing * led_timing) {
|
||||
if (!_initialized) {
|
||||
return false;
|
||||
}
|
||||
TasmotaLEDPusher::Begin(pixel_count, pixel_size, led_timing);
|
||||
_spi_strip.bytes_per_pixel = _pixel_size;
|
||||
_spi_strip.strip_len = _pixel_count;
|
||||
|
||||
uint32_t mem_caps = MALLOC_CAP_DEFAULT;
|
||||
// spi_clock_source_t clk_src = SPI_CLK_SRC_DEFAULT;
|
||||
spi_device_interface_config_t spi_dev_cfg;
|
||||
int clock_resolution_khz = 0;
|
||||
|
||||
if (_with_dma) { // TODO
|
||||
// DMA buffer must be placed in internal SRAM
|
||||
mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA;
|
||||
}
|
||||
_spi_strip.pixel_buf = (uint8_t *)heap_caps_calloc(1, _pixel_count * _pixel_size * SPI_BYTES_PER_COLOR_BYTE, mem_caps);
|
||||
if (_spi_strip.pixel_buf == nullptr) {
|
||||
AddLog(LOG_LEVEL_INFO, PSTR("LED: Error no mem for spi strip"));
|
||||
goto err;
|
||||
}
|
||||
|
||||
spi_dev_cfg = {
|
||||
.command_bits = 0,
|
||||
.address_bits = 0,
|
||||
.dummy_bits = 0,
|
||||
.mode = 0,
|
||||
//set -1 when CS is not used
|
||||
.clock_source = SPI_CLK_SRC_DEFAULT, // clk_src,
|
||||
.clock_speed_hz = LED_STRIP_SPI_DEFAULT_RESOLUTION,
|
||||
.spics_io_num = -1,
|
||||
.queue_size = LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE,
|
||||
};
|
||||
_err = spi_bus_add_device(_spi_strip.spi_host, &spi_dev_cfg, &_spi_strip.spi_device);
|
||||
if (_err != ESP_OK) {
|
||||
// AddLog(LOG_LEVEL_INFO, "LED: Error failed to add spi device");
|
||||
goto err;
|
||||
}
|
||||
|
||||
_err = spi_device_get_actual_freq(_spi_strip.spi_device, &clock_resolution_khz);
|
||||
if (_err != ESP_OK) {
|
||||
// AddLog(LOG_LEVEL_INFO, "LED: Error failed to get spi frequency");
|
||||
goto err;
|
||||
}
|
||||
// TODO: ideally we should decide the SPI_BYTES_PER_COLOR_BYTE by the real clock resolution
|
||||
// But now, let's fixed the resolution, the downside is, we don't support a clock source whose frequency is not multiple of LED_STRIP_SPI_DEFAULT_RESOLUTION
|
||||
if (clock_resolution_khz != LED_STRIP_SPI_DEFAULT_RESOLUTION / 1000) {
|
||||
// AddLog(LOG_LEVEL_INFO, "LED: Error unsupported clock resolution: %dKHz", clock_resolution_khz);
|
||||
goto err;
|
||||
}
|
||||
return true;
|
||||
err:
|
||||
if (_spi_strip.spi_device) {
|
||||
spi_bus_remove_device(_spi_strip.spi_device);
|
||||
}
|
||||
if (_spi_strip.spi_host) {
|
||||
spi_bus_free(_spi_strip.spi_host);
|
||||
}
|
||||
_initialized = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherSPI::SetPixelCount(uint16_t pixel_count) {
|
||||
if (!_initialized) { return false; }
|
||||
if (pixel_count > 0 && _pixel_count != pixel_count) {
|
||||
_pixel_count = pixel_count;
|
||||
|
||||
if (_spi_strip.pixel_buf) {
|
||||
heap_caps_free(_spi_strip.pixel_buf);
|
||||
_spi_strip.pixel_buf = nullptr;
|
||||
}
|
||||
|
||||
_spi_strip.strip_len = _pixel_count;
|
||||
uint32_t mem_caps = MALLOC_CAP_DEFAULT;
|
||||
if (_with_dma) { // TODO
|
||||
// DMA buffer must be placed in internal SRAM
|
||||
mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA;
|
||||
}
|
||||
_spi_strip.pixel_buf = (uint8_t *)heap_caps_calloc(1, _pixel_count * _pixel_size * SPI_BYTES_PER_COLOR_BYTE, mem_caps);
|
||||
if (_spi_strip.pixel_buf == nullptr) {
|
||||
AddLog(LOG_LEVEL_INFO, PSTR("LED: Error no mem for spi strip"));
|
||||
if (_spi_strip.spi_device) {
|
||||
spi_bus_remove_device(_spi_strip.spi_device);
|
||||
}
|
||||
if (_spi_strip.spi_host) {
|
||||
spi_bus_free(_spi_strip.spi_host);
|
||||
}
|
||||
_initialized = false;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherSPI::CanShow(void) {
|
||||
return _initialized; // TODO
|
||||
}
|
||||
|
||||
bool TasmotaLEDPusherSPI::Push(uint8_t *buf) {
|
||||
if (!_initialized) { return false; }
|
||||
if (CanShow()) {
|
||||
led_strip_transmit_buffer(&_spi_strip, buf);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // TASMOTALED_HARDWARE_SPI
|
||||
#endif // ESP32
|
@ -36,7 +36,7 @@ typedef struct LVGL_PARAMS {
|
||||
uint8_t swap_color : 1;
|
||||
uint8_t async_dma : 1; // force DMA completion before returning, avoid conflict with other devices on same bus. If set you should make sure the display is the only device on the bus
|
||||
uint8_t busy_invert : 1;
|
||||
uint8_t resvd_2 : 1;
|
||||
uint8_t invert_bw : 1;
|
||||
uint8_t resvd_3 : 1;
|
||||
uint8_t resvd_4 : 1;
|
||||
uint8_t resvd_5 : 1;
|
||||
@ -106,6 +106,7 @@ public:
|
||||
dim_cb dim_cbp = 0;
|
||||
LVGL_PARAMS lvgl_param;
|
||||
int8_t disp_bpp;
|
||||
uint16_t *rgb_fb;
|
||||
private:
|
||||
void DrawCharAt(int16_t x, int16_t y, char ascii_char,int16_t colored);
|
||||
inline void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color) __attribute__((always_inline));
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
#include "tasmota_options.h"
|
||||
|
||||
|
||||
extern int Cache_WriteBack_Addr(uint32_t addr, uint32_t size);
|
||||
|
||||
|
||||
@ -241,7 +242,7 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
||||
if (wire_n == 1) {
|
||||
wire = &Wire;
|
||||
} else {
|
||||
#ifdef ESP32
|
||||
#if SOC_HP_I2C_NUM > 1
|
||||
wire = &Wire1;
|
||||
#else
|
||||
wire = &Wire;
|
||||
@ -290,6 +291,10 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
||||
col_type = uCOLOR_BW;
|
||||
} else {
|
||||
col_type = uCOLOR_COLOR;
|
||||
if (bpp == 16) {
|
||||
fg_col = GetColorFromIndex(fg_col);
|
||||
bg_col = GetColorFromIndex(bg_col);
|
||||
}
|
||||
}
|
||||
str2c(&lp1, ibuff, sizeof(ibuff));
|
||||
if (!strncmp(ibuff, "I2C", 3)) {
|
||||
@ -368,11 +373,9 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
||||
splash_font = next_val(&lp1);
|
||||
splash_size = next_val(&lp1);
|
||||
fg_col = next_val(&lp1);
|
||||
if (bpp == 16) {
|
||||
fg_col = GetColorFromIndex(fg_col);
|
||||
}
|
||||
bg_col = next_val(&lp1);
|
||||
if (bpp == 16) {
|
||||
fg_col = GetColorFromIndex(fg_col);
|
||||
bg_col = GetColorFromIndex(bg_col);
|
||||
}
|
||||
splash_xp = next_val(&lp1);
|
||||
@ -596,6 +599,12 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
||||
case 'B':
|
||||
lvgl_param.flushlines = next_val(&lp1);
|
||||
lvgl_param.data = next_val(&lp1);
|
||||
// temporary fix to disable DMA due to a problem in esp-idf 5.3
|
||||
#ifdef ESP32
|
||||
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
|
||||
lvgl_param.use_dma = false;
|
||||
#endif
|
||||
#endif
|
||||
break;
|
||||
case 'M':
|
||||
rotmap_xmin = next_val(&lp1);
|
||||
@ -627,7 +636,7 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
||||
if (ut_mode == 1) {
|
||||
ut_wire = &Wire;
|
||||
} else {
|
||||
#ifdef ESP32
|
||||
#if SOC_HP_I2C_NUM > 1
|
||||
ut_wire = &Wire1;
|
||||
#else
|
||||
ut_wire = &Wire;
|
||||
@ -671,14 +680,15 @@ uDisplay::uDisplay(char *lp) : Renderer(800, 600) {
|
||||
if (*lp == '\n' || *lp == ' ') { // Add space char
|
||||
lp++;
|
||||
} else {
|
||||
lp = strchr(lp, '\n');
|
||||
if (!lp) {
|
||||
lp = strchr(lp, ' ');
|
||||
if (!lp) {
|
||||
char *lp1;
|
||||
lp1 = strchr(lp, '\n');
|
||||
if (!lp1) {
|
||||
lp1 = strchr(lp, ' ');
|
||||
if (!lp1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
lp++;
|
||||
lp = lp1 + 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -705,6 +715,11 @@ void UfsCheckSDCardInit(void);
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((epcoffs_full || epcoffs_part) && !(lutfsize || lutpsize)) {
|
||||
// no lutfsize or lutpsize, but epcoffs_full or epcoffs_part
|
||||
ep_mode = 3;
|
||||
}
|
||||
|
||||
#ifdef UDSP_DEBUG
|
||||
Serial.printf("Device : %s\n", dname);
|
||||
Serial.printf("xs : %d\n", gxs);
|
||||
@ -905,7 +920,7 @@ uint16_t index = 0;
|
||||
SPI_CS_LOW
|
||||
iob = dsp_cmds[cmd_offset++];
|
||||
index++;
|
||||
if (ep_mode == 1 && iob >= EP_RESET) {
|
||||
if ((ep_mode == 1 || ep_mode == 3) && iob >= EP_RESET) {
|
||||
// epaper pseudo opcodes
|
||||
uint8_t args = dsp_cmds[cmd_offset++];
|
||||
index++;
|
||||
@ -1062,13 +1077,16 @@ Renderer *uDisplay::Init(void) {
|
||||
if (wire_n == 0) {
|
||||
wire = &Wire;
|
||||
}
|
||||
#ifdef ESP32
|
||||
#if SOC_HP_I2C_NUM > 1
|
||||
if (wire_n == 1) {
|
||||
wire = &Wire1;
|
||||
}
|
||||
#endif // ESP32
|
||||
wire->begin(i2c_sda, i2c_scl); // TODO: aren't I2C buses already initialized? Shouldn't this be moved to display driver?
|
||||
|
||||
/*
|
||||
if (i2c_sda != i2c_scl) {
|
||||
wire->begin(i2c_sda, i2c_scl); // TODO: aren't I2C buses already initialized? Shouldn't this be moved to display driver?
|
||||
}
|
||||
*/
|
||||
#ifdef UDSP_DEBUG
|
||||
Serial.printf("I2C cmds: %d\n", dsp_ncmds);
|
||||
#endif
|
||||
@ -1207,12 +1225,19 @@ Renderer *uDisplay::Init(void) {
|
||||
_panel_config->de_gpio_num = de;
|
||||
_panel_config->pclk_gpio_num = pclk;
|
||||
|
||||
// assume that byte swapping of 16-bit color is done only upon request
|
||||
// via display.ini and not by callers of pushColor()
|
||||
// -> swap bytes by swapping GPIO numbers
|
||||
int8_t *par_db8 = lvgl_param.swap_color ? par_dbl : par_dbh;
|
||||
for (uint32_t cnt = 0; cnt < 8; cnt ++) {
|
||||
_panel_config->data_gpio_nums[cnt] = par_dbh[cnt];
|
||||
_panel_config->data_gpio_nums[cnt] = par_db8[cnt];
|
||||
}
|
||||
par_db8 = lvgl_param.swap_color ? par_dbh : par_dbl;
|
||||
for (uint32_t cnt = 0; cnt < 8; cnt ++) {
|
||||
_panel_config->data_gpio_nums[cnt + 8] = par_dbl[cnt];
|
||||
_panel_config->data_gpio_nums[cnt + 8] = par_db8[cnt];
|
||||
}
|
||||
lvgl_param.swap_color = 0;
|
||||
|
||||
_panel_config->disp_gpio_num = GPIO_NUM_NC;
|
||||
|
||||
_panel_config->flags.disp_active_low = 0;
|
||||
@ -1289,6 +1314,7 @@ Renderer *uDisplay::Init(void) {
|
||||
esp_lcd_i80_bus_config_t bus_config = {
|
||||
.dc_gpio_num = par_rs,
|
||||
.wr_gpio_num = par_wr,
|
||||
.clk_src = LCD_CLK_SRC_DEFAULT,
|
||||
.bus_width = bus_width,
|
||||
.max_transfer_bytes = 32768
|
||||
};
|
||||
@ -1762,9 +1788,6 @@ void uDisplay::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) {
|
||||
|
||||
if (interface == _UDSP_RGB) {
|
||||
#ifdef USE_ESP32_S3
|
||||
if (lvgl_param.swap_color) {
|
||||
color = color << 8 | color >> 8;
|
||||
}
|
||||
if (cur_rot > 0) {
|
||||
while (h--) {
|
||||
drawPixel_RGB(x , y , color);
|
||||
@ -1835,9 +1858,6 @@ void uDisplay::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) {
|
||||
|
||||
if (interface == _UDSP_RGB) {
|
||||
#ifdef USE_ESP32_S3
|
||||
if (lvgl_param.swap_color) {
|
||||
color = color << 8 | color >> 8;
|
||||
}
|
||||
if (cur_rot > 0) {
|
||||
while (w--) {
|
||||
drawPixel_RGB(x , y , color);
|
||||
@ -2009,11 +2029,15 @@ bool uDisplay::utouch_Init(char **name) {
|
||||
attachInterrupt(ut_irq, ut_touch_irq, FALLING);
|
||||
}
|
||||
|
||||
extern SPIClass *SpiBegin(uint32 bus);
|
||||
|
||||
if (ut_spi_nr == spi_nr) {
|
||||
// same as display
|
||||
ut_spi = uspi;
|
||||
} else {
|
||||
// not yet
|
||||
ut_spi = nullptr;
|
||||
#ifdef ESP32
|
||||
ut_spi = SpiBegin(ut_spi_nr);
|
||||
#endif
|
||||
}
|
||||
return ut_execute(ut_init_code);
|
||||
}
|
||||
@ -2180,12 +2204,23 @@ void uDisplay::pushColorsMono(uint16_t *data, uint16_t len, bool rgb16_swap) {
|
||||
uint16_t rgb16_to_mono_mask = rgb16_swap ? RGB16_SWAP_TO_MONO : RGB16_TO_MONO;
|
||||
|
||||
for (uint32_t y = seta_yp1; y < seta_yp2; y++) {
|
||||
for (uint32_t x = seta_xp1; x < seta_xp2; x++) {
|
||||
uint16_t color = *data++;
|
||||
if (bpp == 1) color = (color & rgb16_to_mono_mask) ? 1 : 0;
|
||||
drawPixel(x, y, color); // todo - inline the method to save speed
|
||||
len--;
|
||||
if (!len) return; // failsafe - exist if len (pixel number) is exhausted
|
||||
seta_yp1++;
|
||||
if (lvgl_param.invert_bw) {
|
||||
for (uint32_t x = seta_xp1; x < seta_xp2; x++) {
|
||||
uint16_t color = *data++;
|
||||
if (bpp == 1) color = (color & rgb16_to_mono_mask) ? 0 : 1;
|
||||
drawPixel(x, y, color); // todo - inline the method to save speed
|
||||
len--;
|
||||
if (!len) return; // failsafe - exist if len (pixel number) is exhausted
|
||||
}
|
||||
} else {
|
||||
for (uint32_t x = seta_xp1; x < seta_xp2; x++) {
|
||||
uint16_t color = *data++;
|
||||
if (bpp == 1) color = (color & rgb16_to_mono_mask) ? 1 : 0;
|
||||
drawPixel(x, y, color); // todo - inline the method to save speed
|
||||
len--;
|
||||
if (!len) return; // failsafe - exist if len (pixel number) is exhausted
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2194,7 +2229,6 @@ void uDisplay::pushColorsMono(uint16_t *data, uint16_t len, bool rgb16_swap) {
|
||||
static inline void lvgl_color_swap(uint16_t *data, uint16_t len) { for (uint32_t i = 0; i < len; i++) (data[i] = data[i] << 8 | data[i] >> 8); }
|
||||
|
||||
void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean not_swapped) {
|
||||
uint16_t color;
|
||||
|
||||
if (lvgl_param.swap_color) {
|
||||
not_swapped = !not_swapped;
|
||||
@ -2202,59 +2236,23 @@ void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean not_swapped) {
|
||||
|
||||
//Serial.printf("push %x - %d - %d - %d\n", (uint32_t)data, len, not_swapped, lvgl_param.data);
|
||||
|
||||
// Isolating _UDPS_RGB to increase code sharing
|
||||
// Isolating _UDSP_RGB to increase code sharing
|
||||
//
|
||||
// LVGL documentation suggest to call the following:
|
||||
// lv_draw_sw_rgb565_swap() to invert bytes
|
||||
// esp_lcd_panel_draw_bitmap() to paste bytes
|
||||
// but it appears to be faster to include the color swap in the copy loop
|
||||
// because the CPU is much faster than PSRAM (SPI bus), therefore
|
||||
// swapping bytes on the fly costs zero performance
|
||||
//
|
||||
// not_swapped == false : called from LVGL bytes are swapped
|
||||
// not_swapped == true : called from displaytext, no byte swap, currently no dma here
|
||||
// Use ESP-IDF LCD driver to push colors and rely on the following assumptions:
|
||||
// * bytes swapping is already handled in the driver configuration (see uDisplay::Init()),
|
||||
// * pushColors() is only called with not_swapped equals true,
|
||||
// * cache flushing is done by the LCD driver.
|
||||
if (interface == _UDSP_RGB) {
|
||||
#ifdef USE_ESP32_S3
|
||||
if (!not_swapped) {
|
||||
// internal error -> write error message but continue (with possibly wrong colors)
|
||||
AddLog(LOG_LEVEL_ERROR, PSTR("DSP: Unexpected byte-swapping requested in pushColors()"));
|
||||
}
|
||||
|
||||
// check that bytes count matches the size of area, and remove from inner loop
|
||||
if ((seta_yp2 - seta_yp1) * (seta_xp2 - seta_xp2) > len) { return; }
|
||||
|
||||
if (cur_rot > 0) {
|
||||
for (uint32_t y = seta_yp1; y < seta_yp2; y++) {
|
||||
seta_yp1++;
|
||||
for (uint32_t x = seta_xp1; x < seta_xp2; x++) {
|
||||
uint16_t color = *data++;
|
||||
if (!not_swapped) { color = color << 8 | color >> 8; }
|
||||
drawPixel_RGB(x, y, color);
|
||||
len--;
|
||||
if (!len) return; // failsafe - exist if len (pixel number) is exhausted
|
||||
}
|
||||
}
|
||||
} else {
|
||||
uint16_t *fb_y = rgb_fb + (int32_t)seta_yp1 * _width;
|
||||
for (uint32_t y = seta_yp1; y < seta_yp2; y++) {
|
||||
uint16_t * fb_xy = fb_y + seta_xp1;
|
||||
// we get the 'not_swapped' test outside of the inner loop
|
||||
if (not_swapped) {
|
||||
for (uint32_t x = seta_xp1; x < seta_xp2; x++) {
|
||||
uint16_t color = *data++;
|
||||
*fb_xy = color;
|
||||
fb_xy++;
|
||||
}
|
||||
} else {
|
||||
for (uint32_t x = seta_xp1; x < seta_xp2; x++) {
|
||||
uint16_t color = *data++;
|
||||
color = color << 8 | color >> 8;
|
||||
*fb_xy = color;
|
||||
fb_xy++;
|
||||
}
|
||||
}
|
||||
fb_y += _width;
|
||||
}
|
||||
// using esp_cache_msync() to flush the PSRAM cache and ensure that all data is actually written to PSRAM
|
||||
// from https://github.com/espressif/esp-idf/blob/636ff35b52f10e1a804a3760a5bd94e68f4b1b71/components/esp_lcd/rgb/esp_lcd_panel_rgb.c#L159
|
||||
uint16_t * flush_ptr = rgb_fb + (int32_t)seta_yp1 * _width;
|
||||
esp_cache_msync(flush_ptr, (seta_yp2 - seta_yp1) * _width * 2, 0);
|
||||
}
|
||||
esp_lcd_panel_draw_bitmap(_panel_handle, seta_xp1, seta_yp1, seta_xp2, seta_yp2, (void *)data);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
@ -2289,6 +2287,7 @@ void uDisplay::pushColors(uint16_t *data, uint16_t len, boolean not_swapped) {
|
||||
uint8_t *line = (uint8_t*)malloc(len * 3);
|
||||
uint8_t *lp = line;
|
||||
if (line) {
|
||||
uint16_t color;
|
||||
for (uint32_t cnt = 0; cnt < len; cnt++) {
|
||||
color = *data++;
|
||||
color = (color << 8) | (color >> 8);
|
||||
@ -2423,9 +2422,6 @@ void uDisplay::drawPixel(int16_t x, int16_t y, uint16_t color) {
|
||||
|
||||
#ifdef USE_ESP32_S3
|
||||
if (interface == _UDSP_RGB) {
|
||||
if (lvgl_param.swap_color) {
|
||||
color = color << 8 | color >> 8;
|
||||
}
|
||||
drawPixel_RGB(x, y, color);
|
||||
return;
|
||||
}
|
||||
@ -2508,6 +2504,15 @@ void uDisplay::setRotation(uint8_t rotation) {
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef USE_ESP32_S3
|
||||
if (interface == _UDSP_RGB) {
|
||||
// utilize the ESP-IDF LCD driver's support for display rotation:
|
||||
// mirror x axis for rotation 1 and 2, mirror y axis for rotation 2 and 3
|
||||
esp_lcd_panel_mirror(_panel_handle, rotation == 1 || rotation == 2, rotation & 2);
|
||||
// swap x/y for rotation 1 and 3
|
||||
esp_lcd_panel_swap_xy(_panel_handle, rotation & 1);
|
||||
}
|
||||
#endif // USE_ESP32_S3
|
||||
}
|
||||
|
||||
void udisp_bpwr(uint8_t on);
|
||||
@ -3426,6 +3431,9 @@ void uDisplay::Init_EPD(int8_t p) {
|
||||
if (ep_mode == 1) {
|
||||
ClearFrameMemory(0xFF);
|
||||
Updateframe_EPD();
|
||||
} else if (ep_mode == 3) {
|
||||
ClearFrameMemory(0xFF);
|
||||
Updateframe_EPD();
|
||||
} else {
|
||||
ClearFrame_42();
|
||||
}
|
||||
@ -3515,7 +3523,7 @@ void uDisplay::SetLut(const unsigned char* lut) {
|
||||
}
|
||||
|
||||
void uDisplay::Updateframe_EPD(void) {
|
||||
if (ep_mode == 1) {
|
||||
if (ep_mode == 1 || ep_mode == 3) {
|
||||
switch (ep_update_mode) {
|
||||
case DISPLAY_INIT_PARTIAL:
|
||||
if (epc_part_cnt) {
|
||||
@ -3544,15 +3552,33 @@ void uDisplay::DisplayFrame_29(void) {
|
||||
}
|
||||
|
||||
void uDisplay::SetMemoryArea(int x_start, int y_start, int x_end, int y_end) {
|
||||
spi_command_EPD(SET_RAM_X_ADDRESS_START_END_POSITION);
|
||||
int x_start1 = (x_start >> 3) & 0xFF;
|
||||
int x_end1 = (x_end >> 3) & 0xFF;
|
||||
int y_start1 = y_start & 0xFF;
|
||||
int y_start2 = (y_start >> 8) & 0xFF;
|
||||
int y_end1 = y_end & 0xFF;
|
||||
int y_end2 = (y_end >> 8) & 0xFF;
|
||||
/* x point must be the multiple of 8 or the last 3 bits will be ignored */
|
||||
spi_data8_EPD((x_start >> 3) & 0xFF);
|
||||
spi_data8_EPD((x_end >> 3) & 0xFF);
|
||||
spi_command_EPD(SET_RAM_Y_ADDRESS_START_END_POSITION);
|
||||
spi_data8_EPD(y_start & 0xFF);
|
||||
spi_data8_EPD((y_start >> 8) & 0xFF);
|
||||
spi_data8_EPD(y_end & 0xFF);
|
||||
spi_data8_EPD((y_end >> 8) & 0xFF);
|
||||
|
||||
if (ep_mode == 3) {
|
||||
spi_command_EPD(SET_RAM_X_ADDRESS_START_END_POSITION);
|
||||
spi_data8_EPD(x_start1);
|
||||
spi_data8_EPD(x_end1);
|
||||
spi_command_EPD(SET_RAM_Y_ADDRESS_START_END_POSITION);
|
||||
spi_data8_EPD(y_end1);
|
||||
spi_data8_EPD(y_end2);
|
||||
spi_data8_EPD(y_start1);
|
||||
spi_data8_EPD(y_start2);
|
||||
} else {
|
||||
spi_command_EPD(SET_RAM_X_ADDRESS_START_END_POSITION);
|
||||
spi_data8_EPD(x_start1);
|
||||
spi_data8_EPD(x_end1);
|
||||
spi_command_EPD(SET_RAM_Y_ADDRESS_START_END_POSITION);
|
||||
spi_data8_EPD(y_start1);
|
||||
spi_data8_EPD(y_start2);
|
||||
spi_data8_EPD(y_end1);
|
||||
spi_data8_EPD(y_end2);
|
||||
}
|
||||
}
|
||||
|
||||
void uDisplay::SetFrameMemory(const unsigned char* image_buffer) {
|
||||
@ -3566,12 +3592,27 @@ void uDisplay::SetFrameMemory(const unsigned char* image_buffer) {
|
||||
}
|
||||
|
||||
void uDisplay::SetMemoryPointer(int x, int y) {
|
||||
int x1;
|
||||
int y1;
|
||||
int y2;
|
||||
|
||||
if (ep_mode == 3) {
|
||||
x1 = (x >> 3) & 0xFF;
|
||||
y--;
|
||||
y1 = y & 0xFF;
|
||||
y2 = (y >> 8) & 0xFF;
|
||||
} else {
|
||||
x1 = (x >> 3) & 0xFF;
|
||||
y1 = y & 0xFF;
|
||||
y2 = (y >> 8) & 0xFF;
|
||||
}
|
||||
|
||||
spi_command_EPD(SET_RAM_X_ADDRESS_COUNTER);
|
||||
/* x point must be the multiple of 8 or the last 3 bits will be ignored */
|
||||
spi_data8_EPD((x >> 3) & 0xFF);
|
||||
spi_data8_EPD(x1);
|
||||
spi_command_EPD(SET_RAM_Y_ADDRESS_COUNTER);
|
||||
spi_data8_EPD(y & 0xFF);
|
||||
spi_data8_EPD((y >> 8) & 0xFF);
|
||||
spi_data8_EPD(y1);
|
||||
spi_data8_EPD(y2);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user