4DGL-uLCD-SE

Dependents:   ECE2035_SUM17_Project Air_Rendezvous_transmitter Transmitter app-board-RTOS-Threads ... more

Committer:
kennyainny
Date:
Fri Jul 14 21:42:47 2017 +0000
Revision:
0:19588ac80c02
no changes;

Who changed what in which revision?

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