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

Dependencies:   SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2_ILI9341 mbed

Fork of CANary_corrupt by Tick Tock

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

User Guide

Eagle Schematic and Board design

/media/uploads/TickTock/canaryr6.zip

/media/uploads/TickTock/canary_sch.jpg

/media/uploads/TickTock/canaryr6brd.jpg

For LCD Rev 1.01:

/media/uploads/TickTock/lcdsch.jpg

For VCD Rev 2.00:

/media/uploads/TickTock/lcdr2.jpg

Parts List

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

Assembly

1) LCD Displays

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

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

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

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

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

Examples of REV1.01 boards:

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

Examples of REV2.00:

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

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

2) PCB

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

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

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

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

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

3) Testing

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

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

4) Enclosure

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

5) Final Assembly

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

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

Committer:
TickTock
Date:
Tue Apr 02 06:32:25 2013 +0000
Revision:
43:e7f6f80590e3
Parent:
42:4533b13b297d
Child:
44:6262a9fd1e56
Fixed bench button display bugs

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 printLast (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 8 CANMessage msg;
TickTock 13:62e0f7f39ff5 9 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 10 tt.foreground(Red);
TickTock 13:62e0f7f39ff5 11 tt.background(Yellow);
TickTock 13:62e0f7f39ff5 12 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 13:62e0f7f39ff5 13 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 13:62e0f7f39ff5 14 for(int i=0; i<19; i++){
TickTock 13:62e0f7f39ff5 15 msg = lastMsg[i+indexOffset];
TickTock 13:62e0f7f39ff5 16 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 17 }
TickTock 42:4533b13b297d 18 if((sMode==1)&&showButtons){
TickTock 25:ddf0ec209f03 19 tt.foreground(Yellow);
TickTock 25:ddf0ec209f03 20 tt.background(DarkCyan);
TickTock 25:ddf0ec209f03 21 tt.set_font((unsigned char*) Arial12x12);
TickTock 25:ddf0ec209f03 22 sprintf(sTemp1,"<up>");
TickTock 25:ddf0ec209f03 23 sprintf(sTemp2,"");
TickTock 25:ddf0ec209f03 24 showButton(0,0,sTemp1,sTemp2,3,3);
TickTock 25:ddf0ec209f03 25 sprintf(sTemp1,"<down>");
TickTock 25:ddf0ec209f03 26 showButton(2,0,sTemp1,sTemp2,3,3);
TickTock 25:ddf0ec209f03 27 }
TickTock 13:62e0f7f39ff5 28 }
TickTock 13:62e0f7f39ff5 29
TickTock 42:4533b13b297d 30 void printChanged (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 31 CANMessage msg;
TickTock 13:62e0f7f39ff5 32 unsigned char i,j;
TickTock 13:62e0f7f39ff5 33 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 34 tt.foreground(Red);
TickTock 13:62e0f7f39ff5 35 tt.background(Yellow);
TickTock 13:62e0f7f39ff5 36 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 13:62e0f7f39ff5 37 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 13:62e0f7f39ff5 38 i=0;
TickTock 13:62e0f7f39ff5 39 j=indexOffset;
TickTock 13:62e0f7f39ff5 40 do{
TickTock 13:62e0f7f39ff5 41 j=j<99?j+1:j;
TickTock 13:62e0f7f39ff5 42 if(msgChanged[j]>0){
TickTock 13:62e0f7f39ff5 43 msg = lastMsg[j];
TickTock 13:62e0f7f39ff5 44 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 45 i++;
TickTock 13:62e0f7f39ff5 46 }// if changed
TickTock 13:62e0f7f39ff5 47 }while(i<19&&j<99);
TickTock 42:4533b13b297d 48 if((sMode==1)&&showButtons){
TickTock 40:0e6e71a7323f 49 tt.foreground(Yellow);
TickTock 40:0e6e71a7323f 50 tt.background(DarkCyan);
TickTock 40:0e6e71a7323f 51 tt.set_font((unsigned char*) Arial12x12);
TickTock 40:0e6e71a7323f 52 sprintf(sTemp1,"<up>");
TickTock 40:0e6e71a7323f 53 sprintf(sTemp2,"");
TickTock 40:0e6e71a7323f 54 showButton(0,0,sTemp1,sTemp2,3,3);
TickTock 40:0e6e71a7323f 55 sprintf(sTemp1,"Reset");
TickTock 40:0e6e71a7323f 56 showButton(1,0,sTemp1,sTemp2,3,3);
TickTock 40:0e6e71a7323f 57 sprintf(sTemp1,"<down>");
TickTock 40:0e6e71a7323f 58 showButton(2,0,sTemp1,sTemp2,3,3);
TickTock 40:0e6e71a7323f 59 }
TickTock 13:62e0f7f39ff5 60 }
TickTock 13:62e0f7f39ff5 61
TickTock 42:4533b13b297d 62 void printLog (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 63 static unsigned char lastDisplayLoc = 0;
TickTock 13:62e0f7f39ff5 64 if(force||displayLoc!=lastDisplayLoc){ //only update if changed
TickTock 13:62e0f7f39ff5 65 tt.foreground(Amber);
TickTock 13:62e0f7f39ff5 66 tt.background(Black);
TickTock 13:62e0f7f39ff5 67 tt.cls();
TickTock 13:62e0f7f39ff5 68 tt.locate(0,6);
TickTock 13:62e0f7f39ff5 69 tt.set_font((unsigned char*) Arial12x12);
TickTock 13:62e0f7f39ff5 70 for(int i=0; i<19; i++){
TickTock 13:62e0f7f39ff5 71 printf("%s",displayLog[displayLoc]);
TickTock 13:62e0f7f39ff5 72 displayLoc=displayLoc>17?0:displayLoc+1;
TickTock 13:62e0f7f39ff5 73 }
TickTock 13:62e0f7f39ff5 74 }
TickTock 13:62e0f7f39ff5 75 lastDisplayLoc=displayLoc;
TickTock 13:62e0f7f39ff5 76 }
TickTock 13:62e0f7f39ff5 77
TickTock 42:4533b13b297d 78 void mainDisplay (bool force, bool showButtons){
TickTock 13:62e0f7f39ff5 79 unsigned short gids, SOC, packV;
TickTock 13:62e0f7f39ff5 80 static unsigned short lgids=0, lSOC=0, lpackV=0;
TickTock 39:eef8beac7411 81 static float lmpkWh=0, laccV=0;;
TickTock 13:62e0f7f39ff5 82 CANMessage msg;
TickTock 13:62e0f7f39ff5 83
TickTock 13:62e0f7f39ff5 84 msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
TickTock 13:62e0f7f39ff5 85 gids = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 13:62e0f7f39ff5 86 msg = lastMsg[indexLastMsg[0x55b]]; //Get SOC
TickTock 13:62e0f7f39ff5 87 SOC = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 13:62e0f7f39ff5 88 msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts
TickTock 13:62e0f7f39ff5 89 packV = (msg.data[2]<<2)+(msg.data[3]>>6);
TickTock 13:62e0f7f39ff5 90
TickTock 13:62e0f7f39ff5 91 tt.background(Navy);
TickTock 38:155ec32c5e91 92 tt.foreground(Yellow);
TickTock 38:155ec32c5e91 93 tt.set_font((unsigned char*) Arial28x28);
TickTock 13:62e0f7f39ff5 94 if(force) tt.cls();
TickTock 13:62e0f7f39ff5 95 if(force||gids!=lgids){
TickTock 13:62e0f7f39ff5 96 tt.locate(10,10);
TickTock 13:62e0f7f39ff5 97 printf("%4d gids\n",gids);
TickTock 35:5acbd8a64a89 98 tt.locate(20,40);
TickTock 13:62e0f7f39ff5 99 printf("%4.1f kWh\n",(float)gids*0.08);
TickTock 13:62e0f7f39ff5 100 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 13:62e0f7f39ff5 101 tt.foreground(Green);
TickTock 13:62e0f7f39ff5 102 tt.locate(60,96);
TickTock 34:4751a8259b18 103 printf("%4.1f mi \n",(float)(gids-5)*0.31); // Approx for now
TickTock 13:62e0f7f39ff5 104 lgids=gids;
TickTock 38:155ec32c5e91 105 tt.foreground(Yellow);
TickTock 38:155ec32c5e91 106 tt.set_font((unsigned char*) Arial28x28);
TickTock 13:62e0f7f39ff5 107 }
TickTock 13:62e0f7f39ff5 108 if(force||SOC!=lSOC){
TickTock 13:62e0f7f39ff5 109 tt.locate(200,10);
TickTock 13:62e0f7f39ff5 110 printf("%4.1f%s\n",(float)SOC/10,"%");
TickTock 13:62e0f7f39ff5 111 lSOC=SOC;
TickTock 13:62e0f7f39ff5 112 }
TickTock 13:62e0f7f39ff5 113 if(force||packV!=lpackV){
TickTock 13:62e0f7f39ff5 114 tt.locate(200,200);
TickTock 37:fea2c1d52c5f 115 printf("%4.1fV \n",(float)packV/2);
TickTock 13:62e0f7f39ff5 116 lpackV=packV;
TickTock 13:62e0f7f39ff5 117 }
TickTock 39:eef8beac7411 118 if(force||accV!=laccV){
TickTock 35:5acbd8a64a89 119 tt.locate(20,200);
TickTock 40:0e6e71a7323f 120 printf("%3.1fV \n",accV);
TickTock 40:0e6e71a7323f 121 laccV=accV;
TickTock 38:155ec32c5e91 122 }
TickTock 38:155ec32c5e91 123 if(force||mpkWh!=lmpkWh){
TickTock 38:155ec32c5e91 124 tt.locate(180,40);
TickTock 38:155ec32c5e91 125 printf("%3.2fkW \n",mpkWh); //kW for now
TickTock 38:155ec32c5e91 126 lmpkWh=mpkWh;
TickTock 35:5acbd8a64a89 127 }
TickTock 13:62e0f7f39ff5 128 }
TickTock 13:62e0f7f39ff5 129
TickTock 42:4533b13b297d 130 void braking (bool force, bool showButtons, bool prdata=false){
TickTock 28:f24ac05645d9 131 unsigned long targetBraking, regenBraking;
TickTock 28:f24ac05645d9 132 static unsigned long maxTarget = 1000, maxRegen = 1000, tarDivReg = 1000;
TickTock 28:f24ac05645d9 133 unsigned long temp;
TickTock 28:f24ac05645d9 134 static unsigned char lastPressure[4] = {200,200,200,200};
TickTock 28:f24ac05645d9 135 unsigned char i,r,t;
TickTock 37:fea2c1d52c5f 136 static unsigned char lr=0, lt=0;
TickTock 37:fea2c1d52c5f 137 signed short steering;
TickTock 37:fea2c1d52c5f 138 unsigned short s;
TickTock 37:fea2c1d52c5f 139 static unsigned short ls;
TickTock 37:fea2c1d52c5f 140 unsigned char throttle;
TickTock 37:fea2c1d52c5f 141 static unsigned char lthrottle;
TickTock 28:f24ac05645d9 142 CANMessage msg;
TickTock 28:f24ac05645d9 143
TickTock 37:fea2c1d52c5f 144 msg = lastMsg[indexLastMsg[0x180]]; //Get Throttle position
TickTock 37:fea2c1d52c5f 145 throttle = msg.data[5];
TickTock 37:fea2c1d52c5f 146 msg = lastMsg[indexLastMsg[0x002]]; //Get Steering angle
TickTock 37:fea2c1d52c5f 147 steering = (msg.data[1]<<8)+msg.data[0];
TickTock 37:fea2c1d52c5f 148 s= (unsigned short) ((steering/10)+160)%310;
TickTock 28:f24ac05645d9 149 msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
TickTock 28:f24ac05645d9 150 regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
TickTock 28:f24ac05645d9 151 targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
TickTock 28:f24ac05645d9 152 if ((targetBraking>50)&&(regenBraking>50)){
TickTock 28:f24ac05645d9 153 temp = targetBraking;
TickTock 28:f24ac05645d9 154 temp *= 1000;
TickTock 28:f24ac05645d9 155 temp /= regenBraking;
TickTock 28:f24ac05645d9 156 if (temp<tarDivReg) tarDivReg=temp;
TickTock 28:f24ac05645d9 157 }
TickTock 28:f24ac05645d9 158 if (targetBraking>maxTarget) maxTarget=targetBraking;
TickTock 28:f24ac05645d9 159 if (regenBraking>maxRegen) maxRegen=regenBraking;
TickTock 28:f24ac05645d9 160
TickTock 28:f24ac05645d9 161 msg = lastMsg[indexLastMsg[0x1ca]]; //Get brake pressure
TickTock 28:f24ac05645d9 162 tt.background(Navy);
TickTock 28:f24ac05645d9 163 if (force) {
TickTock 28:f24ac05645d9 164 tt.cls();
TickTock 28:f24ac05645d9 165 tt.rect(0,111,170,239,White);
TickTock 28:f24ac05645d9 166 tt.line(0,207,170,207,White);
TickTock 28:f24ac05645d9 167 tt.line(0,175,170,175,White);
TickTock 28:f24ac05645d9 168 tt.line(0,143,170,143,White);
TickTock 28:f24ac05645d9 169 lastPressure[0] = 200;
TickTock 28:f24ac05645d9 170 lastPressure[1] = 200;
TickTock 28:f24ac05645d9 171 lastPressure[2] = 200;
TickTock 28:f24ac05645d9 172 lastPressure[3] = 200;
TickTock 28:f24ac05645d9 173 }
TickTock 37:fea2c1d52c5f 174
TickTock 37:fea2c1d52c5f 175 if (s!=ls){
TickTock 37:fea2c1d52c5f 176 tt.fillrect(ls,5,ls+9,14, Navy);
TickTock 37:fea2c1d52c5f 177 tt.fillrect(s,5,s+9,14, White);
TickTock 37:fea2c1d52c5f 178 //tt.foreground(Yellow);
TickTock 37:fea2c1d52c5f 179 //tt.set_font((unsigned char*) Arial28x28);
TickTock 37:fea2c1d52c5f 180 //tt.locate(10,40);
TickTock 37:fea2c1d52c5f 181 //printf("%d %d \n",s,ls);
TickTock 37:fea2c1d52c5f 182 ls=s;
TickTock 37:fea2c1d52c5f 183 }
TickTock 37:fea2c1d52c5f 184 if (throttle!=lthrottle){
TickTock 37:fea2c1d52c5f 185 if (throttle>239) throttle=239;
TickTock 37:fea2c1d52c5f 186 if(throttle<lthrottle){
TickTock 37:fea2c1d52c5f 187 tt.fillrect(280,239-lthrottle,310,239-throttle,Navy);
TickTock 37:fea2c1d52c5f 188 }else{
TickTock 37:fea2c1d52c5f 189 tt.fillrect(280,239-throttle,310,239,Yellow);
TickTock 37:fea2c1d52c5f 190 }
TickTock 37:fea2c1d52c5f 191 lthrottle=throttle;
TickTock 37:fea2c1d52c5f 192 }
TickTock 37:fea2c1d52c5f 193
TickTock 28:f24ac05645d9 194 // plot bar graph for each wheel pressure
TickTock 28:f24ac05645d9 195 for (i=0; i<4; i++){
TickTock 28:f24ac05645d9 196 if (msg.data[i]<239) {
TickTock 28:f24ac05645d9 197 if (msg.data[i]>lastPressure[i]){
TickTock 28:f24ac05645d9 198 tt.fillrect(10+40*i,239-msg.data[i],40+40*i,239,Red);
TickTock 28:f24ac05645d9 199 } else if (msg.data[i]<lastPressure[i]) {
TickTock 28:f24ac05645d9 200 tt.fillrect(10+40*i,238-lastPressure[i],40+40*i,238-msg.data[i],Navy);
TickTock 28:f24ac05645d9 201 }
TickTock 28:f24ac05645d9 202 lastPressure[i]=msg.data[i];
TickTock 28:f24ac05645d9 203 }
TickTock 28:f24ac05645d9 204 }
TickTock 28:f24ac05645d9 205
TickTock 28:f24ac05645d9 206 temp = targetBraking;
TickTock 28:f24ac05645d9 207 temp *=200;
TickTock 28:f24ac05645d9 208 temp /= maxTarget;
TickTock 28:f24ac05645d9 209 t = (char) temp;
TickTock 28:f24ac05645d9 210 if (t>200) t=200;
TickTock 28:f24ac05645d9 211 temp = regenBraking;
TickTock 28:f24ac05645d9 212 temp *= tarDivReg;
TickTock 28:f24ac05645d9 213 temp /= maxTarget;
TickTock 28:f24ac05645d9 214 temp /= 5;
TickTock 28:f24ac05645d9 215 r = (char) temp;
TickTock 28:f24ac05645d9 216 if (r>200) r=200;
TickTock 28:f24ac05645d9 217 if(lr!=r&&prdata){
TickTock 28:f24ac05645d9 218 tt.foreground(Yellow);
TickTock 28:f24ac05645d9 219 tt.set_font((unsigned char*) Arial28x28);
TickTock 28:f24ac05645d9 220 tt.locate(100,40);
TickTock 28:f24ac05645d9 221 printf("%d %d \n",regenBraking,maxRegen);
TickTock 28:f24ac05645d9 222 tt.locate(100,70);
TickTock 28:f24ac05645d9 223 printf("%3.1f (%3.1f%s) \n",(float)tarDivReg/10,(float)regenBraking*tarDivReg/targetBraking/10,"%");
TickTock 28:f24ac05645d9 224 }
TickTock 28:f24ac05645d9 225 if(lt!=t&&prdata){
TickTock 28:f24ac05645d9 226 tt.foreground(Yellow);
TickTock 28:f24ac05645d9 227 tt.set_font((unsigned char*) Arial28x28);
TickTock 28:f24ac05645d9 228 tt.locate(100,10);
TickTock 28:f24ac05645d9 229 printf("%d %d \n",targetBraking,maxTarget);
TickTock 28:f24ac05645d9 230 }
TickTock 28:f24ac05645d9 231 if (r>t) t=r; //Should never happen
TickTock 28:f24ac05645d9 232 if((lr!=r||lt!=t)&&!prdata){
TickTock 37:fea2c1d52c5f 233 tt.fillrect(190,10,260,239-t,Navy);
TickTock 37:fea2c1d52c5f 234 tt.fillrect(190,239-t,260,239-r,Red);
TickTock 37:fea2c1d52c5f 235 tt.fillrect(190,239-r,260,239,Green);
TickTock 28:f24ac05645d9 236 }
TickTock 28:f24ac05645d9 237 lt=t;
TickTock 28:f24ac05645d9 238 lr=r;
TickTock 28:f24ac05645d9 239 }
TickTock 28:f24ac05645d9 240
TickTock 42:4533b13b297d 241 void cpData(bool force, bool showButtons){
TickTock 36:dbd39c315258 242 short unsigned max, min, jv, i, bd;
TickTock 36:dbd39c315258 243 unsigned avg;
TickTock 36:dbd39c315258 244 if(force){
TickTock 36:dbd39c315258 245 tt.foreground(White);
TickTock 36:dbd39c315258 246 tt.background(Navy);
TickTock 36:dbd39c315258 247 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 36:dbd39c315258 248 max=0;
TickTock 36:dbd39c315258 249 min=9999;
TickTock 36:dbd39c315258 250 avg=0;
TickTock 36:dbd39c315258 251 for(i=0; i<96; i++){
TickTock 36:dbd39c315258 252 bd=(battData[i*2+3]<<8)+battData[i*2+4];
TickTock 36:dbd39c315258 253 avg+=bd;
TickTock 36:dbd39c315258 254 if(bd>max) max=bd;
TickTock 36:dbd39c315258 255 if(bd<min) min=bd;
TickTock 36:dbd39c315258 256 }
TickTock 36:dbd39c315258 257 avg /= 96;
TickTock 36:dbd39c315258 258 if(min<3713) {
TickTock 36:dbd39c315258 259 jv=avg-(max-avg)*1.5;
TickTock 36:dbd39c315258 260 } else { // Only compute judgement value if min cellpair meets <= 3712mV requirement
TickTock 36:dbd39c315258 261 jv=0;
TickTock 36:dbd39c315258 262 }
TickTock 36:dbd39c315258 263 tt.cls();
TickTock 36:dbd39c315258 264 tt.locate(0,6);
TickTock 36:dbd39c315258 265 printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",max,min,avg,jv,battData[224+5],battData[224+8],battData[224+11],battData[224+14]);
TickTock 36:dbd39c315258 266 tt.locate(0,36);
TickTock 36:dbd39c315258 267 for(i=0; i<16; i++){
TickTock 36:dbd39c315258 268 printf("%02d-%02d : %04d %04d %04d %04d %04d %04d\n",i*6+1,i*6+6,(battData[i*12+3]<<8)+battData[i*12+4],(battData[i*12+5]<<8)+battData[i*12+6],(battData[i*12+7]<<8)+battData[i*12+8],(battData[i*12+9]<<8)+battData[i*12+10],(battData[i*12+11]<<8)+battData[i*12+12],(battData[i*12+13]<<8)+battData[i*12+14]);
TickTock 36:dbd39c315258 269 }
TickTock 36:dbd39c315258 270 tt.rect(8+0*41,16,40+0*41,28,Green);
TickTock 36:dbd39c315258 271 tt.rect(8+1*41,16,40+1*41,28,Yellow);
TickTock 36:dbd39c315258 272 //tt.rect(8+2*41,16,40+2*41,28,White);
TickTock 36:dbd39c315258 273 tt.rect(8+3*41,16,40+3*41,28,Red);
TickTock 36:dbd39c315258 274 for(i=0; i<96; i++){
TickTock 36:dbd39c315258 275 bd=(battData[i*2+3]<<8)+battData[i*2+4];
TickTock 36:dbd39c315258 276 if(bd>0){
TickTock 36:dbd39c315258 277 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 36:dbd39c315258 278 //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 36:dbd39c315258 279 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 36:dbd39c315258 280 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 36:dbd39c315258 281 }
TickTock 36:dbd39c315258 282 }
TickTock 36:dbd39c315258 283 showCP=false;
TickTock 36:dbd39c315258 284 }
TickTock 42:4533b13b297d 285 if((sMode==1)&&showButtons){
TickTock 36:dbd39c315258 286 tt.foreground(Yellow);
TickTock 36:dbd39c315258 287 tt.background(DarkCyan);
TickTock 36:dbd39c315258 288 tt.set_font((unsigned char*) Arial12x12);
TickTock 36:dbd39c315258 289 sprintf(sTemp1,"Request");
TickTock 36:dbd39c315258 290 sprintf(sTemp2,"CP data");
TickTock 36:dbd39c315258 291 showButton(1,0,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 292 }
TickTock 36:dbd39c315258 293 }
TickTock 36:dbd39c315258 294
TickTock 42:4533b13b297d 295 void config1(bool force, bool showButtons){
TickTock 36:dbd39c315258 296 if (force) {
TickTock 36:dbd39c315258 297 tt.background(Black);
TickTock 36:dbd39c315258 298 tt.cls();
TickTock 36:dbd39c315258 299 }
TickTock 36:dbd39c315258 300 tt.foreground(Yellow);
TickTock 36:dbd39c315258 301 tt.background(DarkCyan);
TickTock 36:dbd39c315258 302 tt.set_font((unsigned char*) Arial12x12);
TickTock 36:dbd39c315258 303 sprintf(sTemp1," Calibrate");
TickTock 36:dbd39c315258 304 sprintf(sTemp2," Touch");
TickTock 36:dbd39c315258 305 showButton(0,0,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 306 sprintf(sTemp1," Reset");
TickTock 36:dbd39c315258 307 sprintf(sTemp2,"");
TickTock 36:dbd39c315258 308 showButton(1,0,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 309 sprintf(sTemp1," Save");
TickTock 36:dbd39c315258 310 sprintf(sTemp2," Config");
TickTock 36:dbd39c315258 311 showButton(2,0,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 312 if (logEn) {
TickTock 36:dbd39c315258 313 sprintf(sTemp1," Disable");
TickTock 36:dbd39c315258 314 } else {
TickTock 36:dbd39c315258 315 sprintf(sTemp1," Enable");
TickTock 36:dbd39c315258 316 }
TickTock 36:dbd39c315258 317 sprintf(sTemp2," Logging");
TickTock 36:dbd39c315258 318 showButton(0,1,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 319 if (repeatPoll) {
TickTock 36:dbd39c315258 320 sprintf(sTemp1," Disable");
TickTock 36:dbd39c315258 321 } else {
TickTock 36:dbd39c315258 322 sprintf(sTemp1," Enable");
TickTock 36:dbd39c315258 323 }
TickTock 36:dbd39c315258 324 sprintf(sTemp2," Auto CP");
TickTock 36:dbd39c315258 325 showButton(1,1,sTemp1,sTemp2,3,3);
TickTock 43:e7f6f80590e3 326 //sprintf(sTemp1," Start");
TickTock 43:e7f6f80590e3 327 //sprintf(sTemp2,"Playback");
TickTock 43:e7f6f80590e3 328 //showButton(2,1,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 329 }
TickTock 36:dbd39c315258 330
TickTock 42:4533b13b297d 331 void pbScreen(bool force, bool showButtons){
TickTock 36:dbd39c315258 332 if (force) {
TickTock 36:dbd39c315258 333 tt.background(Black);
TickTock 36:dbd39c315258 334 tt.cls();
TickTock 36:dbd39c315258 335 }
TickTock 36:dbd39c315258 336 tt.foreground(Yellow);
TickTock 36:dbd39c315258 337 tt.background(DarkCyan);
TickTock 36:dbd39c315258 338 tt.set_font((unsigned char*) Arial12x12);
TickTock 36:dbd39c315258 339 if(playbackOpen){
TickTock 36:dbd39c315258 340 sprintf(sTemp1,"Slower");
TickTock 36:dbd39c315258 341 sprintf(sTemp2," <--");
TickTock 36:dbd39c315258 342 showButton(0,0,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 343 if(playbackEn){
TickTock 36:dbd39c315258 344 sprintf(sTemp1," Pause");
TickTock 36:dbd39c315258 345 }else{
TickTock 36:dbd39c315258 346 sprintf(sTemp1," Run");
TickTock 36:dbd39c315258 347 }
TickTock 36:dbd39c315258 348 sprintf(sTemp2," %4.3f ",playbackInt);
TickTock 36:dbd39c315258 349 showButton(1,0,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 350 sprintf(sTemp1,"Faster");
TickTock 36:dbd39c315258 351 sprintf(sTemp2," -->");
TickTock 36:dbd39c315258 352 showButton(2,0,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 353 }
TickTock 36:dbd39c315258 354 if(playbackOpen){
TickTock 36:dbd39c315258 355 sprintf(sTemp1," Stop");
TickTock 36:dbd39c315258 356 }else{
TickTock 36:dbd39c315258 357 sprintf(sTemp1," Start");
TickTock 36:dbd39c315258 358 }
TickTock 36:dbd39c315258 359 sprintf(sTemp2,"Playback");
TickTock 36:dbd39c315258 360 showButton(1,1,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 361 }
TickTock 36:dbd39c315258 362
TickTock 42:4533b13b297d 363 void showDateTime(bool force, bool showButtons){
TickTock 36:dbd39c315258 364 struct tm t; // pointer to a static tm structure
TickTock 36:dbd39c315258 365 time_t seconds ;
TickTock 36:dbd39c315258 366 tt.foreground(Yellow);
TickTock 36:dbd39c315258 367 tt.background(Navy);
TickTock 36:dbd39c315258 368 if (force) {
TickTock 36:dbd39c315258 369 tt.cls();
TickTock 36:dbd39c315258 370 seconds = time(NULL);
TickTock 36:dbd39c315258 371 t = *localtime(&seconds) ;
TickTock 36:dbd39c315258 372
TickTock 36:dbd39c315258 373 tt.locate(10,10);
TickTock 43:e7f6f80590e3 374 tt.foreground(Yellow);
TickTock 43:e7f6f80590e3 375 tt.background(DarkCyan);
TickTock 43:e7f6f80590e3 376 tt.set_font((unsigned char*) Arial12x12);
TickTock 36:dbd39c315258 377 strftime(sTemp1, 32, "%a %m/%d/%Y %X \n", &t);
TickTock 36:dbd39c315258 378 printf("%s",sTemp1);
TickTock 42:4533b13b297d 379 if((sMode==1)&&showButtons){
TickTock 36:dbd39c315258 380 sprintf(sTemp2,"");
TickTock 36:dbd39c315258 381 switch(dtMode){
TickTock 36:dbd39c315258 382 case 0:
TickTock 36:dbd39c315258 383 sprintf(sTemp1,"Year");
TickTock 36:dbd39c315258 384 break;
TickTock 36:dbd39c315258 385 case 1:
TickTock 36:dbd39c315258 386 sprintf(sTemp1,"Month");
TickTock 36:dbd39c315258 387 break;
TickTock 36:dbd39c315258 388 case 2:
TickTock 36:dbd39c315258 389 sprintf(sTemp1,"Day");
TickTock 36:dbd39c315258 390 break;
TickTock 36:dbd39c315258 391 case 3:
TickTock 36:dbd39c315258 392 sprintf(sTemp1,"Hour");
TickTock 36:dbd39c315258 393 break;
TickTock 36:dbd39c315258 394 case 4:
TickTock 36:dbd39c315258 395 sprintf(sTemp1,"Minute");
TickTock 36:dbd39c315258 396 break;
TickTock 36:dbd39c315258 397 case 5:
TickTock 36:dbd39c315258 398 sprintf(sTemp1,"Second");
TickTock 36:dbd39c315258 399 break;
TickTock 36:dbd39c315258 400 case 6:
TickTock 36:dbd39c315258 401 sprintf(sTemp1,"Select");
TickTock 36:dbd39c315258 402 break;
TickTock 36:dbd39c315258 403 default:
TickTock 36:dbd39c315258 404 break;
TickTock 36:dbd39c315258 405 }
TickTock 36:dbd39c315258 406 showButton(0,1,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 407 sprintf(sTemp1," UP");
TickTock 36:dbd39c315258 408 showButton(1,1,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 409 sprintf(sTemp1," DOWN");
TickTock 36:dbd39c315258 410 showButton(2,1,sTemp1,sTemp2,3,3);
TickTock 36:dbd39c315258 411 }
TickTock 36:dbd39c315258 412 }
TickTock 36:dbd39c315258 413 }
TickTock 36:dbd39c315258 414
TickTock 42:4533b13b297d 415 void dteDisplay(bool force, bool showButtons){
TickTock 41:8d4609ea7259 416 static float lmpkWh=0;
TickTock 41:8d4609ea7259 417 static float lMPH=0;
TickTock 37:fea2c1d52c5f 418 tt.background(Navy);
TickTock 37:fea2c1d52c5f 419 if(force) tt.cls();
TickTock 41:8d4609ea7259 420 if(force||mpkWh!=lmpkWh||MPH!=lMPH){
TickTock 37:fea2c1d52c5f 421 tt.foreground(Yellow);
TickTock 37:fea2c1d52c5f 422 tt.set_font((unsigned char*) Arial28x28);
TickTock 37:fea2c1d52c5f 423 tt.locate(10,200);
TickTock 43:e7f6f80590e3 424 printf("%3.1f \n",MPH);
TickTock 37:fea2c1d52c5f 425 tt.locate(200,200);
TickTock 43:e7f6f80590e3 426 printf("%3.1f \n",mpkWh);
TickTock 41:8d4609ea7259 427 lmpkWh=mpkWh;
TickTock 41:8d4609ea7259 428 lMPH=MPH;
TickTock 37:fea2c1d52c5f 429 }
TickTock 37:fea2c1d52c5f 430 }
TickTock 37:fea2c1d52c5f 431
TickTock 36:dbd39c315258 432 void updateDisplay(char display){
TickTock 36:dbd39c315258 433 bool changed;
TickTock 36:dbd39c315258 434 changed = dMode[display]!=lastDMode[display];
TickTock 36:dbd39c315258 435 tt.set_display(display);
TickTock 36:dbd39c315258 436 switch (dMode[display]) {
TickTock 36:dbd39c315258 437 case logScreen:
TickTock 42:4533b13b297d 438 printLog(changed,(display==whichTouched));
TickTock 36:dbd39c315258 439 break;
TickTock 41:8d4609ea7259 440 case mainScreen:
TickTock 42:4533b13b297d 441 mainDisplay(changed,(display==whichTouched));
TickTock 36:dbd39c315258 442 break;
TickTock 36:dbd39c315258 443 case brakeScreen:
TickTock 42:4533b13b297d 444 braking(changed,(display==whichTouched));
TickTock 36:dbd39c315258 445 break;
TickTock 41:8d4609ea7259 446 case dteScreen:
TickTock 42:4533b13b297d 447 dteDisplay(changed,(display==whichTouched));
TickTock 37:fea2c1d52c5f 448 break;
TickTock 36:dbd39c315258 449 case monitorScreen:
TickTock 42:4533b13b297d 450 printLast(changed,(display==whichTouched));
TickTock 36:dbd39c315258 451 break;
TickTock 36:dbd39c315258 452 case changedScreen:
TickTock 42:4533b13b297d 453 printChanged(changed,(display==whichTouched));
TickTock 36:dbd39c315258 454 break;
TickTock 36:dbd39c315258 455 case cpScreen:
TickTock 42:4533b13b297d 456 cpData(changed||showCP,(display==whichTouched));
TickTock 36:dbd39c315258 457 break;
TickTock 36:dbd39c315258 458 case config1Screen:
TickTock 42:4533b13b297d 459 config1(changed,(display==whichTouched));
TickTock 36:dbd39c315258 460 break;
TickTock 38:155ec32c5e91 461 case playbackScreen:
TickTock 42:4533b13b297d 462 pbScreen(changed,(display==whichTouched));
TickTock 36:dbd39c315258 463 break;
TickTock 36:dbd39c315258 464 case dateScreen:
TickTock 42:4533b13b297d 465 showDateTime(changed,(display==whichTouched));
TickTock 36:dbd39c315258 466 break;
TickTock 36:dbd39c315258 467 default:
TickTock 43:e7f6f80590e3 468 if (changed){
TickTock 43:e7f6f80590e3 469 tt.background(Black);
TickTock 43:e7f6f80590e3 470 tt.cls();
TickTock 43:e7f6f80590e3 471 }
TickTock 36:dbd39c315258 472 break;
TickTock 36:dbd39c315258 473 }
TickTock 36:dbd39c315258 474 lastDMode[display]=dMode[display];
TickTock 36:dbd39c315258 475
TickTock 42:4533b13b297d 476 if(display==whichTouched){
TickTock 42:4533b13b297d 477 switch (sMode) {
TickTock 42:4533b13b297d 478 case 1: // Select screens
TickTock 42:4533b13b297d 479 tt.foreground(Yellow);
TickTock 42:4533b13b297d 480 tt.background(DarkCyan);
TickTock 42:4533b13b297d 481 tt.set_font((unsigned char*) Arial12x12);
TickTock 42:4533b13b297d 482 sprintf(sTemp1,"<-Prev");
TickTock 42:4533b13b297d 483 sprintf(sTemp2,"");
TickTock 42:4533b13b297d 484 showButton(0,2,sTemp1,sTemp2,3,3);
TickTock 43:e7f6f80590e3 485 sprintf(sTemp1," Next->");
TickTock 42:4533b13b297d 486 showButton(2,2,sTemp1,sTemp2,3,3);
TickTock 43:e7f6f80590e3 487 sprintf(sTemp1," Select");
TickTock 42:4533b13b297d 488 switch (dMode[display]) {
TickTock 42:4533b13b297d 489 case 0:
TickTock 43:e7f6f80590e3 490 sprintf(sTemp2," Off");
TickTock 42:4533b13b297d 491 break;
TickTock 42:4533b13b297d 492 case 1:
TickTock 43:e7f6f80590e3 493 sprintf(sTemp2," Log");
TickTock 42:4533b13b297d 494 break;
TickTock 42:4533b13b297d 495 case 2:
TickTock 43:e7f6f80590e3 496 sprintf(sTemp2," Main");
TickTock 42:4533b13b297d 497 break;
TickTock 42:4533b13b297d 498 case 3:
TickTock 42:4533b13b297d 499 sprintf(sTemp2," Braking");
TickTock 42:4533b13b297d 500 break;
TickTock 42:4533b13b297d 501 case 4:
TickTock 43:e7f6f80590e3 502 sprintf(sTemp2," DTE");
TickTock 42:4533b13b297d 503 break;
TickTock 42:4533b13b297d 504 case 5:
TickTock 43:e7f6f80590e3 505 sprintf(sTemp2," Monitor");
TickTock 42:4533b13b297d 506 break;
TickTock 42:4533b13b297d 507 case 6:
TickTock 42:4533b13b297d 508 sprintf(sTemp2,"Delta Mon");
TickTock 42:4533b13b297d 509 break;
TickTock 42:4533b13b297d 510 case 7:
TickTock 43:e7f6f80590e3 511 sprintf(sTemp2," Cell Pair");
TickTock 42:4533b13b297d 512 break;
TickTock 42:4533b13b297d 513 case 8:
TickTock 43:e7f6f80590e3 514 sprintf(sTemp2," Config");
TickTock 42:4533b13b297d 515 break;
TickTock 42:4533b13b297d 516 case 9:
TickTock 43:e7f6f80590e3 517 sprintf(sTemp2," Playback");
TickTock 42:4533b13b297d 518 break;
TickTock 42:4533b13b297d 519 case 10:
TickTock 43:e7f6f80590e3 520 sprintf(sTemp2," Set Time");
TickTock 42:4533b13b297d 521 break;
TickTock 42:4533b13b297d 522 }
TickTock 42:4533b13b297d 523 showButton(1,2,sTemp1,sTemp2,3,3);
TickTock 42:4533b13b297d 524 wait_ms(100); // pause a moment to reduce flicker
TickTock 42:4533b13b297d 525 break;
TickTock 42:4533b13b297d 526 case 2: // numpad
TickTock 42:4533b13b297d 527 sprintf(sTemp2,"");
TickTock 42:4533b13b297d 528 tt.foreground(Yellow);
TickTock 42:4533b13b297d 529 tt.background(DarkCyan);
TickTock 42:4533b13b297d 530 tt.set_font((unsigned char*) Arial24x23);
TickTock 42:4533b13b297d 531 sprintf(sTemp1," 1");
TickTock 42:4533b13b297d 532 showButton(0,0,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 533 sprintf(sTemp1," 2");
TickTock 42:4533b13b297d 534 showButton(1,0,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 535 sprintf(sTemp1," 3");
TickTock 42:4533b13b297d 536 showButton(2,0,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 537 sprintf(sTemp1," 4");
TickTock 42:4533b13b297d 538 showButton(0,1,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 539 sprintf(sTemp1," 5");
TickTock 42:4533b13b297d 540 showButton(1,1,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 541 sprintf(sTemp1," 6");
TickTock 42:4533b13b297d 542 showButton(2,1,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 543 sprintf(sTemp1," 7");
TickTock 42:4533b13b297d 544 showButton(0,2,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 545 sprintf(sTemp1," 8");
TickTock 42:4533b13b297d 546 showButton(1,2,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 547 sprintf(sTemp1," 9");
TickTock 42:4533b13b297d 548 showButton(2,2,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 549 sprintf(sTemp1," 0");
TickTock 42:4533b13b297d 550 showButton(1,3,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 551 sprintf(sTemp1,"<--");
TickTock 42:4533b13b297d 552 showButton(0,3,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 553 sprintf(sTemp1,"-->");
TickTock 42:4533b13b297d 554 showButton(2,3,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 555 sprintf(sTemp1,"return");
TickTock 42:4533b13b297d 556 showButton(3,3,sTemp1,sTemp2,4,4);
TickTock 42:4533b13b297d 557 case 3:
TickTock 42:4533b13b297d 558 break;
TickTock 42:4533b13b297d 559 default:
TickTock 42:4533b13b297d 560 break;
TickTock 42:4533b13b297d 561 }
TickTock 36:dbd39c315258 562 }
TickTock 36:dbd39c315258 563 }
TickTock 36:dbd39c315258 564
TickTock 36:dbd39c315258 565 void showButton(unsigned char column, unsigned char row, char * text1, char * text2, unsigned char columns, unsigned char rows){
TickTock 36:dbd39c315258 566 unsigned short x1,x2,y1,y2;
TickTock 36:dbd39c315258 567 x1=column*(320/columns)+btnGap/2;
TickTock 36:dbd39c315258 568 x2=(column+1)*(320/columns)-btnGap/2;
TickTock 36:dbd39c315258 569 y1=row*(240/rows)+btnGap/2;
TickTock 36:dbd39c315258 570 y2=(row+1)*(240/rows)-btnGap/2;
TickTock 36:dbd39c315258 571 tt.fillrect(x1,y1,x2,y2,DarkCyan);
TickTock 36:dbd39c315258 572 tt.locate(x1+btnGap,y1+btnGap);
TickTock 36:dbd39c315258 573 printf("%s\n",text1);
TickTock 36:dbd39c315258 574 tt.locate(x1+btnGap,y1+btnGap+30);
TickTock 36:dbd39c315258 575 printf("%s\n",text2);
TickTock 36:dbd39c315258 576 }
TickTock 41:8d4609ea7259 577 // below is braking screen normalized to power rather than force
TickTock 41:8d4609ea7259 578 // changed to force since power had too large a dynamic range
TickTock 42:4533b13b297d 579 /*void braking (bool force, bool showButtons, bool prdata=false){
TickTock 23:cd03f9c3395e 580 unsigned long targetBraking, regenBraking, speed;
TickTock 27:6bd073c33977 581 static unsigned long maxTarget = 20000, maxRegen = 20000, tarDivReg = 1000;
TickTock 13:62e0f7f39ff5 582 short rpm;
TickTock 13:62e0f7f39ff5 583 unsigned long temp;
TickTock 13:62e0f7f39ff5 584 static unsigned char lastPressure[4] = {200,200,200,200};
TickTock 13:62e0f7f39ff5 585 unsigned char i,r,t;
TickTock 13:62e0f7f39ff5 586 static unsigned char lr, lt;
TickTock 13:62e0f7f39ff5 587 CANMessage msg;
TickTock 13:62e0f7f39ff5 588
TickTock 13:62e0f7f39ff5 589 msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
TickTock 13:62e0f7f39ff5 590 regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
TickTock 13:62e0f7f39ff5 591 targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
TickTock 13:62e0f7f39ff5 592 msg = lastMsg[indexLastMsg[0x176]]; //Get rpms - not sure what this is but scales to mph with .0725
TickTock 13:62e0f7f39ff5 593 rpm = ((short)msg.data[0]<<8)+msg.data[1];
TickTock 13:62e0f7f39ff5 594 speed =rpm>0?rpm>>3:-rpm>>3; //Take absolute to get speed; div8
TickTock 23:cd03f9c3395e 595 if ((targetBraking>2039)||(speed>200)) { //Filter weird messages
TickTock 23:cd03f9c3395e 596 targetBraking = 0;
TickTock 23:cd03f9c3395e 597 regenBraking = 0;
TickTock 23:cd03f9c3395e 598 } else {
TickTock 23:cd03f9c3395e 599 if ((targetBraking>50)&&(regenBraking>50)){
TickTock 23:cd03f9c3395e 600 temp = targetBraking;
TickTock 23:cd03f9c3395e 601 temp *= 1000;
TickTock 23:cd03f9c3395e 602 temp /= regenBraking;
TickTock 23:cd03f9c3395e 603 if (temp<tarDivReg) tarDivReg=temp;
TickTock 23:cd03f9c3395e 604 }
TickTock 23:cd03f9c3395e 605 targetBraking *= speed;
TickTock 23:cd03f9c3395e 606 regenBraking *= speed;
TickTock 23:cd03f9c3395e 607 if (targetBraking>maxTarget) maxTarget=targetBraking;
TickTock 23:cd03f9c3395e 608 if (regenBraking>maxRegen) maxRegen=regenBraking;
TickTock 23:cd03f9c3395e 609 }
TickTock 23:cd03f9c3395e 610
TickTock 13:62e0f7f39ff5 611 msg = lastMsg[indexLastMsg[0x1ca]]; //Get brake pressure
TickTock 13:62e0f7f39ff5 612 tt.background(Navy);
TickTock 13:62e0f7f39ff5 613 if (force) {
TickTock 13:62e0f7f39ff5 614 tt.cls();
TickTock 13:62e0f7f39ff5 615 tt.rect(0,111,170,239,White);
TickTock 13:62e0f7f39ff5 616 tt.line(0,207,170,207,White);
TickTock 13:62e0f7f39ff5 617 tt.line(0,175,170,175,White);
TickTock 13:62e0f7f39ff5 618 tt.line(0,143,170,143,White);
TickTock 13:62e0f7f39ff5 619 lastPressure[0] = 200;
TickTock 13:62e0f7f39ff5 620 lastPressure[1] = 200;
TickTock 13:62e0f7f39ff5 621 lastPressure[2] = 200;
TickTock 13:62e0f7f39ff5 622 lastPressure[3] = 200;
TickTock 13:62e0f7f39ff5 623 }
TickTock 13:62e0f7f39ff5 624 // plot bar graph for each wheel pressure
TickTock 13:62e0f7f39ff5 625 for (i=0; i<4; i++){
TickTock 13:62e0f7f39ff5 626 if (msg.data[i]<239) {
TickTock 13:62e0f7f39ff5 627 if (msg.data[i]>lastPressure[i]){
TickTock 13:62e0f7f39ff5 628 tt.fillrect(10+40*i,239-msg.data[i],40+40*i,239,Red);
TickTock 13:62e0f7f39ff5 629 } else if (msg.data[i]<lastPressure[i]) {
TickTock 13:62e0f7f39ff5 630 tt.fillrect(10+40*i,238-lastPressure[i],40+40*i,238-msg.data[i],Navy);
TickTock 13:62e0f7f39ff5 631 }
TickTock 13:62e0f7f39ff5 632 lastPressure[i]=msg.data[i];
TickTock 13:62e0f7f39ff5 633 }
TickTock 13:62e0f7f39ff5 634 }
TickTock 13:62e0f7f39ff5 635
TickTock 27:6bd073c33977 636 temp = targetBraking;
TickTock 27:6bd073c33977 637 temp *=200;
TickTock 27:6bd073c33977 638 temp /= maxTarget;
TickTock 27:6bd073c33977 639 t = (char) temp;
TickTock 27:6bd073c33977 640 if (t>200) t=200;
TickTock 27:6bd073c33977 641 temp = regenBraking;
TickTock 27:6bd073c33977 642 temp *= tarDivReg;
TickTock 27:6bd073c33977 643 temp /= maxTarget;
TickTock 27:6bd073c33977 644 temp /= 5;
TickTock 27:6bd073c33977 645 r = (char) temp;
TickTock 27:6bd073c33977 646 if (r>200) r=200;
TickTock 27:6bd073c33977 647 if(lr!=r&&prdata){
TickTock 27:6bd073c33977 648 tt.foreground(Yellow);
TickTock 27:6bd073c33977 649 tt.set_font((unsigned char*) Arial28x28);
TickTock 27:6bd073c33977 650 tt.locate(100,40);
TickTock 27:6bd073c33977 651 printf("%d %d \n",regenBraking,maxRegen);
TickTock 27:6bd073c33977 652 tt.locate(100,70);
TickTock 27:6bd073c33977 653 printf("%3.1f (%3.1f%s) \n",(float)tarDivReg/10,(float)regenBraking*tarDivReg/targetBraking/10,"%");
TickTock 27:6bd073c33977 654 }
TickTock 27:6bd073c33977 655 if(lt!=t&&prdata){
TickTock 27:6bd073c33977 656 tt.foreground(Yellow);
TickTock 27:6bd073c33977 657 tt.set_font((unsigned char*) Arial28x28);
TickTock 27:6bd073c33977 658 tt.locate(100,10);
TickTock 27:6bd073c33977 659 printf("%d %d \n",targetBraking,maxTarget);
TickTock 13:62e0f7f39ff5 660 }
TickTock 27:6bd073c33977 661 if (r>t) t=r; //Should never happen
TickTock 27:6bd073c33977 662 if((lr!=r||lt!=t)&&!prdata){
TickTock 27:6bd073c33977 663 tt.fillrect(200,10,300,239-t,Navy);
TickTock 27:6bd073c33977 664 tt.fillrect(200,239-t,300,239-r,Red);
TickTock 27:6bd073c33977 665 tt.fillrect(200,239-r,300,239,Green);
TickTock 27:6bd073c33977 666 }
TickTock 27:6bd073c33977 667 lt=t;
TickTock 27:6bd073c33977 668 lr=r;
TickTock 36:dbd39c315258 669 }*/