aboutsummaryrefslogtreecommitdiff
path: root/examples/PIO_TestPatterns
diff options
context:
space:
mode:
authormrfaptastic <12006953+mrfaptastic@users.noreply.github.com>2022-01-13 15:31:58 +0000
committerGitHub <noreply@github.com>2022-01-13 15:31:58 +0000
commit3487a3565ded2f965a28ca6a33e3d0cb2a247847 (patch)
tree995d1d38d2f29b09d9c21c8322094e5a88c21486 /examples/PIO_TestPatterns
parent81af2a94cadbf066b7a1fa66080f516e81e05733 (diff)
parent411d47470524c55d462691798de7081e68265ab6 (diff)
Merge pull request #237 from mrfaptastic/dev
Better CI checks
Diffstat (limited to 'examples/PIO_TestPatterns')
-rw-r--r--examples/PIO_TestPatterns/README.md2
-rw-r--r--examples/PIO_TestPatterns/platformio.ini63
-rw-r--r--examples/PIO_TestPatterns/src/main.cpp99
-rw-r--r--examples/PIO_TestPatterns/src/main.h4
4 files changed, 138 insertions, 30 deletions
diff --git a/examples/PIO_TestPatterns/README.md b/examples/PIO_TestPatterns/README.md
index cba07a2..ac988f6 100644
--- a/examples/PIO_TestPatterns/README.md
+++ b/examples/PIO_TestPatterns/README.md
@@ -2,6 +2,8 @@
Simple solid colors, gradients and test line patterns, could be used to test matrices for proper operation, flickering and estimate fillrate timings.
+It is also used in CI test builds to check different build flags scenarios.
+
Should be build and uploaded as a [platformio](https://platformio.org/) project
diff --git a/examples/PIO_TestPatterns/platformio.ini b/examples/PIO_TestPatterns/platformio.ini
index 087085c..3505b2d 100644
--- a/examples/PIO_TestPatterns/platformio.ini
+++ b/examples/PIO_TestPatterns/platformio.ini
@@ -1,29 +1,76 @@
[platformio]
-default_envs = esp32
+;default_envs = esp32
+description = HUB75 ESP32 I2S DMA test patterns example
+;src_dir = src
[env]
framework = arduino
platform = espressif32
-board_build.filesystem = littlefs
board = wemos_d1_mini32
lib_deps =
- FastLED
+ fastled/FastLED
+ https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA.git
build_flags =
-; -DSERIAL_DEBUG=1
-upload_speed = 921600
+upload_speed = 460800
monitor_speed = 115200
monitor_filters = esp32_exception_decoder
[env:esp32]
build_flags =
${env.build_flags}
- ;-DUSE_FASTLINES
+ -DTEST_FASTLINES
+lib_deps =
+ ${env.lib_deps}
+ Wire
+ adafruit/Adafruit BusIO
+ adafruit/Adafruit GFX Library
+
+[env:debug]
+build_flags =
+ ${env.build_flags}
+ -DTEST_FASTLINES
+ -DSERIAL_DEBUG
+lib_deps =
+ ${env.lib_deps}
+ Wire
+ adafruit/Adafruit BusIO
+ adafruit/Adafruit GFX Library
+
+; build without GFX functions
+[env:minimal]
+build_flags =
+ ${env.build_flags}
-DNO_GFX
+ -DNO_FAST_FUNCTIONS
+ -DNO_CIE1931
lib_deps =
${env.lib_deps}
-; use dev version of the lib
- https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-I2S-DMA.git
+; Virtual Panel test
+[env:vpane]
+build_flags =
+ ${env.build_flags}
+ -DNO_FAST_FUNCTIONS
+ -DVIRTUAL_PANE
+lib_deps =
+ ${env.lib_deps}
+ Wire
+ adafruit/Adafruit BusIO
+ adafruit/Adafruit GFX Library
+
+; Virtual Panel test
+[env:vpane_minimal]
+build_flags =
+ ${env.build_flags}
+ -DVIRTUAL_PANE
+ -DNO_GFX
+ -DNO_FAST_FUNCTIONS
+ -DNO_CIE1931
+lib_deps =
+ ${env.lib_deps}
+ Wire
+ adafruit/Adafruit BusIO
+ adafruit/Adafruit GFX Library
; PIO CI can't handle IDF git modules properly (yet)
;[env:idfarduino]
diff --git a/examples/PIO_TestPatterns/src/main.cpp b/examples/PIO_TestPatterns/src/main.cpp
index 9402e9e..6325b63 100644
--- a/examples/PIO_TestPatterns/src/main.cpp
+++ b/examples/PIO_TestPatterns/src/main.cpp
@@ -11,8 +11,11 @@
*/
#include <Arduino.h>
#include "xtensa/core-macros.h"
+#ifdef VIRTUAL_PANE
+#include <ESP32-VirtualMatrixPanel-I2S-DMA.h>
+#else
#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>
-
+#endif
#include "main.h"
// HUB75E pinout
@@ -44,25 +47,38 @@
*/
// Configure for your panel(s) as appropriate!
+#define PIN_E 32
#define PANEL_WIDTH 64
#define PANEL_HEIGHT 64 // Panel height of 64 will required PIN_E to be defined.
-#define PANELS_NUMBER 2 // Number of chained panels, if just a single panel, obviously set to 1
-#define PIN_E 32
+
+#ifdef VIRTUAL_PANE
+ #define PANELS_NUMBER 4 // Number of chained panels, if just a single panel, obviously set to 1
+#else
+ #define PANELS_NUMBER 2 // Number of chained panels, if just a single panel, obviously set to 1
+#endif
#define PANE_WIDTH PANEL_WIDTH * PANELS_NUMBER
#define PANE_HEIGHT PANEL_HEIGHT
-
-
-// patten change delay
-#define PATTERN_DELAY 2000
-
#define NUM_LEDS PANE_WIDTH*PANE_HEIGHT
-// do tests using fast-line methods
-#define USE_FASTLINES
+#ifdef VIRTUAL_PANE
+ #define NUM_ROWS 2 // Number of rows of chained INDIVIDUAL PANELS
+ #define NUM_COLS 2 // Number of INDIVIDUAL PANELS per ROW
+ #define PANEL_CHAIN NUM_ROWS*NUM_COLS // total number of panels chained one to another
+ // Change this to your needs, for details on VirtualPanel pls read the PDF!
+ #define SERPENT true
+ #define TOPDOWN false
+#endif
+#ifdef VIRTUAL_PANE
+VirtualMatrixPanel *matrix = nullptr;
+MatrixPanel_I2S_DMA *chain = nullptr;
+#else
MatrixPanel_I2S_DMA *matrix = nullptr;
+#endif
+// patten change delay
+#define PATTERN_DELAY 2000
uint16_t time_counter = 0, cycles = 0, fps = 0;
unsigned long fps_timer;
@@ -77,6 +93,8 @@ uint32_t ccount1, ccount2;
uint8_t color1 = 0, color2 = 0, color3 = 0;
uint16_t x,y;
+const char *str = "* ESP32 I2S DMA *";
+
void setup(){
Serial.begin(BAUD_RATE);
@@ -89,23 +107,31 @@ void setup(){
mxconfig.gpio.e = PIN_E;
mxconfig.driver = HUB75_I2S_CFG::FM6126A; // for panels using FM6126A chips
+#ifndef VIRTUAL_PANE
matrix = new MatrixPanel_I2S_DMA(mxconfig);
-
matrix->begin();
matrix->setBrightness8(255);
-
- // longer latch blanking could help to eliminate ghosting in some cases
- //matrix->setLatBlanking(2);
+#else
+ chain = new MatrixPanel_I2S_DMA(mxconfig);
+ chain->begin();
+ chain->setBrightness8(255);
+ // create VirtualDisplay object based on our newly created dma_display object
+ matrix = new VirtualMatrixPanel((*chain), NUM_ROWS, NUM_COLS, PANEL_WIDTH, PANEL_HEIGHT, SERPENT, TOPDOWN);
+#endif
ledbuff = (CRGB *)malloc(NUM_LEDS * sizeof(CRGB)); // allocate buffer for some tests
buffclear(ledbuff);
}
-
+uint8_t wheelval = 0;
void loop(){
Serial.printf("Cycle: %d\n", ++cycles);
+#ifndef NO_GFX
+ drawText(wheelval++);
+#endif
+
Serial.print("Estimating clearScreen() - ");
ccount1 = XTHAL_GET_CCOUNT();
matrix->clearScreen();
@@ -126,7 +152,7 @@ void loop(){
delay(5000);
*/
-
+#ifndef VIRTUAL_PANE
// simple solid colors
Serial.println("Fill screen: RED");
matrix->fillScreenRGB888(255, 0, 0);
@@ -137,7 +163,7 @@ void loop(){
Serial.println("Fill screen: BLUE");
matrix->fillScreenRGB888(0, 0, 255);
delay(PATTERN_DELAY);
-
+#endif
for (uint8_t i=5; i; --i){
Serial.print("Estimating single drawPixelRGB888(r, g, b) ticks: ");
@@ -157,6 +183,7 @@ void loop(){
t2 = micros()-t1;
Serial.printf("%lu us, %u ticks\n\n", t2, ccount1);
+#ifndef VIRTUAL_PANE
// Bare fillscreen(r, g, b)
Serial.print("Estimating fillscreenRGB888(r, g, b) time: ");
t1 = micros();
@@ -167,7 +194,7 @@ void loop(){
s1+=t2;
Serial.printf("%lu us, avg: %lu, ccnt: %d\n", t2, s1/cycles, ccount2);
delay(PATTERN_DELAY);
-
+#endif
Serial.print("Estimating full-screen fillrate with looped drawPixelRGB888(): ");
y = PANE_HEIGHT;
@@ -214,7 +241,7 @@ void loop(){
delay(PATTERN_DELAY);
//
-#ifdef USE_FASTLINES
+#ifdef TEST_FASTLINES
// Fillrate for fillRect() function
Serial.print("Estimating fullscreen fillrate with fillRect() time: ");
t1 = micros();
@@ -266,7 +293,7 @@ void loop(){
Serial.printf("%lu us, %u ticks\n", t2, ccount1);
delay(PATTERN_DELAY);
-#ifdef USE_FASTLINES
+#ifdef TEST_FASTLINES
Serial.println("Estimating V-lines with vlineDMA(): "); //
matrix->fillScreen(0);
color2 = random8();
@@ -320,7 +347,7 @@ void loop(){
Serial.printf("%lu us, %u ticks\n", t2, ccount1);
delay(PATTERN_DELAY);
-#ifdef USE_FASTLINES
+#ifdef TEST_FASTLINES
Serial.println("Estimating H-lines with hlineDMA(): ");
matrix->fillScreen(0);
color2 = random8();
@@ -396,3 +423,33 @@ uint16_t XY16( uint16_t x, uint16_t y)
return 0;
}
}
+
+#ifdef NO_GFX
+void drawText(int colorWheelOffset){}
+#else
+void drawText(int colorWheelOffset){
+ // draw some text
+ matrix->setTextSize(1); // size 1 == 8 pixels high
+ matrix->setTextWrap(false); // Don't wrap at end of line - will do ourselves
+
+ matrix->setCursor(5, 5); // start at top left, with 5,5 pixel of spacing
+ uint8_t w = 0;
+
+ for (w=0; w<strlen(str); w++) {
+ matrix->setTextColor(colorWheel((w*32)+colorWheelOffset));
+ matrix->print(str[w]);
+ }
+}
+#endif
+
+uint16_t colorWheel(uint8_t pos) {
+ if(pos < 85) {
+ return matrix->color565(pos * 3, 255 - pos * 3, 0);
+ } else if(pos < 170) {
+ pos -= 85;
+ return matrix->color565(255 - pos * 3, 0, pos * 3);
+ } else {
+ pos -= 170;
+ return matrix->color565(0, pos * 3, 255 - pos * 3);
+ }
+}
diff --git a/examples/PIO_TestPatterns/src/main.h b/examples/PIO_TestPatterns/src/main.h
index d947d8e..a1310f4 100644
--- a/examples/PIO_TestPatterns/src/main.h
+++ b/examples/PIO_TestPatterns/src/main.h
@@ -5,4 +5,6 @@
void buffclear(CRGB *buf);
uint16_t XY16( uint16_t x, uint16_t y);
-void mxfill(CRGB *leds); \ No newline at end of file
+void mxfill(CRGB *leds);
+uint16_t colorWheel(uint8_t pos);
+void drawText(int colorWheelOffset); \ No newline at end of file