From 76351960b80ebbace056fad6b1107f92bb461703 Mon Sep 17 00:00:00 2001 From: mrfaptastic <12006953+mrfaptastic@users.noreply.github.com> Date: Mon, 7 Dec 2020 22:42:37 +0000 Subject: [PATCH] Added GraphicsLayer example. --- examples/GraphicsLayer/GraphicsLayer.ino | 109 +++++++ examples/GraphicsLayer/GraphicsLayer.jpg | Bin 0 -> 84478 bytes examples/GraphicsLayer/Layer.cpp | 344 +++++++++++++++++++++++ examples/GraphicsLayer/Layer.h | 122 ++++++++ examples/GraphicsLayer/README.md | 5 + keywords.txt | 1 + 6 files changed, 581 insertions(+) create mode 100644 examples/GraphicsLayer/GraphicsLayer.ino create mode 100644 examples/GraphicsLayer/GraphicsLayer.jpg create mode 100644 examples/GraphicsLayer/Layer.cpp create mode 100644 examples/GraphicsLayer/Layer.h create mode 100644 examples/GraphicsLayer/README.md diff --git a/examples/GraphicsLayer/GraphicsLayer.ino b/examples/GraphicsLayer/GraphicsLayer.ino new file mode 100644 index 0000000..e8a16d9 --- /dev/null +++ b/examples/GraphicsLayer/GraphicsLayer.ino @@ -0,0 +1,109 @@ +/* + * Portions of this code are adapted from Aurora: https://github.com/pixelmatix/aurora + * Copyright (c) 2014 Jason Coon + * + * Portions of this code are adapted from LedEffects Plasma by Robert Atkins: https://bitbucket.org/ratkins/ledeffects/src/26ed3c51912af6fac5f1304629c7b4ab7ac8ca4b/Plasma.cpp?at=default + * Copyright (c) 2013 Robert Atkins + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +//#define USE_CUSTOM_PINS // uncomment to use custom pins, then provide below + +#define A_PIN 26 +#define B_PIN 4 +#define C_PIN 27 +#define D_PIN 2 +#define E_PIN 21 + +#define R1_PIN 5 +#define R2_PIN 19 +#define G1_PIN 17 +#define G2_PIN 16 +#define B1_PIN 18 +#define B2_PIN 25 + +#define CLK_PIN 14 +#define LAT_PIN 15 +#define OE_PIN 13 + + +#include +MatrixPanel_I2S_DMA dma_display; + +#include + +int time_counter = 0; +int cycles = 0; + + +CRGBPalette16 currentPalette; +CRGB currentColor; + + +CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) { + return ColorFromPalette(currentPalette, index, brightness, blendType); +} + +void setup() { + + Serial.begin(115200); + + Serial.println("*****************************************************"); + Serial.println(" HELLO !"); + Serial.println("*****************************************************"); + +#ifdef USE_CUSTOM_PINS + dma_display.begin(R1_PIN, G1_PIN, B1_PIN, R2_PIN, G2_PIN, B2_PIN, A_PIN, B_PIN, C_PIN, D_PIN, E_PIN, LAT_PIN, OE_PIN, CLK_PIN ); // setup the LED matrix +#else + dma_display.begin(); +#endif + + // fill the screen with 'black' + dma_display.fillScreen(dma_display.color444(0, 0, 0)); + + // Set current FastLED palette + currentPalette = RainbowColors_p; + +} + +void loop() { + + for (int x = 0; x < dma_display.width(); x++) { + for (int y = 0; y < dma_display.height(); y++) { + int16_t v = 0; + uint8_t wibble = sin8(time_counter); + v += sin16(x * wibble * 3 + time_counter); + v += cos16(y * (128 - wibble) + time_counter); + v += sin16(y * x * cos8(-time_counter) / 8); + + currentColor = ColorFromPalette(currentPalette, (v >> 8) + 127); //, brightness, currentBlendType); + dma_display.drawPixelRGB888(x, y, currentColor.r, currentColor.g, currentColor.b); + + } + } + + time_counter += 1; + cycles++; + + if (cycles >= 2048) { + time_counter = 0; + cycles = 0; + } + +} // end loop \ No newline at end of file diff --git a/examples/GraphicsLayer/GraphicsLayer.jpg b/examples/GraphicsLayer/GraphicsLayer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..70dd6da0844f347928b99aed935d8d6191fdb5b0 GIT binary patch literal 84478 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%0DeLzt5(LX6(`CKpR)-8t-x;O_b#QQ@2K0 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 11) & 0x1F) * 527) + 23) >> 6; + uint8_t g = ((((color >> 5) & 0x3F) * 259) + 33) >> 6; + uint8_t b = (((color & 0x1F) * 527) + 23) >> 6; + + drawPixel(x, y, CRGB(r,g,b)); +} + +void Layer::drawPixel(int16_t x, int16_t y, int r, int g, int b) { + drawPixel(x, y, CRGB(r,g,b)); +} + +void Layer::drawPixel(int16_t x, int16_t y, CRGB color) { + + if( x >= LAYER_WIDTH || x < 0) return; // 0; + if( y >= LAYER_HEIGHT || y < 0) return; // 0; + + pixels->data[y][x] = color; +} + +/** + * Dim all the pixels in the display. + */ +void Layer::dim(byte value) { + + // nscale8 max value is 255, or it'll flip back to 0 + // (documentation is wrong when it says x/256), it's actually x/255 + for (int y = 0; y < LAYER_HEIGHT; y++) { + for (int x = 0; x < LAYER_WIDTH; x++) { + pixels->data[y][x].nscale8(value); + }} +} + +void Layer::clear() { + + memset(pixels, BLACK_BACKGROUND_PIXEL_COLOUR, sizeof(layerPixels) ); +} + +/** + * Send the layer to the display device. + */ +void Layer::display() { + + CRGB _pixel = 0 ; + for (int y = 0; y < LAYER_HEIGHT; y++) { + for (int x = 0; x < LAYER_WIDTH; x++) + { + //_pixel = pixel[XY(x, y)]; + _pixel = pixels->data[y][x]; + + matrix->drawPixelRGB888( x, y, _pixel.r, _pixel.g, _pixel.b); + + /* + if ( !transparency_enabled ){ + matrix->drawPixelRGB888( x, y, _pixel.r, _pixel.g, _pixel.b); + } else { + if (_pixel != transparency_colour) { + matrix->drawPixelRGB888( x, y, _pixel.r, _pixel.g, _pixel.b); + } + } + */ + } // end loop to copy fast led to the dma matrix + } + +} // display + +void Layer::overridePixelColor(int r, int g, int b) { + CRGB _pixel = 0 ; + for (int y = 0; y < LAYER_HEIGHT; y++) { + for (int x = 0; x < LAYER_WIDTH; x++) + { + //_pixel = pixel[XY(x, y)]; + _pixel = pixels->data[y][x]; + + if (_pixel != transparency_colour) { + matrix->drawPixelRGB888( x, y, _pixel.r, _pixel.g, _pixel.b); + } + + } // end loop to copy fast led to the dma matrix + } +} + + +// default value is in definition +void Layer::drawCentreText(const char *buf, textPosition textPos, const GFXfont *f, CRGB color, int yadjust) +{ + int16_t x1, y1; + uint16_t w, h; + + setTextWrap(false); + + if (f) { // Font struct pointer passed in? + setFont((GFXfont *)f); + } else { // NULL passed. Current font struct defined? + setFont(); // use default + } + + // getTextBounds isn't correct for variable width fonts + getTextBounds(buf, 0, 0, &x1, &y1, &w, &h); //calc width of new string + + //Serial.printf("The width of the text is %d pixels, the height is %d pixels.\n", w,h); + + /* + + From: https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts + + For example, whereas the cursor position when printing with the classic font identified + the top-left corner of the character cell, with new fonts the cursor position indicates the baseline — + the bottom-most row — of subsequent text. Characters may vary in size and width, and don’t + necessarily begin at the exact cursor column (as in below, this character starts one pixel + left of the cursor, but others may be on or to the right of it). + */ + + if (!f) { + if (textPos == TOP) { + setCursor((LAYER_WIDTH - w) / 2, 0); // top + } else if (textPos == BOTTOM) { + setCursor((LAYER_WIDTH - w) / 2, LAYER_HEIGHT - h); + } else { // middle + setCursor((LAYER_WIDTH - w) / 2, (LAYER_HEIGHT - h) / 2); // top + } + } + else // custom font + /* As we can't reliable know what is the actual FIRST and last 'lit' pixel, we need to check what was printed to the layer.*/ + { + int wstart = 0; + + if (w > 42) wstart = (LAYER_WIDTH - w) / 2; + else wstart = (LAYER_WIDTH - w) / 2; + + if (textPos == TOP) { + setCursor(wstart, h+yadjust); // top + } else if (textPos == BOTTOM) { + setCursor(wstart+1, (LAYER_HEIGHT-1)+yadjust); + } else { // middle + setCursor( wstart, ((LAYER_HEIGHT/2) + (h/2)) + yadjust); + } + + //Serial.printf("Layer: x1: %d, y1: %d, w: %d, h: %d.\n", x1, y1, w, h); + } + + // setCursor(0,16); + setTextColor(this->color565(color.r, color.g, color.b)); // Need to confirm from FastLed CRGB to adafruit 565 + print(buf); + +} // end drawCentreText + + + // Move the contents of the screen left (-ve) or right (+ve) + void Layer::moveX(int offset) + { + if(offset > 0) { // move right + // Sprintln("Moving right"); + + for(int x = LAYER_WIDTH - 1; x >= 0; x--){ // 63 to 0 + for(int y = 0; y < LAYER_HEIGHT; y++){ // 0 to 31 + if (x - offset >= 0) + { + // Serial.printf("setting y %d x %d to y %d x %d\n", y, x, y, x-offset); + pixels->data[y][x] = pixels->data[y][x-offset]; + } + else { + pixels->data[y][x] = BLACK_BACKGROUND_PIXEL_COLOUR; + } + } + } + } else { // move left + + // Sprintln("Moving Left"); + for(int x = 0; x <=LAYER_WIDTH - 1; x++){ + for(int y = 0; y < LAYER_HEIGHT; y++){ + if ( x > (LAYER_WIDTH-1)+offset ) + { + pixels->data[y][x] = BLACK_BACKGROUND_PIXEL_COLOUR; + //Serial.println("eh?"); + } + else + { + pixels->data[y][x] = pixels->data[y][x-offset]; + // Serial.println("eh?"); + } + } + } + } + } + +/** + * Centre the contents of the layer based on the leftmost and rightmost pixels. + * Useful if you want to make sure text / graphics IS in the centre of the display. + */ + void Layer::autoCenterX() + { + int leftmost_x = 0, rightmost_x = 0, adjusted_leftmost_x = 0; + + // Find leftmost + for(int x = 0; x < LAYER_WIDTH; x++) { + for(int y = 0; y < LAYER_HEIGHT; y++) { + if (pixels->data[y][x] != BLACK_BACKGROUND_PIXEL_COLOUR) + { + leftmost_x = x; + //Serial.printf("Left most x pixel is %d\n", leftmost_x); + goto rightmost; + } + } + } + + rightmost: + for(int x = LAYER_WIDTH-1; x >= 0; x--) { + for(int y = 0; y < LAYER_HEIGHT; y++) { + if (pixels->data[y][x] != BLACK_BACKGROUND_PIXEL_COLOUR) + { + rightmost_x = x+1; + //Serial.printf("Right most x pixel is %d\n", rightmost_x); + goto centreit; + } + } + } + + centreit: + adjusted_leftmost_x = ( LAYER_WIDTH - (rightmost_x - leftmost_x))/2; + //Serial.printf("Adjusted: %d, Moving x coords by %d pixels.\n", adjusted_leftmost_x, adjusted_leftmost_x-leftmost_x); + moveX(adjusted_leftmost_x-leftmost_x); + } // end autoCentreX + + void Layer::moveY(int delta) + { + // Not implemented + } + + +Layer::~Layer(void) +{ + free(pixels); +} + + + + +/* Merge FastLED layers into a super layer and display. Definition */ +namespace LayerCompositor +{ + /* + * Display the foreground pixels if they're not the background/transparent color. + * If not, then fill with whatever is in the background. + * + * writeToBg = write the result back to the _bgLayer, and not directly to the output device! + * -> no need to do a subsequent bgLayer.display() otherwise. + */ + void Stack(RGB64x32MatrixPanel_I2S_DMA &disp, const Layer &_bgLayer, const Layer &_fgLayer, bool writeBackToBg) + { + for (int y = 0; y < LAYER_HEIGHT; y++) { + for (int x = 0; x < LAYER_WIDTH; x++) + { + //https://www.educative.io/edpresso/how-to-resolve-the-expression-must-have-class-type-error-in-cpp + if (_fgLayer.pixels->data[y][x] == _fgLayer.transparency_colour) // foreground is transparent, show the _bgLayer colors + { + if (writeBackToBg) // write the foreground to the background layer... perhaps so we can do stuff later with the _fgLayer. + _bgLayer.pixels->data[y][x] = _bgLayer.pixels->data[y][x]; + else + disp.drawPixelRGB888(x,y, _bgLayer.pixels->data[y][x].r, _bgLayer.pixels->data[y][x].g, _bgLayer.pixels->data[y][x].b ); + + } // if the foreground is NOT transparent, then print whatever is the bg + else + { + if (writeBackToBg) // write the foreground to the background layer... perhaps so we can do stuff later with the _fgLayer. + _bgLayer.pixels->data[y][x] = _fgLayer.pixels->data[y][x]; + else + disp.drawPixelRGB888(x,y, _fgLayer.pixels->data[y][x].r, _fgLayer.pixels->data[y][x].g, _fgLayer.pixels->data[y][x].b ); + } + + } // end x loop + } // end y loop + } // end stack + + + /* + * Where the foreground pixels are not the background/transparent color, populate with + * whatever is in the background. + */ + void Siloette(RGB64x32MatrixPanel_I2S_DMA &disp, const Layer &_bgLayer, const Layer &_fgLayer) + { + //const Layer *bg = &_bgLayer; + //const Layer *fg = &_fgLayer; + + for (int y = 0; y < LAYER_HEIGHT; y++) { + for (int x = 0; x < LAYER_WIDTH; x++) + { + //https://www.educative.io/edpresso/how-to-resolve-the-expression-must-have-class-type-error-in-cpp + if (_fgLayer.pixels->data[y][x] != _fgLayer.transparency_colour) + { + disp.drawPixelRGB888(x,y, _bgLayer.pixels->data[y][x].r, _bgLayer.pixels->data[y][x].g, _bgLayer.pixels->data[y][x].b ); + } // if the foreground is transparent, then print whatever is the bg + else + { + disp.drawPixelRGB888(x,y, 0,0,0); + } + + } // end x loop + } // end y loop + } // end stack + + + + + + void Blend(RGB64x32MatrixPanel_I2S_DMA &disp, const Layer &_bgLayer, const Layer &_fgLayer, uint8_t ratio) + { + CRGB _pixel = 0 ; + + for (int y = 0; y < LAYER_HEIGHT; y++) + { + for (int x = 0; x < LAYER_WIDTH; x++) + { + /* + // set the blend ratio for the video cross fade + // (set ratio to 127 for a constant 50% / 50% blend) + uint8_t ratio = beatsin8(5); + */ + + _pixel = blend(_bgLayer.pixels->data[y][x], _fgLayer.pixels->data[y][x], ratio); + + // https://gist.github.com/StefanPetrick/0c0d54d0f35ea9cca983 + disp.drawPixelRGB888(x,y, _pixel.r, _pixel.g, _pixel.b ); + + } // end x loop + } // end y loop + + + + } // end blend +} diff --git a/examples/GraphicsLayer/Layer.h b/examples/GraphicsLayer/Layer.h new file mode 100644 index 0000000..69a5886 --- /dev/null +++ b/examples/GraphicsLayer/Layer.h @@ -0,0 +1,122 @@ +/** + * Experimental layer class to do play with pixel in an off-screen buffer before painting to the DMA + * + * Requires FastLED + * + * Faptastic 2020 + **/ + +#ifndef DISPLAY_MATRIX_LAYER +#define DISPLAY_MATRIX_LAYER + + +/* Use GFX_Root (https://github.com/mrfaptastic/GFX_Root) instead of + * Adafruit_GFX library. No real benefit unless you don't want Bus_IO & Wire.h library dependencies. + */ +#define USE_GFX_ROOT 1 + + +#ifdef USE_GFX_ROOT + #include "GFX.h" // Adafruit GFX core class -> https://github.com/mrfaptastic/GFX_Root +#else + #include "Adafruit_GFX.h" // Adafruit class with all the other stuff +#endif + +#include +#include + +/* + * Set the width and height of the layer buffers. This should match exactly that of your output display, or virtual display. + */ +#define LAYER_WIDTH 64 +#define LAYER_HEIGHT 32 + + +#define HALF_WHITE_COLOUR 0x8410 +#define BLACK_BACKGROUND_PIXEL_COLOUR CRGB(0,0,0) + +enum textPosition { TOP, MIDDLE, BOTTOM }; + + +/* To help with direct pixel referencing by width and height */ +struct layerPixels { + CRGB data[LAYER_HEIGHT][LAYER_WIDTH]; +}; + +#ifdef USE_GFX_ROOT +class Layer : public GFX { +#else +class Layer : public Adafruit_GFX { +#endif +// class Layer : public GFX // use GFX Root for now +{ + public: + + // Static allocation of memory for layer + //CRGB pixels[LAYER_WIDTH][LAYER_HEIGHT] = {{0}}; + + Layer(RGB64x32MatrixPanel_I2S_DMA &disp) : GFX (LAYER_WIDTH, LAYER_HEIGHT) { + matrix = &disp; + } + + inline void init() + { + // https://stackoverflow.com/questions/5914422/proper-way-to-initialize-c-structs + pixels = new layerPixels(); + + //pixels = (layerPixels *) malloc(sizeof(layerPixels)); + // pixel = (CRGB *) &pixels[0]; + //Serial.printf("Allocated %d bytes of memory for standard CRGB (24bit) layer.\r\n", NUM_PIXELS*sizeof(CRGB)); + Serial.printf("Allocated %d bytes of memory for layerPixels.\r\n", sizeof(layerPixels)); + + } // end Layer + + void drawPixel(int16_t x, int16_t y, uint16_t color); // overwrite adafruit implementation + void drawPixel(int16_t x, int16_t y, int r, int g, int b); // Layer implementation + void drawPixel(int16_t x, int16_t y, CRGB color); // Layer implementation + + // Font Stuff + //https://forum.arduino.cc/index.php?topic=642749.0 + void drawCentreText(const char *buf, textPosition textPos = BOTTOM, const GFXfont *f = NULL, CRGB color = 0x8410, int yadjust = 0); // 128,128,128 RGB @ bottom row by default + + + void dim(byte value); + void clear(); + void display(); // flush to display / LED matrix + + // override the color of all pixels that aren't the transparent color + void overridePixelColor(int r, int g, int b); + + inline uint16_t color565(uint8_t r, uint8_t g, uint8_t b) { + return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); + } + + inline void setTransparency(bool t) { transparency_enabled = t; } + + // Effects + void moveX(int delta); + void autoCenterX(); + void moveY(int delta); + + // For layer composition - accessed publically + CRGB transparency_colour = BLACK_BACKGROUND_PIXEL_COLOUR; + bool transparency_enabled = true; + layerPixels *pixels; + + // Release Memory + ~Layer(void); + + private: + RGB64x32MatrixPanel_I2S_DMA *matrix = NULL; +}; + + +/* Merge FastLED layers into a super layer and display. */ +namespace LayerCompositor +{ + void Stack(RGB64x32MatrixPanel_I2S_DMA &disp, const Layer &_bgLayer, const Layer &_fgLayer, bool writeToBgLayer = false); + void Siloette(RGB64x32MatrixPanel_I2S_DMA &disp, const Layer &_bgLayer, const Layer &_fgLayer); + void Blend(RGB64x32MatrixPanel_I2S_DMA &disp, const Layer &_bgLayer, const Layer &_fgLayer, uint8_t ratio); +} + +#endif diff --git a/examples/GraphicsLayer/README.md b/examples/GraphicsLayer/README.md new file mode 100644 index 0000000..562b151 --- /dev/null +++ b/examples/GraphicsLayer/README.md @@ -0,0 +1,5 @@ +# Layer Class + +Example of using additional pixel buffers / layers based on the FastLed CRGB data type, doing stuff with the pixels, merging the layers prior to sending to the DMA display library for output. + +![It's better in real life](GraphicsLayer.jpg) diff --git a/keywords.txt b/keywords.txt index d07f9b5..b6ccefa 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,5 +1,6 @@ RGB64x32MatrixPanel_I2S_DMA KEYWORD1 MatrixPanel_I2S_DMA KEYWORD1 +Layer KEYWORD1 fillScreen KEYWORD2 clearScreen KEYWORD2 fillScreenRGB888 KEYWORD2