The Code Repository for the REV0 Steering Wheel.
Dependencies: CANBuffer KS0108_fork mbed-rtos mbed CAN Addresses
Fork of REVO_Updated_Steering by
Steering.cpp
00001 #include "Steering.h" 00002 // To-Do: 00003 // Look at SYS management CAN translations: shutdown switches, DCDC status, & IMD (this is a resistance, in ohms) 00004 // Figure out screen/variable updating options (hardware filter), NVIC_SetPriority(CAN_IRQn,####)LPC17xx.h 00005 // Firgure out fault protocall 00006 00007 void Init(); 00008 void ProcessButtons(void const *args); 00009 void RequestStatusChange(); 00010 void ResetSteeringWheel(); 00011 void ResetCar(); 00012 void ProcessCANMsg(CANMessage& msg); 00013 void UpdateDisplay(); 00014 void ProcessButtons(void const *args); 00015 void ConnectedStatusCANMsg(); 00016 00017 float CANFloat; 00018 float CANFloat2; 00019 Ticker StatusMsg; 00020 00021 int main() 00022 { 00023 Init(); 00024 00025 CANMessage Rxmsg; 00026 00027 Thread Thread2(ProcessButtons); 00028 Thread Thread1(DisplayCurrScreen); 00029 00030 while(1) { 00031 if (SteeringCANPort.rxRead(Rxmsg)) { 00032 ProcessCANMsg(Rxmsg); 00033 } 00034 else 00035 Thread::yield(); 00036 } 00037 } 00038 00039 00040 void Init() 00041 { 00042 StatusMsg.attach(&ConnectedStatusCANMsg,0.1); 00043 pc.baud(921600); 00044 BLButtonRed; 00045 BRButtonGreen; 00046 TLButtonGreen; 00047 TRButtonGreen; 00048 //initialize screen Startup Process 00049 wait(2); 00050 } 00051 00052 00053 void ProcessButtons(void const *args) 00054 { 00055 while(1) { 00056 Thread::wait(50); 00057 if(biSWBR.read()) { 00058 Thread::wait(750); 00059 if (biSWBR.read()) { 00060 ResetCar(); 00061 } 00062 NVIC_SystemReset(); 00063 ResetSteeringWheel(); 00064 } 00065 00066 if(biSWBL.read()) { 00067 Thread::wait(1000); 00068 if (biSWBL.read()) { 00069 RequestStatusChange(); 00070 } 00071 } 00072 00073 if(biSWTR.read() && CurrScreen != 5) { 00074 //If the toggle button is pressed and the screen isn't on Fault_Screen 00075 ToggleScreen(); 00076 Thread::wait(250); 00077 } else if (biSWTR.read() && CurrScreen == 5) {// If the screen was on Fault, go to Home 00078 CurrScreen = 0; 00079 Thread::wait(250); 00080 } 00081 00082 if(biSWTL.read() && CurrScreen != 0) { 00083 //If the Home button is pressed and the screen isn't on Fault_Screen 00084 CurrScreen = 0; 00085 Thread::wait(250); 00086 } else if (biSWTL.read() && CurrScreen == 0) {// If the screen was on Fault, go to Home 00087 CurrScreen = 5; 00088 Thread::wait(250); 00089 } 00090 } 00091 } 00092 00093 00094 void UpdateDisplay() 00095 { 00096 } 00097 00098 00099 void ProcessCANMsg(CANMessage& Rxmsg) 00100 { 00101 if (SteeringCANPort.rxRead(Rxmsg)) { 00102 // Printing CAN message data: 00103 // printf("Message ID: 0x%x len: %d hex: 0x%x float: %f\r\n", Rxmsg.id, Rxmsg.len, *((int*)((void*)(&Rxmsg.data[0]))), *((float*)((void*)(&Rxmsg.data[0])))); 00104 // for (int i=0; i < Rxmsg.len; i++) printf("D[%d]: %x ", i, Rxmsg.data[i]); 00105 if (Rxmsg.id == AMS_MODE_ID) { 00106 if(Rxmsg.data[0] != (1<<3)) 00107 DriveStatusRequestBuffer=1; 00108 else 00109 DriveStatusRequestBuffer=0; 00110 } 00111 00112 if (Rxmsg.id == AMS_POWER_ID) { 00113 CANFloat = GetFloat; 00114 LEDBar = (CANFloat/85.0)*(2.6/3.3); 00115 } 00116 00117 switch (CurrScreen) { 00118 case HOME_SCREEN: 00119 switch (Rxmsg.id) { 00120 00121 // HOME SCREEN ******************************************************************************************* 00122 // Pedal Test 00123 /*case PCM_PEDALS_ID: 00124 CANFloat = GetFloat; 00125 if (abs(CANFloat*100 - float (*AccPedalBuffer)) >= 1) { 00126 sprintf(AccPedalBuffer,"%3.2d", int(CANFloat*100)); 00127 display.PutString(1,40,AccPedalBuffer); 00128 } 00129 CANFloat2 = GetFloat4; 00130 if (abs(CANFloat2*100 - float (*BrkPedalBuffer)) >= 1) { 00131 sprintf(BrkPedalBuffer,"%3.2d", int(CANFloat2*100)); 00132 display.PutString(1,60,BrkPedalBuffer); 00133 } 00134 break;*/ 00135 00136 case AMS_SOC_ID: 00137 CANFloat = GetFloat; 00138 //if (abs(CANFloat*100 - *BigBatLifeBuffer) >= 1) { 00139 sprintf(BigBatLifeBuffer,"%3.2d", int(CANFloat*100)); // Big battery life percentage 00140 display.PutString(1,40,BigBatLifeBuffer); 00141 //} 00142 break; 00143 case SYS_MGMT_GLV_SOC_ID: 00144 CANFloat = GetFloat; 00145 //if (abs(CANFloat*100 - *SmallBatLifeBuffer) >= 1) { 00146 sprintf(SmallBatLifeBuffer,"%3.2d", int(CANFloat*100)); // Small battery life percentage 00147 display.PutString(1,60,SmallBatLifeBuffer); 00148 //} 00149 break; 00150 case PCM_FRPM_ID: 00151 CANFloat = GetFloat; 00152 CANFloat2 = GetFloat4; 00153 //if (abs((CANFloat+CANFloat2)*WheelCircumference*30 - *CarSpdBuffer) >= 1) { 00154 sprintf(CarSpdBuffer,"%3.2d", int((CANFloat+CANFloat2)*WheelCircumference*30)); // Miles per hour 00155 display.PutString(1,108,CarSpdBuffer); 00156 //} 00157 break; 00158 case AMS_TEMP_MMA_ID_BASE: 00159 CANFloat2 = GetFloat4; 00160 //if (abs((CANFloat2*9.0/5.0)+32 - *MaxBatTBuffer) >=1) { 00161 sprintf(MaxBatTBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); 00162 display.PutString(3,103,MaxBatTBuffer); 00163 //} 00164 CANFloat = GetFloat8; 00165 //if (abs((CANFloat*9.0/5.0)+32 - *AvgBatTBuffer) >=1) { 00166 sprintf(AvgBatTBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // Degrees F 00167 display.PutString(3,39,AvgBatTBuffer); 00168 //} 00169 break; 00170 case PCM_MOTEMP_ID: 00171 CANFloat = GetFloat; 00172 //if (abs((CANFloat*9.0/5.0)+32 - *LMtrTmpBuffer) >= 1) { 00173 sprintf(LMtrTmpBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); 00174 display.PutString(5,34,LMtrTmpBuffer); 00175 //} 00176 CANFloat2 = GetFloat4; 00177 //if (abs((CANFloat2*9.0/5.0)+32 - *RMtrTmpBuffer) >= 1) { 00178 sprintf(RMtrTmpBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); 00179 display.PutString(5,34,RMtrTmpBuffer); 00180 //} 00181 break; 00182 default: 00183 break; 00184 } 00185 break; 00186 // BATTERY SCREEN*********************************************************************************** 00187 case BATTERY_SCREEN: 00188 switch (Rxmsg.id) { 00189 case AMS_VOLTAGE_ID: 00190 CANFloat = GetFloat; 00191 //if (abs(CANFloat - *BigBatVoltBuffer) >= 0.1) { 00192 sprintf(BigBatVoltBuffer,"%3.2d", int(CANFloat)); // Volts 00193 display.PutString(1,10,BigBatVoltBuffer); 00194 //} 00195 break; 00196 case AMS_POWER_ID: 00197 CANFloat = GetFloat; 00198 LEDBar = (CANFloat/85.0)*(2.6/3.3); 00199 //if (abs(CANFloat - *BigBatPowerBuffer) >= 1) { 00200 sprintf(BigBatPowerBuffer,"%3.2d", int(CANFloat)); // Watts 00201 display.PutString(1,55,BigBatPowerBuffer); 00202 //} 00203 break; 00204 case AMS_CURRENT_ID: 00205 CANFloat = GetFloat; 00206 //if (abs(CANFloat - *BigBatCurrentBuffer) >= 0.2) { 00207 sprintf(BigBatCurrentBuffer,"%3.2d", int(CANFloat)); // Amps 00208 display.PutString(1,100,BigBatCurrentBuffer); 00209 //} 00210 break; 00211 case AMS_CELLV_MMA_ID_BASE: 00212 CANFloat2 = GetFloat4; 00213 //if (abs(CANFloat2 - *VmaxBuffer) >= 0.1) { 00214 sprintf(VmaxBuffer,"%3.2d", int(CANFloat2)); 00215 display.PutString(3,20,VmaxBuffer); 00216 //} 00217 CANFloat = GetFloat; 00218 //if (abs(CANFloat - *VminBuffer) >= 0.1) { 00219 sprintf(VminBuffer,"%3.2d", int(CANFloat)); 00220 display.PutString(3,67,VminBuffer); 00221 //} 00222 CANFloat = GetFloat8; 00223 //if (abs(CANFloat - *VavgBuffer) >= 0.1) { 00224 sprintf(VavgBuffer,"%3.2d", int(CANFloat)); // Volts 00225 display.PutString(3,108,VavgBuffer); 00226 // 00227 break; 00228 case AMS_TEMP_MMA_ID_BASE: 00229 CANFloat = GetFloat; 00230 //if (abs((CANFloat*9.0/5.0)+32 - *MinBatTBuffer) >= 1) { 00231 sprintf(MinBatTBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); 00232 display.PutString(5,67,MinBatTBuffer); 00233 //} 00234 CANFloat2 = GetFloat4; 00235 //if (abs((CANFloat2*9.0/5.0)+32 - *MaxBatTBuffer) >=1) { 00236 sprintf(MaxBatTBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); 00237 display.PutString(5,20,MaxBatTBuffer); 00238 //} 00239 CANFloat = GetFloat8; 00240 //if (abs((CANFloat*9.0/5.0)+32 - *AvgBatTBuffer) >=1) { 00241 sprintf(AvgBatTBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // Degrees F 00242 display.PutString(5,108,AvgBatTBuffer); 00243 //} 00244 break; 00245 case AMS_BOARDTEMP_ID: 00246 CANFloat = GetFloat; 00247 //if (abs((CANFloat*9.0/5.0)+32 - *BoardTempBuffer) >= 1) { 00248 sprintf(BoardTempBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // Degrees F 00249 display.PutString(7,87,BoardTempBuffer); 00250 //} 00251 break; 00252 default: 00253 break; 00254 } 00255 break; 00256 // MOTOR SCREEN***************************************************************** 00257 case MOTOR_SCREEN: 00258 switch (Rxmsg.id) { 00259 case PCM_MOTEMP_ID: 00260 CANFloat = GetFloat; 00261 //if (abs((CANFloat*9.0/5.0)+32 - *LMtrTmpBuffer) >= 1) { 00262 sprintf(LMtrTmpBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); 00263 display.PutString(1,34,LMtrTmpBuffer); 00264 //} 00265 CANFloat2 = GetFloat4; 00266 //if (abs((CANFloat2*9.0/5.0)+32 - *RMtrTmpBuffer) >= 1) { 00267 sprintf(RMtrTmpBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); 00268 display.PutString(1,98,LMtrTmpBuffer); 00269 //} 00270 break; 00271 case PCM_AIRTEMP_ID: 00272 CANFloat = GetFloat; 00273 //if (abs((CANFloat*9.0/5.0)+32 - *LAirTmpBuffer) >= 1) { 00274 sprintf(LAirTmpBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); 00275 display.PutString(2,34,LAirTmpBuffer); 00276 //} 00277 CANFloat2 = GetFloat4; 00278 //if (abs((CANFloat2*9.0/5.0)+32 - *RAirTmpBuffer) >= 1) { 00279 sprintf(RAirTmpBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); // Degrees F 00280 display.PutString(2,98,RAirTmpBuffer); 00281 //} 00282 break; 00283 case PCM_IGBTTEMP_ID: 00284 CANFloat = GetFloat; 00285 //if (abs((CANFloat*9.0/5.0)+32 - *LIGBTmpBuffer) >= 1) { 00286 sprintf(LIGBTmpBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); 00287 display.PutString(3,34,LIGBTmpBuffer); 00288 //} 00289 CANFloat2 = GetFloat4; 00290 //if (abs((CANFloat2*9.0/5.0)+32 - *RIGBTmpBuffer) >= 1) { 00291 sprintf(RIGBTmpBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); // Degrees F 00292 display.PutString(3,98,RIGBTmpBuffer); 00293 //} 00294 break; 00295 case PCM_RPM_ID: 00296 CANFloat = GetFloat; 00297 //if (abs(CANFloat - *Rpm_LBuffer) >= 1) { 00298 sprintf(Rpm_LBuffer,"%3.2d", int(CANFloat)); 00299 display.PutString(5,30,Rpm_LBuffer); 00300 //} 00301 CANFloat2 = GetFloat4; 00302 //if (abs(CANFloat2 - *Rpm_RBuffer) >= 1) { 00303 sprintf(Rpm_RBuffer,"%3.2d", int(CANFloat2)); 00304 display.PutString(5,107,Rpm_RBuffer); 00305 //} 00306 break; 00307 case PCM_TORQUERQ_ID: 00308 CANFloat = GetFloat; 00309 //if (abs(CANFloat*100 - *TRequestBufferL) >= 1) { 00310 sprintf(TRequestBufferL,"%3.2d", int(CANFloat*100)); // Percentage 00311 display.PutString(7,89,TRequestBufferL); 00312 //} 00313 CANFloat2 = GetFloat4; 00314 //if (abs(CANFloat2*100 - *TRequestBufferR) >= 1) { 00315 sprintf(TRequestBufferR,"%3.2d", int(CANFloat2*100)); // Percentage 00316 display.PutString(7,89,TRequestBufferR); 00317 //} 00318 break; 00319 default: 00320 break; 00321 } 00322 break; 00323 00324 // SYSTEM MANAGEMENT SCREEN*************************************************** 00325 case SYS_MGMT_SCREEN: 00326 switch (Rxmsg.id) { 00327 case SYS_MGMT_GLV_CURRENT_ID: 00328 CANFloat = GetFloat; 00329 //if (abs(CANFloat - *SmallBatCurrentBuffer) >= 0.2) { 00330 sprintf(SmallBatCurrentBuffer,"%3.2d", int(CANFloat)); // Amps 00331 display.PutString(1,30,SmallBatCurrentBuffer); 00332 //} 00333 break; 00334 case SYS_MGMT_SWITCHES_ID: 00335 CANFloat = GetFloat; 00336 sprintf(ShtdSwtchBuffer,"%3.2d", int(CANFloat)); // How the heck are we interpreting this data 00337 display.PutString(1,108,ShtdSwtchBuffer); 00338 break; 00339 case SYS_MGMT_PWM_FAN_ID: 00340 CANFloat = GetFloat; 00341 //if (abs(CANFloat*100 - *Fan1Buffer) >= 1) { 00342 sprintf(Fan1Buffer,"%3.2d", int(CANFloat*100)); 00343 display.PutString(3,30,Fan1Buffer); 00344 //} 00345 CANFloat2 = GetFloat4; 00346 //if (abs(CANFloat2*100 - *Fan1Buffer) >= 1) { 00347 sprintf(Fan2Buffer,"%3.2d", int(CANFloat2*100)); 00348 display.PutString(3,107,Fan2Buffer); 00349 //} 00350 break; 00351 case SYS_MGMT_PWM_PUMP_ID: 00352 CANFloat = GetFloat; 00353 //if (abs(CANFloat*100 - *Pump1Buffer) >= 1) { 00354 sprintf(Pump1Buffer,"%3.2d", int(CANFloat*100)); 00355 display.PutString(5,30,Pump1Buffer); 00356 //} 00357 CANFloat2 = GetFloat4; 00358 //if (abs(CANFloat2*100 - *Pump2Buffer) >= 1) { 00359 sprintf(Pump2Buffer,"%3.2d", int(CANFloat2*100)); 00360 display.PutString(5,107,Pump2Buffer); 00361 //} 00362 break; 00363 case SYS_MGMT_DCDC_STATUS_ID: 00364 CANFloat = GetFloat; 00365 sprintf(DCDCBuffer,"%3.2d", int(CANFloat)); // How the heck are we interpreting this data 00366 display.PutString(7,30,DCDCBuffer); 00367 break; 00368 case SYS_MGMT_IMD_RESIST_ID: 00369 CANFloat = GetFloat; 00370 //if (abs(CANFloat - *IMDRBuffer) >= 1) { 00371 sprintf(IMDRBuffer,"%3.2d", int(CANFloat)); 00372 display.PutString(7,82,IMDRBuffer); 00373 //} 00374 break; 00375 default: 00376 break; 00377 } 00378 break; 00379 00380 // CHARGE SCREEN ************************************************************* 00381 case CHARGE_SCREEN: 00382 switch (Rxmsg.id) { 00383 case CHARGER_CHARGING_CURRENT_ID: 00384 CANFloat = GetFloat; 00385 //if (abs(CANFloat - *ChargeCurrBuffer) >= 0.1) { 00386 sprintf(ChargeCurrBuffer,"%3.2d", int(CANFloat)); // Amps 00387 display.PutString(3,94,ChargeCurrBuffer); 00388 //} 00389 break; 00390 case CHARGER_CHARGING_VOLTAGE_ID: 00391 CANFloat = GetFloat; 00392 //if (abs(CANFloat - *BigBatVoltBuffer) >= 0.1) { 00393 sprintf(BigBatVoltBuffer,"%3.2d", int(CANFloat)); // Volts 00394 display.PutString(3,94,BigBatVoltBuffer); 00395 //} 00396 break; 00397 default: 00398 break; 00399 } 00400 break; 00401 default: 00402 break; 00403 } 00404 } 00405 } 00406 00407 void ConnectedStatusCANMsg() 00408 { 00409 CANMessage ConnectedStatus(STEERING_WHEEL_STATUS_ID, &ConnectedStatusBuffer,1); 00410 SteeringCANPort.txWrite(ConnectedStatus); 00411 } 00412 00413 00414 void RequestStatusChange() 00415 { 00416 CANMessage TxDriveStatusRequest(STEERING_WHEEL_DRIVE_STATUS_REQUEST_ID , &DriveStatusRequestBuffer,1); 00417 for (int j=0; j<10; j++) { 00418 SteeringCANPort.txWrite(TxDriveStatusRequest); 00419 } 00420 display.PutString(7,0," DRIVE REQUEST SENT "); 00421 Thread::wait(750); 00422 PrevScreen = !CurrScreen; // To force a screen update 00423 } 00424 00425 00426 void ResetSteeringWheel() 00427 { 00428 NVIC_SystemReset(); 00429 } 00430 00431 00432 void ResetCar() 00433 { 00434 CANMessage TxCarReset(STEERING_WHEEL_CAR_RESET_ID,&TxResetBuffer,1); 00435 for (int k=0; k<10; k++) { 00436 SteeringCANPort.txWriteDirect(TxCarReset); 00437 } 00438 }
Generated on Fri Jul 22 2022 22:40:57 by
1.7.2
