Fixes and improvements (#132)

- Fix glitch when turning on WiFi: It would temporarily show "No networks found" right before starting the first scan.
- Fix spinner to use Assets.h
- Replace statusbar battery icons 
- Better statusbar icon for when WiFi is on but not connected
- Replace statusbar WiFi icons and Wifi Manage RSSI/lock icons
- Fix for crash when timer is null in I2cScanner
- Deprecate Spacer
- Fixes for toolbar layout (simplified)
- Improved ImageViewer app: center image and add filename text on the bottom
- Add LV debug params to sdkconfig.developer
- Disabled LV spinner, msgbox and window widgets. These have equivalents in Tactility.
This commit is contained in:
Ken Van Hoeylandt 2024-12-17 23:32:43 +01:00 committed by GitHub
parent b4592dd7d1
commit f34440eb6f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
101 changed files with 639 additions and 142 deletions

View File

@ -26,7 +26,7 @@ bool SimulatorPower::getMetric(Power::MetricType type, Power::MetricData& data)
data.valueAsUint32 = 4032;
return true;
case CHARGE_LEVEL:
data.valueAsUint8 = 80;
data.valueAsUint8 = 100;
return true;
}

BIN
Data/assets/power_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

BIN
Data/assets/power_10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 149 B

BIN
Data/assets/power_20.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

BIN
Data/assets/power_30.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

BIN
Data/assets/power_40.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

BIN
Data/assets/power_50.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

BIN
Data/assets/power_60.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

BIN
Data/assets/power_70.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

BIN
Data/assets/power_80.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

BIN
Data/assets/power_90.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q98-94 221.5-143T480-816q135 0 258.5 49T960-624l-97 97q-24-24-54-36.5T744-576q-70 0-119 49t-49 119q0 35 12.5 65t36.5 54L480-144Zm264 0q-17 0-28.5-11.5T704-184q0-17 11.5-28.5T744-224q17 0 28.5 11.5T784-184q0 17-11.5 28.5T744-144Zm-28-122q0-42 7.5-59t38.5-46q13-12 24-24t11-31q0-21-14.5-34T745-473q-20 0-35 12.5T687-426l-52-22q12-37 41.5-58.5T744-528q49 0 79.5 28t30.5 73q0 23-11 41.5T805-341q-21 20-26 32.5t-5 42.5h-58Z"/></svg>

Before

Width:  |  Height:  |  Size: 538 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q97-94 221-143t259-49q135 0 259 49t221 143l-51 52q-86-85-197-128.5T480-744q-102 0-197.5 32T106-619l427 422-53 53Zm381-48L745-308q-17 10-35 15t-38 5q-60 0-102-42t-42-102q0-60 42-102t102-42q60 0 102 42t42 102q0 20-4.5 38.5T796-359l116 116-51 51ZM672-360q30 0 51-21t21-51q0-30-21-51t-51-21q-30 0-51 21t-21 51q0 30 21 51t51 21ZM480-196Z"/></svg>

Before

Width:  |  Height:  |  Size: 452 B

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_lock_black.svg"
inkscape:export-filename="wifi_lock_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="12.054545"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M240-80q-33 0-56.5-23.5T160-160v-400q0-33 23.5-56.5T240-640h40v-80q0-83 58.5-141.5T480-920q83 0 141.5 58.5T680-720v80h40q33 0 56.5 23.5T800-560v400q0 33-23.5 56.5T720-80H240Zm0-80h480v-400H240v400Zm240-120q33 0 56.5-23.5T560-360q0-33-23.5-56.5T480-440q-33 0-56.5 23.5T400-360q0 33 23.5 56.5T480-280ZM360-640h240v-80q0-50-35-85t-85-35q-50 0-85 35t-35 85v80ZM240-160v-400 400Z"
id="path1"
style="fill:#000000" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="m699-363-51-51 206-205q-81-61-176-93t-198-32q-36.667 0-73.333 4.5Q370-735 335-727l-59-59q48-15 99.241-22.5T480-816q140 0 263 51t217 141L699-363ZM480-246l66-66-359-359q-21 11-41 24.5T106-619l374 373ZM813-45 597-261 480-144 0-624q30-29 63.533-54.224Q97.065-703.447 134-724l-89-89 51-51L864-96l-51 51ZM492-571Zm-125 79Z"/></svg>

Before

Width:  |  Height:  |  Size: 422 B

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="20"
viewBox="0 -960 960 960"
width="20"
version="1.1"
id="svg1"
sodipodi:docname="wifi_off_white.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
inkscape:export-filename="../assets/wifi_off_white.png"
inkscape:export-xdpi="76.800003"
inkscape:export-ydpi="76.800003"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="33"
inkscape:cx="10.045455"
inkscape:cy="10"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m699-363-51-51 206-205q-81-61-176-93t-198-32q-36.667 0-73.333 4.5Q370-735 335-727l-59-59q48-15 99.241-22.5T480-816q140 0 263 51t217 141L699-363ZM480-246l66-66-359-359q-21 11-41 24.5T106-619l374 373ZM813-45 597-261 480-144 0-624q30-29 63.533-54.224Q97.065-703.447 134-724l-89-89 51-51L864-96l-51 51ZM492-571Zm-125 79Z"
id="path1"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L480-144Zm0-102 374-373q-81-61-176-93t-198-32q-103 0-198 32t-176 93l374 373Zm-36-138h72v-168h-72v168Zm35.789-216Q495-600 505.5-610.289q10.5-10.29 10.5-25.5Q516-651 505.711-661.5q-10.29-10.5-25.5-10.5Q465-672 454.5-661.711q-10.5 10.29-10.5 25.5Q444-621 454.289-610.5q10.29 10.5 25.5 10.5ZM480-246Z"/></svg>

Before

