Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of el17ajf by
Graphics/Graphics.cpp@29:d59fbe128d1f, 2019-04-13 (annotated)
- Committer:
- el17ajf
- Date:
- Sat Apr 13 08:33:49 2019 +0000
- Revision:
- 29:d59fbe128d1f
- Parent:
- 28:e09b7ac11dea
- Child:
- 30:11838cb6979f
fixed hidden height zone
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el17ajf | 5:3efbdcb3efaf | 1 | #include "Graphics.h" |
el17ajf | 17:cc448ab7266f | 2 | #include "Grid.h" |
el17ajf | 29:d59fbe128d1f | 3 | #include "Math.h" |
el17ajf | 5:3efbdcb3efaf | 4 | |
el17ajf | 14:53d2167d7c9a | 5 | namespace Graphics { |
el17ajf | 14:53d2167d7c9a | 6 | |
el17ajf | 28:e09b7ac11dea | 7 | // "private" methods |
el17ajf | 28:e09b7ac11dea | 8 | void drawPoint(int x, int y); |
el17ajf | 28:e09b7ac11dea | 9 | void drawLine(int x1, int y1, int x2, int y2); |
el17ajf | 28:e09b7ac11dea | 10 | void drawBox(int x1, int y1, int x2, int y2); |
el17ajf | 28:e09b7ac11dea | 11 | void drawDottedLine(int x1, int y1, int x2, int y2); |
el17ajf | 28:e09b7ac11dea | 12 | bool lightOn; |
el17ajf | 28:e09b7ac11dea | 13 | |
el17ajf | 28:e09b7ac11dea | 14 | int offsetX = 0, offsetY = 0; |
el17ajf | 28:e09b7ac11dea | 15 | |
el17ajf | 17:cc448ab7266f | 16 | namespace LCD { |
el17ajf | 29:d59fbe128d1f | 17 | const int MAX_X = 83; |
el17ajf | 17:cc448ab7266f | 18 | const int MAX_Y = 47; |
el17ajf | 17:cc448ab7266f | 19 | |
el17ajf | 17:cc448ab7266f | 20 | N5110 * lcd; |
el17ajf | 17:cc448ab7266f | 21 | |
el17ajf | 17:cc448ab7266f | 22 | int YToLcdX(int y) { |
el17ajf | 29:d59fbe128d1f | 23 | int lcdX = y + offsetY; |
el17ajf | 29:d59fbe128d1f | 24 | |
el17ajf | 29:d59fbe128d1f | 25 | if (lcdX < 0) |
el17ajf | 29:d59fbe128d1f | 26 | return 0; |
el17ajf | 29:d59fbe128d1f | 27 | else if (lcdX > MAX_X) |
el17ajf | 29:d59fbe128d1f | 28 | return MAX_X; |
el17ajf | 29:d59fbe128d1f | 29 | else |
el17ajf | 29:d59fbe128d1f | 30 | return lcdX; |
el17ajf | 17:cc448ab7266f | 31 | } |
el17ajf | 17:cc448ab7266f | 32 | |
el17ajf | 17:cc448ab7266f | 33 | int XToLcdY(int x) { |
el17ajf | 29:d59fbe128d1f | 34 | int lcdY = MAX_Y - x + offsetX; |
el17ajf | 29:d59fbe128d1f | 35 | |
el17ajf | 29:d59fbe128d1f | 36 | if (lcdY < 0) |
el17ajf | 29:d59fbe128d1f | 37 | return 0; |
el17ajf | 29:d59fbe128d1f | 38 | else if (lcdY > MAX_Y) |
el17ajf | 29:d59fbe128d1f | 39 | return MAX_Y; |
el17ajf | 29:d59fbe128d1f | 40 | else |
el17ajf | 29:d59fbe128d1f | 41 | return lcdY; |
el17ajf | 17:cc448ab7266f | 42 | } |
el17ajf | 17:cc448ab7266f | 43 | }; |
el17ajf | 14:53d2167d7c9a | 44 | |
el17ajf | 14:53d2167d7c9a | 45 | void init() { |
el17ajf | 17:cc448ab7266f | 46 | LCD::lcd = new N5110(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); |
el17ajf | 17:cc448ab7266f | 47 | LCD::lcd->init(); |
el17ajf | 17:cc448ab7266f | 48 | LCD::lcd->setContrast(0.5); |
el17ajf | 17:cc448ab7266f | 49 | LCD::lcd->setBrightness(0); |
el17ajf | 26:baa7077449e7 | 50 | lightOn = false; |
el17ajf | 14:53d2167d7c9a | 51 | } |
el17ajf | 14:53d2167d7c9a | 52 | |
el17ajf | 14:53d2167d7c9a | 53 | void deinit() { |
el17ajf | 17:cc448ab7266f | 54 | delete LCD::lcd; |
el17ajf | 14:53d2167d7c9a | 55 | } |
el17ajf | 14:53d2167d7c9a | 56 | |
el17ajf | 14:53d2167d7c9a | 57 | void clear() { |
el17ajf | 17:cc448ab7266f | 58 | LCD::lcd->clear(); |
el17ajf | 14:53d2167d7c9a | 59 | } |
el17ajf | 14:53d2167d7c9a | 60 | |
el17ajf | 14:53d2167d7c9a | 61 | void render() { |
el17ajf | 29:d59fbe128d1f | 62 | offsetX = Math::lerp(offsetX, 0, 0.1); |
el17ajf | 29:d59fbe128d1f | 63 | offsetY = Math::lerp(offsetY, 0, 0.1); |
el17ajf | 17:cc448ab7266f | 64 | LCD::lcd->refresh(); |
el17ajf | 14:53d2167d7c9a | 65 | } |
el17ajf | 14:53d2167d7c9a | 66 | |
el17ajf | 26:baa7077449e7 | 67 | void toggleLight() { |
el17ajf | 26:baa7077449e7 | 68 | lightOn = !lightOn; |
el17ajf | 26:baa7077449e7 | 69 | LCD::lcd->setBrightness(lightOn ? 1 : 0); |
el17ajf | 26:baa7077449e7 | 70 | } |
el17ajf | 26:baa7077449e7 | 71 | |
el17ajf | 14:53d2167d7c9a | 72 | void drawPoint(int x, int y) { |
el17ajf | 17:cc448ab7266f | 73 | LCD::lcd->setPixel( |
el17ajf | 17:cc448ab7266f | 74 | LCD::YToLcdX(y), |
el17ajf | 17:cc448ab7266f | 75 | LCD::XToLcdY(x), |
el17ajf | 17:cc448ab7266f | 76 | true |
el17ajf | 17:cc448ab7266f | 77 | ); |
el17ajf | 14:53d2167d7c9a | 78 | } |
el17ajf | 14:53d2167d7c9a | 79 | |
el17ajf | 14:53d2167d7c9a | 80 | void drawLine(int x1, int y1, int x2, int y2) { |
el17ajf | 17:cc448ab7266f | 81 | LCD::lcd->drawLine( |
el17ajf | 17:cc448ab7266f | 82 | LCD::YToLcdX(y1), |
el17ajf | 17:cc448ab7266f | 83 | LCD::XToLcdY(x1), |
el17ajf | 17:cc448ab7266f | 84 | LCD::YToLcdX(y2), |
el17ajf | 17:cc448ab7266f | 85 | LCD::XToLcdY(x2), |
el17ajf | 17:cc448ab7266f | 86 | 1 // not dotted |
el17ajf | 17:cc448ab7266f | 87 | ); |
el17ajf | 14:53d2167d7c9a | 88 | } |
el17ajf | 5:3efbdcb3efaf | 89 | |
el17ajf | 14:53d2167d7c9a | 90 | void drawDottedLine(int x1, int y1, int x2, int y2) { |
el17ajf | 17:cc448ab7266f | 91 | LCD::lcd->drawLine( |
el17ajf | 17:cc448ab7266f | 92 | LCD::YToLcdX(y1), |
el17ajf | 17:cc448ab7266f | 93 | LCD::XToLcdY(x1), |
el17ajf | 17:cc448ab7266f | 94 | LCD::YToLcdX(y2), |
el17ajf | 17:cc448ab7266f | 95 | LCD::XToLcdY(x2), |
el17ajf | 14:53d2167d7c9a | 96 | 2 // dotted |
el17ajf | 14:53d2167d7c9a | 97 | ); |
el17ajf | 14:53d2167d7c9a | 98 | } |
el17ajf | 14:53d2167d7c9a | 99 | |
el17ajf | 14:53d2167d7c9a | 100 | void drawBox(int x1, int y1, int x2, int y2) { |
el17ajf | 14:53d2167d7c9a | 101 | drawLine(x1, y1, x2, y1); |
el17ajf | 14:53d2167d7c9a | 102 | drawLine(x2, y1, x2, y2); |
el17ajf | 14:53d2167d7c9a | 103 | drawLine(x2, y2, x1, y2); |
el17ajf | 14:53d2167d7c9a | 104 | drawLine(x1, y2, x1, y1); |
el17ajf | 14:53d2167d7c9a | 105 | } |
el17ajf | 8:5066ce13a430 | 106 | |
el17ajf | 17:cc448ab7266f | 107 | namespace Game { |
el17ajf | 17:cc448ab7266f | 108 | int getBlockSize() { |
el17ajf | 17:cc448ab7266f | 109 | int blockWidth = SCREEN_WIDTH / Grid::GRID_WIDTH; |
el17ajf | 29:d59fbe128d1f | 110 | int blockHeight = SCREEN_HEIGHT / (Grid::GRID_HEIGHT - Grid::HIDDEN_HEIGHT); |
el17ajf | 17:cc448ab7266f | 111 | return blockWidth < blockHeight ? blockWidth : blockHeight; |
el17ajf | 17:cc448ab7266f | 112 | } |
el17ajf | 17:cc448ab7266f | 113 | |
el17ajf | 17:cc448ab7266f | 114 | int getBorderSizeX(int blockSize) { |
el17ajf | 18:24ce897024d0 | 115 | return (SCREEN_WIDTH - Grid::GRID_WIDTH * blockSize) / 2; |
el17ajf | 17:cc448ab7266f | 116 | } |
el17ajf | 17:cc448ab7266f | 117 | |
el17ajf | 17:cc448ab7266f | 118 | int getBorderSizeY(int blockSize) { |
el17ajf | 29:d59fbe128d1f | 119 | return (SCREEN_HEIGHT - (Grid::GRID_HEIGHT - Grid::HIDDEN_HEIGHT) * blockSize) / 2; |
el17ajf | 17:cc448ab7266f | 120 | } |
el17ajf | 17:cc448ab7266f | 121 | |
el17ajf | 17:cc448ab7266f | 122 | int BLOCK_SIZE = getBlockSize(); |
el17ajf | 17:cc448ab7266f | 123 | int BORDER_SIZE_X = getBorderSizeX(BLOCK_SIZE); |
el17ajf | 17:cc448ab7266f | 124 | int BORDER_SIZE_Y = getBorderSizeY(BLOCK_SIZE); |
el17ajf | 17:cc448ab7266f | 125 | |
el17ajf | 17:cc448ab7266f | 126 | int gridYToY(int grid_y) { |
el17ajf | 29:d59fbe128d1f | 127 | return (grid_y - Grid::HIDDEN_HEIGHT) * BLOCK_SIZE + BORDER_SIZE_Y; |
el17ajf | 17:cc448ab7266f | 128 | } |
el17ajf | 17:cc448ab7266f | 129 | |
el17ajf | 17:cc448ab7266f | 130 | int gridXToX(int grid_x) { |
el17ajf | 17:cc448ab7266f | 131 | return grid_x * BLOCK_SIZE + BORDER_SIZE_X; |
el17ajf | 17:cc448ab7266f | 132 | } |
el17ajf | 17:cc448ab7266f | 133 | |
el17ajf | 17:cc448ab7266f | 134 | void drawBlock(int grid_x, int grid_y) { |
el17ajf | 17:cc448ab7266f | 135 | // screen coords |
el17ajf | 17:cc448ab7266f | 136 | int x = gridXToX(grid_x); |
el17ajf | 17:cc448ab7266f | 137 | int y = gridYToY(grid_y); |
el17ajf | 17:cc448ab7266f | 138 | drawBox(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); |
el17ajf | 25:bf47fe41883a | 139 | } |
el17ajf | 25:bf47fe41883a | 140 | |
el17ajf | 25:bf47fe41883a | 141 | void drawStripedBlock(int grid_x, int grid_y) { |
el17ajf | 25:bf47fe41883a | 142 | // screen coords |
el17ajf | 25:bf47fe41883a | 143 | int x = gridXToX(grid_x); |
el17ajf | 25:bf47fe41883a | 144 | int y = gridYToY(grid_y); |
el17ajf | 25:bf47fe41883a | 145 | drawBox(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); |
el17ajf | 25:bf47fe41883a | 146 | drawLine(x, y, x + BLOCK_SIZE - 1, y + BLOCK_SIZE - 1); |
el17ajf | 17:cc448ab7266f | 147 | } |
el17ajf | 17:cc448ab7266f | 148 | |
el17ajf | 17:cc448ab7266f | 149 | void drawBorder() { |
el17ajf | 22:0a474f074553 | 150 | int minX = gridXToX(0) - 1; |
el17ajf | 22:0a474f074553 | 151 | int maxX = gridXToX(Grid::GRID_WIDTH - 1) + BLOCK_SIZE - 1 + 1; |
el17ajf | 22:0a474f074553 | 152 | int minY = gridYToY(0) - 1; |
el17ajf | 22:0a474f074553 | 153 | int maxY = gridYToY(Grid::GRID_HEIGHT - 1) + BLOCK_SIZE - 1 + 1; |
el17ajf | 17:cc448ab7266f | 154 | |
el17ajf | 17:cc448ab7266f | 155 | drawDottedLine(minX, minY, minX, maxY); |
el17ajf | 17:cc448ab7266f | 156 | drawDottedLine(minX, maxY, maxX, maxY); |
el17ajf | 17:cc448ab7266f | 157 | drawDottedLine(maxX, maxY, maxX, minY); |
el17ajf | 17:cc448ab7266f | 158 | } |
el17ajf | 28:e09b7ac11dea | 159 | |
el17ajf | 29:d59fbe128d1f | 160 | void shake(int dx, int dy) { |
el17ajf | 29:d59fbe128d1f | 161 | offsetX += dx; |
el17ajf | 29:d59fbe128d1f | 162 | offsetY += dy; |
el17ajf | 28:e09b7ac11dea | 163 | } |
el17ajf | 17:cc448ab7266f | 164 | }; |
el17ajf | 17:cc448ab7266f | 165 | |
el17ajf | 17:cc448ab7266f | 166 | namespace UI { |
el17ajf | 17:cc448ab7266f | 167 | void drawBorder(int x1, int y1, int x2, int y2) { |
el17ajf | 17:cc448ab7266f | 168 | drawBox(x1, y1, x2, y2); |
el17ajf | 17:cc448ab7266f | 169 | } |
el17ajf | 16:3f84f2d7b910 | 170 | |
el17ajf | 17:cc448ab7266f | 171 | void drawChar(int x, int y, char c); |
el17ajf | 17:cc448ab7266f | 172 | |
el17ajf | 17:cc448ab7266f | 173 | void drawText(int x, int y, const char * text) { |
el17ajf | 17:cc448ab7266f | 174 | for (int i = 0; text[i] != '\0'; i++) { |
el17ajf | 17:cc448ab7266f | 175 | drawChar(x + i * (CHAR_WIDTH + CHAR_SPACE), y, text[i]); |
el17ajf | 17:cc448ab7266f | 176 | } |
el17ajf | 17:cc448ab7266f | 177 | } |
el17ajf | 14:53d2167d7c9a | 178 | |
el17ajf | 17:cc448ab7266f | 179 | void drawChar(int x, int y, char c) { |
el17ajf | 17:cc448ab7266f | 180 | int binc = 0b1111111111111111111111111111; |
el17ajf | 17:cc448ab7266f | 181 | |
el17ajf | 17:cc448ab7266f | 182 | switch (c) { |
el17ajf | 17:cc448ab7266f | 183 | case 'a': case 'A': binc = 0b0000011010011001011100000000; break; |
el17ajf | 17:cc448ab7266f | 184 | case 'b': case 'B': binc = 0b1000111010011001111100000000; break; |
el17ajf | 17:cc448ab7266f | 185 | case 'c': case 'C': binc = 0b0000011110001000111100000000; break; |
el17ajf | 17:cc448ab7266f | 186 | case 'd': case 'D': binc = 0b0001011110011001111100000000; break; |
el17ajf | 17:cc448ab7266f | 187 | case 'e': case 'E': binc = 0b0000111110011000011000000000; break; |
el17ajf | 17:cc448ab7266f | 188 | case 'f': case 'F': binc = 0b0000001101000100011101000000; break; |
el17ajf | 17:cc448ab7266f | 189 | case 'g': case 'G': binc = 0b0000011110011001111100010110; break; |
el17ajf | 17:cc448ab7266f | 190 | case 'h': case 'H': binc = 0b1000111010011001100100000000; break; |
el17ajf | 17:cc448ab7266f | 191 | case 'i': case 'I': binc = 0b0100000001000100001000000000; break; |
el17ajf | 17:cc448ab7266f | 192 | case 'j': case 'J': binc = 0b0010000000100010001001000000; break; |
el17ajf | 17:cc448ab7266f | 193 | case 'k': case 'K': binc = 0b1000101011001010101000000000; break; |
el17ajf | 17:cc448ab7266f | 194 | case 'l': case 'L': binc = 0b0100010001000100001000000000; break; |
el17ajf | 17:cc448ab7266f | 195 | case 'm': case 'M': binc = 0b0000111110111001100100000000; break; |
el17ajf | 17:cc448ab7266f | 196 | case 'n': case 'N': binc = 0b0000111010011001100100000000; break; |
el17ajf | 17:cc448ab7266f | 197 | case 'o': case 'O': binc = 0b0000111110011001111100000000; break; |
el17ajf | 17:cc448ab7266f | 198 | case 'p': case 'P': binc = 0b0000111010011001111110000000; break; |
el17ajf | 17:cc448ab7266f | 199 | case 'q': case 'Q': binc = 0b0000011110011001111100010001; break; |
el17ajf | 17:cc448ab7266f | 200 | case 'r': case 'R': binc = 0b0000001001000100010000000000; break; |
el17ajf | 17:cc448ab7266f | 201 | case 's': case 'S': binc = 0b0000011111000011111000000000; break; |
el17ajf | 17:cc448ab7266f | 202 | case 't': case 'T': binc = 0b0100111001000100001000000000; break; |
el17ajf | 17:cc448ab7266f | 203 | case 'u': case 'U': binc = 0b0000100110011001011100000000; break; |
el17ajf | 17:cc448ab7266f | 204 | case 'v': case 'V': binc = 0b0000100110011001011000000000; break; |
el17ajf | 17:cc448ab7266f | 205 | case 'w': case 'W': binc = 0b0000100110011011111100000000; break; |
el17ajf | 17:cc448ab7266f | 206 | case 'x': case 'X': binc = 0b0000100101000010100100000000; break; |
el17ajf | 17:cc448ab7266f | 207 | case 'y': case 'Y': binc = 0b0000100110011001011100010110; break; |
el17ajf | 17:cc448ab7266f | 208 | case 'z': case 'Z': binc = 0b0000111000111100011100000000; break; |
el17ajf | 19:370d83a8dc33 | 209 | case '0': binc = 0b0111100110011001111000000000; break; |
el17ajf | 19:370d83a8dc33 | 210 | case '1': binc = 0b0010011000100010011100000000; break; |
el17ajf | 19:370d83a8dc33 | 211 | case '2': binc = 0b1110000100100100111100000000; break; |
el17ajf | 19:370d83a8dc33 | 212 | case '3': binc = 0b1110000101100001111000000000; break; |
el17ajf | 20:cd96f98f5f79 | 213 | case '4': binc = 0b1001100101110001000100000000; break; |
el17ajf | 20:cd96f98f5f79 | 214 | case '5': binc = 0b1111100001100001111000000000; break; |
el17ajf | 19:370d83a8dc33 | 215 | case '6': binc = 0b0110100011101001011100000000; break; |
el17ajf | 20:cd96f98f5f79 | 216 | case '7': binc = 0b1111000100100010001000000000; break; |
el17ajf | 20:cd96f98f5f79 | 217 | case '8': binc = 0b0110100101101001011000000000; break; |
el17ajf | 19:370d83a8dc33 | 218 | case '9': binc = 0b0111100101110001000100000000; break; |
el17ajf | 19:370d83a8dc33 | 219 | case '-': binc = 0b0000000011110000000000000000; break; |
el17ajf | 20:cd96f98f5f79 | 220 | case '+': binc = 0b0000001001110010000000000000; break; |
el17ajf | 17:cc448ab7266f | 221 | case '!': binc = 0b0010001000100000001000000000; break; |
el17ajf | 20:cd96f98f5f79 | 222 | case '.': binc = 0b0000000000000000100000000000; break; |
el17ajf | 17:cc448ab7266f | 223 | case ' ': binc = 0b0000000000000000000000000000; break; |
el17ajf | 17:cc448ab7266f | 224 | default: break; |
el17ajf | 17:cc448ab7266f | 225 | } |
el17ajf | 17:cc448ab7266f | 226 | |
el17ajf | 17:cc448ab7266f | 227 | for (int n = 0; n <= 27; n++) { |
el17ajf | 17:cc448ab7266f | 228 | if (binc & 0b1000000000000000000000000000 >> n) { |
el17ajf | 17:cc448ab7266f | 229 | int dx = n % CHAR_WIDTH; |
el17ajf | 17:cc448ab7266f | 230 | int dy = n / CHAR_WIDTH; |
el17ajf | 17:cc448ab7266f | 231 | drawPoint(x + dx, y + dy); |
el17ajf | 17:cc448ab7266f | 232 | } |
el17ajf | 17:cc448ab7266f | 233 | } |
el17ajf | 17:cc448ab7266f | 234 | } |
el17ajf | 17:cc448ab7266f | 235 | }; |
el17ajf | 14:53d2167d7c9a | 236 | }; |