From 60e7d90750643aad9d92057046d27b742c54fa27 Mon Sep 17 00:00:00 2001 From: Bodmer Date: Fri, 10 Mar 2017 00:54:52 +0000 Subject: [PATCH] Updates --- Tools/Screenshot_client/Screenshot_client.pde | 51 ++++++++++-------- Tools/Screenshot_client/example_1.png | Bin 0 -> 13401 bytes Tools/Screenshot_client/example_2.png | Bin 0 -> 9997 bytes 3 files changed, 28 insertions(+), 23 deletions(-) create mode 100644 Tools/Screenshot_client/example_1.png create mode 100644 Tools/Screenshot_client/example_2.png diff --git a/Tools/Screenshot_client/Screenshot_client.pde b/Tools/Screenshot_client/Screenshot_client.pde index cac8bae..5ff0acd 100644 --- a/Tools/Screenshot_client/Screenshot_client.pde +++ b/Tools/Screenshot_client/Screenshot_client.pde @@ -1,3 +1,5 @@ +// Latest at 03/03/17 + // This is a Processing sketch, see https://processing.org/ to download the IDE // The sketch is a client that requests TFT screenshots from an Arduino board. @@ -39,7 +41,7 @@ String image_type = ".png"; // // # boolean save_border = true; // Save the image with a border # int border = 5; // Border pixel width # -boolean fade = false; // Fade out image after saving # +boolean fade = true ; // Fade out image after saving # // # int max_images = 10; // Maximum of numbered saved images before over-writing files # // # @@ -71,7 +73,7 @@ int y_offset = 20; // int xpos, ypos; // Pixel position int beginTime = 0; -int pixelWaitTime = 100; // Wait a maximum of 100ms gap for image pixels to arrive +int pixelWaitTime = 1000; // Maximum 1000ms wait for image pixels to arrive int lastPixelTime = 0; // Time that "image send" command was sent int state = 0; // State machine current state @@ -128,10 +130,7 @@ void draw() { switch(state) { case 0: // Init varaibles, send start request - tint(255, 255); - textAlign(CENTER); - textSize(20); - + tint(0, 0, 0, 255); println(""); //println("Clearing pipe..."); beginTime = millis() + 200; @@ -140,7 +139,7 @@ void draw() { serial.read(); } println("Ready to receive image"); - serial.write("S"); + xpos = 0; ypos = 0; serialCount = 0; @@ -154,6 +153,7 @@ void draw() { case 1: // Console message, give server some time println("Requesting image"); + serial.write("S"); delay(10); state = 2; break; @@ -161,23 +161,26 @@ void draw() { case 2: // Get size and set start time for render time report // To do: Read image size info, currently hard coded beginTime = millis(); + noTint(); state = 3; break; - case 3: // Request pixels and render them + case 3: // Request pixels and render returned RGB values + if ( serial.available() > 0 ) { // Add the latest byte from the serial port to array: while (serial.available()>0) { - rgb[serialCount] = serial.read(); - serialCount++; + rgb[serialCount++] = serial.read(); // If we have 3 colour bytes: if (serialCount >= 3 ) { serialCount = 0; pixel_count++; - stroke(rgb[indexRed], rgb[indexGreen], rgb[indexBlue]); + stroke(rgb[indexRed], rgb[indexGreen], rgb[indexBlue],1000); + // We seem to get some pixel transparency so draw twice + point(xpos + x_offset, ypos + y_offset); point(xpos + x_offset, ypos + y_offset); lastPixelTime = millis(); xpos++; @@ -203,19 +206,15 @@ void draw() { } } else { - if (millis() > (lastPixelTime + pixelWaitTime)) { println(""); System.err.println("No response, trying again..."); state = 4; - } else - { - // Request 64 more pixels (ESP8266 buffer size) - serial.write("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"); - serial.write("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"); } } + // Request 32pixels + serial.write("RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"); break; case 4: // Time-out, flush serial buffer @@ -226,7 +225,7 @@ void draw() { { serial.read(); } - state = 0; + state = 6; break; case 5: // Save the image tot he sketch folder @@ -243,19 +242,25 @@ void draw() { } n = n + 1; - if (n>9) n = 0; + if (n>=max_images) n = 0; drawLoopCount = 0; // Reset value ready for counting in step 6 state = 6; break; case 6: // Fade the old image if enabled + int opacity = drawLoopCount; // So we get increasing fade + if (drawLoopCount > 50) // End fade after 50 cycles + { + opacity = 255; + state = 0; + } delay(10); if (fade) { - tint(255, drawLoopCount); + tint(255, opacity); image(tft_img, x_offset, y_offset); } - if (drawLoopCount > 50) state = 0; // Wait for fade to end + break; case 99: // Draw image viewer window @@ -271,7 +276,7 @@ void draw() { rect(x_offset - border, y_offset - border, tft_width - 1 + 2*border, tft_height - 1 + 2*border); - fill(100); + fill(255); rect(x_offset, y_offset, tft_width-1, tft_height-1); state = 0; @@ -282,4 +287,4 @@ void draw() { System.err.println("Error state reached - check sketch!"); break; } -} +} \ No newline at end of file diff --git a/Tools/Screenshot_client/example_1.png b/Tools/Screenshot_client/example_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a29e3c16c7cd98b6e8185c2da1b041e6c763bda GIT binary patch literal 13401 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 literal 0 HcmV?d00001