Dual CANbus monitor and instrumentation cluster. Presently tuned for the Nissan Leaf EV.

Dependencies:   SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2_ILI9341 mbed

Fork of CANary_corrupt by Tick Tock

After adding the LPC1768 platform, import as a program and do not select the "update to latest revision" box

User Guide

Eagle Schematic and Board design

/media/uploads/TickTock/canaryr6.zip

/media/uploads/TickTock/canary_sch.jpg

/media/uploads/TickTock/canaryr6brd.jpg

For LCD Rev 1.01:

/media/uploads/TickTock/lcdsch.jpg

For VCD Rev 2.00:

/media/uploads/TickTock/lcdr2.jpg

Parts List

qtyinstancepart #packagesupplierDescription
1BAT3Vhttp://www.ebay.com/itm/10x-CR2032-SMD-Battery-Holder-for-CR2032-Battery-/180938057979?pt=LH_DefaultDomain_0&hash=item2a20bfa8fbLithium 2032 coin battery holder
4C1-C4ECST1DC106R6032Tantalium capacitor 10uF
3FC1-FC3ZF1-20-01-T-WThttp://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx20 conductor 1mm pitch flex cable connector (optional)
1FJ-20-R-08.00-4http://www.samtec.com/cable-systems/idc-ffc/ffc/zero-insertion.aspx8\" 20 conductor 1mm pitch flex connector, end reversed (optional)
2H1-H4(DON'T populate H1-H4 headers - solder mbed directly)
1H5http://www.ebay.com/itm/221186042943?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26491x12 .1\" pitch header (optional)
1H62x6 .1\" pitch header (optional)
2IC1,IC2VP230LMDSOP8http://www.ebay.com/itm/130488665247?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649canbus transciever
1IC3LM1117-5VSOT2235V regulator
5JP*2 pin .1\" jumper header
1mbedLPC1768http://www.ebay.com/itm/200830573509?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649mbed uC
2Q1,Q22N2222SOT23General purpose NPN transistor
1R1R393M120639K resistor
1R2R103M120610K resistor
4R4-R6R102M12061K resistor
1R3R500M120650 Ohm resistor
2TR1-TR5ZJYS81R5-2PL51TG01http://www.digikey.com/product-detail/en/ZJYS81R5-2PL51T-G01/445-2223-1-ND/765232CM Choke
1Z11N5340BGC1702-15http://www.ebay.com/itm/150878122425?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l26496V, 5W Zener Diode
1Z1DC-DC conveterhttp://www.ebay.com/itm/251142727849?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l264912V-7V, 3W DC-DC converter
1X1USBhttp://www.ebay.com/itm/New-Vertical-USB-2-0-A-pcb-connector-socket-USB-A-Type-/300553895292?pt=LH_DefaultDomain_0&hash=item45fa687d7cvertical USB connector
2LCD0,LCD1TFThttp://www.mikroe.com/add-on-boards/display/tft-proto/320x240 LCD with touch screen
1E0Enclosurehttp://www.shapeways.com/model/1077799/canary.html?li=user-profile&materialId=63d printed enclosure

Assembly

1) LCD Displays

I found ribbon cable is a nice way to organize the wires to the displays. There are two versions of the display and each must be wired differently. The original project used HW REV. 1.01. For that version, you'll need 12 conductors and I connected them in the following order:

1LED+
2LED-
3RST
4SDI
5WR/SCLK
6CS
7X+
8X-
9Y+
10Y-
11VDD
12GND

If, instead, you have HW REV 2.0, you will need 13 conductors with the following order:

1LED+
2LED-
3RST
4SDI
5RS (SCLK)
6WR (DC)
7CS
8X+
9X-
10Y+
11Y-
12VDD
13GND

First I connected all the GND connections (2 GND & IM0, IM1, IM3 for REV1.01 or 2 GND, RD, & IM0 for REV2.00). Do not connect the bottom GND until you have the ribbon cable connected. After making all the ribbon cable connections (connecting the GND of the ribbon cable to the bottom GND pad), solder the GND bar from the previous step to the back of the bottom GND connection. Finally, make a connection from the back side 3.3V pin to IM2 for REV1.01 or to IM1,IM2,&IM3 for REV2.00. Take a break and repeat for the second display.

Examples of REV1.01 boards:

/media/uploads/TickTock/lcdtop.jpg /media/uploads/TickTock/lcdbot.jpg

Examples of REV2.00:

/media/uploads/TickTock/rev2front.jpg /media/uploads/TickTock/rev2back.jpg

Once the two displays are complete combine all wires except CS0, CS1, X+, X-, Y+, and Y-. Connect X- of the left display to X+ of the right. Similarly connect Y- of the left display to Y+ of the right. Insulate any exposed wires.

2) PCB

