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

Dependencies:   SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2_ILI9341 mbed

Fork of CANary_corrupt by Tick Tock

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

User Guide

Eagle Schematic and Board design

/media/uploads/TickTock/canaryr6.zip

/media/uploads/TickTock/canary_sch.jpg

/media/uploads/TickTock/canaryr6brd.jpg

For LCD Rev 1.01:

/media/uploads/TickTock/lcdsch.jpg

For VCD Rev 2.00:

/media/uploads/TickTock/lcdr2.jpg

Parts List

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

Assembly

1) LCD Displays

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

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

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

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

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

Examples of REV1.01 boards:

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

Examples of REV2.00:

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

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

2) PCB

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

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

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

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

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

3) Testing

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

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

4) Enclosure

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

5) Final Assembly

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

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

Committer:
TickTock
Date:
Wed Oct 30 03:16:51 2013 +0000
Revision:
157:1a100a5ed06f
Parent:
156:4e5d30535cf9
Child:
158:059abeb44ba1
// Added trip max/min efficiency reset; // Added second config screen and RegenMon enable/disable

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