The Code Repository for the REV0 Steering Wheel.

Dependencies:   CANBuffer KS0108_fork mbed-rtos mbed CAN Addresses

Fork of REVO_Updated_Steering by Penn Electric

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Steering.cpp Source File

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 }