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 Sep 27 04:43:41 2013 +0000
Revision:
150:ef46ce63345c
Parent:
149:e9739523109f
Child:
151:3047ebb3c9a8
// Removed air drag comp; // Added user message Id's to the config file; // Added copy of ehist.cny to USB on config save and load if present on firmware update

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