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:
Sat Oct 12 03:48:30 2013 +0000
Revision:
153:e94cfe3c339c
Parent:
152:a4d66901785d
Child:
154:90ea16ca7475
// Added current reversal tone; // Added MY2013 autoSync support (just time - no date)

Who changed what in which revision?

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