diff --git a/Inkplate.cpp b/Inkplate.cpp index b8fc5c2..2b86b97 100644 --- a/Inkplate.cpp +++ b/Inkplate.cpp @@ -381,19 +381,28 @@ int Inkplate::drawBitmapFromWeb(WiFiClient* s, int x, int y, int len) { int Inkplate::drawBitmapFromWeb(char* url, int x, int y) { if (WiFi.status() != WL_CONNECTED) return 0; + int ret = 0; + + bool sleep = WiFi.getSleep(); + WiFi.setSleep(false); + HTTPClient http; - http.getStream().setNoDelay(true); - http.getStream().setTimeout(10); + http.getStream().setTimeout(1); http.begin(url); + int httpCode = http.GET(); - if (httpCode != 200) return 0; - - int32_t len = http.getSize(); - if (len <= 0) return 0; - - WiFiClient * dat = http.getStreamPtr(); - return drawBitmapFromWeb(dat, x, y, len); + if (httpCode == 200) { + int32_t len = http.getSize(); + if (len > 0) { + WiFiClient * dat = http.getStreamPtr(); + ret = drawBitmapFromWeb(dat, x, y, len); + } + } + + http.end(); + WiFi.setSleep(sleep); + return ret; } int Inkplate::sdCardInit() { @@ -894,25 +903,51 @@ int Inkplate::drawMonochromeBitmapWeb(WiFiClient *s, struct bitmapHeader bmpHead int w = bmpHeader.width; int h = bmpHeader.height; uint8_t paddingBits = w % 32; + int total = len - 34; w /= 32; - uint8_t buffer[100]; - s->readBytes(buffer, bmpHeader.startRAW); - int i, j; + uint8_t* buf = (uint8_t*) ps_malloc(total); + if (buf == NULL) + return 0; + + int pnt = 0; + while (pnt < total) { + int toread = s->available(); + if (toread > 0) { + int read = s->read(buf+pnt, toread); + if (read > 0) + pnt += read; + } + } + + int i, j, k = bmpHeader.startRAW - 34; for (j = 0; j < h; j++) { for (i = 0; i < w; i++) { - uint32_t pixelRow = s->read() << 24 | s->read() << 16 | s->read() << 8 | s->read(); + uint8_t a = buf[k++]; + uint8_t b = buf[k++]; + uint8_t c = buf[k++]; + uint8_t d = buf[k++]; + uint32_t pixelRow = a << 24 | b << 16 | c << 8 | d; + pixelRow = ~pixelRow; for (int n = 0; n < 32; n++) { drawPixel((i * 32) + n + x, h - j + y, !(pixelRow & (1ULL << (31 - n)))); } } if (paddingBits) { - uint32_t pixelRow = s->read() << 24 | s->read() << 16 | s->read() << 8 | s->read(); + uint8_t a = buf[k++]; + uint8_t b = buf[k++]; + uint8_t c = buf[k++]; + uint8_t d = buf[k++]; + uint32_t pixelRow = a << 24 | b << 16 | c << 8 | d; + pixelRow = ~pixelRow; for (int n = 0; n < paddingBits; n++) { drawPixel((i * 32) + n + x, h - j + y, !(pixelRow & (1ULL << (31 - n)))); } } } + + free(buf); + return 1; } @@ -920,64 +955,22 @@ int Inkplate::drawGrayscaleBitmap24Web(WiFiClient *s, struct bitmapHeader bmpHea int w = bmpHeader.width; int h = bmpHeader.height; char padding = w % 4; - - //Serial.println(len); - //Serial.println(bmpHeader.startRAW); - int total = len - 34; uint8_t* buf = (uint8_t*) ps_malloc(total); if (buf == NULL) return 0; - Serial.println("Starting data read!"); - - long t_start = millis(); - //int i, j; - //size_t read = s->read(buf, len - 34); - //for (i = 0; i < len - 34; i++) - // s->read(); - //int read; int pnt = 0; - //int cnk = 512; - //while (pnt < total) { - // if (total - pnt < cnk) - // cnk = total - pnt; - // read = s->read(buf+pnt, cnk); - // if (read > 0) { - // pnt += read; - // Serial.println(" Read: " + String(read)); - // } - // //delay(10); - //} - while (pnt < total) { int toread = s->available(); if (toread > 0) { int read = s->read(buf+pnt, toread); - if (read > 0) { + if (read > 0) pnt += read; - Serial.println(" Read: " + String(read) + " Total: " + String(pnt) + "/" + String(total)); - } } } - //while (pnt < total) { - // if (total - pnt < cnk) - // cnk = total - pnt; - // s->read(buf+pnt, cnk); - // pnt += cnk; - // Serial.println(" Read: " + String(cnk)); - //} - //for (j = 0; j < h; j++) { - // size_t read = s->read(buf, 64); - // Serial.println(" Read: " + String(read)); - // delay(1); - //} - long t_stop = millis(); - - Serial.println("Time: " + String((float)(t_stop - t_start)/1000) + "s"); - int i, j, k = bmpHeader.startRAW - 34; for (j = 0; j < h; j++) { for (i = 0; i < w; i++) { diff --git a/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/10-Inkplate_Download_And_Show.ino b/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/10-Inkplate_Download_And_Show.ino index 6993465..23f967c 100644 --- a/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/10-Inkplate_Download_And_Show.ino +++ b/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/10-Inkplate_Download_And_Show.ino @@ -21,40 +21,36 @@ */ #include "Inkplate.h" //Include Inkplate library to the sketch -#include "SdFat.h" //Include library for SD card #include "WiFi.h" //Include library for WiFi -#include "HTTPClient.h" //Include library for HTTP downloading Inkplate display(INKPLATE_1BIT); //Create an object on Inkplate library and also set library into 1 Bit mode (Monochrome) SdFile file; //Create SdFile object used for accessing files on SD card -const char* ssid = "Twilight Sparkle"; //Your WiFi SSID -const char* password = "thori4twily"; //Your WiFi password - -//Photo taken by: Paulian Prajitura -char* url = "https://dl.thorinair.net/neowise2.bmp"; //URL of image to download +const char* ssid = "ssid"; //Your WiFi SSID +const char* password = "password"; //Your WiFi password void setup() { - Serial.begin(115200); - display.begin(); //Init Inkplate library (you should call this function ONLY ONCE) display.clearDisplay(); //Clear frame buffer of display display.display(); //Put clear image on display - display.println("Connecting to WiFi..."); + display.print("Connecting to WiFi..."); display.partialUpdate(); //Connect to the WiFi network. WiFi.mode(WIFI_MODE_STA); - WiFi.setSleep(false); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); - Serial.print("."); + display.print("."); + display.partialUpdate(); } - display.println("WiFi OK! Downloading..."); + display.println("\nWiFi OK! Downloading..."); display.partialUpdate(); - if(!display.drawBitmapFromWeb(url, 0, 0)) { + //Draw the first image from web. + //24 bit example, will take around 20 secs to load. + //Photo taken by: Roberto Fernandez + if(!display.drawBitmapFromWeb("https://varipass.org/neowise.bmp", 0, 0)) { //If is something failed (wrong filename or wrong bitmap format), write error message on the screen. //REMEMBER! You can only use Windows Bitmap file with color depth of 1 or 24 bits with no compression! display.println("Image open error"); @@ -62,95 +58,20 @@ void setup() { } display.display(); - //HTTPClient http; -// - //http.begin(url); -// - ////Get the image, check if connection was successful. - //uint32_t httpCode = http.GET(); - //if (httpCode == 200) { - // - // display.println("HTTP opened! Size: " + String(len) + " - Saving to SD..."); - // display.partialUpdate(); -// -// -// - // //String str = http.getString(); - // //int str_len = http.getSize(); - // //char char_array[str_len]; - // //str.toCharArray(char_array, str_len); - // //http.end(); -// - // SdFat sd = display.getSdFat(); - // sd.remove("image.bmp"); - // File image = sd.open("image.bmp", O_CREAT | O_WRITE); - // if (image) { -// -// -// - // http.writeToStream(&stream); -//// - // //String body = http.getString(); -//// - // //for (int i = 0; i < http.getSize(); i++) { - // // //Serial.print(body[i]); - // // image.write(body[i]); - // //} -// - // //WiFiClient* stream = http.getStreamPtr(); - // //while (stream->available()) { - // // uint8_t c = stream->read(); - // // //Serial.print(c); - // // image.write(c); - // //} -//// - // ////image.write(char_array, str_len); //Write HTTP content to file -// - // //WiFiClient * stream = http.getStreamPtr(); - // //byte buffer[len]; - // //stream->readBytes(buffer, len); - // //for (int i = 0; i < len; i++) - // // image.write(buffer[i]); -// - // //uint32_t pos = 0; - // //char buff[2048]; - // //while (pos < len && http.available()) { - // // ESP.wdtFeed(); - // // yield(); - // // http.seek(pos, fs::SeekMode::SeekSet); - // // const auto read = http.readBytes(buff, sizeof(buff)); - // // pos += read; - // // image.write(buff, read); - // //} -// - // image.close(); //Close the file - // display.println("Image saved!"); - // display.partialUpdate(); -// - // delay(1000); -// - // //Load and display the image on e-paper at position X=0, Y=0 - // if(!display.drawBitmapFromSD("image.bmp", 0, 0)) { - // //If is something failed (wrong filename or wrong bitmap format), write error message on the screen. - // //REMEMBER! You can only use Windows Bitmap file with color depth of 1 or 24 bits with no compression! - // display.println("Image open error"); - // display.display(); - // } - // display.display(); - // } - // else { - // //If image file was not open successfully, display error on screen - // display.println("File error!"); - // display.partialUpdate(); - // return; - // } - //} - //else { - // //If HTTP connection was not successful, display error on screen - // display.println("HTTP connection error!"); - // display.partialUpdate(); - // return; - //} + delay(5000); + + //Draw the second image from web. + //1 bit example, will load very quickly. + //Photo taken by: Roberto Fernandez + if(!display.drawBitmapFromWeb("https://varipass.org/neowise_mono.bmp", 0, 0)) { + //If is something failed (wrong filename or wrong bitmap format), write error message on the screen. + //REMEMBER! You can only use Windows Bitmap file with color depth of 1 or 24 bits with no compression! + display.println("Image open error"); + display.display(); + } + display.display(); + + WiFi.mode(WIFI_OFF); } void loop() { diff --git a/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/neowise.bmp b/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/neowise.bmp new file mode 100644 index 0000000..a2fa641 Binary files /dev/null and b/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/neowise.bmp differ diff --git a/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/neowise_mono.bmp b/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/neowise_mono.bmp new file mode 100644 index 0000000..7259d55 Binary files /dev/null and b/examples/2. Advanced Inkplate Features/10-Inkplate_Download_And_Show/neowise_mono.bmp differ