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:
Mon Sep 30 15:31:01 2013 +0000
Revision:
151:3047ebb3c9a8
Parent:
150:ef46ce63345c
Child:
152:a4d66901785d
// added per_charge trip meter

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