Dual CANbus monitor and instrumentation cluster. Presently tuned for the Nissan Leaf EV.

Dependencies:   SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2_ILI9341 mbed

Fork of CANary_corrupt by Tick Tock

After adding the LPC1768 platform, import as a program and do not select the "update to latest revision" box

User Guide

Eagle Schematic and Board design

/media/uploads/TickTock/canaryr6.zip

/media/uploads/TickTock/canary_sch.jpg

/media/uploads/TickTock/canaryr6brd.jpg

For LCD Rev 1.01:

/media/uploads/TickTock/lcdsch.jpg

For VCD Rev 2.00:

/media/uploads/TickTock/lcdr2.jpg

Parts List

qtyinstancepart #packagesupplierDescription
1BAT3Vhttp://www.ebay.com/itm/10x-CR2032-SMD-Battery-Holder-for-CR2032-Battery-/180938057979?pt=LH_DefaultDomain_0&hash=item2a20bfa8fbLithium 2032 coin battery holder
4C1-C4ECST1DC106R6032Tantalium capacitor 10uF
3FC1-FC3ZF1-20-01-T-WThttp://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx20 conductor 1mm pitch flex cable connector (optional)
1FJ-20-R-08.00-4http://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx8\" 20 conductor 1mm pitch flex connector, end reversed (optional)
2H1-H4(DON'T populate H1-H4 headers - solder mbed directly)
1H5http://www.ebay.com/itm/221186042943?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26491x12 .1\" pitch header (optional)
1H62x6 .1\" pitch header (optional)
2IC1,IC2VP230LMDSOP8http://www.ebay.com/itm/130488665247?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649canbus transciever
1IC3LM1117-5VSOT2235V regulator
5JP*2 pin .1\" jumper header
1mbedLPC1768http://www.ebay.com/itm/200830573509?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649mbed uC
2Q1,Q22N2222SOT23General purpose NPN transistor
1R1R393M120639K resistor
1R2R103M120610K resistor
4R4-R6R102M12061K resistor
1R3R500M120650 Ohm resistor
2TR1-TR5ZJYS81R5-2PL51TG01http://www.digikey.com/product-detail/en/ZJYS81R5-2PL51T-G01/445-2223-1-ND/765232CM Choke
1Z11N5340BGC1702-15http://www.ebay.com/itm/150878122425?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26496V, 5W Zener Diode
1Z1DC-DC conveterhttp://www.ebay.com/itm/251142727849?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l264912V-7V, 3W DC-DC converter
1X1USBhttp://www.ebay.com/itm/New-Vertical-USB-2-0-A-pcb-connector-socket-USB-A-Type-/300553895292?pt=LH_DefaultDomain_0&hash=item45fa687d7cvertical USB connector
2LCD0,LCD1TFThttp://www.mikroe.com/add-on-boards/display/tft-proto/320x240 LCD with touch screen
1E0Enclosurehttp://www.shapeways.com/model/1077799/canary.html?li=user-profile&materialId=63d printed enclosure

Assembly

1) LCD Displays

I found ribbon cable is a nice way to organize the wires to the displays. There are two versions of the display and each must be wired differently. The original project used HW REV. 1.01. For that version, you'll need 12 conductors and I connected them in the following order:

1LED+
2LED-
3RST
4SDI
5WR/SCLK
6CS
7X+
8X-
9Y+
10Y-
11VDD
12GND

If, instead, you have HW REV 2.0, you will need 13 conductors with the following order:

1LED+
2LED-
3RST
4SDI
5RS (SCLK)
6WR (DC)
7CS
8X+
9X-
10Y+
11Y-
12VDD
13GND

First I connected all the GND connections (2 GND & IM0, IM1, IM3 for REV1.01 or 2 GND, RD, & IM0 for REV2.00). Do not connect the bottom GND until you have the ribbon cable connected. After making all the ribbon cable connections (connecting the GND of the ribbon cable to the bottom GND pad), solder the GND bar from the previous step to the back of the bottom GND connection. Finally, make a connection from the back side 3.3V pin to IM2 for REV1.01 or to IM1,IM2,&IM3 for REV2.00. Take a break and repeat for the second display.

Examples of REV1.01 boards:

/media/uploads/TickTock/lcdtop.jpg /media/uploads/TickTock/lcdbot.jpg

Examples of REV2.00:

/media/uploads/TickTock/rev2front.jpg /media/uploads/TickTock/rev2back.jpg

Once the two displays are complete combine all wires except CS0, CS1, X+, X-, Y+, and Y-. Connect X- of the left display to X+ of the right. Similarly connect Y- of the left display to Y+ of the right. Insulate any exposed wires.

2) PCB

Refer to the schematics to place all the components on the board. If you plan to install into the CANary 3D enclosure, DO NOT install the battery holder or the socket for the mbed and, instead, connect two wires to the VB and GND pads nearby. You will have to install the battery holder against the back wall to avoid interfering with the right-hand display and the mbed will have to be directly soldered. I have not found a socket with a low enough profile to fit in the space provided (depth of enclosure is limited by the space behind the center console). Also, I recommend keeping as much lead as possible on the Zener diode (bending it as shown to clear the back wall). Although it is operating well within parameters, the Zener gets quite hot during extended operation and the leads help dissipate the heat and keep it away from the PCB and other components.Update: Several Zeners have failed resulting in damage to some users boards so I recommend using a DC-DC converter instead to bring the 12V down to 7V.

/media/uploads/TickTock/pcbtop.jpg /media/uploads/TickTock/pcbbot.jpg

Once the PCB is populated, solder the LCDs to the PCB. CS0 connects to the right display and CS1 connects to the left. /media/uploads/TickTock/brddis.jpg

Update: The Zener diodes tended to fail after a few months so I am recommending removing them and replacing with a DC-DC converter. This will run cooler and waste less energy, too. To install, remove the left display panel to gain access to the Zener. From there, the Zener can be removed and it's pads used to connect to the DC-DC converter. I recommend setting the output voltage on the bench before installing since the trim pot is tricky to reach once installed. Set it to 7V. The input can be connected to the left pad previously occupied by the zener and the output can connect to the right. GND(-) can be connected to the bottom right pad on the 2x6 header below the flex cable connector. Make sure the GND wire lies flat so it doesn't interfere with the connection of the flex cable. /media/uploads/TickTock/dcdcinst2.jpg

Once soldered in place, the DC-DC converter can easily be mounted to the back wall with double sided tape above the battery holder. /media/uploads/TickTock/dcdcinst3.jpg

3) Testing

1)First step is to buzz out all connections from the LCDs to the pins in the main board
2)Next check the touch screen connections. On the main board, place an Ohm meter across X+ and X-. You should read 700 Ohms. Repeat for Y+ and Y-. Then test the resistance from X+ to Y+. With nothing touching the screens, it should read >100K Ohms and <1K when touching either screen.
3)When all connections are checked, solder in the mbed. Download and install the touch2 program http://mbed.org/users/TickTock/code/touch2/ to test the basic operation of the mbed and touch screens.
tips:
Touch screen is sensitive - excess flux on X+,X-,Y+,Y- connection on mbed can result in flakey operation
If touch is not working, double-check the LCD0_CS and LCD1_CS are not swapped. LCD0_CS must connect to the CS of the LCD that has X- & Y- connected to the mbed. LCD1_CS must connect to the CS of the LCD that has X+ & Y+ connected to the mbed.
4)Once touch2 works, it is time to connect to the OBD connector. I highly recommend double checking all connections from the OBD to the PCB with the cable in place before connecting to the Leaf. Buzz out all the pins in the OBS to make sure none are shorting to each other, Check that the 12V goes to the Zener (and nothing else) and the switched 12V to the resistor divider (and nothing else). Test the ground connection properly connects to ground and nothing else.
5)Once you are confident there are no shorts or wrong connections from the OBD connector, take a deep breath and plug it into your leaf. Touch2 program should come up and function. Unplug and install the latest CANary firmware. If you have the REV2.00 LCD boards, you will need to edit the precompile.h file in the TOUCH_TFTx2_w9341 library and set USE_ILI9341 to 1. Test all features before installing into the enclosure (gids, cellpair, menu system, logging) since installing and removing from the enclosure is a PITA.

/media/uploads/TickTock/pcbdone.jpg /media/uploads/TickTock/functioning.jpg

4) Enclosure

The 3D printer leaves a lot of powder behind - I used a strong spray of water to get it out of all the cracks. The enclosure comes with a rather rough finish. I recommend convincing yourself you like it, then simply lightly sand then paint before assembly. Sanding is very difficult - the nylon is very nicely fused and doesn't want to sand. I tried sandblasting and that didn't work either. I had some limited success with filler and then sanding, but only on the outside - it is too difficult to sand the face. /media/uploads/TickTock/enclosure.jpg

5) Final Assembly

Make sure you are well rested with lots of patience before attempting assembly. It is a puzzle figuring out how to get both displays and the PCB in place. Enclosure was too expensive for me to keep iterating to optimize for assembly. I ended up snipping the thin display posts shorter and using various tools to push the displays into place. Also, some USB connectors are taller than others. If you have one of the taller ones, you will have to deflect the back wall a bit while inserting the PCB (being careful not to bend the housing) to get it to it's opening in the back wall. Do use a screw in the provided post to secure the PCB as USB insertion will otherwise dislodge it.

I added an additional safety line which wraps around the center post to prevent the enclosure from becoming a projectile in the event of an accident. /media/uploads/TickTock/safety.jpg Installed: /media/uploads/TickTock/installed.jpg

