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:
Wed Dec 04 12:45:39 2013 +0000
Revision:
168:9227024c4e3a
Parent:
167:58d4edf403d4
Child:
169:84d790ac18a2
// Added trip meter including climate control impact;

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 165:4daa921730dd 72 tt.locate(231,64);
TickTock 165:4daa921730dd 73 printf(" %3.2fkW\n",CCkW);
TickTock 165:4daa921730dd 74 tt.set_font((unsigned char*) Arial28x28);
TickTock 165:4daa921730dd 75 }
TickTock 165:4daa921730dd 76 }
TickTock 165:4daa921730dd 77 if(force||gids!=lgids||mpkWh[dtePeriod]!=lmpkWh){
TickTock 132:08748a67280a 78 // Display DTE
TickTock 167:58d4edf403d4 79 // worst-case DTE
TickTock 167:58d4edf403d4 80 // Compute DTE based on worst saved trip efficiency (without climate control) and adding the impact
TickTock 167:58d4edf403d4 81 // of the current climate control power relative to the last 10 minutes of driving
TickTock 167:58d4edf403d4 82 dte=convertDistance((minTripEff-mpkWh_noCC+mpkWh[dtePeriod])*useable_kWh); //LM - add metric conversion
TickTock 136:41a204105511 83 tt.foreground(Green);
TickTock 166:ec3951ba9701 84 tt.locate(10,84);
TickTock 139:ac227b203ef2 85 if(dte>=9.5){
TickTock 163:3b6fab958773 86 printf("%2.0f \n",dte);
TickTock 136:41a204105511 87 }else{
TickTock 163:3b6fab958773 88 printf("%2.1f \n",dte);
TickTock 136:41a204105511 89 }
TickTock 136:41a204105511 90
TickTock 163:3b6fab958773 91 // 10-minute DTE
TickTock 48:d1ce92104a1f 92 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 136:41a204105511 93 tt.foreground(Yellow);
TickTock 163:3b6fab958773 94 dte=convertDistance(mpkWh[dtePeriod]*useable_kWh); //LM - add metric conversion
TickTock 136:41a204105511 95 if(dte>199){
TickTock 136:41a204105511 96 dte=199;
TickTock 136:41a204105511 97 }
TickTock 136:41a204105511 98 // " "=0x10, "."=0x15, #=0x1D
TickTock 139:ac227b203ef2 99 if(dte>=99.5){
TickTock 165:4daa921730dd 100 tt.locate(70,85);
TickTock 163:3b6fab958773 101 printf(" %3.0f\n",dte);
TickTock 139:ac227b203ef2 102 }else if(dte>=9.5){
TickTock 165:4daa921730dd 103 tt.locate(84,85);
TickTock 163:3b6fab958773 104 printf(" %2.0f\n",dte);
TickTock 136:41a204105511 105 }else{
TickTock 165:4daa921730dd 106 tt.locate(79,85);
TickTock 163:3b6fab958773 107 printf(" %2.1f\n",dte);
TickTock 136:41a204105511 108 }
TickTock 136:41a204105511 109 tt.set_font((unsigned char*) Arial28x28);
TickTock 165:4daa921730dd 110 tt.locate(185,106);
TickTock 163:3b6fab958773 111 printf("%s\n",distanceUnit());
TickTock 136:41a204105511 112
TickTock 163:3b6fab958773 113 // No Climate Control DTE
TickTock 163:3b6fab958773 114 tt.set_font((unsigned char*) Arial24x23);
TickTock 163:3b6fab958773 115 tt.foreground(Green);
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 165:4daa921730dd 121 tt.locate(130,134);
TickTock 165:4daa921730dd 122 printf("+%2.1f \n",dte);
TickTock 165:4daa921730dd 123 /*// " "=13, "."=5, #=17
TickTock 164:46ed06263b0e 124 if(dte>=99.5){
TickTock 164:46ed06263b0e 125 tt.locate(120,134);
TickTock 164:46ed06263b0e 126 printf(" %3.0f\n",dte);
TickTock 164:46ed06263b0e 127 }else if(dte>=9.5){
TickTock 164:46ed06263b0e 128 tt.locate(111,134);
TickTock 164:46ed06263b0e 129 printf(" %2.0f\n",dte);
TickTock 164:46ed06263b0e 130 }else{
TickTock 164:46ed06263b0e 131 tt.locate(111,134);
TickTock 164:46ed06263b0e 132 printf(" %2.1f\n",dte);
TickTock 165:4daa921730dd 133 }*/
TickTock 167:58d4edf403d4 134 lmaxTemp=0; //force battery termperature refresh (sometimes overlaps)
TickTock 163:3b6fab958773 135 }
TickTock 163:3b6fab958773 136 // best-case DTE
TickTock 163:3b6fab958773 137 tt.set_font((unsigned char*) Arial28x28);
TickTock 167:58d4edf403d4 138 // Compute DTE based on best saved trip efficiency (without climate control) and adding the impact
TickTock 167:58d4edf403d4 139 // of the current climate control power relative to the last 10 minutes of driving
TickTock 167:58d4edf403d4 140 dte=convertDistance((maxTripEff-mpkWh_noCC+mpkWh[dtePeriod])*useable_kWh); //LM - add metric conversion
TickTock 136:41a204105511 141 tt.foreground(Orange);
TickTock 139:ac227b203ef2 142 if(dte>=99.5){
TickTock 165:4daa921730dd 143 tt.locate(255,84);
TickTock 163:3b6fab958773 144 printf("%3.0f \n",dte);
TickTock 139:ac227b203ef2 145 }else if(dte>=9.5){
TickTock 165:4daa921730dd 146 tt.locate(270,84);
TickTock 163:3b6fab958773 147 printf("%2.0f \n",dte);
TickTock 136:41a204105511 148 }else{
TickTock 165:4daa921730dd 149 tt.locate(265,84);
TickTock 163:3b6fab958773 150 printf("%2.1f \n",dte);
TickTock 136:41a204105511 151 }
TickTock 50:83d5864c64a0 152 lmpkWh=mpkWh[dtePeriod];
TickTock 165:4daa921730dd 153 } //!(force||gids!=lgids||mpkWh[dtePeriod]!=lmpkWh)
TickTock 165:4daa921730dd 154 lgids=gids;
TickTock 136:41a204105511 155 if(force||packV_x2!=lpackV_x2){
TickTock 136:41a204105511 156 tt.locate(210,176);
TickTock 136:41a204105511 157 tt.foreground(Yellow);
TickTock 136:41a204105511 158 printf("%4.1fV\n",(float)packV_x2/2);
TickTock 136:41a204105511 159 lpackV_x2=packV_x2;
TickTock 136:41a204105511 160 ltireP=0;//Force tire pressure redraw, too
TickTock 136:41a204105511 161 }
TickTock 150:ef46ce63345c 162 if(force||aTemp!=laTemp){
TickTock 138:a2f5af85ed0d 163 tt.foreground(Cyan);
TickTock 166:ec3951ba9701 164 tt.locate(10,146);
TickTock 150:ef46ce63345c 165 printf("%2.0f%s\n",convertF(aTemp),temperatureUnit());
TickTock 150:ef46ce63345c 166 laTemp=aTemp;
TickTock 148:6e3b9135fad2 167 }
TickTock 136:41a204105511 168 if(force||maxTemp!=lmaxTemp){
TickTock 136:41a204105511 169 tt.foreground(Cyan);
TickTock 138:a2f5af85ed0d 170 tt.locate(210,146);
TickTock 168:9227024c4e3a 171 if (convertC(maxTemp)<99.5){
TickTock 148:6e3b9135fad2 172 printf(" %3.1f%s\n",convertC(maxTemp),temperatureUnit());
TickTock 136:41a204105511 173 }else{
TickTock 148:6e3b9135fad2 174 printf("%4.1f%s\n",convertC(maxTemp),temperatureUnit());
TickTock 136:41a204105511 175 }
TickTock 136:41a204105511 176 lmaxTemp=maxTemp;
TickTock 136:41a204105511 177 }
TickTock 136:41a204105511 178 if(force||accV!=laccV){
TickTock 166:ec3951ba9701 179 tt.locate(10,176);
TickTock 136:41a204105511 180 tt.foreground(Yellow);
TickTock 148:6e3b9135fad2 181 printf("%3.1fV \n",accV);
TickTock 136:41a204105511 182 laccV=accV;
TickTock 136:41a204105511 183 }
TickTock 131:0d926c080a65 184 if(force||tireP!=ltireP){
TickTock 134:ad243e4f1a17 185 if(msg.data[2]<minTirePressure){
TickTock 134:ad243e4f1a17 186 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 187 }else{
TickTock 134:ad243e4f1a17 188 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 189 }
TickTock 131:0d926c080a65 190 if(msg.data[6]&0x80){
TickTock 134:ad243e4f1a17 191 if(msg.data[2]<minTirePressure){
TickTock 134:ad243e4f1a17 192 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 193 }else{
TickTock 134:ad243e4f1a17 194 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 195 }
TickTock 131:0d926c080a65 196 tt.locate(10,206);
TickTock 131:0d926c080a65 197 printf("%3.1f\n",(float)msg.data[2]/4);
TickTock 131:0d926c080a65 198 }
TickTock 131:0d926c080a65 199 if(msg.data[6]&0x40){
TickTock 134:ad243e4f1a17 200 if(msg.data[3]<minTirePressure){
TickTock 134:ad243e4f1a17 201 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 202 }else{
TickTock 134:ad243e4f1a17 203 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 204 }
TickTock 131:0d926c080a65 205 tt.locate(90,206);
TickTock 131:0d926c080a65 206 printf("%3.1f\n",(float)msg.data[3]/4);
TickTock 131:0d926c080a65 207 }
TickTock 131:0d926c080a65 208 if(msg.data[6]&0x20){
TickTock 134:ad243e4f1a17 209 if(msg.data[4]<minTirePressure){
TickTock 134:ad243e4f1a17 210 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 211 }else{
TickTock 134:ad243e4f1a17 212 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 213 }
TickTock 131:0d926c080a65 214 tt.locate(170,206);
TickTock 131:0d926c080a65 215 printf("%3.1f\n",(float)msg.data[4]/4);
TickTock 131:0d926c080a65 216 }
TickTock 131:0d926c080a65 217 if(msg.data[6]&0x10){
TickTock 134:ad243e4f1a17 218 if(msg.data[5]<minTirePressure){
TickTock 134:ad243e4f1a17 219 tt.foreground(Orange); // Hi-light if any are low (<35psi)
TickTock 134:ad243e4f1a17 220 }else{
TickTock 134:ad243e4f1a17 221 tt.foreground(LightGrey);
TickTock 134:ad243e4f1a17 222 }
TickTock 131:0d926c080a65 223 tt.locate(250,206);
TickTock 131:0d926c080a65 224 printf("%3.1f\n",(float)msg.data[5]/4);
TickTock 131:0d926c080a65 225 }
TickTock 131:0d926c080a65 226 ltireP=tireP;
TickTock 102:fd19f777a0b4 227 }
TickTock 48:d1ce92104a1f 228 }else {//if(skin==ggSkin){
TickTock 48:d1ce92104a1f 229 if(force||gids!=lgids){
TickTock 48:d1ce92104a1f 230 tt.locate(10,10);
TickTock 48:d1ce92104a1f 231 printf("%4d GIDs \n",gids);
TickTock 48:d1ce92104a1f 232
TickTock 48:d1ce92104a1f 233 tt.locate(40,40); // gg - add GIDs Percent of 281
TickTock 48:d1ce92104a1f 234 printf("%4.1f%s \n", (float)gids*0.355872, "% ") ;
TickTock 48:d1ce92104a1f 235 tt.locate(20,70);
TickTock 48:d1ce92104a1f 236 printf("%4.1f kwh \n",(float)gids*0.075); // gg - closer to usable
TickTock 48:d1ce92104a1f 237
TickTock 48:d1ce92104a1f 238 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 48:d1ce92104a1f 239 tt.foreground(Green);
TickTock 48:d1ce92104a1f 240 //tt.locate(60,96);
TickTock 48:d1ce92104a1f 241 tt.locate(60,116); // gg - move down a little
leafman 98:9f8bab96edff 242 printf("%4.1f %s \n",convertDistance((float)(gids-5)*0.31),distanceUnit()); // Approx for now - LM added metric
TickTock 48:d1ce92104a1f 243 lgids=gids;
TickTock 48:d1ce92104a1f 244 tt.foreground(Yellow);
TickTock 48:d1ce92104a1f 245 tt.set_font((unsigned char*) Arial28x28);
TickTock 48:d1ce92104a1f 246 }
TickTock 48:d1ce92104a1f 247
TickTock 122:138a40892a4c 248 if(force||SOC_x10!=lSOC){
TickTock 48:d1ce92104a1f 249 tt.locate(200,10);
TickTock 122:138a40892a4c 250 printf("%4.1f%s\n",(float)SOC_x10/10,"% ");
TickTock 122:138a40892a4c 251 lSOC=SOC_x10;
TickTock 48:d1ce92104a1f 252 }
TickTock 119:0e2b641e98a2 253 if(force||packV_x2!=lpackV_x2){
TickTock 48:d1ce92104a1f 254 tt.locate(200,200);
TickTock 119:0e2b641e98a2 255 printf("%4.1fV \n",(float)packV_x2/2);
TickTock 119:0e2b641e98a2 256 lpackV_x2=packV_x2;
TickTock 48:d1ce92104a1f 257 }
TickTock 48:d1ce92104a1f 258 if(force||accV!=laccV){
TickTock 48:d1ce92104a1f 259 tt.locate(20,200);
TickTock 48:d1ce92104a1f 260 printf("%3.1fV \n",accV);
TickTock 48:d1ce92104a1f 261 laccV=accV;
TickTock 48:d1ce92104a1f 262 }
TickTock 161:71ac85d11f03 263 total_kW=kW[0]+CCkW;
TickTock 161:71ac85d11f03 264 if(force||total_kW!=lkW){
TickTock 48:d1ce92104a1f 265 tt.locate(160,40); // gg - move left to keep from wrap
TickTock 161:71ac85d11f03 266 printf("%3.2fkw \n",total_kW); // use small w to save space
TickTock 161:71ac85d11f03 267 lkW=total_kW;
TickTock 48:d1ce92104a1f 268 }
TickTock 35:5acbd8a64a89 269 }
TickTock 108:29b5a760adc2 270 if(led4){
TickTock 106:f016912a03db 271 tt.fillcircle(310,10,6,Red);
TickTock 106:f016912a03db 272 }else{
TickTock 106:f016912a03db 273 tt.fillcircle(310,10,6,Navy);
TickTock 106:f016912a03db 274 }
TickTock 13:62e0f7f39ff5 275 }
TickTock 13:62e0f7f39ff5 276
TickTock 42:4533b13b297d 277 void printLast (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 278 CANMessage msg;
TickTock 13:62e0f7f39ff5 279 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 280 tt.foreground(Red);
TickTock 13:62e0f7f39ff5 281 tt.background(Yellow);
TickTock 13:62e0f7f39ff5 282 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 13:62e0f7f39ff5 283 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 13:62e0f7f39ff5 284 for(int i=0; i<19; i++){
TickTock 13:62e0f7f39ff5 285 msg = lastMsg[i+indexOffset];
TickTock 13:62e0f7f39ff5 286 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 287 }
TickTock 122:138a40892a4c 288 if(showButtons){
garygid 54:6ce808d0995e 289 showButton(0,0," <up>","",4,4);
garygid 54:6ce808d0995e 290 showButton(2,0,"<down>","",4,4);
TickTock 25:ddf0ec209f03 291 }
TickTock 13:62e0f7f39ff5 292 }
TickTock 13:62e0f7f39ff5 293
TickTock 42:4533b13b297d 294 void printChanged (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 295 CANMessage msg;
TickTock 13:62e0f7f39ff5 296 unsigned char i,j;
TickTock 13:62e0f7f39ff5 297 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 298 tt.foreground(Red);
TickTock 13:62e0f7f39ff5 299 tt.background(Yellow);
TickTock 13:62e0f7f39ff5 300 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 13:62e0f7f39ff5 301 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 13:62e0f7f39ff5 302 i=0;
TickTock 13:62e0f7f39ff5 303 j=indexOffset;
TickTock 13:62e0f7f39ff5 304 do{
TickTock 13:62e0f7f39ff5 305 j=j<99?j+1:j;
TickTock 13:62e0f7f39ff5 306 if(msgChanged[j]>0){
TickTock 13:62e0f7f39ff5 307 msg = lastMsg[j];
TickTock 13:62e0f7f39ff5 308 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 309 i++;
TickTock 13:62e0f7f39ff5 310 }// if changed
TickTock 13:62e0f7f39ff5 311 }while(i<19&&j<99);
TickTock 122:138a40892a4c 312 if(showButtons){
garygid 54:6ce808d0995e 313 showButton(0,0," <up>","",4,4);
garygid 54:6ce808d0995e 314 showButton(2,0," <down>","",4,4);
garygid 54:6ce808d0995e 315 showButton(1,0," Reset","Baseline",4,4);
TickTock 40:0e6e71a7323f 316 }
TickTock 13:62e0f7f39ff5 317 }
TickTock 13:62e0f7f39ff5 318
TickTock 42:4533b13b297d 319 void printLog (bool force, bool showButtons){
TickTock 118:02010b18efdc 320 static unsigned char lastldl = 0;
TickTock 118:02010b18efdc 321 unsigned char ldl=displayLoc;
TickTock 118:02010b18efdc 322 if(force||ldl!=lastldl){ //only update if changed
TickTock 13:62e0f7f39ff5 323 tt.foreground(Amber);
TickTock 13:62e0f7f39ff5 324 tt.background(Black);
TickTock 13:62e0f7f39ff5 325 tt.cls();
TickTock 13:62e0f7f39ff5 326 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 327 tt.set_font((unsigned char*) Arial12x12);
TickTock 13:62e0f7f39ff5 328 for(int i=0; i<19; i++){
TickTock 118:02010b18efdc 329 printf("%s",displayLog[ldl]);
TickTock 118:02010b18efdc 330 ldl=ldl>17?0:ldl+1;
TickTock 13:62e0f7f39ff5 331 }
TickTock 13:62e0f7f39ff5 332 }
TickTock 118:02010b18efdc 333 lastldl=ldl;
TickTock 13:62e0f7f39ff5 334 }
TickTock 13:62e0f7f39ff5 335
TickTock 168:9227024c4e3a 336 void tripDisplay (bool force, bool showButtons, bool inclCC){
TickTock 168:9227024c4e3a 337 static int lkWh=0;
TickTock 168:9227024c4e3a 338 float mpkWh_f, kWh_f;
TickTock 118:02010b18efdc 339 tt.background(White);
TickTock 118:02010b18efdc 340 if(force){
TickTock 118:02010b18efdc 341 tt.cls();
TickTock 118:02010b18efdc 342 }
TickTock 168:9227024c4e3a 343 if(force||(lkWh!=(int)(kWh_trip[0]*100))){ //only update if changed
TickTock 118:02010b18efdc 344 tt.foreground(Navy);
TickTock 118:02010b18efdc 345 tt.set_font((unsigned char*) Arial28x28);
TickTock 118:02010b18efdc 346 tt.locate(6,210);
TickTock 168:9227024c4e3a 347 if(inclCC){
TickTock 168:9227024c4e3a 348 printf("kWh : %s : Eff (+CC)\n",distanceUnit());
TickTock 168:9227024c4e3a 349 } else {
TickTock 168:9227024c4e3a 350 printf("kWh : %s : Eff (noCC)\n",distanceUnit());
TickTock 168:9227024c4e3a 351 }
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 161:71ac85d11f03 1003
TickTock 157:1a100a5ed06f 1004 // a button to step to the next skin
TickTock 157:1a100a5ed06f 1005 unsigned int nextSkin = skin + 1 ;
TickTock 157:1a100a5ed06f 1006 if( nextSkin > maxSkin ) nextSkin = 0 ;
TickTock 157:1a100a5ed06f 1007
TickTock 157:1a100a5ed06f 1008 if( nextSkin == ttSkin ) sprintf(sTemp1,"Skin TT");
TickTock 157:1a100a5ed06f 1009 else if( nextSkin == ggSkin ) sprintf(sTemp1,"Skin GG");
TickTock 157:1a100a5ed06f 1010 else sprintf(sTemp1,"Skin %d",nextSkin);
TickTock 157:1a100a5ed06f 1011
TickTock 157:1a100a5ed06f 1012 showButton(3,0," Use",sTemp1,4,4);
TickTock 157:1a100a5ed06f 1013
TickTock 157:1a100a5ed06f 1014 //------- second row -----
TickTock 157:1a100a5ed06f 1015 // add Enable/Disable Debug - debugMode
garygid 87:46ac3f2519d6 1016 if (debugMode) {
TickTock 131:0d926c080a65 1017 sprintf(sTemp1," Disable");
garygid 87:46ac3f2519d6 1018 } else {
TickTock 131:0d926c080a65 1019 sprintf(sTemp1," Enable");
garygid 87:46ac3f2519d6 1020 }
garygid 87:46ac3f2519d6 1021 showButton(3,1,sTemp1," Debug",4,4);
TickTock 157:1a100a5ed06f 1022
TickTock 158:059abeb44ba1 1023 //------- third row -----
TickTock 158:059abeb44ba1 1024 if (autoSync) {
TickTock 158:059abeb44ba1 1025 sprintf(sTemp1," Disable");
TickTock 158:059abeb44ba1 1026 } else {
TickTock 158:059abeb44ba1 1027 sprintf(sTemp1," Enable");
TickTock 158:059abeb44ba1 1028 }
TickTock 158:059abeb44ba1 1029 showButton(0,2,sTemp1," tSync",4,4);
TickTock 131:0d926c080a65 1030 showButton(1,2," Set"," Time",4,4);
TickTock 131:0d926c080a65 1031 if (showHealth) {
TickTock 131:0d926c080a65 1032 sprintf(sTemp1," Hide");
TickTock 131:0d926c080a65 1033 } else {
TickTock 131:0d926c080a65 1034 sprintf(sTemp1," Show");
TickTock 131:0d926c080a65 1035 }
TickTock 131:0d926c080a65 1036 showButton(2,2,sTemp1," Health",4,4);
leafman 98:9f8bab96edff 1037 showButton(3,2,"Update","Firmware",4,4);
TickTock 36:dbd39c315258 1038 }
TickTock 36:dbd39c315258 1039
TickTock 42:4533b13b297d 1040 void pbScreen(bool force, bool showButtons){
TickTock 36:dbd39c315258 1041 if (force) {
TickTock 36:dbd39c315258 1042 tt.background(Black);
TickTock 36:dbd39c315258 1043 tt.cls();
TickTock 36:dbd39c315258 1044 }
TickTock 36:dbd39c315258 1045 if(playbackOpen){
garygid 54:6ce808d0995e 1046 showButton(0,0,"Slower"," <--",4,4);
garygid 54:6ce808d0995e 1047
TickTock 36:dbd39c315258 1048 if(playbackEn){
garygid 54:6ce808d0995e 1049 sprintf(sTemp1,"Pause");
TickTock 36:dbd39c315258 1050 }else{
garygid 54:6ce808d0995e 1051 sprintf(sTemp1," Run");
TickTock 36:dbd39c315258 1052 }
garygid 54:6ce808d0995e 1053 sprintf(sTemp2,"%4.3f ",playbackInt);
garygid 54:6ce808d0995e 1054 showButton(1,0,sTemp1,sTemp2,4,4);
garygid 54:6ce808d0995e 1055
garygid 54:6ce808d0995e 1056 showButton(2,0,"Faster"," -->",4,4);
TickTock 36:dbd39c315258 1057 }
TickTock 36:dbd39c315258 1058 if(playbackOpen){
TickTock 36:dbd39c315258 1059 sprintf(sTemp1," Stop");
TickTock 36:dbd39c315258 1060 }else{
garygid 54:6ce808d0995e 1061 sprintf(sTemp1,"Start");
TickTock 36:dbd39c315258 1062 }
garygid 54:6ce808d0995e 1063 showButton(1,1,sTemp1,"Playback",4,4);
TickTock 36:dbd39c315258 1064 }
TickTock 36:dbd39c315258 1065
TickTock 42:4533b13b297d 1066 void showDateTime(bool force, bool showButtons){
TickTock 152:a4d66901785d 1067 CANMessage msg;
TickTock 36:dbd39c315258 1068 struct tm t; // pointer to a static tm structure
TickTock 36:dbd39c315258 1069 time_t seconds ;
TickTock 36:dbd39c315258 1070 tt.foreground(Yellow);
TickTock 44:6262a9fd1e56 1071 tt.background(Black);
TickTock 152:a4d66901785d 1072 if (force||tock) {
TickTock 36:dbd39c315258 1073 tt.cls();
TickTock 36:dbd39c315258 1074 tt.locate(10,10);
TickTock 43:e7f6f80590e3 1075 tt.set_font((unsigned char*) Arial12x12);
TickTock 152:a4d66901785d 1076 if(accOn){
TickTock 152:a4d66901785d 1077 seconds = time(NULL);
TickTock 153:e94cfe3c339c 1078 t = *localtime(&seconds);
TickTock 153:e94cfe3c339c 1079
TickTock 153:e94cfe3c339c 1080 if(modelYear<2013){
TickTock 153:e94cfe3c339c 1081 msg = lastMsg[indexLastMsg[0x5fa]];
TickTock 153:e94cfe3c339c 1082 t.tm_mon = (msg.data[5]>>4)-1;
TickTock 153:e94cfe3c339c 1083 t.tm_mday = msg.data[2]>>3;
TickTock 153:e94cfe3c339c 1084 // Have not figured out where the year is on MY2011
TickTock 153:e94cfe3c339c 1085 msg = lastMsg[indexLastMsg[0x5fc]];
TickTock 153:e94cfe3c339c 1086 t.tm_hour = msg.data[0]>>3;
TickTock 153:e94cfe3c339c 1087 t.tm_min = (msg.data[1]<<4&0x30)+(msg.data[2]>>4);
TickTock 153:e94cfe3c339c 1088 t.tm_sec = msg.data[1]>>2;
TickTock 153:e94cfe3c339c 1089 }else{
TickTock 153:e94cfe3c339c 1090 // Have not figured out where Year, Month, or Day is for MY2013
TickTock 153:e94cfe3c339c 1091 msg = lastMsg[indexLastMsg[0x5f9]];
TickTock 153:e94cfe3c339c 1092 t.tm_hour = msg.data[5]>>3;
TickTock 153:e94cfe3c339c 1093 t.tm_min = msg.data[4];
TickTock 153:e94cfe3c339c 1094 msg = lastMsg[indexLastMsg[0x509]];
TickTock 153:e94cfe3c339c 1095 t.tm_sec = msg.data[2]>>2;
TickTock 153:e94cfe3c339c 1096 }
TickTock 153:e94cfe3c339c 1097
TickTock 152:a4d66901785d 1098 strftime(sTemp1, 32, "%a %m/%d/%Y %X \n", &t);
TickTock 152:a4d66901785d 1099 printf("Leaf: %s",sTemp1);
TickTock 152:a4d66901785d 1100 }
TickTock 152:a4d66901785d 1101 seconds = time(NULL);
TickTock 152:a4d66901785d 1102 t = *localtime(&seconds);
TickTock 36:dbd39c315258 1103 strftime(sTemp1, 32, "%a %m/%d/%Y %X \n", &t);
TickTock 152:a4d66901785d 1104 tt.locate(10,24);
TickTock 152:a4d66901785d 1105 printf("CANary: %s",sTemp1);
TickTock 122:138a40892a4c 1106 if(showButtons){
TickTock 36:dbd39c315258 1107 switch(dtMode){
TickTock 36:dbd39c315258 1108 case 0:
TickTock 36:dbd39c315258 1109 sprintf(sTemp1,"Year");
TickTock 36:dbd39c315258 1110 break;
TickTock 36:dbd39c315258 1111 case 1:
TickTock 36:dbd39c315258 1112 sprintf(sTemp1,"Month");
TickTock 36:dbd39c315258 1113 break;
TickTock 36:dbd39c315258 1114 case 2:
TickTock 36:dbd39c315258 1115 sprintf(sTemp1,"Day");
TickTock 36:dbd39c315258 1116 break;
TickTock 36:dbd39c315258 1117 case 3:
TickTock 36:dbd39c315258 1118 sprintf(sTemp1,"Hour");
TickTock 36:dbd39c315258 1119 break;
TickTock 36:dbd39c315258 1120 case 4:
TickTock 36:dbd39c315258 1121 sprintf(sTemp1,"Minute");
TickTock 36:dbd39c315258 1122 break;
TickTock 36:dbd39c315258 1123 case 5:
TickTock 36:dbd39c315258 1124 sprintf(sTemp1,"Second");
TickTock 36:dbd39c315258 1125 break;
TickTock 36:dbd39c315258 1126 default:
TickTock 36:dbd39c315258 1127 break;
TickTock 36:dbd39c315258 1128 }
TickTock 66:b7476ce7a59e 1129 showButton(0,1,sTemp1,"",4,4);
TickTock 152:a4d66901785d 1130 showButton(1,1," Up","",4,4);
TickTock 152:a4d66901785d 1131 showButton(2,1," Down","",4,4);
TickTock 152:a4d66901785d 1132 if(accOn){
TickTock 152:a4d66901785d 1133 showButton(3,1," Sync","w/ car",4,4);
TickTock 152:a4d66901785d 1134 }
TickTock 152:a4d66901785d 1135 if(autoSync){
TickTock 152:a4d66901785d 1136 showButton(3,2,"disable"," auto",4,4);
TickTock 152:a4d66901785d 1137 }else{
TickTock 152:a4d66901785d 1138 showButton(3,2,"enable"," auto",4,4);
TickTock 152:a4d66901785d 1139 }
TickTock 36:dbd39c315258 1140 }
TickTock 36:dbd39c315258 1141 }
TickTock 36:dbd39c315258 1142 }
TickTock 36:dbd39c315258 1143
TickTock 50:83d5864c64a0 1144 void dteDisplay(bool force, bool showButtons, bool showMiles){
TickTock 66:b7476ce7a59e 1145 unsigned short i,x,y,lx,ly,gids,radius,color,r,t;
TickTock 79:68f0dd8d1f19 1146 unsigned char toVal;
TickTock 50:83d5864c64a0 1147 static unsigned short lgids=0;
TickTock 50:83d5864c64a0 1148 static unsigned char leff[39]={0};
TickTock 50:83d5864c64a0 1149 CANMessage msg;
TickTock 66:b7476ce7a59e 1150 unsigned long targetBraking, regenBraking, temp;
TickTock 156:4e5d30535cf9 1151 static unsigned long maxTarget = 1000, tardivreg_x1000 = 1400;
TickTock 66:b7476ce7a59e 1152 static unsigned char lr=0, lt=0;
TickTock 50:83d5864c64a0 1153
TickTock 50:83d5864c64a0 1154 msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
TickTock 50:83d5864c64a0 1155 gids = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 50:83d5864c64a0 1156 if(gids==0){
TickTock 83:52b1f330a62d 1157 gids=281; // Display new, fully charged capacity until real data obtained
TickTock 50:83d5864c64a0 1158 }
TickTock 50:83d5864c64a0 1159
TickTock 37:fea2c1d52c5f 1160 tt.background(Navy);
TickTock 49:a3d2c5bb3cfa 1161 tt.foreground(Yellow);
TickTock 52:d5385fbf4ea1 1162 if(force){
TickTock 97:a25940fd7b5b 1163 tt.set_font((unsigned char*) Arial12x12);
TickTock 52:d5385fbf4ea1 1164 tt.cls();
TickTock 49:a3d2c5bb3cfa 1165 x=50+0*6;
TickTock 52:d5385fbf4ea1 1166 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1167 printf("sec\n");
TickTock 50:83d5864c64a0 1168 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1169 x=50+9*6;
TickTock 52:d5385fbf4ea1 1170 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1171 printf("min\n");
TickTock 50:83d5864c64a0 1172 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1173 x=50+18*6;
TickTock 52:d5385fbf4ea1 1174 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1175 printf("hour\n");
TickTock 83:52b1f330a62d 1176 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1177 x=50+25*6;
TickTock 52:d5385fbf4ea1 1178 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1179 printf("day\n");
TickTock 50:83d5864c64a0 1180 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1181 x=50+32*6;
TickTock 52:d5385fbf4ea1 1182 tt.locate(x-10,226);
TickTock 49:a3d2c5bb3cfa 1183 printf("mon\n");
TickTock 50:83d5864c64a0 1184 tt.line(x,10,x,220,DarkGrey);
TickTock 49:a3d2c5bb3cfa 1185 x=50+38*6;
TickTock 162:c6545fc0164a 1186 }
TickTock 162:c6545fc0164a 1187 toVal=33;
TickTock 83:52b1f330a62d 1188 if(force||lgids!=gids){ // update Y axis when kWh changes
TickTock 97:a25940fd7b5b 1189 tt.set_font((unsigned char*) Arial24x23);
TickTock 131:0d926c080a65 1190 for(i=2;i<7;i++){
TickTock 131:0d926c080a65 1191 y=200-(i-2)*40;
TickTock 97:a25940fd7b5b 1192 tt.locate(0,y-8);
TickTock 83:52b1f330a62d 1193 if (showMiles){
leafman 98:9f8bab96edff 1194 printf("%3.0f\n",convertDistance(i*((float)(gids-5)*.075))); // LM - Added metric support
TickTock 83:52b1f330a62d 1195 }else{
TickTock 83:52b1f330a62d 1196 printf("%d.0\n",i);
TickTock 50:83d5864c64a0 1197 }
TickTock 97:a25940fd7b5b 1198 tt.line(48,y,toVal*6+56,y,DarkGrey);
TickTock 83:52b1f330a62d 1199 }
TickTock 50:83d5864c64a0 1200 lgids=gids;
TickTock 50:83d5864c64a0 1201 }
TickTock 121:553faf139a20 1202 if(tock||force){
TickTock 131:0d926c080a65 1203 for(i=2;i<7;i++){
TickTock 131:0d926c080a65 1204 y=200-(i-2)*40;
TickTock 83:52b1f330a62d 1205 tt.line(40,y,158,y,DarkGrey);
TickTock 50:83d5864c64a0 1206 }
TickTock 50:83d5864c64a0 1207
TickTock 50:83d5864c64a0 1208 x=50+0*6;
TickTock 50:83d5864c64a0 1209 tt.line(x,10,x,220,DarkGrey);
TickTock 50:83d5864c64a0 1210 x=50+9*6;
TickTock 50:83d5864c64a0 1211 tt.line(x,10,x,220,DarkGrey);
TickTock 50:83d5864c64a0 1212 x=50+18*6;
TickTock 50:83d5864c64a0 1213 tt.line(x,10,x,220,DarkGrey);
TickTock 83:52b1f330a62d 1214 //x=50+25*6;
TickTock 83:52b1f330a62d 1215 //tt.line(x,60,x,220,DarkGrey);
TickTock 83:52b1f330a62d 1216 //x=50+32*6;
TickTock 83:52b1f330a62d 1217 //tt.line(x,60,x,220,DarkGrey);
TickTock 66:b7476ce7a59e 1218 //x=50+38*6;
TickTock 66:b7476ce7a59e 1219 //tt.line(x,60,x,220,DarkGrey);
TickTock 50:83d5864c64a0 1220 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 164:46ed06263b0e 1221 tt.foreground(Yellow);
TickTock 50:83d5864c64a0 1222 if (showMiles){
TickTock 93:c2402e8cd0e2 1223 float miles = mpkWh[dtePeriod]*((float)(gids-5)*.075);
leafman 98:9f8bab96edff 1224 miles = convertDistance(miles); // LM - Metric support
TickTock 93:c2402e8cd0e2 1225 // Right justify
TickTock 94:c3a14b3975d6 1226 if (miles>99.9){ //space=18; num=31; . = 23
TickTock 163:3b6fab958773 1227 tt.locate(161,1);
TickTock 94:c3a14b3975d6 1228 printf("%4.1f\n",miles);
TickTock 93:c2402e8cd0e2 1229 } else if (miles>9.9){
TickTock 163:3b6fab958773 1230 tt.locate(156,1);
TickTock 94:c3a14b3975d6 1231 printf(" %3.1f\n",miles);
TickTock 93:c2402e8cd0e2 1232 } else {
TickTock 163:3b6fab958773 1233 tt.locate(151,1);
TickTock 94:c3a14b3975d6 1234 printf(" %2.1f\n",miles);
TickTock 93:c2402e8cd0e2 1235 }
TickTock 164:46ed06263b0e 1236 if(CCon) {
TickTock 164:46ed06263b0e 1237 tt.foreground(Green);
TickTock 164:46ed06263b0e 1238 tt.set_font((unsigned char*) Arial24x23);
TickTock 165:4daa921730dd 1239 miles = (mpkWh_noCC-mpkWh[dtePeriod])*((float)(gids-5)*.075);
TickTock 164:46ed06263b0e 1240 miles = convertDistance(miles); // LM - Metric support
TickTock 164:46ed06263b0e 1241 // Right justify
TickTock 165:4daa921730dd 1242 if (miles>9.9){
TickTock 165:4daa921730dd 1243 tt.locate(190,52);
TickTock 165:4daa921730dd 1244 printf(" +%3.1f \n",miles);
TickTock 165:4daa921730dd 1245 } else {
TickTock 164:46ed06263b0e 1246 tt.locate(182,52);
TickTock 165:4daa921730dd 1247 printf(" +%2.1f \n",miles);
TickTock 164:46ed06263b0e 1248 }
TickTock 162:c6545fc0164a 1249 }
TickTock 50:83d5864c64a0 1250 } else {
TickTock 163:3b6fab958773 1251 tt.locate(200,1);
TickTock 66:b7476ce7a59e 1252 printf("%3.1f \n",mpkWh[dtePeriod]);
TickTock 164:46ed06263b0e 1253 if(CCon) {
TickTock 164:46ed06263b0e 1254 tt.foreground(Green);
TickTock 164:46ed06263b0e 1255 tt.set_font((unsigned char*) Arial24x23);
TickTock 165:4daa921730dd 1256 tt.locate(190,52);
TickTock 165:4daa921730dd 1257 printf(" +%2.1f \n",(mpkWh_noCC-mpkWh[dtePeriod]));
TickTock 164:46ed06263b0e 1258 }
TickTock 50:83d5864c64a0 1259 }
TickTock 49:a3d2c5bb3cfa 1260 lx=50;
TickTock 97:a25940fd7b5b 1261 ly=mpkWh[0]*40;
TickTock 50:83d5864c64a0 1262 if(dtePeriod==0){
TickTock 52:d5385fbf4ea1 1263 radius=6;
TickTock 79:68f0dd8d1f19 1264 color=Yellow;
TickTock 50:83d5864c64a0 1265 }else{
TickTock 50:83d5864c64a0 1266 radius=2;
TickTock 50:83d5864c64a0 1267 color=Green;
TickTock 50:83d5864c64a0 1268 }
TickTock 131:0d926c080a65 1269 if(ly<60){
TickTock 97:a25940fd7b5b 1270 ly=220;
TickTock 97:a25940fd7b5b 1271 color=Red;
TickTock 131:0d926c080a65 1272 }else if(ly<280) {
TickTock 131:0d926c080a65 1273 ly=280-ly;
TickTock 97:a25940fd7b5b 1274 }else{
TickTock 97:a25940fd7b5b 1275 ly=0;
TickTock 97:a25940fd7b5b 1276 }
TickTock 50:83d5864c64a0 1277 tt.fillcircle(lx,leff[0],radius,Navy);
TickTock 50:83d5864c64a0 1278 tt.fillcircle(lx,ly,radius,color);
TickTock 49:a3d2c5bb3cfa 1279
TickTock 79:68f0dd8d1f19 1280 for(i=1;i<toVal;i++){
TickTock 49:a3d2c5bb3cfa 1281 x=50+i*6;
TickTock 97:a25940fd7b5b 1282 y=mpkWh[i]*40;
TickTock 50:83d5864c64a0 1283 if(i==dtePeriod){
TickTock 79:68f0dd8d1f19 1284 radius=6;
TickTock 79:68f0dd8d1f19 1285 color=Yellow;
TickTock 50:83d5864c64a0 1286 }else{
TickTock 50:83d5864c64a0 1287 radius=2;
TickTock 50:83d5864c64a0 1288 color=Green;
TickTock 50:83d5864c64a0 1289 }
TickTock 131:0d926c080a65 1290 if(y<60){
TickTock 97:a25940fd7b5b 1291 y=220;
TickTock 97:a25940fd7b5b 1292 color=Red;
TickTock 131:0d926c080a65 1293 }else if(y<280) {
TickTock 131:0d926c080a65 1294 y=280-y;
TickTock 97:a25940fd7b5b 1295 }else{
TickTock 97:a25940fd7b5b 1296 y=0;
TickTock 97:a25940fd7b5b 1297 }
TickTock 50:83d5864c64a0 1298 tt.fillcircle(x,leff[i],radius,Navy);
TickTock 50:83d5864c64a0 1299 tt.line(x-6,leff[i-1],x,leff[i],Navy);
TickTock 50:83d5864c64a0 1300 leff[i-1]=ly;
TickTock 52:d5385fbf4ea1 1301 if(y>0){
TickTock 52:d5385fbf4ea1 1302 tt.fillcircle(x,y,radius,color);
TickTock 52:d5385fbf4ea1 1303 }
TickTock 49:a3d2c5bb3cfa 1304 tt.line(lx,ly,x,y,White);
TickTock 49:a3d2c5bb3cfa 1305 lx=x;
TickTock 49:a3d2c5bb3cfa 1306 ly=y;
TickTock 49:a3d2c5bb3cfa 1307 }
TickTock 50:83d5864c64a0 1308 leff[i-1]=y;
TickTock 37:fea2c1d52c5f 1309 }
TickTock 66:b7476ce7a59e 1310
TickTock 156:4e5d30535cf9 1311 msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target total braking
TickTock 66:b7476ce7a59e 1312 targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
TickTock 156:4e5d30535cf9 1313
TickTock 156:4e5d30535cf9 1314 msg = lastMsg[indexLastMsg[0x1d4]]; //Get Motor Amps - simlar to 1d5/1.4 but includes coast regen
TickTock 156:4e5d30535cf9 1315 temp = (msg.data[2]<<4)+(msg.data[3]>>4);
TickTock 156:4e5d30535cf9 1316 if(temp>0x7ff){ // invert and chop positive current
TickTock 156:4e5d30535cf9 1317 regenBraking=0x1000-temp;
TickTock 156:4e5d30535cf9 1318 }else{
TickTock 156:4e5d30535cf9 1319 regenBraking=0;
TickTock 108:29b5a760adc2 1320 }
TickTock 73:62ee8eae3a84 1321
TickTock 73:62ee8eae3a84 1322 if (targetBraking<2045){
TickTock 73:62ee8eae3a84 1323 if (targetBraking>maxTarget) maxTarget=targetBraking;
TickTock 66:b7476ce7a59e 1324 temp = targetBraking;
TickTock 163:3b6fab958773 1325 temp *=167;
TickTock 73:62ee8eae3a84 1326 temp /= maxTarget;
TickTock 73:62ee8eae3a84 1327 t = (char) temp;
TickTock 163:3b6fab958773 1328 if (t>160) t=160;
TickTock 73:62ee8eae3a84 1329 temp = regenBraking;
TickTock 73:62ee8eae3a84 1330 temp *= tardivreg_x1000;
TickTock 73:62ee8eae3a84 1331 temp /= maxTarget;
TickTock 163:3b6fab958773 1332 temp /= 6; // 1000/167=6
TickTock 73:62ee8eae3a84 1333 r = (char) temp;
TickTock 163:3b6fab958773 1334 if (r>160) r=160;
TickTock 73:62ee8eae3a84 1335 if (r>t) t=r; //Should never happen
TickTock 73:62ee8eae3a84 1336 if(lr!=r||lt!=t){
TickTock 164:46ed06263b0e 1337 if (t<160) tt.fillrect(264,239-160,310,238-t,Navy);
TickTock 164:46ed06263b0e 1338 if (r<t) tt.fillrect(264,239-t,310,238-r,Red);
TickTock 164:46ed06263b0e 1339 if (0<r) tt.fillrect(264,239-r,310,238,Green);
TickTock 73:62ee8eae3a84 1340 }
TickTock 73:62ee8eae3a84 1341 lt=t;
TickTock 73:62ee8eae3a84 1342 lr=r;
TickTock 66:b7476ce7a59e 1343 }
TickTock 37:fea2c1d52c5f 1344 }
TickTock 37:fea2c1d52c5f 1345
TickTock 150:ef46ce63345c 1346 void testDisplay (bool force, bool showButtons){
TickTock 158:059abeb44ba1 1347 static unsigned short maxPS=0, oldData[8]={0};
TickTock 158:059abeb44ba1 1348 unsigned char i, uData[8];//, year, month, day, hour, minute, second;
TickTock 148:6e3b9135fad2 1349 CANMessage msg;
TickTock 148:6e3b9135fad2 1350
TickTock 148:6e3b9135fad2 1351 tt.set_font((unsigned char*) Arial24x23);
TickTock 148:6e3b9135fad2 1352 tt.foreground(Yellow);
TickTock 148:6e3b9135fad2 1353 tt.background(Navy);
TickTock 148:6e3b9135fad2 1354 if(force){
TickTock 148:6e3b9135fad2 1355 tt.cls();
TickTock 148:6e3b9135fad2 1356 }
TickTock 158:059abeb44ba1 1357 if(logEn){
TickTock 158:059abeb44ba1 1358 if(pointerSep>maxPS){maxPS=pointerSep;}
TickTock 158:059abeb44ba1 1359 tt.locate(10,10);
TickTock 158:059abeb44ba1 1360 printf("%3d sep %3d max\n",pointerSep,maxPS);
TickTock 158:059abeb44ba1 1361 }
TickTock 158:059abeb44ba1 1362 /*msg = lastMsg[indexLastMsg[0x5fa]];
TickTock 152:a4d66901785d 1363 month = msg.data[5]>>4;
TickTock 152:a4d66901785d 1364 day = msg.data[2]>>3;
TickTock 152:a4d66901785d 1365 msg = lastMsg[indexLastMsg[0x5fb]];
TickTock 152:a4d66901785d 1366 year = msg.data[1];
TickTock 152:a4d66901785d 1367 msg = lastMsg[indexLastMsg[0x5fc]];
TickTock 152:a4d66901785d 1368 hour = msg.data[0]>>3;
TickTock 152:a4d66901785d 1369 minute = (msg.data[1]<<4&0x30)+(msg.data[2]>>4);
TickTock 152:a4d66901785d 1370 second = msg.data[1]>>2;
TickTock 152:a4d66901785d 1371 tt.locate(0,40);
TickTock 158:059abeb44ba1 1372 printf("%02d%02d%02d %02d%02d%03d\n",hour,minute,second,month,day,year);*/
TickTock 152:a4d66901785d 1373 //printf("%4.2fV %4.2fV \n",accV,accV2);
TickTock 158:059abeb44ba1 1374
TickTock 152:a4d66901785d 1375 for (i=0; i<8; i++){
TickTock 152:a4d66901785d 1376 msg = lastMsg[indexLastMsg[(uMsgId[i]>>4)]];
TickTock 152:a4d66901785d 1377 uData[i] = msg.data[(uMsgId[i]&0x000f)];
TickTock 158:059abeb44ba1 1378 if(i%2==0){
TickTock 158:059abeb44ba1 1379 tt.locate(10,90+(i/2)*30);
TickTock 158:059abeb44ba1 1380 }else{
TickTock 158:059abeb44ba1 1381 tt.locate(170,90+(i/2)*30);
TickTock 158:059abeb44ba1 1382 }
TickTock 158:059abeb44ba1 1383 if(clearTest){
TickTock 158:059abeb44ba1 1384 oldData[i]=uData[i];
TickTock 158:059abeb44ba1 1385 tt.foreground(Yellow);
TickTock 158:059abeb44ba1 1386 tt.background(Navy);
TickTock 158:059abeb44ba1 1387 printf("%4x:%2x\n",uMsgId[i],uData[i]);
TickTock 158:059abeb44ba1 1388 }else if(uData[i]!=oldData[i]){
TickTock 158:059abeb44ba1 1389 tt.foreground(Navy);
TickTock 158:059abeb44ba1 1390 tt.background(Yellow);
TickTock 158:059abeb44ba1 1391 printf("%4x:%2x\n",uMsgId[i],uData[i]);
TickTock 159:577e9d015693 1392 oldData[i]=uData[i];
TickTock 158:059abeb44ba1 1393 }else if(force){
TickTock 158:059abeb44ba1 1394 tt.foreground(Yellow);
TickTock 158:059abeb44ba1 1395 tt.background(Navy);
TickTock 158:059abeb44ba1 1396 printf("%4x:%2x\n",uMsgId[i],uData[i]);
TickTock 158:059abeb44ba1 1397 }
TickTock 152:a4d66901785d 1398 }
TickTock 158:059abeb44ba1 1399 clearTest=false;
TickTock 158:059abeb44ba1 1400 showButton(3,0,"Reset","flags",4,4);
TickTock 148:6e3b9135fad2 1401 }
TickTock 148:6e3b9135fad2 1402
TickTock 36:dbd39c315258 1403 void updateDisplay(char display){
TickTock 122:138a40892a4c 1404 bool changed,showButtons;
TickTock 164:46ed06263b0e 1405 changed = (dMode[display]!=lastDMode[display]);
TickTock 122:138a40892a4c 1406 showButtons = (display==whichTouched)&&(sMode==1);
TickTock 36:dbd39c315258 1407 tt.set_display(display);
TickTock 36:dbd39c315258 1408 switch (dMode[display]) {
TickTock 36:dbd39c315258 1409 case logScreen:
TickTock 122:138a40892a4c 1410 printLog(changed,showButtons);
TickTock 36:dbd39c315258 1411 break;
TickTock 41:8d4609ea7259 1412 case mainScreen:
TickTock 122:138a40892a4c 1413 mainDisplay(changed,showButtons);
TickTock 36:dbd39c315258 1414 break;
TickTock 36:dbd39c315258 1415 case brakeScreen:
TickTock 122:138a40892a4c 1416 braking(changed,showButtons);
TickTock 36:dbd39c315258 1417 break;
TickTock 41:8d4609ea7259 1418 case dteScreen:
TickTock 122:138a40892a4c 1419 dteDisplay(changed,showButtons,true);
TickTock 37:fea2c1d52c5f 1420 break;
TickTock 50:83d5864c64a0 1421 case effScreen:
TickTock 122:138a40892a4c 1422 dteDisplay(changed,showButtons,false);
TickTock 50:83d5864c64a0 1423 break;
TickTock 50:83d5864c64a0 1424 case monitorScreen:
TickTock 122:138a40892a4c 1425 printLast(changed,showButtons);
TickTock 36:dbd39c315258 1426 break;
TickTock 36:dbd39c315258 1427 case changedScreen:
TickTock 122:138a40892a4c 1428 printChanged(changed,showButtons);
TickTock 36:dbd39c315258 1429 break;
TickTock 36:dbd39c315258 1430 case cpScreen:
TickTock 122:138a40892a4c 1431 cpData(changed||showCP,showButtons);
TickTock 36:dbd39c315258 1432 break;
leafman 98:9f8bab96edff 1433 case configScreen:
TickTock 122:138a40892a4c 1434 config(changed,showButtons);
TickTock 36:dbd39c315258 1435 break;
TickTock 157:1a100a5ed06f 1436 case config2Screen:
TickTock 157:1a100a5ed06f 1437 config2(changed,showButtons);
TickTock 157:1a100a5ed06f 1438 break;
TickTock 38:155ec32c5e91 1439 case playbackScreen:
TickTock 122:138a40892a4c 1440 pbScreen(changed,showButtons);
TickTock 36:dbd39c315258 1441 break;
TickTock 36:dbd39c315258 1442 case dateScreen:
TickTock 122:138a40892a4c 1443 showDateTime(changed,showButtons);
TickTock 36:dbd39c315258 1444 break;
TickTock 44:6262a9fd1e56 1445 case cpHistScreen: // gg - hist
TickTock 122:138a40892a4c 1446 cpHistogram(changed||showCP,showButtons);
TickTock 44:6262a9fd1e56 1447 break;
TickTock 48:d1ce92104a1f 1448 case cpBarScreen: // gg - cpbars
TickTock 122:138a40892a4c 1449 cpBarPlot(changed||showCP,showButtons);
TickTock 48:d1ce92104a1f 1450 break;
garygid 67:2022fce701d0 1451 case indexScreen:
TickTock 122:138a40892a4c 1452 showIndex(changed,showButtons);
garygid 67:2022fce701d0 1453 break;
TickTock 107:e9be732c1ad4 1454 case tripScreen:
TickTock 168:9227024c4e3a 1455 tripDisplay(changed,showButtons,false);
TickTock 168:9227024c4e3a 1456 break;
TickTock 168:9227024c4e3a 1457 case ccTripScreen:
TickTock 168:9227024c4e3a 1458 tripDisplay(changed,showButtons,true);
TickTock 107:e9be732c1ad4 1459 break;
TickTock 118:02010b18efdc 1460 case healthScreen:
TickTock 122:138a40892a4c 1461 healthDisplay(changed,showButtons);
garygid 67:2022fce701d0 1462 break;
TickTock 150:ef46ce63345c 1463 case testScreen:
TickTock 150:ef46ce63345c 1464 testDisplay(changed,showButtons);
TickTock 148:6e3b9135fad2 1465 break;
TickTock 36:dbd39c315258 1466 default:
TickTock 43:e7f6f80590e3 1467 if (changed){
TickTock 43:e7f6f80590e3 1468 tt.background(Black);
TickTock 43:e7f6f80590e3 1469 tt.cls();
TickTock 43:e7f6f80590e3 1470 }
TickTock 36:dbd39c315258 1471 break;
TickTock 36:dbd39c315258 1472 }
TickTock 36:dbd39c315258 1473 lastDMode[display]=dMode[display];
TickTock 36:dbd39c315258 1474
TickTock 42:4533b13b297d 1475 if(display==whichTouched){
TickTock 42:4533b13b297d 1476 switch (sMode) {
TickTock 42:4533b13b297d 1477 case 1: // Select screens
garygid 54:6ce808d0995e 1478 showButton(0,tNavRow," <-Prev","",4,4); // gg - 4x4
garygid 67:2022fce701d0 1479 // col 1 see below
garygid 67:2022fce701d0 1480 showButton(2,tNavRow," Go To"," Index",4,4); // gg - index
garygid 54:6ce808d0995e 1481 showButton(3,tNavRow," Next->","",4,4); // gg - move next
TickTock 154:90ea16ca7475 1482 if (enableSound) {
TickTock 154:90ea16ca7475 1483 sprintf(sTemp1," Mute");
TickTock 154:90ea16ca7475 1484 } else {
TickTock 154:90ea16ca7475 1485 sprintf(sTemp1,"Un-Mute");
TickTock 154:90ea16ca7475 1486 }
garygid 67:2022fce701d0 1487 // col 1 in Nav row
TickTock 42:4533b13b297d 1488 switch (dMode[display]) {
TickTock 44:6262a9fd1e56 1489 case offScreen:
TickTock 154:90ea16ca7475 1490 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1491 sprintf(sTemp2," Off");
TickTock 42:4533b13b297d 1492 break;
TickTock 44:6262a9fd1e56 1493 case logScreen:
TickTock 154:90ea16ca7475 1494 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1495 sprintf(sTemp2," Log");
TickTock 42:4533b13b297d 1496 break;
TickTock 44:6262a9fd1e56 1497 case mainScreen:
TickTock 154:90ea16ca7475 1498 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1499 sprintf(sTemp2," Main");
TickTock 42:4533b13b297d 1500 break;
TickTock 44:6262a9fd1e56 1501 case brakeScreen:
TickTock 154:90ea16ca7475 1502 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1503 sprintf(sTemp2,"Braking");
TickTock 42:4533b13b297d 1504 break;
TickTock 44:6262a9fd1e56 1505 case dteScreen:
TickTock 154:90ea16ca7475 1506 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1507 sprintf(sTemp2," DTE");
TickTock 42:4533b13b297d 1508 break;
TickTock 50:83d5864c64a0 1509 case effScreen:
TickTock 154:90ea16ca7475 1510 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1511 sprintf(sTemp2," Eff");
TickTock 50:83d5864c64a0 1512 break;
TickTock 44:6262a9fd1e56 1513 case monitorScreen:
TickTock 154:90ea16ca7475 1514 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1515 sprintf(sTemp2," Monitor");
TickTock 42:4533b13b297d 1516 break;
TickTock 44:6262a9fd1e56 1517 case changedScreen:
TickTock 154:90ea16ca7475 1518 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1519 sprintf(sTemp2,"DeltaMon");
TickTock 42:4533b13b297d 1520 break;
TickTock 44:6262a9fd1e56 1521 case cpScreen:
TickTock 154:90ea16ca7475 1522 showButton(3,0,sTemp1,"",4,4);
garygid 67:2022fce701d0 1523 sprintf(sTemp2,"CP Data");
TickTock 42:4533b13b297d 1524 break;
leafman 98:9f8bab96edff 1525 case configScreen:
garygid 54:6ce808d0995e 1526 sprintf(sTemp2," Config");
leafman 98:9f8bab96edff 1527 break;
TickTock 157:1a100a5ed06f 1528 case config2Screen:
TickTock 157:1a100a5ed06f 1529 sprintf(sTemp2,"Config2");
TickTock 157:1a100a5ed06f 1530 break;
TickTock 44:6262a9fd1e56 1531 case playbackScreen:
TickTock 154:90ea16ca7475 1532 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1533 sprintf(sTemp2,"Playback");
TickTock 42:4533b13b297d 1534 break;
TickTock 44:6262a9fd1e56 1535 case dateScreen:
TickTock 154:90ea16ca7475 1536 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1537 sprintf(sTemp2,"Set Time");
TickTock 42:4533b13b297d 1538 break;
TickTock 44:6262a9fd1e56 1539 case cpHistScreen: // gg - hist
TickTock 154:90ea16ca7475 1540 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1541 sprintf(sTemp2,"CP Hist");
TickTock 44:6262a9fd1e56 1542 break;
TickTock 48:d1ce92104a1f 1543 case cpBarScreen: // gg - cpbars
TickTock 154:90ea16ca7475 1544 showButton(3,0,sTemp1,"",4,4);
garygid 54:6ce808d0995e 1545 sprintf(sTemp2,"CP Bars");
TickTock 48:d1ce92104a1f 1546 break;
TickTock 107:e9be732c1ad4 1547 case tripScreen:
TickTock 154:90ea16ca7475 1548 showButton(3,0,sTemp1,"",4,4);
TickTock 107:e9be732c1ad4 1549 sprintf(sTemp2," Trip");
TickTock 107:e9be732c1ad4 1550 break;
TickTock 118:02010b18efdc 1551 case healthScreen:
TickTock 154:90ea16ca7475 1552 showButton(3,0,sTemp1,"",4,4);
TickTock 118:02010b18efdc 1553 sprintf(sTemp2,"Health");
TickTock 118:02010b18efdc 1554 break;
TickTock 150:ef46ce63345c 1555 case testScreen:
TickTock 150:ef46ce63345c 1556 sprintf(sTemp2," Test");
TickTock 150:ef46ce63345c 1557 break;
garygid 67:2022fce701d0 1558 case indexScreen: // gg - index
garygid 67:2022fce701d0 1559 sprintf(sTemp2," Index");
garygid 67:2022fce701d0 1560 break;
TickTock 42:4533b13b297d 1561 }
garygid 54:6ce808d0995e 1562 showButton(1,tNavRow," Select",sTemp2,4,4);
garygid 54:6ce808d0995e 1563
TickTock 42:4533b13b297d 1564 wait_ms(100); // pause a moment to reduce flicker
TickTock 42:4533b13b297d 1565 break;
garygid 54:6ce808d0995e 1566
TickTock 42:4533b13b297d 1567 case 2: // numpad
TickTock 151:3047ebb3c9a8 1568 showButton(0,0," 1","",4,4);
TickTock 151:3047ebb3c9a8 1569 showButton(1,0," 2","",4,4);
TickTock 151:3047ebb3c9a8 1570 showButton(2,0," 3","",4,4);
TickTock 151:3047ebb3c9a8 1571 showButton(0,1," 4","",4,4);
TickTock 151:3047ebb3c9a8 1572 showButton(1,1," 5","",4,4);
TickTock 151:3047ebb3c9a8 1573 showButton(2,1," 6","",4,4);
TickTock 151:3047ebb3c9a8 1574 showButton(0,2," 7","",4,4);
TickTock 151:3047ebb3c9a8 1575 showButton(1,2," 8","",4,4);
TickTock 151:3047ebb3c9a8 1576 showButton(2,2," 9","",4,4);
TickTock 151:3047ebb3c9a8 1577 showButton(1,3," 0","",4,4);
garygid 54:6ce808d0995e 1578
TickTock 151:3047ebb3c9a8 1579 showButton(0,3,"<--","",4,4);
TickTock 151:3047ebb3c9a8 1580 showButton(2,3,"-->","",4,4);
TickTock 151:3047ebb3c9a8 1581 showButton(3,3,"return","",4,4);
TickTock 42:4533b13b297d 1582 case 3:
TickTock 42:4533b13b297d 1583 break;
TickTock 42:4533b13b297d 1584 default:
TickTock 42:4533b13b297d 1585 break;
TickTock 42:4533b13b297d 1586 }
TickTock 36:dbd39c315258 1587 }
TickTock 121:553faf139a20 1588 tock=false;
TickTock 121:553faf139a20 1589 } // updateDisplay
TickTock 36:dbd39c315258 1590
garygid 58:4d06288d75a2 1591 //---------------------
garygid 58:4d06288d75a2 1592 // gg - highlight
TickTock 62:ffd15edb5431 1593 void highlightButton(unsigned char column, unsigned char row, unsigned char tScn, unsigned char columns, unsigned char rows){
TickTock 62:ffd15edb5431 1594
garygid 58:4d06288d75a2 1595 unsigned short x1,x2,y1,y2;
garygid 58:4d06288d75a2 1596
garygid 58:4d06288d75a2 1597 x1=column*(320/columns)+btnGap/2;
garygid 58:4d06288d75a2 1598 x2=(column+1)*(320/columns)-btnGap/2;
garygid 58:4d06288d75a2 1599 y1=row*(240/rows)+btnGap/2;
garygid 58:4d06288d75a2 1600 y2=(row+1)*(240/rows)-btnGap/2;
garygid 65:821fc79cd7fe 1601
garygid 65:821fc79cd7fe 1602 tt.set_display(tScn);
garygid 65:821fc79cd7fe 1603
garygid 65:821fc79cd7fe 1604 if( skin == ggSkin ){
garygid 65:821fc79cd7fe 1605 // paint the whole button box, for a better visual effect
garygid 65:821fc79cd7fe 1606 // especially on a screen with a yellow background
garygid 65:821fc79cd7fe 1607 if( tScn == 0 )
garygid 65:821fc79cd7fe 1608 tt.fillrect(x1,y1,x2,y2,White); // DarkCyan);
garygid 65:821fc79cd7fe 1609 else
garygid 65:821fc79cd7fe 1610 tt.fillrect(x1,y1,x2,y2,Green); // DarkCyan);
TickTock 66:b7476ce7a59e 1611 } else {
TickTock 66:b7476ce7a59e 1612 tt.fillrect(x1,y1,x2,y2,Green); // DarkCyan);
garygid 65:821fc79cd7fe 1613 }
garygid 58:4d06288d75a2 1614
garygid 58:4d06288d75a2 1615 // paint the outer pixel as a yellow frame
garygid 58:4d06288d75a2 1616 tt.rect(x1,y1,x2,y2,Yellow) ; // DarkCyan);
garygid 58:4d06288d75a2 1617 }
garygid 58:4d06288d75a2 1618
garygid 58:4d06288d75a2 1619 //---------------------
TickTock 36:dbd39c315258 1620 void showButton(unsigned char column, unsigned char row, char * text1, char * text2, unsigned char columns, unsigned char rows){
TickTock 36:dbd39c315258 1621 unsigned short x1,x2,y1,y2;
garygid 54:6ce808d0995e 1622
TickTock 36:dbd39c315258 1623 x1=column*(320/columns)+btnGap/2;
TickTock 36:dbd39c315258 1624 x2=(column+1)*(320/columns)-btnGap/2;
TickTock 36:dbd39c315258 1625 y1=row*(240/rows)+btnGap/2;
TickTock 36:dbd39c315258 1626 y2=(row+1)*(240/rows)-btnGap/2;
TickTock 36:dbd39c315258 1627 tt.fillrect(x1,y1,x2,y2,DarkCyan);
TickTock 151:3047ebb3c9a8 1628
TickTock 151:3047ebb3c9a8 1629 tt.foreground(Yellow);
TickTock 151:3047ebb3c9a8 1630 tt.background(DarkCyan);
TickTock 151:3047ebb3c9a8 1631 tt.set_font((unsigned char*) Arial12x12);
garygid 54:6ce808d0995e 1632
garygid 54:6ce808d0995e 1633 // adapt formatting of text to the smaller 4x4 box
garygid 54:6ce808d0995e 1634 tt.locate(x1+btnGap/2,y1+btnGap); // gg - 4x4
TickTock 36:dbd39c315258 1635 printf("%s\n",text1);
garygid 54:6ce808d0995e 1636
garygid 54:6ce808d0995e 1637 tt.locate(x1+btnGap/2,y1+btnGap+20);
TickTock 36:dbd39c315258 1638 printf("%s\n",text2);
TickTock 36:dbd39c315258 1639 }
garygid 54:6ce808d0995e 1640
TickTock 13:62e0f7f39ff5 1641
leafman 98:9f8bab96edff 1642 //The temps are stored as metric, distances as imperial... I'm assuming the input based on that - LM
TickTock 148:6e3b9135fad2 1643 float convertC(float input)
leafman 98:9f8bab96edff 1644 {
leafman 98:9f8bab96edff 1645 if (!metric) {
TickTock 150:ef46ce63345c 1646 //convert!
leafman 98:9f8bab96edff 1647 float output = input *1.8f;
leafman 98:9f8bab96edff 1648 output += 32.0f;
leafman 98:9f8bab96edff 1649 return output;
TickTock 23:cd03f9c3395e 1650 }
leafman 98:9f8bab96edff 1651 return input;
leafman 98:9f8bab96edff 1652 }
TickTock 148:6e3b9135fad2 1653
TickTock 148:6e3b9135fad2 1654 float convertF(float input)
TickTock 148:6e3b9135fad2 1655 {
TickTock 148:6e3b9135fad2 1656 if (metric) {
TickTock 150:ef46ce63345c 1657 //convert!
TickTock 148:6e3b9135fad2 1658 float output = input -32.0f;
TickTock 148:6e3b9135fad2 1659 output /= 1.8f;
TickTock 148:6e3b9135fad2 1660 return output;
TickTock 148:6e3b9135fad2 1661 }
TickTock 148:6e3b9135fad2 1662 return input;
TickTock 148:6e3b9135fad2 1663 }
leafman 98:9f8bab96edff 1664 float convertDistance(float input)
leafman 98:9f8bab96edff 1665 {
leafman 98:9f8bab96edff 1666 if (metric) {
leafman 98:9f8bab96edff 1667 return input / 0.62137f;
TickTock 13:62e0f7f39ff5 1668 }
leafman 98:9f8bab96edff 1669 return input;
leafman 98:9f8bab96edff 1670 }
leafman 98:9f8bab96edff 1671 char* distanceUnit()
leafman 98:9f8bab96edff 1672 {
leafman 98:9f8bab96edff 1673 if(metric)
leafman 98:9f8bab96edff 1674 return "km";
leafman 98:9f8bab96edff 1675 return "mi";
leafman 98:9f8bab96edff 1676 }
leafman 98:9f8bab96edff 1677 char* temperatureUnit()
leafman 98:9f8bab96edff 1678 {
leafman 98:9f8bab96edff 1679 if(metric)
leafman 98:9f8bab96edff 1680 return "C";
leafman 98:9f8bab96edff 1681 return "F";
leafman 98:9f8bab96edff 1682 }