added double buffering to prevent tearning
[Arduino] / Hub08_LedMatrix / LEDMatrix.cpp
index 74e4fa5..8cae64e 100644 (file)
@@ -21,8 +21,6 @@
 #include "LEDMatrix.h"
 #include "Arduino.h"
 
-#define USE_SPI 1
-
 #if USE_SPI
 #include <SPI.h>
 #endif
@@ -49,6 +47,7 @@ LEDMatrix::LEDMatrix(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t oe, uin
 #if USE_SPI
        SPI.begin();
 #endif
+       buffer = 0;
 }
 
 void LEDMatrix::begin(uint8_t *displaybuf, uint16_t width, uint16_t height)
@@ -137,6 +136,9 @@ void LEDMatrix::scan()
     }
 
     uint8_t *head = displaybuf + row * (width / 8);
+
+    if ( buffer ) head += (width/8) * height;
+
     for (uint8_t line = 0; line < (height / 16); line++) {
         uint8_t *ptr = head;
         head += width * 2;              // width * 16 / 8
@@ -157,14 +159,14 @@ void LEDMatrix::scan()
         }
     }
 
-    digitalWrite(oe, HIGH);              // disable display
-
     // select row
     digitalWrite(a, (row & 0x01));
     digitalWrite(b, (row & 0x02));
     digitalWrite(c, (row & 0x04));
     digitalWrite(d, (row & 0x08));
 
+    digitalWrite(oe, HIGH);              // disable display
+
     // latch data
     digitalWrite(stb, LOW);
     digitalWrite(stb, HIGH);
@@ -175,6 +177,18 @@ void LEDMatrix::scan()
     row = (row + 1) & 0x0F;
 }
 
+uint8_t *LEDMatrix::offscreen_buffer()
+{
+       uint8_t *buff = displaybuf;
+       if ( ! buffer ) buff += (width/8) * height;
+       return buff;
+}
+
+void LEDMatrix::swap()
+{
+    buffer = ! buffer;
+}
+
 void LEDMatrix::on()
 {
     state = 1;