Ryan Tseng
/
DisplayTest
main.cpp@0:87b78725a6dd, 2012-03-05 (annotated)
- Committer:
- kagelump
- Date:
- Mon Mar 05 06:00:16 2012 +0000
- Revision:
- 0:87b78725a6dd
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kagelump | 0:87b78725a6dd | 1 | // Display Test |
kagelump | 0:87b78725a6dd | 2 | //#include "mbed.h" |
kagelump | 0:87b78725a6dd | 3 | #include "KS0108.h" |
kagelump | 0:87b78725a6dd | 4 | #include "calsolimage.h" |
kagelump | 0:87b78725a6dd | 5 | #include "numbers.h" |
kagelump | 0:87b78725a6dd | 6 | #include "Arial12.h" |
kagelump | 0:87b78725a6dd | 7 | #include "Arial14.h" |
kagelump | 0:87b78725a6dd | 8 | #include "arial_bold_14.h" |
kagelump | 0:87b78725a6dd | 9 | #include "ArialB40.h" |
kagelump | 0:87b78725a6dd | 10 | #include "SystemFont5x7.h" |
kagelump | 0:87b78725a6dd | 11 | #include "HelveticaB35.h" |
kagelump | 0:87b78725a6dd | 12 | #include "CourierNew_B70.h" |
kagelump | 0:87b78725a6dd | 13 | |
kagelump | 0:87b78725a6dd | 14 | // Declare each of the things you're going to use |
kagelump | 0:87b78725a6dd | 15 | // The display |
kagelump | 0:87b78725a6dd | 16 | KS0108 display(p23,p21,p22,p20,p24,p25,p17,p18,p19,p30,p29,p28,p27,p26); |
kagelump | 0:87b78725a6dd | 17 | // The button on the breadboard |
kagelump | 0:87b78725a6dd | 18 | DigitalIn topButton(p13); |
kagelump | 0:87b78725a6dd | 19 | // For printing things to the computer |
kagelump | 0:87b78725a6dd | 20 | Serial pc(USBTX,USBRX); |
kagelump | 0:87b78725a6dd | 21 | // Timers |
kagelump | 0:87b78725a6dd | 22 | Timer timer1; |
kagelump | 0:87b78725a6dd | 23 | Timer timer2; |
kagelump | 0:87b78725a6dd | 24 | Timer testTimer; |
kagelump | 0:87b78725a6dd | 25 | |
kagelump | 0:87b78725a6dd | 26 | // Declare methods, the actual body is down there. |
kagelump | 0:87b78725a6dd | 27 | // You have to do this for C |
kagelump | 0:87b78725a6dd | 28 | void rules (unsigned char *); |
kagelump | 0:87b78725a6dd | 29 | void random (unsigned char *); |
kagelump | 0:87b78725a6dd | 30 | |
kagelump | 0:87b78725a6dd | 31 | // This is where your programs starts running |
kagelump | 0:87b78725a6dd | 32 | int main() { |
kagelump | 0:87b78725a6dd | 33 | // Initialize variables |
kagelump | 0:87b78725a6dd | 34 | int dist = 20; |
kagelump | 0:87b78725a6dd | 35 | int demo = 0; |
kagelump | 0:87b78725a6dd | 36 | int i = 0; |
kagelump | 0:87b78725a6dd | 37 | topButton.mode(PullUp); |
kagelump | 0:87b78725a6dd | 38 | // Display CalSol logo |
kagelump | 0:87b78725a6dd | 39 | display.FullScreenBMP(pic); |
kagelump | 0:87b78725a6dd | 40 | wait(0.2); |
kagelump | 0:87b78725a6dd | 41 | |
kagelump | 0:87b78725a6dd | 42 | timer1.start(); // For button stuff |
kagelump | 0:87b78725a6dd | 43 | timer2.start(); |
kagelump | 0:87b78725a6dd | 44 | |
kagelump | 0:87b78725a6dd | 45 | int percentage = 0; //integer value from 0 to 100 (battery) |
kagelump | 0:87b78725a6dd | 46 | int speed = 150; //integer value from 0 to 999 |
kagelump | 0:87b78725a6dd | 47 | double current = 15.2; //double value from 0 to 99.9 |
kagelump | 0:87b78725a6dd | 48 | |
kagelump | 0:87b78725a6dd | 49 | while(1) { |
kagelump | 0:87b78725a6dd | 50 | if(!topButton) { |
kagelump | 0:87b78725a6dd | 51 | if(timer1.read_ms() > 200) { |
kagelump | 0:87b78725a6dd | 52 | demo++; |
kagelump | 0:87b78725a6dd | 53 | display.ClearScreen(); |
kagelump | 0:87b78725a6dd | 54 | if(demo > 3) { |
kagelump | 0:87b78725a6dd | 55 | demo = 0; |
kagelump | 0:87b78725a6dd | 56 | } |
kagelump | 0:87b78725a6dd | 57 | timer1.reset(); |
kagelump | 0:87b78725a6dd | 58 | } |
kagelump | 0:87b78725a6dd | 59 | } |
kagelump | 0:87b78725a6dd | 60 | switch(demo) { |
kagelump | 0:87b78725a6dd | 61 | case 0: |
kagelump | 0:87b78725a6dd | 62 | if(timer2.read_ms() > 500) { |
kagelump | 0:87b78725a6dd | 63 | rules(pic); |
kagelump | 0:87b78725a6dd | 64 | display.FullScreenBMP(pic); |
kagelump | 0:87b78725a6dd | 65 | timer2.reset(); |
kagelump | 0:87b78725a6dd | 66 | } |
kagelump | 0:87b78725a6dd | 67 | break; |
kagelump | 0:87b78725a6dd | 68 | |
kagelump | 0:87b78725a6dd | 69 | case 1: |
kagelump | 0:87b78725a6dd | 70 | |
kagelump | 0:87b78725a6dd | 71 | //GRID: |
kagelump | 0:87b78725a6dd | 72 | //speed: 70x64, ( 0, 0) |
kagelump | 0:87b78725a6dd | 73 | //current: 57x23, (71, 0) |
kagelump | 0:87b78725a6dd | 74 | //battery: 57x40, (71, 23) |
kagelump | 0:87b78725a6dd | 75 | display.HLineShort(71, 64-24, 57, BLACK); |
kagelump | 0:87b78725a6dd | 76 | display.VLineShort(71, 0, 64, BLACK); |
kagelump | 0:87b78725a6dd | 77 | |
kagelump | 0:87b78725a6dd | 78 | |
kagelump | 0:87b78725a6dd | 79 | /* |
kagelump | 0:87b78725a6dd | 80 | /* |
kagelump | 0:87b78725a6dd | 81 | //CURRENT |
kagelump | 0:87b78725a6dd | 82 | display.SelectFont(Arial_Bold_14, WHITE, ReadData); |
kagelump | 0:87b78725a6dd | 83 | display.GotoXY(78, 8); |
kagelump | 0:87b78725a6dd | 84 | display.PrintNumber(current); // this doesn't work with doubles |
kagelump | 0:87b78725a6dd | 85 | display.SelectFont(System5x7, WHITE, ReadData); |
kagelump | 0:87b78725a6dd | 86 | display.GotoXY(110, 8); |
kagelump | 0:87b78725a6dd | 87 | display.PrintString("Amp"); |
kagelump | 0:87b78725a6dd | 88 | */ |
kagelump | 0:87b78725a6dd | 89 | |
kagelump | 0:87b78725a6dd | 90 | |
kagelump | 0:87b78725a6dd | 91 | //BATTERY |
kagelump | 0:87b78725a6dd | 92 | display.RoundRectangle(82, 2, 40, 24, 4, BLACK); //body: 40x24 |
kagelump | 0:87b78725a6dd | 93 | display.EmptyRectangle(78, 10, 78+4, 10+8, BLACK);//head: 4x8 |
kagelump | 0:87b78725a6dd | 94 | display.SelectFont(System5x7, WHITE, ReadData); |
kagelump | 0:87b78725a6dd | 95 | display.GotoXY(108, 24+8); |
kagelump | 0:87b78725a6dd | 96 | display.PrintString("%"); |
kagelump | 0:87b78725a6dd | 97 | |
kagelump | 0:87b78725a6dd | 98 | |
kagelump | 0:87b78725a6dd | 99 | //PERCENTAGE (reasonable update rate: testTimer.read_ms()/700) |
kagelump | 0:87b78725a6dd | 100 | /* |
kagelump | 0:87b78725a6dd | 101 | int INITIAL_PERCENTAGE = 100; |
kagelump | 0:87b78725a6dd | 102 | int percentage = INITIAL_PERCENTAGE; // values 0-100 |
kagelump | 0:87b78725a6dd | 103 | int newPercentage = percentage; // values 0-100 |
kagelump | 0:87b78725a6dd | 104 | int barPosition = 86+(int)(((double)(100-percentage)/100.0)*32); |
kagelump | 0:87b78725a6dd | 105 | int newBarPosition = 86+(int)(((double)(100-newPercentage)/100.0)*32); //x-coordinates |
kagelump | 0:87b78725a6dd | 106 | |
kagelump | 0:87b78725a6dd | 107 | display.SelectFont(System5x7, BLACK, ReadData); |
kagelump | 0:87b78725a6dd | 108 | |
kagelump | 0:87b78725a6dd | 109 | //draw initial box |
kagelump | 0:87b78725a6dd | 110 | display.FullRectangle(barPosition, 2+4, 86+32, 2+24-4, BLACK); //inside: 32x16 |
kagelump | 0:87b78725a6dd | 111 | int y = 32; //y coordinate for percenage. for testing/fixing font |
kagelump | 0:87b78725a6dd | 112 | |
kagelump | 0:87b78725a6dd | 113 | testTimer.start(); |
kagelump | 0:87b78725a6dd | 114 | |
kagelump | 0:87b78725a6dd | 115 | while (newPercentage <= 100 && newPercentage >= 0) //testing update rate/centering |
kagelump | 0:87b78725a6dd | 116 | { |
kagelump | 0:87b78725a6dd | 117 | if (testTimer.read_ms()%700 == 0) |
kagelump | 0:87b78725a6dd | 118 | { |
kagelump | 0:87b78725a6dd | 119 | //account for number of digits |
kagelump | 0:87b78725a6dd | 120 | |
kagelump | 0:87b78725a6dd | 121 | if (newPercentage > 99) |
kagelump | 0:87b78725a6dd | 122 | display.GotoXY(88, y); |
kagelump | 0:87b78725a6dd | 123 | else if (newPercentage >= 10) |
kagelump | 0:87b78725a6dd | 124 | { |
kagelump | 0:87b78725a6dd | 125 | if (percentage > 99) |
kagelump | 0:87b78725a6dd | 126 | display.FullRectangle(88, y, 88+5, y+7, WHITE); |
kagelump | 0:87b78725a6dd | 127 | display.GotoXY(94, y); |
kagelump | 0:87b78725a6dd | 128 | } |
kagelump | 0:87b78725a6dd | 129 | else |
kagelump | 0:87b78725a6dd | 130 | { |
kagelump | 0:87b78725a6dd | 131 | if (percentage >= 10) |
kagelump | 0:87b78725a6dd | 132 | display.FullRectangle(88, y, 88+5*2+1, y+7, WHITE); |
kagelump | 0:87b78725a6dd | 133 | display.GotoXY(100,y); |
kagelump | 0:87b78725a6dd | 134 | } |
kagelump | 0:87b78725a6dd | 135 | |
kagelump | 0:87b78725a6dd | 136 | |
kagelump | 0:87b78725a6dd | 137 | display.PrintNumber(newPercentage); |
kagelump | 0:87b78725a6dd | 138 | |
kagelump | 0:87b78725a6dd | 139 | |
kagelump | 0:87b78725a6dd | 140 | |
kagelump | 0:87b78725a6dd | 141 | barPosition = 86+(int)(((double)(100-percentage)/100.0)*32); |
kagelump | 0:87b78725a6dd | 142 | newBarPosition = 86+(int)(((double)(100-newPercentage)/100.0)*32); |
kagelump | 0:87b78725a6dd | 143 | |
kagelump | 0:87b78725a6dd | 144 | //draw increase or decrease in percentage |
kagelump | 0:87b78725a6dd | 145 | if (newBarPosition < barPosition) //percentage increase |
kagelump | 0:87b78725a6dd | 146 | display.FullRectangle(newBarPosition, 2+4, barPosition, 2+24-4, BLACK); |
kagelump | 0:87b78725a6dd | 147 | else if (newBarPosition > barPosition) //percentage decrease |
kagelump | 0:87b78725a6dd | 148 | display.FullRectangle(barPosition, 2+4, newBarPosition, 2+24-4, WHITE); |
kagelump | 0:87b78725a6dd | 149 | |
kagelump | 0:87b78725a6dd | 150 | |
kagelump | 0:87b78725a6dd | 151 | //update percentages |
kagelump | 0:87b78725a6dd | 152 | percentage = newPercentage; |
kagelump | 0:87b78725a6dd | 153 | //newPercentage = testTimer.read_ms()/700; //slow increase |
kagelump | 0:87b78725a6dd | 154 | newPercentage = INITIAL_PERCENTAGE-(testTimer.read_ms()/700); //rapid decrease |
kagelump | 0:87b78725a6dd | 155 | |
kagelump | 0:87b78725a6dd | 156 | } |
kagelump | 0:87b78725a6dd | 157 | }*/ |
kagelump | 0:87b78725a6dd | 158 | |
kagelump | 0:87b78725a6dd | 159 | //SPEED |
kagelump | 0:87b78725a6dd | 160 | |
kagelump | 0:87b78725a6dd | 161 | display.SelectFont(System5x7, WHITE, ReadData); |
kagelump | 0:87b78725a6dd | 162 | display.GotoXY(26, 48); |
kagelump | 0:87b78725a6dd | 163 | display.PrintString("MPH"); |
kagelump | 0:87b78725a6dd | 164 | testTimer.start(); |
kagelump | 0:87b78725a6dd | 165 | |
kagelump | 0:87b78725a6dd | 166 | display.SelectFont(CourierNew_B70, WHITE, ReadData); |
kagelump | 0:87b78725a6dd | 167 | /* while (true){ |
kagelump | 0:87b78725a6dd | 168 | if (testTimer.read_ms()%700 == 1) |
kagelump | 0:87b78725a6dd | 169 | {*/ // for testing |
kagelump | 0:87b78725a6dd | 170 | //speed = testTimer.read_ms()/1000; |
kagelump | 0:87b78725a6dd | 171 | speed += (int)((rand()%3)-2); |
kagelump | 0:87b78725a6dd | 172 | |
kagelump | 0:87b78725a6dd | 173 | //display.FullRectangle(0, 16, 70, 44, WHITE); //clears space too slowly. find alternative |
kagelump | 0:87b78725a6dd | 174 | |
kagelump | 0:87b78725a6dd | 175 | if (speed > 99) // 3digits |
kagelump | 0:87b78725a6dd | 176 | display.GotoXY(1, 16); |
kagelump | 0:87b78725a6dd | 177 | else if (speed >= 10) // 2digits |
kagelump | 0:87b78725a6dd | 178 | display.GotoXY(3+10, 16); |
kagelump | 0:87b78725a6dd | 179 | else //1digit |
kagelump | 0:87b78725a6dd | 180 | display.GotoXY(3+10*2, 16); |
kagelump | 0:87b78725a6dd | 181 | |
kagelump | 0:87b78725a6dd | 182 | display.PrintNumber(speed); |
kagelump | 0:87b78725a6dd | 183 | /*} |
kagelump | 0:87b78725a6dd | 184 | }*/ |
kagelump | 0:87b78725a6dd | 185 | */ |
kagelump | 0:87b78725a6dd | 186 | break; |
kagelump | 0:87b78725a6dd | 187 | case 2: |
kagelump | 0:87b78725a6dd | 188 | // This block does the bar graph stuff. |
kagelump | 0:87b78725a6dd | 189 | if(timer2.read_ms() > 100) { |
kagelump | 0:87b78725a6dd | 190 | // display.PutString(3,2,"I can has mbed too"); |
kagelump | 0:87b78725a6dd | 191 | // display.PrintFloat(123.23,4,5); |
kagelump | 0:87b78725a6dd | 192 | display.VLine(6+i,47,56,BLACK); |
kagelump | 0:87b78725a6dd | 193 | if (i < 10){dist = 30;} |
kagelump | 0:87b78725a6dd | 194 | else if (i < 100){dist = 25;} |
kagelump | 0:87b78725a6dd | 195 | else {dist = 20;} |
kagelump | 0:87b78725a6dd | 196 | display.PrintInteger(i,6,dist); |
kagelump | 0:87b78725a6dd | 197 | i++; |
kagelump | 0:87b78725a6dd | 198 | if(i > 100) { |
kagelump | 0:87b78725a6dd | 199 | i = 0; |
kagelump | 0:87b78725a6dd | 200 | display.ClearScreen(); |
kagelump | 0:87b78725a6dd | 201 | } |
kagelump | 0:87b78725a6dd | 202 | timer2.reset(); |
kagelump | 0:87b78725a6dd | 203 | } |
kagelump | 0:87b78725a6dd | 204 | break; |
kagelump | 0:87b78725a6dd | 205 | case 3: |
kagelump | 0:87b78725a6dd | 206 | if(timer2.read_ms() > 500) { |
kagelump | 0:87b78725a6dd | 207 | rules(pic); |
kagelump | 0:87b78725a6dd | 208 | display.FullScreenBMP(pic); |
kagelump | 0:87b78725a6dd | 209 | timer2.reset(); |
kagelump | 0:87b78725a6dd | 210 | } |
kagelump | 0:87b78725a6dd | 211 | default: |
kagelump | 0:87b78725a6dd | 212 | break; |
kagelump | 0:87b78725a6dd | 213 | } |
kagelump | 0:87b78725a6dd | 214 | } |
kagelump | 0:87b78725a6dd | 215 | } |
kagelump | 0:87b78725a6dd | 216 | |
kagelump | 0:87b78725a6dd | 217 | //For Conway's Game of Life |
kagelump | 0:87b78725a6dd | 218 | void rules (unsigned char * array) { |
kagelump | 0:87b78725a6dd | 219 | char neighborArray[128][64]; |
kagelump | 0:87b78725a6dd | 220 | // Get number of neighbors |
kagelump | 0:87b78725a6dd | 221 | for (int x = 0; x < 128; x++) { |
kagelump | 0:87b78725a6dd | 222 | for (int y = 0;y < 64; y++) { |
kagelump | 0:87b78725a6dd | 223 | neighborArray[x][y] = 0; |
kagelump | 0:87b78725a6dd | 224 | } |
kagelump | 0:87b78725a6dd | 225 | } |
kagelump | 0:87b78725a6dd | 226 | for (int y = 0;y < 64; y++) { |
kagelump | 0:87b78725a6dd | 227 | for (int x = 0; x < 128; x++) { |
kagelump | 0:87b78725a6dd | 228 | if (array[x + (y/8*8)*16] & (1<<(y%8))) { |
kagelump | 0:87b78725a6dd | 229 | if (x != 0) { |
kagelump | 0:87b78725a6dd | 230 | neighborArray[x-1][y] += 1; |
kagelump | 0:87b78725a6dd | 231 | if (y != 0) { |
kagelump | 0:87b78725a6dd | 232 | neighborArray[x-1][y-1] += 1; |
kagelump | 0:87b78725a6dd | 233 | } |
kagelump | 0:87b78725a6dd | 234 | if (y != 127) { |
kagelump | 0:87b78725a6dd | 235 | neighborArray[x-1][y+1] += 1; |
kagelump | 0:87b78725a6dd | 236 | } |
kagelump | 0:87b78725a6dd | 237 | } |
kagelump | 0:87b78725a6dd | 238 | if (x != 127) { |
kagelump | 0:87b78725a6dd | 239 | neighborArray[x+1][y] += 1; |
kagelump | 0:87b78725a6dd | 240 | if (y != 0) { |
kagelump | 0:87b78725a6dd | 241 | neighborArray[x+1][y-1] += 1; |
kagelump | 0:87b78725a6dd | 242 | } |
kagelump | 0:87b78725a6dd | 243 | if (y != 127) { |
kagelump | 0:87b78725a6dd | 244 | neighborArray[x+1][y+1] += 1; |
kagelump | 0:87b78725a6dd | 245 | } |
kagelump | 0:87b78725a6dd | 246 | } |
kagelump | 0:87b78725a6dd | 247 | if (y != 0) { |
kagelump | 0:87b78725a6dd | 248 | neighborArray[x][y-1] += 1; |
kagelump | 0:87b78725a6dd | 249 | } |
kagelump | 0:87b78725a6dd | 250 | if (y != 63){ |
kagelump | 0:87b78725a6dd | 251 | neighborArray[x][y+1] += 1; |
kagelump | 0:87b78725a6dd | 252 | } |
kagelump | 0:87b78725a6dd | 253 | } |
kagelump | 0:87b78725a6dd | 254 | } |
kagelump | 0:87b78725a6dd | 255 | } |
kagelump | 0:87b78725a6dd | 256 | int arrayIndex; |
kagelump | 0:87b78725a6dd | 257 | for (int y = 0;y < 64; y++) { |
kagelump | 0:87b78725a6dd | 258 | for (int x = 0; x < 128; x++) { |
kagelump | 0:87b78725a6dd | 259 | arrayIndex = x + (y/8*8)*16; |
kagelump | 0:87b78725a6dd | 260 | if (neighborArray[x][y] == 3) { |
kagelump | 0:87b78725a6dd | 261 | array[arrayIndex] |= (1<<(y%8)); |
kagelump | 0:87b78725a6dd | 262 | } else if (neighborArray[x][y] == 2) { |
kagelump | 0:87b78725a6dd | 263 | continue; |
kagelump | 0:87b78725a6dd | 264 | } else { |
kagelump | 0:87b78725a6dd | 265 | array[arrayIndex] &= ~(1<<(y%8)); |
kagelump | 0:87b78725a6dd | 266 | } |
kagelump | 0:87b78725a6dd | 267 | } |
kagelump | 0:87b78725a6dd | 268 | } |
kagelump | 0:87b78725a6dd | 269 | } |
kagelump | 0:87b78725a6dd | 270 | |
kagelump | 0:87b78725a6dd | 271 | //Is this used anywhere? |
kagelump | 0:87b78725a6dd | 272 | void random (unsigned char * array) { |
kagelump | 0:87b78725a6dd | 273 | for (int y = 0;y < 64; y += 8) { |
kagelump | 0:87b78725a6dd | 274 | for (int x = 0; x < 128; x++) { |
kagelump | 0:87b78725a6dd | 275 | array[x + y*16] = (unsigned char) rand(); |
kagelump | 0:87b78725a6dd | 276 | } |
kagelump | 0:87b78725a6dd | 277 | } |
kagelump | 0:87b78725a6dd | 278 | } |