Brian Eason / Mbed 2 deprecated BrickBreak

Dependencies:   mbed

Committer:
brianeason92
Date:
Tue Nov 01 18:29:26 2016 +0000
Revision:
0:64079f49da67
Full functioning brick break game for lab 4

Who changed what in which revision?

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