Committer:
TickTock
Date:
Tue Aug 06 01:26:17 2013 +0000
Revision:
144:b0c9d30dd346
Parent:
143:88b5155622a5
Child:
148:6e3b9135fad2
added accessory volt read from battData; put a copy of the config.txt on the USB drive during firmware update; added current trip efficiency below 10 minute efficiency to dte display;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TickTock 13:62e0f7f39ff5 1 //displayModes.cpp
TickTock 37:fea2c1d52c5f 2 #include "displayModes.h"
TickTock 13:62e0f7f39ff5 3
TickTock 25:ddf0ec209f03 4 char sTemp1[40];
TickTock 24:6cf76ed8c432 5 char sTemp2[16];
TickTock 13:62e0f7f39ff5 6
TickTock 42:4533b13b297d 7 void mainDisplay (bool force, bool showButtons){
TickTock 124:0d622967b764 8 unsigned short gids, SOC_x10, packV_x2, tireP;
TickTock 136:41a204105511 9 float useable_kWh,dte;
TickTock 138:a2f5af85ed0d 10 //unsigned char aTemp,c1Temp,c2Temp;
TickTock 131:0d926c080a65 11 static unsigned short lgids=0, lSOC=0, lpackV_x2=0, ltireP=0, maxPS=0;
TickTock 138:a2f5af85ed0d 12 //static unsigned char laTemp=0,lc1Temp=0,lc2Temp=0;
TickTock 138:a2f5af85ed0d 13 static float lmaxTemp=0, lkW=0, laccV=0, lmpkWh=0;
TickTock 131:0d926c080a65 14
TickTock 13:62e0f7f39ff5 15 CANMessage msg;
TickTock 13:62e0f7f39ff5 16
TickTock 13:62e0f7f39ff5 17 msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
TickTock 13:62e0f7f39ff5 18 gids = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 13:62e0f7f39ff5 19 msg = lastMsg[indexLastMsg[0x55b]]; //Get SOC
TickTock 122:138a40892a4c 20 SOC_x10 = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 13:62e0f7f39ff5 21 msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts
TickTock 119:0e2b641e98a2 22 packV_x2 = (msg.data[2]<<2)+(msg.data[3]>>6);
TickTock 138:a2f5af85ed0d 23 //msg = lastMsg[indexLastMsg[0x79a]]; //Get ambient and cabin temperature
TickTock 138:a2f5af85ed0d 24 //aTemp = msg.data[5]-41; // Need to add convertsion to C if metric
TickTock 138:a2f5af85ed0d 25 //c1Temp = msg.data[4]-41;
TickTock 138:a2f5af85ed0d 26 //c2Temp = msg.data[6]-41;
TickTock 124:0d622967b764 27 msg = lastMsg[indexLastMsg[0x385]]; //Get tire pressure
TickTock 124:0d622967b764 28 tireP = msg.data[2]+msg.data[3]+msg.data[4]+msg.data[5];
TickTock 118:02010b18efdc 29
TickTock 13:62e0f7f39ff5 30 tt.background(Navy);
TickTock 38:155ec32c5e91 31 tt.set_font((unsigned char*) Arial28x28);
TickTock 13:62e0f7f39ff5 32 if(force) tt.cls();
TickTock 48:d1ce92104a1f 33 if(skin==ttSkin){
TickTock 50:83d5864c64a0 34 if(force||gids!=lgids||mpkWh[dtePeriod]!=lmpkWh){
TickTock 136:41a204105511 35 tt.locate(16,10);
TickTock 136:41a204105511 36 tt.foreground(White);
TickTock 136:41a204105511 37 printf("%3d gids \n",gids);
TickTock 49:a3d2c5bb3cfa 38 tt.locate(10,40);
TickTock 136:41a204105511 39 tt.foreground(Cyan);
TickTock 136:41a204105511 40 useable_kWh = (float)(gids-5)*0.075;
TickTock 136:41a204105511 41 if (useable_kWh<0){
TickTock 136:41a204105511 42 useable_kWh=0;
TickTock 136:41a204105511 43 }
TickTock 132:08748a67280a 44 printf("%4.1f kWh \n",useable_kWh);
TickTock 144:b0c9d30dd346 45 if(debugMode){
TickTock 144:b0c9d30dd346 46 if(pointerSep>maxPS){maxPS=pointerSep;}
TickTock 144:b0c9d30dd346 47 tt.locate(10,110);
TickTock 144:b0c9d30dd346 48 printf("%3d sep %3d max\n",pointerSep,maxPS);
TickTock 144:b0c9d30dd346 49 }
TickTock 136:41a204105511 50
TickTock 132:08748a67280a 51 // Display DTE
TickTock 136:41a204105511 52 dte=convertDistance(minTripEff*useable_kWh);
TickTock 136:41a204105511 53 tt.foreground(Green);
TickTock 138:a2f5af85ed0d 54 tt.locate(20,80);
TickTock 139:ac227b203ef2 55 if(dte>=9.5){
TickTock 136:41a204105511 56 printf("%2.0f \n",dte); //LM - add metric conversion
TickTock 136:41a204105511 57 }else{
TickTock 136:41a204105511 58 printf("%2.1f \n",dte); //LM - add metric conversion
TickTock 136:41a204105511 59 }
TickTock 136:41a204105511 60
TickTock 48:d1ce92104a1f 61 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 136:41a204105511 62 tt.foreground(Yellow);
TickTock 136:41a204105511 63 dte=convertDistance(mpkWh[dtePeriod]*useable_kWh);
TickTock 136:41a204105511 64 if(dte>199){
TickTock 136:41a204105511 65 dte=199;
TickTock 136:41a204105511 66 }
TickTock 136:41a204105511 67 // " "=0x10, "."=0x15, #=0x1D
TickTock 139:ac227b203ef2 68 if(dte>=99.5){
TickTock 138:a2f5af85ed0d 69 tt.locate(80,85);
TickTock 138:a2f5af85ed0d 70 printf(" %3.0f\n",dte); //LM - add metric conversion
TickTock 139:ac227b203ef2 71 }else if(dte>=9.5){
TickTock 138:a2f5af85ed0d 72 tt.locate(94,85);
TickTock 136:41a204105511 73 printf(" %2.0f\n",dte); //LM - add metric conversion
TickTock 136:41a204105511 74 }else{
TickTock 138:a2f5af85ed0d 75 tt.locate(89,85);
TickTock 136:41a204105511 76 printf(" %2.1f\n",dte); //LM - add metric conversion
TickTock 136:41a204105511 77 }
TickTock 136:41a204105511 78 tt.set_font((unsigned char*) Arial28x28);
TickTock 138:a2f5af85ed0d 79 tt.locate(195,106);
TickTock 137:70853cf5a30f 80 printf("%s\n",distanceUnit()); //LM - add metric conversion
TickTock 136:41a204105511 81
TickTock 136:41a204105511 82 dte=convertDistance(maxTripEff*useable_kWh);
TickTock 136:41a204105511 83 tt.foreground(Orange);
TickTock 139:ac227b203ef2 84 if(dte>=99.5){
TickTock 138:a2f5af85ed0d 85 tt.locate(255,80);
TickTock 138:a2f5af85ed0d 86 printf("%3.0f \n",dte); //LM - add metric conversion
TickTock 139:ac227b203ef2 87 }else if(dte>=9.5){
TickTock 138:a2f5af85ed0d 88 tt.locate(270,80);
TickTock 136:41a204105511 89 printf("%2.0f \n",dte); //LM - add metric conversion
TickTock 136:41a204105511 90 }else{
TickTock 138:a2f5af85ed0d 91 tt.locate(265,80);
TickTock 136:41a204105511 92 printf("%2.1f \n",dte); //LM - add metric conversion
TickTock 136:41a204105511 93 }
TickTock 48:d1ce92104a1f 94 lgids=gids;
TickTock 50:83d5864c64a0 95 lmpkWh=mpkWh[dtePeriod];
TickTock 48:d1ce92104a1f 96 }
TickTock 49:a3d2c5bb3cfa 97 if(force||kW[0]!=lkW){
TickTock 136:41a204105511 98 tt.foreground(Cyan);
TickTock 122:138a40892a4c 99 if(kW[0]<-10){ //Right justify
TickTock 122:138a40892a4c 100 tt.locate(171,40);
TickTock 122:138a40892a4c 101 printf("%4.2fkW\n",kW[0]);
TickTock 122:138a40892a4c 102 } else if (kW[0]<0){
TickTock 122:138a40892a4c 103 tt.locate(171,40);
TickTock 122:138a40892a4c 104 printf(" %4.2fkW\n",kW[0]);
TickTock 122:138a40892a4c 105 } else if (kW[0]<10){
TickTock 122:138a40892a4c 106 tt.locate(165,40);
TickTock 122:138a40892a4c 107 printf(" %4.2fkW\n",kW[0]);
TickTock 122:138a40892a4c 108 } else {
TickTock 122:138a40892a4c 109 tt.locate(165,40);
TickTock 122:138a40892a4c 110 printf(" %4.2fkW\n",kW[0]);
TickTock 122:138a40892a4c 111 }
TickTock 49:a3d2c5bb3cfa 112 lkW=kW[0];
TickTock 48:d1ce92104a1f 113 }
TickTock 136:41a204105511 114 if(force||SOC_x10!=lSOC){
TickTock 136:41a204105511 115 tt.locate(215,10);
TickTock 136:41a204105511 116 tt.foreground(White);
TickTock 136:41a204105511 117 printf("%4.1f%s\n",(float)SOC_x10/10,"%");
TickTock 136:41a204105511 118 lSOC=SOC_x10;
TickTock 136:41a204105511 119 }
TickTock 136:41a204105511 120 if(force||packV_x2!=lpackV_x2){
TickTock 136:41a204105511 121 tt.locate(210,176);
TickTock 136:41a204105511 122 tt.foreground(Yellow);
TickTock 136:41a204105511 123 printf("%4.1fV\n",(float)packV_x2/2);
TickTock 136:41a204105511 124 lpackV_x2=packV_x2;
TickTock 136:41a204105511 125 ltireP=0;//Force tire pressure redraw, too
TickTock 136:41a204105511 126 }
TickTock 138:a2f5af85ed0d 127 /*if(force||aTemp!=laTemp){
TickTock 138:a2f5af85ed0d 128 tt.foreground(Cyan);
TickTock 138:a2f5af85ed0d 129 tt.locate(10,146);
TickTock 138:a2f5af85ed0d 130 printf("%d %d %d\n",aTemp,c1Temp,c2Temp);
TickTock 138:a2f5af85ed0d 131 laTemp=aTemp;
TickTock 138:a2f5af85ed0d 132 lc1Temp=c1Temp;
TickTock 138:a2f5af85ed0d 133 lc2Temp=c2Temp;
TickTock 138:a2f5af85ed0d 134 }*/
TickTock 136:41a204105511 135 if(force||maxTemp!=lmaxTemp){
TickTock 136:41a204105511 136 tt.foreground(Cyan);
TickTock 138:a2f5af85ed0d 137 tt.locate(210,146);
TickTock 136:41a204105511 138 if (convertTemperature(maxTemp)<100){
TickTock 136:41a204105511 139 printf(" %3.1f%s\n",convertTemperature(maxTemp),temperatureUnit());
TickTock 136:41a204105511 140 }else{
TickTock 136:41a204105511 141 printf("%4.1f%s\n",convertTemperature(maxTemp),temperatureUnit());
TickTock 136:41a204105511 142 }
TickTock 136:41a204105511 143 lmaxTemp=maxTemp;
TickTock 136:41a204105511 144 }
TickTock 136:41a204105511 145 if(force||accV!=laccV){
TickTock 136:41a204105511 146 tt.locate(20,176);
TickTock 136:41a204105511 147 tt.foreground(Yellow);
TickTock 144:b0c9d30dd346 148 if(debugMode){
TickTock 144:b0c9d30dd346 149 printf("%4.2f %4.2f \n",accV,accV2);
TickTock 144:b0c9d30dd346 150 }else{
TickTock 144:b0c9d30dd346 151 printf("%3.1fV \n",accV);
TickTock 144:b0c9d30dd346 152 }
TickTock 136:41a204105511 153 laccV=accV;
TickTock 136:41a204105511 154 }
TickTock 131:0d926c080a65 155 if(force||tireP!=ltireP){
TickTock 134:ad243e4f1a17 156 if(msg.data[2]<minTirePressure){
TickTock 134:ad243e4f1a17 157 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 158 }else{
TickTock 134:ad243e4f1a17 159 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 160 }
TickTock 131:0d926c080a65 161 if(msg.data[6]&0x80){
TickTock 134:ad243e4f1a17 162 if(msg.data[2]<minTirePressure){
TickTock 134:ad243e4f1a17 163 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 164 }else{
TickTock 134:ad243e4f1a17 165 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 166 }
TickTock 131:0d926c080a65 167 tt.locate(10,206);
TickTock 131:0d926c080a65 168 printf("%3.1f\n",(float)msg.data[2]/4);
TickTock 131:0d926c080a65 169 }
TickTock 131:0d926c080a65 170 if(msg.data[6]&0x40){
TickTock 134:ad243e4f1a17 171 if(msg.data[3]<minTirePressure){
TickTock 134:ad243e4f1a17 172 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 173 }else{
TickTock 134:ad243e4f1a17 174 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 175 }
TickTock 131:0d926c080a65 176 tt.locate(90,206);
TickTock 131:0d926c080a65 177 printf("%3.1f\n",(float)msg.data[3]/4);
TickTock 131:0d926c080a65 178 }
TickTock 131:0d926c080a65 179 if(msg.data[6]&0x20){
TickTock 134:ad243e4f1a17 180 if(msg.data[4]<minTirePressure){
TickTock 134:ad243e4f1a17 181 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 182 }else{
TickTock 134:ad243e4f1a17 183 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 184 }
TickTock 131:0d926c080a65 185 tt.locate(170,206);
TickTock 131:0d926c080a65 186 printf("%3.1f\n",(float)msg.data[4]/4);
TickTock 131:0d926c080a65 187 }
TickTock 131:0d926c080a65 188 if(msg.data[6]&0x10){
TickTock 134:ad243e4f1a17 189 if(msg.data[5]<minTirePressure){
TickTock 134:ad243e4f1a17 190 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 191 }else{
TickTock 134:ad243e4f1a17 192 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 193 }
TickTock 131:0d926c080a65 194 tt.locate(250,206);
TickTock 131:0d926c080a65 195 printf("%3.1f\n",(float)msg.data[5]/4);
TickTock 131:0d926c080a65 196 }
TickTock 131:0d926c080a65 197 ltireP=tireP;
TickTock 102:fd19f777a0b4 198 }
TickTock 48:d1ce92104a1f 199 }else {//if(skin==ggSkin){
TickTock 48:d1ce92104a1f 200 if(force||gids!=lgids){
TickTock 48:d1ce92104a1f 201 tt.locate(10,10);
TickTock 48:d1ce92104a1f 202 printf("%4d GIDs \n",gids);
TickTock 48:d1ce92104a1f 203
TickTock 48:d1ce92104a1f 204 tt.locate(40,40); // gg - add GIDs Percent of 281
TickTock 48:d1ce92104a1f 205 printf("%4.1f%s \n", (float)gids*0.355872, "% ") ;
TickTock 48:d1ce92104a1f 206 tt.locate(20,70);
TickTock 48:d1ce92104a1f 207 printf("%4.1f kwh \n",(float)gids*0.075); // gg - closer to usable
TickTock 48:d1ce92104a1f 208
TickTock 48:d1ce92104a1f 209 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 48:d1ce92104a1f 210 tt.foreground(Green);
TickTock 48:d1ce92104a1f 211 //tt.locate(60,96);
TickTock 48:d1ce92104a1f 212 tt.locate(60,116); // gg - move down a little
leafman 98:9f8bab96edff 213 printf("%4.1f %s \n",convertDistance((float)(gids-5)*0.31),distanceUnit()); // Approx for now - LM added metric
TickTock 48:d1ce92104a1f 214 lgids=gids;
TickTock 48:d1ce92104a1f 215 tt.foreground(Yellow);
TickTock 48:d1ce92104a1f 216 tt.set_font((unsigned char*) Arial28x28);
TickTock 48:d1ce92104a1f 217 }
TickTock 48:d1ce92104a1f 218
TickTock 122:138a40892a4c 219 if(force||SOC_x10!=lSOC){
TickTock 48:d1ce92104a1f 220 tt.locate(200,10);
TickTock 122:138a40892a4c 221 printf("%4.1f%s\n",(float)SOC_x10/10,"% ");
TickTock 122:138a40892a4c 222 lSOC=SOC_x10;
TickTock 48:d1ce92104a1f 223 }
TickTock 119:0e2b641e98a2 224 if(force||packV_x2!=lpackV_x2){
TickTock 48:d1ce92104a1f 225 tt.locate(200,200);
TickTock 119:0e2b641e98a2 226 printf("%4.1fV \n",(float)packV_x2/2);
TickTock 119:0e2b641e98a2 227 lpackV_x2=packV_x2;
TickTock 48:d1ce92104a1f 228 }
TickTock 48:d1ce92104a1f 229 if(force||accV!=laccV){
TickTock 48:d1ce92104a1f 230 tt.locate(20,200);
TickTock 48:d1ce92104a1f 231 printf("%3.1fV \n",accV);
TickTock 48:d1ce92104a1f 232 laccV=accV;
TickTock 48:d1ce92104a1f 233 }
TickTock 49:a3d2c5bb3cfa 234 if(force||kW[0]!=lkW){
TickTock 48:d1ce92104a1f 235 tt.locate(160,40); // gg - move left to keep from wrap
TickTock 49:a3d2c5bb3cfa 236 printf("%3.2fkw \n",kW[0]); // use small w to save space
TickTock 49:a3d2c5bb3cfa 237 lkW=kW[0];
TickTock 48:d1ce92104a1f 238 }
TickTock 35:5acbd8a64a89 239 }
TickTock 108:29b5a760adc2 240 if(led4){
TickTock 106:f016912a03db 241 tt.fillcircle(310,10,6,Red);
TickTock 106:f016912a03db 242 }else{
TickTock 106:f016912a03db 243 tt.fillcircle(310,10,6,Navy);
TickTock 106:f016912a03db 244 }
TickTock 13:62e0f7f39ff5 245 }
TickTock 13:62e0f7f39ff5 246
TickTock 42:4533b13b297d 247 void printLast (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 248 CANMessage msg;
TickTock 13:62e0f7f39ff5 249 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 250 tt.foreground(Red);
TickTock 13:62e0f7f39ff5 251 tt.background(Yellow);
TickTock 13:62e0f7f39ff5 252 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 13:62e0f7f39ff5 253 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 13:62e0f7f39ff5 254 for(int i=0; i<19; i++){
TickTock 13:62e0f7f39ff5 255 msg = lastMsg[i+indexOffset];
TickTock 13:62e0f7f39ff5 256 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 13:62e0f7f39ff5 257 }
TickTock 122:138a40892a4c 258 if(showButtons){
TickTock 25:ddf0ec209f03 259 tt.foreground(Yellow);
TickTock 25:ddf0ec209f03 260 tt.background(DarkCyan);
TickTock 25:ddf0ec209f03 261 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 262
garygid 54:6ce808d0995e 263 showButton(0,0," <up>","",4,4);
garygid 54:6ce808d0995e 264 showButton(2,0,"<down>","",4,4);
TickTock 25:ddf0ec209f03 265 }
TickTock 13:62e0f7f39ff5 266 }
TickTock 13:62e0f7f39ff5 267
TickTock 42:4533b13b297d 268 void printChanged (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 269 CANMessage msg;
TickTock 13:62e0f7f39ff5 270 unsigned char i,j;
TickTock 13:62e0f7f39ff5 271 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 272 tt.foreground(Red);
TickTock 13:62e0f7f39ff5 273 tt.background(Yellow);
TickTock 13:62e0f7f39ff5 274 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 13:62e0f7f39ff5 275 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 13:62e0f7f39ff5 276 i=0;
TickTock 13:62e0f7f39ff5 277 j=indexOffset;
TickTock 13:62e0f7f39ff5 278 do{
TickTock 13:62e0f7f39ff5 279 j=j<99?j+1:j;
TickTock 13:62e0f7f39ff5 280 if(msgChanged[j]>0){
TickTock 13:62e0f7f39ff5 281 msg = lastMsg[j];
TickTock 13:62e0f7f39ff5 282 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 13:62e0f7f39ff5 283 i++;
TickTock 13:62e0f7f39ff5 284 }// if changed
TickTock 13:62e0f7f39ff5 285 }while(i<19&&j<99);
TickTock 122:138a40892a4c 286 if(showButtons){
TickTock 40:0e6e71a7323f 287 tt.foreground(Yellow);
TickTock 40:0e6e71a7323f 288 tt.background(DarkCyan);
TickTock 40:0e6e71a7323f 289 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 290 showButton(0,0," <up>","",4,4);
garygid 54:6ce808d0995e 291 showButton(2,0," <down>","",4,4);
garygid 54:6ce808d0995e 292 showButton(1,0," Reset","Baseline",4,4);
TickTock 40:0e6e71a7323f 293 }
TickTock 13:62e0f7f39ff5 294 }
TickTock 13:62e0f7f39ff5 295
TickTock 42:4533b13b297d 296 void printLog (bool force, bool showButtons){
TickTock 118:02010b18efdc 297 static unsigned char lastldl = 0;
TickTock 118:02010b18efdc 298 unsigned char ldl=displayLoc;
TickTock 118:02010b18efdc 299 if(force||ldl!=lastldl){ //only update if changed
TickTock 13:62e0f7f39ff5 300 tt.foreground(Amber);
TickTock 13:62e0f7f39ff5 301 tt.background(Black);
TickTock 13:62e0f7f39ff5 302 tt.cls();
TickTock 13:62e0f7f39ff5 303 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 304 tt.set_font((unsigned char*) Arial12x12);
TickTock 13:62e0f7f39ff5 305 for(int i=0; i<19; i++){
TickTock 118:02010b18efdc 306 printf("%s",displayLog[ldl]);
TickTock 118:02010b18efdc 307 ldl=ldl>17?0:ldl+1;
TickTock 13:62e0f7f39ff5 308 }
TickTock 13:62e0f7f39ff5 309 }
TickTock 118:02010b18efdc 310 lastldl=ldl;
TickTock 13:62e0f7f39ff5 311 }
TickTock 13:62e0f7f39ff5 312
TickTock 118:02010b18efdc 313 void tripDisplay (bool force, bool showButtons){
TickTock 118:02010b18efdc 314 static float lkWh=0;
TickTock 118:02010b18efdc 315 tt.background(White);
TickTock 118:02010b18efdc 316 if(force){
TickTock 118:02010b18efdc 317 tt.cls();
TickTock 118:02010b18efdc 318 }
TickTock 118:02010b18efdc 319 if(force||(int)(lkWh*100)!=(int)(kWh_trip[0]*100)){ //only update if changed
TickTock 118:02010b18efdc 320 tt.foreground(Navy);
TickTock 118:02010b18efdc 321 tt.set_font((unsigned char*) Arial28x28);
TickTock 118:02010b18efdc 322 tt.locate(6,210);
TickTock 118:02010b18efdc 323 printf("kWh : %s : Eff\n",distanceUnit());
TickTock 118:02010b18efdc 324 for(int i=0; i<3; i++){
TickTock 118:02010b18efdc 325 tt.locate(6,20+i*60);
TickTock 118:02010b18efdc 326 printf("%3.2f : %3.1f : %2.1f\n",kWh_trip[i],convertDistance(miles_trip[i]),convertDistance(miles_trip[i])/kWh_trip[i]);
TickTock 118:02010b18efdc 327 }
TickTock 122:138a40892a4c 328 }
TickTock 122:138a40892a4c 329 if(showButtons){
TickTock 118:02010b18efdc 330 tt.set_font((unsigned char*) Arial12x12);
TickTock 118:02010b18efdc 331 tt.background(DarkCyan);
TickTock 118:02010b18efdc 332 tt.foreground(Yellow);
TickTock 118:02010b18efdc 333 showButton(3,1," Reset"," A",4,4);
TickTock 118:02010b18efdc 334 showButton(3,2," Reset"," B",4,4);
TickTock 118:02010b18efdc 335 lkWh=kWh_trip[0];
TickTock 118:02010b18efdc 336 }
TickTock 118:02010b18efdc 337 }
TickTock 118:02010b18efdc 338
TickTock 118:02010b18efdc 339 void healthDisplay (bool force, bool showButtons){
TickTock 131:0d926c080a65 340 unsigned short gids, SOC_x10, SOH_x2;
TickTock 118:02010b18efdc 341 static unsigned short lgids=0, lSOC=0, lSOH=0;
TickTock 124:0d622967b764 342 static float lmaxTemp=0, lresr=0, lunlV=0;
TickTock 118:02010b18efdc 343 static unsigned long lAh=0;
TickTock 13:62e0f7f39ff5 344 CANMessage msg;
TickTock 13:62e0f7f39ff5 345
TickTock 13:62e0f7f39ff5 346 msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
TickTock 13:62e0f7f39ff5 347 gids = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 13:62e0f7f39ff5 348 msg = lastMsg[indexLastMsg[0x55b]]; //Get SOC
TickTock 122:138a40892a4c 349 SOC_x10 = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 131:0d926c080a65 350 msg = lastMsg[indexLastMsg[0x5b3]]; //Get SOH
TickTock 131:0d926c080a65 351 SOH_x2 = msg.data[1];
TickTock 13:62e0f7f39ff5 352
TickTock 118:02010b18efdc 353 tt.background(Blue);
TickTock 38:155ec32c5e91 354 tt.foreground(Yellow);
TickTock 38:155ec32c5e91 355 tt.set_font((unsigned char*) Arial28x28);
TickTock 13:62e0f7f39ff5 356 if(force) tt.cls();
TickTock 121:553faf139a20 357
TickTock 121:553faf139a20 358 /*if(force||tock){ // for esr debug
TickTock 121:553faf139a20 359 tt.locate(10,10);
TickTock 121:553faf139a20 360 printf("%d %d amps\n",Imax,Imin);
TickTock 121:553faf139a20 361 tt.locate(10,40);
TickTock 121:553faf139a20 362 printf(" %4.1f %4.1f\n",incRmax/2,incRmin/2);
TickTock 121:553faf139a20 363 tt.locate(10,70);
TickTock 121:553faf139a20 364 printf(" %4.1f %4.1f\n",redRmax/2,redRmin/2);
TickTock 121:553faf139a20 365 tt.locate(10,100);
TickTock 121:553faf139a20 366 printf(" %4.1f %4.1f\n",curRmax/2,curRmin/2);
TickTock 121:553faf139a20 367 //tt.locate(10,130);
TickTock 121:553faf139a20 368 curRmin=1000;
TickTock 121:553faf139a20 369 curRmax=0;
TickTock 121:553faf139a20 370 incRmin=1000;
TickTock 121:553faf139a20 371 incRmax=0;
TickTock 121:553faf139a20 372 redRmin=1000;
TickTock 121:553faf139a20 373 redRmax=0;
TickTock 121:553faf139a20 374 Imax=-1000;
TickTock 121:553faf139a20 375 Imin=1000;
TickTock 121:553faf139a20 376 }*/
TickTock 118:02010b18efdc 377 if(force||gids!=lgids){
TickTock 118:02010b18efdc 378 tt.locate(10,10);
TickTock 118:02010b18efdc 379 printf("%4d gids \n",gids);
TickTock 119:0e2b641e98a2 380 lgids=gids;
TickTock 118:02010b18efdc 381 }
TickTock 122:138a40892a4c 382 if(force||SOC_x10!=lSOC){
TickTock 119:0e2b641e98a2 383 tt.locate(10,40);
TickTock 122:138a40892a4c 384 printf(" %4.1f%s \n",(float)SOC_x10/10,"% SOC");
TickTock 122:138a40892a4c 385 lSOC=SOC_x10;
TickTock 118:02010b18efdc 386 }
TickTock 143:88b5155622a5 387 if(force||SOH2_x100!=lSOH){
TickTock 118:02010b18efdc 388 tt.locate(10,70);
TickTock 143:88b5155622a5 389 printf(" %4.1f%s,%4.1f%s \n",(float)SOH_x2/2,"%",(float)SOH2_x100/100,"% SOH");
TickTock 143:88b5155622a5 390 lSOH=SOH2_x100;
TickTock 118:02010b18efdc 391 }
TickTock 118:02010b18efdc 392 if(force||Ah_x10000!=lAh){
TickTock 118:02010b18efdc 393 tt.locate(10,100);
TickTock 120:041edeec08f5 394 printf(" %4.2f Ah cap \n",(float)Ah_x10000/10000);
TickTock 118:02010b18efdc 395 lAh=Ah_x10000;
TickTock 118:02010b18efdc 396 }
TickTock 124:0d622967b764 397 if(force||maxTemp!=lmaxTemp){
TickTock 124:0d622967b764 398 tt.locate(10,130);
TickTock 124:0d622967b764 399 printf(" %4.1f %s (max) \n",convertTemperature(maxTemp),temperatureUnit());
TickTock 124:0d622967b764 400 lmaxTemp=maxTemp;
TickTock 124:0d622967b764 401 }
TickTock 123:a8c0042df617 402 if(force||unloadedV_x2!=lunlV){
TickTock 124:0d622967b764 403 tt.locate(10,160);
TickTock 120:041edeec08f5 404 printf(" %4.1f V \n",unloadedV_x2/2);
TickTock 119:0e2b641e98a2 405 lunlV=unloadedV_x2;
TickTock 118:02010b18efdc 406 }
TickTock 118:02010b18efdc 407 if(force||Resr!=lresr){
TickTock 124:0d622967b764 408 tt.locate(10,190);
TickTock 120:041edeec08f5 409 printf(" %3.0f mOhms \n",Resr*1000);
TickTock 118:02010b18efdc 410 lresr=Resr;
TickTock 35:5acbd8a64a89 411 }
TickTock 13:62e0f7f39ff5 412 }
TickTock 13:62e0f7f39ff5 413
TickTock 42:4533b13b297d 414 void braking (bool force, bool showButtons, bool prdata=false){
TickTock 28:f24ac05645d9 415 unsigned long targetBraking, regenBraking;
TickTock 73:62ee8eae3a84 416 static unsigned long maxTarget = 1000, maxRegen = 1000, tardivreg_x1000 = 1000;
TickTock 28:f24ac05645d9 417 unsigned long temp;
TickTock 28:f24ac05645d9 418 static unsigned char lastPressure[4] = {200,200,200,200};
TickTock 28:f24ac05645d9 419 unsigned char i,r,t;
TickTock 37:fea2c1d52c5f 420 static unsigned char lr=0, lt=0;
TickTock 37:fea2c1d52c5f 421 signed short steering;
TickTock 37:fea2c1d52c5f 422 unsigned short s;
TickTock 37:fea2c1d52c5f 423 static unsigned short ls;
TickTock 37:fea2c1d52c5f 424 unsigned char throttle;
TickTock 37:fea2c1d52c5f 425 static unsigned char lthrottle;
TickTock 48:d1ce92104a1f 426 short steerOutBounds = 0 ;
TickTock 28:f24ac05645d9 427 CANMessage msg;
TickTock 28:f24ac05645d9 428
TickTock 48:d1ce92104a1f 429 //---------------
TickTock 37:fea2c1d52c5f 430 msg = lastMsg[indexLastMsg[0x180]]; //Get Throttle position
TickTock 37:fea2c1d52c5f 431 throttle = msg.data[5];
TickTock 48:d1ce92104a1f 432
TickTock 48:d1ce92104a1f 433 // ---- steering ----
TickTock 37:fea2c1d52c5f 434 msg = lastMsg[indexLastMsg[0x002]]; //Get Steering angle
TickTock 37:fea2c1d52c5f 435 steering = (msg.data[1]<<8)+msg.data[0];
TickTock 48:d1ce92104a1f 436
TickTock 48:d1ce92104a1f 437 if(skin==ttSkin){
TickTock 66:b7476ce7a59e 438 s= (unsigned short) ((steering/10)+155)%310; // this modulo wraps display
TickTock 48:d1ce92104a1f 439 }else{// if(skin==ggSkin){
TickTock 48:d1ce92104a1f 440 // do not go off screen left or right. gg - steering
TickTock 48:d1ce92104a1f 441 short ss = (short) ((steering/15)+160); // less gain 10 -> 15
TickTock 48:d1ce92104a1f 442 if(ss<0) { ss=0; steerOutBounds = 1; }
TickTock 48:d1ce92104a1f 443 if(ss>310) { ss=310; steerOutBounds = 1; }
TickTock 48:d1ce92104a1f 444 s = (unsigned short) ss;
TickTock 48:d1ce92104a1f 445 }
TickTock 48:d1ce92104a1f 446
TickTock 48:d1ce92104a1f 447 //--------------
TickTock 28:f24ac05645d9 448 msg = lastMsg[indexLastMsg[0x1ca]]; //Get brake pressure
TickTock 28:f24ac05645d9 449 tt.background(Navy);
TickTock 28:f24ac05645d9 450 if (force) {
TickTock 28:f24ac05645d9 451 tt.cls();
TickTock 28:f24ac05645d9 452 tt.rect(0,111,170,239,White);
TickTock 28:f24ac05645d9 453 tt.line(0,207,170,207,White);
TickTock 28:f24ac05645d9 454 tt.line(0,175,170,175,White);
TickTock 28:f24ac05645d9 455 tt.line(0,143,170,143,White);
TickTock 28:f24ac05645d9 456 lastPressure[0] = 200;
TickTock 28:f24ac05645d9 457 lastPressure[1] = 200;
TickTock 28:f24ac05645d9 458 lastPressure[2] = 200;
TickTock 28:f24ac05645d9 459 lastPressure[3] = 200;
TickTock 28:f24ac05645d9 460 }
TickTock 48:d1ce92104a1f 461
TickTock 48:d1ce92104a1f 462 // display the steering position small square
TickTock 37:fea2c1d52c5f 463 if (s!=ls){
TickTock 48:d1ce92104a1f 464 // steering position has moved
TickTock 48:d1ce92104a1f 465 //tt.fillrect(ls,5,ls+9,14, Navy); // blank old position
TickTock 48:d1ce92104a1f 466
TickTock 48:d1ce92104a1f 467 //---- gg - steering red
TickTock 48:d1ce92104a1f 468 // box is blanked by top of Braking bar, so move up 5
TickTock 48:d1ce92104a1f 469 tt.fillrect(ls,0,ls+9,9, Navy); // blank old position
TickTock 48:d1ce92104a1f 470 if( steerOutBounds != 0 ) // draw out-of-bounds as a red box
TickTock 48:d1ce92104a1f 471 tt.fillrect(s,0,s+9,9, Red); // draw out-of-bounds position
TickTock 48:d1ce92104a1f 472 else
TickTock 48:d1ce92104a1f 473 tt.fillrect(s,0,s+9,9, White); // draw new in-bounds position
TickTock 48:d1ce92104a1f 474
TickTock 48:d1ce92104a1f 475 //----
TickTock 37:fea2c1d52c5f 476 //tt.foreground(Yellow);
TickTock 37:fea2c1d52c5f 477 //tt.set_font((unsigned char*) Arial28x28);
TickTock 37:fea2c1d52c5f 478 //tt.locate(10,40);
TickTock 37:fea2c1d52c5f 479 //printf("%d %d \n",s,ls);
TickTock 37:fea2c1d52c5f 480 ls=s;
TickTock 37:fea2c1d52c5f 481 }
TickTock 48:d1ce92104a1f 482
TickTock 37:fea2c1d52c5f 483 if (throttle!=lthrottle){
TickTock 37:fea2c1d52c5f 484 if (throttle>239) throttle=239;
TickTock 37:fea2c1d52c5f 485 if(throttle<lthrottle){
TickTock 37:fea2c1d52c5f 486 tt.fillrect(280,239-lthrottle,310,239-throttle,Navy);
TickTock 37:fea2c1d52c5f 487 }else{
TickTock 37:fea2c1d52c5f 488 tt.fillrect(280,239-throttle,310,239,Yellow);
TickTock 37:fea2c1d52c5f 489 }
TickTock 37:fea2c1d52c5f 490 lthrottle=throttle;
TickTock 37:fea2c1d52c5f 491 }
TickTock 37:fea2c1d52c5f 492
TickTock 28:f24ac05645d9 493 // plot bar graph for each wheel pressure
TickTock 28:f24ac05645d9 494 for (i=0; i<4; i++){
TickTock 28:f24ac05645d9 495 if (msg.data[i]<239) {
TickTock 28:f24ac05645d9 496 if (msg.data[i]>lastPressure[i]){
TickTock 28:f24ac05645d9 497 tt.fillrect(10+40*i,239-msg.data[i],40+40*i,239,Red);
TickTock 28:f24ac05645d9 498 } else if (msg.data[i]<lastPressure[i]) {
TickTock 28:f24ac05645d9 499 tt.fillrect(10+40*i,238-lastPressure[i],40+40*i,238-msg.data[i],Navy);
TickTock 28:f24ac05645d9 500 }
TickTock 28:f24ac05645d9 501 lastPressure[i]=msg.data[i];
TickTock 28:f24ac05645d9 502 }
TickTock 28:f24ac05645d9 503 }
TickTock 28:f24ac05645d9 504
TickTock 73:62ee8eae3a84 505 msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
TickTock 73:62ee8eae3a84 506 regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
TickTock 73:62ee8eae3a84 507 targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
TickTock 113:f388b4505463 508 msg = lastMsg[indexLastMsg[0x421]]; //Get Drive Mode
TickTock 113:f388b4505463 509 if (msg.data[0]==0x18) { // In Neutral
TickTock 108:29b5a760adc2 510 regenBraking = 0; // No regen when in Neutral
TickTock 108:29b5a760adc2 511 }
TickTock 73:62ee8eae3a84 512
TickTock 73:62ee8eae3a84 513 if (targetBraking<2045){
TickTock 73:62ee8eae3a84 514 if ((targetBraking>50)&&(regenBraking>50)){
TickTock 73:62ee8eae3a84 515 temp = targetBraking;
TickTock 73:62ee8eae3a84 516 temp *= 1000;
TickTock 73:62ee8eae3a84 517 temp /= regenBraking;
TickTock 73:62ee8eae3a84 518 if (temp<tardivreg_x1000) tardivreg_x1000=temp;
TickTock 73:62ee8eae3a84 519 }
TickTock 73:62ee8eae3a84 520 if (targetBraking>maxTarget) maxTarget=targetBraking;
TickTock 73:62ee8eae3a84 521 if (regenBraking>maxRegen) maxRegen=regenBraking;
TickTock 73:62ee8eae3a84 522 temp = targetBraking;
TickTock 73:62ee8eae3a84 523 temp *=200;
TickTock 73:62ee8eae3a84 524 temp /= maxTarget;
TickTock 73:62ee8eae3a84 525 t = (char) temp;
TickTock 73:62ee8eae3a84 526 if (t>200) t=200;
TickTock 73:62ee8eae3a84 527 temp = regenBraking;
TickTock 73:62ee8eae3a84 528 temp *= tardivreg_x1000;
TickTock 73:62ee8eae3a84 529 temp /= maxTarget;
TickTock 73:62ee8eae3a84 530 temp /= 5; // 1000/200=5
TickTock 73:62ee8eae3a84 531 r = (char) temp;
TickTock 73:62ee8eae3a84 532 if (r>200) r=200;
TickTock 73:62ee8eae3a84 533 if(lr!=r&&prdata){
TickTock 73:62ee8eae3a84 534 tt.foreground(Yellow);
TickTock 73:62ee8eae3a84 535 tt.set_font((unsigned char*) Arial28x28);
TickTock 73:62ee8eae3a84 536 tt.locate(100,40);
TickTock 73:62ee8eae3a84 537 printf("%d %d \n",regenBraking,maxRegen);
TickTock 73:62ee8eae3a84 538 tt.locate(100,70);
TickTock 73:62ee8eae3a84 539 printf("%3.1f (%3.1f%s) \n",(float)tardivreg_x1000/10,(float)regenBraking*tardivreg_x1000/targetBraking/10,"%");
TickTock 73:62ee8eae3a84 540 }
TickTock 73:62ee8eae3a84 541 if(lt!=t&&prdata){
TickTock 73:62ee8eae3a84 542 tt.foreground(Yellow);
TickTock 73:62ee8eae3a84 543 tt.set_font((unsigned char*) Arial28x28);
TickTock 73:62ee8eae3a84 544 tt.locate(100,10);
TickTock 73:62ee8eae3a84 545 printf("%d %d \n",targetBraking,maxTarget);
TickTock 73:62ee8eae3a84 546 }
TickTock 73:62ee8eae3a84 547 if (r>t) t=r; //Should never happen
TickTock 73:62ee8eae3a84 548 if((lr!=r||lt!=t)&&!prdata){
TickTock 73:62ee8eae3a84 549 tt.fillrect(190,10,260,239-t,Navy);
TickTock 73:62ee8eae3a84 550 tt.fillrect(190,239-t,260,239-r,Red);
TickTock 73:62ee8eae3a84 551 tt.fillrect(190,239-r,260,239,Green);
TickTock 73:62ee8eae3a84 552 }
TickTock 73:62ee8eae3a84 553 lt=t;
TickTock 73:62ee8eae3a84 554 lr=r;
TickTock 28:f24ac05645d9 555 }
TickTock 28:f24ac05645d9 556 }
TickTock 28:f24ac05645d9 557
TickTock 42:4533b13b297d 558 void cpData(bool force, bool showButtons){
TickTock 36:dbd39c315258 559 short unsigned max, min, jv, i, bd;
TickTock 36:dbd39c315258 560 unsigned avg;
TickTock 97:a25940fd7b5b 561 static char step=0; // counter to allow incremental update
TickTock 36:dbd39c315258 562 if(force){
TickTock 36:dbd39c315258 563 tt.foreground(White);
TickTock 36:dbd39c315258 564 tt.background(Navy);
TickTock 36:dbd39c315258 565 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 36:dbd39c315258 566 max=0;
TickTock 36:dbd39c315258 567 min=9999;
TickTock 36:dbd39c315258 568 avg=0;
TickTock 36:dbd39c315258 569 for(i=0; i<96; i++){
TickTock 124:0d622967b764 570 bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
TickTock 36:dbd39c315258 571 avg+=bd;
TickTock 36:dbd39c315258 572 if(bd>max) max=bd;
TickTock 36:dbd39c315258 573 if(bd<min) min=bd;
TickTock 36:dbd39c315258 574 }
TickTock 36:dbd39c315258 575 avg /= 96;
TickTock 36:dbd39c315258 576 if(min<3713) {
TickTock 36:dbd39c315258 577 jv=avg-(max-avg)*1.5;
TickTock 36:dbd39c315258 578 } else { // Only compute judgement value if min cellpair meets <= 3712mV requirement
TickTock 36:dbd39c315258 579 jv=0;
TickTock 36:dbd39c315258 580 }
TickTock 99:c05abf8e1cdc 581
TickTock 107:e9be732c1ad4 582 char* sTemperatureUnit = temperatureUnit();
TickTock 97:a25940fd7b5b 583 switch(step){
TickTock 97:a25940fd7b5b 584 case 0:
TickTock 97:a25940fd7b5b 585 tt.cls();
TickTock 97:a25940fd7b5b 586 showCP=true;
TickTock 97:a25940fd7b5b 587 break;
TickTock 97:a25940fd7b5b 588 case 1:
TickTock 97:a25940fd7b5b 589 tt.locate(0,6);
TickTock 99:c05abf8e1cdc 590 printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n\n",
TickTock 124:0d622967b764 591 max,min,avg,jv, convertTemperature(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+8]),sTemperatureUnit,
TickTock 124:0d622967b764 592 convertTemperature(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+14]),sTemperatureUnit);
TickTock 97:a25940fd7b5b 593 tt.rect(8+0*41,16,40+0*41,28,Green);
TickTock 97:a25940fd7b5b 594 tt.rect(8+1*41,16,40+1*41,28,Yellow);
TickTock 97:a25940fd7b5b 595 //tt.rect(8+2*41,16,40+2*41,28,White);
TickTock 97:a25940fd7b5b 596 tt.rect(8+3*41,16,40+3*41,28,Red);
TickTock 97:a25940fd7b5b 597 break;
TickTock 97:a25940fd7b5b 598 default:
TickTock 97:a25940fd7b5b 599 tt.locate(0,36+(step-2)*48);
TickTock 97:a25940fd7b5b 600 for(i=(step-2)*4; i<(step-1)*4; i++){
TickTock 97:a25940fd7b5b 601 printf("%02d-%02d : %04d %04d %04d %04d %04d %04d\n",
TickTock 97:a25940fd7b5b 602 i*6+1,i*6+6,
TickTock 124:0d622967b764 603 (battData[BatDataBaseG2*7+i*12+3]<<8)+battData[BatDataBaseG2*7+i*12+4],(battData[BatDataBaseG2*7+i*12+5]<<8)+battData[BatDataBaseG2*7+i*12+6],
TickTock 124:0d622967b764 604 (battData[BatDataBaseG2*7+i*12+7]<<8)+battData[BatDataBaseG2*7+i*12+8],(battData[BatDataBaseG2*7+i*12+9]<<8)+battData[BatDataBaseG2*7+i*12+10],
TickTock 124:0d622967b764 605 (battData[BatDataBaseG2*7+i*12+11]<<8)+battData[BatDataBaseG2*7+i*12+12],(battData[BatDataBaseG2*7+i*12+13]<<8)+battData[BatDataBaseG2*7+i*12+14]);
TickTock 97:a25940fd7b5b 606 }
TickTock 97:a25940fd7b5b 607 for(i=(step-2)*24; i<(step-1)*24; i++){
TickTock 124:0d622967b764 608 bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
TickTock 97:a25940fd7b5b 609 if(bd>0){
TickTock 97:a25940fd7b5b 610 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 97:a25940fd7b5b 611 //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 97:a25940fd7b5b 612 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 97:a25940fd7b5b 613 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 97:a25940fd7b5b 614 }
TickTock 97:a25940fd7b5b 615 }
TickTock 36:dbd39c315258 616 }
TickTock 97:a25940fd7b5b 617 step=step<5?step+1:0;
TickTock 97:a25940fd7b5b 618 if(step==0){
TickTock 97:a25940fd7b5b 619 showCP=false;
TickTock 36:dbd39c315258 620 }
TickTock 36:dbd39c315258 621 }
TickTock 122:138a40892a4c 622 if(showButtons){
TickTock 36:dbd39c315258 623 tt.foreground(Yellow);
TickTock 36:dbd39c315258 624 tt.background(DarkCyan);
TickTock 36:dbd39c315258 625 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 626
garygid 54:6ce808d0995e 627 showButton(1,0,"Request","CP Data",4,4);
TickTock 44:6262a9fd1e56 628 }
TickTock 44:6262a9fd1e56 629 }
TickTock 44:6262a9fd1e56 630
TickTock 44:6262a9fd1e56 631 //----------------
garygid 67:2022fce701d0 632 // gg - index
garygid 67:2022fce701d0 633 void showIndex(bool force, bool showButtons){
garygid 67:2022fce701d0 634
garygid 67:2022fce701d0 635 if(force){
garygid 67:2022fce701d0 636 tt.foreground(White);
garygid 67:2022fce701d0 637 tt.background(Navy);
garygid 67:2022fce701d0 638 //tt.set_font((unsigned char*) Arial12x12_prop); // select the font
garygid 67:2022fce701d0 639
garygid 67:2022fce701d0 640 tt.cls();
garygid 67:2022fce701d0 641
garygid 67:2022fce701d0 642 // add the buttons to GoTo to other screens
garygid 67:2022fce701d0 643
garygid 67:2022fce701d0 644 tt.foreground(Yellow);
garygid 67:2022fce701d0 645 tt.background(DarkCyan);
garygid 67:2022fce701d0 646 tt.set_font((unsigned char*) Arial12x12);
garygid 67:2022fce701d0 647
garygid 67:2022fce701d0 648 // top row
garygid 67:2022fce701d0 649 showButton(0,0," GoTo"," Main",4,4);
garygid 67:2022fce701d0 650 showButton(1,0," GoTo"," Brake",4,4);
garygid 67:2022fce701d0 651 showButton(2,0," GoTo"," EFF",4,4);
TickTock 122:138a40892a4c 652 showButton(3,0," GoTo","Health",4,4);
garygid 67:2022fce701d0 653 // middle row
garygid 67:2022fce701d0 654 showButton(0,1," GoTo","CP Data",4,4);
garygid 67:2022fce701d0 655 showButton(1,1," GoTo","CP Hist",4,4);
garygid 67:2022fce701d0 656 showButton(2,1," GoTo","CP Bars",4,4);
leafman 98:9f8bab96edff 657 showButton(3,1," GoTo"," Config",4,4);
leafman 98:9f8bab96edff 658 // bottom (not Nav) row
leafman 98:9f8bab96edff 659 showButton(0,2," GoTo","Playback",4,4);
TickTock 131:0d926c080a65 660 //showButton(1,2," GoTo","Set Time",4,4);
leafman 98:9f8bab96edff 661 showButton(2,2," GoTo"," Log",4,4);
TickTock 108:29b5a760adc2 662 showButton(3,2," GoTo"," Trip",4,4);
garygid 67:2022fce701d0 663
garygid 67:2022fce701d0 664 showCP=false;
garygid 67:2022fce701d0 665 }
garygid 67:2022fce701d0 666
garygid 67:2022fce701d0 667 if(sMode==1&&showButtons){
garygid 67:2022fce701d0 668 tt.foreground(Yellow);
garygid 67:2022fce701d0 669 tt.background(DarkCyan);
garygid 67:2022fce701d0 670 tt.set_font((unsigned char*) Arial12x12);
garygid 67:2022fce701d0 671
garygid 67:2022fce701d0 672 // do nothing here?
garygid 67:2022fce701d0 673 }
garygid 67:2022fce701d0 674 }
garygid 67:2022fce701d0 675
garygid 67:2022fce701d0 676 //----------------
TickTock 48:d1ce92104a1f 677 // gg - cpbars
TickTock 48:d1ce92104a1f 678 void cpBarPlot(bool force, bool showButtons){
TickTock 48:d1ce92104a1f 679 short unsigned max, min, jv, i, bd;
TickTock 48:d1ce92104a1f 680 unsigned avg;
TickTock 48:d1ce92104a1f 681 short unsigned nBar[96] ; // bar height over min
TickTock 48:d1ce92104a1f 682
TickTock 48:d1ce92104a1f 683 if(force){
TickTock 48:d1ce92104a1f 684 tt.foreground(White);
TickTock 48:d1ce92104a1f 685 tt.background(Navy);
TickTock 48:d1ce92104a1f 686 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 48:d1ce92104a1f 687 max=0;
TickTock 48:d1ce92104a1f 688 min=9999;
TickTock 48:d1ce92104a1f 689 avg=0;
TickTock 48:d1ce92104a1f 690
TickTock 48:d1ce92104a1f 691 // calc each cell-pair voltage, find max and min
TickTock 48:d1ce92104a1f 692 for(i=0; i<96; i++){
TickTock 124:0d622967b764 693 bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
TickTock 48:d1ce92104a1f 694 nBar[i] = bd; // init to bar height
TickTock 48:d1ce92104a1f 695 avg+=bd;
TickTock 48:d1ce92104a1f 696 if(bd>max) max=bd;
TickTock 48:d1ce92104a1f 697 if(bd<min) min=bd;
TickTock 48:d1ce92104a1f 698 }
TickTock 48:d1ce92104a1f 699 avg /= 96;
TickTock 48:d1ce92104a1f 700
TickTock 48:d1ce92104a1f 701 if(min<3713) {
TickTock 48:d1ce92104a1f 702 jv=avg-(max-avg)*1.5;
TickTock 48:d1ce92104a1f 703 } else { // Only compute judgement value if min cellpair meets <= 3712mV requirement
TickTock 48:d1ce92104a1f 704 jv=0;
TickTock 48:d1ce92104a1f 705 }
TickTock 48:d1ce92104a1f 706
TickTock 48:d1ce92104a1f 707 //------------------
TickTock 48:d1ce92104a1f 708 tt.cls();
TickTock 48:d1ce92104a1f 709
TickTock 48:d1ce92104a1f 710 // show as vertical bar plot
TickTock 48:d1ce92104a1f 711 int xWinMin = 26;
TickTock 48:d1ce92104a1f 712 int xWinMax = 316;
TickTock 48:d1ce92104a1f 713 int yWinMin = 50;
TickTock 48:d1ce92104a1f 714 int yWinMax = 150;
TickTock 48:d1ce92104a1f 715 // draw the Bar Graph Frame, 2 pixels wide
TickTock 48:d1ce92104a1f 716 tt.rect( xWinMin-1,yWinMin-1, xWinMax+1,yWinMax+1,Red);
TickTock 48:d1ce92104a1f 717 tt.rect( xWinMin-2,yWinMin-2, xWinMax+2,yWinMax+2,Green);
TickTock 48:d1ce92104a1f 718
TickTock 48:d1ce92104a1f 719 // bar heights
TickTock 48:d1ce92104a1f 720 int height = yWinMax - yWinMin ;
TickTock 48:d1ce92104a1f 721 int iBarValMax = max - min ; // zero to N
TickTock 48:d1ce92104a1f 722
TickTock 48:d1ce92104a1f 723 //----------------
TickTock 48:d1ce92104a1f 724 if( iBarValMax == 0 ) {
TickTock 48:d1ce92104a1f 725 // for testing
TickTock 48:d1ce92104a1f 726 min = 3501 ;
TickTock 48:d1ce92104a1f 727 //max = min + 95*2 ; // for tall values
TickTock 48:d1ce92104a1f 728 max = min + 95/4 ; // for small values
TickTock 48:d1ce92104a1f 729 avg = ( max + min ) / 2;
TickTock 48:d1ce92104a1f 730 iBarValMax = max - min ; // zero to N
TickTock 48:d1ce92104a1f 731 for(int i=0; i<96; i++) {
TickTock 48:d1ce92104a1f 732 //nBar[i] = i*2 + min ; // test tall values
TickTock 48:d1ce92104a1f 733 nBar[i] = i/4 + min ; // test small values
TickTock 48:d1ce92104a1f 734 }
TickTock 48:d1ce92104a1f 735 }
TickTock 48:d1ce92104a1f 736 //---------------
TickTock 48:d1ce92104a1f 737 float nBarScale = float(height) / iBarValMax ;
TickTock 48:d1ce92104a1f 738 if( nBarScale < 0.1 ) nBarScale = 0.1 ;
TickTock 48:d1ce92104a1f 739
TickTock 48:d1ce92104a1f 740 // do the Bar-height scaling
TickTock 48:d1ce92104a1f 741 for(int i=0; i<96; i++){
TickTock 48:d1ce92104a1f 742 nBar[i] -= min ; // now, 0 to N = iBinValMax
TickTock 48:d1ce92104a1f 743 nBar[i] *= nBarScale ; // scale, as needed
TickTock 48:d1ce92104a1f 744 }
TickTock 48:d1ce92104a1f 745
TickTock 138:a2f5af85ed0d 746 // label the X axis (approximate)
TickTock 138:a2f5af85ed0d 747 //tt.locate( 2, yWinMin-14 ); printf("%04d = %04d from %1.4f", max, int( height / nBarScale ) + min, nBarScale );
TickTock 138:a2f5af85ed0d 748 tt.locate( 2, yWinMin-14 ); printf("%04d = (%d) mv range.\n", max , max - min );
TickTock 138:a2f5af85ed0d 749 tt.locate( 2, yWinMax+5); printf("%04d\n", min );
TickTock 48:d1ce92104a1f 750 // values, for now
TickTock 124:0d622967b764 751 // BatDataBaseG4 * 7 = 280
TickTock 48:d1ce92104a1f 752 tt.locate( 0, yWinMax+40 );
TickTock 108:29b5a760adc2 753 char* sTemperatureUnit = temperatureUnit();
TickTock 138:a2f5af85ed0d 754 printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n",
TickTock 124:0d622967b764 755 max,min,avg,jv, convertTemperature(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+8]),sTemperatureUnit,
TickTock 124:0d622967b764 756 convertTemperature(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+14]),sTemperatureUnit);
TickTock 108:29b5a760adc2 757 //printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
TickTock 124:0d622967b764 758 // max,min,avg,jv, battData[BatDataBaseG4*7+5],battData[BatDataBaseG4*7+8], battData[BatDataBaseG4*7+11],battData[BatDataBaseG4*7+14]);
TickTock 48:d1ce92104a1f 759
TickTock 48:d1ce92104a1f 760
TickTock 48:d1ce92104a1f 761 //---------------
TickTock 48:d1ce92104a1f 762 // show the bars
TickTock 48:d1ce92104a1f 763 int nBarWidth = 2 ;
TickTock 48:d1ce92104a1f 764 int nBarSpace = 1 ; // 1 for testing
TickTock 48:d1ce92104a1f 765
TickTock 48:d1ce92104a1f 766 int xPos = xWinMin + 2 ; // start one from the left
TickTock 48:d1ce92104a1f 767
TickTock 48:d1ce92104a1f 768 for( int i=0; i<96; i++) {
TickTock 48:d1ce92104a1f 769 height = nBar[i] ;
TickTock 48:d1ce92104a1f 770 if( height > 100 ) height = 100 ; // clip tops
TickTock 48:d1ce92104a1f 771
TickTock 48:d1ce92104a1f 772 // draw the bar, is always inside x-window
TickTock 121:553faf139a20 773 if (shunt[i]){
TickTock 121:553faf139a20 774 tt.fillrect( xPos,yWinMax-height, xPos+nBarWidth-1,yWinMax, Red);
TickTock 121:553faf139a20 775 } else {
TickTock 121:553faf139a20 776 tt.fillrect( xPos,yWinMax-height, xPos+nBarWidth-1,yWinMax, Green);
TickTock 121:553faf139a20 777 }
TickTock 48:d1ce92104a1f 778 // tic mark the y axis each 5
TickTock 48:d1ce92104a1f 779 if(i%5 == 4){
TickTock 48:d1ce92104a1f 780 tt.line( xPos,yWinMax+2, xPos,yWinMax+5, White); // a white tick mark
TickTock 48:d1ce92104a1f 781 tt.line( xPos+1,yWinMax+2, xPos+1,yWinMax+5, White); // a white tick mark, to widen
TickTock 48:d1ce92104a1f 782 //tt.rect( xPos,yWinMax+2, xPos+1,yWinMax+5, White); // a white 2-wide tick mark is SLOW
TickTock 48:d1ce92104a1f 783 }
TickTock 48:d1ce92104a1f 784 // label the y axis each 10
TickTock 48:d1ce92104a1f 785 if(i%10 == 9){
TickTock 48:d1ce92104a1f 786 tt.locate( xPos-6, yWinMax+8 );
TickTock 48:d1ce92104a1f 787 printf("%02d\n", i+1 );
TickTock 48:d1ce92104a1f 788 }
TickTock 48:d1ce92104a1f 789
TickTock 48:d1ce92104a1f 790 // step to the next bar position
TickTock 48:d1ce92104a1f 791 xPos += nBarWidth + nBarSpace ;
TickTock 48:d1ce92104a1f 792 }
TickTock 48:d1ce92104a1f 793
TickTock 48:d1ce92104a1f 794 showCP=false;
TickTock 48:d1ce92104a1f 795 }
TickTock 48:d1ce92104a1f 796
TickTock 48:d1ce92104a1f 797 // handle the button
TickTock 48:d1ce92104a1f 798 if(sMode==1&&showButtons){
TickTock 48:d1ce92104a1f 799 tt.foreground(Yellow);
TickTock 48:d1ce92104a1f 800 tt.background(DarkCyan);
TickTock 48:d1ce92104a1f 801 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 802
garygid 54:6ce808d0995e 803 showButton(1,0,"Request","CP Data",4,4);
TickTock 48:d1ce92104a1f 804 }
TickTock 48:d1ce92104a1f 805 }
TickTock 48:d1ce92104a1f 806
TickTock 48:d1ce92104a1f 807 //----------------
TickTock 44:6262a9fd1e56 808 // gg - hist
TickTock 47:9cc7d876dd6d 809 void cpHistogram(bool force, bool showButtons){
TickTock 44:6262a9fd1e56 810 short unsigned max, min, jv, i, bd;
TickTock 44:6262a9fd1e56 811 unsigned avg;
TickTock 44:6262a9fd1e56 812 if(force){
TickTock 44:6262a9fd1e56 813 tt.foreground(White);
TickTock 44:6262a9fd1e56 814 tt.background(Navy);
TickTock 44:6262a9fd1e56 815 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 44:6262a9fd1e56 816 max=0;
TickTock 44:6262a9fd1e56 817 min=9999;
TickTock 44:6262a9fd1e56 818 avg=0;
TickTock 44:6262a9fd1e56 819 for(i=0; i<96; i++){
TickTock 124:0d622967b764 820 bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4];
TickTock 44:6262a9fd1e56 821 avg+=bd;
TickTock 44:6262a9fd1e56 822 if(bd>max) max=bd;
TickTock 44:6262a9fd1e56 823 if(bd<min) min=bd;
TickTock 44:6262a9fd1e56 824 }
TickTock 44:6262a9fd1e56 825 avg /= 96;
TickTock 44:6262a9fd1e56 826 if(min<3713) {
TickTock 44:6262a9fd1e56 827 jv=avg-(max-avg)*1.5;
TickTock 44:6262a9fd1e56 828 } else { // Only compute judgement value if min cellpair meets <= 3712mV requirement
TickTock 44:6262a9fd1e56 829 jv=0;
TickTock 44:6262a9fd1e56 830 }
TickTock 44:6262a9fd1e56 831
TickTock 44:6262a9fd1e56 832 //------------------
TickTock 44:6262a9fd1e56 833 tt.cls();
TickTock 44:6262a9fd1e56 834
TickTock 44:6262a9fd1e56 835 // show as histogram
TickTock 44:6262a9fd1e56 836 int xWinMin = 20;
TickTock 44:6262a9fd1e56 837 int xWinMax = 300;
TickTock 44:6262a9fd1e56 838 int yWinMin = 50;
TickTock 44:6262a9fd1e56 839 int yWinMax = 150;
TickTock 44:6262a9fd1e56 840 // draw the Histogram Frame, 2 pixels wide
TickTock 44:6262a9fd1e56 841 tt.rect( xWinMin-1,yWinMin-1, xWinMax+1,yWinMax+1,Red);
TickTock 44:6262a9fd1e56 842 tt.rect( xWinMin-2,yWinMin-2, xWinMax+2,yWinMax+2,Green);
TickTock 44:6262a9fd1e56 843
TickTock 44:6262a9fd1e56 844 // binning
TickTock 44:6262a9fd1e56 845 short nBin[301] ; // bins to count Min values in nBin[0], etc.
TickTock 44:6262a9fd1e56 846 int height ;
TickTock 44:6262a9fd1e56 847 int iBinIndxMax = 300 ;
TickTock 44:6262a9fd1e56 848 int iBinValMax = max - min ; // zero to N
TickTock 44:6262a9fd1e56 849 if( iBinValMax > iBinIndxMax ) iBinValMax = iBinIndxMax ;
TickTock 44:6262a9fd1e56 850
TickTock 44:6262a9fd1e56 851 // clean the bins
TickTock 44:6262a9fd1e56 852 for(int i=0; i<=iBinIndxMax; i++) {
TickTock 44:6262a9fd1e56 853 nBin[i] = 0;
TickTock 44:6262a9fd1e56 854 }
TickTock 44:6262a9fd1e56 855
TickTock 44:6262a9fd1e56 856 // do the bin counting
TickTock 44:6262a9fd1e56 857 for(int i=0; i<96; i++){
TickTock 124:0d622967b764 858 bd=(battData[BatDataBaseG2*7+i*2+3]<<8)+battData[BatDataBaseG2*7+i*2+4] - min ;
TickTock 44:6262a9fd1e56 859 if( bd > iBinValMax ) bd = iBinValMax ;
TickTock 44:6262a9fd1e56 860 nBin[bd] ++ ;
TickTock 44:6262a9fd1e56 861 }
TickTock 44:6262a9fd1e56 862
TickTock 44:6262a9fd1e56 863 //----------------
TickTock 44:6262a9fd1e56 864 if( iBinValMax == 0 ) {
TickTock 44:6262a9fd1e56 865 // for testing
TickTock 44:6262a9fd1e56 866 min = 10 ;
TickTock 44:6262a9fd1e56 867 max = 50 ;
TickTock 44:6262a9fd1e56 868 avg = ( max + min ) / 2;
TickTock 44:6262a9fd1e56 869 iBinValMax = max - min ;
TickTock 44:6262a9fd1e56 870 for(int i=0; i<=(iBinValMax/2); i++) {
TickTock 44:6262a9fd1e56 871 nBin[i] = i ;
TickTock 44:6262a9fd1e56 872 nBin[iBinValMax-i] = i ;
TickTock 44:6262a9fd1e56 873 }
TickTock 44:6262a9fd1e56 874 }
TickTock 44:6262a9fd1e56 875
TickTock 48:d1ce92104a1f 876 // the values, for now
TickTock 124:0d622967b764 877 // BatDataBaseG4 * 7 = 280
TickTock 48:d1ce92104a1f 878 tt.locate( 0, yWinMax+40 );
TickTock 108:29b5a760adc2 879 char* sTemperatureUnit = temperatureUnit();
TickTock 108:29b5a760adc2 880 printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n\n",
TickTock 124:0d622967b764 881 max,min,avg,jv, convertTemperature(battData[BatDataBaseG4*7+5]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+8]),sTemperatureUnit,
TickTock 124:0d622967b764 882 convertTemperature(battData[BatDataBaseG4*7+11]),sTemperatureUnit,convertTemperature(battData[BatDataBaseG4*7+14]),sTemperatureUnit);
TickTock 108:29b5a760adc2 883 //printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
TickTock 124:0d622967b764 884 // max,min,avg,jv, battData[BatDataBaseG2*7+BatDataBaseG4*7+5],battData[BatDataBaseG2*7+BatDataBaseG4*7+8], battData[BatDataBaseG2*7+BatDataBaseG4*7+11],battData[BatDataBaseG2*7+BatDataBaseG4*7+14]);
TickTock 48:d1ce92104a1f 885
TickTock 44:6262a9fd1e56 886 //---------------
TickTock 44:6262a9fd1e56 887 // show the bars
TickTock 44:6262a9fd1e56 888 int nBarWidth = 3 ;
TickTock 44:6262a9fd1e56 889 int nBarSpace = 1 ; // 1 for testing
TickTock 44:6262a9fd1e56 890
TickTock 44:6262a9fd1e56 891 int xPos = (xWinMin + xWinMax) / 2 ;
TickTock 44:6262a9fd1e56 892 xPos -= (avg-min) * (nBarWidth + nBarSpace) ;
TickTock 44:6262a9fd1e56 893
TickTock 44:6262a9fd1e56 894 for( int i=0; i<=iBinValMax; i++) {
TickTock 44:6262a9fd1e56 895 height = 4 * nBin[i] ;
TickTock 44:6262a9fd1e56 896 if( height > 100 ) height = 100 ; // clip tops
TickTock 44:6262a9fd1e56 897
TickTock 44:6262a9fd1e56 898 // if inside the window, draw the bar
TickTock 44:6262a9fd1e56 899 if( ( xPos + nBarWidth < xWinMax ) && ( xPos > xWinMin ) )
TickTock 44:6262a9fd1e56 900 tt.fillrect( xPos,yWinMax-height, xPos+nBarWidth-1,yWinMax, Green);
TickTock 44:6262a9fd1e56 901
TickTock 44:6262a9fd1e56 902 // step to the next bar position
TickTock 44:6262a9fd1e56 903 xPos += nBarWidth + nBarSpace ;
TickTock 44:6262a9fd1e56 904 }
TickTock 44:6262a9fd1e56 905
TickTock 44:6262a9fd1e56 906 showCP=false;
TickTock 44:6262a9fd1e56 907 }
TickTock 44:6262a9fd1e56 908
TickTock 44:6262a9fd1e56 909 // handle the button
TickTock 47:9cc7d876dd6d 910 if(sMode==1&&showButtons){
TickTock 44:6262a9fd1e56 911 tt.foreground(Yellow);
TickTock 44:6262a9fd1e56 912 tt.background(DarkCyan);
TickTock 44:6262a9fd1e56 913 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 914
garygid 54:6ce808d0995e 915 showButton(1,0,"Request","CP Data",4,4);
garygid 54:6ce808d0995e 916 }
TickTock 36:dbd39c315258 917 }
TickTock 36:dbd39c315258 918
TickTock 48:d1ce92104a1f 919 //---------------
leafman 98:9f8bab96edff 920 void config(bool force, bool showButtons){
TickTock 36:dbd39c315258 921 if (force) {
TickTock 36:dbd39c315258 922 tt.background(Black);
TickTock 36:dbd39c315258 923 tt.cls();
TickTock 36:dbd39c315258 924 }
TickTock 36:dbd39c315258 925 tt.foreground(Yellow);
TickTock 36:dbd39c315258 926 tt.background(DarkCyan);
TickTock 36:dbd39c315258 927 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 928
garygid 65:821fc79cd7fe 929 //-------- top row --------
garygid 54:6ce808d0995e 930 showButton(0,0,"Calibrate"," Touch",4,4); // gg - 4x4
garygid 54:6ce808d0995e 931 showButton(1,0," Reset","",4,4);
TickTock 131:0d926c080a65 932 showButton(2,0," Save"," Config",4,4);
garygid 65:821fc79cd7fe 933
garygid 65:821fc79cd7fe 934 // a button to step to the next skin
garygid 65:821fc79cd7fe 935 unsigned int nextSkin = skin + 1 ;
garygid 65:821fc79cd7fe 936 if( nextSkin > maxSkin ) nextSkin = 0 ;
garygid 54:6ce808d0995e 937
garygid 65:821fc79cd7fe 938 if( nextSkin == ttSkin ) sprintf(sTemp1,"Skin TT");
garygid 65:821fc79cd7fe 939 else if( nextSkin == ggSkin ) sprintf(sTemp1,"Skin GG");
garygid 65:821fc79cd7fe 940 else sprintf(sTemp1,"Skin %d",nextSkin);
garygid 65:821fc79cd7fe 941
TickTock 131:0d926c080a65 942 showButton(3,0," Use",sTemp1,4,4);
TickTock 48:d1ce92104a1f 943
TickTock 48:d1ce92104a1f 944 //------- second row -----
TickTock 108:29b5a760adc2 945 if (logEn&&usbEn) {
garygid 54:6ce808d0995e 946 sprintf(sTemp1,"Disable");
TickTock 36:dbd39c315258 947 } else {
garygid 54:6ce808d0995e 948 sprintf(sTemp1,"Enable");
TickTock 36:dbd39c315258 949 }
garygid 54:6ce808d0995e 950 showButton(0,1,sTemp1,"Logging",4,4);
TickTock 48:d1ce92104a1f 951
TickTock 36:dbd39c315258 952 if (repeatPoll) {
garygid 54:6ce808d0995e 953 sprintf(sTemp1,"Disable");
TickTock 36:dbd39c315258 954 } else {
garygid 54:6ce808d0995e 955 sprintf(sTemp1,"Enable");
TickTock 36:dbd39c315258 956 }
garygid 54:6ce808d0995e 957 showButton(1,1,sTemp1,"Auto CP",4,4);
TickTock 48:d1ce92104a1f 958
TickTock 48:d1ce92104a1f 959 // add Enable/Disable Batt Log gg - yesBattLog
TickTock 48:d1ce92104a1f 960 if (yesBattLog) {
garygid 54:6ce808d0995e 961 sprintf(sTemp1,"Disable");
TickTock 48:d1ce92104a1f 962 } else {
garygid 54:6ce808d0995e 963 sprintf(sTemp1,"Enable");
TickTock 48:d1ce92104a1f 964 }
garygid 54:6ce808d0995e 965 showButton(2,1,sTemp1,"Batt Log",4,4);
garygid 87:46ac3f2519d6 966
garygid 87:46ac3f2519d6 967 // add Enable/Disable Debug - debugMode
garygid 87:46ac3f2519d6 968 if (debugMode) {
TickTock 131:0d926c080a65 969 sprintf(sTemp1," Disable");
garygid 87:46ac3f2519d6 970 } else {
TickTock 131:0d926c080a65 971 sprintf(sTemp1," Enable");
garygid 87:46ac3f2519d6 972 }
garygid 87:46ac3f2519d6 973 showButton(3,1,sTemp1," Debug",4,4);
leafman 98:9f8bab96edff 974
TickTock 140:ab3e94eb0227 975 if(brakeMon)
TickTock 140:ab3e94eb0227 976 showButton(0,2,"Disable","BrkMon",4,4);
leafman 98:9f8bab96edff 977 else
TickTock 140:ab3e94eb0227 978 showButton(0,2," Enable"," BrkMon",4,4);
leafman 98:9f8bab96edff 979
TickTock 131:0d926c080a65 980 showButton(1,2," Set"," Time",4,4);
TickTock 131:0d926c080a65 981 if (showHealth) {
TickTock 131:0d926c080a65 982 sprintf(sTemp1," Hide");
TickTock 131:0d926c080a65 983 } else {
TickTock 131:0d926c080a65 984 sprintf(sTemp1," Show");
TickTock 131:0d926c080a65 985 }
TickTock 131:0d926c080a65 986 showButton(2,2,sTemp1," Health",4,4);
leafman 98:9f8bab96edff 987 showButton(3,2,"Update","Firmware",4,4);
leafman 98:9f8bab96edff 988
TickTock 36:dbd39c315258 989 }
TickTock 36:dbd39c315258 990
TickTock 42:4533b13b297d 991 void pbScreen(bool force, bool showButtons){
TickTock 36:dbd39c315258 992 if (force) {
TickTock 36:dbd39c315258 993 tt.background(Black);
TickTock 36:dbd39c315258 994 tt.cls();
TickTock 36:dbd39c315258 995 }
TickTock 36:dbd39c315258 996 tt.foreground(Yellow);
TickTock 36:dbd39c315258 997 tt.background(DarkCyan);
TickTock 36:dbd39c315258 998 tt.set_font((unsigned char*) Arial12x12);
TickTock 36:dbd39c315258 999 if(playbackOpen){
garygid 54:6ce808d0995e 1000 showButton(0,0,"Slower"," <--",4,4);
garygid 54:6ce808d0995e 1001
TickTock 36:dbd39c315258 1002 if(playbackEn){
garygid 54:6ce808d0995e 1003 sprintf(sTemp1,"Pause");
TickTock 36:dbd39c315258 1004 }else{
garygid 54:6ce808d0995e 1005 sprintf(sTemp1," Run");
TickTock 36:dbd39c315258 1006 }
garygid 54:6ce808d0995e 1007 sprintf(sTemp2,"%4.3f ",playbackInt);
garygid 54:6ce808d0995e 1008 showButton(1,0,sTemp1,sTemp2,4,4);
garygid 54:6ce808d0995e 1009
garygid 54:6ce808d0995e 1010 showButton(2,0,"Faster"," -->",4,4);
TickTock 36:dbd39c315258 1011 }
TickTock 36:dbd39c315258 1012 if(playbackOpen){
TickTock 36:dbd39c315258 1013 sprintf(sTemp1," Stop");
TickTock 36:dbd39c315258 1014 }else{
garygid 54:6ce808d0995e 1015 sprintf(sTemp1,"Start");
TickTock 36:dbd39c315258 1016 }
garygid 54:6ce808d0995e 1017 showButton(1,1,sTemp1,"Playback",4,4);
TickTock 36:dbd39c315258 1018 }
TickTock 36:dbd39c315258 1019
TickTock 42:4533b13b297d 1020 void showDateTime(bool force, bool showButtons){
TickTock 36:dbd39c315258 1021 struct tm t; // pointer to a static tm structure
TickTock 36:dbd39c315258 1022 time_t seconds ;
TickTock 36:dbd39c315258 1023 tt.foreground(Yellow);
TickTock 44:6262a9fd1e56 1024 tt.background(Black);
TickTock 36:dbd39c315258 1025 if (force) {
TickTock 36:dbd39c315258 1026 tt.cls();
TickTock 36:dbd39c315258 1027 seconds = time(NULL);
TickTock 36:dbd39c315258 1028 t = *localtime(&seconds) ;
TickTock 36:dbd39c315258 1029
TickTock 36:dbd39c315258 1030 tt.locate(10,10);
TickTock 43:e7f6f80590e3 1031 tt.set_font((unsigned char*) Arial12x12);
TickTock 36:dbd39c315258 1032 strftime(sTemp1, 32, "%a %m/%d/%Y %X \n", &t);
TickTock 36:dbd39c315258 1033 printf("%s",sTemp1);
TickTock 122:138a40892a4c 1034 if(showButtons){
TickTock 36:dbd39c315258 1035 switch(dtMode){
TickTock 36:dbd39c315258 1036 case 0:
TickTock 36:dbd39c315258 1037 sprintf(sTemp1,"Year");
TickTock 36:dbd39c315258 1038 break;
TickTock 36:dbd39c315258 1039 case 1:
TickTock 36:dbd39c315258 1040 sprintf(sTemp1,"Month");
TickTock 36:dbd39c315258 1041 break;
TickTock 36:dbd39c315258 1042 case 2:
TickTock 36:dbd39c315258 1043 sprintf(sTemp1,"Day");
TickTock 36:dbd39c315258 1044 break;
TickTock 36:dbd39c315258 1045 case 3:
TickTock 36:dbd39c315258 1046 sprintf(sTemp1,"Hour");
TickTock 36:dbd39c315258 1047 break;
TickTock 36:dbd39c315258 1048 case 4:
TickTock 36:dbd39c315258 1049 sprintf(sTemp1,"Minute");
TickTock 36:dbd39c315258 1050 break;
TickTock 36:dbd39c315258 1051 case 5:
TickTock 36:dbd39c315258 1052 sprintf(sTemp1,"Second");
TickTock 36:dbd39c315258 1053 break;
TickTock 36:dbd39c315258 1054 default:
TickTock 36:dbd39c315258 1055 break;
TickTock 36:dbd39c315258 1056 }
TickTock 44:6262a9fd1e56 1057 tt.background(DarkCyan);
TickTock 66:b7476ce7a59e 1058 showButton(0,1,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1059 showButton(1,1," UP","",4,4);
garygid 54:6ce808d0995e 1060 showButton(2,1," DOWN","",4,4);
TickTock 36:dbd39c315258 1061 }
TickTock 36:dbd39c315258 1062 }
TickTock 36:dbd39c315258 1063 }
TickTock 36:dbd39c315258 1064
TickTock 50:83d5864c64a0 1065 void dteDisplay(bool force, bool showButtons, bool showMiles){
TickTock 66:b7476ce7a59e 1066 unsigned short i,x,y,lx,ly,gids,radius,color,r,t;
TickTock 79:68f0dd8d1f19 1067 unsigned char toVal;
TickTock 50:83d5864c64a0 1068 static unsigned short lgids=0;
TickTock 50:83d5864c64a0 1069 static unsigned char leff[39]={0};
TickTock 50:83d5864c64a0 1070 CANMessage msg;
TickTock 66:b7476ce7a59e 1071 unsigned long targetBraking, regenBraking, temp;
TickTock 73:62ee8eae3a84 1072 static unsigned long maxTarget = 1000, maxRegen = 1000, tardivreg_x1000 = 1000;
TickTock 66:b7476ce7a59e 1073 static unsigned char lr=0, lt=0;
TickTock 50:83d5864c64a0 1074
TickTock 50:83d5864c64a0 1075 msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
TickTock 50:83d5864c64a0 1076 gids = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 50:83d5864c64a0 1077 if(gids==0){
TickTock 83:52b1f330a62d 1078 gids=281; // Display new, fully charged capacity until real data obtained
TickTock 50:83d5864c64a0 1079 }
TickTock 50:83d5864c64a0 1080
TickTock 37:fea2c1d52c5f 1081 tt.background(Navy);
TickTock 49:a3d2c5bb3cfa 1082 tt.foreground(Yellow);
TickTock 52:d5385fbf4ea1 1083 if(force){
TickTock 97:a25940fd7b5b 1084 tt.set_font((unsigned char*) Arial12x12);
TickTock 52:d5385fbf4ea1 1085 tt.cls();
TickTock 49:a3d2c5bb3cfa 1086 x=50+0*6;
TickTock 52:d5385fbf4ea1 1087 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1088 printf("sec\n");
TickTock 50:83d5864c64a0 1089 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1090 x=50+9*6;
TickTock 52:d5385fbf4ea1 1091 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1092 printf("min\n");
TickTock 50:83d5864c64a0 1093 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1094 x=50+18*6;
TickTock 52:d5385fbf4ea1 1095 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1096 printf("hour\n");
TickTock 83:52b1f330a62d 1097 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1098 x=50+25*6;
TickTock 52:d5385fbf4ea1 1099 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1100 printf("day\n");
TickTock 50:83d5864c64a0 1101 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1102 x=50+32*6;
TickTock 52:d5385fbf4ea1 1103 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1104 printf("mon\n");
TickTock 50:83d5864c64a0 1105 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1106 x=50+38*6;
TickTock 66:b7476ce7a59e 1107 //tt.locate(x-10,226);
TickTock 66:b7476ce7a59e 1108 //printf("year\n");
TickTock 66:b7476ce7a59e 1109 //tt.line(x,10,x,220,DarkGrey);
TickTock 97:a25940fd7b5b 1110 toVal=33;
TickTock 83:52b1f330a62d 1111 } else {
TickTock 97:a25940fd7b5b 1112 toVal=24;// no need to constantly update the long tc values
TickTock 50:83d5864c64a0 1113 }
TickTock 83:52b1f330a62d 1114 if(force||lgids!=gids){ // update Y axis when kWh changes
TickTock 97:a25940fd7b5b 1115 tt.set_font((unsigned char*) Arial24x23);
TickTock 97:a25940fd7b5b 1116 //for(i=0;i<10;i++){
TickTock 97:a25940fd7b5b 1117 //y=200-i*20;
TickTock 131:0d926c080a65 1118 for(i=2;i<7;i++){
TickTock 131:0d926c080a65 1119 y=200-(i-2)*40;
TickTock 97:a25940fd7b5b 1120 tt.locate(0,y-8);
TickTock 83:52b1f330a62d 1121 if (showMiles){
leafman 98:9f8bab96edff 1122 printf("%3.0f\n",convertDistance(i*((float)(gids-5)*.075))); // LM - Added metric support
TickTock 83:52b1f330a62d 1123 }else{
TickTock 83:52b1f330a62d 1124 printf("%d.0\n",i);
TickTock 50:83d5864c64a0 1125 }
TickTock 97:a25940fd7b5b 1126 tt.line(48,y,toVal*6+56,y,DarkGrey);
TickTock 83:52b1f330a62d 1127 }
TickTock 50:83d5864c64a0 1128 lgids=gids;
TickTock 50:83d5864c64a0 1129 }
TickTock 121:553faf139a20 1130 if(tock||force){
TickTock 131:0d926c080a65 1131 for(i=2;i<7;i++){
TickTock 131:0d926c080a65 1132 y=200-(i-2)*40;
TickTock 83:52b1f330a62d 1133 tt.line(40,y,158,y,DarkGrey);
TickTock 50:83d5864c64a0 1134 }
TickTock 50:83d5864c64a0 1135
TickTock 50:83d5864c64a0 1136 x=50+0*6;
TickTock 50:83d5864c64a0 1137 tt.line(x,10,x,220,DarkGrey);
TickTock 50:83d5864c64a0 1138 x=50+9*6;
TickTock 50:83d5864c64a0 1139 tt.line(x,10,x,220,DarkGrey);
TickTock 50:83d5864c64a0 1140 x=50+18*6;
TickTock 50:83d5864c64a0 1141 tt.line(x,10,x,220,DarkGrey);
TickTock 83:52b1f330a62d 1142 //x=50+25*6;
TickTock 83:52b1f330a62d 1143 //tt.line(x,60,x,220,DarkGrey);
TickTock 83:52b1f330a62d 1144 //x=50+32*6;
TickTock 83:52b1f330a62d 1145 //tt.line(x,60,x,220,DarkGrey);
TickTock 66:b7476ce7a59e 1146 //x=50+38*6;
TickTock 66:b7476ce7a59e 1147 //tt.line(x,60,x,220,DarkGrey);
TickTock 50:83d5864c64a0 1148 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 50:83d5864c64a0 1149 tt.foreground(Green);
TickTock 50:83d5864c64a0 1150 if (showMiles){
TickTock 93:c2402e8cd0e2 1151 float miles = mpkWh[dtePeriod]*((float)(gids-5)*.075);
leafman 98:9f8bab96edff 1152 miles = convertDistance(miles); // LM - Metric support
TickTock 93:c2402e8cd0e2 1153 // Right justify
TickTock 94:c3a14b3975d6 1154 if (miles>99.9){ //space=18; num=31; . = 23
TickTock 94:c3a14b3975d6 1155 tt.locate(161,8);
TickTock 94:c3a14b3975d6 1156 printf("%4.1f\n",miles);
TickTock 93:c2402e8cd0e2 1157 } else if (miles>9.9){
TickTock 94:c3a14b3975d6 1158 tt.locate(156,8);
TickTock 94:c3a14b3975d6 1159 printf(" %3.1f\n",miles);
TickTock 93:c2402e8cd0e2 1160 } else {
TickTock 94:c3a14b3975d6 1161 tt.locate(151,8);
TickTock 94:c3a14b3975d6 1162 printf(" %2.1f\n",miles);
TickTock 93:c2402e8cd0e2 1163 }
TickTock 97:a25940fd7b5b 1164 tt.foreground(Cyan);
TickTock 97:a25940fd7b5b 1165 tt.set_font((unsigned char*) Arial24x23);
TickTock 97:a25940fd7b5b 1166 tt.locate(198,70);
TickTock 97:a25940fd7b5b 1167 printf("%3.1f \n",mpkWh[dtePeriod]);
TickTock 50:83d5864c64a0 1168 } else {
TickTock 97:a25940fd7b5b 1169 tt.locate(200,10);
TickTock 66:b7476ce7a59e 1170 printf("%3.1f \n",mpkWh[dtePeriod]);
TickTock 144:b0c9d30dd346 1171 tt.foreground(Cyan);
TickTock 144:b0c9d30dd346 1172 tt.set_font((unsigned char*) Arial24x23);
TickTock 144:b0c9d30dd346 1173 tt.locate(222,70);
TickTock 144:b0c9d30dd346 1174 printf("%2.1f \n",curEff);
TickTock 50:83d5864c64a0 1175 }
TickTock 49:a3d2c5bb3cfa 1176 lx=50;
TickTock 97:a25940fd7b5b 1177 ly=mpkWh[0]*40;
TickTock 50:83d5864c64a0 1178 if(dtePeriod==0){
TickTock 52:d5385fbf4ea1 1179 radius=6;
TickTock 79:68f0dd8d1f19 1180 color=Yellow;
TickTock 50:83d5864c64a0 1181 }else{
TickTock 50:83d5864c64a0 1182 radius=2;
TickTock 50:83d5864c64a0 1183 color=Green;
TickTock 50:83d5864c64a0 1184 }
TickTock 131:0d926c080a65 1185 if(ly<60){
TickTock 97:a25940fd7b5b 1186 ly=220;
TickTock 97:a25940fd7b5b 1187 color=Red;
TickTock 131:0d926c080a65 1188 }else if(ly<280) {
TickTock 131:0d926c080a65 1189 ly=280-ly;
TickTock 97:a25940fd7b5b 1190 }else{
TickTock 97:a25940fd7b5b 1191 ly=0;
TickTock 97:a25940fd7b5b 1192 }
TickTock 50:83d5864c64a0 1193 tt.fillcircle(lx,leff[0],radius,Navy);
TickTock 50:83d5864c64a0 1194 tt.fillcircle(lx,ly,radius,color);
TickTock 49:a3d2c5bb3cfa 1195
TickTock 79:68f0dd8d1f19 1196 for(i=1;i<toVal;i++){
TickTock 49:a3d2c5bb3cfa 1197 x=50+i*6;
TickTock 97:a25940fd7b5b 1198 y=mpkWh[i]*40;
TickTock 50:83d5864c64a0 1199 if(i==dtePeriod){
TickTock 79:68f0dd8d1f19 1200 radius=6;
TickTock 79:68f0dd8d1f19 1201 color=Yellow;
TickTock 50:83d5864c64a0 1202 }else{
TickTock 50:83d5864c64a0 1203 radius=2;
TickTock 50:83d5864c64a0 1204 color=Green;
TickTock 50:83d5864c64a0 1205 }
TickTock 131:0d926c080a65 1206 if(y<60){
TickTock 97:a25940fd7b5b 1207 y=220;
TickTock 97:a25940fd7b5b 1208 color=Red;
TickTock 131:0d926c080a65 1209 }else if(y<280) {
TickTock 131:0d926c080a65 1210 y=280-y;
TickTock 97:a25940fd7b5b 1211 }else{
TickTock 97:a25940fd7b5b 1212 y=0;
TickTock 97:a25940fd7b5b 1213 }
TickTock 50:83d5864c64a0 1214 tt.fillcircle(x,leff[i],radius,Navy);
TickTock 50:83d5864c64a0 1215 tt.line(x-6,leff[i-1],x,leff[i],Navy);
TickTock 50:83d5864c64a0 1216 leff[i-1]=ly;
TickTock 52:d5385fbf4ea1 1217 if(y>0){
TickTock 52:d5385fbf4ea1 1218 tt.fillcircle(x,y,radius,color);
TickTock 52:d5385fbf4ea1 1219 }
TickTock 49:a3d2c5bb3cfa 1220 tt.line(lx,ly,x,y,White);
TickTock 49:a3d2c5bb3cfa 1221 lx=x;
TickTock 49:a3d2c5bb3cfa 1222 ly=y;
TickTock 49:a3d2c5bb3cfa 1223 }
TickTock 50:83d5864c64a0 1224 leff[i-1]=y;
TickTock 37:fea2c1d52c5f 1225 }
TickTock 66:b7476ce7a59e 1226
TickTock 66:b7476ce7a59e 1227 msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
TickTock 66:b7476ce7a59e 1228 regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
TickTock 66:b7476ce7a59e 1229 targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
TickTock 113:f388b4505463 1230 msg = lastMsg[indexLastMsg[0x421]]; //Get Drive Mode
TickTock 113:f388b4505463 1231 if (msg.data[0]==0x18) { // In Neutral
TickTock 108:29b5a760adc2 1232 regenBraking = 0; // No regen when in Neutral
TickTock 108:29b5a760adc2 1233 }
TickTock 73:62ee8eae3a84 1234
TickTock 73:62ee8eae3a84 1235 if (targetBraking<2045){
TickTock 73:62ee8eae3a84 1236 if ((targetBraking>50)&&(regenBraking>50)){
TickTock 73:62ee8eae3a84 1237 temp = targetBraking;
TickTock 73:62ee8eae3a84 1238 temp *= 1000;
TickTock 73:62ee8eae3a84 1239 temp /= regenBraking;
TickTock 73:62ee8eae3a84 1240 if (temp<tardivreg_x1000) tardivreg_x1000=temp;
TickTock 73:62ee8eae3a84 1241 }
TickTock 73:62ee8eae3a84 1242 if (targetBraking>maxTarget) maxTarget=targetBraking;
TickTock 73:62ee8eae3a84 1243 if (regenBraking>maxRegen) maxRegen=regenBraking;
TickTock 73:62ee8eae3a84 1244
TickTock 66:b7476ce7a59e 1245 temp = targetBraking;
TickTock 73:62ee8eae3a84 1246 temp *=200;
TickTock 73:62ee8eae3a84 1247 temp /= maxTarget;
TickTock 73:62ee8eae3a84 1248 t = (char) temp;
TickTock 73:62ee8eae3a84 1249 if (t>175) t=175;
TickTock 73:62ee8eae3a84 1250 temp = regenBraking;
TickTock 73:62ee8eae3a84 1251 temp *= tardivreg_x1000;
TickTock 73:62ee8eae3a84 1252 temp /= maxTarget;
TickTock 73:62ee8eae3a84 1253 temp /= 5; // 1000/200=5
TickTock 73:62ee8eae3a84 1254 r = (char) temp;
TickTock 73:62ee8eae3a84 1255 if (r>175) r=175;
TickTock 73:62ee8eae3a84 1256 if (r>t) t=r; //Should never happen
TickTock 73:62ee8eae3a84 1257 if(lr!=r||lt!=t){
TickTock 73:62ee8eae3a84 1258 tt.fillrect(264,64,310,239-t,Navy);
TickTock 73:62ee8eae3a84 1259 tt.fillrect(264,239-t,310,239-r,Red);
TickTock 73:62ee8eae3a84 1260 tt.fillrect(264,239-r,310,239,Green);
TickTock 73:62ee8eae3a84 1261 }
TickTock 73:62ee8eae3a84 1262 lt=t;
TickTock 73:62ee8eae3a84 1263 lr=r;
TickTock 66:b7476ce7a59e 1264 }
TickTock 37:fea2c1d52c5f 1265 }
TickTock 37:fea2c1d52c5f 1266
TickTock 36:dbd39c315258 1267 void updateDisplay(char display){
TickTock 122:138a40892a4c 1268 bool changed,showButtons;
TickTock 36:dbd39c315258 1269 changed = dMode[display]!=lastDMode[display];
TickTock 122:138a40892a4c 1270 showButtons = (display==whichTouched)&&(sMode==1);
TickTock 36:dbd39c315258 1271 tt.set_display(display);
TickTock 36:dbd39c315258 1272 switch (dMode[display]) {
TickTock 36:dbd39c315258 1273 case logScreen:
TickTock 122:138a40892a4c 1274 printLog(changed,showButtons);
TickTock 36:dbd39c315258 1275 break;
TickTock 41:8d4609ea7259 1276 case mainScreen:
TickTock 122:138a40892a4c 1277 mainDisplay(changed,showButtons);
TickTock 36:dbd39c315258 1278 break;
TickTock 36:dbd39c315258 1279 case brakeScreen:
TickTock 122:138a40892a4c 1280 braking(changed,showButtons);
TickTock 36:dbd39c315258 1281 break;
TickTock 41:8d4609ea7259 1282 case dteScreen:
TickTock 122:138a40892a4c 1283 dteDisplay(changed,showButtons,true);
TickTock 37:fea2c1d52c5f 1284 break;
TickTock 50:83d5864c64a0 1285 case effScreen:
TickTock 122:138a40892a4c 1286 dteDisplay(changed,showButtons,false);
TickTock 50:83d5864c64a0 1287 break;
TickTock 50:83d5864c64a0 1288 case monitorScreen:
TickTock 122:138a40892a4c 1289 printLast(changed,showButtons);
TickTock 36:dbd39c315258 1290 break;
TickTock 36:dbd39c315258 1291 case changedScreen:
TickTock 122:138a40892a4c 1292 printChanged(changed,showButtons);
TickTock 36:dbd39c315258 1293 break;
TickTock 36:dbd39c315258 1294 case cpScreen:
TickTock 122:138a40892a4c 1295 cpData(changed||showCP,showButtons);
TickTock 36:dbd39c315258 1296 break;
leafman 98:9f8bab96edff 1297 case configScreen:
TickTock 122:138a40892a4c 1298 config(changed,showButtons);
TickTock 36:dbd39c315258 1299 break;
TickTock 38:155ec32c5e91 1300 case playbackScreen:
TickTock 122:138a40892a4c 1301 pbScreen(changed,showButtons);
TickTock 36:dbd39c315258 1302 break;
TickTock 36:dbd39c315258 1303 case dateScreen:
TickTock 122:138a40892a4c 1304 showDateTime(changed,showButtons);
TickTock 36:dbd39c315258 1305 break;
TickTock 44:6262a9fd1e56 1306 case cpHistScreen: // gg - hist
TickTock 122:138a40892a4c 1307 cpHistogram(changed||showCP,showButtons);
TickTock 44:6262a9fd1e56 1308 break;
TickTock 48:d1ce92104a1f 1309 case cpBarScreen: // gg - cpbars
TickTock 122:138a40892a4c 1310 cpBarPlot(changed||showCP,showButtons);
TickTock 48:d1ce92104a1f 1311 break;
garygid 67:2022fce701d0 1312 case indexScreen:
TickTock 122:138a40892a4c 1313 showIndex(changed,showButtons);
garygid 67:2022fce701d0 1314 break;
TickTock 107:e9be732c1ad4 1315 case tripScreen:
TickTock 122:138a40892a4c 1316 tripDisplay(changed,showButtons);
TickTock 107:e9be732c1ad4 1317 break;
TickTock 118:02010b18efdc 1318 case healthScreen:
TickTock 122:138a40892a4c 1319 healthDisplay(changed,showButtons);
garygid 67:2022fce701d0 1320 break;
TickTock 36:dbd39c315258 1321 default:
TickTock 43:e7f6f80590e3 1322 if (changed){
TickTock 43:e7f6f80590e3 1323 tt.background(Black);
TickTock 43:e7f6f80590e3 1324 tt.cls();
TickTock 43:e7f6f80590e3 1325 }
TickTock 36:dbd39c315258 1326 break;
TickTock 36:dbd39c315258 1327 }
TickTock 36:dbd39c315258 1328 lastDMode[display]=dMode[display];
TickTock 36:dbd39c315258 1329
TickTock 42:4533b13b297d 1330 if(display==whichTouched){
TickTock 42:4533b13b297d 1331 switch (sMode) {
TickTock 42:4533b13b297d 1332 case 1: // Select screens
TickTock 42:4533b13b297d 1333 tt.foreground(Yellow);
TickTock 42:4533b13b297d 1334 tt.background(DarkCyan);
garygid 54:6ce808d0995e 1335 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 1336
garygid 54:6ce808d0995e 1337 showButton(0,tNavRow," <-Prev","",4,4); // gg - 4x4
garygid 67:2022fce701d0 1338 // col 1 see below
garygid 67:2022fce701d0 1339 showButton(2,tNavRow," Go To"," Index",4,4); // gg - index
garygid 54:6ce808d0995e 1340 showButton(3,tNavRow," Next->","",4,4); // gg - move next
garygid 54:6ce808d0995e 1341
garygid 67:2022fce701d0 1342 // col 1 in Nav row
TickTock 42:4533b13b297d 1343 switch (dMode[display]) {
TickTock 44:6262a9fd1e56 1344 case offScreen:
garygid 54:6ce808d0995e 1345 sprintf(sTemp2," Off");
TickTock 42:4533b13b297d 1346 break;
TickTock 44:6262a9fd1e56 1347 case logScreen:
garygid 54:6ce808d0995e 1348 sprintf(sTemp2," Log");
TickTock 42:4533b13b297d 1349 break;
TickTock 44:6262a9fd1e56 1350 case mainScreen:
garygid 54:6ce808d0995e 1351 sprintf(sTemp2," Main");
TickTock 42:4533b13b297d 1352 break;
TickTock 44:6262a9fd1e56 1353 case brakeScreen:
garygid 54:6ce808d0995e 1354 sprintf(sTemp2,"Braking");
TickTock 42:4533b13b297d 1355 break;
TickTock 44:6262a9fd1e56 1356 case dteScreen:
garygid 54:6ce808d0995e 1357 sprintf(sTemp2," DTE");
TickTock 42:4533b13b297d 1358 break;
TickTock 50:83d5864c64a0 1359 case effScreen:
garygid 54:6ce808d0995e 1360 sprintf(sTemp2," Eff");
TickTock 50:83d5864c64a0 1361 break;
TickTock 44:6262a9fd1e56 1362 case monitorScreen:
garygid 54:6ce808d0995e 1363 sprintf(sTemp2," Monitor");
TickTock 42:4533b13b297d 1364 break;
TickTock 44:6262a9fd1e56 1365 case changedScreen:
garygid 54:6ce808d0995e 1366 sprintf(sTemp2,"DeltaMon");
TickTock 42:4533b13b297d 1367 break;
TickTock 44:6262a9fd1e56 1368 case cpScreen:
garygid 67:2022fce701d0 1369 sprintf(sTemp2,"CP Data");
TickTock 42:4533b13b297d 1370 break;
leafman 98:9f8bab96edff 1371 case configScreen:
garygid 54:6ce808d0995e 1372 sprintf(sTemp2," Config");
leafman 98:9f8bab96edff 1373 break;
TickTock 44:6262a9fd1e56 1374 case playbackScreen:
garygid 54:6ce808d0995e 1375 sprintf(sTemp2,"Playback");
TickTock 42:4533b13b297d 1376 break;
TickTock 44:6262a9fd1e56 1377 case dateScreen:
garygid 54:6ce808d0995e 1378 sprintf(sTemp2,"Set Time");
TickTock 42:4533b13b297d 1379 break;
TickTock 44:6262a9fd1e56 1380 case cpHistScreen: // gg - hist
garygid 54:6ce808d0995e 1381 sprintf(sTemp2,"CP Hist");
TickTock 44:6262a9fd1e56 1382 break;
TickTock 48:d1ce92104a1f 1383 case cpBarScreen: // gg - cpbars
garygid 54:6ce808d0995e 1384 sprintf(sTemp2,"CP Bars");
TickTock 48:d1ce92104a1f 1385 break;
TickTock 107:e9be732c1ad4 1386 case tripScreen:
TickTock 107:e9be732c1ad4 1387 sprintf(sTemp2," Trip");
TickTock 107:e9be732c1ad4 1388 break;
TickTock 118:02010b18efdc 1389 case healthScreen:
TickTock 118:02010b18efdc 1390 sprintf(sTemp2,"Health");
TickTock 118:02010b18efdc 1391 break;
garygid 67:2022fce701d0 1392 case indexScreen: // gg - index
garygid 67:2022fce701d0 1393 sprintf(sTemp2," Index");
garygid 67:2022fce701d0 1394 break;
TickTock 42:4533b13b297d 1395 }
garygid 54:6ce808d0995e 1396 showButton(1,tNavRow," Select",sTemp2,4,4);
garygid 54:6ce808d0995e 1397
TickTock 42:4533b13b297d 1398 wait_ms(100); // pause a moment to reduce flicker
TickTock 42:4533b13b297d 1399 break;
garygid 54:6ce808d0995e 1400
TickTock 42:4533b13b297d 1401 case 2: // numpad
TickTock 42:4533b13b297d 1402 tt.foreground(Yellow);
TickTock 42:4533b13b297d 1403 tt.background(DarkCyan);
TickTock 42:4533b13b297d 1404 tt.set_font((unsigned char*) Arial24x23);
garygid 54:6ce808d0995e 1405
garygid 54:6ce808d0995e 1406 sprintf(sTemp2,"");
garygid 54:6ce808d0995e 1407 showButton(0,0," 1",sTemp2,4,4);
garygid 54:6ce808d0995e 1408 showButton(1,0," 2",sTemp2,4,4);
garygid 54:6ce808d0995e 1409 showButton(2,0," 3",sTemp2,4,4);
garygid 54:6ce808d0995e 1410 showButton(0,1," 4",sTemp2,4,4);
garygid 54:6ce808d0995e 1411 showButton(1,1," 5",sTemp2,4,4);
garygid 54:6ce808d0995e 1412 showButton(2,1," 6",sTemp2,4,4);
garygid 54:6ce808d0995e 1413 showButton(0,2," 7",sTemp2,4,4);
garygid 54:6ce808d0995e 1414 showButton(1,2," 8",sTemp2,4,4);
garygid 54:6ce808d0995e 1415 showButton(2,2," 9",sTemp2,4,4);
garygid 54:6ce808d0995e 1416 showButton(1,3," 0",sTemp2,4,4);
garygid 54:6ce808d0995e 1417
garygid 54:6ce808d0995e 1418 showButton(0,3,"<--",sTemp2,4,4);
garygid 54:6ce808d0995e 1419 showButton(2,3,"-->",sTemp2,4,4);
garygid 54:6ce808d0995e 1420 showButton(3,3,"return",sTemp2,4,4);
TickTock 42:4533b13b297d 1421 case 3:
TickTock 42:4533b13b297d 1422 break;
TickTock 42:4533b13b297d 1423 default:
TickTock 42:4533b13b297d 1424 break;
TickTock 42:4533b13b297d 1425 }
TickTock 36:dbd39c315258 1426 }
TickTock 121:553faf139a20 1427 tock=false;
TickTock 121:553faf139a20 1428 } // updateDisplay
TickTock 36:dbd39c315258 1429
garygid 58:4d06288d75a2 1430 //---------------------
garygid 58:4d06288d75a2 1431 // gg - highlight
TickTock 62:ffd15edb5431 1432 void highlightButton(unsigned char column, unsigned char row, unsigned char tScn, unsigned char columns, unsigned char rows){
TickTock 62:ffd15edb5431 1433
garygid 58:4d06288d75a2 1434 unsigned short x1,x2,y1,y2;
garygid 58:4d06288d75a2 1435
garygid 58:4d06288d75a2 1436 x1=column*(320/columns)+btnGap/2;
garygid 58:4d06288d75a2 1437 x2=(column+1)*(320/columns)-btnGap/2;
garygid 58:4d06288d75a2 1438 y1=row*(240/rows)+btnGap/2;
garygid 58:4d06288d75a2 1439 y2=(row+1)*(240/rows)-btnGap/2;
garygid 65:821fc79cd7fe 1440
garygid 65:821fc79cd7fe 1441 tt.set_display(tScn);
garygid 65:821fc79cd7fe 1442
garygid 65:821fc79cd7fe 1443 if( skin == ggSkin ){
garygid 65:821fc79cd7fe 1444 // paint the whole button box, for a better visual effect
garygid 65:821fc79cd7fe 1445 // especially on a screen with a yellow background
garygid 65:821fc79cd7fe 1446 if( tScn == 0 )
garygid 65:821fc79cd7fe 1447 tt.fillrect(x1,y1,x2,y2,White); // DarkCyan);
garygid 65:821fc79cd7fe 1448 else
garygid 65:821fc79cd7fe 1449 tt.fillrect(x1,y1,x2,y2,Green); // DarkCyan);
TickTock 66:b7476ce7a59e 1450 } else {
TickTock 66:b7476ce7a59e 1451 tt.fillrect(x1,y1,x2,y2,Green); // DarkCyan);
garygid 65:821fc79cd7fe 1452 }
garygid 58:4d06288d75a2 1453
garygid 58:4d06288d75a2 1454 // paint the outer pixel as a yellow frame
garygid 58:4d06288d75a2 1455 tt.rect(x1,y1,x2,y2,Yellow) ; // DarkCyan);
garygid 58:4d06288d75a2 1456 }
garygid 58:4d06288d75a2 1457
garygid 58:4d06288d75a2 1458 //---------------------
TickTock 36:dbd39c315258 1459 void showButton(unsigned char column, unsigned char row, char * text1, char * text2, unsigned char columns, unsigned char rows){
TickTock 36:dbd39c315258 1460 unsigned short x1,x2,y1,y2;
garygid 54:6ce808d0995e 1461
TickTock 36:dbd39c315258 1462 x1=column*(320/columns)+btnGap/2;
TickTock 36:dbd39c315258 1463 x2=(column+1)*(320/columns)-btnGap/2;
TickTock 36:dbd39c315258 1464 y1=row*(240/rows)+btnGap/2;
TickTock 36:dbd39c315258 1465 y2=(row+1)*(240/rows)-btnGap/2;
TickTock 36:dbd39c315258 1466 tt.fillrect(x1,y1,x2,y2,DarkCyan);
garygid 54:6ce808d0995e 1467
garygid 54:6ce808d0995e 1468 // adapt formatting of text to the smaller 4x4 box
garygid 54:6ce808d0995e 1469 tt.locate(x1+btnGap/2,y1+btnGap); // gg - 4x4
TickTock 36:dbd39c315258 1470 printf("%s\n",text1);
garygid 54:6ce808d0995e 1471
garygid 54:6ce808d0995e 1472 tt.locate(x1+btnGap/2,y1+btnGap+20);
TickTock 36:dbd39c315258 1473 printf("%s\n",text2);
TickTock 36:dbd39c315258 1474 }
garygid 54:6ce808d0995e 1475
TickTock 13:62e0f7f39ff5 1476
leafman 98:9f8bab96edff 1477 //The temps are stored as metric, distances as imperial... I'm assuming the input based on that - LM
leafman 98:9f8bab96edff 1478 float convertTemperature(float input)
leafman 98:9f8bab96edff 1479 {
leafman 98:9f8bab96edff 1480 if (!metric) {
leafman 98:9f8bab96edff 1481 //convert!
leafman 98:9f8bab96edff 1482 float output = input *1.8f;
leafman 98:9f8bab96edff 1483 output += 32.0f;
leafman 98:9f8bab96edff 1484 return output;
TickTock 23:cd03f9c3395e 1485 }
leafman 98:9f8bab96edff 1486 return input;
leafman 98:9f8bab96edff 1487 }
leafman 98:9f8bab96edff 1488 float convertDistance(float input)
leafman 98:9f8bab96edff 1489 {
leafman 98:9f8bab96edff 1490 if (metric) {
leafman 98:9f8bab96edff 1491 return input / 0.62137f;
TickTock 13:62e0f7f39ff5 1492 }
leafman 98:9f8bab96edff 1493 return input;
leafman 98:9f8bab96edff 1494 }
leafman 98:9f8bab96edff 1495 char* distanceUnit()
leafman 98:9f8bab96edff 1496 {
leafman 98:9f8bab96edff 1497 if(metric)
leafman 98:9f8bab96edff 1498 return "km";
leafman 98:9f8bab96edff 1499 return "mi";
leafman 98:9f8bab96edff 1500 }
leafman 98:9f8bab96edff 1501 char* temperatureUnit()
leafman 98:9f8bab96edff 1502 {
leafman 98:9f8bab96edff 1503 if(metric)
leafman 98:9f8bab96edff 1504 return "C";
leafman 98:9f8bab96edff 1505 return "F";
leafman 98:9f8bab96edff 1506 }