221 lines
7.4 KiB
C++
221 lines
7.4 KiB
C++
// Include code in this tab and call screenshotToConsole() this dumps an
|
|
// image off the screen and sends it to a PC via the serial port in a Run
|
|
// Length Encoded format for viewing with a "ILIScreenshotViewer" utility.
|
|
|
|
// The PC "ILIScreenshotViewer" is part of the ILI9241_due library in the
|
|
// Tools folder, that library can be found here:
|
|
// https://github.com/marekburiak/ILI9341_Due
|
|
|
|
// Converted by Bodmer to operate with the TFT_ILI9341_ESP library:
|
|
// https://github.com/Bodmer/TFT_ILI9341_ESP
|
|
|
|
/*
|
|
The functions below have been adapted from the ILI9341_due library, the file
|
|
header from the .cpp source file is included below:
|
|
|
|
ILI9341_due_.cpp - Arduino Due library for interfacing with ILI9341-based TFTs
|
|
|
|
Copyright (c) 2014 Marek Buriak
|
|
|
|
This library is based on ILI9341_t3 library from Paul Stoffregen
|
|
(https://github.com/PaulStoffregen/ILI9341_t3), Adafruit_ILI9341
|
|
and Adafruit_GFX libraries from Limor Fried/Ladyada
|
|
(https://github.com/adafruit/Adafruit_ILI9341).
|
|
|
|
This file is part of the Arduino ILI9341_due library.
|
|
Sources for this library can be found at https://github.com/marekburiak/ILI9341_Due.
|
|
|
|
ILI9341_due is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
the Free Software Foundation, either version 2.1 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ILI9341_due 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 Lesser General Public License for more details:
|
|
<http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
//====================================================================================
|
|
|
|
void screenshotToConsole()
|
|
{
|
|
uint8_t e = 0;
|
|
uint8_t lastColor[3];
|
|
uint8_t color[3];
|
|
uint32_t sameColorPixelCount = 0;
|
|
uint16_t sameColorPixelCount16 = 0;
|
|
uint32_t sameColorStartIndex = 0;
|
|
uint32_t totalImageDataLength = 0;
|
|
|
|
// delay(1000);
|
|
|
|
// Header text
|
|
Serial.println((eye[e].tft.width() - 1));
|
|
Serial.println((eye[e].tft.height() - 1));
|
|
Serial.println(F("==== PIXEL DATA START ===="));
|
|
|
|
// Get first pixel to prime the Run Length Encoded
|
|
// Function format is: tft.readRectRGB( x, y, width, height, buffer);
|
|
// color is a pointer to a buffer that the RGB 8 bit values are piped into
|
|
// the buffer size must be >= (width * height * 3) bytes
|
|
eye[e].tft.readRectRGB(0, 0, 1, 1, color); // 1 x 1 so reading 1 pixel at 0,0
|
|
|
|
lastColor[0] = color[0]; // Red
|
|
lastColor[1] = color[1]; // Green
|
|
lastColor[2] = color[2]; // Blue
|
|
|
|
printHex8(color, 3); //Send color of the first pixel to serial port
|
|
totalImageDataLength += 6;
|
|
sameColorStartIndex = 0;
|
|
|
|
for (uint32_t py = 0; py < (eye[e].tft.height() - 1); py++)
|
|
{
|
|
for (uint32_t px = 0; px < (eye[e].tft.width() - 1); px++)
|
|
{
|
|
uint32_t i = px + eye[e].tft.width() * py;
|
|
yield();
|
|
if (i)
|
|
{
|
|
eye[e].tft.readRectRGB(px, py, 1, 1, color);
|
|
|
|
if (color[0] != lastColor[0] ||
|
|
color[1] != lastColor[1] ||
|
|
color[2] != lastColor[2])
|
|
{
|
|
sameColorPixelCount = i - sameColorStartIndex;
|
|
if (sameColorPixelCount > 65535)
|
|
{
|
|
sameColorPixelCount16 = 65535;
|
|
printHex16(&sameColorPixelCount16, 1);
|
|
printHex8(lastColor, 3);
|
|
totalImageDataLength += 10;
|
|
sameColorPixelCount16 = sameColorPixelCount - 65535;
|
|
}
|
|
else
|
|
sameColorPixelCount16 = sameColorPixelCount;
|
|
printHex16(&sameColorPixelCount16, 1);
|
|
printHex8(color, 3);
|
|
totalImageDataLength += 10;
|
|
|
|
sameColorStartIndex = i;
|
|
lastColor[0] = color[0];
|
|
lastColor[1] = color[1];
|
|
lastColor[2] = color[2];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
sameColorPixelCount = (uint32_t)eye[e].tft.width() * (uint32_t)eye[e].tft.height() - sameColorStartIndex;
|
|
if (sameColorPixelCount > 65535)
|
|
{
|
|
sameColorPixelCount16 = 65535;
|
|
printHex16(&sameColorPixelCount16, 1);
|
|
printHex8(lastColor, 3);
|
|
totalImageDataLength += 10;
|
|
sameColorPixelCount16 = sameColorPixelCount - 65535;
|
|
}
|
|
else
|
|
sameColorPixelCount16 = sameColorPixelCount;
|
|
printHex16(&sameColorPixelCount16, 1);
|
|
totalImageDataLength += 4;
|
|
printHex32(&totalImageDataLength, 1);
|
|
|
|
// Footer text
|
|
Serial.println();
|
|
Serial.println(F("==== PIXEL DATA END ===="));
|
|
Serial.print(F("Total Image Data Length: "));
|
|
Serial.println(totalImageDataLength);
|
|
}
|
|
|
|
void printHex8(uint8_t *data, uint8_t length) // prints 8-bit data in hex
|
|
{
|
|
char tmp[length * 2 + 1];
|
|
byte first;
|
|
byte second;
|
|
for (int i = 0; i < length; i++) {
|
|
first = (data[i] >> 4) & 0x0f;
|
|
second = data[i] & 0x0f;
|
|
// base for converting single digit numbers to ASCII is 48
|
|
// base for 10-16 to become upper-case characters A-F is 55
|
|
// note: difference is 7
|
|
tmp[i * 2] = first + 48;
|
|
tmp[i * 2 + 1] = second + 48;
|
|
if (first > 9) tmp[i * 2] += 7;
|
|
if (second > 9) tmp[i * 2 + 1] += 7;
|
|
}
|
|
tmp[length * 2] = 0;
|
|
Serial.print(tmp);
|
|
}
|
|
|
|
void printHex16(uint16_t *data, uint8_t length) // prints 8-bit data in hex
|
|
{
|
|
char tmp[length * 4 + 1];
|
|
byte first;
|
|
byte second;
|
|
byte third;
|
|
byte fourth;
|
|
for (int i = 0; i < length; i++) {
|
|
first = (data[i] >> 12) & 0x0f;
|
|
second = (data[i] >> 8) & 0x0f;
|
|
third = (data[i] >> 4) & 0x0f;
|
|
fourth = data[i] & 0x0f;
|
|
//Serial << first << " " << second << " " << third << " " << fourth << endl;
|
|
// base for converting single digit numbers to ASCII is 48
|
|
// base for 10-16 to become upper-case characters A-F is 55
|
|
// note: difference is 7
|
|
tmp[i * 4] = first + 48;
|
|
tmp[i * 4 + 1] = second + 48;
|
|
tmp[i * 4 + 2] = third + 48;
|
|
tmp[i * 4 + 3] = fourth + 48;
|
|
//tmp[i*5+4] = 32; // add trailing space
|
|
if (first > 9) tmp[i * 4] += 7;
|
|
if (second > 9) tmp[i * 4 + 1] += 7;
|
|
if (third > 9) tmp[i * 4 + 2] += 7;
|
|
if (fourth > 9) tmp[i * 4 + 3] += 7;
|
|
}
|
|
tmp[length * 4] = 0;
|
|
Serial.print(tmp);
|
|
}
|
|
|
|
void printHex32(uint32_t *data, uint8_t length) // prints 8-bit data in hex
|
|
{
|
|
char tmp[length * 8 + 1];
|
|
byte dataByte[8];
|
|
for (int i = 0; i < length; i++) {
|
|
dataByte[0] = (data[i] >> 28) & 0x0f;
|
|
dataByte[1] = (data[i] >> 24) & 0x0f;
|
|
dataByte[2] = (data[i] >> 20) & 0x0f;
|
|
dataByte[3] = (data[i] >> 16) & 0x0f;
|
|
dataByte[4] = (data[i] >> 12) & 0x0f;
|
|
dataByte[5] = (data[i] >> 8) & 0x0f;
|
|
dataByte[6] = (data[i] >> 4) & 0x0f;
|
|
dataByte[7] = data[i] & 0x0f;
|
|
//Serial << first << " " << second << " " << third << " " << fourth << endl;
|
|
// base for converting single digit numbers to ASCII is 48
|
|
// base for 10-16 to become upper-case characters A-F is 55
|
|
// note: difference is 7
|
|
tmp[i * 4] = dataByte[0] + 48;
|
|
tmp[i * 4 + 1] = dataByte[1] + 48;
|
|
tmp[i * 4 + 2] = dataByte[2] + 48;
|
|
tmp[i * 4 + 3] = dataByte[3] + 48;
|
|
tmp[i * 4 + 4] = dataByte[4] + 48;
|
|
tmp[i * 4 + 5] = dataByte[5] + 48;
|
|
tmp[i * 4 + 6] = dataByte[6] + 48;
|
|
tmp[i * 4 + 7] = dataByte[7] + 48;
|
|
//tmp[i*5+4] = 32; // add trailing space
|
|
if (dataByte[0] > 9) tmp[i * 4] += 7;
|
|
if (dataByte[1] > 9) tmp[i * 4 + 1] += 7;
|
|
if (dataByte[2] > 9) tmp[i * 4 + 2] += 7;
|
|
if (dataByte[3] > 9) tmp[i * 4 + 3] += 7;
|
|
if (dataByte[4] > 9) tmp[i * 4 + 4] += 7;
|
|
if (dataByte[5] > 9) tmp[i * 4 + 5] += 7;
|
|
if (dataByte[6] > 9) tmp[i * 4 + 6] += 7;
|
|
if (dataByte[7] > 9) tmp[i * 4 + 7] += 7;
|
|
}
|
|
tmp[length * 8] = 0;
|
|
Serial.print(tmp);
|
|
}
|
|
|