EPD display library. Check this version (it should work)

Fork of GDEP015OC1 by Jurica Resetar

Committer:
jurica238814
Date:
Fri Nov 24 16:47:56 2017 +0000
Revision:
10:73cf09a74996
Parent:
9:e4e77e840b1f
Some changes...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anunnaki 3:dc7b794b59b7 1 /**
Anunnaki 3:dc7b794b59b7 2 * Created by Filip Hormot (f.hormot@gmail.com) on 14/09/16.
Anunnaki 3:dc7b794b59b7 3 */
Anunnaki 1:4fff95e316c9 4 #include "mbed.h"
Anunnaki 1:4fff95e316c9 5 #include "GDEP015OC1.h"
Anunnaki 3:dc7b794b59b7 6 #include "5x7.h"
Anunnaki 1:4fff95e316c9 7
jurica238814 10:73cf09a74996 8 #define EPD_WAIT_CONSTANT 10
jurica238814 8:5ae728fa8820 9
Anunnaki 2:1c8f73aa2a16 10 static const unsigned char _lutFull[] = {
Anunnaki 2:1c8f73aa2a16 11 0x02, 0x02, 0x01, 0x11, 0x12, 0x12, 0x22, 0x22, 0x66, 0x69, 0x69, 0x59, 0x58, 0x99, 0x99,
Anunnaki 2:1c8f73aa2a16 12 0x88, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xB4, 0x13, 0x51, 0x35, 0x51, 0x51, 0x19, 0x01, 0x00
Anunnaki 2:1c8f73aa2a16 13 };
Anunnaki 2:1c8f73aa2a16 14
Anunnaki 7:70c58d3cbc8b 15 static const unsigned char _lutPart[] = {
Anunnaki 7:70c58d3cbc8b 16 0x10, 0x18, 0x18, 0x08, 0x18, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Anunnaki 7:70c58d3cbc8b 17 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x14, 0x44, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
Anunnaki 7:70c58d3cbc8b 18 };
Anunnaki 7:70c58d3cbc8b 19
Anunnaki 2:1c8f73aa2a16 20 GDEP015OC1::GDEP015OC1(SPI& spi, PinName cs=p5, PinName dc=p6, PinName rst=p7, PinName busy=p8) : _spi(spi), _cs(cs), _dc(dc), _rst(rst), _busy(busy){
Anunnaki 6:45d2ec037fd6 21 _bold = true;
Anunnaki 6:45d2ec037fd6 22 _italic = false;
Anunnaki 1:4fff95e316c9 23 _init();
Anunnaki 1:4fff95e316c9 24 }
Anunnaki 1:4fff95e316c9 25
Anunnaki 2:1c8f73aa2a16 26 void GDEP015OC1::_spiCommand(unsigned char command){
Anunnaki 2:1c8f73aa2a16 27 _cs = _dc = 0;
Anunnaki 2:1c8f73aa2a16 28 wait_us(1);
Anunnaki 2:1c8f73aa2a16 29
Anunnaki 2:1c8f73aa2a16 30 _spi.write(command);
Anunnaki 2:1c8f73aa2a16 31 }
Anunnaki 2:1c8f73aa2a16 32
Anunnaki 2:1c8f73aa2a16 33 void GDEP015OC1::_spiData(unsigned char data){
Anunnaki 2:1c8f73aa2a16 34 _cs = 0;
Anunnaki 2:1c8f73aa2a16 35 _dc = 1;
Anunnaki 2:1c8f73aa2a16 36 wait_us(1);
Anunnaki 2:1c8f73aa2a16 37
Anunnaki 2:1c8f73aa2a16 38 _spi.write(data);
Anunnaki 2:1c8f73aa2a16 39 }
Anunnaki 2:1c8f73aa2a16 40
Anunnaki 2:1c8f73aa2a16 41 void GDEP015OC1::_init(void){
Anunnaki 2:1c8f73aa2a16 42 _rst = _cs = 1;
Anunnaki 3:dc7b794b59b7 43 empty();
Anunnaki 1:4fff95e316c9 44 }
Anunnaki 1:4fff95e316c9 45
jurica238814 9:e4e77e840b1f 46
Anunnaki 7:70c58d3cbc8b 47 void GDEP015OC1::_wakeUp(bool partial){
Anunnaki 2:1c8f73aa2a16 48 _rst = 0;
jurica238814 8:5ae728fa8820 49 wait_ms(EPD_WAIT_CONSTANT);
Anunnaki 2:1c8f73aa2a16 50 _rst = 1;
jurica238814 8:5ae728fa8820 51 wait_ms(EPD_WAIT_CONSTANT);
Anunnaki 1:4fff95e316c9 52
Anunnaki 2:1c8f73aa2a16 53 //Stage 3
Anunnaki 2:1c8f73aa2a16 54 //Driver Output control
Anunnaki 2:1c8f73aa2a16 55 _spiCommand(0x01);
jurica238814 9:e4e77e840b1f 56 _spiData(0xC7); // (yDot-1)%256
jurica238814 9:e4e77e840b1f 57 _spiData(0x00); // (yDot-1)/256
jurica238814 9:e4e77e840b1f 58 _spiData(0x00); // 0x00
jurica238814 9:e4e77e840b1f 59
Anunnaki 2:1c8f73aa2a16 60 //Softstart
Anunnaki 2:1c8f73aa2a16 61 _spiCommand(0x0C);
Anunnaki 2:1c8f73aa2a16 62 _spiData(0xD7);
Anunnaki 2:1c8f73aa2a16 63 _spiData(0xD6);
Anunnaki 2:1c8f73aa2a16 64 _spiData(0x9D);
Anunnaki 2:1c8f73aa2a16 65
Anunnaki 2:1c8f73aa2a16 66 //VCOM setting
Anunnaki 2:1c8f73aa2a16 67 _spiCommand(0x2C);
Anunnaki 2:1c8f73aa2a16 68 _spiData(0xA8);
jurica238814 9:e4e77e840b1f 69
Anunnaki 2:1c8f73aa2a16 70 //Dummy line period
Anunnaki 2:1c8f73aa2a16 71 _spiCommand(0x3A);
Anunnaki 2:1c8f73aa2a16 72 _spiData(0x1A);
jurica238814 9:e4e77e840b1f 73
jurica238814 9:e4e77e840b1f 74 //Gate line width // 2us per line
Anunnaki 2:1c8f73aa2a16 75 _spiCommand(0x3B);
Anunnaki 2:1c8f73aa2a16 76 _spiData(0x08);
jurica238814 9:e4e77e840b1f 77
Anunnaki 2:1c8f73aa2a16 78 //Set data entry mode
Anunnaki 2:1c8f73aa2a16 79 _spiCommand(0x11);
Anunnaki 2:1c8f73aa2a16 80 _spiData(0x01); //DO NOT TOUCH THIS! (MUST BE 0x01)
jurica238814 9:e4e77e840b1f 81
jurica238814 9:e4e77e840b1f 82 // ^--- Ovdje zavrsavana Kneska fca EPD_W21_DispInit
jurica238814 9:e4e77e840b1f 83
jurica238814 9:e4e77e840b1f 84
jurica238814 9:e4e77e840b1f 85 /*
jurica238814 9:e4e77e840b1f 86 // Clock
jurica238814 9:e4e77e840b1f 87 _spiCommand(0x22);
jurica238814 9:e4e77e840b1f 88 _spiData(0xF0);
Anunnaki 2:1c8f73aa2a16 89 //VGH VGL
Anunnaki 2:1c8f73aa2a16 90 _spiCommand(0x03);
Anunnaki 2:1c8f73aa2a16 91 _spiData(0x00);
Anunnaki 2:1c8f73aa2a16 92 //VSH, VSL
Anunnaki 2:1c8f73aa2a16 93 _spiCommand(0x04);
Anunnaki 2:1c8f73aa2a16 94 _spiData(0x0A);
jurica238814 9:e4e77e840b1f 95 // Source voltage +15V/-15V
jurica238814 9:e4e77e840b1f 96 _spiCommand(0xF0);
jurica238814 9:e4e77e840b1f 97 _spiData(0x1F);
jurica238814 9:e4e77e840b1f 98 //Gate driver start position
jurica238814 9:e4e77e840b1f 99 _spiCommand(0x0F);
jurica238814 9:e4e77e840b1f 100 _spiData(0x2B);
jurica238814 9:e4e77e840b1f 101 _spiData(0x01);
jurica238814 9:e4e77e840b1f 102 */
jurica238814 9:e4e77e840b1f 103
jurica238814 9:e4e77e840b1f 104
jurica238814 9:e4e77e840b1f 105
jurica238814 9:e4e77e840b1f 106
jurica238814 9:e4e77e840b1f 107
jurica238814 9:e4e77e840b1f 108
jurica238814 9:e4e77e840b1f 109
Anunnaki 2:1c8f73aa2a16 110
Anunnaki 2:1c8f73aa2a16 111 //Define X display size
Anunnaki 2:1c8f73aa2a16 112 _spiCommand(0x44);
Anunnaki 2:1c8f73aa2a16 113 _spiData(0x00);
jurica238814 9:e4e77e840b1f 114 _spiData(0x18); //(xDot-1)/8
Anunnaki 2:1c8f73aa2a16 115 //Define Y display size
Anunnaki 2:1c8f73aa2a16 116 _spiCommand(0x45);
jurica238814 9:e4e77e840b1f 117 _spiData(0xC7); //(yDot-1)%256
jurica238814 9:e4e77e840b1f 118 _spiData(0x00); //(yDot-1)/256
jurica238814 9:e4e77e840b1f 119 _spiData(0x00); // Was 0x2B
jurica238814 9:e4e77e840b1f 120 _spiData(0x00); // Was 0x01
Anunnaki 2:1c8f73aa2a16 121
Anunnaki 2:1c8f73aa2a16 122 //Define X RAM address
Anunnaki 2:1c8f73aa2a16 123 _spiCommand(0x4E);
Anunnaki 2:1c8f73aa2a16 124 _spiData(0x00);
Anunnaki 2:1c8f73aa2a16 125 //Define Y RAM address
Anunnaki 2:1c8f73aa2a16 126 _spiCommand(0x4F);
Anunnaki 2:1c8f73aa2a16 127 _spiData(0xC7);
Anunnaki 2:1c8f73aa2a16 128 _spiData(0x00);
Anunnaki 2:1c8f73aa2a16 129
jurica238814 9:e4e77e840b1f 130
Anunnaki 2:1c8f73aa2a16 131 //Border waveform control
jurica238814 9:e4e77e840b1f 132 //_spiCommand(0x3C);
jurica238814 9:e4e77e840b1f 133 //_spiData(0x33);
jurica238814 9:e4e77e840b1f 134
jurica238814 9:e4e77e840b1f 135 // ^---- Do ovuda je sve po Kinezima
Anunnaki 2:1c8f73aa2a16 136
Anunnaki 2:1c8f73aa2a16 137 //Write LUT
Anunnaki 2:1c8f73aa2a16 138 _spiCommand(0x32);
Anunnaki 7:70c58d3cbc8b 139 if(partial){
Anunnaki 7:70c58d3cbc8b 140 for(uint8_t i = 0; i<30;i++){
Anunnaki 7:70c58d3cbc8b 141 _spiData(_lutPart[i]);
Anunnaki 7:70c58d3cbc8b 142 }
Anunnaki 7:70c58d3cbc8b 143 } else{
Anunnaki 7:70c58d3cbc8b 144 for(uint8_t i = 0; i<30;i++){
Anunnaki 7:70c58d3cbc8b 145 _spiData(_lutFull[i]);
Anunnaki 7:70c58d3cbc8b 146 }
Anunnaki 7:70c58d3cbc8b 147 }
Anunnaki 2:1c8f73aa2a16 148
Anunnaki 2:1c8f73aa2a16 149 //Power on
jurica238814 9:e4e77e840b1f 150 //_spiCommand(0x22);
jurica238814 9:e4e77e840b1f 151 //_spiData(0xFF);
Anunnaki 2:1c8f73aa2a16 152
Anunnaki 2:1c8f73aa2a16 153 //Define X RAM address
jurica238814 9:e4e77e840b1f 154 //_spiCommand(0x4E);
jurica238814 9:e4e77e840b1f 155 //_spiData(0x00);
Anunnaki 2:1c8f73aa2a16 156 //Define Y RAM address
jurica238814 9:e4e77e840b1f 157 //_spiCommand(0x4F);
jurica238814 9:e4e77e840b1f 158 //_spiData(0xC7);
jurica238814 9:e4e77e840b1f 159 //_spiData(0x00);
Anunnaki 1:4fff95e316c9 160 }
Anunnaki 1:4fff95e316c9 161
Anunnaki 2:1c8f73aa2a16 162 void GDEP015OC1::_sleep(void){
Anunnaki 2:1c8f73aa2a16 163 while(_busy == BUSY_STATE);
Anunnaki 2:1c8f73aa2a16 164
Anunnaki 2:1c8f73aa2a16 165 _spiCommand(0x10);
Anunnaki 2:1c8f73aa2a16 166 _spiData(0x01);
Anunnaki 2:1c8f73aa2a16 167 }
Anunnaki 2:1c8f73aa2a16 168
Anunnaki 6:45d2ec037fd6 169 /*
Anunnaki 6:45d2ec037fd6 170 * If you touch this function satan will feast on your soul for an eternity!
Anunnaki 6:45d2ec037fd6 171 * IM NOT PLAYING AROUND DONT FUCKING TOUCH IT!
Anunnaki 6:45d2ec037fd6 172 * You are thinking about it...
Anunnaki 6:45d2ec037fd6 173 * .
Anunnaki 6:45d2ec037fd6 174 * .
Anunnaki 6:45d2ec037fd6 175 * .
Anunnaki 6:45d2ec037fd6 176 * DONT!
Anunnaki 6:45d2ec037fd6 177 */
Anunnaki 2:1c8f73aa2a16 178 unsigned char GDEP015OC1::_pixelConv(unsigned char *data, int i){
Anunnaki 2:1c8f73aa2a16 179 uint8_t pix = 0x00;
Anunnaki 2:1c8f73aa2a16 180 for(uint8_t x = 0; x < 8; x++){
Anunnaki 2:1c8f73aa2a16 181 pix |= ((*(data + (i*200)%5000 + (24-i/200) + x*25)>>((i/25)%8))&(0x01))<<(7-x);
Anunnaki 2:1c8f73aa2a16 182 }
Anunnaki 3:dc7b794b59b7 183 return pix^0xFF;
Anunnaki 2:1c8f73aa2a16 184 }
Anunnaki 2:1c8f73aa2a16 185
Anunnaki 2:1c8f73aa2a16 186 uint8_t GDEP015OC1::_mirrorData(uint8_t data){
Anunnaki 2:1c8f73aa2a16 187 uint8_t mirror = 0x00;
Anunnaki 2:1c8f73aa2a16 188 for(uint8_t i=0; i<8; i++)
Anunnaki 2:1c8f73aa2a16 189 mirror |= ((data>>i) & 0x01) << (7 - i);
Anunnaki 2:1c8f73aa2a16 190
Anunnaki 2:1c8f73aa2a16 191 return mirror;
Anunnaki 2:1c8f73aa2a16 192 }
Anunnaki 2:1c8f73aa2a16 193
Anunnaki 4:86114342ce8f 194 void GDEP015OC1::fill(unsigned char data, int x){
Anunnaki 4:86114342ce8f 195 _buffer[x] = data;
Anunnaki 4:86114342ce8f 196 }
Anunnaki 4:86114342ce8f 197
Anunnaki 2:1c8f73aa2a16 198 void GDEP015OC1::empty(void){
Anunnaki 2:1c8f73aa2a16 199 for(uint16_t x=0; x<5000; x++)
Anunnaki 2:1c8f73aa2a16 200 _buffer[x] = 0x00;
Anunnaki 2:1c8f73aa2a16 201 }
Anunnaki 2:1c8f73aa2a16 202
Anunnaki 2:1c8f73aa2a16 203 void GDEP015OC1::write(void){
Anunnaki 7:70c58d3cbc8b 204 _wakeUp(true);
Anunnaki 7:70c58d3cbc8b 205
Anunnaki 7:70c58d3cbc8b 206 _spiCommand(0x24);
Anunnaki 7:70c58d3cbc8b 207 for(int16_t x=0; x>=0 && x<200; x++){
Anunnaki 7:70c58d3cbc8b 208 for(int16_t y=24; y>=0 && y<25; y--){
Anunnaki 7:70c58d3cbc8b 209 _spiData(_mirrorData(_pixelConv(_buffer, x*25+y)));
jurica238814 8:5ae728fa8820 210 wait_us(EPD_WAIT_CONSTANT);
Anunnaki 7:70c58d3cbc8b 211 }
Anunnaki 7:70c58d3cbc8b 212 }
Anunnaki 7:70c58d3cbc8b 213
Anunnaki 7:70c58d3cbc8b 214 _spiCommand(0x22);
Anunnaki 7:70c58d3cbc8b 215 _spiData(0x04);
Anunnaki 7:70c58d3cbc8b 216 _spiCommand(0x22);
Anunnaki 7:70c58d3cbc8b 217 _spiData(0x08);
Anunnaki 7:70c58d3cbc8b 218
Anunnaki 7:70c58d3cbc8b 219 //Update
Anunnaki 7:70c58d3cbc8b 220 _spiCommand(0x22);
Anunnaki 7:70c58d3cbc8b 221 _spiData(0xC7);
Anunnaki 7:70c58d3cbc8b 222 _spiCommand(0x20);
Anunnaki 7:70c58d3cbc8b 223
Anunnaki 7:70c58d3cbc8b 224 _sleep();
Anunnaki 7:70c58d3cbc8b 225 }
Anunnaki 7:70c58d3cbc8b 226
Anunnaki 7:70c58d3cbc8b 227 void GDEP015OC1::writeFull(void){
Anunnaki 7:70c58d3cbc8b 228 _wakeUp(false);
Anunnaki 2:1c8f73aa2a16 229
Anunnaki 2:1c8f73aa2a16 230 _spiCommand(0x24);
Anunnaki 2:1c8f73aa2a16 231 for(int16_t x=0; x>=0 && x<200; x++){
Anunnaki 2:1c8f73aa2a16 232 for(int16_t y=24; y>=0 && y<25; y--){
Anunnaki 2:1c8f73aa2a16 233 _spiData(_mirrorData(_pixelConv(_buffer, x*25+y)));
jurica238814 8:5ae728fa8820 234 wait_us(EPD_WAIT_CONSTANT);
Anunnaki 2:1c8f73aa2a16 235 }
Anunnaki 2:1c8f73aa2a16 236 }
Anunnaki 2:1c8f73aa2a16 237
Anunnaki 2:1c8f73aa2a16 238 _spiCommand(0x22);
Anunnaki 2:1c8f73aa2a16 239 _spiData(0x04);
Anunnaki 2:1c8f73aa2a16 240 _spiCommand(0x22);
Anunnaki 2:1c8f73aa2a16 241 _spiData(0x08);
Anunnaki 2:1c8f73aa2a16 242
Anunnaki 2:1c8f73aa2a16 243 //Update
Anunnaki 2:1c8f73aa2a16 244 _spiCommand(0x22);
Anunnaki 2:1c8f73aa2a16 245 _spiData(0xC7);
Anunnaki 2:1c8f73aa2a16 246 _spiCommand(0x20);
Anunnaki 2:1c8f73aa2a16 247
Anunnaki 2:1c8f73aa2a16 248 _sleep();
Anunnaki 2:1c8f73aa2a16 249 }
Anunnaki 2:1c8f73aa2a16 250
Anunnaki 2:1c8f73aa2a16 251 void GDEP015OC1::drawPixel(uint16_t startX, uint16_t startY, bool color=0){
Anunnaki 2:1c8f73aa2a16 252 if(startX>199 || startY>199) return;
Anunnaki 2:1c8f73aa2a16 253
Anunnaki 2:1c8f73aa2a16 254 uint16_t i = startX/8 + startY*25;
Anunnaki 2:1c8f73aa2a16 255
Anunnaki 2:1c8f73aa2a16 256 if(!color)
Anunnaki 2:1c8f73aa2a16 257 _buffer[i] = (_buffer[i] | (1<<(7-startX%8)));
Anunnaki 2:1c8f73aa2a16 258 else
Anunnaki 2:1c8f73aa2a16 259 _buffer[i] = (_buffer[i] & (0xFF^(1<<(7-startX%8))));
Anunnaki 2:1c8f73aa2a16 260 }
Anunnaki 2:1c8f73aa2a16 261
Anunnaki 2:1c8f73aa2a16 262
Anunnaki 2:1c8f73aa2a16 263 void GDEP015OC1::drawLine(uint16_t startX, uint16_t startY, uint16_t stopX, uint16_t stopY, bool color=0){
Anunnaki 2:1c8f73aa2a16 264 int dx = abs(stopX-startX), sx = startX<stopX ? 1 : -1;
Anunnaki 2:1c8f73aa2a16 265 int dy = abs(stopY-startY), sy = startY<stopY ? 1 : -1;
Anunnaki 2:1c8f73aa2a16 266 int err = (dx>dy ? dx : -dy)/2, e2;
Anunnaki 2:1c8f73aa2a16 267
Anunnaki 2:1c8f73aa2a16 268 for(;;){
Anunnaki 2:1c8f73aa2a16 269 drawPixel(startX,startY,color);
Anunnaki 2:1c8f73aa2a16 270 if (startX==stopX && startY==stopY) break;
Anunnaki 2:1c8f73aa2a16 271 e2 = err;
Anunnaki 2:1c8f73aa2a16 272 if (e2 >-dx) { err -= dy; startX += sx; }
Anunnaki 2:1c8f73aa2a16 273 if (e2 < dy) { err += dx; startY += sy; }
Anunnaki 2:1c8f73aa2a16 274 }
Anunnaki 3:dc7b794b59b7 275 }
Anunnaki 3:dc7b794b59b7 276
Anunnaki 3:dc7b794b59b7 277 void GDEP015OC1::drawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, bool color=0){
Anunnaki 3:dc7b794b59b7 278 drawLine(x1, y1, x2, y2, color);
Anunnaki 3:dc7b794b59b7 279 drawLine(x2, y2, x3, y3, color);
Anunnaki 3:dc7b794b59b7 280 drawLine(x3, y3, x1, y1, color);
Anunnaki 3:dc7b794b59b7 281 }
Anunnaki 3:dc7b794b59b7 282
Anunnaki 3:dc7b794b59b7 283 void GDEP015OC1::drawRectangle(uint16_t startX, uint16_t startY, uint16_t stopX, uint16_t stopY, bool color=0){
Anunnaki 3:dc7b794b59b7 284 drawLine(startX, startY, stopX, startY, color);
Anunnaki 3:dc7b794b59b7 285 drawLine(stopX, startY, stopX, stopY, color);
Anunnaki 3:dc7b794b59b7 286 drawLine(stopX, stopY, startX, stopY, color);
Anunnaki 3:dc7b794b59b7 287 drawLine(startX, stopY, startX, startY, color);
Anunnaki 3:dc7b794b59b7 288 }
Anunnaki 3:dc7b794b59b7 289
Anunnaki 3:dc7b794b59b7 290 void GDEP015OC1::drawCircle(uint16_t startX, uint16_t startY, uint16_t radius, bool color=0){
Anunnaki 3:dc7b794b59b7 291 int d,x,y;
Anunnaki 3:dc7b794b59b7 292
Anunnaki 3:dc7b794b59b7 293 d=3-2*radius;
Anunnaki 3:dc7b794b59b7 294 x=0;
Anunnaki 3:dc7b794b59b7 295 y=radius;
Anunnaki 3:dc7b794b59b7 296 while(x<=y){
Anunnaki 3:dc7b794b59b7 297 drawPixel(startX+x,startY+y,color);
Anunnaki 3:dc7b794b59b7 298 drawPixel(startX-y,startY-x,color);
Anunnaki 3:dc7b794b59b7 299 drawPixel(startX+y,startY-x,color);
Anunnaki 3:dc7b794b59b7 300 drawPixel(startX-y,startY+x,color);
Anunnaki 3:dc7b794b59b7 301 drawPixel(startX+y,startY+x,color);
Anunnaki 3:dc7b794b59b7 302 drawPixel(startX-x,startY-y,color);
Anunnaki 3:dc7b794b59b7 303 drawPixel(startX+x,startY-y,color);
Anunnaki 3:dc7b794b59b7 304 drawPixel(startX-x,startY+y,color);
Anunnaki 3:dc7b794b59b7 305
Anunnaki 3:dc7b794b59b7 306 if(d<=0)
Anunnaki 3:dc7b794b59b7 307 d=d+4*x+6;
Anunnaki 3:dc7b794b59b7 308 else{
Anunnaki 3:dc7b794b59b7 309 d=d+4*x-4*y+10;
Anunnaki 3:dc7b794b59b7 310 y--;
Anunnaki 3:dc7b794b59b7 311 }
Anunnaki 3:dc7b794b59b7 312 x++;
Anunnaki 3:dc7b794b59b7 313 }
Anunnaki 3:dc7b794b59b7 314 }
Anunnaki 3:dc7b794b59b7 315
Anunnaki 3:dc7b794b59b7 316 void GDEP015OC1::fillCircle(uint16_t startX, uint16_t startY, uint16_t radius, bool color=0){
Anunnaki 3:dc7b794b59b7 317 for(uint16_t r = 1;r<=radius; r++){
Anunnaki 3:dc7b794b59b7 318 drawCircle(startX, startY, r, color);
Anunnaki 3:dc7b794b59b7 319 drawCircle(startX+1, startY, r-1, color);
Anunnaki 3:dc7b794b59b7 320 drawCircle(startX-1, startY, r-1, color);
Anunnaki 3:dc7b794b59b7 321 }
Anunnaki 3:dc7b794b59b7 322 }
Anunnaki 3:dc7b794b59b7 323
Anunnaki 3:dc7b794b59b7 324 void GDEP015OC1::drawEllipse(uint16_t startX, uint16_t startY, uint16_t width, uint16_t height, bool color){
Anunnaki 3:dc7b794b59b7 325 int a2 = width*width;
Anunnaki 3:dc7b794b59b7 326 int b2 = height*height;
Anunnaki 3:dc7b794b59b7 327 int fa2 = 4*a2, fb2 = 4*b2;
Anunnaki 3:dc7b794b59b7 328 int x, y, sigma;
Anunnaki 3:dc7b794b59b7 329
Anunnaki 3:dc7b794b59b7 330 //First half
Anunnaki 3:dc7b794b59b7 331 for(int x = 0, y = height, sigma = 2*b2+a2*(1-2*height); b2*x <= a2*y; x++){
Anunnaki 3:dc7b794b59b7 332 drawPixel(startX+x,startY+y,color);
Anunnaki 3:dc7b794b59b7 333 drawPixel(startX-x,startY+y,color);
Anunnaki 3:dc7b794b59b7 334 drawPixel(startX+x,startY-y,color);
Anunnaki 3:dc7b794b59b7 335 drawPixel(startX-x,startY-y,color);
Anunnaki 3:dc7b794b59b7 336 if(sigma >= 0){
Anunnaki 3:dc7b794b59b7 337 sigma += fa2 * (1-y);
Anunnaki 3:dc7b794b59b7 338 y--;
Anunnaki 3:dc7b794b59b7 339 }
Anunnaki 3:dc7b794b59b7 340 sigma += b2 * ((4 * x) + 6);
Anunnaki 3:dc7b794b59b7 341 }
Anunnaki 3:dc7b794b59b7 342 //Second half
Anunnaki 3:dc7b794b59b7 343 for (x = width, y = 0, sigma = 2*a2+b2*(1-2*width); a2*y <= b2*x; y++){
Anunnaki 3:dc7b794b59b7 344 drawPixel(startX+x,startY+y,color);
Anunnaki 3:dc7b794b59b7 345 drawPixel(startX-x,startY+y,color);
Anunnaki 3:dc7b794b59b7 346 drawPixel(startX+x,startY-y,color);
Anunnaki 3:dc7b794b59b7 347 drawPixel(startX-x,startY-y,color);
Anunnaki 3:dc7b794b59b7 348 if (sigma >= 0){
Anunnaki 3:dc7b794b59b7 349 sigma += fb2 * (1 - x);
Anunnaki 3:dc7b794b59b7 350 x--;
Anunnaki 3:dc7b794b59b7 351 }
Anunnaki 3:dc7b794b59b7 352 sigma += a2 * ((4 * y) + 6);
Anunnaki 3:dc7b794b59b7 353 }
Anunnaki 3:dc7b794b59b7 354 }
Anunnaki 3:dc7b794b59b7 355
Anunnaki 3:dc7b794b59b7 356 void GDEP015OC1::fillEllipse(uint16_t startX, uint16_t startY, uint16_t width, uint16_t height, bool color=0){
Anunnaki 3:dc7b794b59b7 357 for(uint16_t w = width; w > 0; w--){
Anunnaki 3:dc7b794b59b7 358 drawEllipse(startX, startX, w, height, color);
Anunnaki 3:dc7b794b59b7 359 }
Anunnaki 3:dc7b794b59b7 360 drawLine(startX, startY-height, startX, startY+height, color);
Anunnaki 3:dc7b794b59b7 361 }
Anunnaki 3:dc7b794b59b7 362
Anunnaki 3:dc7b794b59b7 363 void GDEP015OC1::writeChar(char character, uint16_t startX, uint16_t startY, bool color=0){
Anunnaki 3:dc7b794b59b7 364 unsigned char letter[FONT_WIDTH];
Anunnaki 3:dc7b794b59b7 365
Anunnaki 3:dc7b794b59b7 366 //Grab data for the corresponding font
Anunnaki 3:dc7b794b59b7 367 for(uint8_t i = 0; i<FONT_WIDTH; i++)
Anunnaki 3:dc7b794b59b7 368 letter[i] = Font5x7[(character - ' ') * FONT_WIDTH + i];
Anunnaki 3:dc7b794b59b7 369
Anunnaki 3:dc7b794b59b7 370 for(uint8_t i = 0; i<FONT_WIDTH; i++){
Anunnaki 3:dc7b794b59b7 371 for(uint8_t j = 0; j<FONT_HEIGHT; j++){
Anunnaki 3:dc7b794b59b7 372 if((letter[i]>>j)&0x01){
Anunnaki 3:dc7b794b59b7 373 if(_italic){
Anunnaki 3:dc7b794b59b7 374 drawPixel(startX+i+(FONT_HEIGHT/3 - j/3), startY+j, color);
Anunnaki 3:dc7b794b59b7 375 if(_bold){
Anunnaki 3:dc7b794b59b7 376 for(uint8_t z=0; z<2; z++)
Anunnaki 3:dc7b794b59b7 377 drawPixel(startX+i-z+(FONT_HEIGHT/3- j/3), startY+j, color);
Anunnaki 3:dc7b794b59b7 378 }
Anunnaki 3:dc7b794b59b7 379 }
Anunnaki 3:dc7b794b59b7 380 else{
Anunnaki 3:dc7b794b59b7 381 drawPixel(startX+i, startY+j, color);
Anunnaki 3:dc7b794b59b7 382 if(_bold){
Anunnaki 3:dc7b794b59b7 383 for(uint8_t z=0; z<2; z++)
Anunnaki 3:dc7b794b59b7 384 drawPixel(startX+i-z, startY+j, color);
Anunnaki 3:dc7b794b59b7 385 }
Anunnaki 3:dc7b794b59b7 386 }
Anunnaki 3:dc7b794b59b7 387 }
Anunnaki 3:dc7b794b59b7 388 }
Anunnaki 3:dc7b794b59b7 389 }
Anunnaki 3:dc7b794b59b7 390 }
Anunnaki 3:dc7b794b59b7 391
Anunnaki 3:dc7b794b59b7 392 void GDEP015OC1::writeString(char *string, uint16_t startX, uint16_t startY, bool color=0){
Anunnaki 3:dc7b794b59b7 393 uint8_t length = 0;
Anunnaki 3:dc7b794b59b7 394 while(*(string+length) != '\0') length++;
Anunnaki 3:dc7b794b59b7 395
Anunnaki 3:dc7b794b59b7 396 for(uint8_t x=0; x<length; x++)
Anunnaki 4:86114342ce8f 397 writeChar(*(string+x), startX+(FONT_WIDTH+1)*x, startY, color); //FONT_WIDTH+1 gives a 1px space between the characters
Anunnaki 2:1c8f73aa2a16 398 }