KAT MFL
/
Baja_Brains_6
main.cpp@0:c6ed639a9fae, 2012-02-16 (annotated)
- Committer:
- G02_KAT
- Date:
- Thu Feb 16 03:04:26 2012 +0000
- Revision:
- 0:c6ed639a9fae
Newest, nothin special
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
G02_KAT | 0:c6ed639a9fae | 1 | #include "mbed.h" |
G02_KAT | 0:c6ed639a9fae | 2 | #include "MSCFileSystem.h" |
G02_KAT | 0:c6ed639a9fae | 3 | |
G02_KAT | 0:c6ed639a9fae | 4 | class Watchdog { |
G02_KAT | 0:c6ed639a9fae | 5 | public: |
G02_KAT | 0:c6ed639a9fae | 6 | void kick(float s) { |
G02_KAT | 0:c6ed639a9fae | 7 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
G02_KAT | 0:c6ed639a9fae | 8 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
G02_KAT | 0:c6ed639a9fae | 9 | LPC_WDT->WDTC = s * (float)clk; |
G02_KAT | 0:c6ed639a9fae | 10 | LPC_WDT->WDMOD = 0x3; // Enabled and Reset |
G02_KAT | 0:c6ed639a9fae | 11 | kick(); |
G02_KAT | 0:c6ed639a9fae | 12 | } |
G02_KAT | 0:c6ed639a9fae | 13 | |
G02_KAT | 0:c6ed639a9fae | 14 | void kick() { |
G02_KAT | 0:c6ed639a9fae | 15 | LPC_WDT->WDFEED = 0xAA; |
G02_KAT | 0:c6ed639a9fae | 16 | LPC_WDT->WDFEED = 0x55; |
G02_KAT | 0:c6ed639a9fae | 17 | } |
G02_KAT | 0:c6ed639a9fae | 18 | }; |
G02_KAT | 0:c6ed639a9fae | 19 | |
G02_KAT | 0:c6ed639a9fae | 20 | //Declare interrupt pin |
G02_KAT | 0:c6ed639a9fae | 21 | InterruptIn killSwitch(p21); |
G02_KAT | 0:c6ed639a9fae | 22 | |
G02_KAT | 0:c6ed639a9fae | 23 | //USB Setup |
G02_KAT | 0:c6ed639a9fae | 24 | DigitalOut USBSelect(p24); |
G02_KAT | 0:c6ed639a9fae | 25 | |
G02_KAT | 0:c6ed639a9fae | 26 | //Stopwatch timer |
G02_KAT | 0:c6ed639a9fae | 27 | Timer toothTime; |
G02_KAT | 0:c6ed639a9fae | 28 | Timer loopTime; |
G02_KAT | 0:c6ed639a9fae | 29 | |
G02_KAT | 0:c6ed639a9fae | 30 | //Watchdog |
G02_KAT | 0:c6ed639a9fae | 31 | Watchdog wdt; |
G02_KAT | 0:c6ed639a9fae | 32 | |
G02_KAT | 0:c6ed639a9fae | 33 | //Battery Level Input |
G02_KAT | 0:c6ed639a9fae | 34 | AnalogIn battery(p20); |
G02_KAT | 0:c6ed639a9fae | 35 | |
G02_KAT | 0:c6ed639a9fae | 36 | //Indicator Lights |
G02_KAT | 0:c6ed639a9fae | 37 | DigitalOut led1(LED1); |
G02_KAT | 0:c6ed639a9fae | 38 | DigitalOut led2(LED2); |
G02_KAT | 0:c6ed639a9fae | 39 | DigitalOut led3(LED3); |
G02_KAT | 0:c6ed639a9fae | 40 | |
G02_KAT | 0:c6ed639a9fae | 41 | CANMessage msg; |
G02_KAT | 0:c6ed639a9fae | 42 | |
G02_KAT | 0:c6ed639a9fae | 43 | //Analog Mux |
G02_KAT | 0:c6ed639a9fae | 44 | AnalogIn analogIn(p15); |
G02_KAT | 0:c6ed639a9fae | 45 | //AnalogOut analogOut (p18); |
G02_KAT | 0:c6ed639a9fae | 46 | |
G02_KAT | 0:c6ed639a9fae | 47 | DigitalOut enA (p10); |
G02_KAT | 0:c6ed639a9fae | 48 | BusOut selectAnalog (p11,p12,p13,p14); |
G02_KAT | 0:c6ed639a9fae | 49 | |
G02_KAT | 0:c6ed639a9fae | 50 | //Digital Mux |
G02_KAT | 0:c6ed639a9fae | 51 | DigitalIn digitalIn (p16); |
G02_KAT | 0:c6ed639a9fae | 52 | //DigitalOut digitalOut (p17); |
G02_KAT | 0:c6ed639a9fae | 53 | |
G02_KAT | 0:c6ed639a9fae | 54 | DigitalOut enD (p5); |
G02_KAT | 0:c6ed639a9fae | 55 | BusOut selectDigital (p6,p7,p8,p9); |
G02_KAT | 0:c6ed639a9fae | 56 | |
G02_KAT | 0:c6ed639a9fae | 57 | //CAN communication |
G02_KAT | 0:c6ed639a9fae | 58 | CAN can1 (p30,p29); |
G02_KAT | 0:c6ed639a9fae | 59 | DigitalOut canEn (p26); |
G02_KAT | 0:c6ed639a9fae | 60 | |
G02_KAT | 0:c6ed639a9fae | 61 | //Variables |
G02_KAT | 0:c6ed639a9fae | 62 | |
G02_KAT | 0:c6ed639a9fae | 63 | int gearH, gearL, gearR, gearPos, fuel1, fuel2, fuel3, fuel4, fuel5, fuelLev; |
G02_KAT | 0:c6ed639a9fae | 64 | int teethMotor, teethB; |
G02_KAT | 0:c6ed639a9fae | 65 | int dataCollectTime; |
G02_KAT | 0:c6ed639a9fae | 66 | int count, i,j,x,y; |
G02_KAT | 0:c6ed639a9fae | 67 | int variable=0; |
G02_KAT | 0:c6ed639a9fae | 68 | int timeCAN = 0; |
G02_KAT | 0:c6ed639a9fae | 69 | int TIME_CAN_MAX = 1000; |
G02_KAT | 0:c6ed639a9fae | 70 | |
G02_KAT | 0:c6ed639a9fae | 71 | double x1, y1, z1, x2, y2, z2; |
G02_KAT | 0:c6ed639a9fae | 72 | double temp, clutch,vBatt, vBattery, batteryVoltage; |
G02_KAT | 0:c6ed639a9fae | 73 | double susp1, susp2, susp3, susp4; |
G02_KAT | 0:c6ed639a9fae | 74 | double circumfB,diameter, backSpeed, frontSpeed, rpmMotor, motorRPM; |
G02_KAT | 0:c6ed639a9fae | 75 | double timeA, timeout1, timeLoop; |
G02_KAT | 0:c6ed639a9fae | 76 | |
G02_KAT | 0:c6ed639a9fae | 77 | char filename[64]; |
G02_KAT | 0:c6ed639a9fae | 78 | char date[32]; |
G02_KAT | 0:c6ed639a9fae | 79 | char time1[32]; |
G02_KAT | 0:c6ed639a9fae | 80 | char time2[32]; |
G02_KAT | 0:c6ed639a9fae | 81 | char time3[32]; |
G02_KAT | 0:c6ed639a9fae | 82 | char dataCAN[8]; |
G02_KAT | 0:c6ed639a9fae | 83 | char batLev, gearPosition, fuelLevel, rpm_motor, temperature, wheelSpeed; |
G02_KAT | 0:c6ed639a9fae | 84 | |
G02_KAT | 0:c6ed639a9fae | 85 | |
G02_KAT | 0:c6ed639a9fae | 86 | //Interrupt Routine |
G02_KAT | 0:c6ed639a9fae | 87 | void trigger() { |
G02_KAT | 0:c6ed639a9fae | 88 | FILE *fp = fopen(filename, "a+"); //open file and add to it |
G02_KAT | 0:c6ed639a9fae | 89 | if(fp){ |
G02_KAT | 0:c6ed639a9fae | 90 | fprintf(fp,"%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f \n",time3, gearPos,fuelLev,backSpeed,frontSpeed,motorRPM,x1,y1,z1,x2,y2,z2,temp,clutch,batteryVoltage); |
G02_KAT | 0:c6ed639a9fae | 91 | fclose(fp); |
G02_KAT | 0:c6ed639a9fae | 92 | } |
G02_KAT | 0:c6ed639a9fae | 93 | wait(5); //wait for power to turn off |
G02_KAT | 0:c6ed639a9fae | 94 | } |
G02_KAT | 0:c6ed639a9fae | 95 | |
G02_KAT | 0:c6ed639a9fae | 96 | |
G02_KAT | 0:c6ed639a9fae | 97 | void countTeeth(){ |
G02_KAT | 0:c6ed639a9fae | 98 | count = 8; |
G02_KAT | 0:c6ed639a9fae | 99 | timeout1 = 1; |
G02_KAT | 0:c6ed639a9fae | 100 | toothTime.start(); |
G02_KAT | 0:c6ed639a9fae | 101 | x = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 102 | y = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 103 | while(count > 0 & toothTime.read() < timeout1){ |
G02_KAT | 0:c6ed639a9fae | 104 | if (x != y){ |
G02_KAT | 0:c6ed639a9fae | 105 | count--; |
G02_KAT | 0:c6ed639a9fae | 106 | x=y; |
G02_KAT | 0:c6ed639a9fae | 107 | } |
G02_KAT | 0:c6ed639a9fae | 108 | y = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 109 | } |
G02_KAT | 0:c6ed639a9fae | 110 | timeA = toothTime.read(); |
G02_KAT | 0:c6ed639a9fae | 111 | } |
G02_KAT | 0:c6ed639a9fae | 112 | |
G02_KAT | 0:c6ed639a9fae | 113 | |
G02_KAT | 0:c6ed639a9fae | 114 | //Polling Routine |
G02_KAT | 0:c6ed639a9fae | 115 | void Polling(){ |
G02_KAT | 0:c6ed639a9fae | 116 | |
G02_KAT | 0:c6ed639a9fae | 117 | //Speed 1 - back wheel |
G02_KAT | 0:c6ed639a9fae | 118 | diameter = 0.58; //in kilometers |
G02_KAT | 0:c6ed639a9fae | 119 | teethB = 4; |
G02_KAT | 0:c6ed639a9fae | 120 | selectDigital = 12; |
G02_KAT | 0:c6ed639a9fae | 121 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 122 | |
G02_KAT | 0:c6ed639a9fae | 123 | countTeeth(); |
G02_KAT | 0:c6ed639a9fae | 124 | if(timeA > timeout1){ |
G02_KAT | 0:c6ed639a9fae | 125 | backSpeed = 0; //car not moving!!! |
G02_KAT | 0:c6ed639a9fae | 126 | }else{ |
G02_KAT | 0:c6ed639a9fae | 127 | backSpeed = (1/timeA)*3.14*diameter*3.6; //km/hr |
G02_KAT | 0:c6ed639a9fae | 128 | } |
G02_KAT | 0:c6ed639a9fae | 129 | toothTime.reset(); |
G02_KAT | 0:c6ed639a9fae | 130 | |
G02_KAT | 0:c6ed639a9fae | 131 | //Reverse Gear |
G02_KAT | 0:c6ed639a9fae | 132 | selectDigital = 0; |
G02_KAT | 0:c6ed639a9fae | 133 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 134 | gearR = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 135 | |
G02_KAT | 0:c6ed639a9fae | 136 | //Low Gear |
G02_KAT | 0:c6ed639a9fae | 137 | selectDigital = 1; |
G02_KAT | 0:c6ed639a9fae | 138 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 139 | gearL = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 140 | |
G02_KAT | 0:c6ed639a9fae | 141 | //High Gear |
G02_KAT | 0:c6ed639a9fae | 142 | selectDigital = 2; |
G02_KAT | 0:c6ed639a9fae | 143 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 144 | gearH = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 145 | |
G02_KAT | 0:c6ed639a9fae | 146 | //Fuel 5 |
G02_KAT | 0:c6ed639a9fae | 147 | selectDigital = 3; |
G02_KAT | 0:c6ed639a9fae | 148 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 149 | fuel5 = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 150 | |
G02_KAT | 0:c6ed639a9fae | 151 | //Fuel 4 |
G02_KAT | 0:c6ed639a9fae | 152 | selectDigital = 4; |
G02_KAT | 0:c6ed639a9fae | 153 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 154 | fuel4 = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 155 | |
G02_KAT | 0:c6ed639a9fae | 156 | //Fuel 3 |
G02_KAT | 0:c6ed639a9fae | 157 | selectDigital = 5; |
G02_KAT | 0:c6ed639a9fae | 158 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 159 | fuel3 = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 160 | |
G02_KAT | 0:c6ed639a9fae | 161 | //Fuel 2 |
G02_KAT | 0:c6ed639a9fae | 162 | selectDigital = 6; |
G02_KAT | 0:c6ed639a9fae | 163 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 164 | fuel2 = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 165 | |
G02_KAT | 0:c6ed639a9fae | 166 | //Fuel 1 |
G02_KAT | 0:c6ed639a9fae | 167 | selectDigital = 7; |
G02_KAT | 0:c6ed639a9fae | 168 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 169 | fuel1 = digitalIn.read(); |
G02_KAT | 0:c6ed639a9fae | 170 | |
G02_KAT | 0:c6ed639a9fae | 171 | //Motor rpm |
G02_KAT | 0:c6ed639a9fae | 172 | circumfB = 0.58/1000; //in kilometers |
G02_KAT | 0:c6ed639a9fae | 173 | teethMotor = 12; |
G02_KAT | 0:c6ed639a9fae | 174 | selectDigital = 11; |
G02_KAT | 0:c6ed639a9fae | 175 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 176 | |
G02_KAT | 0:c6ed639a9fae | 177 | countTeeth(); |
G02_KAT | 0:c6ed639a9fae | 178 | if(timeA > timeout1){ |
G02_KAT | 0:c6ed639a9fae | 179 | motorRPM = 0; //motor not moving!!! |
G02_KAT | 0:c6ed639a9fae | 180 | }else{ |
G02_KAT | 0:c6ed639a9fae | 181 | motorRPM = 60/(timeA*3); //rev/min |
G02_KAT | 0:c6ed639a9fae | 182 | } |
G02_KAT | 0:c6ed639a9fae | 183 | toothTime.reset(); |
G02_KAT | 0:c6ed639a9fae | 184 | |
G02_KAT | 0:c6ed639a9fae | 185 | |
G02_KAT | 0:c6ed639a9fae | 186 | //Clutch |
G02_KAT | 0:c6ed639a9fae | 187 | selectAnalog = 15; |
G02_KAT | 0:c6ed639a9fae | 188 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 189 | clutch = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 190 | |
G02_KAT | 0:c6ed639a9fae | 191 | //Accelerometer x1 |
G02_KAT | 0:c6ed639a9fae | 192 | selectAnalog = 0; |
G02_KAT | 0:c6ed639a9fae | 193 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 194 | x1 = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 195 | |
G02_KAT | 0:c6ed639a9fae | 196 | //Accelerometer y1 |
G02_KAT | 0:c6ed639a9fae | 197 | selectAnalog = 1; |
G02_KAT | 0:c6ed639a9fae | 198 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 199 | y1 = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 200 | |
G02_KAT | 0:c6ed639a9fae | 201 | //Accelerometer z1 |
G02_KAT | 0:c6ed639a9fae | 202 | |
G02_KAT | 0:c6ed639a9fae | 203 | selectAnalog = 2; |
G02_KAT | 0:c6ed639a9fae | 204 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 205 | z1 = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 206 | |
G02_KAT | 0:c6ed639a9fae | 207 | //Temperature (sig4) |
G02_KAT | 0:c6ed639a9fae | 208 | selectAnalog = 8; |
G02_KAT | 0:c6ed639a9fae | 209 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 210 | temp = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 211 | |
G02_KAT | 0:c6ed639a9fae | 212 | //Battery Level |
G02_KAT | 0:c6ed639a9fae | 213 | vBatt = battery.read(); |
G02_KAT | 0:c6ed639a9fae | 214 | |
G02_KAT | 0:c6ed639a9fae | 215 | /* |
G02_KAT | 0:c6ed639a9fae | 216 | //Suspension 1 |
G02_KAT | 0:c6ed639a9fae | 217 | selectAnalog = 11; |
G02_KAT | 0:c6ed639a9fae | 218 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 219 | susp1 = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 220 | |
G02_KAT | 0:c6ed639a9fae | 221 | //Suspension 2 |
G02_KAT | 0:c6ed639a9fae | 222 | selectAnalog = 12; |
G02_KAT | 0:c6ed639a9fae | 223 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 224 | susp2 = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 225 | |
G02_KAT | 0:c6ed639a9fae | 226 | //Suspension 3 |
G02_KAT | 0:c6ed639a9fae | 227 | selectAnalog = 13; |
G02_KAT | 0:c6ed639a9fae | 228 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 229 | susp3 = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 230 | |
G02_KAT | 0:c6ed639a9fae | 231 | //Suspension 4 |
G02_KAT | 0:c6ed639a9fae | 232 | selectAnalog = 14; |
G02_KAT | 0:c6ed639a9fae | 233 | wait_us(0.05); |
G02_KAT | 0:c6ed639a9fae | 234 | susp4 = analogIn.read(); |
G02_KAT | 0:c6ed639a9fae | 235 | */ |
G02_KAT | 0:c6ed639a9fae | 236 | } |
G02_KAT | 0:c6ed639a9fae | 237 | |
G02_KAT | 0:c6ed639a9fae | 238 | void translateData(){ |
G02_KAT | 0:c6ed639a9fae | 239 | |
G02_KAT | 0:c6ed639a9fae | 240 | //convert to gear |
G02_KAT | 0:c6ed639a9fae | 241 | gearPos = 0; // N |
G02_KAT | 0:c6ed639a9fae | 242 | if (gearL==0){ |
G02_KAT | 0:c6ed639a9fae | 243 | gearPos = 1; |
G02_KAT | 0:c6ed639a9fae | 244 | } |
G02_KAT | 0:c6ed639a9fae | 245 | if (gearH==0){ |
G02_KAT | 0:c6ed639a9fae | 246 | gearPos = 2; |
G02_KAT | 0:c6ed639a9fae | 247 | } |
G02_KAT | 0:c6ed639a9fae | 248 | if (gearR==0){ |
G02_KAT | 0:c6ed639a9fae | 249 | gearPos = 3; |
G02_KAT | 0:c6ed639a9fae | 250 | } |
G02_KAT | 0:c6ed639a9fae | 251 | |
G02_KAT | 0:c6ed639a9fae | 252 | //convert to fuel level 1-4 (1=Empty 5=Full) |
G02_KAT | 0:c6ed639a9fae | 253 | fuelLev = 5; //Full |
G02_KAT | 0:c6ed639a9fae | 254 | |
G02_KAT | 0:c6ed639a9fae | 255 | if (fuel1==1){ |
G02_KAT | 0:c6ed639a9fae | 256 | fuelLev = 4; |
G02_KAT | 0:c6ed639a9fae | 257 | } |
G02_KAT | 0:c6ed639a9fae | 258 | if (fuel2==1){ |
G02_KAT | 0:c6ed639a9fae | 259 | fuelLev = 3; |
G02_KAT | 0:c6ed639a9fae | 260 | } |
G02_KAT | 0:c6ed639a9fae | 261 | if (fuel3==1){ |
G02_KAT | 0:c6ed639a9fae | 262 | fuelLev = 2; |
G02_KAT | 0:c6ed639a9fae | 263 | } |
G02_KAT | 0:c6ed639a9fae | 264 | if (fuel4==1){ |
G02_KAT | 0:c6ed639a9fae | 265 | fuelLev = 1; |
G02_KAT | 0:c6ed639a9fae | 266 | } |
G02_KAT | 0:c6ed639a9fae | 267 | if (fuel5==1){ |
G02_KAT | 0:c6ed639a9fae | 268 | fuelLev = 0; //Empty |
G02_KAT | 0:c6ed639a9fae | 269 | } |
G02_KAT | 0:c6ed639a9fae | 270 | |
G02_KAT | 0:c6ed639a9fae | 271 | //convert battery voltage (82=10V & 100=15V) |
G02_KAT | 0:c6ed639a9fae | 272 | vBattery = vBatt * 100; |
G02_KAT | 0:c6ed639a9fae | 273 | if(vBattery < 82){ |
G02_KAT | 0:c6ed639a9fae | 274 | vBattery = 82; |
G02_KAT | 0:c6ed639a9fae | 275 | } |
G02_KAT | 0:c6ed639a9fae | 276 | batteryVoltage = vBatt * 14.8; //change battery % to volts |
G02_KAT | 0:c6ed639a9fae | 277 | |
G02_KAT | 0:c6ed639a9fae | 278 | //convert motor rpm 0-40 thousand rpm |
G02_KAT | 0:c6ed639a9fae | 279 | rpmMotor = motorRPM/100; //0-40 |
G02_KAT | 0:c6ed639a9fae | 280 | if(rpmMotor > 40){ |
G02_KAT | 0:c6ed639a9fae | 281 | rpmMotor = 40; |
G02_KAT | 0:c6ed639a9fae | 282 | } |
G02_KAT | 0:c6ed639a9fae | 283 | |
G02_KAT | 0:c6ed639a9fae | 284 | //convert wheel speed (0-150 km/hr) |
G02_KAT | 0:c6ed639a9fae | 285 | if(backSpeed > 150){ |
G02_KAT | 0:c6ed639a9fae | 286 | backSpeed = 150; |
G02_KAT | 0:c6ed639a9fae | 287 | } |
G02_KAT | 0:c6ed639a9fae | 288 | |
G02_KAT | 0:c6ed639a9fae | 289 | //convert temperature (0-180 degrees C) |
G02_KAT | 0:c6ed639a9fae | 290 | |
G02_KAT | 0:c6ed639a9fae | 291 | //convert clutch position |
G02_KAT | 0:c6ed639a9fae | 292 | |
G02_KAT | 0:c6ed639a9fae | 293 | //convert accelerometer values |
G02_KAT | 0:c6ed639a9fae | 294 | |
G02_KAT | 0:c6ed639a9fae | 295 | } |
G02_KAT | 0:c6ed639a9fae | 296 | |
G02_KAT | 0:c6ed639a9fae | 297 | void getCAN(){ |
G02_KAT | 0:c6ed639a9fae | 298 | //Request Data from Display |
G02_KAT | 0:c6ed639a9fae | 299 | while(!can1.read(msg) && (timeCAN < TIME_CAN_MAX) ){ |
G02_KAT | 0:c6ed639a9fae | 300 | timeCAN++;//wait until data is received |
G02_KAT | 0:c6ed639a9fae | 301 | } |
G02_KAT | 0:c6ed639a9fae | 302 | |
G02_KAT | 0:c6ed639a9fae | 303 | if(timeCAN < TIME_CAN_MAX){ |
G02_KAT | 0:c6ed639a9fae | 304 | variable = msg.data[0];//if data is received store (x2, y2, z2, frontSpeed) |
G02_KAT | 0:c6ed639a9fae | 305 | printf("CAN message received: %d, %d, %d, %d id:%d\r\n", variable, msg.data[1],msg.data[2],msg.data[3],msg.id); |
G02_KAT | 0:c6ed639a9fae | 306 | x2 = msg.data[1]; |
G02_KAT | 0:c6ed639a9fae | 307 | y2 = msg.data[2]; |
G02_KAT | 0:c6ed639a9fae | 308 | z2 = msg.data[3]; |
G02_KAT | 0:c6ed639a9fae | 309 | frontSpeed = msg.data[4]; |
G02_KAT | 0:c6ed639a9fae | 310 | |
G02_KAT | 0:c6ed639a9fae | 311 | }else{ |
G02_KAT | 0:c6ed639a9fae | 312 | printf("CAN message timeout\r\n"); |
G02_KAT | 0:c6ed639a9fae | 313 | x2 = NULL;//if no data timeout and store as null |
G02_KAT | 0:c6ed639a9fae | 314 | y2 = NULL; |
G02_KAT | 0:c6ed639a9fae | 315 | z2 = NULL; |
G02_KAT | 0:c6ed639a9fae | 316 | frontSpeed = NULL; |
G02_KAT | 0:c6ed639a9fae | 317 | } |
G02_KAT | 0:c6ed639a9fae | 318 | |
G02_KAT | 0:c6ed639a9fae | 319 | timeCAN = 0; |
G02_KAT | 0:c6ed639a9fae | 320 | } |
G02_KAT | 0:c6ed639a9fae | 321 | |
G02_KAT | 0:c6ed639a9fae | 322 | //Send data to Display |
G02_KAT | 0:c6ed639a9fae | 323 | void sendCAN(){ |
G02_KAT | 0:c6ed639a9fae | 324 | |
G02_KAT | 0:c6ed639a9fae | 325 | //Cast to char |
G02_KAT | 0:c6ed639a9fae | 326 | batLev = (char) vBattery; //82-100 |
G02_KAT | 0:c6ed639a9fae | 327 | gearPosition = (char) gearPos; //0-3 |
G02_KAT | 0:c6ed639a9fae | 328 | fuelLevel = (char) fuelLev; //0-5 |
G02_KAT | 0:c6ed639a9fae | 329 | rpm_motor = (char) rpmMotor; //0-40 |
G02_KAT | 0:c6ed639a9fae | 330 | temperature = (char) temp; //0-180 |
G02_KAT | 0:c6ed639a9fae | 331 | wheelSpeed = (char) backSpeed; //0-150 |
G02_KAT | 0:c6ed639a9fae | 332 | |
G02_KAT | 0:c6ed639a9fae | 333 | char dataCAN[8] = {rpm_motor,fuelLevel,gearPosition,batLev,temperature, wheelSpeed,0,0}; |
G02_KAT | 0:c6ed639a9fae | 334 | |
G02_KAT | 0:c6ed639a9fae | 335 | //send data to display (gearPos, fuelLev, backSpeed, rpmMotor, batLev, temp) |
G02_KAT | 0:c6ed639a9fae | 336 | if (can1.write(CANMessage(0xFF01FF, dataCAN, 8, CANData, CANExtended))){ |
G02_KAT | 0:c6ed639a9fae | 337 | //CAN message sent |
G02_KAT | 0:c6ed639a9fae | 338 | }else{ |
G02_KAT | 0:c6ed639a9fae | 339 | //CAN message not sent |
G02_KAT | 0:c6ed639a9fae | 340 | } |
G02_KAT | 0:c6ed639a9fae | 341 | timeLoop = loopTime.read(); |
G02_KAT | 0:c6ed639a9fae | 342 | j--; |
G02_KAT | 0:c6ed639a9fae | 343 | wait(0.1); |
G02_KAT | 0:c6ed639a9fae | 344 | |
G02_KAT | 0:c6ed639a9fae | 345 | } |
G02_KAT | 0:c6ed639a9fae | 346 | |
G02_KAT | 0:c6ed639a9fae | 347 | //*****************************************************************Main Program************************************************************************************************* |
G02_KAT | 0:c6ed639a9fae | 348 | |
G02_KAT | 0:c6ed639a9fae | 349 | int main() { |
G02_KAT | 0:c6ed639a9fae | 350 | wdt.kick(5.0); |
G02_KAT | 0:c6ed639a9fae | 351 | killSwitch.rise(&trigger); |
G02_KAT | 0:c6ed639a9fae | 352 | loopTime.start(); |
G02_KAT | 0:c6ed639a9fae | 353 | USBSelect = 0; //enable USB channel 1 |
G02_KAT | 0:c6ed639a9fae | 354 | enA = 1; //enable analog mux |
G02_KAT | 0:c6ed639a9fae | 355 | enD = 1; //enable digital mux |
G02_KAT | 0:c6ed639a9fae | 356 | canEn = 0; //enable CAN |
G02_KAT | 0:c6ed639a9fae | 357 | can1.frequency(250000); |
G02_KAT | 0:c6ed639a9fae | 358 | |
G02_KAT | 0:c6ed639a9fae | 359 | //Set Time and Date |
G02_KAT | 0:c6ed639a9fae | 360 | //*****DO THIS THE FIRST TIME ONLY!******** |
G02_KAT | 0:c6ed639a9fae | 361 | //set_time(1328382900); //seconds since Jan. 1, 1970 - use Unix Time Converter http://www.epochconverter.com/ |
G02_KAT | 0:c6ed639a9fae | 362 | //started on Feb. 4, 2012 at 19:15:00 |
G02_KAT | 0:c6ed639a9fae | 363 | |
G02_KAT | 0:c6ed639a9fae | 364 | while(1){ //while forever |
G02_KAT | 0:c6ed639a9fae | 365 | |
G02_KAT | 0:c6ed639a9fae | 366 | //Create File |
G02_KAT | 0:c6ed639a9fae | 367 | time_t seconds = time(NULL); |
G02_KAT | 0:c6ed639a9fae | 368 | strftime(time1, 32, "%H_%M_%S", localtime(&seconds)); |
G02_KAT | 0:c6ed639a9fae | 369 | strftime(date, 32, "%m/%d/%y", localtime(&seconds)); |
G02_KAT | 0:c6ed639a9fae | 370 | sprintf(filename, "/fs/%s.csv", time1); |
G02_KAT | 0:c6ed639a9fae | 371 | MSCFileSystem fs("fs"); |
G02_KAT | 0:c6ed639a9fae | 372 | FILE *fp = fopen(filename, "w"); |
G02_KAT | 0:c6ed639a9fae | 373 | if(fp){ |
G02_KAT | 0:c6ed639a9fae | 374 | fprintf(fp,"Date(MM/DD/YY): %s \n", date); |
G02_KAT | 0:c6ed639a9fae | 375 | strftime(time2, 32, "%H:%M:%S", localtime(&seconds)); |
G02_KAT | 0:c6ed639a9fae | 376 | fprintf(fp,"Start Time: %s \n", time2); |
G02_KAT | 0:c6ed639a9fae | 377 | fprintf(fp,"Time, Gear Position, Fuel Level,Back Wheel Speed(km/h),Front Wheel Speed(km/h),Motor RPM,x1,y1,z1,x2,y2,z2,Temperature(C),Clutch Position(cm),Battery(V) \n"); |
G02_KAT | 0:c6ed639a9fae | 378 | fclose(fp); |
G02_KAT | 0:c6ed639a9fae | 379 | }else{//no USB |
G02_KAT | 0:c6ed639a9fae | 380 | } |
G02_KAT | 0:c6ed639a9fae | 381 | |
G02_KAT | 0:c6ed639a9fae | 382 | i=100; //print to USB file 100 times before opening a new file |
G02_KAT | 0:c6ed639a9fae | 383 | while(i > 0){ |
G02_KAT | 0:c6ed639a9fae | 384 | //Get a CAN message |
G02_KAT | 0:c6ed639a9fae | 385 | getCAN(); |
G02_KAT | 0:c6ed639a9fae | 386 | //Get sensor data |
G02_KAT | 0:c6ed639a9fae | 387 | Polling(); |
G02_KAT | 0:c6ed639a9fae | 388 | //Translate raw sensor data |
G02_KAT | 0:c6ed639a9fae | 389 | translateData(); |
G02_KAT | 0:c6ed639a9fae | 390 | //Print to USB |
G02_KAT | 0:c6ed639a9fae | 391 | if(fp != NULL){ |
G02_KAT | 0:c6ed639a9fae | 392 | FILE *fp = fopen("/fs/data.csv", "a+"); |
G02_KAT | 0:c6ed639a9fae | 393 | time_t seconds = time(NULL); |
G02_KAT | 0:c6ed639a9fae | 394 | strftime(time3, 32, "%H:%M:%S", localtime(&seconds)); |
G02_KAT | 0:c6ed639a9fae | 395 | fprintf(fp,"%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f \n",time3, gearPos,fuelLev,backSpeed,frontSpeed,motorRPM,x1,y1,z1,x2,y2,z2,temp,clutch,batteryVoltage); |
G02_KAT | 0:c6ed639a9fae | 396 | fclose(fp); |
G02_KAT | 0:c6ed639a9fae | 397 | fp = NULL; |
G02_KAT | 0:c6ed639a9fae | 398 | |
G02_KAT | 0:c6ed639a9fae | 399 | }else{//no USB |
G02_KAT | 0:c6ed639a9fae | 400 | } |
G02_KAT | 0:c6ed639a9fae | 401 | |
G02_KAT | 0:c6ed639a9fae | 402 | //Send a CAN message |
G02_KAT | 0:c6ed639a9fae | 403 | sendCAN(); |
G02_KAT | 0:c6ed639a9fae | 404 | i--; |
G02_KAT | 0:c6ed639a9fae | 405 | } //close while i loop |
G02_KAT | 0:c6ed639a9fae | 406 | |
G02_KAT | 0:c6ed639a9fae | 407 | timeLoop = loopTime.read(); |
G02_KAT | 0:c6ed639a9fae | 408 | loopTime.reset(); |
G02_KAT | 0:c6ed639a9fae | 409 | |
G02_KAT | 0:c6ed639a9fae | 410 | wdt.kick(); |
G02_KAT | 0:c6ed639a9fae | 411 | }//close forever while loop |
G02_KAT | 0:c6ed639a9fae | 412 | }//close main |