displaying on SSD1306, 128x64 pixels OLED

Dependencies:   microbit

Revision:
6:c69f08f464b5
Child:
7:7b225c565fe6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Display.cpp	Sun Feb 23 01:57:35 2020 +0000
@@ -0,0 +1,92 @@
+#include "MicroBit.h"
+#include "Display.h"
+
+Display::Display(MicroBitDisplay & uDpl) : uDisplay(uDpl)  {
+    for (uint8_t i = 0 ; i < 25; i++)
+        stick[i]=false; 
+    }
+void Display::setPixel(uint8_t x,uint8_t y) {
+    uDisplay.image.setPixelValue(x,y,1);
+    }
+
+void Display::setStick(uint8_t length) {
+     curLength = length;
+     paintStick(&Display::lessCurLength);
+     }   
+
+void Display::setFlag(uint8_t position) {
+    showbit = position;
+    paintStick(&Display::orPoint);
+    }
+
+void Display::toRow(uint8_t rowNr, uint8_t rowContent) {
+    this->rowNr=rowNr;
+    showbit=rowContent;
+    paintStick(&Display::bitplot);
+    }
+
+void Display::toRows(uint32_t bits25) {    
+    showbit=bits25;
+    paintStick(&Display::simplePlot);
+    }
+
+void Display::vertDecimal(uint8_t r0,uint8_t r1,uint8_t r2,uint8_t r3,uint8_t r4) {
+    vertDecimal(r0,r1,r2,r3,r4,false);
+    }
+
+void Display::vertDecimal(uint8_t r0,uint8_t r1,uint8_t r2,uint8_t r3,uint8_t r4, bool b15On) {
+    Ledrows lr(r0,r1,r2,r3,r4,b15On);
+    showbit = lr.all;
+    paintStick(&Display::simplePlot);
+    }
+
+void Display::vertClock(uint16_t minuts) {
+    uint8_t hours = minuts/60;
+    minuts -= 60*hours;
+    uint8_t h1 = hours/10;
+    uint8_t m1 = minuts/10;
+    vertDecimal(minuts-10*m1,m1,16,hours-10*h1,h1,false);
+}
+    
+void Display::vertSecClock(uint32_t seconds) {
+    uint8_t hours = seconds/3600;
+    uint8_t minuts = (seconds - 3600*hours)/60;
+    seconds -= 3600*hours+60*minuts;
+    uint8_t m1 = minuts/10;
+    int8_t s1 = seconds/10;
+    vertDecimal(seconds-10*s1,s1,minuts-10*m1,m1,hours,false);
+}
+    
+// private function 
+
+void Display::paintStick(bool(Display::*getState)(uint8_t)) {
+    for (int8_t pos = 0; pos < 25; pos++) {
+        bool value = (this->*getState)(pos);
+        if (stick[pos] != value) {
+            stick[pos] = value;
+            uDisplay.image.setPixelValue(
+                4 - pos % 5,4 - pos / 5,value ? 1 : 0);
+        }
+    }
+}
+
+bool Display::orPoint(uint8_t stickPos) {    
+    return showbit == stickPos ? 1 : stick[stickPos];
+    }
+
+bool Display::simplePlot(uint8_t stickPos) {
+    return ((1 << stickPos) & showbit) > 0 ? true : false;
+    }
+
+bool Display::bitplot(uint8_t stickPos) {
+    return stickPos < 5*(rowNr+1) && stickPos >= 5*rowNr  
+        ? (((1 << (stickPos-5*rowNr)) & showbit) > 0
+            ? true
+            : false)
+        : stick[stickPos];
+    }
+
+bool Display::lessCurLength(uint8_t num) {
+    return num < curLength;
+    }
+