diff --git a/python-png_to_rle/README.md b/python-png_to_rle/README.md
new file mode 100644
index 0000000..0d15602
--- /dev/null
+++ b/python-png_to_rle/README.md
@@ -0,0 +1,58 @@
+# python-rle
+Convert a PNG file into a human-readable RLE format by using Python 3 and Pillow.
+
+
If you don't have Pillow installed
+Run the following command from the command prompt:
+pip install pillow
+
+What is RLE
+According to Wikipedia, RLE stands for "Run-length encoding (RLE)".
+Run-length encoding is a very simple form of lossless data compression in which runs of data (that is, sequences in which the same data value occurs in many consecutive data elements) are stored as a single data value and count, rather than as the original run.
+
+For example, this string:
+WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW
+...becomes this after using RLE:
+12W1B12W3B24W1B14W
+This script simply converts a binary PNG image into an RLE-type file format.
+Example
+Original image
+
+Sample output
+
+#Image Dimensions
+Width: 683
+Height: 384
+
+
+#Image Palette
+255, 0, 128
+0, 102, 0
+0, 255, 0
+66, 255, 66
+0, 0, 255
+255, 255, 0
+128, 128, 128
+0, 0, 0
+
+#Pixel Count
+0: 42670
+1: 48
+0: 631
+1: 53
+0: 627
+1: 61
+0: 55
+2: 55
+0: 509
+1: 67
+0: 48
+2: 63
+
+... truncated for brevity
+
+Included commands
+open_png(filename): Open up a PNG file by file path, and read it into memory
+get_color_atpoint(point): Get a tuple with RGB values at a given point in an image, by passing in a tuple with X,Y coordinates
+read_rle_fromstream(stream): Read in RLE information from a file, by passing in a file stream
+write_memory_tofile(filename): Write out the image in memory as a binary file
+write_rle_tostream(filename): Write out RLE information to a file, by passing in a file stream
diff --git a/python-png_to_rle/more1_button_48pixels.png b/python-png_to_rle/more1_button_48pixels.png
new file mode 100644
index 0000000..1680c64
Binary files /dev/null and b/python-png_to_rle/more1_button_48pixels.png differ
diff --git a/python-png_to_rle/more1_button_96pixels.png b/python-png_to_rle/more1_button_96pixels.png
new file mode 100644
index 0000000..fba7fc8
Binary files /dev/null and b/python-png_to_rle/more1_button_96pixels.png differ
diff --git a/python-png_to_rle/png_to_rle.py b/python-png_to_rle/png_to_rle.py
new file mode 100644
index 0000000..a904e6e
--- /dev/null
+++ b/python-png_to_rle/png_to_rle.py
@@ -0,0 +1,184 @@
+import os, sys
+from PIL import Image
+
+class RLEBitmap:
+ width = 0
+ height = 0
+ pixels = None
+ image = None
+
+ #basic constructor
+ def __init__(self):
+ self.image = None
+ self.pixels = None
+ self.height = 0
+ self.width = 0
+
+ def open_png(self, filename):
+ #open up the image
+ self.image = Image.open(filename)
+ #get the pixel data
+ self.pixels = self.image.load()
+ #get the width and height
+ self.width, self.height = self.image.size
+ print ("width=",self.width)
+ print ("height=",self.height)
+
+ def get_color_atpoint(self, point):
+ #return the pixel color as a tuple, at the given point
+ return (self.pixels[point[0], point[1]])
+
+ #read an image from a file stream
+ def read_rle_fromstream(self, stream):
+ #colors used within the image, this can be a list and not a dictionary
+ colors = []
+ colorCount = 0
+ colorIndex = 0
+
+ #iterator data
+ i = 0
+ x = 0
+ y = 0
+
+ #reset bitmap data
+ self.image = None
+ self.pixels = None
+
+ #read in and skip the first line, it's the header description
+
+ self.line1 = stream.readline()
+ print("line1=", self.line1)
+ #get the image width and height
+ self.line2 = stream.readline()
+ print("line2=", self.line2)
+ self.width = int(self.line2.split(':')[1])
+ self.height = int(stream.readline().split(':')[1])
+ #skip the new line
+ stream.readline()
+
+ #set up our bitmap in memory
+ self.image = Image.new("RGB", (self.width, self.height))
+
+ #read in the image palette, and skip the first line as it's the palette description
+ stream.readline()
+
+ #interate through until we hit whitespace
+ sI = stream.readline()
+ while not sI.isspace():
+ #split the line into rgb components
+ sISplit = sI.split(',')
+ #read in the values as an RGB tuple
+ colors.append((int(sISplit[0]), int(sISplit[1]), int(sISplit[2])))
+ #read in the next new line
+ sI = stream.readline()
+
+ #now we read in the pixel count, and skip the first line as it's the header description
+ stream.readline()
+
+ #iterate through until we hit whitespae
+ #first line
+ sI = stream.readline()
+ while not sI.isspace():
+ #split the line into index/count components
+ sISplit = sI.split(':')
+ #get the RGB index value that we need based on index
+ colorIndex = int(sISplit[0])
+ #get the count of how many times we need to loop through this color
+ colorCount = int(sISplit[1])
+
+ i = 0
+ for i in range(0, colorCount):
+ self.image.putpixel((x, y), colors[colorIndex])
+ x += 1
+
+ if (x == (self.width)):
+ x = 0
+ y += 1
+
+ #read in the next new line
+ sI = stream.readline()
+
+ #once the image has been constructed in memory, dump the pixel data into a table
+ self.pixels = self.image.load()
+
+ #print rle conversion
+ def write_rle_tostream(self):
+ #colors used within the image
+ colors = {}
+ #store the RLE data
+ pixels = []
+ pixelsTFE = [] # this is the format required by TFTe_SPI
+ #store the color in use
+ currentColor = None
+ currentColorCount = 0
+
+ #iterator data
+ x = 0
+ y = 0
+
+ #iterate through image
+ #row by row
+ for y in range(0, self.height):
+ #column by column
+ for x in range(0, self.width):
+ #get the current pixel
+ newColor = self.pixels[x, y]
+
+ #compare new color versus existing color
+ if newColor != currentColor:
+ #we don't want to do this if currentColor is nothing
+ if currentColor != None:
+ #add current (existing) color to our dictionary
+ #and give it an index value (lookup value)
+ #this is rudimentary lookup table for both saving the color data below and for saving/reading the file later
+ colors.setdefault(currentColor, len(colors.keys()))
+ #return the index value
+ colorIndex = colors[currentColor]
+ #add the color and pixel count to our list
+ pixels.append((colorIndex, currentColorCount))
+ while currentColorCount > 128:
+ if currentColor == 0:
+ pixelsTFE.append(127)
+ else :
+ pixelsTFE.append(255)
+ currentColorCount = currentColorCount - 128
+ if currentColor != 0:
+ currentColorCount = currentColorCount+128
+ pixelsTFE.append(currentColorCount-1)
+ #set the new color to our currentcolor
+ currentColor = newColor
+ #set the count equal to 1, as we need to count it as part of the new run
+ currentColorCount = 1
+ else:
+ currentColor = newColor
+ currentColorCount = 1
+ else:
+ currentColorCount += 1
+
+ #flush out the last of the colors we were working on, into the array
+ colors.setdefault(currentColor, len(colors.keys()))
+ colorIndex = colors[currentColor]
+ pixels.append((colorIndex, currentColorCount))
+ while currentColorCount > 128:
+ if currentColor == 0:
+ pixelsTFE.append(127)
+ else :
+ pixelsTFE.append(255)
+ currentColorCount = currentColorCount - 128
+ if currentColor != 0:
+ currentColorCount = currentColorCount+128
+ pixelsTFE.append(currentColorCount-1)
+
+ print("colors =", colors)
+ print("pixels (on/off , amount) =" , pixels)
+ print("rle = " ,pixelsTFE)
+
+#some tests
+#open up a PNG and write it to a RLE document
+rb = RLEBitmap()
+#rb.open_png('input\golfcourse.png')
+rb.open_png('more1_button.png')
+#fs = open('output\more1_button.rle','w')
+#fs = open('output\golfcourse.rle','w')
+rb.write_rle_tostream()
+#fs.close()
diff --git a/test touch screen/test_touchscreen/test_touchscreen.ino b/test touch screen/test_touchscreen/test_touchscreen.ino
new file mode 100644
index 0000000..a4db7dd
--- /dev/null
+++ b/test touch screen/test_touchscreen/test_touchscreen.ino
@@ -0,0 +1,75 @@
+
+#include "SPI.h"
+
+#define TFT_MISO 19
+#define TFT_MOSI 23
+#define TFT_SCLK 18
+#define TFT_CS 13 //15 // Chip select control pin
+#define TFT_DC 14// 2 // Data Command control pin
+
+#define TFT_RST 12// 4 // Reset pin (could connect to RST pin)
+
+//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
+#define TOUCH_CS 27 //21 // Chip select pin (T_CS) of touch screen
+
+#define TFT_LED_PIN 25
+
+
+
+void setup() {
+ Serial.begin(115200);
+ Serial.println("\n\nStarting...");
+
+
+ pinMode(TFT_DC, OUTPUT);
+ digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode
+
+ pinMode(TFT_RST, OUTPUT);
+ digitalWrite(TFT_RST, HIGH); // Set high, do not share pin with another SPI device
+
+ pinMode(TFT_LED_PIN , OUTPUT) ;
+ digitalWrite(TFT_LED_PIN , HIGH) ;
+
+
+ SPI.begin(TFT_SCLK, TFT_MISO, TFT_MOSI, -1);
+ Serial.println("\n\nEnd of setup...");
+ //SPI.endTransaction();
+
+ tft.begin();
+
+ tft.setRotation(1);
+ tft.fillScreen(TFT_NAVY); // Clear screen to navy background
+
+}
+
+void readOneAxis(uint8_t axis){
+ uint16_t data ;
+ //Serial.print("1");
+ SPI.endTransaction();
+ SPI.beginTransaction(SPISettings(2500000, MSBFIRST, SPI_MODE0));
+ //Serial.print("2");
+ digitalWrite( TOUCH_CS, LOW) ; // select the device
+ //pinMode(TFT_RST, INPUT );
+ SPI.transfer(axis);
+ //Serial.print("3");
+ data = SPI.transfer16(axis) ;
+ //Serial.print("4");
+ Serial.print(" "); Serial.print(data);
+ digitalWrite( TOUCH_CS, HIGH) ; // select the device
+ SPI.endTransaction();
+ //Serial.print("5");
+
+}
+#define X_AXIS 0xD3
+#define Y_AXIS 0x93
+#define Z_AXIS 0xB1
+
+
+void loop() {
+ // put your main code here, to run repeatedly:
+ readOneAxis(X_AXIS);
+ readOneAxis(Y_AXIS);
+ readOneAxis(Z_AXIS);
+ Serial.println("");
+ //delay(500);
+}