EPD display library.

Dependents:   acd52832_ePaper acd52832_SAADC_Differential_input_2 acd52832_SAADC_Differential_input_EPD acd52832_Car_battery_ch ... more

Fork of GDEP015OC1 by aconno dev team

Committer:
jurica238814
Date:
Thu Jun 29 09:36:04 2017 +0000
Revision:
12:55f053e7f087
Parent:
11:9cf09f5a693a
Child:
16:637e8c66dee6
Init_partial function added.

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