Width:  |  Height:  |  Size: 458 B

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="20"
viewBox="0 -960 960 960"
width="20"
version="1.1"
id="svg1"
sodipodi:docname="wifi_scan_white.svg"
inkscape:export-filename="../assets/wifi_scan_white.png"
inkscape:export-xdpi="76.800003"
inkscape:export-ydpi="76.800003"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="33"
inkscape:cx="10.015152"
inkscape:cy="10"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M480-144 0-624q97-94 221-143t259-49q135 0 259 49t221 143l-51 52q-86-85-197-128.5T480-744q-102 0-197.5 32T106-619l427 422-53 53Zm381-48L745-308q-17 10-35 15t-38 5q-60 0-102-42t-42-102q0-60 42-102t102-42q60 0 102 42t42 102q0 20-4.5 38.5T796-359l116 116-51 51ZM672-360q30 0 51-21t21-51q0-30-21-51t-51-21q-30 0-51 21t-21 51q0 30 21 51t51 21ZM480-196Z"
id="path1"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L480-144Zm0-102 374-373q-81-61-176-93t-198-32q-103 0-198 32t-176 93l374 373Z"/></svg>

Before

Width:  |  Height:  |  Size: 238 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M648-144q-10.2 0-17.1-6.9-6.9-6.9-6.9-17.1v-144q0-10.2 6.9-17.1 6.9-6.9 17.1-6.9h24v-48q0-29.7 21.212-50.85 21.213-21.15 51-21.15Q774-456 795-434.85q21 21.15 21 50.85v48h24q10.2 0 17.1 6.9 6.9 6.9 6.9 17.1v144q0 10.2-6.9 17.1-6.9 6.9-17.1 6.9H648Zm60-192h72v-48q0-15.3-10.289-25.65-10.29-10.35-25.5-10.35Q729-420 718.5-409.65 708-399.3 708-384v48ZM480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L814-477q-13-13-25.5-25T763-527l91-92q-81-61-176-93t-198-32q-103 0-198 32t-176 93l374 373 48-48 25.5 25.5L579-243l-99 99Zm0-351Z"/></svg>

Before

Width:  |  Height:  |  Size: 637 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L480-144ZM357-369q28-20 59.5-29t63.5-9q32 0 64 9t59 29l251-250q-81-61-176-93t-198-32q-103 0-198 32t-176 93l251 250Z"/></svg>

Before

Width:  |  Height:  |  Size: 277 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L850-514q-20-7-40-10.5t-42-3.5h-5l91-91q-81-61-176-93t-198-32q-103 0-198 32t-176 93l251 250q28-20 59.5-29t63.5-9q18 0 36.5 3t35.5 9q-12 24-18.5 50t-6.5 55q0 22 4 42.5t12 40.5l-63 63Zm192 0q-10 0-17-7t-7-17v-144q0-10 7-17t17-7h24v-48q0-30 21-51t51-21q30 0 51 21t21 51v48h24q10 0 17 7t7 17v144q0 10-7 17t-17 7H672Zm60-192h72v-48q0-15-10.5-25.5T768-420q-15 0-25.5 10.5T732-384v48Z"/></svg>

Before

Width:  |  Height:  |  Size: 539 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L480-144ZM305-420q38-29 82.5-44.5T480-480q48 0 92.5 15.5T655-420l199-199q-81-61-176-93t-198-32q-103 0-198 32t-176 93l199 199Z"/></svg>

Before

Width:  |  Height:  |  Size: 287 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q97-93 220.853-142.5Q344.706-816 480-816q135 0 259 49.5T960-624L850-514q-20-7-40.5-10.5T768-528h-5l91-91q-81.087-61.475-176.543-93.238Q582-744 480.164-744q-101.836 0-197.5 32T106-619l199 199q38-29 82.5-44.5T480-480q29.652 0 58.826 6T595-456q-31.901 32.539-49.951 75.77Q527-337 527-290q0 21 3.81 42.097Q534.619-226.806 543-207l-63 63Zm192 0q-10.2 0-17.1-6.9-6.9-6.9-6.9-17.1v-144q0-10.2 6.9-17.1 6.9-6.9 17.1-6.9h24v-48q0-29.7 21.212-50.85 21.213-21.15 51-21.15Q798-456 819-434.85q21 21.15 21 50.85v48h24q10.2 0 17.1 6.9 6.9 6.9 6.9 17.1v144q0 10.2-6.9 17.1-6.9 6.9-17.1 6.9H672Zm60-192h72v-48q0-15.3-10.289-25.65-10.29-10.35-25.5-10.35Q753-420 742.5-409.65 732-399.3 732-384v48Z"/></svg>

Before

Width:  |  Height:  |  Size: 798 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L480-144ZM254-471q49-40 106-60.5T480-552q63 0 120 20.5T706-471l148-148q-81-61-176-93t-198-32q-103 0-198 32t-176 93l148 148Z"/></svg>

Before

Width:  |  Height:  |  Size: 285 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L850-514q-20-7-40-10.5t-42-3.5h-5l91-91q-81-61-175.764-93Q583.472-744 480-744t-198.236 32Q187-680 106-619l148 148q49-40 106.185-60.5Q417.369-552 480-552q48.3 0 93.15 12.5Q618-527 660-503q-60 29-96.5 86T527-290.355q0 22.355 4 42.855 4 20.5 12 40.5l-63 63Zm192 0q-10.2 0-17.1-6.9-6.9-6.9-6.9-17.1v-144q0-10.2 6.9-17.1 6.9-6.9 17.1-6.9h24v-48q0-29.7 21.212-50.85 21.213-21.15 51-21.15Q798-456 819-434.85q21 21.15 21 50.85v48h24q10.2 0 17.1 6.9 6.9 6.9 6.9 17.1v144q0 10.2-6.9 17.1-6.9 6.9-17.1 6.9H672Zm60-192h72v-48q0-15.3-10.289-25.65-10.29-10.35-25.5-10.35Q753-420 742.5-409.65 732-399.3 732-384v48Z"/></svg>

Before

Width:  |  Height:  |  Size: 761 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q97-93 221-142.5T480-816q135 0 259 49.5T960-624L480-144ZM165-561q66-56 147-83.5T480-672q87 0 168 27.5T795-561l59-58q-81-61-176.5-93T480-744q-102 0-197.5 32T106-619l59 58Z"/></svg>

Before

