Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Sun Mar 03 15:50:54 2013 +0000
Revision:
12:8e42d7ba8468
Child:
13:62e0f7f39ff5
Repartitioned display and utility functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TickTock 12:8e42d7ba8468 1 // This contains all the display subroutines
TickTock 12:8e42d7ba8468 2
TickTock 12:8e42d7ba8468 3 #include "TOUCH_TFTx2.h"
TickTock 12:8e42d7ba8468 4 #include "SPI_TFTx2.h"
TickTock 12:8e42d7ba8468 5 #include "Arial12x12.h"
TickTock 12:8e42d7ba8468 6 #include "Arial12x12_prop.h"
TickTock 12:8e42d7ba8468 7 #include "Arial28x28.h"
TickTock 12:8e42d7ba8468 8 #include "Neu42x35.h"
TickTock 12:8e42d7ba8468 9 #include "SCProSB31x55.h"
TickTock 12:8e42d7ba8468 10
TickTock 12:8e42d7ba8468 11 TOUCH_TFTx2 tt(p16, p17, p19, p20, p11, p12, p13, p6, p7, p5, "TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs0, cs1, reset
TickTock 12:8e42d7ba8468 12
TickTock 12:8e42d7ba8468 13 extern "C" {
TickTock 12:8e42d7ba8468 14 void printLast (bool force){
TickTock 12:8e42d7ba8468 15 CANMessage msg;
TickTock 12:8e42d7ba8468 16 tt.locate(0,6);
TickTock 12:8e42d7ba8468 17 tt.foreground(Red);
TickTock 12:8e42d7ba8468 18 tt.background(Yellow);
TickTock 12:8e42d7ba8468 19 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 12:8e42d7ba8468 20 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 12:8e42d7ba8468 21 for(int i=0; i<19; i++){
TickTock 12:8e42d7ba8468 22 msg = lastMsg[i+indexOffset];
TickTock 12:8e42d7ba8468 23 printf("%03x : %02x %02x %02x %02x %02x %02x %02x %02x \n",msg.id,msg.data[0],msg.data[1],msg.data[2],msg.data[3],msg.data[4],msg.data[5],msg.data[6],msg.data[7]);
TickTock 12:8e42d7ba8468 24 }
TickTock 12:8e42d7ba8468 25 }
TickTock 12:8e42d7ba8468 26
TickTock 12:8e42d7ba8468 27 void printChanged (bool force){
TickTock 12:8e42d7ba8468 28 CANMessage msg;
TickTock 12:8e42d7ba8468 29 unsigned char i,j;
TickTock 12:8e42d7ba8468 30 tt.locate(0,6);
TickTock 12:8e42d7ba8468 31 tt.foreground(Red);
TickTock 12:8e42d7ba8468 32 tt.background(Yellow);
TickTock 12:8e42d7ba8468 33 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 12:8e42d7ba8468 34 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 12:8e42d7ba8468 35 i=0;
TickTock 12:8e42d7ba8468 36 j=indexOffset;
TickTock 12:8e42d7ba8468 37 do{
TickTock 12:8e42d7ba8468 38 j=j<99?j+1:j;
TickTock 12:8e42d7ba8468 39 if(msgChanged[j]>0){
TickTock 12:8e42d7ba8468 40 msg = lastMsg[j];
TickTock 12:8e42d7ba8468 41 printf("%03x : %02x %02x %02x %02x %02x %02x %02x %02x \n",msg.id,msg.data[0],msg.data[1],msg.data[2],msg.data[3],msg.data[4],msg.data[5],msg.data[6],msg.data[7]);
TickTock 12:8e42d7ba8468 42 i++;
TickTock 12:8e42d7ba8468 43 }// if changed
TickTock 12:8e42d7ba8468 44 }while(i<19&&j<99);
TickTock 12:8e42d7ba8468 45 }
TickTock 12:8e42d7ba8468 46
TickTock 12:8e42d7ba8468 47 void printLog (bool force){
TickTock 12:8e42d7ba8468 48 static unsigned char lastDisplayLoc = 0;
TickTock 12:8e42d7ba8468 49 if(force||displayLoc!=lastDisplayLoc){ //only update if changed
TickTock 12:8e42d7ba8468 50 tt.foreground(Amber);
TickTock 12:8e42d7ba8468 51 tt.background(Black);
TickTock 12:8e42d7ba8468 52 tt.cls();
TickTock 12:8e42d7ba8468 53 tt.locate(0,6);
TickTock 12:8e42d7ba8468 54 tt.set_font((unsigned char*) Arial12x12);
TickTock 12:8e42d7ba8468 55 for(int i=0; i<19; i++){
TickTock 12:8e42d7ba8468 56 printf("%s",displayLog[displayLoc]);
TickTock 12:8e42d7ba8468 57 displayLoc=displayLoc>17?0:displayLoc+1;
TickTock 12:8e42d7ba8468 58 }
TickTock 12:8e42d7ba8468 59 }
TickTock 12:8e42d7ba8468 60 lastDisplayLoc=displayLoc;
TickTock 12:8e42d7ba8468 61 }
TickTock 12:8e42d7ba8468 62
TickTock 12:8e42d7ba8468 63 void printDTE (bool force){
TickTock 12:8e42d7ba8468 64 unsigned short gids, SOC, packV;
TickTock 12:8e42d7ba8468 65 static unsigned short lgids=0, lSOC=0, lpackV=0;
TickTock 12:8e42d7ba8468 66 CANMessage msg;
TickTock 12:8e42d7ba8468 67
TickTock 12:8e42d7ba8468 68 msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
TickTock 12:8e42d7ba8468 69 gids = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 12:8e42d7ba8468 70 msg = lastMsg[indexLastMsg[0x55b]]; //Get SOC
TickTock 12:8e42d7ba8468 71 SOC = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 12:8e42d7ba8468 72 msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts
TickTock 12:8e42d7ba8468 73 packV = (msg.data[2]<<2)+(msg.data[3]>>6);
TickTock 12:8e42d7ba8468 74
TickTock 12:8e42d7ba8468 75 tt.background(Navy);
TickTock 12:8e42d7ba8468 76 if(force) tt.cls();
TickTock 12:8e42d7ba8468 77 if(force||gids!=lgids){
TickTock 12:8e42d7ba8468 78 tt.foreground(Amber);
TickTock 12:8e42d7ba8468 79 tt.set_font((unsigned char*) Arial28x28);
TickTock 12:8e42d7ba8468 80 tt.locate(10,10);
TickTock 12:8e42d7ba8468 81 printf("%4d gids\n",gids);
TickTock 12:8e42d7ba8468 82 tt.locate(10,200);
TickTock 12:8e42d7ba8468 83 printf("%4.1f kWh\n",(float)gids*0.08);
TickTock 12:8e42d7ba8468 84 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 12:8e42d7ba8468 85 //tt.set_font((unsigned char*) Neu42x35);
TickTock 12:8e42d7ba8468 86 tt.foreground(Green);
TickTock 12:8e42d7ba8468 87 tt.locate(60,96);
TickTock 12:8e42d7ba8468 88 printf("%4.1f mi \n",(float)(gids-5)*0.33); // Approx for now
TickTock 12:8e42d7ba8468 89 lgids=gids;
TickTock 12:8e42d7ba8468 90 }
TickTock 12:8e42d7ba8468 91 if(force||SOC!=lSOC){
TickTock 12:8e42d7ba8468 92 tt.foreground(Amber);
TickTock 12:8e42d7ba8468 93 tt.set_font((unsigned char*) Arial28x28);
TickTock 12:8e42d7ba8468 94 tt.locate(200,10);
TickTock 12:8e42d7ba8468 95 printf("%4.1f%s\n",(float)SOC/10,"%");
TickTock 12:8e42d7ba8468 96 lSOC=SOC;
TickTock 12:8e42d7ba8468 97 }
TickTock 12:8e42d7ba8468 98 if(force||packV!=lpackV){
TickTock 12:8e42d7ba8468 99 tt.foreground(Amber);
TickTock 12:8e42d7ba8468 100 tt.set_font((unsigned char*) Arial28x28);
TickTock 12:8e42d7ba8468 101 tt.locate(200,200);
TickTock 12:8e42d7ba8468 102 printf("%4.1fV\n",(float)packV/2);
TickTock 12:8e42d7ba8468 103 lpackV=packV;
TickTock 12:8e42d7ba8468 104 }
TickTock 12:8e42d7ba8468 105 }
TickTock 12:8e42d7ba8468 106
TickTock 12:8e42d7ba8468 107 void braking (bool force, bool prdata){
TickTock 12:8e42d7ba8468 108 unsigned short targetBraking, regenBraking, speed;
TickTock 12:8e42d7ba8468 109 static unsigned short maxTarget = 0, maxRegen = 0, tarDivReg = 0;
TickTock 12:8e42d7ba8468 110 short rpm;
TickTock 12:8e42d7ba8468 111 unsigned long temp;
TickTock 12:8e42d7ba8468 112 static unsigned char lastPressure[4] = {200,200,200,200};
TickTock 12:8e42d7ba8468 113 unsigned char i,r,t;
TickTock 12:8e42d7ba8468 114 static unsigned char lr, lt;
TickTock 12:8e42d7ba8468 115 CANMessage msg;
TickTock 12:8e42d7ba8468 116
TickTock 12:8e42d7ba8468 117 msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
TickTock 12:8e42d7ba8468 118 regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
TickTock 12:8e42d7ba8468 119 targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
TickTock 12:8e42d7ba8468 120 if (targetBraking>maxTarget) maxTarget=targetBraking;
TickTock 12:8e42d7ba8468 121 if (regenBraking>maxRegen) maxRegen=regenBraking;
TickTock 12:8e42d7ba8468 122 if (regenBraking>50) {
TickTock 12:8e42d7ba8468 123 temp = 1000*targetBraking;
TickTock 12:8e42d7ba8468 124 temp /= regenBraking;
TickTock 12:8e42d7ba8468 125 if (temp>tarDivReg) tarDivReg=temp;
TickTock 12:8e42d7ba8468 126 }
TickTock 12:8e42d7ba8468 127 msg = lastMsg[indexLastMsg[0x176]]; //Get rpms - not sure what this is but scales to mph with .0725
TickTock 12:8e42d7ba8468 128 rpm = ((short)msg.data[0]<<8)+msg.data[1];
TickTock 12:8e42d7ba8468 129 speed =rpm>0?rpm>>3:-rpm>>3; //Take absolute to get speed; div8
TickTock 12:8e42d7ba8468 130 msg = lastMsg[indexLastMsg[0x1ca]]; //Get brake pressure
TickTock 12:8e42d7ba8468 131
TickTock 12:8e42d7ba8468 132 tt.background(Navy);
TickTock 12:8e42d7ba8468 133 if (force) {
TickTock 12:8e42d7ba8468 134 tt.cls();
TickTock 12:8e42d7ba8468 135 tt.rect(0,111,170,239,White);
TickTock 12:8e42d7ba8468 136 tt.line(0,207,170,207,White);
TickTock 12:8e42d7ba8468 137 tt.line(0,175,170,175,White);
TickTock 12:8e42d7ba8468 138 tt.line(0,143,170,143,White);
TickTock 12:8e42d7ba8468 139 lastPressure[0] = 200;
TickTock 12:8e42d7ba8468 140 lastPressure[1] = 200;
TickTock 12:8e42d7ba8468 141 lastPressure[2] = 200;
TickTock 12:8e42d7ba8468 142 lastPressure[3] = 200;
TickTock 12:8e42d7ba8468 143 }
TickTock 12:8e42d7ba8468 144 // plot bar graph for each wheel pressure
TickTock 12:8e42d7ba8468 145 for (i=0; i<4; i++){
TickTock 12:8e42d7ba8468 146 if (msg.data[i]<239) {
TickTock 12:8e42d7ba8468 147 if (msg.data[i]>lastPressure[i]){
TickTock 12:8e42d7ba8468 148 tt.fillrect(10+40*i,239-msg.data[i],40+40*i,239,Red);
TickTock 12:8e42d7ba8468 149 } else if (msg.data[i]<lastPressure[i]) {
TickTock 12:8e42d7ba8468 150 tt.fillrect(10+40*i,238-lastPressure[i],40+40*i,238-msg.data[i],Navy);
TickTock 12:8e42d7ba8468 151 }
TickTock 12:8e42d7ba8468 152 lastPressure[i]=msg.data[i];
TickTock 12:8e42d7ba8468 153 }
TickTock 12:8e42d7ba8468 154 }
TickTock 12:8e42d7ba8468 155
TickTock 12:8e42d7ba8468 156 if(targetBraking>50){
TickTock 12:8e42d7ba8468 157 targetBraking *= speed;
TickTock 12:8e42d7ba8468 158 regenBraking *= speed;
TickTock 12:8e42d7ba8468 159 temp = 200*targetBraking/maxTarget;
TickTock 12:8e42d7ba8468 160 t = (char) temp;
TickTock 12:8e42d7ba8468 161 temp = 200*regenBraking*tarDivReg/maxTarget;
TickTock 12:8e42d7ba8468 162 r = (char) temp;
TickTock 12:8e42d7ba8468 163 if(lr!=r&&prdata){
TickTock 12:8e42d7ba8468 164 tt.foreground(Amber);
TickTock 12:8e42d7ba8468 165 tt.set_font((unsigned char*) Arial28x28);
TickTock 12:8e42d7ba8468 166 tt.locate(100,50);
TickTock 12:8e42d7ba8468 167 printf("%d %d \n",regenBraking,maxRegen);
TickTock 12:8e42d7ba8468 168 tt.locate(100,90);
TickTock 12:8e42d7ba8468 169 printf("%3.1f (%3.1f%s) \n",(float)tarDivReg/1000,(float)regenBraking*tarDivReg/targetBraking/1000,"%");
TickTock 12:8e42d7ba8468 170 }
TickTock 12:8e42d7ba8468 171 if(lt!=t&&prdata){
TickTock 12:8e42d7ba8468 172 tt.foreground(Amber);
TickTock 12:8e42d7ba8468 173 tt.set_font((unsigned char*) Arial28x28);
TickTock 12:8e42d7ba8468 174 tt.locate(100,10);
TickTock 12:8e42d7ba8468 175 printf("%d %d \n",targetBraking,maxTarget);
TickTock 12:8e42d7ba8468 176 }
TickTock 12:8e42d7ba8468 177 if((lr!=r||lt!=t)&&!prdata){
TickTock 12:8e42d7ba8468 178 if(r<lr)
TickTock 12:8e42d7ba8468 179 tt.fillrect(200,239-lr,300,239-r,Red);
TickTock 12:8e42d7ba8468 180 else
TickTock 12:8e42d7ba8468 181 tt.fillrect(200,239-r,300,239,Green);
TickTock 12:8e42d7ba8468 182 if(t<lt)
TickTock 12:8e42d7ba8468 183 tt.fillrect(200,239-lt,300,239-t,Navy);
TickTock 12:8e42d7ba8468 184 else
TickTock 12:8e42d7ba8468 185 tt.fillrect(200,239-t,300,238-r,Red);
TickTock 12:8e42d7ba8468 186 lt=t;
TickTock 12:8e42d7ba8468 187 lr=r;
TickTock 12:8e42d7ba8468 188 }
TickTock 12:8e42d7ba8468 189 }
TickTock 12:8e42d7ba8468 190 }
TickTock 12:8e42d7ba8468 191
TickTock 12:8e42d7ba8468 192 void cpData(bool force){
TickTock 12:8e42d7ba8468 193 short unsigned max, min, jv, i, bd;
TickTock 12:8e42d7ba8468 194 unsigned avg;
TickTock 12:8e42d7ba8468 195 if(force){
TickTock 12:8e42d7ba8468 196 tt.foreground(White);
TickTock 12:8e42d7ba8468 197 tt.background(Navy);
TickTock 12:8e42d7ba8468 198 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 12:8e42d7ba8468 199 max=0;
TickTock 12:8e42d7ba8468 200 min=9999;
TickTock 12:8e42d7ba8468 201 avg=0;
TickTock 12:8e42d7ba8468 202 for(i=0; i<96; i++){
TickTock 12:8e42d7ba8468 203 bd=(battData[i*2+3]<<8)+battData[i*2+4];
TickTock 12:8e42d7ba8468 204 avg+=bd;
TickTock 12:8e42d7ba8468 205 if(bd>max) max=bd;
TickTock 12:8e42d7ba8468 206 if(bd<min) min=bd;
TickTock 12:8e42d7ba8468 207 }
TickTock 12:8e42d7ba8468 208 avg /= 96;
TickTock 12:8e42d7ba8468 209 if(min<3713) {
TickTock 12:8e42d7ba8468 210 jv=avg-(max-avg)*1.5;
TickTock 12:8e42d7ba8468 211 } else { // Only compute judgement value if min cellpair meets <= 3712mV requirement
TickTock 12:8e42d7ba8468 212 jv=0;
TickTock 12:8e42d7ba8468 213 }
TickTock 12:8e42d7ba8468 214 tt.cls();
TickTock 12:8e42d7ba8468 215 tt.locate(0,6);
TickTock 12:8e42d7ba8468 216 printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",max,min,avg,jv,battData[224+5],battData[224+8],battData[224+11],battData[224+14]);
TickTock 12:8e42d7ba8468 217 tt.locate(0,36);
TickTock 12:8e42d7ba8468 218 for(i=0; i<16; i++){
TickTock 12:8e42d7ba8468 219 printf("%02d-%02d : %04d %04d %04d %04d %04d %04d\n",i*6+1,i*6+6,(battData[i*12+3]<<8)+battData[i*12+4],(battData[i*12+5]<<8)+battData[i*12+6],(battData[i*12+7]<<8)+battData[i*12+8],(battData[i*12+9]<<8)+battData[i*12+10],(battData[i*12+11]<<8)+battData[i*12+12],(battData[i*12+13]<<8)+battData[i*12+14]);
TickTock 12:8e42d7ba8468 220 }
TickTock 12:8e42d7ba8468 221 tt.rect(8+0*41,16,40+0*41,28,Green);
TickTock 12:8e42d7ba8468 222 tt.rect(8+1*41,16,40+1*41,28,Yellow);
TickTock 12:8e42d7ba8468 223 //tt.rect(8+2*41,16,40+2*41,28,White);
TickTock 12:8e42d7ba8468 224 tt.rect(8+3*41,16,40+3*41,28,Red);
TickTock 12:8e42d7ba8468 225 for(i=0; i<96; i++){
TickTock 12:8e42d7ba8468 226 bd=(battData[i*2+3]<<8)+battData[i*2+4];
TickTock 12:8e42d7ba8468 227 if(bd>0){
TickTock 12:8e42d7ba8468 228 if(bd==max) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Green);
TickTock 12:8e42d7ba8468 229 //if(bd==avg) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,White);
TickTock 12:8e42d7ba8468 230 if(bd==min) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Yellow);
TickTock 12:8e42d7ba8468 231 if(bd<jv) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Red);
TickTock 12:8e42d7ba8468 232 }
TickTock 12:8e42d7ba8468 233 }
TickTock 12:8e42d7ba8468 234 showCP=false;
TickTock 12:8e42d7ba8468 235 }
TickTock 12:8e42d7ba8468 236 }
TickTock 12:8e42d7ba8468 237
TickTock 12:8e42d7ba8468 238 void updateDisplay(char display){
TickTock 12:8e42d7ba8468 239 bool changed;
TickTock 12:8e42d7ba8468 240 changed = dMode[display]!=lastDMode[display];
TickTock 12:8e42d7ba8468 241 tt.set_display(display);
TickTock 12:8e42d7ba8468 242 switch (dMode[display]) {
TickTock 12:8e42d7ba8468 243 case logScreen:
TickTock 12:8e42d7ba8468 244 printLog(changed);
TickTock 12:8e42d7ba8468 245 break;
TickTock 12:8e42d7ba8468 246 case dteScreen:
TickTock 12:8e42d7ba8468 247 printDTE(changed);
TickTock 12:8e42d7ba8468 248 break;
TickTock 12:8e42d7ba8468 249 case brakeScreen:
TickTock 12:8e42d7ba8468 250 braking(changed,true);
TickTock 12:8e42d7ba8468 251 break;
TickTock 12:8e42d7ba8468 252 case powerScreen:
TickTock 12:8e42d7ba8468 253 braking(changed,false);
TickTock 12:8e42d7ba8468 254 break;
TickTock 12:8e42d7ba8468 255 case monitorScreen:
TickTock 12:8e42d7ba8468 256 printLast(changed);
TickTock 12:8e42d7ba8468 257 break;
TickTock 12:8e42d7ba8468 258 case changedScreen:
TickTock 12:8e42d7ba8468 259 printChanged(changed);
TickTock 12:8e42d7ba8468 260 break;
TickTock 12:8e42d7ba8468 261 case cpScreen:
TickTock 12:8e42d7ba8468 262 cpData(changed||showCP);
TickTock 12:8e42d7ba8468 263 break;
TickTock 12:8e42d7ba8468 264 default:
TickTock 12:8e42d7ba8468 265 tt.background(Black);
TickTock 12:8e42d7ba8468 266 tt.cls();
TickTock 12:8e42d7ba8468 267 break;
TickTock 12:8e42d7ba8468 268 }
TickTock 12:8e42d7ba8468 269 lastDMode[display]=dMode[display];
TickTock 12:8e42d7ba8468 270
TickTock 12:8e42d7ba8468 271 switch (sMode) {
TickTock 12:8e42d7ba8468 272 case 1:
TickTock 12:8e42d7ba8468 273 tt.foreground(Yellow);
TickTock 12:8e42d7ba8468 274 tt.background(DarkCyan);
TickTock 12:8e42d7ba8468 275 tt.set_font((unsigned char*) Arial12x12);
TickTock 12:8e42d7ba8468 276 tt.fillrect(btn31x1,btn11y1,btn31x2,btn11y2,DarkCyan);
TickTock 12:8e42d7ba8468 277 tt.locate(btn31x1+5,btn11y1+5);
TickTock 12:8e42d7ba8468 278 printf("<-Prev\n");
TickTock 12:8e42d7ba8468 279 tt.fillrect(btn32x1,btn11y1,btn32x2,btn11y2,DarkCyan);
TickTock 12:8e42d7ba8468 280 tt.fillrect(btn33x1,btn11y1,btn33x2,btn11y2,DarkCyan);
TickTock 12:8e42d7ba8468 281 tt.locate(btn33x2-50,btn11y1+5);
TickTock 12:8e42d7ba8468 282 printf("Next->\n");
TickTock 12:8e42d7ba8468 283 tt.set_display(0);
TickTock 12:8e42d7ba8468 284 tt.locate(btn32x1+15,btn11y1+5);
TickTock 12:8e42d7ba8468 285 printf("Select %d\n",dMode[0]);
TickTock 12:8e42d7ba8468 286 tt.set_display(1);
TickTock 12:8e42d7ba8468 287 tt.locate(btn32x1+15,btn11y1+5);
TickTock 12:8e42d7ba8468 288 printf("Select %d\n",dMode[1]);
TickTock 12:8e42d7ba8468 289 tt.background(Black);
TickTock 12:8e42d7ba8468 290 break;
TickTock 12:8e42d7ba8468 291 default:
TickTock 12:8e42d7ba8468 292 break;
TickTock 12:8e42d7ba8468 293 }
TickTock 12:8e42d7ba8468 294 }
TickTock 12:8e42d7ba8468 295 }