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);
 | 
						|
}
 | 
						|
 |