displaying on SSD1306, 128x64 pixels OLED

Dependencies:   microbit

Committer:
bvirk
Date:
Mon Feb 24 18:31:22 2020 +0000
Revision:
8:5972683a7190
Parent:
7:7b225c565fe6
Child:
9:d15f84b277f3
class header doc copied to cpp files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bvirk 6:c69f08f464b5 1 #include "MicroBit.h"
bvirk 6:c69f08f464b5 2 #include "Display.h"
bvirk 6:c69f08f464b5 3
bvirk 8:5972683a7190 4 /**
bvirk 8:5972683a7190 5 * When constructed from MicroBit's MicroBitDisplay of a not yet initialized
bvirk 8:5972683a7190 6 * MicroBit object - that must be done before using the Display instance.
bvirk 8:5972683a7190 7 */
bvirk 6:c69f08f464b5 8 Display::Display(MicroBitDisplay & uDpl) : uDisplay(uDpl) {
bvirk 7:7b225c565fe6 9 clearStick();
bvirk 6:c69f08f464b5 10 }
bvirk 8:5972683a7190 11
bvirk 8:5972683a7190 12 /**
bvirk 8:5972683a7190 13 * clears the display and is buffer
bvirk 8:5972683a7190 14 */
bvirk 7:7b225c565fe6 15 void Display::clear() {
bvirk 7:7b225c565fe6 16 uDisplay.image.clear();
bvirk 7:7b225c565fe6 17 clearStick();
bvirk 6:c69f08f464b5 18 }
bvirk 6:c69f08f464b5 19
bvirk 8:5972683a7190 20 /**
bvirk 8:5972683a7190 21 * the stick is a binary representaion of the led display
bvirk 8:5972683a7190 22 * @param size in range [0,24]
bvirk 8:5972683a7190 23 */
bvirk 6:c69f08f464b5 24 void Display::setStick(uint8_t length) {
bvirk 6:c69f08f464b5 25 curLength = length;
bvirk 6:c69f08f464b5 26 paintStick(&Display::lessCurLength);
bvirk 6:c69f08f464b5 27 }
bvirk 6:c69f08f464b5 28
bvirk 8:5972683a7190 29 /**
bvirk 8:5972683a7190 30 * Set a single dot
bvirk 8:5972683a7190 31 *
bvirk 8:5972683a7190 32 * @param position in [0,24] for showing that single dot.
bvirk 8:5972683a7190 33 */
bvirk 6:c69f08f464b5 34 void Display::setFlag(uint8_t position) {
bvirk 6:c69f08f464b5 35 showbit = position;
bvirk 6:c69f08f464b5 36 paintStick(&Display::orPoint);
bvirk 6:c69f08f464b5 37 }
bvirk 6:c69f08f464b5 38
bvirk 8:5972683a7190 39 /**
bvirk 8:5972683a7190 40 * Puts a bitpattern in a row
bvirk 8:5972683a7190 41 *
bvirk 8:5972683a7190 42 * @param rowNr in [0,4] for selected row
bvirk 8:5972683a7190 43 * @param rowContent in [0,31] to be shown binary
bvirk 8:5972683a7190 44 */
bvirk 6:c69f08f464b5 45 void Display::toRow(uint8_t rowNr, uint8_t rowContent) {
bvirk 6:c69f08f464b5 46 this->rowNr=rowNr;
bvirk 6:c69f08f464b5 47 showbit=rowContent;
bvirk 6:c69f08f464b5 48 paintStick(&Display::bitplot);
bvirk 6:c69f08f464b5 49 }
bvirk 6:c69f08f464b5 50
bvirk 8:5972683a7190 51 /**
bvirk 8:5972683a7190 52 * 25 bits showed in display as a whole.
bvirk 8:5972683a7190 53 *
bvirk 8:5972683a7190 54 * @param allBits contains the 25 bit to be showed
bvirk 8:5972683a7190 55 */
bvirk 6:c69f08f464b5 56 void Display::toRows(uint32_t bits25) {
bvirk 6:c69f08f464b5 57 showbit=bits25;
bvirk 6:c69f08f464b5 58 paintStick(&Display::simplePlot);
bvirk 6:c69f08f464b5 59 }
bvirk 6:c69f08f464b5 60
bvirk 8:5972683a7190 61 /**
bvirk 8:5972683a7190 62 * Vertdecimal is intended for showing a single number in [00000,99999],
bvirk 8:5972683a7190 63 * vertical read from top to bottom.
bvirk 8:5972683a7190 64 *
bvirk 8:5972683a7190 65 * @param r0 bottom row - row 0
bvirk 8:5972683a7190 66 * @param r1 row 1
bvirk 8:5972683a7190 67 * @param r2 row 2
bvirk 8:5972683a7190 68 * @param r3 row 3
bvirk 8:5972683a7190 69 * @param r4 top row - row 4
bvirk 8:5972683a7190 70 */
bvirk 6:c69f08f464b5 71 void Display::vertDecimal(uint8_t r0,uint8_t r1,uint8_t r2,uint8_t r3,uint8_t r4) {
bvirk 6:c69f08f464b5 72 vertDecimal(r0,r1,r2,r3,r4,false);
bvirk 6:c69f08f464b5 73 }
bvirk 6:c69f08f464b5 74
bvirk 8:5972683a7190 75 /**
bvirk 8:5972683a7190 76 * Vertdecimal is intended for showing a single number in [00000,99999],
bvirk 8:5972683a7190 77 * vertical read from top to bottom.
bvirk 8:5972683a7190 78 *
bvirk 8:5972683a7190 79 * @param r0 bottom row - row 0
bvirk 8:5972683a7190 80 * @param r1 row 1
bvirk 8:5972683a7190 81 * @param r2 row 2
bvirk 8:5972683a7190 82 * @param r3 row 3
bvirk 8:5972683a7190 83 * @param r4 top row - row 4
bvirk 8:5972683a7190 84 * @param leftDotOn turns left dot on. leftdot is not used to represent a digit in base 10 numbers.
bvirk 8:5972683a7190 85 */
bvirk 6:c69f08f464b5 86 void Display::vertDecimal(uint8_t r0,uint8_t r1,uint8_t r2,uint8_t r3,uint8_t r4, bool b15On) {
bvirk 6:c69f08f464b5 87 Ledrows lr(r0,r1,r2,r3,r4,b15On);
bvirk 6:c69f08f464b5 88 showbit = lr.all;
bvirk 6:c69f08f464b5 89 paintStick(&Display::simplePlot);
bvirk 6:c69f08f464b5 90 }
bvirk 6:c69f08f464b5 91
bvirk 8:5972683a7190 92 /**
bvirk 8:5972683a7190 93 * binary Clock, hours in top rows (4 for multiplum of 10, 3 for remainer)
bvirk 8:5972683a7190 94 * minuts in bottom rows (1 for multiplum of 10, 0 for remainer)
bvirk 8:5972683a7190 95 *
bvirk 8:5972683a7190 96 * @param minuts of the day
bvirk 8:5972683a7190 97 */
bvirk 6:c69f08f464b5 98 void Display::vertClock(uint16_t minuts) {
bvirk 6:c69f08f464b5 99 uint8_t hours = minuts/60;
bvirk 6:c69f08f464b5 100 minuts -= 60*hours;
bvirk 6:c69f08f464b5 101 uint8_t h1 = hours/10;
bvirk 6:c69f08f464b5 102 uint8_t m1 = minuts/10;
bvirk 6:c69f08f464b5 103 vertDecimal(minuts-10*m1,m1,16,hours-10*h1,h1,false);
bvirk 6:c69f08f464b5 104 }
bvirk 6:c69f08f464b5 105
bvirk 8:5972683a7190 106 /**
bvirk 8:5972683a7190 107 * binary Clock, hours in top rows (4)
bvirk 8:5972683a7190 108 * minuts in rows 3 and 2 (3 for multiplum of 10, 2 for remainer)
bvirk 8:5972683a7190 109 * seconds in rows 1 and 0 (1 for multiplum of 10, 0 for remainer)
bvirk 8:5972683a7190 110 * @param second of the day
bvirk 8:5972683a7190 111 */
bvirk 6:c69f08f464b5 112 void Display::vertSecClock(uint32_t seconds) {
bvirk 6:c69f08f464b5 113 uint8_t hours = seconds/3600;
bvirk 6:c69f08f464b5 114 uint8_t minuts = (seconds - 3600*hours)/60;
bvirk 6:c69f08f464b5 115 seconds -= 3600*hours+60*minuts;
bvirk 6:c69f08f464b5 116 uint8_t m1 = minuts/10;
bvirk 6:c69f08f464b5 117 int8_t s1 = seconds/10;
bvirk 6:c69f08f464b5 118 vertDecimal(seconds-10*s1,s1,minuts-10*m1,m1,hours,false);
bvirk 6:c69f08f464b5 119 }
bvirk 6:c69f08f464b5 120
bvirk 6:c69f08f464b5 121 // private function
bvirk 6:c69f08f464b5 122
bvirk 6:c69f08f464b5 123 void Display::paintStick(bool(Display::*getState)(uint8_t)) {
bvirk 6:c69f08f464b5 124 for (int8_t pos = 0; pos < 25; pos++) {
bvirk 6:c69f08f464b5 125 bool value = (this->*getState)(pos);
bvirk 6:c69f08f464b5 126 if (stick[pos] != value) {
bvirk 6:c69f08f464b5 127 stick[pos] = value;
bvirk 6:c69f08f464b5 128 uDisplay.image.setPixelValue(
bvirk 6:c69f08f464b5 129 4 - pos % 5,4 - pos / 5,value ? 1 : 0);
bvirk 6:c69f08f464b5 130 }
bvirk 6:c69f08f464b5 131 }
bvirk 6:c69f08f464b5 132 }
bvirk 6:c69f08f464b5 133
bvirk 7:7b225c565fe6 134 void Display::clearStick() {
bvirk 7:7b225c565fe6 135 for (uint8_t i = 0 ; i < 25; i++)
bvirk 7:7b225c565fe6 136 stick[i]=false;
bvirk 7:7b225c565fe6 137 }
bvirk 7:7b225c565fe6 138
bvirk 6:c69f08f464b5 139 bool Display::orPoint(uint8_t stickPos) {
bvirk 6:c69f08f464b5 140 return showbit == stickPos ? 1 : stick[stickPos];
bvirk 6:c69f08f464b5 141 }
bvirk 6:c69f08f464b5 142
bvirk 6:c69f08f464b5 143 bool Display::simplePlot(uint8_t stickPos) {
bvirk 6:c69f08f464b5 144 return ((1 << stickPos) & showbit) > 0 ? true : false;
bvirk 6:c69f08f464b5 145 }
bvirk 6:c69f08f464b5 146
bvirk 6:c69f08f464b5 147 bool Display::bitplot(uint8_t stickPos) {
bvirk 6:c69f08f464b5 148 return stickPos < 5*(rowNr+1) && stickPos >= 5*rowNr
bvirk 6:c69f08f464b5 149 ? (((1 << (stickPos-5*rowNr)) & showbit) > 0
bvirk 6:c69f08f464b5 150 ? true
bvirk 6:c69f08f464b5 151 : false)
bvirk 6:c69f08f464b5 152 : stick[stickPos];
bvirk 6:c69f08f464b5 153 }
bvirk 6:c69f08f464b5 154
bvirk 6:c69f08f464b5 155 bool Display::lessCurLength(uint8_t num) {
bvirk 6:c69f08f464b5 156 return num < curLength;
bvirk 6:c69f08f464b5 157 }
bvirk 6:c69f08f464b5 158