#39 stream screen as bmp image completed

pull/1/head
Thomas Ballmann 4 years ago
parent d8020f0939
commit 97cf45bfc2

@ -227,62 +227,6 @@ void setupSettingsPost()
*/ */
void setupCurrentImage() void setupCurrentImage()
{ {
/*
server.on("/current-image", HTTP_GET, [](AsyncWebServerRequest *request) {
uint8_t *bitmap = display.getBuffer();
int16_t w = display.width();
int16_t h = display.height();
uint16_t depth = 1;
uint32_t rowSizeCode = (w + 8 - depth) * depth / 8;
// BMP rows are padded (if needed) to 4-byte boundary
uint32_t rowSizeBMP = (w * depth / 8 + 3) & ~3;
uint32_t headerSize = 40;
uint32_t imageOffset = 62;
uint32_t fileSize = imageOffset + h * rowSizeBMP;
AsyncResponseStream *response = request->beginResponseStream("image/bmp", w * h / 8 + imageOffset);
write16(*response, 0x4D42); // BMP signature
write32(*response, fileSize); // fileSize
write32(*response, 0); // creator bytes
write32(*response, imageOffset); // image offset
write32(*response, headerSize); // Header size
write32(*response, w); // image width
write32(*response, h); // image height
write16(*response, 1); // # planes
write16(*response, depth); // bits per pixel
write32(*response, 0); // format uncompressed
uint32_t j = 0;
for (uint32_t i = 34; i < imageOffset; i++)
{
response->write(filldata2[j++]); // remaining header bytes
}
uint32_t rowidx = w * h / 8;
for (uint16_t row = 0; row < h; row++) // for each line
{
rowidx -= rowSizeCode;
uint32_t colidx;
for (colidx = 0; colidx < rowSizeCode; colidx++)
{
uint8_t data = pgm_read_byte(&bitmap[rowidx + colidx]);
response->write(data);
}
while (colidx++ < rowSizeBMP)
{
response->write(uint8_t(0)); // padding
}
}
request->send(response);
});
*/
server.on("/current-image2", HTTP_GET, [](AsyncWebServerRequest *request) { server.on("/current-image2", HTTP_GET, [](AsyncWebServerRequest *request) {
uint8_t q = 10; uint8_t q = 10;
if (request->hasParam("q")) if (request->hasParam("q"))
@ -296,21 +240,7 @@ void setupCurrentImage()
request->send(response); request->send(response);
}); });
server.on("/current-image3", HTTP_GET, [](AsyncWebServerRequest *request) { server.on("/current-image", HTTP_GET, [](AsyncWebServerRequest *request) {
displayPrintScreenBMP("/tmp2.bmp");
AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/tmp2.bmp", "image/bmp");
request->send(response);
});
server.on("/current-image4", HTTP_GET, [](AsyncWebServerRequest *request) {
uint8_t ratio = displayPixelBWRatio();
request->send(200, "text/plain", "{}");
});
server.on("/current-image5", HTTP_GET, [](AsyncWebServerRequest *request) {
Serial.printf(PSTR("[MAIN] Free heap: %d bytes\n"), ESP.getFreeHeap());
AsyncWebServerResponse *response = request->beginChunkedResponse("image/bmp", [](uint8_t *buffer, size_t maxLen, size_t index) -> size_t { AsyncWebServerResponse *response = request->beginChunkedResponse("image/bmp", [](uint8_t *buffer, size_t maxLen, size_t index) -> size_t {
//Write up to "maxLen" bytes into "buffer" and return the amount written. //Write up to "maxLen" bytes into "buffer" and return the amount written.
//index equals the amount of bytes that have been already sent //index equals the amount of bytes that have been already sent
@ -319,7 +249,7 @@ void setupCurrentImage()
return displayStreamPrintScreenBMP(buffer, maxLen, index); return displayStreamPrintScreenBMP(buffer, maxLen, index);
}); });
// response->addHeader("Server", "ESP Async Web Server"); response->addHeader("Content-Disposition", "inline; filename=capture.bmp");
request->send(response); request->send(response);
}); });
} }

