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:
Thu Nov 28 03:23:30 2013 +0000
Revision:
164:46ed06263b0e
Parent:
163:3b6fab958773
Child:
165:4daa921730dd
// Turn off noCC DTE when CC is off

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