displaying on SSD1306, 128x64 pixels OLED
Display.cpp@8:5972683a7190, 2020-02-24 (annotated)
- 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?
User | Revision | Line number | New 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 |