displaying on SSD1306, 128x64 pixels OLED

Dependencies:   microbit

Committer:
bvirk
Date:
Mon Feb 24 18:44:22 2020 +0000
Revision:
9:d15f84b277f3
Parent:
8:5972683a7190
Child:
10:8bf77efd1579
some param class documentation

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