Source code of my entry for Retro gaming contest (www.outrageouscircuits.com)

Dependencies:   MMA8453 mbed

Fork of LCD_DEMO by Chris Taylor

NOTE: I don't why mbed says that it's a fork form LCD_DEMO by Chris Taylor -> I don't use that library

SHAKE THE MAZE!!!

Shake your RETRO board and solve the maze!!! /media/uploads/gbr1mbed/dscn0738.jpg

Different maze everytime! /media/uploads/gbr1mbed/dscn0739.jpg

Here a case I built. /media/uploads/gbr1mbed/dscn0742.jpg

More details in main.cpp comments

video:

Committer:
gbr1mbed
Date:
Sun Mar 01 11:18:52 2015 +0000
Revision:
1:600980390cf7
Hello! this is my source for "Shake the Maze" game.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gbr1mbed 1:600980390cf7 1 #include "DisplayN18.h"
gbr1mbed 1:600980390cf7 2
gbr1mbed 1:600980390cf7 3 DisplayN18::DisplayN18() : resetPin(P0_20), backlightPin(P0_19), rsPin(P0_7), csPin(P0_2), spi(P0_21, P0_22, P1_15) {
gbr1mbed 1:600980390cf7 4 this->resetPin.write(false);
gbr1mbed 1:600980390cf7 5 this->backlightPin.write(true);
gbr1mbed 1:600980390cf7 6 this->rsPin.write(false);
gbr1mbed 1:600980390cf7 7
gbr1mbed 1:600980390cf7 8 this->spi.format(8, 3);
gbr1mbed 1:600980390cf7 9 this->spi.frequency(15000000);
gbr1mbed 1:600980390cf7 10
gbr1mbed 1:600980390cf7 11 this->initialize();
gbr1mbed 1:600980390cf7 12 }
gbr1mbed 1:600980390cf7 13
gbr1mbed 1:600980390cf7 14 void DisplayN18::writeCommand(unsigned char command) {
gbr1mbed 1:600980390cf7 15 this->rsPin.write(false);
gbr1mbed 1:600980390cf7 16
gbr1mbed 1:600980390cf7 17 this->csPin.write(false);
gbr1mbed 1:600980390cf7 18
gbr1mbed 1:600980390cf7 19 this->spi.write(command);
gbr1mbed 1:600980390cf7 20
gbr1mbed 1:600980390cf7 21 this->csPin.write(true);
gbr1mbed 1:600980390cf7 22 }
gbr1mbed 1:600980390cf7 23
gbr1mbed 1:600980390cf7 24 void DisplayN18::writeData(unsigned char data) {
gbr1mbed 1:600980390cf7 25 this->writeData(&data, 1);
gbr1mbed 1:600980390cf7 26 }
gbr1mbed 1:600980390cf7 27
gbr1mbed 1:600980390cf7 28 void DisplayN18::writeData(const unsigned char* data, unsigned int length) {
gbr1mbed 1:600980390cf7 29 this->rsPin.write(true);
gbr1mbed 1:600980390cf7 30
gbr1mbed 1:600980390cf7 31 this->csPin.write(false);
gbr1mbed 1:600980390cf7 32
gbr1mbed 1:600980390cf7 33 for (unsigned int i = 0; i < length; i++)
gbr1mbed 1:600980390cf7 34 this->spi.write(data[i]);
gbr1mbed 1:600980390cf7 35
gbr1mbed 1:600980390cf7 36 this->csPin.write(true);
gbr1mbed 1:600980390cf7 37 }
gbr1mbed 1:600980390cf7 38
gbr1mbed 1:600980390cf7 39 void DisplayN18::reset() {
gbr1mbed 1:600980390cf7 40 this->resetPin.write(false);
gbr1mbed 1:600980390cf7 41 wait_ms(300);
gbr1mbed 1:600980390cf7 42
gbr1mbed 1:600980390cf7 43 this->resetPin.write(true);
gbr1mbed 1:600980390cf7 44 wait_ms(500);
gbr1mbed 1:600980390cf7 45 }
gbr1mbed 1:600980390cf7 46
gbr1mbed 1:600980390cf7 47 void DisplayN18::initialize() {
gbr1mbed 1:600980390cf7 48 this->reset();
gbr1mbed 1:600980390cf7 49
gbr1mbed 1:600980390cf7 50 this->writeCommand(0x11);
gbr1mbed 1:600980390cf7 51
gbr1mbed 1:600980390cf7 52 wait_ms(120);
gbr1mbed 1:600980390cf7 53
gbr1mbed 1:600980390cf7 54 this->writeCommand(0xB1);
gbr1mbed 1:600980390cf7 55 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
gbr1mbed 1:600980390cf7 56 this->writeCommand(0xB2);
gbr1mbed 1:600980390cf7 57 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
gbr1mbed 1:600980390cf7 58 this->writeCommand(0xB3);
gbr1mbed 1:600980390cf7 59 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
gbr1mbed 1:600980390cf7 60 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
gbr1mbed 1:600980390cf7 61
gbr1mbed 1:600980390cf7 62 this->writeCommand(0xB4);
gbr1mbed 1:600980390cf7 63 this->writeData(0x07);
gbr1mbed 1:600980390cf7 64
gbr1mbed 1:600980390cf7 65 this->writeCommand(0xC0);
gbr1mbed 1:600980390cf7 66 this->writeData(0xA2); this->writeData(0x02); this->writeData(0x84);
gbr1mbed 1:600980390cf7 67 this->writeCommand(0xC1); this->writeData(0xC5);
gbr1mbed 1:600980390cf7 68 this->writeCommand(0xC2);
gbr1mbed 1:600980390cf7 69 this->writeData(0x0A); this->writeData(0x00);
gbr1mbed 1:600980390cf7 70 this->writeCommand(0xC3);
gbr1mbed 1:600980390cf7 71 this->writeData(0x8A); this->writeData(0x2A);
gbr1mbed 1:600980390cf7 72 this->writeCommand(0xC4);
gbr1mbed 1:600980390cf7 73 this->writeData(0x8A); this->writeData(0xEE);
gbr1mbed 1:600980390cf7 74
gbr1mbed 1:600980390cf7 75 this->writeCommand(0xC5);
gbr1mbed 1:600980390cf7 76 this->writeData(0x0E);
gbr1mbed 1:600980390cf7 77
gbr1mbed 1:600980390cf7 78 this->writeCommand(0x36);
gbr1mbed 1:600980390cf7 79 this->writeData(0xA8);
gbr1mbed 1:600980390cf7 80
gbr1mbed 1:600980390cf7 81 this->writeCommand(0xe0);
gbr1mbed 1:600980390cf7 82 this->writeData(0x0f); this->writeData(0x1a);
gbr1mbed 1:600980390cf7 83 this->writeData(0x0f); this->writeData(0x18);
gbr1mbed 1:600980390cf7 84 this->writeData(0x2f); this->writeData(0x28);
gbr1mbed 1:600980390cf7 85 this->writeData(0x20); this->writeData(0x22);
gbr1mbed 1:600980390cf7 86 this->writeData(0x1f); this->writeData(0x1b);
gbr1mbed 1:600980390cf7 87 this->writeData(0x23); this->writeData(0x37); this->writeData(0x00);
gbr1mbed 1:600980390cf7 88 this->writeData(0x07);
gbr1mbed 1:600980390cf7 89 this->writeData(0x02); this->writeData(0x10);
gbr1mbed 1:600980390cf7 90
gbr1mbed 1:600980390cf7 91 this->writeCommand(0xe1);
gbr1mbed 1:600980390cf7 92 this->writeData(0x0f); this->writeData(0x1b);
gbr1mbed 1:600980390cf7 93 this->writeData(0x0f); this->writeData(0x17);
gbr1mbed 1:600980390cf7 94 this->writeData(0x33); this->writeData(0x2c);
gbr1mbed 1:600980390cf7 95 this->writeData(0x29); this->writeData(0x2e);
gbr1mbed 1:600980390cf7 96 this->writeData(0x30); this->writeData(0x30);
gbr1mbed 1:600980390cf7 97 this->writeData(0x39); this->writeData(0x3f);
gbr1mbed 1:600980390cf7 98 this->writeData(0x00); this->writeData(0x07);
gbr1mbed 1:600980390cf7 99 this->writeData(0x03); this->writeData(0x10);
gbr1mbed 1:600980390cf7 100
gbr1mbed 1:600980390cf7 101 this->writeCommand(0x2a);
gbr1mbed 1:600980390cf7 102 this->writeData(0x00); this->writeData(0x00);
gbr1mbed 1:600980390cf7 103 this->writeData(0x00); this->writeData(0x7f);
gbr1mbed 1:600980390cf7 104 this->writeCommand(0x2b);
gbr1mbed 1:600980390cf7 105 this->writeData(0x00); this->writeData(0x00);
gbr1mbed 1:600980390cf7 106 this->writeData(0x00); this->writeData(0x9f);
gbr1mbed 1:600980390cf7 107
gbr1mbed 1:600980390cf7 108 this->writeCommand(0xF0);
gbr1mbed 1:600980390cf7 109 this->writeData(0x01);
gbr1mbed 1:600980390cf7 110 this->writeCommand(0xF6);
gbr1mbed 1:600980390cf7 111 this->writeData(0x00);
gbr1mbed 1:600980390cf7 112
gbr1mbed 1:600980390cf7 113 this->writeCommand(0x3A);
gbr1mbed 1:600980390cf7 114 this->writeData(0x05);
gbr1mbed 1:600980390cf7 115
gbr1mbed 1:600980390cf7 116 this->writeCommand(0x29);
gbr1mbed 1:600980390cf7 117
gbr1mbed 1:600980390cf7 118 this->clear();
gbr1mbed 1:600980390cf7 119 }
gbr1mbed 1:600980390cf7 120
gbr1mbed 1:600980390cf7 121 void DisplayN18::setClippingArea(unsigned char x, unsigned char y, unsigned char width, unsigned char height) {
gbr1mbed 1:600980390cf7 122 unsigned char data[4] = { 0x00, 0x00, 0x00, 0x00 };
gbr1mbed 1:600980390cf7 123
gbr1mbed 1:600980390cf7 124 data[1] = x;
gbr1mbed 1:600980390cf7 125 data[3] = x + width;
gbr1mbed 1:600980390cf7 126 this->writeCommand(0x2A);
gbr1mbed 1:600980390cf7 127 this->writeData(data, 4);
gbr1mbed 1:600980390cf7 128
gbr1mbed 1:600980390cf7 129 data[1] = y;
gbr1mbed 1:600980390cf7 130 data[3] = y + height;
gbr1mbed 1:600980390cf7 131 this->writeCommand(0x2B);
gbr1mbed 1:600980390cf7 132 this->writeData(data, 4);
gbr1mbed 1:600980390cf7 133 }
gbr1mbed 1:600980390cf7 134
gbr1mbed 1:600980390cf7 135 unsigned short DisplayN18::rgbToShort(unsigned char r, unsigned char g, unsigned char b) {
gbr1mbed 1:600980390cf7 136 unsigned short red = r;
gbr1mbed 1:600980390cf7 137 unsigned short green = g;
gbr1mbed 1:600980390cf7 138 unsigned short blue = b;
gbr1mbed 1:600980390cf7 139
gbr1mbed 1:600980390cf7 140 red /= 8;
gbr1mbed 1:600980390cf7 141 green /= 4;
gbr1mbed 1:600980390cf7 142 blue /= 8;
gbr1mbed 1:600980390cf7 143
gbr1mbed 1:600980390cf7 144 red &= 0x1F;
gbr1mbed 1:600980390cf7 145 green &= 0x3F;
gbr1mbed 1:600980390cf7 146 blue &= 0x1F;
gbr1mbed 1:600980390cf7 147
gbr1mbed 1:600980390cf7 148 red <<= 3;
gbr1mbed 1:600980390cf7 149 blue <<= 8;
gbr1mbed 1:600980390cf7 150 green = ((green & 0x7) << 13) + ((green & 0x38) >> 3);
gbr1mbed 1:600980390cf7 151
gbr1mbed 1:600980390cf7 152 return red | green | blue;
gbr1mbed 1:600980390cf7 153 }
gbr1mbed 1:600980390cf7 154
gbr1mbed 1:600980390cf7 155 void DisplayN18::clear(unsigned short backColor) {
gbr1mbed 1:600980390cf7 156 for (unsigned int i = 0; i < DisplayN18::WIDTH; i += 10)
gbr1mbed 1:600980390cf7 157 for (unsigned int j = 0; j < DisplayN18::HEIGHT; j += 8)
gbr1mbed 1:600980390cf7 158 this->fillRect(i, j, 10, 8, backColor);
gbr1mbed 1:600980390cf7 159 }
gbr1mbed 1:600980390cf7 160
gbr1mbed 1:600980390cf7 161 void DisplayN18::draw(const unsigned short* data, int x, int y, int width, int height) {
gbr1mbed 1:600980390cf7 162 this->setClippingArea(x, y, width - 1, height - 1);
gbr1mbed 1:600980390cf7 163 this->writeCommand(0x2C);
gbr1mbed 1:600980390cf7 164 this->writeData(reinterpret_cast<const unsigned char*>(data), width * height * 2);
gbr1mbed 1:600980390cf7 165 }
gbr1mbed 1:600980390cf7 166
gbr1mbed 1:600980390cf7 167 void DisplayN18::setPixel(int x, int y, unsigned short foreColor) {
gbr1mbed 1:600980390cf7 168 this->draw(&foreColor, x, y, 1, 1);
gbr1mbed 1:600980390cf7 169 }
gbr1mbed 1:600980390cf7 170
gbr1mbed 1:600980390cf7 171 void DisplayN18::fillRect(int x, int y, int width, int height, unsigned short foreColor) {
gbr1mbed 1:600980390cf7 172 this->setClippingArea(static_cast<unsigned char>(x), static_cast<unsigned char>(y), static_cast<unsigned char>(width - 1), static_cast<unsigned char>(height));
gbr1mbed 1:600980390cf7 173
gbr1mbed 1:600980390cf7 174 this->writeCommand(0x2C);
gbr1mbed 1:600980390cf7 175
gbr1mbed 1:600980390cf7 176 unsigned short buffer[50];
gbr1mbed 1:600980390cf7 177 for (int j = 0; j < sizeof(buffer) / 2; j++)
gbr1mbed 1:600980390cf7 178 buffer[j] = foreColor;
gbr1mbed 1:600980390cf7 179
gbr1mbed 1:600980390cf7 180 this->rsPin.write(true);
gbr1mbed 1:600980390cf7 181
gbr1mbed 1:600980390cf7 182 int i;
gbr1mbed 1:600980390cf7 183 for (i = sizeof(buffer); i < height * width * 2; i += sizeof(buffer))
gbr1mbed 1:600980390cf7 184 this->writeData(reinterpret_cast<unsigned char*>(buffer), sizeof(buffer));
gbr1mbed 1:600980390cf7 185
gbr1mbed 1:600980390cf7 186 i -= sizeof(buffer);
gbr1mbed 1:600980390cf7 187 if (i != height * width * 2)
gbr1mbed 1:600980390cf7 188 this->writeData(reinterpret_cast<unsigned char*>(buffer), height * width * 2 - i);
gbr1mbed 1:600980390cf7 189 }
gbr1mbed 1:600980390cf7 190
gbr1mbed 1:600980390cf7 191 void DisplayN18::drawRect(int x, int y, int width, int height, unsigned short foreColor) {
gbr1mbed 1:600980390cf7 192 this->drawLine(x, y, x + width, y, foreColor);
gbr1mbed 1:600980390cf7 193 this->drawLine(x, y + height, x + width, y + height, foreColor);
gbr1mbed 1:600980390cf7 194 this->drawLine(x, y, x, y + height, foreColor);
gbr1mbed 1:600980390cf7 195 this->drawLine(x + width, y, x + width, y + height, foreColor);
gbr1mbed 1:600980390cf7 196 }
gbr1mbed 1:600980390cf7 197
gbr1mbed 1:600980390cf7 198 void DisplayN18::fillCircle(int x, int y, int radius, unsigned short foreColor) {
gbr1mbed 1:600980390cf7 199 int f = 1 - radius;
gbr1mbed 1:600980390cf7 200 int dd_f_x = 1;
gbr1mbed 1:600980390cf7 201 int dd_f_y = -2 * radius;
gbr1mbed 1:600980390cf7 202 int x1 = 0;
gbr1mbed 1:600980390cf7 203 int y1 = radius;
gbr1mbed 1:600980390cf7 204
gbr1mbed 1:600980390cf7 205 for (int i = y - radius; i <= y + radius; i++)
gbr1mbed 1:600980390cf7 206 this->setPixel(x, i, foreColor);
gbr1mbed 1:600980390cf7 207
gbr1mbed 1:600980390cf7 208 while (x1 < y1) {
gbr1mbed 1:600980390cf7 209 if (f >= 0) {
gbr1mbed 1:600980390cf7 210 y1--;
gbr1mbed 1:600980390cf7 211 dd_f_y += 2;
gbr1mbed 1:600980390cf7 212 f += dd_f_y;
gbr1mbed 1:600980390cf7 213 }
gbr1mbed 1:600980390cf7 214
gbr1mbed 1:600980390cf7 215 x1++;
gbr1mbed 1:600980390cf7 216 dd_f_x += 2;
gbr1mbed 1:600980390cf7 217 f += dd_f_x;
gbr1mbed 1:600980390cf7 218
gbr1mbed 1:600980390cf7 219 for (int i = y - y1; i <= y + y1; i++) {
gbr1mbed 1:600980390cf7 220 this->setPixel(x + x1, i, foreColor);
gbr1mbed 1:600980390cf7 221 this->setPixel(x - x1, i, foreColor);
gbr1mbed 1:600980390cf7 222 }
gbr1mbed 1:600980390cf7 223
gbr1mbed 1:600980390cf7 224 for (int i = y - x1; i <= y + x1; i++) {
gbr1mbed 1:600980390cf7 225 this->setPixel(x + y1, i, foreColor);
gbr1mbed 1:600980390cf7 226 this->setPixel(x - y1, i, foreColor);
gbr1mbed 1:600980390cf7 227 }
gbr1mbed 1:600980390cf7 228 }
gbr1mbed 1:600980390cf7 229 }
gbr1mbed 1:600980390cf7 230
gbr1mbed 1:600980390cf7 231 void DisplayN18::drawCircle(int x, int y, int radius, unsigned short foreColor) {
gbr1mbed 1:600980390cf7 232 int f = 1 - radius;
gbr1mbed 1:600980390cf7 233 int dd_f_x = 1;
gbr1mbed 1:600980390cf7 234 int dd_f_y = -2 * radius;
gbr1mbed 1:600980390cf7 235 int x1 = 0;
gbr1mbed 1:600980390cf7 236 int y1 = radius;
gbr1mbed 1:600980390cf7 237
gbr1mbed 1:600980390cf7 238 this->setPixel(x, y + radius, foreColor);
gbr1mbed 1:600980390cf7 239 this->setPixel(x, y - radius, foreColor);
gbr1mbed 1:600980390cf7 240 this->setPixel(x + radius, y, foreColor);
gbr1mbed 1:600980390cf7 241 this->setPixel(x - radius, y, foreColor);
gbr1mbed 1:600980390cf7 242
gbr1mbed 1:600980390cf7 243 while (x1 < y1) {
gbr1mbed 1:600980390cf7 244 if (f >= 0) {
gbr1mbed 1:600980390cf7 245 y1--;
gbr1mbed 1:600980390cf7 246 dd_f_y += 2;
gbr1mbed 1:600980390cf7 247 f += dd_f_y;
gbr1mbed 1:600980390cf7 248 }
gbr1mbed 1:600980390cf7 249
gbr1mbed 1:600980390cf7 250 x1++;
gbr1mbed 1:600980390cf7 251 dd_f_x += 2;
gbr1mbed 1:600980390cf7 252 f += dd_f_x;
gbr1mbed 1:600980390cf7 253
gbr1mbed 1:600980390cf7 254 this->setPixel(x + x1, y + y1, foreColor);
gbr1mbed 1:600980390cf7 255 this->setPixel(x - x1, y + y1, foreColor);
gbr1mbed 1:600980390cf7 256 this->setPixel(x + x1, y - y1, foreColor);
gbr1mbed 1:600980390cf7 257 this->setPixel(x - x1, y - y1, foreColor);
gbr1mbed 1:600980390cf7 258
gbr1mbed 1:600980390cf7 259 this->setPixel(x + y1, y + x1, foreColor);
gbr1mbed 1:600980390cf7 260 this->setPixel(x - y1, y + x1, foreColor);
gbr1mbed 1:600980390cf7 261 this->setPixel(x + y1, y - x1, foreColor);
gbr1mbed 1:600980390cf7 262 this->setPixel(x - y1, y - x1, foreColor);
gbr1mbed 1:600980390cf7 263 }
gbr1mbed 1:600980390cf7 264 }
gbr1mbed 1:600980390cf7 265
gbr1mbed 1:600980390cf7 266 void DisplayN18::drawLine(int x0, int y0, int x1, int y1, unsigned short foreColor) {
gbr1mbed 1:600980390cf7 267 if (x0 == x1) {
gbr1mbed 1:600980390cf7 268 if (y1 < y0) {
gbr1mbed 1:600980390cf7 269 int temp = y0;
gbr1mbed 1:600980390cf7 270 y0 = y1;
gbr1mbed 1:600980390cf7 271 y1 = temp;
gbr1mbed 1:600980390cf7 272 }
gbr1mbed 1:600980390cf7 273
gbr1mbed 1:600980390cf7 274 this->setClippingArea(static_cast<unsigned char>(x0), static_cast<unsigned char>(y0), 0, static_cast<unsigned char>(y1 - y0 - 1));
gbr1mbed 1:600980390cf7 275 this->writeCommand(0x2C);
gbr1mbed 1:600980390cf7 276
gbr1mbed 1:600980390cf7 277 unsigned short data[DisplayN18::STEP];
gbr1mbed 1:600980390cf7 278 for (int i = 0; i < DisplayN18::STEP; i++)
gbr1mbed 1:600980390cf7 279 data[i] = foreColor;
gbr1mbed 1:600980390cf7 280
gbr1mbed 1:600980390cf7 281 for (unsigned char thisY = y0; thisY < y1; thisY += DisplayN18::STEP)
gbr1mbed 1:600980390cf7 282 this->writeData(reinterpret_cast<unsigned char*>(data), (thisY + DisplayN18::STEP <= y1 ? DisplayN18::STEP : y1 - thisY) * 2);
gbr1mbed 1:600980390cf7 283
gbr1mbed 1:600980390cf7 284 return;
gbr1mbed 1:600980390cf7 285 }
gbr1mbed 1:600980390cf7 286
gbr1mbed 1:600980390cf7 287 if (y0 == y1) {
gbr1mbed 1:600980390cf7 288 if (x1 < x0) {
gbr1mbed 1:600980390cf7 289 int temp = x0;
gbr1mbed 1:600980390cf7 290 x0 = x1;
gbr1mbed 1:600980390cf7 291 x1 = temp;
gbr1mbed 1:600980390cf7 292 }
gbr1mbed 1:600980390cf7 293
gbr1mbed 1:600980390cf7 294 this->setClippingArea(static_cast<unsigned char>(x0), static_cast<unsigned char>(y0), static_cast<unsigned char>(x1 - x0 - 1), 0);
gbr1mbed 1:600980390cf7 295 this->writeCommand(0x2C);
gbr1mbed 1:600980390cf7 296
gbr1mbed 1:600980390cf7 297 unsigned short data[DisplayN18::STEP];
gbr1mbed 1:600980390cf7 298 for (int i = 0; i < DisplayN18::STEP; i++)
gbr1mbed 1:600980390cf7 299 data[i] = foreColor;
gbr1mbed 1:600980390cf7 300
gbr1mbed 1:600980390cf7 301 for (unsigned char thisX = x0; thisX < x1; thisX += DisplayN18::STEP)
gbr1mbed 1:600980390cf7 302 this->writeData(reinterpret_cast<unsigned char*>(data), (thisX + DisplayN18::STEP <= x1 ? DisplayN18::STEP : x1 - thisX) * 2);
gbr1mbed 1:600980390cf7 303
gbr1mbed 1:600980390cf7 304 return;
gbr1mbed 1:600980390cf7 305 }
gbr1mbed 1:600980390cf7 306
gbr1mbed 1:600980390cf7 307 int t;
gbr1mbed 1:600980390cf7 308 bool steep = ((y1 - y0) < 0 ? -(y1 - y0) : (y1 - y0)) > ((x1 - x0) < 0 ? -(x1 - x0) : (x1 - x0));
gbr1mbed 1:600980390cf7 309
gbr1mbed 1:600980390cf7 310 if (steep) {
gbr1mbed 1:600980390cf7 311 t = x0;
gbr1mbed 1:600980390cf7 312 x0 = y0;
gbr1mbed 1:600980390cf7 313 y0 = t;
gbr1mbed 1:600980390cf7 314 t = x1;
gbr1mbed 1:600980390cf7 315 x1 = y1;
gbr1mbed 1:600980390cf7 316 y1 = t;
gbr1mbed 1:600980390cf7 317 }
gbr1mbed 1:600980390cf7 318
gbr1mbed 1:600980390cf7 319 if (x0 > x1) {
gbr1mbed 1:600980390cf7 320 t = x0;
gbr1mbed 1:600980390cf7 321 x0 = x1;
gbr1mbed 1:600980390cf7 322 x1 = t;
gbr1mbed 1:600980390cf7 323
gbr1mbed 1:600980390cf7 324 t = y0;
gbr1mbed 1:600980390cf7 325 y0 = y1;
gbr1mbed 1:600980390cf7 326 y1 = t;
gbr1mbed 1:600980390cf7 327 }
gbr1mbed 1:600980390cf7 328
gbr1mbed 1:600980390cf7 329 int dx, dy;
gbr1mbed 1:600980390cf7 330 dx = x1 - x0;
gbr1mbed 1:600980390cf7 331 dy = (y1 - y0) < 0 ? -(y1 - y0) : (y1 - y0);
gbr1mbed 1:600980390cf7 332
gbr1mbed 1:600980390cf7 333 int err = (dx / 2);
gbr1mbed 1:600980390cf7 334 int ystep;
gbr1mbed 1:600980390cf7 335
gbr1mbed 1:600980390cf7 336 ystep = y0 < y1 ? 1 : -1;
gbr1mbed 1:600980390cf7 337
gbr1mbed 1:600980390cf7 338 for (; x0 < x1; x0++) {
gbr1mbed 1:600980390cf7 339 if (steep)
gbr1mbed 1:600980390cf7 340 this->setPixel(y0, x0, foreColor);
gbr1mbed 1:600980390cf7 341 else
gbr1mbed 1:600980390cf7 342 this->setPixel(x0, y0, foreColor);
gbr1mbed 1:600980390cf7 343
gbr1mbed 1:600980390cf7 344 err -= dy;
gbr1mbed 1:600980390cf7 345
gbr1mbed 1:600980390cf7 346 if (err < 0) {
gbr1mbed 1:600980390cf7 347 y0 += (char)ystep;
gbr1mbed 1:600980390cf7 348 err += dx;
gbr1mbed 1:600980390cf7 349 }
gbr1mbed 1:600980390cf7 350 }
gbr1mbed 1:600980390cf7 351 }
gbr1mbed 1:600980390cf7 352
gbr1mbed 1:600980390cf7 353 unsigned char characters[95 * 5] = {
gbr1mbed 1:600980390cf7 354 0x00, 0x00, 0x00, 0x00, 0x00, /* Space 0x20 */
gbr1mbed 1:600980390cf7 355 0x00, 0x00, 0x4f, 0x00, 0x00, /* ! */
gbr1mbed 1:600980390cf7 356 0x00, 0x07, 0x00, 0x07, 0x00, /* " */
gbr1mbed 1:600980390cf7 357 0x14, 0x7f, 0x14, 0x7f, 0x14, /* # */
gbr1mbed 1:600980390cf7 358 0x24, 0x2a, 0x7f, 0x2a, 0x12, /* $ */
gbr1mbed 1:600980390cf7 359 0x23, 0x13, 0x08, 0x64, 0x62, /* % */
gbr1mbed 1:600980390cf7 360 0x36, 0x49, 0x55, 0x22, 0x20, /* & */
gbr1mbed 1:600980390cf7 361 0x00, 0x05, 0x03, 0x00, 0x00, /* ' */
gbr1mbed 1:600980390cf7 362 0x00, 0x1c, 0x22, 0x41, 0x00, /* ( */
gbr1mbed 1:600980390cf7 363 0x00, 0x41, 0x22, 0x1c, 0x00, /* ) */
gbr1mbed 1:600980390cf7 364 0x14, 0x08, 0x3e, 0x08, 0x14, /* // */
gbr1mbed 1:600980390cf7 365 0x08, 0x08, 0x3e, 0x08, 0x08, /* + */
gbr1mbed 1:600980390cf7 366 0x50, 0x30, 0x00, 0x00, 0x00, /* , */
gbr1mbed 1:600980390cf7 367 0x08, 0x08, 0x08, 0x08, 0x08, /* - */
gbr1mbed 1:600980390cf7 368 0x00, 0x60, 0x60, 0x00, 0x00, /* . */
gbr1mbed 1:600980390cf7 369 0x20, 0x10, 0x08, 0x04, 0x02, /* / */
gbr1mbed 1:600980390cf7 370 0x3e, 0x51, 0x49, 0x45, 0x3e, /* 0 0x30 */
gbr1mbed 1:600980390cf7 371 0x00, 0x42, 0x7f, 0x40, 0x00, /* 1 */
gbr1mbed 1:600980390cf7 372 0x42, 0x61, 0x51, 0x49, 0x46, /* 2 */
gbr1mbed 1:600980390cf7 373 0x21, 0x41, 0x45, 0x4b, 0x31, /* 3 */
gbr1mbed 1:600980390cf7 374 0x18, 0x14, 0x12, 0x7f, 0x10, /* 4 */
gbr1mbed 1:600980390cf7 375 0x27, 0x45, 0x45, 0x45, 0x39, /* 5 */
gbr1mbed 1:600980390cf7 376 0x3c, 0x4a, 0x49, 0x49, 0x30, /* 6 */
gbr1mbed 1:600980390cf7 377 0x01, 0x71, 0x09, 0x05, 0x03, /* 7 */
gbr1mbed 1:600980390cf7 378 0x36, 0x49, 0x49, 0x49, 0x36, /* 8 */
gbr1mbed 1:600980390cf7 379 0x06, 0x49, 0x49, 0x29, 0x1e, /* 9 */
gbr1mbed 1:600980390cf7 380 0x00, 0x36, 0x36, 0x00, 0x00, /* : */
gbr1mbed 1:600980390cf7 381 0x00, 0x56, 0x36, 0x00, 0x00, /* ; */
gbr1mbed 1:600980390cf7 382 0x08, 0x14, 0x22, 0x41, 0x00, /* < */
gbr1mbed 1:600980390cf7 383 0x14, 0x14, 0x14, 0x14, 0x14, /* = */
gbr1mbed 1:600980390cf7 384 0x00, 0x41, 0x22, 0x14, 0x08, /* > */
gbr1mbed 1:600980390cf7 385 0x02, 0x01, 0x51, 0x09, 0x06, /* ? */
gbr1mbed 1:600980390cf7 386 0x3e, 0x41, 0x5d, 0x55, 0x1e, /* @ 0x40 */
gbr1mbed 1:600980390cf7 387 0x7e, 0x11, 0x11, 0x11, 0x7e, /* A */
gbr1mbed 1:600980390cf7 388 0x7f, 0x49, 0x49, 0x49, 0x36, /* B */
gbr1mbed 1:600980390cf7 389 0x3e, 0x41, 0x41, 0x41, 0x22, /* C */
gbr1mbed 1:600980390cf7 390 0x7f, 0x41, 0x41, 0x22, 0x1c, /* D */
gbr1mbed 1:600980390cf7 391 0x7f, 0x49, 0x49, 0x49, 0x41, /* E */
gbr1mbed 1:600980390cf7 392 0x7f, 0x09, 0x09, 0x09, 0x01, /* F */
gbr1mbed 1:600980390cf7 393 0x3e, 0x41, 0x49, 0x49, 0x7a, /* G */
gbr1mbed 1:600980390cf7 394 0x7f, 0x08, 0x08, 0x08, 0x7f, /* H */
gbr1mbed 1:600980390cf7 395 0x00, 0x41, 0x7f, 0x41, 0x00, /* I */
gbr1mbed 1:600980390cf7 396 0x20, 0x40, 0x41, 0x3f, 0x01, /* J */
gbr1mbed 1:600980390cf7 397 0x7f, 0x08, 0x14, 0x22, 0x41, /* K */
gbr1mbed 1:600980390cf7 398 0x7f, 0x40, 0x40, 0x40, 0x40, /* L */
gbr1mbed 1:600980390cf7 399 0x7f, 0x02, 0x0c, 0x02, 0x7f, /* M */
gbr1mbed 1:600980390cf7 400 0x7f, 0x04, 0x08, 0x10, 0x7f, /* N */
gbr1mbed 1:600980390cf7 401 0x3e, 0x41, 0x41, 0x41, 0x3e, /* O */
gbr1mbed 1:600980390cf7 402 0x7f, 0x09, 0x09, 0x09, 0x06, /* P 0x50 */
gbr1mbed 1:600980390cf7 403 0x3e, 0x41, 0x51, 0x21, 0x5e, /* Q */
gbr1mbed 1:600980390cf7 404 0x7f, 0x09, 0x19, 0x29, 0x46, /* R */
gbr1mbed 1:600980390cf7 405 0x26, 0x49, 0x49, 0x49, 0x32, /* S */
gbr1mbed 1:600980390cf7 406 0x01, 0x01, 0x7f, 0x01, 0x01, /* T */
gbr1mbed 1:600980390cf7 407 0x3f, 0x40, 0x40, 0x40, 0x3f, /* U */
gbr1mbed 1:600980390cf7 408 0x1f, 0x20, 0x40, 0x20, 0x1f, /* V */
gbr1mbed 1:600980390cf7 409 0x3f, 0x40, 0x38, 0x40, 0x3f, /* W */
gbr1mbed 1:600980390cf7 410 0x63, 0x14, 0x08, 0x14, 0x63, /* X */
gbr1mbed 1:600980390cf7 411 0x07, 0x08, 0x70, 0x08, 0x07, /* Y */
gbr1mbed 1:600980390cf7 412 0x61, 0x51, 0x49, 0x45, 0x43, /* Z */
gbr1mbed 1:600980390cf7 413 0x00, 0x7f, 0x41, 0x41, 0x00, /* [ */
gbr1mbed 1:600980390cf7 414 0x02, 0x04, 0x08, 0x10, 0x20, /* \ */
gbr1mbed 1:600980390cf7 415 0x00, 0x41, 0x41, 0x7f, 0x00, /* ] */
gbr1mbed 1:600980390cf7 416 0x04, 0x02, 0x01, 0x02, 0x04, /* ^ */
gbr1mbed 1:600980390cf7 417 0x40, 0x40, 0x40, 0x40, 0x40, /* _ */
gbr1mbed 1:600980390cf7 418 0x00, 0x00, 0x03, 0x05, 0x00, /* ` 0x60 */
gbr1mbed 1:600980390cf7 419 0x20, 0x54, 0x54, 0x54, 0x78, /* a */
gbr1mbed 1:600980390cf7 420 0x7F, 0x44, 0x44, 0x44, 0x38, /* b */
gbr1mbed 1:600980390cf7 421 0x38, 0x44, 0x44, 0x44, 0x44, /* c */
gbr1mbed 1:600980390cf7 422 0x38, 0x44, 0x44, 0x44, 0x7f, /* d */
gbr1mbed 1:600980390cf7 423 0x38, 0x54, 0x54, 0x54, 0x18, /* e */
gbr1mbed 1:600980390cf7 424 0x04, 0x04, 0x7e, 0x05, 0x05, /* f */
gbr1mbed 1:600980390cf7 425 0x08, 0x54, 0x54, 0x54, 0x3c, /* g */
gbr1mbed 1:600980390cf7 426 0x7f, 0x08, 0x04, 0x04, 0x78, /* h */
gbr1mbed 1:600980390cf7 427 0x00, 0x44, 0x7d, 0x40, 0x00, /* i */
gbr1mbed 1:600980390cf7 428 0x20, 0x40, 0x44, 0x3d, 0x00, /* j */
gbr1mbed 1:600980390cf7 429 0x7f, 0x10, 0x28, 0x44, 0x00, /* k */
gbr1mbed 1:600980390cf7 430 0x00, 0x41, 0x7f, 0x40, 0x00, /* l */
gbr1mbed 1:600980390cf7 431 0x7c, 0x04, 0x7c, 0x04, 0x78, /* m */
gbr1mbed 1:600980390cf7 432 0x7c, 0x08, 0x04, 0x04, 0x78, /* n */
gbr1mbed 1:600980390cf7 433 0x38, 0x44, 0x44, 0x44, 0x38, /* o */
gbr1mbed 1:600980390cf7 434 0x7c, 0x14, 0x14, 0x14, 0x08, /* p 0x70 */
gbr1mbed 1:600980390cf7 435 0x08, 0x14, 0x14, 0x14, 0x7c, /* q */
gbr1mbed 1:600980390cf7 436 0x7c, 0x08, 0x04, 0x04, 0x00, /* r */
gbr1mbed 1:600980390cf7 437 0x48, 0x54, 0x54, 0x54, 0x24, /* s */
gbr1mbed 1:600980390cf7 438 0x04, 0x04, 0x3f, 0x44, 0x44, /* t */
gbr1mbed 1:600980390cf7 439 0x3c, 0x40, 0x40, 0x20, 0x7c, /* u */
gbr1mbed 1:600980390cf7 440 0x1c, 0x20, 0x40, 0x20, 0x1c, /* v */
gbr1mbed 1:600980390cf7 441 0x3c, 0x40, 0x30, 0x40, 0x3c, /* w */
gbr1mbed 1:600980390cf7 442 0x44, 0x28, 0x10, 0x28, 0x44, /* x */
gbr1mbed 1:600980390cf7 443 0x0c, 0x50, 0x50, 0x50, 0x3c, /* y */
gbr1mbed 1:600980390cf7 444 0x44, 0x64, 0x54, 0x4c, 0x44, /* z */
gbr1mbed 1:600980390cf7 445 0x08, 0x36, 0x41, 0x41, 0x00, /* { */
gbr1mbed 1:600980390cf7 446 0x00, 0x00, 0x77, 0x00, 0x00, /* | */
gbr1mbed 1:600980390cf7 447 0x00, 0x41, 0x41, 0x36, 0x08, /* } */
gbr1mbed 1:600980390cf7 448 0x08, 0x08, 0x2a, 0x1c, 0x08 /* ~ */
gbr1mbed 1:600980390cf7 449 };
gbr1mbed 1:600980390cf7 450
gbr1mbed 1:600980390cf7 451 void DisplayN18::drawCharacter(int x, int y, const char character, unsigned short foreColor, unsigned short backColor, unsigned char fontSize) {
gbr1mbed 1:600980390cf7 452 if (character > 126 || character < 32)
gbr1mbed 1:600980390cf7 453 return;
gbr1mbed 1:600980390cf7 454
gbr1mbed 1:600980390cf7 455 unsigned short* horizontal = new unsigned short[DisplayN18::CHAR_HEIGHT * fontSize];
gbr1mbed 1:600980390cf7 456 for (int i = 0; i < DisplayN18::CHAR_WIDTH; i++) {
gbr1mbed 1:600980390cf7 457 for (int j = 0; j < DisplayN18::CHAR_HEIGHT; j++)
gbr1mbed 1:600980390cf7 458 for (int k = 0; k < fontSize; k++)
gbr1mbed 1:600980390cf7 459 horizontal[j * fontSize + k] = characters[(character - 32) * 5 + i] & (1 << j) ? foreColor : backColor;
gbr1mbed 1:600980390cf7 460
gbr1mbed 1:600980390cf7 461 for (int k = 0; k < fontSize; k++)
gbr1mbed 1:600980390cf7 462 this->draw(horizontal, x + i * fontSize + k, y, 1, DisplayN18::CHAR_HEIGHT * fontSize);
gbr1mbed 1:600980390cf7 463 }
gbr1mbed 1:600980390cf7 464
gbr1mbed 1:600980390cf7 465 for (int i = 0; i < DisplayN18::CHAR_HEIGHT; i++)
gbr1mbed 1:600980390cf7 466 for (int k = 0; k < fontSize; k++)
gbr1mbed 1:600980390cf7 467 horizontal[i * fontSize + k] = backColor;
gbr1mbed 1:600980390cf7 468
gbr1mbed 1:600980390cf7 469 for (int k = 0; k < fontSize; k++)
gbr1mbed 1:600980390cf7 470 this->draw(horizontal, x + DisplayN18::CHAR_WIDTH * fontSize + k, y, 1, DisplayN18::CHAR_HEIGHT * fontSize);
gbr1mbed 1:600980390cf7 471
gbr1mbed 1:600980390cf7 472 delete[] horizontal;
gbr1mbed 1:600980390cf7 473 }
gbr1mbed 1:600980390cf7 474
gbr1mbed 1:600980390cf7 475 void DisplayN18::drawString(int x, int y, const char* str, unsigned short foreColor, unsigned short backColor, unsigned char fontSize) {
gbr1mbed 1:600980390cf7 476 if (*str == '\0')
gbr1mbed 1:600980390cf7 477 return;
gbr1mbed 1:600980390cf7 478
gbr1mbed 1:600980390cf7 479 do {
gbr1mbed 1:600980390cf7 480 this->drawCharacter(x, y, *str, foreColor, backColor, fontSize);
gbr1mbed 1:600980390cf7 481
gbr1mbed 1:600980390cf7 482 x += (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) * fontSize;
gbr1mbed 1:600980390cf7 483 } while (*(++str) != '\0');
gbr1mbed 1:600980390cf7 484 }