@@ -274,6 +274,11 @@ class DisplayBuffer : public Adafruit_GFX {
274
274
}
275
275
};
276
276
277
+ std::map <std::string, FSImage> builtinImages = {
278
+ {" blm" , {64 , 32 , 36 }},
279
+ {" weather" , {64 , 32 , 1 }}
280
+ };
281
+
277
282
std::map <std::string, ProgmemImage> progmemImages = {
278
283
#if USE_PROGMEM_IMAGES
279
284
{" taz" , {23 , 28 , 1 , IMAGE_UINT16, taz}},
@@ -931,7 +936,7 @@ void serveImageData(AsyncWebServerRequest *request) {
931
936
Dir imageDir = getImageDir ();
932
937
std::map <std::string, FSImage> fsImageData = getFSImageData ();
933
938
934
- size_t size = 100 + (progmemImages.size () + fsImageData.size ()) * 100 ;
939
+ size_t size = 100 + (progmemImages.size () + fsImageData.size () + builtinImages. size () ) * 100 ;
935
940
DynamicJsonDocument doc (size);
936
941
937
942
#if DEBUG_TRANSPARENCY
@@ -953,6 +958,14 @@ void serveImageData(AsyncWebServerRequest *request) {
953
958
o[" type" ] = entry.second .type ;
954
959
o[" progmem" ] = true ;
955
960
}
961
+
962
+ for (auto const &entry : builtinImages) {
963
+ JsonObject o = doc.createNestedObject (entry.first .c_str ());
964
+ o[" width" ] = entry.second .width ;
965
+ o[" height" ] = entry.second .height ;
966
+ o[" length" ] = entry.second .length ;
967
+ o[" progmem" ] = true ;
968
+ }
956
969
957
970
for (auto const &entry : fsImageData) {
958
971
JsonObject o = doc.createNestedObject (entry.first .c_str ());
@@ -1001,8 +1014,9 @@ void serveImage(AsyncWebServerRequest *request) {
1001
1014
String image = request->arg (F (" image" ));
1002
1015
if (image.endsWith (F (" _P" ))) {
1003
1016
std::string progmem = std::string (image.substring (0 , image.length () - 2 ).c_str ());
1004
- if (progmemImages.count (progmem) < 1 ) {
1005
- request->send (404 );
1017
+ if (progmemImages.count (progmem) == 0 ) {
1018
+ if (!sendFile (request, DashboardFS, (" /images/" + progmem).c_str ()))
1019
+ request->send (404 );
1006
1020
return ;
1007
1021
}
1008
1022
size_t size = (progmemImages[progmem].type == IMAGE_GIMP ? 4 : 2 ) * progmemImages[progmem].width *
@@ -1048,6 +1062,7 @@ void serveDeleteImage(AsyncWebServerRequest *request) {
1048
1062
}
1049
1063
1050
1064
void deleteAllImages () {
1065
+ // Todo: Ensure files are all deleted
1051
1066
DEBUG (" Deleting all custom images\n " );
1052
1067
closeFiles ();
1053
1068
writeDefaultImageData ();
@@ -1234,16 +1249,16 @@ void drawImage(Adafruit_GFX &d, uint8_t xOffset, uint8_t yOffset, uint8_t width,
1234
1249
}
1235
1250
}
1236
1251
1237
- void drawImageFs (Adafruit_GFX &d, uint8_t xOffset, uint8_t yOffset, uint8_t width, uint8_t height, uint8_t offset,
1252
+ void drawImageFs (Adafruit_GFX &d, FS fs, uint8_t xOffset, uint8_t yOffset, uint8_t width, uint8_t height, uint8_t offset,
1238
1253
const char name[], std::vector<uint16_t > alphaColors, bool transparent, File &file) {
1239
1254
if (!file) {
1240
- if (!UserFS .exists (name)) {
1255
+ if (!fs .exists (name)) {
1241
1256
Serial.print (F (" Couldn't find image to draw for: " ));
1242
1257
Serial.println (name);
1243
1258
return ;
1244
1259
}
1245
1260
Serial.printf (" Opening File: %s\n " , name);
1246
- file = UserFS .open (name, " r" );
1261
+ file = fs .open (name, " r" );
1247
1262
if (!file) {
1248
1263
Serial.printf (" Failed to open image: %s\n " , name);
1249
1264
return ;
@@ -1742,28 +1757,32 @@ void drawWidget(Adafruit_GFX &d, Widget &widget, bool buffering) {
1742
1757
1743
1758
switch (widget.type ) {
1744
1759
case WIDGET_PROGMEM_IMAGE:
1745
- switch (progmemImages[widget.content ].type ) {
1746
- case IMAGE_UINT8:
1747
- case IMAGE_UINT16:
1748
- drawImage (d, widget.xOff + (widget.width - progmemImages[widget.content ].width ) / 2 ,
1749
- widget.yOff + (widget.height - progmemImages[widget.content ].height ) / 2 ,
1750
- progmemImages[widget.content ].width , progmemImages[widget.content ].height ,
1751
- widget.state + widget.offset , (uint8_t *) progmemImages[widget.content ].data ,
1752
- widget.colors , widget.transparent , progmemImages[widget.content ].type == IMAGE_UINT16);
1753
- break ;
1754
- case IMAGE_GIMP:
1755
- drawGimpImage (d, widget.xOff + (widget.width - progmemImages[widget.content ].width ) / 2 ,
1756
- widget.yOff + (widget.height - progmemImages[widget.content ].height ) / 2 ,
1757
- progmemImages[widget.content ].width , progmemImages[widget.content ].height ,
1758
- widget.colors , widget.transparent , (char *) progmemImages[widget.content ].data );
1759
- break ;
1760
- default :
1761
- Serial.println (F (" Unknown image type" ));
1762
- break ;
1763
- }
1760
+ if (builtinImages.count (widget.content ) > 0 )
1761
+ drawImageFs (d, DashboardFS, widget.xOff , widget.yOff , widget.width , widget.height , widget.state + widget.offset ,
1762
+ (" /images/" + widget.content ).c_str (), widget.colors , widget.transparent , widget.file );
1763
+ else
1764
+ switch (progmemImages[widget.content ].type ) {
1765
+ case IMAGE_UINT8:
1766
+ case IMAGE_UINT16:
1767
+ drawImage (d, widget.xOff + (widget.width - progmemImages[widget.content ].width ) / 2 ,
1768
+ widget.yOff + (widget.height - progmemImages[widget.content ].height ) / 2 ,
1769
+ progmemImages[widget.content ].width , progmemImages[widget.content ].height ,
1770
+ widget.state + widget.offset , (uint8_t *) progmemImages[widget.content ].data ,
1771
+ widget.colors , widget.transparent , progmemImages[widget.content ].type == IMAGE_UINT16);
1772
+ break ;
1773
+ case IMAGE_GIMP:
1774
+ drawGimpImage (d, widget.xOff + (widget.width - progmemImages[widget.content ].width ) / 2 ,
1775
+ widget.yOff + (widget.height - progmemImages[widget.content ].height ) / 2 ,
1776
+ progmemImages[widget.content ].width , progmemImages[widget.content ].height ,
1777
+ widget.colors , widget.transparent , (char *) progmemImages[widget.content ].data );
1778
+ break ;
1779
+ default :
1780
+ Serial.println (F (" Unknown image type" ));
1781
+ break ;
1782
+ }
1764
1783
break ;
1765
1784
case WIDGET_FS_IMAGE:
1766
- drawImageFs (d, widget.xOff , widget.yOff , widget.width , widget.height , widget.state + widget.offset ,
1785
+ drawImageFs (d, UserFS, widget.xOff , widget.yOff , widget.width , widget.height , widget.state + widget.offset ,
1767
1786
(" /images/" + widget.content ).c_str (), widget.colors , widget.transparent , widget.file );
1768
1787
break ;
1769
1788
case WIDGET_ANALOG_CLOCK:
0 commit comments