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
- Committer:
- tmccurbin
- Date:
- 2015-01-29
- Revision:
- 36:8544a8900884
- Parent:
- 35:b42afc973902
- Child:
- 38:d04a430d7fe3
File content as of revision 36:8544a8900884:
#include "Steering.h" // To-Do: // Look at SYS management CAN translations: shutdown switches, DCDC status, & IMD status // Figure out screen/variable updating options // Firgure out fault protocall void Init(); void ProcessButtons(void const *args); void RequestStatusChange(); void ResetSteeringWheel(); void ResetCar(); void ProcessCANMsg(CANMessage& msg); void UpdateDisplay(); void ProcessButtons(void const *args); void ConnectedStatusCANMsg(); float CANFloat; float CANFloat2; Ticker StatusMsg; int main() { Init(); display.GotoXY(10,16); display.SelectFont(Arial_14,BLACK,ReadData); display.PrintString("Penn Electric Racing"); wait(2); display.ClearScreen(); display.GotoXY(10,16); display.PrintString("Live the dream."); wait(2); Thread Thread2(ProcessButtons); Thread Thread1(DisplayCurrScreen); while(1) { CANMessage Rxmsg; if (SteeringCANPort.rxRead(Rxmsg)) { ProcessCANMsg(Rxmsg); } } } void Init() { StatusMsg.attach(&ConnectedStatusCANMsg,0.1); pc.baud(921600); BLButtonRed; BRButtonGreen; TLButtonGreen; TRButtonGreen; DriveStatus = 0; // Off //initialize screen Startup Process wait(2); } void ProcessButtons(void const *args) { while(1) { Thread::wait(50); if(biSWBR.read()) { Thread::wait(750); if (biSWBR.read()) { ResetCar(); } NVIC_SystemReset(); ResetSteeringWheel(); } if(biSWBL.read()) { Thread::wait(1000); if (biSWBL.read()) { RequestStatusChange(); } } if(biSWTR.read() && CurrScreen != 5) { //If the toggle button is pressed and the screen isn't on Fault_Screen ToggleScreen(); Thread::wait(250); } else if (biSWTR.read() && CurrScreen == 5) {// If the screen was on Fault, go to Home CurrScreen = 0; Thread::wait(250); } if(biSWTL.read() && CurrScreen != 0) { //If the Home button is pressed and the screen isn't on Fault_Screen CurrScreen = 0; Thread::wait(250); } else if (biSWTL.read() && CurrScreen == 0) {// If the screen was on Fault, go to Home CurrScreen = 5; Thread::wait(250); } } } void UpdateDisplay() { } void ProcessCANMsg(CANMessage& Rxmsg) { if (SteeringCANPort.rxRead(Rxmsg)) { 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])))); for (int i=0; i < Rxmsg.len; i++) printf("D[%d]: %x ", i, Rxmsg.data[i]); switch (Rxmsg.id) { // HOME SCREEN ******************************************************************************************* case SOC_TX_ID: CANFloat = GetFloat; sprintf(BigBatLifeBuffer,"%3.2d", int(CANFloat*100)); // Big battery life percentage display.PutString(1,40,BigBatLifeBuffer); break; case SYS_GLV_SOC_ID: CANFloat = GetFloat; sprintf(SmallBatLifeBuffer,"%3.2d", int(CANFloat*100)); // Small battery life percentage display.PutString(1,60,SmallBatLifeBuffer); break; case PCM_FRPM_ID: CANFloat = GetFloat; CANFloat2 = GetFloat4; sprintf(CarSpdBuffer,"%3.2d", int((CANFloat+CANFloat2)*WheelCircumference*30)); // Miles per hour display.PutString(1,108,CarSpdBuffer); case TEMP_MMA_TX_ID_BASE2: CANFloat = GetFloat; sprintf(AvgBatTBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // Degrees F display.PutString(3,39,AvgBatTBuffer); //display.PutString(5,108,AvgBatTBuffer); this is for the battery screen case TEMP_MMA_TX_ID_BASE: CANFloat2 = GetFloat4; sprintf(MaxBatTBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); // Figure out Max/Min and Figure out various screen display display.PutString(3,103,MaxBatTBuffer); //display.PutString(5,20,MaxBatTBuffer); this is for the battery screen CANFloat = GetFloat; sprintf(MinBatTBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); //display.PutString(5,67,MinBatTBuffer); this is for the battery screen case MOC_MOTEMP_ID: CANFloat = GetFloat; sprintf(LMtrTmpBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // We need to figure out how to handle the bytes for left and right motors display.PutString(5,34,LMtrTmpBuffer); // display.PutString(1,34,LMtrTmpBuffer); this is for the motor screen CANFloat2 = GetFloat4; sprintf(RMtrTmpBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); // We need to figure out how to handle the bytes for left and right motors display.PutString(5,34,RMtrTmpBuffer); //display.PutString(1,98,LMtrTmpBuffer); this is for the motor screen // BATTERY SCREEN*********************************************************************************** case VOLTAGE_TX_ID: CANFloat = GetFloat; sprintf(BigBatVoltBuffer,"%3.2d", int(CANFloat)); // Volts //display.PutString(1,10,BigBatVoltBuffer); //display.PutString(3,94,BigBatVoltBuffer); this is for the charging screen case POWER_TX_ID: CANFloat = GetFloat; sprintf(BigBatPowerBuffer,"%3.2d", int(CANFloat)); // Watts //display.PutString(1,55,BigBatPowerBuffer); case CURRENT_TX_ID: CANFloat = GetFloat; sprintf(BigBatCurrentBuffer,"%3.2d", int(CANFloat)); // Amps //display.PutString(1,100,BigBatCurrentBuffer); case CELLV_MMA_TX_ID_BASE: CANFloat2 = GetFloat4; sprintf(VmaxBuffer,"%3.2d", int(CANFloat2)); // We need to figure out how to handle max and min //display.PutString(3,20,VmaxBuffer); CANFloat = GetFloat; sprintf(VminBuffer,"%3.2d", int(CANFloat)); //display.PutString(3,67,VminBuffer); case CELLV_MMA_TX_ID_BASE2: CANFloat = GetFloat; sprintf(VavgBuffer,"%3.2d", int(CANFloat)); // Volts //display.PutString(3,108,VavgBuffer); case BOARDTEMP_TX_ID: CANFloat = GetFloat; sprintf(BoardTempBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // Degrees F //display.PutString(7,87,BoardTempBuffer); // MOTOR SCREEN***************************************************************** case MOC_AIRTEMP_ID: CANFloat = GetFloat; sprintf(LAirTmpBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // Figure out the left and the right //display.PutString(2,34,LAirTmpBuffer); CANFloat2 = GetFloat4; sprintf(RAirTmpBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); // Degrees F //display.PutString(2,98,RAirTmpBuffer); case MOC_IGBTTEMP_ID: CANFloat = GetFloat; sprintf(LIGBTmpBuffer,"%3.2d", int((CANFloat*9.0/5.0)+32)); // Figure out the left and the right //display.PutString(3,34,LIGBTmpBuffer); CANFloat2 = GetFloat4; sprintf(RIGBTmpBuffer,"%3.2d", int((CANFloat2*9.0/5.0)+32)); // Degrees F //display.PutString(3,98,RIGBTmpBuffer); case MOC_RPM_ID: CANFloat = GetFloat; sprintf(Rpm_LBuffer,"%3.2d", int(CANFloat)); // Figure out the left and the right //display.PutString(5,30,Rpm_LBuffer); CANFloat2 = GetFloat4; sprintf(Rpm_RBuffer,"%3.2d", int(CANFloat2)); //display.PutString(5,107,Rpm_RBuffer); case PCM_TORQUERQ_ID: CANFloat = GetFloat; sprintf(TRequestBufferL,"%3.2d", int(CANFloat*100)); // Percentage //display.PutString(7,89,TRequestBufferL); CANFloat2 = GetFloat4; sprintf(TRequestBufferR,"%3.2d", int(CANFloat2*100)); // Percentage //display.PutString(7,89,TRequestBufferR); // SYSTEM MANAGEMENT SCREEN*************************************************** case SYS_GLV_CURRENT_ID: CANFloat = GetFloat; sprintf(SmallBatCurrentBuffer,"%3.2d", int(CANFloat)); // Amps //display.PutString(1,30,SmallBatCurrentBuffer); case SYS_SWITCHES_ID: CANFloat = GetFloat; sprintf(ShtdSwtchBuffer,"%3.2d", int(CANFloat)); // How the heck are we interpreting this data //display.PutString(1,108,ShtdSwtchBuffer); case SYS_PWM_FAN_ID: CANFloat = GetFloat; sprintf(Fan1Buffer,"%3.2d", int(CANFloat*100)); // Duty Cycle. Figure out the left and the right //display.PutString(3,30,Fan1Buffer); CANFloat2 = GetFloat4; sprintf(Fan2Buffer,"%3.2d", int(CANFloat2*100)); //display.PutString(3,107,Fan2Buffer); case SYS_PWM_PUMP_ID: CANFloat = GetFloat; sprintf(Pump1Buffer,"%3.2d", int(CANFloat*100)); // Duty Cycle. Figure out the left and the right //display.PutString(5,30,Pump1Buffer); CANFloat2 = GetFloat4; sprintf(Pump2Buffer,"%3.2d", int(CANFloat2*100)); //display.PutString(5,107,Pump2Buffer); case SYS_DCDC_STATUS_ID: CANFloat = GetFloat; sprintf(DCDCBuffer,"%3.2d", int(CANFloat)); // How the heck are we interpreting this data //display.PutString(7,30,DCDCBuffer); case SYS_IMD_RESIST_ID: CANFloat = GetFloat; sprintf(IMDRBuffer,"%3.2d", int(CANFloat)); // How the heck are we interpreting this data //display.PutString(7,107,IMDRBuffer); // CHARGER SCREEN ************************************************************* case CHARGECURR_TX_ID: CANFloat = GetFloat; sprintf(ChargeCurrBuffer,"%3.2d", int(CANFloat)); // Amps //display.PutString(3,94,ChargeCurrBuffer); // OTHER ********************************************************************** case MODE_TX_ID: CANFloat = GetFloat; sprintf(&DriveStatus,"%3.2d", int(CANFloat)); //confirm that I am interpreting this correctly if (DriveStatus == 1) { BLButtonGreen; } else { BLButtonRed; } default: break; } } } void ConnectedStatusCANMsg() { CANMessage ConnectedStatus(0x600, &ConnectedStatusBuffer,1); SteeringCANPort.txWrite(ConnectedStatus); } void RequestStatusChange() { DriveStatusRequestBuffer = !DriveStatus; CANMessage TxDriveStatusRequest(0x601, &DriveStatusRequestBuffer,1); for (int j=0; j<10; j++) { SteeringCANPort.txWrite(TxDriveStatusRequest); } display.PutString(7,0," DRIVE REQUEST SENT "); Thread::wait(750); PrevScreen = !CurrScreen; // To force a screen update } void ResetSteeringWheel() { NVIC_SystemReset(); } void ResetCar() { CANMessage TxCarReset(0x602,&TxResetBuffer,1); for (int k=0; k<10; k++) { SteeringCANPort.txWriteDirect(TxCarReset); } }