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 TFT_fonts TOUCH_TFTx2 beep mbed
Fork of CANary by
Diff: utility.cpp
- Revision:
- 37:fea2c1d52c5f
- Parent:
- 36:dbd39c315258
- Child:
- 38:155ec32c5e91
diff -r dbd39c315258 -r fea2c1d52c5f utility.cpp
--- 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 () {
