From 2c862542e24784c37f705c1e6a33fbe684bf226b Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 28 Aug 2023 15:34:03 +0200 Subject: [PATCH 1/2] led_matrix: add support for text using ArduinoGraphics APIs --- .../src/Arduino_LED_Matrix.h | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h b/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h index 7de830acb..2ba2903a6 100644 --- a/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h +++ b/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h @@ -3,6 +3,11 @@ #define NUM_LEDS 96 +#if __has_include("ArduinoGraphics.h") +#include +#define MATRIX_WITH_ARDUINOGRAPHICS +#endif + static const int pin_zero_index = 28; static const uint8_t pins[][2] = { @@ -138,10 +143,18 @@ static uint32_t reverse(uint32_t x) static uint8_t __attribute__((aligned)) framebuffer[NUM_LEDS / 8]; -class ArduinoLEDMatrix { +class ArduinoLEDMatrix +#ifdef MATRIX_WITH_ARDUINOGRAPHICS + : public ArduinoGraphics +#endif + { public: - ArduinoLEDMatrix() {} + ArduinoLEDMatrix() + #ifdef MATRIX_WITH_ARDUINOGRAPHICS + : ArduinoGraphics(canvasWidth, canvasHeight) + #endif + {} // TODO: find a better name // autoscroll will be slower than calling next() at precise times void autoscroll(uint32_t interval_ms) { @@ -153,7 +166,7 @@ class ArduinoLEDMatrix { void off(size_t pin) { turnLed(pin, false); } - void begin() { + int begin() { uint8_t type; uint8_t ch = FspTimer::get_available_timer(type); // TODO: avoid passing "this" argument to remove autoscroll @@ -231,7 +244,37 @@ class ArduinoLEDMatrix { void setCallback(voidFuncPtr callBack){ _callBack = callBack; } - + +#ifdef MATRIX_WITH_ARDUINOGRAPHICS + virtual void set(int x, int y, uint8_t r, uint8_t g, uint8_t b) { + if (y >= canvasHeight || x >= canvasWidth) { + return; + } + // the r parameter is (mis)used to set the character to draw with + _canvasBuffer[y][x] = (r | g | b) > 0 ? 1 : 0; + } + + void endText(int scrollDirection = NO_SCROLL) { + ArduinoGraphics::endText(scrollDirection); + renderBitmap(_canvasBuffer, canvasHeight, canvasWidth); + } + + // display the drawing + void endDraw() { + ArduinoGraphics::endDraw(); + // clear first line (no idea why it gets filled with random bits, probably some math not working fine for super small displays) + for (int i = 0; i < canvasWidth; i++) { + _canvasBuffer[0][i] = 0; + } + renderBitmap(_canvasBuffer, canvasHeight, canvasWidth); + } + + private: + static const byte canvasWidth = 12; + static const byte canvasHeight = 8; + uint8_t _canvasBuffer[canvasHeight][canvasWidth] = {{0}}; +#endif + private: int _currentFrame = 0; uint32_t _frameHolder[3]; From 941a7d0ed252c43fd076b20a764cb4ad815b4d24 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Wed, 30 Aug 2023 14:02:54 +0200 Subject: [PATCH 2/2] led_matrix: add example with ArduinoGraphics integration --- .../TextWithArduinoGraphics.ino | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 libraries/Arduino_LED_Matrix/examples/TextWithArduinoGraphics/TextWithArduinoGraphics.ino diff --git a/libraries/Arduino_LED_Matrix/examples/TextWithArduinoGraphics/TextWithArduinoGraphics.ino b/libraries/Arduino_LED_Matrix/examples/TextWithArduinoGraphics/TextWithArduinoGraphics.ino new file mode 100644 index 000000000..1a13b7aef --- /dev/null +++ b/libraries/Arduino_LED_Matrix/examples/TextWithArduinoGraphics/TextWithArduinoGraphics.ino @@ -0,0 +1,42 @@ +// To use ArduinoGraphics APIs, please include BEFORE Arduino_LED_Matrix +#include "ArduinoGraphics.h" +#include "Arduino_LED_Matrix.h" + +ArduinoLEDMatrix matrix; + +void setup() { + Serial.begin(115200); + matrix.begin(); + + matrix.beginDraw(); + matrix.stroke(0xFFFFFFFF); + // add some static text + // will only show "UNO" (not enough space on the display) + const char text[] = "UNO r4"; + matrix.textFont(Font_4x6); + matrix.beginText(0, 1, 0xFFFFFF); + matrix.println(text); + matrix.endText(); + + matrix.endDraw(); + + delay(2000); +} + +void loop() { + + // Make it scroll! + matrix.beginDraw(); + + matrix.stroke(0xFFFFFFFF); + matrix.textScrollSpeed(50); + + // add the text + const char text[] = " Scrolling text! "; + matrix.textFont(Font_5x7); + matrix.beginText(0, 1, 0xFFFFFF); + matrix.println(text); + matrix.endText(SCROLL_LEFT); + + matrix.endDraw(); +} \ No newline at end of file