From 3ac0fa6f83f7fa19d48c538f91444c74f3af9bd6 Mon Sep 17 00:00:00 2001 From: mrfaptastic <12006953+mrfaptastic@users.noreply.github.com> Date: Tue, 17 Aug 2021 15:13:11 +0100 Subject: [PATCH] Remove last remaining legacy usage of the library --- README.md | 24 +--- examples/AuroraDemo/AuroraDemo.ino | 116 ++++++++++-------- examples/AuroraDemo/Boid.h | 2 +- examples/AuroraDemo/Drawable.h | 2 +- examples/AuroraDemo/Effects.h | 17 +-- examples/AuroraDemo/PatternCube.h | 4 +- examples/AuroraDemo/PatternInvaders.h | 16 +-- examples/AuroraDemo/PatternPulse.h | 6 +- examples/AuroraDemo/PatternTest.h | 2 +- examples/BitmapIcons/BitmapIcons.ino | 58 ++++++--- .../P6_32x16_1_4_ScanPanel.ino | 3 + 11 files changed, 137 insertions(+), 113 deletions(-) diff --git a/README.md b/README.md index 0d8b172..b5f9ac6 100644 --- a/README.md +++ b/README.md @@ -124,19 +124,7 @@ Various people have created PCBs for which one can simply connect an ESP32 to a Please contact or order these products from the respective authors. ## 3. Run a Test Sketch -Below is a bare minimum sketch to draw a single white dot in the top left. You must call .begin() before you call ANY pixel-drawing (fonts, lines, colours etc.) function of the MatrixPanel_I2S_DMA class. -No .begin() before other functions = Crash -``` -#include -MatrixPanel_I2S_DMA matrix; -void setup(){ - // MUST DO THIS FIRST! - matrix.begin(); // Use default values for matrix dimentions and pins supplied within ESP32-HUB75-MatrixPanel-I2S-DMA.h - // Draw a single white pixel - matrix.drawPixel(0,0, matrix.color565(255,255,255)); // can do this after .begin() only -} -void loop(){ } -``` +Below is a bare minimum sketch to draw a single white dot in the top left. You must call begin() before you call ANY pixel-drawing (fonts, lines, colours etc.) function of the MatrixPanel_I2S_DMA class. Once this is working, refer to the [PIO Test Patterns](/examples/PIO_TestPatterns) example. This sketch draws simple colors/lines/gradients over the entire matrix and it could help to troubleshoot various issues with ghosting, flickering, etc... >Note: Requires the use of [PlatformIO](https://platformio.org/), which you should probably use if you aren't already. @@ -177,11 +165,9 @@ Example: ``` void setup() { Serial.begin(115200); - matrix.begin(); // setup the LED matrix - matrix.setPanelBrightness(16); // Set the brightness. 32 or lower ideal for a single 64x32 LED Matrix Panel. - - // or another way - matrix.setBrightness8(192); // Set the brightness to about 3/4 or 75% (192/256) of maximum. + dma_display->begin(); // setup the LED matrix + dma_display->setBrightness8(90); //0-255 + dma_display->clearScreen(); } ``` @@ -195,7 +181,7 @@ If you are facing issues with image ghosting when pixels has clones with horizon An example: ``` -matrix.setLatBlanking(2); +dma_display->setLatBlanking(2); ``` ## Power, Power and Power! diff --git a/examples/AuroraDemo/AuroraDemo.ino b/examples/AuroraDemo/AuroraDemo.ino index 7ed10fa..629f9be 100644 --- a/examples/AuroraDemo/AuroraDemo.ino +++ b/examples/AuroraDemo/AuroraDemo.ino @@ -1,38 +1,55 @@ -/* ------------------------- CUSTOM GPIO PIN MAPPING ------------------------- */ -#define R1_PIN 18 -#define G1_PIN 25 -#define B1_PIN 5 -#define R2_PIN 17 -#define G2_PIN 26 -#define B2_PIN 16 -#define A_PIN 14 -#define B_PIN 27 -#define C_PIN 12 -#define D_PIN 4 -#define E_PIN -1 -#define LAT_PIN 13 -#define OE_PIN 15 -#define CLK_PIN 2 - -/* -------------------------- Display Config Initialisation -------------------- */ - -// MATRIX_WIDTH and MATRIX_HEIGHT *must* be changed in ESP32-HUB75-MatrixPanel-I2S-DMA.h -// If you are using Platform IO (you should), pass MATRIX_WIDTH and MATRIX_HEIGHT as a compile time option. -// Refer to: https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA/issues/48#issuecomment-749402379 - -/* -------------------------- Class Initialisation -------------------------- */ #include -/* - * Below is an is the 'legacy' way of initialising the MatrixPanel_I2S_DMA class. - * i.e. MATRIX_WIDTH and MATRIX_HEIGHT are modified by compile-time directives. - * By default the library assumes a single 64x32 pixel panel is connected. - * - * Refer to the example '2_PatternPlasma' on the new / correct way to setup this library - * for different resolutions / panel chain lengths within the sketch 'setup()'. - * - */ -MatrixPanel_I2S_DMA matrix; +/*--------------------- MATRIX GPIO CONFIG -------------------------*/ +#define R1_PIN 25 +#define G1_PIN 26 +#define B1_PIN 27 +#define R2_PIN 14 +#define G2_PIN 12 +#define B2_PIN 13 +#define A_PIN 23 +#define B_PIN 19 // Changed from library default +#define C_PIN 5 +#define D_PIN 17 +#define E_PIN -1 +#define LAT_PIN 4 +#define OE_PIN 15 +#define CLK_PIN 16 + + +/*--------------------- MATRIX PANEL CONFIG -------------------------*/ +#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. +#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. +#define PANEL_CHAIN 1 // Total number of panels chained one to another + +/* +//Another way of creating config structure +//Custom pin mapping for all pins +HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; +HUB75_I2S_CFG mxconfig( + 64, // width + 64, // height + 4, // chain length + _pins, // pin mapping + HUB75_I2S_CFG::FM6126A // driver chip +); + +*/ +MatrixPanel_I2S_DMA *dma_display = nullptr; + +// Module configuration +HUB75_I2S_CFG mxconfig( + PANEL_RES_X, // module width + PANEL_RES_Y, // module height + PANEL_CHAIN // Chain length +); + + +//mxconfig.gpio.e = -1; // Assign a pin if you have a 64x64 panel +//mxconfig.clkphase = false; // Change this if you have issues with ghosting. +//mxconfig.driver = HUB75_I2S_CFG::FM6126A; // Change this according to your pane. + + #include @@ -54,33 +71,32 @@ unsigned long last_frame=0, ms_previous=0; void setup() { - // Setup serial interface + /************** SERIAL **************/ Serial.begin(115200); delay(250); - matrix.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 - /** - * this demos runs pretty fine in fast-mode which gives much better fps on large matrixes (>128x64) - * see comments in the lib header on what does that means - */ - //dma_display.setFastMode(true); - - // SETS THE BRIGHTNESS HERE. MAX value is MATRIX_WIDTH, 2/3 OR LOWER IDEAL, default is about 50% - // dma_display.setPanelBrightness(30); - /* another way to change brightness is to use - * dma_display.setPanelBrightness8(uint8_t brt); // were brt is within range 0-255 - * it will recalculate to consider matrix width automatically - */ - //dma_display.setPanelBrightness8(180); + + /************** DISPLAY **************/ + Serial.println("...Starting Display"); + dma_display = new MatrixPanel_I2S_DMA(mxconfig); + dma_display->begin(); + dma_display->setBrightness8(90); //0-255 + dma_display->fillScreenRGB888(128,0,0); + delay(1000); + dma_display->fillScreenRGB888(0,0,128); + delay(1000); + dma_display->clearScreen(); + delay(1000); Serial.println("**************** Starting Aurora Effects Demo ****************"); + // setup the effects generator effects.Setup(); delay(500); Serial.println("Effects being loaded: "); listPatterns(); - + patterns.moveRandom(1); // start from a random pattern @@ -131,4 +147,4 @@ void loop() void listPatterns() { patterns.listPatterns(); -} +} \ No newline at end of file diff --git a/examples/AuroraDemo/Boid.h b/examples/AuroraDemo/Boid.h index 43a876a..61a1758 100644 --- a/examples/AuroraDemo/Boid.h +++ b/examples/AuroraDemo/Boid.h @@ -318,7 +318,7 @@ class Boid { //vertex(r, r*2); //endShape(); //popMatrix(); - //matrix.drawBackgroundPixelRGB888(location.x, location.y, CRGB::Blue); + //dma_display->drawBackgroundPixelRGB888(location.x, location.y, CRGB::Blue); } }; diff --git a/examples/AuroraDemo/Drawable.h b/examples/AuroraDemo/Drawable.h index 40356f4..56b3eb2 100644 --- a/examples/AuroraDemo/Drawable.h +++ b/examples/AuroraDemo/Drawable.h @@ -38,7 +38,7 @@ public: // a single frame should be drawn as fast as possible, without any delay or blocking // return how many millisecond delay is requested before the next call to drawFrame() virtual unsigned int drawFrame() { - matrix.fillScreen(0); + dma_display->fillScreen(0); //backgroundLayer.fillScreen({ 0, 0, 0 }); return 0; }; diff --git a/examples/AuroraDemo/Effects.h b/examples/AuroraDemo/Effects.h index d1af415..c219758 100644 --- a/examples/AuroraDemo/Effects.h +++ b/examples/AuroraDemo/Effects.h @@ -127,7 +127,7 @@ public: } ClearFrame(); - matrix.clearScreen(); + //dma_display->clearScreen(); } ~Effects(){ free(leds); @@ -147,13 +147,13 @@ public: void drawBackgroundFastLEDPixelCRGB(int16_t x, int16_t y, CRGB color) { leds[XY(x, y)] = color; - //matrix.drawPixelRGB888(x, y, color.r, color.g, color.b); + //dma_display->drawPixelRGB888(x, y, color.r, color.g, color.b); } // write one pixel with the specified color from the current palette to coordinates void Pixel(int x, int y, uint8_t colorIndex) { leds[XY(x, y)] = ColorFromCurrentPalette(colorIndex); - //matrix.drawPixelRGB888(x, y, temp.r, temp.g, temp.b); // now draw it? + //dma_display->drawPixelRGB888(x, y, temp.r, temp.g, temp.b); // now draw it? } void PrepareFrame() { @@ -175,7 +175,7 @@ public: for (int x=0; xdrawPixelRGB888( x, y, leds[_pixel].r, leds[_pixel].g, leds[_pixel].b); } // end loop to copy fast led to the dma matrix } } @@ -734,13 +734,6 @@ public: } } - // write one pixel with the specified color from the current palette to coordinates - /* - void Pixel(int x, int y, uint8_t colorIndex) { - leds[XY(x, y)] = ColorFromCurrentPalette(colorIndex); - matrix.drawBackgroundPixelRGB888(x,y, leds[XY(x, y)]); // now draw it? - } - */ CRGB ColorFromCurrentPalette(uint8_t index = 0, uint8_t brightness = 255, TBlendType blendType = LINEARBLEND) { return ColorFromPalette(currentPalette, index, brightness, currentBlendType); @@ -852,4 +845,4 @@ public: }; -#endif +#endif \ No newline at end of file diff --git a/examples/AuroraDemo/PatternCube.h b/examples/AuroraDemo/PatternCube.h index 7f9aefc..f2c60bc 100644 --- a/examples/AuroraDemo/PatternCube.h +++ b/examples/AuroraDemo/PatternCube.h @@ -188,7 +188,7 @@ class PatternCube : public Drawable { { e = edge + i; if (!e->visible) { - matrix.drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); + dma_display->drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); } } @@ -200,7 +200,7 @@ class PatternCube : public Drawable { e = edge + i; if (e->visible) { - matrix.drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); + dma_display->drawLine(screen[e->x].x, screen[e->x].y, screen[e->y].x, screen[e->y].y, color); } } diff --git a/examples/AuroraDemo/PatternInvaders.h b/examples/AuroraDemo/PatternInvaders.h index cad004c..e2df82e 100644 --- a/examples/AuroraDemo/PatternInvaders.h +++ b/examples/AuroraDemo/PatternInvaders.h @@ -36,7 +36,7 @@ class PatternInvadersSmall : public Drawable { } void start() { - matrix.fillScreen(0); + dma_display->fillScreen(0); } unsigned int drawFrame() { @@ -80,7 +80,7 @@ class PatternInvadersMedium : public Drawable { } void start() { - matrix.fillScreen(0); + dma_display->fillScreen(0); } unsigned int drawFrame() { @@ -92,10 +92,10 @@ class PatternInvadersMedium : public Drawable { if (random(0, 2) == 1) color = color1; - matrix.fillRect(x + (i * 2), y + (j * 2), x + (i * 2 + 1), y + (j * 2 + 1), color); + dma_display->fillRect(x + (i * 2), y + (j * 2), x + (i * 2 + 1), y + (j * 2 + 1), color); if (i < 2) - matrix.fillRect(x + (8 - i * 2), y + (j * 2), x + (9 - i * 2), y + (j * 2 + 1), color); + dma_display->fillRect(x + (8 - i * 2), y + (j * 2), x + (9 - i * 2), y + (j * 2 + 1), color); } } @@ -122,11 +122,11 @@ class PatternInvadersLarge : public Drawable { } void start() { - matrix.fillScreen(0); + dma_display->fillScreen(0); } unsigned int drawFrame() { - matrix.fillScreen(0); + dma_display->fillScreen(0); CRGB color1 = effects.ColorFromCurrentPalette(random(0, 255)); @@ -138,10 +138,10 @@ class PatternInvadersLarge : public Drawable { color = color1; } - matrix.fillRect(1 + x * 6, 1 + y * 6, 5 + x * 6, 5 + y * 6, color); + dma_display->fillRect(1 + x * 6, 1 + y * 6, 5 + x * 6, 5 + y * 6, color); if (x < 2) - matrix.fillRect(1 + (4 - x) * 6, 1 + y * 6, 5 + (4 - x) * 6, 5 + y * 6, color); + dma_display->fillRect(1 + (4 - x) * 6, 1 + y * 6, 5 + (4 - x) * 6, 5 + y * 6, color); } } diff --git a/examples/AuroraDemo/PatternPulse.h b/examples/AuroraDemo/PatternPulse.h index 8992a4d..4d4ba69 100644 --- a/examples/AuroraDemo/PatternPulse.h +++ b/examples/AuroraDemo/PatternPulse.h @@ -52,17 +52,17 @@ class PatternPulse : public Drawable { } if (step == 0) { - matrix.drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue)); + dma_display->drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue)); step++; } else { if (step < maxSteps) { // initial pulse - matrix.drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); + dma_display->drawCircle(centerX, centerY, step, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); // secondary pulse if (step > 3) { - matrix.drawCircle(centerX, centerY, step - 3, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); + dma_display->drawCircle(centerX, centerY, step - 3, effects.ColorFromCurrentPalette(hue, pow(fadeRate, step - 2) * 255)); } step++; } diff --git a/examples/AuroraDemo/PatternTest.h b/examples/AuroraDemo/PatternTest.h index 6f0544f..61e870a 100644 --- a/examples/AuroraDemo/PatternTest.h +++ b/examples/AuroraDemo/PatternTest.h @@ -12,7 +12,7 @@ class PatternTest : public Drawable { unsigned int drawFrame() { - matrix.fillScreen(matrix.color565(128, 0, 0)); + dma_display->fillScreen(dma_display->color565(128, 0, 0)); return 1000; } }; diff --git a/examples/BitmapIcons/BitmapIcons.ino b/examples/BitmapIcons/BitmapIcons.ino index 2c7ddf7..ab1b6e4 100644 --- a/examples/BitmapIcons/BitmapIcons.ino +++ b/examples/BitmapIcons/BitmapIcons.ino @@ -27,16 +27,39 @@ #define CLK_PIN 16 -/* - * Below is an is the 'legacy' way of initialising the MatrixPanel_I2S_DMA class. - * i.e. MATRIX_WIDTH and MATRIX_HEIGHT are modified by compile-time directives. - * By default the library assumes a single 64x32 pixel panel is connected. - * - * Refer to the example '2_PatternPlasma' on the new / correct way to setup this library - * for different resolutions / panel chain lengths within the sketch 'setup()'. - * - */ -MatrixPanel_I2S_DMA display; // RGB Panel +/*--------------------- MATRIX LILBRARY CONFIG -------------------------*/ +#define PANEL_RES_X 64 // Number of pixels wide of each INDIVIDUAL panel module. +#define PANEL_RES_Y 32 // Number of pixels tall of each INDIVIDUAL panel module. +#define PANEL_CHAIN 1 // Total number of panels chained one to another + +MatrixPanel_I2S_DMA *dma_display = nullptr; + +// Module configuration +HUB75_I2S_CFG mxconfig( + PANEL_RES_X, // module width + PANEL_RES_Y, // module height + PANEL_CHAIN // Chain length +); + +/* +//Another way of creating config structure +//Custom pin mapping for all pins +HUB75_I2S_CFG::i2s_pins _pins={R1, G1, BL1, R2, G2, BL2, CH_A, CH_B, CH_C, CH_D, CH_E, LAT, OE, CLK}; +HUB75_I2S_CFG mxconfig( + 64, // width + 64, // height + 4, // chain length + _pins, // pin mapping + HUB75_I2S_CFG::FM6126A // driver chip +); + +*/ + + +//mxconfig.gpio.e = -1; // Assign a pin if you have a 64x64 panel +//mxconfig.clkphase = false; // Change this if you have issues with ghosting. +//mxconfig.driver = HUB75_I2S_CFG::FM6126A; // Change this according to your pane. + /* * Wifi Logo, generated with the following steps: @@ -81,7 +104,7 @@ void drawXbm565(int x, int y, int width, int height, const char *xbm, uint16_t c int targetX = (i * 8 + j) % width + x; int targetY = (8 * i / (width)) + y; if (bitRead(charColumn, j)) { - display.drawPixel(targetX, targetY, color); + dma_display->drawPixel(targetX, targetY, color); } } } @@ -148,19 +171,22 @@ void setup() { /************** DISPLAY **************/ Sprintln("...Starting Display"); - 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 ); + dma_display = new MatrixPanel_I2S_DMA(mxconfig); + dma_display->begin(); + dma_display->setBrightness8(90); //0-255 + dma_display->clearScreen(); - display.fillScreen(display.color444(0, 1, 0)); + dma_display->fillScreen(dma_display->color444(0, 1, 0)); // Fade a Red Wifi Logo In for (int r=0; r < 255; r++ ) { - drawXbm565(0,0,64,32, wifi_image1bit, display.color565(r,0,0)); + drawXbm565(0,0,64,32, wifi_image1bit, dma_display->color565(r,0,0)); delay(10); } delay(2000); - display.clearScreen(); + dma_display->clearScreen(); } @@ -173,6 +199,6 @@ void loop() { current_icon = (current_icon +1 ) % num_icons; delay(2000); - display.clearScreen(); + dma_display->clearScreen(); } \ No newline at end of file diff --git a/examples/P6_32x16_1_4_ScanPanel/P6_32x16_1_4_ScanPanel.ino b/examples/P6_32x16_1_4_ScanPanel/P6_32x16_1_4_ScanPanel.ino index 8efd79f..7e28f5f 100644 --- a/examples/P6_32x16_1_4_ScanPanel/P6_32x16_1_4_ScanPanel.ino +++ b/examples/P6_32x16_1_4_ScanPanel/P6_32x16_1_4_ScanPanel.ino @@ -19,6 +19,9 @@ * Refer to the 'getCoords' function within 'QuarterScanMatrixPanel.h' * **************************************************************************/ + + // PLEASE NOTE THIS EXAMPLE NO LONGER WORKS AS OF AUGUST 2021 + // IT NEEDS TO BE UPDATED TO THE NEW WAY OF USING THE LIBRARY // uncomment to use custom pins, then provide below #define USE_CUSTOM_PINS