Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2_ILI9341 mbed
Fork of CANary_corrupt by
Revision 37:fea2c1d52c5f, committed 2013-03-24
- Comitter:
- TickTock
- Date:
- Sun Mar 24 15:35:45 2013 +0000
- Parent:
- 36:dbd39c315258
- Child:
- 38:155ec32c5e91
- Commit message:
- Got kW computation working
Changed in this revision
--- a/TOUCH_TFTx2.lib Sat Mar 23 04:43:45 2013 +0000 +++ b/TOUCH_TFTx2.lib Sun Mar 24 15:35:45 2013 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/TickTock/code/TOUCH_TFTx2/#b7fb9d3ae5ea +http://mbed.org/users/TickTock/code/TOUCH_TFTx2/#220e3da2dd00
--- a/common.h Sat Mar 23 04:43:45 2013 +0000 +++ b/common.h Sun Mar 24 15:35:45 2013 +0000 @@ -2,7 +2,7 @@ #define logScreen 1 #define dteScreen 2 #define brakeScreen 3 -#define powerScreen 4 +#define testScreen 4 #define monitorScreen 5 #define changedScreen 6 #define cpScreen 7
--- a/displayModes.cpp Sat Mar 23 04:43:45 2013 +0000
+++ b/displayModes.cpp Sun Mar 24 15:35:45 2013 +0000
@@ -1,6 +1,6 @@
//displayModes.cpp
+#include "displayModes.h"
-#include "displayModes.h"
char sTemp1[40];
char sTemp2[16];
@@ -104,7 +104,7 @@
tt.foreground(Yellow);
tt.set_font((unsigned char*) Arial28x28);
tt.locate(200,200);
- printf("%4.1fV\n",(float)packV/2);
+ printf("%4.1fV \n",(float)packV/2);
lpackV=packV;
}
if(force||tick){
@@ -112,6 +112,8 @@
tt.set_font((unsigned char*) Arial28x28);
tt.locate(20,200);
printf("%4.2fV \n",accV);
+ tt.locate(170,40);
+ printf("%4.3fkW \n",mpkWh); //kW for now
}
}
@@ -121,9 +123,19 @@
unsigned long temp;
static unsigned char lastPressure[4] = {200,200,200,200};
unsigned char i,r,t;
- static unsigned char lr, lt;
+ static unsigned char lr=0, lt=0;
+ signed short steering;
+ unsigned short s;
+ static unsigned short ls;
+ unsigned char throttle;
+ static unsigned char lthrottle;
CANMessage msg;
+ msg = lastMsg[indexLastMsg[0x180]]; //Get Throttle position
+ throttle = msg.data[5];
+ msg = lastMsg[indexLastMsg[0x002]]; //Get Steering angle
+ steering = (msg.data[1]<<8)+msg.data[0];
+ s= (unsigned short) ((steering/10)+160)%310;
msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
@@ -149,6 +161,26 @@
lastPressure[2] = 200;
lastPressure[3] = 200;
}
+
+ if (s!=ls){
+ tt.fillrect(ls,5,ls+9,14, Navy);
+ tt.fillrect(s,5,s+9,14, White);
+ //tt.foreground(Yellow);
+ //tt.set_font((unsigned char*) Arial28x28);
+ //tt.locate(10,40);
+ //printf("%d %d \n",s,ls);
+ ls=s;
+ }
+ if (throttle!=lthrottle){
+ if (throttle>239) throttle=239;
+ if(throttle<lthrottle){
+ tt.fillrect(280,239-lthrottle,310,239-throttle,Navy);
+ }else{
+ tt.fillrect(280,239-throttle,310,239,Yellow);
+ }
+ lthrottle=throttle;
+ }
+
// plot bar graph for each wheel pressure
for (i=0; i<4; i++){
if (msg.data[i]<239) {
@@ -188,9 +220,9 @@
}
if (r>t) t=r; //Should never happen
if((lr!=r||lt!=t)&&!prdata){
- tt.fillrect(200,10,300,239-t,Navy);
- tt.fillrect(200,239-t,300,239-r,Red);
- tt.fillrect(200,239-r,300,239,Green);
+ tt.fillrect(190,10,260,239-t,Navy);
+ tt.fillrect(190,239-t,260,239-r,Red);
+ tt.fillrect(190,239-r,260,239,Green);
}
lt=t;
lr=r;
@@ -370,6 +402,29 @@
}
}
+void test(bool force){
+ unsigned char left,right;
+ CANMessage msg;
+ static unsigned char lleft=0;
+
+ msg = lastMsg[indexLastMsg[0x284]];
+ right = msg.data[7];
+ msg = lastMsg[indexLastMsg[0x280]];
+ left = msg.data[6];
+
+ tt.background(Navy);
+ if(force) tt.cls();
+ if(force||left!=lleft){
+ tt.foreground(Yellow);
+ tt.set_font((unsigned char*) Arial28x28);
+ tt.locate(10,200);
+ printf("%d \n",left);
+ tt.locate(200,200);
+ printf("%d \n",right);
+ lleft=left;
+ }
+}
+
void updateDisplay(char display){
bool changed;
changed = dMode[display]!=lastDMode[display];
@@ -384,9 +439,9 @@
case brakeScreen:
braking(changed);
break;
- case powerScreen:
- //braking(changed, true);
- //break;
+ case testScreen:
+ test(changed);
+ break;
case monitorScreen:
printLast(changed);
break;
--- a/displayModes.h Sat Mar 23 04:43:45 2013 +0000
+++ b/displayModes.h Sun Mar 24 15:35:45 2013 +0000
@@ -29,12 +29,14 @@
extern bool playbackEn;
extern bool playbackOpen;
extern float playbackInt;
+extern float mpkWh;
extern "C" {
void printLast (bool force);
void printChanged (bool force);
void printLog (bool force);
void printDTE (bool force);
+ void test (bool force);
void braking (bool force, bool prdata);
void cpData(bool force);
void showDateTime(bool force);
--- a/main.cpp Sat Mar 23 04:43:45 2013 +0000
+++ b/main.cpp Sun Mar 24 15:35:45 2013 +0000
@@ -21,8 +21,6 @@
#include "EthernetPowerControl.h"
#include "utility.h"
#include "displayModes.h"
-#include "GraphicsDisplay.h"
-#include "SPI_TFTx2.h"
#include "TOUCH_TFTx2.h"
LocalFileSystem local("local");
@@ -85,15 +83,17 @@
unsigned short pollInt = 300; // polling interval=5 minutes (until config file read)
bool accOn = false; // Accessories on
float scale12V = 16.2; // R1:R2 ratio
-signed long kWh = 0;
+signed long mWs = 0;
unsigned long miles = 0;
float mpkWh = 0;
float accV = 0;
bool playbackEn = false;
bool playbackOpen = false;
-float playbackInt = 1; //read one message every 64 ms
+float playbackInt = 0.032; //read one message every 64 ms
bool step = false;
+char header[5];
char data[8];
+unsigned short pbts;
int main() {
int readPointer=0;
@@ -177,12 +177,10 @@
secsNoMsg = 0;
secsNoTouch = 0;
-
// Read config file
readConfig();
touched=false;
secsNoTouch=2;
-
while (true) {
if (!logOpen) { // Open new file if one is not already open
if(logEn){ //logging enable
@@ -212,11 +210,16 @@
// Dump buffer if > 1/16 full or canbus has stopped
if (file == NULL) {
logOpen = false;
- sprintf(sTemp,"Failed to append log file.\n\n");
+ sprintf(sTemp,"Failed to append log file.\n");
+ logMsg(sTemp);
spkr.beep(1000,0.25);
- logMsg(sTemp);
logEn=false;
} else {
+ if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen*7/8)) { // Hi-water mark
+ sprintf(sTemp,"Write buffer overrun.\n");
+ logMsg(sTemp);
+ spkr.beep(1000,0.25);
+ }
while (readPointer != writePointer) {
for (j = 0; j<13; j++){
fprintf(file,"%c",writeBuffer[readPointer][j]);
@@ -304,6 +307,7 @@
indexOffset=indexOffset>4?indexOffset-4:1;
} else if (dMode[i]==config1Screen) {
wait_ms(500);
+ tt.background(Black);
tt.calibrate();
} else if (dMode[i]==config2Screen) { // slower
playbackInt *=2;
@@ -442,7 +446,6 @@
lastDMode[1]=99;
}
}
-
display=display<1?display+1:0; // toggle display
updateDisplay(display);
@@ -465,13 +468,14 @@
}else{
dled = ledLo;
}
- if(kWh>0){
- mpkWh=miles/kWh;
+ //if(mWs>0){
+ if(true){
+ mpkWh= ((float) mWs)/1e6; // just kW for now
}else{
mpkWh=99;
}
miles=0;
- kWh=0;
+ mWs=0;
tick=false;
}
@@ -481,11 +485,9 @@
//logMsg(sTemp);
for(i=0;i<200;i++){
if(!feof(file)){
- //for (j = 0; j<5; j++){
- fscanf(file,"%5c",&writeBuffer[0][0]);
- //}
- fscanf(file,"%8c",&data[0]);
- logCan(writeBuffer[0][0],CANMessage(0x7ff&((writeBuffer[0][4]<<8)+writeBuffer[0][3]), data, 8));
+ fscanf(file,"%5c%8c",&header,&data);
+ pbts=(header[1]<<8)|header[2];
+ logCan(header[0],CANMessage(0x7ff&((header[4]<<8)+header[3]), data, 8));
}else{
fclose(file); // restart
file = fopen("/usb/playback.alc", "rb");
@@ -495,5 +497,6 @@
}
step=false;
}
+
} //while (true)
}
\ No newline at end of file
--- a/utility.cpp Sat Mar 23 04:43:45 2013 +0000
+++ b/utility.cpp Sun Mar 24 15:35:45 2013 +0000
@@ -1,5 +1,4 @@
// utility.cpp
-
#include "utility.h"
void mbed_reset();
@@ -12,7 +11,7 @@
tick=true;
}
-extern "C" void RTC_Init (void) {
+void RTC_Init (void) {
LPC_RTC->ILR=0x00; // set up the RTC interrupts
LPC_RTC->CIIR=0x01; // interrupts each second
LPC_RTC->CCR = 0x01; // Clock enable
@@ -26,7 +25,7 @@
}
void touch_ISR(){
- LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF);
+ //LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF); // seems to work without so maybe not necessary (performed inInterruptIn handler?)
touched=true; // just set flag - touch screen algorythm is long and we don't want to block other interrupts
}
@@ -40,16 +39,21 @@
void logCan (char mType, CANMessage canRXmsg) {
char sTemp[40];
unsigned short ts = getTimeStamp();
- unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
static unsigned char ii = 0, lasti = 0; // indexindex
unsigned char changed,i;
- static unsigned char bdi;
+ static unsigned char bdi=0;
+ //Determined 1db messages are 10ms apart so no need to compute deltaT
+ //unsigned short ms;
+ //static unsigned short lms=0;
+ unsigned short packV;
+ signed short packA;
+ signed long imWs;
secsNoMsg=0; // reset deadman switch
if(logOpen){
if(canRXmsg.id>0) {
writeBuffer[writePointer][0]=mType;
- writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8);
- writeBuffer[writePointer][2]=ts&0xff;
+ writeBuffer[writePointer][1]=(ts&0xff00)>>8;
+ writeBuffer[writePointer][2]=(ts&0x00ff);
writeBuffer[writePointer][3]=canRXmsg.id&0xff;
writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
for(i=5;i<13;i++){
@@ -60,7 +64,11 @@
led3 = !led3;
}
}
- }//if logOpen
+ }
+ //Determined 1db messages are 10ms apart so no need to compute deltaT
+ /*if(playbackOpen){
+ ts=pbts; // Use ts from playback buffer
+ }//if logOpen*/
if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry
ii=ii<99?ii+1:0;
indexLastMsg[canRXmsg.id]=ii; //Create entry if first message
@@ -77,13 +85,13 @@
lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table
if((mType==2)&&(canRXmsg.id==0x358)){ // headlight/turn signal indicator
headlights = (canRXmsg.data[1]&0x80)?true:false;
- } else if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data? Need to store all responses
+ }else if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data? Need to store all responses
if(canRXmsg.data[0]<0x20){
if(canRXmsg.data[3]==2){//cellpair data
bdi=0;
sprintf(sTemp,"Getting cell pair data\n");
logMsg(sTemp);
- }else if(canRXmsg.data[3]==4){//temperature data
+ }else if(canRXmsg.data[3]==4){//temperature data
bdi=0x20;
sprintf(sTemp,"Getting temperature data\n");
logMsg(sTemp);
@@ -106,7 +114,26 @@
battData[i+5]=canRXmsg.data[6];
battData[i+6]=canRXmsg.data[7];
}
- }//if 0x7bb
+ }else if((mType==1)&&(canRXmsg.id==0x1db)){ //Battery Volts and Amps
+ //Determined 1db messages are 10ms apart so no need to compute deltaT
+ //ms=(ts&0xfc00)*1000+(ts&0x03ff); // convert from BCD(ish-ssssss:mmmmmmmmmm) to binary
+ //if(ms<lms){ // must've rolled over
+ // imWs=ms+60000; // (ms)compute elapsed time since last update including rollover
+ // imWs-=lms;
+ //}else{
+ // imWs=ms-lms; // (ms) compute elapsed time since last update
+ //}
+ packV=((canRXmsg.data[2]<<2)|(canRXmsg.data[3]>>6)); // 1 LSB = 0.5V
+ packA=((canRXmsg.data[0]<<3)|(canRXmsg.data[1]>>5)); // 1 LSB = 0.5A
+ if(packA>0x03ff){
+ packA|=0xf800;//extend sign;
+ }
+ imWs=packV; // Volts*seconds*2
+ imWs*=packA; // Watts*4
+ imWs*=-2.5; // milliwatts*seconds (1db messages are 10ms apart)
+ mWs+=imWs; // total mWs
+ //lms=ms;
+ }
}
void logTS () {
--- a/utility.h Sat Mar 23 04:43:45 2013 +0000
+++ b/utility.h Sun Mar 24 15:35:45 2013 +0000
@@ -36,6 +36,8 @@
extern bool playbackOpen;
extern bool step;
extern float playbackInt;
+extern signed long mWs;
+extern unsigned short pbts;
extern "C" {
void mbed_reset();
