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:
Tue Dec 03 13:54:07 2013 +0000
Revision:
166:ec3951ba9701
Parent:
165:4daa921730dd
Child:
167:58d4edf403d4
// Re-formatted main and dte displays; // Fixed flicker on CC DTE;

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