Skip to content

Instantly share code, notes, and snippets.

@witnessmenow
Last active July 28, 2020 09:03
Show Gist options
  • Save witnessmenow/e09a20f0443628e0e0c26c8fd88a31a9 to your computer and use it in GitHub Desktop.
Save witnessmenow/e09a20f0443628e0e0c26c8fd88a31a9 to your computer and use it in GitHub Desktop.
Testing a virtual display buffer
/*
* 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 <ESP32-RGB64x32MatrixPanel-I2S-DMA.h>
RGB64x32MatrixPanel_I2S_DMA dma_display;
#include <FastLED.h>
#include "virtualGFX.h"
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);
}
#define NUM_ROWS 1 // Number of rows panels in your overall display
#define NUM_COLS 1 // number of panels in each row
#define PANEL_RES_X 64 // Number of pixels wide of each indivdual panel e.g. pixel purse has 32
#define PANEL_RES_Y 64 // Number of pixels tall of each panel e.g. pixel purse has 16
int vResX = NUM_COLS * PANEL_RES_X;
int vResY = NUM_ROWS * PANEL_RES_Y;
VirtualGFX virtualDisp(dma_display, NUM_ROWS, NUM_COLS, PANEL_RES_X, PANEL_RES_Y, vResX, vResY);
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));
virtualDisp.fillScreen(dma_display.color444(0, 0, 0));
// Set current FastLED palette
currentPalette = RainbowColors_p;
}
void loop() {
for (int x = 0; x < virtualDisp.width(); x++) {
for (int y = 0; y < virtualDisp.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);
virtualDisp.drawPixelRGB888(x, y, currentColor.r, currentColor.g, currentColor.b);
}
}
time_counter += 1;
cycles++;
if (cycles >= 2048) {
time_counter = 0;
cycles = 0;
}
} // end loop
#ifndef VIRTUAL_GFX_H
#define VIRTUAL_GFX_H
struct VirtualCoords {
int16_t x;
int16_t y;
};
class VirtualGFX : public Adafruit_GFX
{
public:
int16_t virtualResX;
int16_t virtualResY;
int16_t rows;
int16_t cols;
int16_t screenResX;
int16_t screenResY;
RGB64x32MatrixPanel_I2S_DMA *display;
VirtualGFX(RGB64x32MatrixPanel_I2S_DMA &disp, int vRows, int vCols, int screenX, int screenY, int vResX, int vResY)
: Adafruit_GFX(vResX, vResY)
{
this->display = &disp;
rows = vRows;
cols = vCols;
screenResX = screenX;
screenResY = screenY;
virtualResX = vResX;
virtualResY = vResY;
}
virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
void drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b);
virtual void fillScreen(uint16_t color); // overwrite adafruit implementation
VirtualCoords getCoords(int16_t x, int16_t y);
}; // end Class header
inline VirtualCoords VirtualGFX::getCoords(int16_t x, int16_t y) {
VirtualCoords coords;
int16_t xOffset = (y / screenResY) * (cols * screenResX);
coords.x = x + xOffset;
coords.y = y % screenResY;
return coords;
}
inline void VirtualGFX::drawPixel(int16_t x, int16_t y, uint16_t color)
{
VirtualCoords coords = getCoords(x, y);
this->display->drawPixel(coords.x, coords.y, color);
}
inline void VirtualGFX::fillScreen(uint16_t color) // adafruit virtual void override
{
this->display->fillScreen(color);
}
inline void VirtualGFX::drawPixelRGB888(int16_t x, int16_t y, uint8_t r, uint8_t g, uint8_t b)
{
VirtualCoords coords = getCoords(x, y);
this->display->drawPixelRGB888( coords.x, coords.y, r, g, b);
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment