Wrapped Freescale Cup code for the UT CS summer boot camp.

Dependencies:   MMA8451Q mbed

Includes/CarBaseAPI.h

Committer:
ccoleman
Date:
2013-08-23
Revision:
8:eb1307992dd1
Parent:
7:2901515f14c2

File content as of revision 8:eb1307992dd1:

#ifndef CAR_BASE_API_046o73i4277823
#define CAR_BASE_API_046o73i4277823

#include <stdarg.h>
#include <MMA8451Q.h>
#include "TFC.h"

Ticker TFC_TickerObj;
Serial pc(USBTX,USBRX);
// AnalogIn pot (p15);

#define NUM_TFC_TICKERS 4
#define MMA8451_I2C_ADDRESS (0x1d<<1)
// Define serial ports
volatile uint32_t TFC_Ticker[NUM_TFC_TICKERS];


float turnOffset = 0.0;// the turn turnOffset
float crashSensitivity = 0.5; // crash sensitivity
float stopSensitivity = 0.2; // stop sensitivity
bool debug = false;

MMA8451Q accelerometer(PTE25,PTE24, MMA8451_I2C_ADDRESS);

void TFC_TickerUpdate()
{
    int i;
    for(i=0; i<NUM_TFC_TICKERS; i++)
    {
        if(TFC_Ticker[i]<0xFFFFFFFF)
        {
           TFC_Ticker[0]++;
        }
    }
}

void utrace(const char* msg, ...){
    char buffer[256];
    va_list args;
    va_start (args, msg);
    vsprintf (buffer,msg, args);
    va_end (args);
    pc.printf(buffer);
}

void flushSerialBuffer(void) { while (pc.readable()) { pc.getc(); } return; } 

void _blinkSequence(bool left){
    static float w = 0.125;
    if (left) {
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED0_TOGGLE;
        wait(w);
        TFC_BAT_LED0_TOGGLE;
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED1_TOGGLE;
        wait(w);
        TFC_BAT_LED1_TOGGLE;
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED2_TOGGLE;
        wait(w);
        TFC_BAT_LED2_TOGGLE;
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED3_TOGGLE;    
        wait(w);
        TFC_BAT_LED3_TOGGLE;    
    } else {
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED3_TOGGLE;
        wait(w);
        TFC_BAT_LED3_TOGGLE;
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED2_TOGGLE;
        wait(w);
        TFC_BAT_LED2_TOGGLE;
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED1_TOGGLE;
        wait(w);
        TFC_BAT_LED1_TOGGLE;
        if (TFC_PUSH_BUTTON_0_PRESSED) return;
        TFC_BAT_LED0_TOGGLE;
        wait(w);            
        TFC_BAT_LED0_TOGGLE;
    }
}

void blinkSequence(){
    _blinkSequence(false);
    _blinkSequence(true);
}

void blinkSequence2(){
    float w = 0.125;
    TFC_BAT_LED0_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);
    TFC_BAT_LED1_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);
    TFC_BAT_LED2_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);
    TFC_BAT_LED3_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);
    TFC_BAT_LED3_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);
    TFC_BAT_LED2_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);
    TFC_BAT_LED1_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);
    TFC_BAT_LED0_TOGGLE;
    if (TFC_PUSH_BUTTON_0_PRESSED) return;
    wait(w);    
}
/* turn the car */
void turn(float d, float turnAngle){
    if (turnAngle >0.7)
        turnAngle = 0.7;
    else if (turnAngle < -0.7)
        turnAngle = -0.7;
    if(debug) utrace("turn(%f)\r\n",turnAngle);
    TFC_SetServo(d,turnAngle + turnOffset);
}

void _initialize(){
    if(debug) utrace("initialize()\r\n");
    //TFC_TickerObj.attach_us(&TFC_TickerUpdate,1000);   //Things go to heck if this is enabled
    TFC_Init();
    
    // init servo position to 0
    TFC_SetServo(0, 0);

    // Initialize Baud Rate for PC Console
    pc.baud(38400);

    //flash startup
    while(!TFC_PUSH_BUTTON_0_PRESSED){
        blinkSequence();
    }
    wait(0.75);
    //starts power to back motor - hear high frequency pitch
    TFC_HBRIDGE_ENABLE;    
}

void _finish(){
    //parking brake
    //need to keep spinning wheel slightly or the car will come crashing down backwards the ramp b/c of gravity
    //slight spin is not enough to move the car (even on flat surface)
    //press button 0 to stop parking brake and turn off motor - goes into wait period w/ LED1 blinking
    while (!TFC_PUSH_BUTTON_0_PRESSED){
        /// sharon's parking break code
        TFC_SetMotorPWM(0.1,0.1); //slight spinning of wheel
        blinkSequence2();
    }
    
    // reset servo position to 0
    TFC_SetServo(0, 0);

    //reset to straight direction and stop spinning motor
    TFC_SetMotorPWM(0,0);
    
    //stops the power to back motor - stop hearing the high pitch frequency
    TFC_HBRIDGE_DISABLE;
    if(debug) utrace("finish()\r\n");
}


#endif