Refer to the schematics to place all the components on the board. If you plan to install into the CANary 3D enclosure, DO NOT install the battery holder or the socket for the mbed and, instead, connect two wires to the VB and GND pads nearby. You will have to install the battery holder against the back wall to avoid interfering with the right-hand display and the mbed will have to be directly soldered. I have not found a socket with a low enough profile to fit in the space provided (depth of enclosure is limited by the space behind the center console). Also, I recommend keeping as much lead as possible on the Zener diode (bending it as shown to clear the back wall). Although it is operating well within parameters, the Zener gets quite hot during extended operation and the leads help dissipate the heat and keep it away from the PCB and other components.Update: Several Zeners have failed resulting in damage to some users boards so I recommend using a DC-DC converter instead to bring the 12V down to 7V.

/media/uploads/TickTock/pcbtop.jpg /media/uploads/TickTock/pcbbot.jpg

Once the PCB is populated, solder the LCDs to the PCB. CS0 connects to the right display and CS1 connects to the left. /media/uploads/TickTock/brddis.jpg

Update: The Zener diodes tended to fail after a few months so I am recommending removing them and replacing with a DC-DC converter. This will run cooler and waste less energy, too. To install, remove the left display panel to gain access to the Zener. From there, the Zener can be removed and it's pads used to connect to the DC-DC converter. I recommend setting the output voltage on the bench before installing since the trim pot is tricky to reach once installed. Set it to 7V. The input can be connected to the left pad previously occupied by the zener and the output can connect to the right. GND(-) can be connected to the bottom right pad on the 2x6 header below the flex cable connector. Make sure the GND wire lies flat so it doesn't interfere with the connection of the flex cable. /media/uploads/TickTock/dcdcinst2.jpg

Once soldered in place, the DC-DC converter can easily be mounted to the back wall with double sided tape above the battery holder. /media/uploads/TickTock/dcdcinst3.jpg

3) Testing

1)First step is to buzz out all connections from the LCDs to the pins in the main board
2)Next check the touch screen connections. On the main board, place an Ohm meter across X+ and X-. You should read 700 Ohms. Repeat for Y+ and Y-. Then test the resistance from X+ to Y+. With nothing touching the screens, it should read >100K Ohms and <1K when touching either screen.
3)When all connections are checked, solder in the mbed. Download and install the touch2 program http://mbed.org/users/TickTock/code/touch2/ to test the basic operation of the mbed and touch screens.
tips:
Touch screen is sensitive - excess flux on X+,X-,Y+,Y- connection on mbed can result in flakey operation
If touch is not working, double-check the LCD0_CS and LCD1_CS are not swapped. LCD0_CS must connect to the CS of the LCD that has X- & Y- connected to the mbed. LCD1_CS must connect to the CS of the LCD that has X+ & Y+ connected to the mbed.
4)Once touch2 works, it is time to connect to the OBD connector. I highly recommend double checking all connections from the OBD to the PCB with the cable in place before connecting to the Leaf. Buzz out all the pins in the OBS to make sure none are shorting to each other, Check that the 12V goes to the Zener (and nothing else) and the switched 12V to the resistor divider (and nothing else). Test the ground connection properly connects to ground and nothing else.
5)Once you are confident there are no shorts or wrong connections from the OBD connector, take a deep breath and plug it into your leaf. Touch2 program should come up and function. Unplug and install the latest CANary firmware. If you have the REV2.00 LCD boards, you will need to edit the precompile.h file in the TOUCH_TFTx2_w9341 library and set USE_ILI9341 to 1. Test all features before installing into the enclosure (gids, cellpair, menu system, logging) since installing and removing from the enclosure is a PITA.

/media/uploads/TickTock/pcbdone.jpg /media/uploads/TickTock/functioning.jpg

4) Enclosure

The 3D printer leaves a lot of powder behind - I used a strong spray of water to get it out of all the cracks. The enclosure comes with a rather rough finish. I recommend convincing yourself you like it, then simply lightly sand then paint before assembly. Sanding is very difficult - the nylon is very nicely fused and doesn't want to sand. I tried sandblasting and that didn't work either. I had some limited success with filler and then sanding, but only on the outside - it is too difficult to sand the face. /media/uploads/TickTock/enclosure.jpg

5) Final Assembly

Make sure you are well rested with lots of patience before attempting assembly. It is a puzzle figuring out how to get both displays and the PCB in place. Enclosure was too expensive for me to keep iterating to optimize for assembly. I ended up snipping the thin display posts shorter and using various tools to push the displays into place. Also, some USB connectors are taller than others. If you have one of the taller ones, you will have to deflect the back wall a bit while inserting the PCB (being careful not to bend the housing) to get it to it's opening in the back wall. Do use a screw in the provided post to secure the PCB as USB insertion will otherwise dislodge it.

I added an additional safety line which wraps around the center post to prevent the enclosure from becoming a projectile in the event of an accident. /media/uploads/TickTock/safety.jpg Installed: /media/uploads/TickTock/installed.jpg

Committer:
TickTock
Date:
Sat Oct 19 15:38:44 2013 +0000
Revision:
155:f31006516956
Parent:
154:90ea16ca7475
Child:
156:4e5d30535cf9
// Added workaround to  spkr and dled pwn not being independently controlled in hw; // Added ambient temperature to trip log; // Save Resr in history file so it doesn't reset to 75mOhms on CANary reset; // Fixed Reser formatting to %4.3f;

Who changed what in which revision?

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