Width:  |  Height:  |  Size: 290 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M732-336h72v-48q0-15.3-10.289-25.65-10.29-10.35-25.5-10.35Q753-420 742.5-409.65 732-399.3 732-384v48ZM480-144 0-624q97-93 220.783-142.5 123.783-49.5 259-49.5Q615-816 739-766.5 863-717 960-624L849-513q-20-8-40.066-11.5Q788.868-528 768-528q-95 0-161.5 66.5T540-300q0 20.868 3.5 40.934T555-219l-75 75Zm192 0q-10.2 0-17.1-6.9-6.9-6.9-6.9-17.1v-144q0-10.2 6.9-17.1 6.9-6.9 17.1-6.9h24v-48q0-29.7 21.212-50.85 21.213-21.15 51-21.15Q798-456 819-434.85q21 21.15 21 50.85v48h24q10.2 0 17.1 6.9 6.9 6.9 6.9 17.1v144q0 10.2-6.9 17.1-6.9 6.9-17.1 6.9H672ZM165-561q66-56 147-83.5T480-672q87 0 168 27.5T795-561l59-58q-81.087-61.475-176.543-93.238Q582-744 480.164-744q-101.836 0-197.5 32T106-619l59 58Z"/></svg>

Before

Width:  |  Height:  |  Size: 793 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" width="20"><path d="M480-144 0-624q94-90 217-141t263-51q140 0 263 51t217 141L480-144Z"/></svg>

Before

Width:  |  Height:  |  Size: 171 B

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_medium_black.svg"
inkscape:export-filename="../assets/wifi_signal_medium_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1"
style="fill:#000000" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#000000" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#b3b3b3" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_medium_white.svg"
inkscape:export-filename="../assets/wifi_signal_medium_white.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#666666" />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_strong_black.svg"
inkscape:export-filename="wifi_signal_full_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1"
style="fill:#000000" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#000000" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#000000" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_strong_white.svg"
inkscape:export-filename="../assets/wifi_signal_strong_white.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.036364"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3" />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_weak_black.svg"
inkscape:export-filename="../assets/wifi_signal_weak_black.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1"
style="fill:#000000" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#b3b3b3" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#b3b3b3" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="#e8eaed"
version="1.1"
id="svg1"
sodipodi:docname="wifi_signal_weak_white.svg"
inkscape:export-filename="../assets/wifi_signal_weak_white.png"
inkscape:export-xdpi="64"
inkscape:export-ydpi="64"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="27.5"
inkscape:cx="10.563636"
inkscape:cy="12.072727"
inkscape:window-width="1503"
inkscape:window-height="930"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="m 480,-120 c -28,0 -51.66667,-9.66667 -71,-29 -19.33333,-19.33333 -29,-43 -29,-71 0,-28 9.66667,-51.66667 29,-71 19.33333,-19.33333 43,-29 71,-29 28,0 51.66667,9.66667 71,29 19.33333,19.33333 29,43 29,71 0,28 -9.66667,51.66667 -29,71 -19.33333,19.33333 -43,29 -71,29 z"
id="path1" />
<path
d="m 254,-346 -84,-86 c 39.33333,-39.33333 85.5,-70.5 138.5,-93.5 53,-23 110.16667,-34.5 171.5,-34.5 61.33333,0 118.5,11.66667 171.5,35 53,23.33333 99.16667,55 138.5,95 l -84,84 c -29.33333,-29.33333 -63.33333,-52.33333 -102,-69 -38.66667,-16.66667 -80,-25 -124,-25 -44,0 -85.33333,8.33333 -124,25 -38.66667,16.66667 -72.66667,39.66667 -102,69 z"
id="path2"
style="fill:#666666" />
<path
d="M 84,-516 0,-600 c 61.333333,-62.66667 133,-111.66667 215,-147 82,-35.33333 170.33333,-53 265,-53 94.66667,0 183,17.66667 265,53 82,35.33333 153.66667,84.33333 215,147 l -84,84 C 824.66667,-567.33333 765.16667,-607.5 697.5,-636.5 629.83333,-665.5 557.33333,-680 480,-680 c -77.33333,0 -149.83333,14.5 -217.5,43.5 -67.66667,29 -127.16667,69.16667 -178.5,120.5 z"
id="path3"
style="fill:#666666" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -7,8 +7,9 @@
- ESP32 (CYD) runs out of memory when:
- loading splash (even in Files app)
- WiFi is on and navigating back to Desktop
Suggested mitigation: When no PSRAM is availabl, use simplified desktop buttons
Suggested mitigation: When no PSRAM is available, use simplified desktop buttons
- WiFi fails quietly when there isn't enough memory. Add statusbar icon for memory pressure. Show error in WiFi screen (e.g. AlertDialog when SPI is not enabled and available memory is below a certain amount)
- WiFi details "forget" button should be hidden when WiFi credentials are not stores yet.
# TODOs
- When WiFi is on, but there is no connection, it sort of seems like WiFi is off. Find better icon? Gnome uses a grayed-out 100% connectivity one.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -219,7 +219,7 @@ static void onShow(AppContext& app, lv_obj_t* parent) {
lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN);
lv_obj_t* toolbar = lvgl::toolbar_create(parent, "Files");
lvgl::toolbar_add_action(toolbar, LV_SYMBOL_UP, &onNavigateUpPressed, nullptr);
lvgl::toolbar_add_button_action(toolbar, LV_SYMBOL_UP, &onNavigateUpPressed, nullptr);
data->list = lv_list_create(parent);
lv_obj_set_width(data->list, LV_PCT(100));

View File