@ -259,10 +259,6 @@ size_t write32(uint8_t *buffer, uint32_t v)
int displayStreamPrintScreenBMP(uint8_t *buffer, size_t maxLen, size_t index) int displayStreamPrintScreenBMP(uint8_t *buffer, size_t maxLen, size_t index)
{ {
Serial.println(F("exportBMP"));
Serial.printf("maxLen: %d, index: %d\n", maxLen, index);
startMills = millis();
GFXcanvas1 *_canvas = displayCanvas; GFXcanvas1 *_canvas = displayCanvas;
uint8_t *bitmap = _canvas->getBuffer(); uint8_t *bitmap = _canvas->getBuffer();
@ -281,7 +277,6 @@ int displayStreamPrintScreenBMP(uint8_t *buffer, size_t maxLen, size_t index)
uint32_t pointer = 0; uint32_t pointer = 0;
if (index == 0) if (index == 0)
{ {
Serial.println("...header");
pointer += write16(buffer + pointer, 0x4D42); // BMP signature pointer += write16(buffer + pointer, 0x4D42); // BMP signature
pointer += write32(buffer + pointer, fileSize); // fileSize pointer += write32(buffer + pointer, fileSize); // fileSize
pointer += write32(buffer + pointer, 0); // creator bytes pointer += write32(buffer + pointer, 0); // creator bytes
@ -299,57 +294,39 @@ int displayStreamPrintScreenBMP(uint8_t *buffer, size_t maxLen, size_t index)
pointer += write8(buffer + pointer, filldata3[j++]); pointer += write8(buffer + pointer, filldata3[j++]);
} }
// Serial.println(pointer);
return pointer; return pointer;
} }
else else
{ {
Serial.println("...image"); // calculate resume point
// pointer = imageOffset; size_t row_from = (index - imageOffset) / rowSizeBMP;
// 1 row = 80byte
// 60 rows ?
size_t maxRows = maxLen / 80;
Serial.printf("maxRows: %d\n", maxRows);
size_t row_from = (index - imageOffset) / 80;
Serial.printf("row_from: %d\n", row_from);
uint16_t row_till = row_from + maxRows > h ? h : row_from + maxRows;
Serial.printf("row_till: %d\n", row_till);
uint32_t rowidx = w * h / 8; uint32_t rowidx = w * h / 8;
// set offset
rowidx -= rowSizeCode * row_from; rowidx -= rowSizeCode * row_from;
for (uint16_t row = row_from; row < row_till; row++) // for each line uint32_t colidx_from = (index - imageOffset) - (row_from * rowSizeBMP);
//for (uint16_t row = 0; row < h; row++) // for each line | 384
// export image
for (uint16_t row = row_from; row < h; row++) // for each line
{ {
rowidx -= rowSizeCode; rowidx -= rowSizeCode;
uint32_t colidx; uint32_t colidx;
for (colidx = 0; colidx < rowSizeCode; colidx++) for (colidx = colidx_from; colidx < rowSizeCode; colidx++)
{ {
uint8_t data = pgm_read_byte(&bitmap[rowidx + colidx]); uint8_t data = pgm_read_byte(&bitmap[rowidx + colidx]);
pointer += write8(buffer + pointer, data); pointer += write8(buffer + pointer, data);
}
/* if (pointer == maxLen)
while (colidx++ < rowSizeBMP) {
{ return pointer;
Serial.println("."); }
pointer += write8(buffer + pointer, uint8_t(0));
} }
*/
esp_task_wdt_reset(); // reset resume
colidx_from = 0;
//esp_task_wdt_reset();
} }
return pointer; return pointer;
} }
Serial.print(millis() - startMills);
Serial.println("ms");
return 0;
} }
Loading…
Cancel
Save