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 17 15:25:41 2013 +0000
Revision:
169:84d790ac18a2
Parent:
168:9227024c4e3a
Child:
170:7ee98e3611bc
// Added trip meter including climate control impact; // Pulled updateConfig to dedicated procedure

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