@ -162,7 +162,10 @@ static void onHide(AppContext& app) {
bool isRunning = false;
if (data->mutex.acquire(250 / portTICK_PERIOD_MS) == TtStatusOk) {
isRunning = data->scanTimer->isRunning();
auto* timer = data->scanTimer.get();
if (timer != nullptr) {
isRunning = timer->isRunning();
}
data->mutex.release();
} else {
return;

View File

@ -3,25 +3,39 @@
#include "lvgl.h"
#include "lvgl/Style.h"
#include "lvgl/Toolbar.h"
#include "StringUtils.h"
namespace tt::app::imageviewer {
extern const AppManifest manifest;
#define TAG "image_viewer"
static void onShow(AppContext& app, lv_obj_t* parent) {
lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_COLUMN);
lvgl::toolbar_create(parent, app);
lv_obj_t* wrapper = lv_obj_create(parent);
lv_obj_set_width(wrapper, LV_PCT(100));
lv_obj_set_flex_grow(wrapper, 1);
lv_obj_set_flex_flow(wrapper, LV_FLEX_FLOW_COLUMN);
auto wrapper = lv_obj_create(parent);
lv_obj_set_size(wrapper, LV_PCT(100), LV_PCT(100));
lv_obj_set_style_border_width(wrapper, 0, 0);
lvgl::obj_set_style_no_padding(wrapper);
lvgl::obj_set_style_bg_invisible(wrapper);
lv_obj_t* image = lv_img_create(wrapper);
auto toolbar = lvgl::toolbar_create(wrapper, app);
lv_obj_align(toolbar, LV_ALIGN_TOP_MID, 0, 0);
auto* image_wrapper = lv_obj_create(wrapper);
lv_obj_align_to(image_wrapper, toolbar, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
lv_obj_set_width(image_wrapper, LV_PCT(100));
auto parent_height = lv_obj_get_height(wrapper);
lv_obj_set_height(image_wrapper, parent_height - TOOLBAR_HEIGHT);
lv_obj_set_flex_flow(image_wrapper, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_align(image_wrapper, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
lvgl::obj_set_style_no_padding(image_wrapper);
lvgl::obj_set_style_bg_invisible(image_wrapper);
auto* image = lv_image_create(image_wrapper);
lv_obj_align(image, LV_ALIGN_CENTER, 0, 0);
auto* file_label = lv_label_create(wrapper);
lv_obj_align_to(file_label, wrapper, LV_ALIGN_BOTTOM_LEFT, 0, 0);
std::shared_ptr<const Bundle> bundle = app.getParameters();
tt_check(bundle != nullptr, "Parameters not set");
std::string file_argument;
@ -29,6 +43,10 @@ static void onShow(AppContext& app, lv_obj_t* parent) {
std::string prefixed_path = "A:" + file_argument;
TT_LOG_I(TAG, "Opening %s", prefixed_path.c_str());
lv_img_set_src(image, prefixed_path.c_str());
auto path = string::getLastPathSegment(file_argument);
lv_label_set_text(file_label, path.c_str());
} else {
lv_label_set_text(file_label, "File not found");
}
}

View File

@ -8,6 +8,7 @@
#include "service/wifi/WifiSettings.h"
#include "lvgl/Style.h"
#include "lvgl/Toolbar.h"
#include "lvgl/Spinner.h"
#include <TactilityCore.h>
#include <cstring>
@ -97,8 +98,7 @@ void View::createBottomButtons(lv_obj_t* parent) {
lv_obj_align(remember_label, LV_ALIGN_CENTER, 0, 0);
lv_obj_align_to(remember_label, remember_switch, LV_ALIGN_OUT_RIGHT_MID, 4, 0);
connecting_spinner = lv_spinner_create(button_container);
lv_obj_set_size(connecting_spinner, 32, 32);
connecting_spinner = tt::lvgl::spinner_create(button_container);
lv_obj_align(connecting_spinner, LV_ALIGN_RIGHT_MID, 0, 0);
lv_obj_add_flag(connecting_spinner, LV_OBJ_FLAG_HIDDEN);

View File

@ -6,12 +6,16 @@ namespace tt::app::wifimanage {
void State::setScanning(bool isScanning) {
tt_check(mutex.acquire(TtWaitForever) == TtStatusOk);
scanning = isScanning;
scannedAfterRadioOn |= isScanning;
tt_check(mutex.release() == TtStatusOk);
}
void State::setRadioState(service::wifi::WifiRadioState state) {
tt_check(mutex.acquire(TtWaitForever) == TtStatusOk);
radioState = state;
if (radioState == service::wifi::WIFI_RADIO_OFF) {
scannedAfterRadioOn = false;
}
tt_check(mutex.release() == TtStatusOk);
}

View File

@ -11,7 +11,8 @@ namespace tt::app::wifimanage {
class State {
Mutex mutex = Mutex(Mutex::TypeRecursive);
bool scanning;
bool scanning = false;
bool scannedAfterRadioOn = false;
service::wifi::WifiRadioState radioState;
std::vector<service::wifi::WifiApRecord> apRecords;
std::string connectSsid;
@ -22,6 +23,8 @@ public:
void setScanning(bool isScanning);
bool isScanning() const;
bool hasScannedAfterRadioOn() const { return scannedAfterRadioOn; }
void setRadioState(service::wifi::WifiRadioState state);
service::wifi::WifiRadioState getRadioState() const;

View File

@ -2,7 +2,7 @@
#include "WifiManage.h"
#include "Log.h"
#include "service/statusbar/Statusbar.h"
#include "Assets.h"
#include "service/wifi/Wifi.h"
#include "lvgl/Style.h"
#include "lvgl/Toolbar.h"
@ -17,6 +17,16 @@ namespace tt::app::wifimanage {
std::shared_ptr<WifiManage> _Nullable optWifiManage();
const char* getWifiStatusIconForRssi(int rssi) {
if (rssi >= -60) {
return TT_ASSETS_ICON_WIFI_SIGNAL_STRONG_BLACK;
} else if (rssi >= -70) {
return TT_ASSETS_ICON_WIFI_SIGNAL_MEDIUM_BLACK;
} else {
return TT_ASSETS_ICON_WIFI_SIGNAL_WEAK_BLACK;
}
}
static void on_enable_switch_changed(lv_event_t* event) {
lv_event_code_t code = lv_event_get_code(event);
auto* enable_switch = static_cast<lv_obj_t*>(lv_event_get_target(event));
@ -97,13 +107,19 @@ void View::createSsidListItem(const service::wifi::WifiApRecord& record, bool is
lv_obj_align(info_label, LV_ALIGN_CENTER, 0, 0);
if (isConnecting) {
lv_obj_t* connecting_spinner = tt_spinner_create(wrapper);
lv_obj_t* connecting_spinner = tt::lvgl::spinner_create(wrapper);
lv_obj_align_to(connecting_spinner, info_wrapper, LV_ALIGN_OUT_LEFT_MID, -8, 0);
} else {
const char* icon = service::statusbar::getWifiStatusIconForRssi(record.rssi, record.auth_mode != WIFI_AUTH_OPEN);
lv_obj_t* image = lv_image_create(wrapper);
lv_image_set_src(image, icon);
lv_obj_align(image, LV_ALIGN_RIGHT_MID, -50, 0);
const char* icon = getWifiStatusIconForRssi(record.rssi);
lv_obj_t* rssi_image = lv_image_create(wrapper);
lv_image_set_src(rssi_image, icon);
lv_obj_align(rssi_image, LV_ALIGN_RIGHT_MID, -42, 0);
if (record.auth_mode != WIFI_AUTH_OPEN) {
lv_obj_t* lock_image = lv_image_create(wrapper);
lv_image_set_src(lock_image, TT_ASSETS_ICON_WIFI_LOCK_BLACK);
lv_obj_align(lock_image, LV_ALIGN_RIGHT_MID, -62, 0);
}
}
}
@ -152,7 +168,8 @@ void View::updateNetworkList() {
}
}
lv_obj_clear_flag(networks_list, LV_OBJ_FLAG_HIDDEN);
} else if (state->isScanning()) {
} else if (!state->hasScannedAfterRadioOn() || state->isScanning()) {
// hasScannedAfterRadioOn() prevents briefly showing "No networks found" when turning radio on.
lv_obj_add_flag(networks_list, LV_OBJ_FLAG_HIDDEN);
} else {
lv_obj_clear_flag(networks_list, LV_OBJ_FLAG_HIDDEN);

View File

@ -4,6 +4,7 @@
namespace tt::lvgl {
[[deprecated("Use margin")]]
lv_obj_t* spacer_create(lv_obj_t* parent, int32_t width, int32_t height);
} // namespace

View File

@ -1,14 +1,17 @@
#define LV_USE_PRIVATE_API 1 // For actual lv_obj_t declaration
#include "lvgl.h"
#include "Assets.h"
#include "CoreDefines.h"
#include "Log.h"
#include "lvgl.h"
static void tt_spinner_constructor(const lv_obj_class_t* object_class, lv_obj_t* object);
namespace tt::lvgl {
static void spinner_constructor(const lv_obj_class_t* object_class, lv_obj_t* object);
const lv_obj_class_t tt_spinner_class = {
.base_class = &lv_image_class,
.constructor_cb = tt_spinner_constructor,
.constructor_cb = spinner_constructor,
.destructor_cb = nullptr,
.event_cb = nullptr,
.user_data = nullptr,
@ -21,11 +24,11 @@ const lv_obj_class_t tt_spinner_class = {
.theme_inheritable = 0
};
lv_obj_t* tt_spinner_create(lv_obj_t* parent) {
lv_obj_t* spinner_create(lv_obj_t* parent) {
lv_obj_t* obj = lv_obj_class_create_obj(&tt_spinner_class, parent);
lv_obj_class_init_obj(obj);
lv_image_set_src(obj, "A:/assets/spinner.png");
lv_image_set_src(obj, TT_ASSETS_UI_SPINNER);
return obj;
}
@ -39,7 +42,7 @@ static void anim_rotation_callback(void* var, int32_t v) {
lv_obj_set_style_transform_rotation(object, v, 0);
}
static void tt_spinner_constructor(TT_UNUSED const lv_obj_class_t* object_class, lv_obj_t* object) {
static void spinner_constructor(TT_UNUSED const lv_obj_class_t* object_class, lv_obj_t* object) {
lv_obj_remove_flag(object, LV_OBJ_FLAG_CLICKABLE);
lv_anim_t a;
@ -51,3 +54,5 @@ static void tt_spinner_constructor(TT_UNUSED const lv_obj_class_t* object_class,
lv_anim_set_exec_cb(&a, anim_rotation_callback);
lv_anim_start(&a);
}
}

View File

@ -1,8 +1,12 @@
#include "lvgl.h"
namespace tt::lvgl {
/**
* Create the Tactility spinner widget
* @param parent pointer to an object, it will be the parent of the new spinner.
* @return the created spinner
*/
lv_obj_t* tt_spinner_create(lv_obj_t* parent);
lv_obj_t* spinner_create(lv_obj_t* parent);
}

View File

@ -90,8 +90,6 @@ static void statusbar_destructor(TT_UNUSED const lv_obj_class_t* class_p, lv_obj
static void update_icon(lv_obj_t* image, const StatusbarIcon* icon) {
if (icon->image != nullptr && icon->visible && icon->claimed) {
lv_obj_set_style_image_recolor(image, lv_color_white(), 0);
lv_obj_set_style_image_recolor_opa(image, 255, 0);
lv_image_set_src(image, icon->image);
lv_obj_remove_flag(image, LV_OBJ_FLAG_HIDDEN);
} else {

View File

@ -16,7 +16,6 @@ typedef struct {
lv_obj_t* close_button;
lv_obj_t* close_button_image;
lv_obj_t* action_container;
ToolbarAction* action_array[TOOLBAR_ACTION_LIMIT];
uint8_t action_count;
} Toolbar;
@ -60,30 +59,23 @@ lv_obj_t* toolbar_create(lv_obj_t* parent, const std::string& title) {
lv_obj_center(obj);
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
int32_t title_offset_x = (TOOLBAR_HEIGHT - TOOLBAR_TITLE_FONT_HEIGHT - 8) / 4 * 3;
int32_t title_offset_y = (TOOLBAR_HEIGHT - TOOLBAR_TITLE_FONT_HEIGHT - 8) / 2;
toolbar->close_button = lv_button_create(obj);
lv_obj_set_size(toolbar->close_button, TOOLBAR_HEIGHT - 4, TOOLBAR_HEIGHT - 4);
obj_set_style_no_padding(toolbar->close_button);
toolbar->close_button_image = lv_image_create(toolbar->close_button);
lv_obj_align(toolbar->close_button_image, LV_ALIGN_CENTER, 0, 0);
// Need spacer to avoid button press glitch animation
spacer_create(obj, title_offset_x, 1);
lv_obj_t* label_container = lv_obj_create(obj);
obj_set_style_no_padding(label_container);
lv_obj_set_style_border_width(label_container, 0, 0);
lv_obj_set_height(label_container, LV_PCT(100)); // 2% less due to 4px translate (it's not great, but it works)
lv_obj_set_flex_grow(label_container, 1);
toolbar->title_label = lv_label_create(label_container);
toolbar->title_label = lv_label_create(obj);
lv_obj_set_style_text_font(toolbar->title_label, &lv_font_montserrat_18, 0); // TODO replace with size 18
lv_obj_set_height(toolbar->title_label, TOOLBAR_TITLE_FONT_HEIGHT);
lv_label_set_text(toolbar->title_label, title.c_str());
lv_obj_set_pos(toolbar->title_label, 0, title_offset_y);
lv_obj_set_style_text_align(toolbar->title_label, LV_TEXT_ALIGN_LEFT, 0);
lv_obj_set_flex_grow(toolbar->title_label, 1);
int32_t title_offset_x = (TOOLBAR_HEIGHT - TOOLBAR_TITLE_FONT_HEIGHT - 8) / 4 * 3;
// Margin top doesn't work
lv_obj_set_style_pad_top(toolbar->title_label, title_offset_x, 0);
lv_obj_set_style_margin_left(toolbar->title_label, 8, 0);
// Hack for margin bug where buttons in flex get rendered more narrowly
lv_obj_set_style_margin_right(toolbar->title_label, -8, 0);
toolbar->action_container = lv_obj_create(obj);
lv_obj_set_width(toolbar->action_container, LV_SIZE_CONTENT);
@ -112,7 +104,7 @@ void toolbar_set_nav_action(lv_obj_t* obj, const char* icon, lv_event_cb_t callb
lv_image_set_src(toolbar->close_button_image, icon); // e.g. LV_SYMBOL_CLOSE
}
uint8_t toolbar_add_action(lv_obj_t* obj, const char* icon, lv_event_cb_t callback, void* user_data) {
lv_obj_t* toolbar_add_button_action(lv_obj_t* obj, const char* icon, lv_event_cb_t callback, void* user_data) {
auto* toolbar = (Toolbar*)obj;
uint8_t id = toolbar->action_count;
tt_check(toolbar->action_count < TOOLBAR_ACTION_LIMIT, "max actions reached");
@ -126,7 +118,7 @@ uint8_t toolbar_add_action(lv_obj_t* obj, const char* icon, lv_event_cb_t callba
lv_image_set_src(action_button_image, icon);
lv_obj_align(action_button_image, LV_ALIGN_CENTER, 0, 0);
return id;
return action_button;
}
lv_obj_t* toolbar_add_switch_action(lv_obj_t* obj) {
@ -138,7 +130,7 @@ lv_obj_t* toolbar_add_switch_action(lv_obj_t* obj) {
lv_obj_t* toolbar_add_spinner_action(lv_obj_t* obj) {
auto* toolbar = (Toolbar*)obj;
return tt_spinner_create(toolbar->action_container);
return tt::lvgl::spinner_create(toolbar->action_container);
}
} // namespace

View File

@ -6,23 +6,14 @@
namespace tt::lvgl {
#define TOOLBAR_HEIGHT 40
#define TOOLBAR_ACTION_LIMIT 8
#define TOOLBAR_TITLE_FONT_HEIGHT 18
typedef void(*ToolbarActionCallback)(void* _Nullable context);
typedef struct {
const char* icon;
const char* text;
ToolbarActionCallback callback;
void* _Nullable callback_context;
} ToolbarAction;
#define TOOLBAR_ACTION_LIMIT 4
lv_obj_t* toolbar_create(lv_obj_t* parent, const std::string& title);
lv_obj_t* toolbar_create(lv_obj_t* parent, const app::AppContext& app);
void toolbar_set_title(lv_obj_t* obj, const std::string& title);
void toolbar_set_nav_action(lv_obj_t* obj, const char* icon, lv_event_cb_t callback, void* user_data);
uint8_t toolbar_add_action(lv_obj_t* obj, const char* icon, lv_event_cb_t callback, void* user_data);
lv_obj_t* toolbar_add_button_action(lv_obj_t* obj, const char* icon, lv_event_cb_t callback, void* user_data);
lv_obj_t* toolbar_add_switch_action(lv_obj_t* obj);
lv_obj_t* toolbar_add_spinner_action(lv_obj_t* obj);
} // namespace

View File

@ -43,35 +43,29 @@ struct ServiceData {
// region wifi
const char* getWifiStatusIconForRssi(int rssi, bool secured) {
if (rssi > 0) {
return TT_ASSETS_ICON_WIFI_CONNECTION_ISSUE;
} else if (rssi >= -30) {
return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_4_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_4;
} else if (rssi >= -67) {
return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_3_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_3;
const char* getWifiStatusIconForRssi(int rssi) {
if (rssi >= -60) {
return TT_ASSETS_ICON_WIFI_SIGNAL_STRONG_WHITE;
} else if (rssi >= -70) {
return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_2_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_2;
} else if (rssi >= -80) {
return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_1_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_1;
return TT_ASSETS_ICON_WIFI_SIGNAL_MEDIUM_WHITE;
} else {
return secured ? TT_ASSETS_ICON_WIFI_SIGNAL_0_LOCKED : TT_ASSETS_ICON_WIFI_SIGNAL_0;
return TT_ASSETS_ICON_WIFI_SIGNAL_WEAK_WHITE;
}
}
static const char* wifi_get_status_icon(wifi::WifiRadioState state, bool secure) {
int rssi;
switch (state) {
case wifi::WIFI_RADIO_ON_PENDING:
case wifi::WIFI_RADIO_ON:
case wifi::WIFI_RADIO_ON_PENDING:
case wifi::WIFI_RADIO_CONNECTION_PENDING:
return TT_ASSETS_ICON_WIFI_SCAN_WHITE;
case wifi::WIFI_RADIO_OFF_PENDING:
case wifi::WIFI_RADIO_OFF:
return TT_ASSETS_ICON_WIFI_OFF;
case wifi::WIFI_RADIO_CONNECTION_PENDING:
return TT_ASSETS_ICON_WIFI_FIND;
return TT_ASSETS_ICON_WIFI_OFF_WHITE;
case wifi::WIFI_RADIO_CONNECTION_ACTIVE:
rssi = wifi::getRssi();
return getWifiStatusIconForRssi(rssi, secure);
return getWifiStatusIconForRssi(rssi);
default:
tt_crash("not implemented");
}
@ -132,16 +126,28 @@ static _Nullable const char* power_get_status_icon() {
uint8_t charge = charge_level.valueAsUint8;
if (charge >= 90) {
if (charge >= 95) {
return TT_ASSETS_ICON_POWER_100;
} else if (charge >= 70) {
return TT_ASSETS_ICON_POWER_080;
} else if (charge >= 50) {
return TT_ASSETS_ICON_POWER_060;
} else if (charge >= 30) {
return TT_ASSETS_ICON_POWER_040;
} else {
return TT_ASSETS_ICON_POWER_020;
} else if (charge >= 85) {
return TT_ASSETS_ICON_POWER_90;
} else if (charge >= 75) {
return TT_ASSETS_ICON_POWER_80;
} else if (charge >= 65) {
return TT_ASSETS_ICON_POWER_70;
} else if (charge >= 55) {
return TT_ASSETS_ICON_POWER_60;
} else if (charge >= 45) {
return TT_ASSETS_ICON_POWER_50;
} else if (charge >= 35) {
return TT_ASSETS_ICON_POWER_40;
} else if (charge >= 25) {
return TT_ASSETS_ICON_POWER_30;
} else if (charge >= 15) {
return TT_ASSETS_ICON_POWER_20;
} else if (charge >= 5) {
return TT_ASSETS_ICON_POWER_10;
} else {
return TT_ASSETS_ICON_POWER_0;
}
}

View File

@ -1,13 +0,0 @@
#pragma once
namespace tt::service::statusbar {
/**
* Return the relevant icon asset from assets.h for the given inputs
* @param rssi the rssi value
* @param secured whether the access point is a secured one (as in: not an open one)
* @return
*/
const char* getWifiStatusIconForRssi(int rssi, bool secured);
} // namespace

View File

@ -1,5 +1,3 @@
extern "C" {
#ifdef ESP_PLATFORM
#include "elf_symbol.h"
@ -7,15 +5,20 @@ extern "C" {
#include "app/App.h"
#include "app/SelectionDialog.h"
#include "lvgl/Toolbar.h"
#include "TactilityC/lvgl/Spinner.h"
#include "lvgl.h"
extern "C" {
const struct esp_elfsym elf_symbols[] {
// Tactility
ESP_ELFSYM_EXPORT(tt_app_selectiondialog_start),
ESP_ELFSYM_EXPORT(tt_set_app_manifest),
ESP_ELFSYM_EXPORT(tt_lvgl_toolbar_create),
ESP_ELFSYM_EXPORT(tt_lvgl_toolbar_create_simple),
// tt::lvgl
ESP_ELFSYM_EXPORT(tt_lvgl_spinner_create),
// lv_obj
ESP_ELFSYM_EXPORT(lv_obj_add_event_cb),
ESP_ELFSYM_EXPORT(lv_obj_align),
@ -113,9 +116,6 @@ const struct esp_elfsym elf_symbols[] {
ESP_ELFSYM_EXPORT(lv_list_add_button),
ESP_ELFSYM_EXPORT(lv_list_get_button_text),
ESP_ELFSYM_EXPORT(lv_list_set_button_text),
// lv_spinner
ESP_ELFSYM_EXPORT(lv_spinner_create),
ESP_ELFSYM_EXPORT(lv_spinner_set_anim_params),
// lv_textarea
ESP_ELFSYM_EXPORT(lv_textarea_create),
ESP_ELFSYM_EXPORT(lv_textarea_get_accepted_chars),
@ -139,11 +139,15 @@ void tt_init_tactility_c() {
elf_set_custom_symbols(elf_symbols);
}
}
#else // Simulator
extern "C" {
void tt_init_tactility_c() {
}
#endif // ESP_PLATFORM
}
#endif // ESP_PLATFORM

View File

@ -0,0 +1,10 @@
#include "Spinner.h"
#include "lvgl/Spinner.h"
extern "C" {
lv_obj_t* tt_lvgl_spinner_create(lv_obj_t* parent) {
return tt::lvgl::spinner_create(parent);
}
}

View File

@ -0,0 +1,13 @@
#pragma once
#include "lvgl.h"
#ifdef __cplusplus
extern "C" {
#endif
lv_obj_t* tt_lvgl_spinner_create(lv_obj_t* parent);
#ifdef __cplusplus
}
#endif

View File

@ -1,6 +1,5 @@
#include "StringUtils.h"
#include <cstring>
#include <iostream>
#include <sstream>
namespace tt::string {
@ -29,6 +28,15 @@ bool getPathParent(const char* path, char* output) {
}
}
std::string getLastPathSegment(const std::string& path) {
auto index = path.find_last_of('/');
if (index != std::string::npos) {
return path.substr(index + 1);
} else {
return "";
}
}
std::vector<std::string> split(const std::string&input, const std::string&delimiter) {
size_t token_index = 0;
size_t delimiter_index;

View File

@ -23,6 +23,12 @@ int findLastIndex(const char* text, size_t from_index, char find);
*/
bool getPathParent(const char* path, char* output);
/**
* Given a filesystem path as input, get the last segment of a path
* @param[in] path input path
*/
std::string getLastPathSegment(const std::string& path);
/**
* Splits the provided input into separate pieces with delimiter as separator text.
* When the input string is empty, the output list will be empty too.

View File

@ -6,6 +6,9 @@
// Splash
#define TT_ASSETS_BOOT_LOGO TT_ASSET("boot_logo.png")
// UI
#define TT_ASSETS_UI_SPINNER TT_ASSET("spinner.png")
// App icons
#define TT_ASSETS_APP_ICON_FALLBACK TT_ASSET("app_icon_fallback.png")
#define TT_ASSETS_APP_ICON_FILES TT_ASSET("app_icon_files.png")
@ -20,24 +23,26 @@
#define TT_ASSETS_ICON_SDCARD_ALERT TT_ASSET("sdcard_alert.png")
// Wifi status
#define TT_ASSETS_ICON_WIFI_CONNECTION_ISSUE TT_ASSET("wifi_connection_issue.png")
#define TT_ASSETS_ICON_WIFI_FIND TT_ASSET("wifi_find.png")
#define TT_ASSETS_ICON_WIFI_OFF TT_ASSET("wifi_off.png")
#define TT_ASSETS_ICON_WIFI_PERM_SCAN TT_ASSET("wifi_perm_scan.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_0 TT_ASSET("wifi_signal_0.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_0_LOCKED TT_ASSET("wifi_signal_0_locked.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_1 TT_ASSET("wifi_signal_1.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_1_LOCKED TT_ASSET("wifi_signal_1_locked.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_2 TT_ASSET("wifi_signal_2.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_2_LOCKED TT_ASSET("wifi_signal_2_locked.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_3 TT_ASSET("wifi_signal_3.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_3_LOCKED TT_ASSET("wifi_signal_3_locked.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_4 TT_ASSET("wifi_signal_4.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_4_LOCKED TT_ASSET("wifi_signal_4_locked.png")
#define TT_ASSETS_ICON_WIFI_OFF_WHITE TT_ASSET("wifi_off_white.png")
#define TT_ASSETS_ICON_WIFI_SCAN_WHITE TT_ASSET("wifi_scan_white.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_WEAK_WHITE TT_ASSET("wifi_signal_weak_white.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_MEDIUM_WHITE TT_ASSET("wifi_signal_medium_white.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_STRONG_WHITE TT_ASSET("wifi_signal_strong_white.png")
// Black (Wifi Manage)
#define TT_ASSETS_ICON_WIFI_LOCK_BLACK TT_ASSET("wifi_lock_black.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_WEAK_BLACK TT_ASSET("wifi_signal_weak_black.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_MEDIUM_BLACK TT_ASSET("wifi_signal_medium_black.png")
#define TT_ASSETS_ICON_WIFI_SIGNAL_STRONG_BLACK TT_ASSET("wifi_signal_strong_black.png")
// Power status
#define TT_ASSETS_ICON_POWER_020 TT_ASSET("power_020.png")
#define TT_ASSETS_ICON_POWER_040 TT_ASSET("power_040.png")
#define TT_ASSETS_ICON_POWER_060 TT_ASSET("power_060.png")
#define TT_ASSETS_ICON_POWER_080 TT_ASSET("power_080.png")
#define TT_ASSETS_ICON_POWER_0 TT_ASSET("power_0.png")
#define TT_ASSETS_ICON_POWER_10 TT_ASSET("power_10.png")
#define TT_ASSETS_ICON_POWER_20 TT_ASSET("power_20.png")
#define TT_ASSETS_ICON_POWER_30 TT_ASSET("power_30.png")
#define TT_ASSETS_ICON_POWER_40 TT_ASSET("power_40.png")
#define TT_ASSETS_ICON_POWER_50 TT_ASSET("power_50.png")
#define TT_ASSETS_ICON_POWER_60 TT_ASSET("power_60.png")
#define TT_ASSETS_ICON_POWER_70 TT_ASSET("power_70.png")
#define TT_ASSETS_ICON_POWER_80 TT_ASSET("power_80.png")
#define TT_ASSETS_ICON_POWER_90 TT_ASSET("power_90.png")
#define TT_ASSETS_ICON_POWER_100 TT_ASSET("power_100.png")

View File

@ -9,6 +9,9 @@ CONFIG_LV_FS_STDIO_CACHE_SIZE=4096
CONFIG_LV_USE_LODEPNG=y
CONFIG_LV_USE_BUILTIN_MALLOC=n
CONFIG_LV_USE_CLIB_MALLOC=y
CONFIG_LV_USE_MSGBOX=n
CONFIG_LV_USE_SPINNER=n
CONFIG_LV_USE_WIN=n
CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=2
CONFIG_FREERTOS_SMP=n

View File

@ -9,6 +9,9 @@ CONFIG_LV_FS_STDIO_CACHE_SIZE=4096
CONFIG_LV_USE_LODEPNG=y
CONFIG_LV_USE_BUILTIN_MALLOC=n
CONFIG_LV_USE_CLIB_MALLOC=y
CONFIG_LV_USE_MSGBOX=n
CONFIG_LV_USE_SPINNER=n
CONFIG_LV_USE_WIN=n
CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=2
CONFIG_FREERTOS_SMP=n

View File

@ -9,6 +9,9 @@ CONFIG_LV_FS_STDIO_CACHE_SIZE=4096
CONFIG_LV_USE_LODEPNG=y
CONFIG_LV_USE_BUILTIN_MALLOC=n
CONFIG_LV_USE_CLIB_MALLOC=y
CONFIG_LV_USE_MSGBOX=n
CONFIG_LV_USE_SPINNER=n
CONFIG_LV_USE_WIN=n
CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=2
CONFIG_FREERTOS_SMP=n

View File

@ -9,6 +9,9 @@ CONFIG_LV_FS_STDIO_CACHE_SIZE=4096
CONFIG_LV_USE_LODEPNG=y
CONFIG_LV_USE_BUILTIN_MALLOC=n
CONFIG_LV_USE_CLIB_MALLOC=y
CONFIG_LV_USE_MSGBOX=n
CONFIG_LV_USE_SPINNER=n
CONFIG_LV_USE_WIN=n
CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=2
CONFIG_FREERTOS_SMP=n

View File

@ -9,6 +9,9 @@ CONFIG_LV_FS_STDIO_CACHE_SIZE=4096
CONFIG_LV_USE_LODEPNG=y
CONFIG_LV_USE_BUILTIN_MALLOC=n
CONFIG_LV_USE_CLIB_MALLOC=y
CONFIG_LV_USE_MSGBOX=n
CONFIG_LV_USE_SPINNER=n
CONFIG_LV_USE_WIN=n
CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=2
CONFIG_FREERTOS_SMP=n

Some files were not shown because too many files have changed in this diff Show More