Extended library to include a screensaver

Dependencies:   SDFileSystem

Fork of 4DGL-uLCD-SE by Jay Danner

Committer:
macenzofan
Date:
Wed Feb 08 21:53:30 2017 +0000
Revision:
3:f09725357991
Parent:
0:975087cba076
IOT EC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jdanner3 0:975087cba076 1 //
jdanner3 0:975087cba076 2 // uLCD_4DGL is a class to drive 4D Systems LCD screens
jdanner3 0:975087cba076 3 //
jdanner3 0:975087cba076 4 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr>
jdanner3 0:975087cba076 5 // Modifed for Goldelox processor <2013> Jim Hamblen
jdanner3 0:975087cba076 6 //
jdanner3 0:975087cba076 7 // uLCD_4DGL is free software: you can redistribute it and/or modify
jdanner3 0:975087cba076 8 // it under the terms of the GNU General Public License as published by
jdanner3 0:975087cba076 9 // the Free Software Foundation, either version 3 of the License, or
jdanner3 0:975087cba076 10 // (at your option) any later version.
jdanner3 0:975087cba076 11 //
jdanner3 0:975087cba076 12 // uLCD_4DGL is distributed in the hope that it will be useful,
jdanner3 0:975087cba076 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
jdanner3 0:975087cba076 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
jdanner3 0:975087cba076 15 // GNU General Public License for more details.
jdanner3 0:975087cba076 16 //
jdanner3 0:975087cba076 17 // You should have received a copy of the GNU General Public License
jdanner3 0:975087cba076 18 // along with uLCD_4DGL. If not, see <http://www.gnu.org/licenses/>.
jdanner3 0:975087cba076 19
jdanner3 0:975087cba076 20 #include "mbed.h"
jdanner3 0:975087cba076 21 #include "uLCD_4DGL.h"
jdanner3 0:975087cba076 22
jdanner3 0:975087cba076 23 #define ARRAY_SIZE(X) sizeof(X)/sizeof(X[0])
jdanner3 0:975087cba076 24
jdanner3 0:975087cba076 25 //****************************************************************************************************
jdanner3 0:975087cba076 26 void uLCD_4DGL :: circle(int x, int y , int radius, int color, bool isScreenSaverCommand) // draw a circle in (x,y)
jdanner3 0:975087cba076 27 {
jdanner3 0:975087cba076 28 char command[9]= "";
jdanner3 0:975087cba076 29
jdanner3 0:975087cba076 30 command[0] = CIRCLE;
jdanner3 0:975087cba076 31
jdanner3 0:975087cba076 32 command[1] = (x >> 8) & 0xFF;
jdanner3 0:975087cba076 33 command[2] = x & 0xFF;
jdanner3 0:975087cba076 34
jdanner3 0:975087cba076 35 command[3] = (y >> 8) & 0xFF;
jdanner3 0:975087cba076 36 command[4] = y & 0xFF;
jdanner3 0:975087cba076 37
jdanner3 0:975087cba076 38 command[5] = (radius >> 8) & 0xFF;
jdanner3 0:975087cba076 39 command[6] = radius & 0xFF;
jdanner3 0:975087cba076 40
jdanner3 0:975087cba076 41 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 42 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 43 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 44
jdanner3 0:975087cba076 45 command[7] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
jdanner3 0:975087cba076 46 command[8] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
jdanner3 0:975087cba076 47
jdanner3 0:975087cba076 48 writeCOMMAND(command, 9);
jdanner3 0:975087cba076 49 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 50 }
jdanner3 0:975087cba076 51 //****************************************************************************************************
jdanner3 0:975087cba076 52 void uLCD_4DGL :: filled_circle(int x, int y , int radius, int color, bool isScreenSaverCommand) // draw a circle in (x,y)
jdanner3 0:975087cba076 53 {
jdanner3 0:975087cba076 54 char command[9]= "";
jdanner3 0:975087cba076 55
jdanner3 0:975087cba076 56 command[0] = FCIRCLE;
jdanner3 0:975087cba076 57
jdanner3 0:975087cba076 58 command[1] = (x >> 8) & 0xFF;
jdanner3 0:975087cba076 59 command[2] = x & 0xFF;
jdanner3 0:975087cba076 60
jdanner3 0:975087cba076 61 command[3] = (y >> 8) & 0xFF;
jdanner3 0:975087cba076 62 command[4] = y & 0xFF;
jdanner3 0:975087cba076 63
jdanner3 0:975087cba076 64 command[5] = (radius >> 8) & 0xFF;
jdanner3 0:975087cba076 65 command[6] = radius & 0xFF;
jdanner3 0:975087cba076 66
jdanner3 0:975087cba076 67 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 68 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 69 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 70
jdanner3 0:975087cba076 71 command[7] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
jdanner3 0:975087cba076 72 command[8] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
jdanner3 0:975087cba076 73
jdanner3 0:975087cba076 74 writeCOMMAND(command, 9);
jdanner3 0:975087cba076 75 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 76 }
jdanner3 0:975087cba076 77
jdanner3 0:975087cba076 78 //****************************************************************************************************
jdanner3 0:975087cba076 79 void uLCD_4DGL :: triangle(int x1, int y1 , int x2, int y2, int x3, int y3, int color, bool isScreenSaverCommand) // draw a triangle
jdanner3 0:975087cba076 80 {
jdanner3 0:975087cba076 81 char command[15]= "";
jdanner3 0:975087cba076 82
jdanner3 0:975087cba076 83 command[0] = TRIANGLE;
jdanner3 0:975087cba076 84
jdanner3 0:975087cba076 85 command[1] = (x1 >> 8) & 0xFF;
jdanner3 0:975087cba076 86 command[2] = x1 & 0xFF;
jdanner3 0:975087cba076 87
jdanner3 0:975087cba076 88 command[3] = (y1 >> 8) & 0xFF;
jdanner3 0:975087cba076 89 command[4] = y1 & 0xFF;
jdanner3 0:975087cba076 90
jdanner3 0:975087cba076 91 command[5] = (x2 >> 8) & 0xFF;
jdanner3 0:975087cba076 92 command[6] = x2 & 0xFF;
jdanner3 0:975087cba076 93
jdanner3 0:975087cba076 94 command[7] = (y2 >> 8) & 0xFF;
jdanner3 0:975087cba076 95 command[8] = y2 & 0xFF;
jdanner3 0:975087cba076 96
jdanner3 0:975087cba076 97 command[9] = (x3 >> 8) & 0xFF;
jdanner3 0:975087cba076 98 command[10] = x3 & 0xFF;
jdanner3 0:975087cba076 99
jdanner3 0:975087cba076 100 command[11] = (y3 >> 8) & 0xFF;
jdanner3 0:975087cba076 101 command[12] = y3 & 0xFF;
jdanner3 0:975087cba076 102
jdanner3 0:975087cba076 103 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 104 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 105 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 106
jdanner3 0:975087cba076 107 command[13] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
jdanner3 0:975087cba076 108 command[14] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
jdanner3 0:975087cba076 109
jdanner3 0:975087cba076 110 writeCOMMAND(command, 15);
jdanner3 0:975087cba076 111 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 112 }
jdanner3 0:975087cba076 113
jdanner3 0:975087cba076 114 //****************************************************************************************************
jdanner3 0:975087cba076 115 void uLCD_4DGL :: line(int x1, int y1 , int x2, int y2, int color, bool isScreenSaverCommand) // draw a line
jdanner3 0:975087cba076 116 {
jdanner3 0:975087cba076 117 char command[11]= "";
jdanner3 0:975087cba076 118
jdanner3 0:975087cba076 119 command[0] = LINE;
jdanner3 0:975087cba076 120
jdanner3 0:975087cba076 121 command[1] = (x1 >> 8) & 0xFF;
jdanner3 0:975087cba076 122 command[2] = x1 & 0xFF;
jdanner3 0:975087cba076 123
jdanner3 0:975087cba076 124 command[3] = (y1 >> 8) & 0xFF;
jdanner3 0:975087cba076 125 command[4] = y1 & 0xFF;
jdanner3 0:975087cba076 126
jdanner3 0:975087cba076 127 command[5] = (x2 >> 8) & 0xFF;
jdanner3 0:975087cba076 128 command[6] = x2 & 0xFF;
jdanner3 0:975087cba076 129
jdanner3 0:975087cba076 130 command[7] = (y2 >> 8) & 0xFF;
jdanner3 0:975087cba076 131 command[8] = y2 & 0xFF;
jdanner3 0:975087cba076 132
jdanner3 0:975087cba076 133 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 134 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 135 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 136
jdanner3 0:975087cba076 137 command[9] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
jdanner3 0:975087cba076 138 command[10] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
jdanner3 0:975087cba076 139
jdanner3 0:975087cba076 140 writeCOMMAND(command, 11);
jdanner3 0:975087cba076 141 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 142 }
jdanner3 0:975087cba076 143
jdanner3 0:975087cba076 144 //****************************************************************************************************
jdanner3 0:975087cba076 145 void uLCD_4DGL :: rectangle(int x1, int y1 , int x2, int y2, int color, bool isScreenSaverCommand) // draw a rectangle
jdanner3 0:975087cba076 146 {
jdanner3 0:975087cba076 147 char command[11]= "";
jdanner3 0:975087cba076 148
jdanner3 0:975087cba076 149 command[0] = RECTANGLE;
jdanner3 0:975087cba076 150
jdanner3 0:975087cba076 151 command[1] = (x1 >> 8) & 0xFF;
jdanner3 0:975087cba076 152 command[2] = x1 & 0xFF;
jdanner3 0:975087cba076 153
jdanner3 0:975087cba076 154 command[3] = (y1 >> 8) & 0xFF;
jdanner3 0:975087cba076 155 command[4] = y1 & 0xFF;
jdanner3 0:975087cba076 156
jdanner3 0:975087cba076 157 command[5] = (x2 >> 8) & 0xFF;
jdanner3 0:975087cba076 158 command[6] = x2 & 0xFF;
jdanner3 0:975087cba076 159
jdanner3 0:975087cba076 160 command[7] = (y2 >> 8) & 0xFF;
jdanner3 0:975087cba076 161 command[8] = y2 & 0xFF;
jdanner3 0:975087cba076 162
jdanner3 0:975087cba076 163 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 164 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 165 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 166
jdanner3 0:975087cba076 167 command[9] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
jdanner3 0:975087cba076 168 command[10] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
jdanner3 0:975087cba076 169
jdanner3 0:975087cba076 170 writeCOMMAND(command, 11);
jdanner3 0:975087cba076 171 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 172 }
jdanner3 0:975087cba076 173
jdanner3 0:975087cba076 174 //****************************************************************************************************
jdanner3 0:975087cba076 175 void uLCD_4DGL :: filled_rectangle(int x1, int y1 , int x2, int y2, int color, bool isScreenSaverCommand) // draw a rectangle
jdanner3 0:975087cba076 176 {
jdanner3 0:975087cba076 177 char command[11]= "";
jdanner3 0:975087cba076 178
jdanner3 0:975087cba076 179 command[0] = FRECTANGLE;
jdanner3 0:975087cba076 180
jdanner3 0:975087cba076 181 command[1] = (x1 >> 8) & 0xFF;
jdanner3 0:975087cba076 182 command[2] = x1 & 0xFF;
jdanner3 0:975087cba076 183
jdanner3 0:975087cba076 184 command[3] = (y1 >> 8) & 0xFF;
jdanner3 0:975087cba076 185 command[4] = y1 & 0xFF;
jdanner3 0:975087cba076 186
jdanner3 0:975087cba076 187 command[5] = (x2 >> 8) & 0xFF;
jdanner3 0:975087cba076 188 command[6] = x2 & 0xFF;
jdanner3 0:975087cba076 189
jdanner3 0:975087cba076 190 command[7] = (y2 >> 8) & 0xFF;
jdanner3 0:975087cba076 191 command[8] = y2 & 0xFF;
jdanner3 0:975087cba076 192
jdanner3 0:975087cba076 193 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 194 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 195 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 196
jdanner3 0:975087cba076 197 command[9] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
jdanner3 0:975087cba076 198 command[10] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
jdanner3 0:975087cba076 199
jdanner3 0:975087cba076 200 writeCOMMAND(command, 11);
jdanner3 0:975087cba076 201 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 202 }
jdanner3 0:975087cba076 203
jdanner3 0:975087cba076 204
jdanner3 0:975087cba076 205
jdanner3 0:975087cba076 206 //****************************************************************************************************
jdanner3 0:975087cba076 207 void uLCD_4DGL :: pixel(int x, int y, int color, bool isScreenSaverCommand) // draw a pixel
jdanner3 0:975087cba076 208 {
jdanner3 0:975087cba076 209 char command[7]= "";
jdanner3 0:975087cba076 210
jdanner3 0:975087cba076 211 command[0] = PIXEL;
jdanner3 0:975087cba076 212
jdanner3 0:975087cba076 213 command[1] = (x >> 8) & 0xFF;
jdanner3 0:975087cba076 214 command[2] = x & 0xFF;
jdanner3 0:975087cba076 215
jdanner3 0:975087cba076 216 command[3] = (y >> 8) & 0xFF;
jdanner3 0:975087cba076 217 command[4] = y & 0xFF;
jdanner3 0:975087cba076 218
jdanner3 0:975087cba076 219 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 220 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 221 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 222
jdanner3 0:975087cba076 223 command[5] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
jdanner3 0:975087cba076 224 command[6] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
jdanner3 0:975087cba076 225
jdanner3 0:975087cba076 226 writeCOMMAND(command, 7);
jdanner3 0:975087cba076 227 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 228 }
jdanner3 0:975087cba076 229 //****************************************************************************************************
jdanner3 0:975087cba076 230 void uLCD_4DGL :: BLIT(int x, int y, int w, int h, int *colors, bool isScreenSaverCommand) // draw a block of pixels
jdanner3 0:975087cba076 231 {
jdanner3 0:975087cba076 232 int red5, green6, blue5;
jdanner3 0:975087cba076 233 writeBYTEfast('\x00');
jdanner3 0:975087cba076 234 writeBYTEfast(BLITCOM);
jdanner3 0:975087cba076 235 writeBYTEfast((x >> 8) & 0xFF);
jdanner3 0:975087cba076 236 writeBYTEfast(x & 0xFF);
jdanner3 0:975087cba076 237 writeBYTEfast((y >> 8) & 0xFF);
jdanner3 0:975087cba076 238 writeBYTEfast(y & 0xFF);
jdanner3 0:975087cba076 239 writeBYTEfast((w >> 8) & 0xFF);
jdanner3 0:975087cba076 240 writeBYTE(w & 0xFF);
jdanner3 0:975087cba076 241 writeBYTE((h >> 8) & 0xFF);
jdanner3 0:975087cba076 242 writeBYTE(h & 0xFF);
jdanner3 0:975087cba076 243 wait_ms(1);
jdanner3 0:975087cba076 244 for (int i=0; i<w*h; i++) {
jdanner3 0:975087cba076 245 red5 = (colors[i] >> (16 + 3)) & 0x1F; // get red on 5 bits
jdanner3 0:975087cba076 246 green6 = (colors[i] >> (8 + 2)) & 0x3F; // get green on 6 bits
jdanner3 0:975087cba076 247 blue5 = (colors[i] >> (0 + 3)) & 0x1F; // get blue on 5 bits
jdanner3 0:975087cba076 248 writeBYTEfast(((red5 << 3) + (green6 >> 3)) & 0xFF); // first part of 16 bits color
jdanner3 0:975087cba076 249 writeBYTEfast(((green6 << 5) + (blue5 >> 0)) & 0xFF); // second part of 16 bits color
jdanner3 0:975087cba076 250 }
jdanner3 0:975087cba076 251 int resp=0;
jdanner3 0:975087cba076 252 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
jdanner3 0:975087cba076 253 if (_cmd.readable()) resp = _cmd.getc(); // read response if any
jdanner3 0:975087cba076 254 switch (resp) {
jdanner3 0:975087cba076 255 case ACK : // if OK return 1
jdanner3 0:975087cba076 256 resp = 1;
jdanner3 0:975087cba076 257 break;
jdanner3 0:975087cba076 258 case NAK : // if NOK return -1
jdanner3 0:975087cba076 259 resp = -1;
jdanner3 0:975087cba076 260 break;
jdanner3 0:975087cba076 261 default :
jdanner3 0:975087cba076 262 resp = 0; // else return 0
jdanner3 0:975087cba076 263 break;
jdanner3 0:975087cba076 264 }
jdanner3 0:975087cba076 265 #if DEBUGMODE
jdanner3 0:975087cba076 266 pc.printf(" Answer received : %d\n",resp);
jdanner3 0:975087cba076 267 #endif
jdanner3 0:975087cba076 268 if (!isScreenSaverCommand) reportScreenInteraction();
jdanner3 0:975087cba076 269 }
jdanner3 0:975087cba076 270 //******************************************************************************************************
jdanner3 0:975087cba076 271 int uLCD_4DGL :: read_pixel(int x, int y) // read screen info and populate data
jdanner3 0:975087cba076 272 {
jdanner3 0:975087cba076 273
jdanner3 0:975087cba076 274 char command[6]= "";
jdanner3 0:975087cba076 275 command[0] = 0xFF;
jdanner3 0:975087cba076 276 command[1] = READPIXEL;
jdanner3 0:975087cba076 277
jdanner3 0:975087cba076 278 command[2] = (x >> 8) & 0xFF;
jdanner3 0:975087cba076 279 command[3] = x & 0xFF;
jdanner3 0:975087cba076 280
jdanner3 0:975087cba076 281 command[4] = (y >> 8) & 0xFF;
jdanner3 0:975087cba076 282 command[5] = y & 0xFF;
jdanner3 0:975087cba076 283
jdanner3 0:975087cba076 284 int i, temp = 0, color = 0, resp = 0;
jdanner3 0:975087cba076 285 char response[2] = "";
jdanner3 0:975087cba076 286
jdanner3 0:975087cba076 287 freeBUFFER();
jdanner3 0:975087cba076 288
jdanner3 0:975087cba076 289 for (i = 0; i < 6; i++) { // send all chars to serial port
jdanner3 0:975087cba076 290 writeBYTE(command[i]);
jdanner3 0:975087cba076 291 }
jdanner3 0:975087cba076 292
jdanner3 0:975087cba076 293 while (!_cmd.readable()) wait_ms(TEMPO); // wait for screen answer
jdanner3 0:975087cba076 294
jdanner3 0:975087cba076 295 while (_cmd.readable() && resp < ARRAY_SIZE(response)) {
jdanner3 0:975087cba076 296 temp = _cmd.getc();
jdanner3 0:975087cba076 297 response[resp++] = (char)temp;
jdanner3 0:975087cba076 298 }
jdanner3 0:975087cba076 299
jdanner3 0:975087cba076 300 color = ((response[0] << 8) + response[1]);
jdanner3 0:975087cba076 301
jdanner3 0:975087cba076 302 return color; // WARNING : this is 16bits color, not 24bits... need to be fixed
jdanner3 0:975087cba076 303 }
jdanner3 0:975087cba076 304
jdanner3 0:975087cba076 305
jdanner3 0:975087cba076 306 //****************************************************************************************************
jdanner3 0:975087cba076 307 void uLCD_4DGL :: pen_size(char mode) // set pen to SOLID or WIREFRAME
jdanner3 0:975087cba076 308 {
jdanner3 0:975087cba076 309 char command[2]= "";
jdanner3 0:975087cba076 310
jdanner3 0:975087cba076 311 command[0] = PENSIZE;
jdanner3 0:975087cba076 312 command[1] = mode;
jdanner3 0:975087cba076 313 writeCOMMAND(command, 2);
jdanner3 0:975087cba076 314 }
jdanner3 0:975087cba076 315
jdanner3 0:975087cba076 316
jdanner3 0:975087cba076 317