The space invaders replica (SIR) is console game project written in C++ programming language. The SIR is targeting and works on Outrageous Circuits RETRO game console developer platform. The game is written in C++ programming language using MBED online IDE and compiler.

Dependencies:   mbed

Committer:
mitko
Date:
Sun Jan 25 09:14:58 2015 +0000
Revision:
0:7dfc10b70a77
The space invaders replica (SIR) is console game project written in C++ programming language. The SIR is targeting and works on Outrageous Circuits RETRO game console developer platform. The game is written in C++ programming language using MBED onli

Who changed what in which revision?

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