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

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);
    }
}