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:
Fri Aug 02 05:13:26 2013 +0000
Revision:
138:a2f5af85ed0d
Parent:
137:70853cf5a30f
Child:
139:ac227b203ef2
Fixed metric DTE formatting

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