EaPaper Library for EM027BS013

Dependencies:   EM027BS013 TFT_fonts

Fork of EaEpaper by Peter Drescher

Committer:
tlisowski3
Date:
Thu Apr 02 16:27:46 2015 +0000
Revision:
4:672976335e80
Parent:
0:fedcef5319f5
EaPaper Library modified for EM027BS013

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:fedcef5319f5 1
dreschpe 0:fedcef5319f5 2 #include "EaEpaper.h"
dreschpe 0:fedcef5319f5 3
dreschpe 0:fedcef5319f5 4 #define EA_IMG_BUF_SZ (5808) // 264 x 176 / 8 = 5808
dreschpe 0:fedcef5319f5 5
dreschpe 0:fedcef5319f5 6 #define LM75A_ADDRESS (0x92) // 0x49 << 1
dreschpe 0:fedcef5319f5 7 #define LM75A_CMD_TEMP 0x00
dreschpe 0:fedcef5319f5 8
dreschpe 0:fedcef5319f5 9 static uint8_t _newImage[EA_IMG_BUF_SZ];
dreschpe 0:fedcef5319f5 10
tlisowski3 4:672976335e80 11 EaEpaper::EaEpaper(PinName sec03_SpiSCK,
tlisowski3 4:672976335e80 12 PinName sec04_SpiMOSI,
tlisowski3 4:672976335e80 13 PinName sec05_SpiMISO,
tlisowski3 4:672976335e80 14 PinName sec06_EpdCS,
tlisowski3 4:672976335e80 15 PinName sec07_EpdBusy,
tlisowski3 4:672976335e80 16 PinName sec08_EpdBorder,
tlisowski3 4:672976335e80 17 PinName sec09_I2cSCL,
tlisowski3 4:672976335e80 18 PinName sec10_I2cSDA,
tlisowski3 4:672976335e80 19 PinName sec11_FlashCS,
tlisowski3 4:672976335e80 20 PinName sec12_EpdReset,
tlisowski3 4:672976335e80 21 PinName sec13_EpdPanelOn,
tlisowski3 4:672976335e80 22 PinName sec14_EpdDischarge,
dreschpe 0:fedcef5319f5 23 const char* name):
tlisowski3 4:672976335e80 24 em_(sec03_SpiSCK,
tlisowski3 4:672976335e80 25 sec04_SpiMOSI,
tlisowski3 4:672976335e80 26 sec05_SpiMISO,
tlisowski3 4:672976335e80 27 sec06_EpdCS,
tlisowski3 4:672976335e80 28 sec07_EpdBusy,
tlisowski3 4:672976335e80 29 sec08_EpdBorder,
tlisowski3 4:672976335e80 30 sec09_I2cSCL,
tlisowski3 4:672976335e80 31 sec10_I2cSDA,
tlisowski3 4:672976335e80 32 sec11_FlashCS,
tlisowski3 4:672976335e80 33 sec12_EpdReset,
tlisowski3 4:672976335e80 34 sec13_EpdPanelOn,
tlisowski3 4:672976335e80 35 sec14_EpdDischarge), // sck
dreschpe 0:fedcef5319f5 36 GraphicsDisplay(name)
dreschpe 0:fedcef5319f5 37 {
dreschpe 0:fedcef5319f5 38 draw_mode = NORMAL;
dreschpe 0:fedcef5319f5 39 memset(_newImage, 0, EA_IMG_BUF_SZ);
dreschpe 0:fedcef5319f5 40 }
dreschpe 0:fedcef5319f5 41
dreschpe 0:fedcef5319f5 42
dreschpe 0:fedcef5319f5 43 int EaEpaper::width()
dreschpe 0:fedcef5319f5 44 {
dreschpe 0:fedcef5319f5 45 return 264;
dreschpe 0:fedcef5319f5 46 }
dreschpe 0:fedcef5319f5 47
dreschpe 0:fedcef5319f5 48 int EaEpaper::height()
dreschpe 0:fedcef5319f5 49 {
dreschpe 0:fedcef5319f5 50 return 176;
dreschpe 0:fedcef5319f5 51 }
dreschpe 0:fedcef5319f5 52
dreschpe 0:fedcef5319f5 53
dreschpe 0:fedcef5319f5 54 // erase pixel after power up
dreschpe 0:fedcef5319f5 55 void EaEpaper::clear()
dreschpe 0:fedcef5319f5 56 {
tlisowski3 4:672976335e80 57 memset(_newImage, 0xFF, EA_IMG_BUF_SZ);
dreschpe 0:fedcef5319f5 58 }
dreschpe 0:fedcef5319f5 59
dreschpe 0:fedcef5319f5 60 // update screen _newImage -> _oldImage
dreschpe 0:fedcef5319f5 61 void EaEpaper::write_disp(void)
dreschpe 0:fedcef5319f5 62 {
tlisowski3 4:672976335e80 63 em_.drawImage(_newImage);
dreschpe 0:fedcef5319f5 64 }
dreschpe 0:fedcef5319f5 65
dreschpe 0:fedcef5319f5 66 // read LM75A sensor on board to calculate display speed
dreschpe 0:fedcef5319f5 67
dreschpe 0:fedcef5319f5 68 // set one pixel in buffer _newImage
dreschpe 0:fedcef5319f5 69
dreschpe 0:fedcef5319f5 70 void EaEpaper::pixel(int x, int y, int color)
dreschpe 0:fedcef5319f5 71 {
dreschpe 0:fedcef5319f5 72 // first check parameter
dreschpe 0:fedcef5319f5 73 if(x > 263 || y > 175 || x < 0 || y < 0) return;
dreschpe 0:fedcef5319f5 74
dreschpe 0:fedcef5319f5 75 if(draw_mode == NORMAL) {
dreschpe 0:fedcef5319f5 76 if(color == 0)
tlisowski3 4:672976335e80 77 _newImage[(x / 8) + ((y-1) * 33)] &= ~(1 << (7-(x%8))); // erase pixel
dreschpe 0:fedcef5319f5 78 else
tlisowski3 4:672976335e80 79 _newImage[(x / 8) + ((y-1) * 33)] |= (1 << (7-(x%8))); // set pixel
dreschpe 0:fedcef5319f5 80 } else { // XOR mode
dreschpe 0:fedcef5319f5 81 if(color == 1)
tlisowski3 4:672976335e80 82 _newImage[(x / 8) + ((y-1) * 33)] ^= (1 << (7-(x%8))); // xor pixel
dreschpe 0:fedcef5319f5 83 }
dreschpe 0:fedcef5319f5 84 }
dreschpe 0:fedcef5319f5 85
dreschpe 0:fedcef5319f5 86 // clear screen
dreschpe 0:fedcef5319f5 87 void EaEpaper::cls(void)
dreschpe 0:fedcef5319f5 88 {
tlisowski3 4:672976335e80 89 memset(_newImage, 0xFF, EA_IMG_BUF_SZ); // clear display buffer
dreschpe 0:fedcef5319f5 90 }
dreschpe 0:fedcef5319f5 91
dreschpe 0:fedcef5319f5 92 // print line
dreschpe 0:fedcef5319f5 93 void EaEpaper::line(int x0, int y0, int x1, int y1, int color)
dreschpe 0:fedcef5319f5 94 {
dreschpe 0:fedcef5319f5 95 int dx = 0, dy = 0;
dreschpe 0:fedcef5319f5 96 int dx_sym = 0, dy_sym = 0;
dreschpe 0:fedcef5319f5 97 int dx_x2 = 0, dy_x2 = 0;
dreschpe 0:fedcef5319f5 98 int di = 0;
dreschpe 0:fedcef5319f5 99
dreschpe 0:fedcef5319f5 100 dx = x1-x0;
dreschpe 0:fedcef5319f5 101 dy = y1-y0;
dreschpe 0:fedcef5319f5 102
dreschpe 0:fedcef5319f5 103 if (dx > 0) {
dreschpe 0:fedcef5319f5 104 dx_sym = 1;
dreschpe 0:fedcef5319f5 105 } else {
dreschpe 0:fedcef5319f5 106 dx_sym = -1;
dreschpe 0:fedcef5319f5 107 }
dreschpe 0:fedcef5319f5 108
dreschpe 0:fedcef5319f5 109 if (dy > 0) {
dreschpe 0:fedcef5319f5 110 dy_sym = 1;
dreschpe 0:fedcef5319f5 111 } else {
dreschpe 0:fedcef5319f5 112 dy_sym = -1;
dreschpe 0:fedcef5319f5 113 }
dreschpe 0:fedcef5319f5 114
dreschpe 0:fedcef5319f5 115 dx = dx_sym*dx;
dreschpe 0:fedcef5319f5 116 dy = dy_sym*dy;
dreschpe 0:fedcef5319f5 117
dreschpe 0:fedcef5319f5 118 dx_x2 = dx*2;
dreschpe 0:fedcef5319f5 119 dy_x2 = dy*2;
dreschpe 0:fedcef5319f5 120
dreschpe 0:fedcef5319f5 121 if (dx >= dy) {
dreschpe 0:fedcef5319f5 122 di = dy_x2 - dx;
dreschpe 0:fedcef5319f5 123 while (x0 != x1) {
dreschpe 0:fedcef5319f5 124
dreschpe 0:fedcef5319f5 125 pixel(x0, y0, color);
dreschpe 0:fedcef5319f5 126 x0 += dx_sym;
dreschpe 0:fedcef5319f5 127 if (di<0) {
dreschpe 0:fedcef5319f5 128 di += dy_x2;
dreschpe 0:fedcef5319f5 129 } else {
dreschpe 0:fedcef5319f5 130 di += dy_x2 - dx_x2;
dreschpe 0:fedcef5319f5 131 y0 += dy_sym;
dreschpe 0:fedcef5319f5 132 }
dreschpe 0:fedcef5319f5 133 }
dreschpe 0:fedcef5319f5 134 pixel(x0, y0, color);
dreschpe 0:fedcef5319f5 135 } else {
dreschpe 0:fedcef5319f5 136 di = dx_x2 - dy;
dreschpe 0:fedcef5319f5 137 while (y0 != y1) {
dreschpe 0:fedcef5319f5 138 pixel(x0, y0, color);
dreschpe 0:fedcef5319f5 139 y0 += dy_sym;
dreschpe 0:fedcef5319f5 140 if (di < 0) {
dreschpe 0:fedcef5319f5 141 di += dx_x2;
dreschpe 0:fedcef5319f5 142 } else {
dreschpe 0:fedcef5319f5 143 di += dx_x2 - dy_x2;
dreschpe 0:fedcef5319f5 144 x0 += dx_sym;
dreschpe 0:fedcef5319f5 145 }
dreschpe 0:fedcef5319f5 146 }
dreschpe 0:fedcef5319f5 147 pixel(x0, y0, color);
dreschpe 0:fedcef5319f5 148 }
dreschpe 0:fedcef5319f5 149 }
dreschpe 0:fedcef5319f5 150
dreschpe 0:fedcef5319f5 151 // print rect
dreschpe 0:fedcef5319f5 152 void EaEpaper::rect(int x0, int y0, int x1, int y1, int color)
dreschpe 0:fedcef5319f5 153 {
dreschpe 0:fedcef5319f5 154
dreschpe 0:fedcef5319f5 155 if (x1 > x0) line(x0,y0,x1,y0,color);
dreschpe 0:fedcef5319f5 156 else line(x1,y0,x0,y0,color);
dreschpe 0:fedcef5319f5 157
dreschpe 0:fedcef5319f5 158 if (y1 > y0) line(x0,y0,x0,y1,color);
dreschpe 0:fedcef5319f5 159 else line(x0,y1,x0,y0,color);
dreschpe 0:fedcef5319f5 160
dreschpe 0:fedcef5319f5 161 if (x1 > x0) line(x0,y1,x1,y1,color);
dreschpe 0:fedcef5319f5 162 else line(x1,y1,x0,y1,color);
dreschpe 0:fedcef5319f5 163
dreschpe 0:fedcef5319f5 164 if (y1 > y0) line(x1,y0,x1,y1,color);
dreschpe 0:fedcef5319f5 165 else line(x1,y1,x1,y0,color);
dreschpe 0:fedcef5319f5 166 }
dreschpe 0:fedcef5319f5 167
dreschpe 0:fedcef5319f5 168 // print filled rect
dreschpe 0:fedcef5319f5 169 void EaEpaper::fillrect(int x0, int y0, int x1, int y1, int color)
dreschpe 0:fedcef5319f5 170 {
dreschpe 0:fedcef5319f5 171 int l,c,i;
dreschpe 0:fedcef5319f5 172 if(x0 > x1) {
dreschpe 0:fedcef5319f5 173 i = x0;
dreschpe 0:fedcef5319f5 174 x0 = x1;
dreschpe 0:fedcef5319f5 175 x1 = i;
dreschpe 0:fedcef5319f5 176 }
dreschpe 0:fedcef5319f5 177
dreschpe 0:fedcef5319f5 178 if(y0 > y1) {
dreschpe 0:fedcef5319f5 179 i = y0;
dreschpe 0:fedcef5319f5 180 y0 = y1;
dreschpe 0:fedcef5319f5 181 y1 = i;
dreschpe 0:fedcef5319f5 182 }
dreschpe 0:fedcef5319f5 183
dreschpe 0:fedcef5319f5 184 for(l = x0; l<= x1; l ++) {
dreschpe 0:fedcef5319f5 185 for(c = y0; c<= y1; c++) {
dreschpe 0:fedcef5319f5 186 pixel(l,c,color);
dreschpe 0:fedcef5319f5 187 }
dreschpe 0:fedcef5319f5 188 }
dreschpe 0:fedcef5319f5 189 }
dreschpe 0:fedcef5319f5 190
dreschpe 0:fedcef5319f5 191 // print circle
dreschpe 0:fedcef5319f5 192 void EaEpaper::circle(int x0, int y0, int r, int color)
dreschpe 0:fedcef5319f5 193 {
dreschpe 0:fedcef5319f5 194 int x = -r, y = 0, err = 2-2*r, e2;
dreschpe 0:fedcef5319f5 195 do {
dreschpe 0:fedcef5319f5 196 pixel(x0-x, y0+y,color);
dreschpe 0:fedcef5319f5 197 pixel(x0+x, y0+y,color);
dreschpe 0:fedcef5319f5 198 pixel(x0+x, y0-y,color);
dreschpe 0:fedcef5319f5 199 pixel(x0-x, y0-y,color);
dreschpe 0:fedcef5319f5 200 e2 = err;
dreschpe 0:fedcef5319f5 201 if (e2 <= y) {
dreschpe 0:fedcef5319f5 202 err += ++y*2+1;
dreschpe 0:fedcef5319f5 203 if (-x == y && e2 <= x) e2 = 0;
dreschpe 0:fedcef5319f5 204 }
dreschpe 0:fedcef5319f5 205 if (e2 > x) err += ++x*2+1;
dreschpe 0:fedcef5319f5 206 } while (x <= 0);
dreschpe 0:fedcef5319f5 207
dreschpe 0:fedcef5319f5 208 }
dreschpe 0:fedcef5319f5 209
dreschpe 0:fedcef5319f5 210 // print filled circle
dreschpe 0:fedcef5319f5 211 void EaEpaper::fillcircle(int x0, int y0, int r, int color)
dreschpe 0:fedcef5319f5 212 {
dreschpe 0:fedcef5319f5 213 int x = -r, y = 0, err = 2-2*r, e2;
dreschpe 0:fedcef5319f5 214 do {
dreschpe 0:fedcef5319f5 215 line(x0-x, y0-y, x0-x, y0+y, color);
dreschpe 0:fedcef5319f5 216 line(x0+x, y0-y, x0+x, y0+y, color);
dreschpe 0:fedcef5319f5 217 e2 = err;
dreschpe 0:fedcef5319f5 218 if (e2 <= y) {
dreschpe 0:fedcef5319f5 219 err += ++y*2+1;
dreschpe 0:fedcef5319f5 220 if (-x == y && e2 <= x) e2 = 0;
dreschpe 0:fedcef5319f5 221 }
dreschpe 0:fedcef5319f5 222 if (e2 > x) err += ++x*2+1;
dreschpe 0:fedcef5319f5 223 } while (x <= 0);
dreschpe 0:fedcef5319f5 224 }
dreschpe 0:fedcef5319f5 225
dreschpe 0:fedcef5319f5 226 // set drawing mode
dreschpe 0:fedcef5319f5 227 void EaEpaper::setmode(int mode)
dreschpe 0:fedcef5319f5 228 {
dreschpe 0:fedcef5319f5 229 draw_mode = mode;
dreschpe 0:fedcef5319f5 230 }
dreschpe 0:fedcef5319f5 231
dreschpe 0:fedcef5319f5 232 // set cursor position
dreschpe 0:fedcef5319f5 233 void EaEpaper::locate(int x, int y)
dreschpe 0:fedcef5319f5 234 {
dreschpe 0:fedcef5319f5 235 char_x = x;
dreschpe 0:fedcef5319f5 236 char_y = y;
dreschpe 0:fedcef5319f5 237 }
dreschpe 0:fedcef5319f5 238
dreschpe 0:fedcef5319f5 239 // calc char columns
dreschpe 0:fedcef5319f5 240 int EaEpaper::columns()
dreschpe 0:fedcef5319f5 241 {
dreschpe 0:fedcef5319f5 242 return width() / font[1];
dreschpe 0:fedcef5319f5 243 }
dreschpe 0:fedcef5319f5 244
dreschpe 0:fedcef5319f5 245 // calc char rows
dreschpe 0:fedcef5319f5 246 int EaEpaper::rows()
dreschpe 0:fedcef5319f5 247 {
dreschpe 0:fedcef5319f5 248 return height() / font[2];
dreschpe 0:fedcef5319f5 249 }
dreschpe 0:fedcef5319f5 250
dreschpe 0:fedcef5319f5 251 // print char
dreschpe 0:fedcef5319f5 252 int EaEpaper::_putc(int value)
dreschpe 0:fedcef5319f5 253 {
dreschpe 0:fedcef5319f5 254 if (value == '\n') { // new line
dreschpe 0:fedcef5319f5 255 char_x = 0;
dreschpe 0:fedcef5319f5 256 char_y = char_y + font[2];
dreschpe 0:fedcef5319f5 257 if (char_y >= height() - font[2]) {
dreschpe 0:fedcef5319f5 258 char_y = 0;
dreschpe 0:fedcef5319f5 259 }
dreschpe 0:fedcef5319f5 260 } else {
dreschpe 0:fedcef5319f5 261 character(char_x, char_y, value);
dreschpe 0:fedcef5319f5 262 }
dreschpe 0:fedcef5319f5 263 return value;
dreschpe 0:fedcef5319f5 264 }
dreschpe 0:fedcef5319f5 265
dreschpe 0:fedcef5319f5 266 // paint char out of font
dreschpe 0:fedcef5319f5 267 void EaEpaper::character(int x, int y, int c)
dreschpe 0:fedcef5319f5 268 {
dreschpe 0:fedcef5319f5 269 unsigned int hor,vert,offset,bpl,j,i,b;
dreschpe 0:fedcef5319f5 270 unsigned char* zeichen;
dreschpe 0:fedcef5319f5 271 unsigned char z,w;
dreschpe 0:fedcef5319f5 272
dreschpe 0:fedcef5319f5 273 if ((c < 31) || (c > 127)) return; // test char range
dreschpe 0:fedcef5319f5 274
dreschpe 0:fedcef5319f5 275 // read font parameter from start of array
dreschpe 0:fedcef5319f5 276 offset = font[0]; // bytes / char
dreschpe 0:fedcef5319f5 277 hor = font[1]; // get hor size of font
dreschpe 0:fedcef5319f5 278 vert = font[2]; // get vert size of font
dreschpe 0:fedcef5319f5 279 bpl = font[3]; // bytes per line
dreschpe 0:fedcef5319f5 280
dreschpe 0:fedcef5319f5 281 if (char_x + hor > width()) {
dreschpe 0:fedcef5319f5 282 char_x = 0;
dreschpe 0:fedcef5319f5 283 char_y = char_y + vert;
dreschpe 0:fedcef5319f5 284 if (char_y >= height() - font[2]) {
dreschpe 0:fedcef5319f5 285 char_y = 0;
dreschpe 0:fedcef5319f5 286 }
dreschpe 0:fedcef5319f5 287 }
dreschpe 0:fedcef5319f5 288
dreschpe 0:fedcef5319f5 289 zeichen = &font[((c -32) * offset) + 4]; // start of char bitmap
dreschpe 0:fedcef5319f5 290 w = zeichen[0]; // width of actual char
dreschpe 0:fedcef5319f5 291 // construct the char into the buffer
dreschpe 0:fedcef5319f5 292 for (j=0; j<vert; j++) { // vert line
dreschpe 0:fedcef5319f5 293 for (i=0; i<hor; i++) { // horz line
dreschpe 0:fedcef5319f5 294 z = zeichen[bpl * i + ((j & 0xF8) >> 3)+1];
dreschpe 0:fedcef5319f5 295 b = 1 << (j & 0x07);
dreschpe 0:fedcef5319f5 296 if (( z & b ) == 0x00) {
dreschpe 0:fedcef5319f5 297 pixel(x+i,y+j,0);
dreschpe 0:fedcef5319f5 298 } else {
dreschpe 0:fedcef5319f5 299 pixel(x+i,y+j,1);
dreschpe 0:fedcef5319f5 300 }
dreschpe 0:fedcef5319f5 301
dreschpe 0:fedcef5319f5 302 }
dreschpe 0:fedcef5319f5 303 }
dreschpe 0:fedcef5319f5 304
dreschpe 0:fedcef5319f5 305 char_x += w;
dreschpe 0:fedcef5319f5 306 }
dreschpe 0:fedcef5319f5 307
dreschpe 0:fedcef5319f5 308 // set actual font
dreschpe 0:fedcef5319f5 309 void EaEpaper::set_font(unsigned char* f)
dreschpe 0:fedcef5319f5 310 {
dreschpe 0:fedcef5319f5 311 font = f;
dreschpe 0:fedcef5319f5 312 }
dreschpe 0:fedcef5319f5 313
dreschpe 0:fedcef5319f5 314 void EaEpaper::print_bm(Bitmap bm, int x, int y)
dreschpe 0:fedcef5319f5 315 {
dreschpe 0:fedcef5319f5 316 int h,v,b;
dreschpe 0:fedcef5319f5 317 char d;
dreschpe 0:fedcef5319f5 318
dreschpe 0:fedcef5319f5 319 for(v=0; v < bm.ySize; v++) { // lines
dreschpe 0:fedcef5319f5 320 for(h=0; h < bm.xSize; h++) { // pixel
dreschpe 0:fedcef5319f5 321 if(h + x > width()) break;
dreschpe 0:fedcef5319f5 322 if(v + y > height()) break;
dreschpe 0:fedcef5319f5 323 d = bm.data[bm.Byte_in_Line * v + ((h & 0xF8) >> 3)];
dreschpe 0:fedcef5319f5 324 b = 0x80 >> (h & 0x07);
dreschpe 0:fedcef5319f5 325 if((d & b) == 0) {
dreschpe 0:fedcef5319f5 326 pixel(x+h,y+v,0);
dreschpe 0:fedcef5319f5 327 } else {
dreschpe 0:fedcef5319f5 328 pixel(x+h,y+v,1);
dreschpe 0:fedcef5319f5 329 }
dreschpe 0:fedcef5319f5 330 }
dreschpe 0:fedcef5319f5 331 }
dreschpe 0:fedcef5319f5 332
dreschpe 0:fedcef5319f5 333 }
dreschpe 0:fedcef5319f5 334
dreschpe 0:fedcef5319f5 335