Пример #1
0
void initRS485(void)        
{ 
    initTimer4();
    PR4=TimeOut;                

    TRISBbits.TRISB13 = 0;  // output: -read/write
    TRISBbits.TRISB14 = 0;  // output: TX
    TRISBbits.TRISB15 = 1;  // input: RX
    
    PORTBbits.RB13 = 0;     // RS485 auf recieve stellen
    U1MODE  = 0;             // Clear UART1 mode register
	U1STA   = 0;             // Clear UART1 status register
   _RP14R   = 0b00011;      // U1TX output -> RP14 pin
   _U1RXR   = 15;           // U1RX input  <- RP15 pin 
    
   U1MODEbits.STSEL = 0;    // 1-stop bit
   U1MODEbits.PDSEL = 0;    // No Parity, 8-data bits
   U1MODEbits.ABAUD = 0;    // Auto-Baud disabled
   U1MODEbits.BRGH = 0;     // Standard-Speed mode 
   U1BRG = (FCY/(16*BAUD_RATE_UART1))-1; // Calculate value of baud rate register
    
    
   _U1RXIE = 0;             // Disable Rx interruptrs 
   _U1TXIE = 0;             // Disable Tx interruptrs    
   
    U1MODEbits.UARTEN = 1;  // Enable UART1 module
    U1STAbits.UTXEN   = 1;  // Enable UART1 transmit 
}   
Пример #2
0
void initTruck(){
    //Setup Debugging Connection
    initUART1();

    //Check for any errors
    checkErrorCodes();

    //Setup GPS
    initGPS();
    initTimer4();

    //Setup Input and Output
    initPWM(0b11,0b11);
    PWMOutputCalibration(1,HUNTER_TRUCK_STEERING_SCALE_FACTOR, HUNTER_TRUCK_STEERING_OFFSET);
    PWMOutputCalibration(2,HUNTER_TRUCK_THROTTLE_SCALE_FACTOR, HUNTER_TRUCK_THROTTLE_OFFSET);

    setThrottle(0);
    setSteering(0);

    //Setup Datalink
//    initDataLink();
}
Пример #3
0
int main() {
    SYSTEMConfigPerformance(10000000); //Does something with assembly to set clock speed
    enableInterrupts(); //Make interrupt work

    initLEDs();
    initTimer1();
    initTimer2();
    initTimer3();
    initTimer4();
    initSwitch();
    
    
    porta = PORTA;
    portd = PORTD;
    
    initLCD();
    delay(500);
    //printCharLCD(0);
    testLCD();
    
    state = InitState;
    nextState = InitState;

    while (1) {
        switch (state) {
            case RUN:
#ifdef _DEBUG_
                  LATDbits.LATD0=0;
                  LATDbits.LATD1=0;
                  LATDbits.LATD2=1;
#endif
                  LATGbits.LATG14=LedOFF; //TRD1
                  LATGbits.LATG12=LedON; //TRD2
                  moveCursorLCD(0,0);
                  printStringLCD("Running...");
                  if(counterCN==1){   // If the counter changed...
                      printTimeLCD(counter);
                      counterCN = 0;
                  }
                  if(AllowChange == 0){
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      AllowChange = 1;
                  }
                  if((ReqChange==1) && (AllowChange==1)){
                      state=WAIT1;
                      ReqChange=0;
                      AllowChange=0;  
                    //  CNCONAbits.ON = 1;
                  }
                  break;
                  
              case STOP:
#ifdef _DEBUG_
                  LATDbits.LATD0=1;
                  LATDbits.LATD1=0;
                  LATDbits.LATD2=0;
#endif
                  LATGbits.LATG14=LedON;
                  LATGbits.LATG12=LedOFF;
                  moveCursorLCD(0,0);
                  printStringLCD("Stopped");
                  if(AllowChange == 0){
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      AllowChange = 1;
                  }
                  if(AllowReset == 0){
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      AllowReset = 1;
                  }
                  if((ReqReset==1) && (AllowReset==1)){
                      AllowReset = 0;
                      ReqReset = 0;
                      counter = 0;
                      printTimeLCD(counter);
                  }
                  if((ReqChange==1) && (AllowChange==1)){
                      state=WAIT2;
                      ReqChange=0;
                      AllowChange=0;
                     // CNCONAbits.ON = 1;
                  }
                  break;
                  
              case WAIT1:
#ifdef _DEBUG_
                  LATDbits.LATD0=0;
                  LATDbits.LATD1=1;
                  LATDbits.LATD2=1;
#endif
                  T1CONbits.ON = 0; // Turn off counter
                  if(AllowChange == 0){
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      AllowChange = 1;
                  }
                  if((ReqChange==1) && (AllowChange==1)){
                      state=STOP;
                      ReqChange=0;
                      AllowChange=0;
                      ReqReset = 0; // So we don't reset as soon as we stop...
                      AllowReset = 0;   // See previous line
                     // CNCONAbits.ON = 1;
                  }
                  
                  break;
              case WAIT2:
#ifdef _DEBUG_
                  LATDbits.LATD0=1;
                  LATDbits.LATD1=1;
                  LATDbits.LATD2=0;
#endif
                  T1CONbits.ON = 1; // Turn on counter
                  if(AllowChange == 0){
                      delay(5000);// The sad part is this didn't even work.
                      delay(5000);
                      delay(5000);
                      delay(5000);
                      AllowChange = 1;
                  }
                  if((ReqChange==1) && (AllowChange==1)){   // Button Changed and De-bouncing period is done
                      state=RUN;
                      ReqChange=0;
                      AllowChange=0;
                      //CNCONAbits.ON = 1;
                  }
                  break;
              
              case InitState:// Only happens once
                   state=STOP;
                   clearLCD();
                   counter = 0;
                   printTimeLCD(counter);
                   T1CONbits.ON = 0;
                   TMR1 = 0;

                  break;
              default:// Should never happen. How did you get here?
                   state=InitState;
                   ReqChange = 0;
                   AllowChange=0;
                  break;
        }
    }
    return 0;
}
Пример #4
0
int main() {
first=1;
start=0;
int k=0;
for (k=0;k<=7;k++) {ref_distance1[k]=0;ref_distance2[k]=0;cur_distance1[k]=0;cur_distance2[k]=0;}
initIntGlobal();
initCN();
initTimer2();
initTimer4();
initPort();
LCD_init(); 
while(1)
{
while(start)
{
int i=0,j=0;
for (i=0;i<=7;i++)
{
for (j=0;j<32;j++)
{
PORTDCLR = 0x0002;
PORTDSET = 0x0010;
DelayMotor();
PORTDCLR = 0x0010;
PORTDSET = 0x0008;
DelayMotor();
PORTDCLR = 0x0008;
PORTDSET = 0x0004;
DelayMotor();
PORTDCLR = 0x0004;
PORTDSET = 0x0002;
DelayMotor(); 
}
TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(30);
DisplayTMR2();
DisplayTMR4();
if (!first) 
{cur_distance1[i]=TMR2; cur_distance2[i]=TMR4;} 
else {ref_distance1[i]=TMR2;ref_distance2[i]=TMR4;
cur_distance1[i]=TMR2; cur_distance2[i]=TMR4;}
if (cur_distance1[i]-ref_distance1[i]>300 || ref_distance1[i]-cur_distance1[i]>300
||cur_distance2[i]-ref_distance2[i]>300 || ref_distance2[i]-cur_distance2[i]>300)
{PORTDbits.RD7=1;}
DelayMsec(20);
PORTDbits.RD7=0;
} 
first=0;

for (i=0;i<=7;i++)
{
for (j=0;j<32;j++)
{
PORTDCLR = 0x0010;
PORTDSET = 0x0002;
DelayMotor();
PORTDCLR = 0x0002;
PORTDSET = 0x0004;
DelayMotor();
PORTDCLR = 0x0004;
PORTDSET = 0x0008;
DelayMotor();
PORTDCLR = 0x0008;
PORTDSET = 0x0010;
DelayMotor(); 
}   
TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(30);
DisplayTMR2();
DisplayTMR4(); 
cur_distance1[7-i]=TMR2; cur_distance2[7-i]=TMR4;
if (cur_distance1[7-i]-ref_distance1[i]>300 || ref_distance1[i]-cur_distance1[7-i]>300
||cur_distance2[7-i]-ref_distance2[i]>300 || ref_distance2[i]-cur_distance2[7-i]>300)
{PORTDbits.RD7=1;}
DelayMsec(20);
PORTDbits.RD7=0;
}
}
}
}
Пример #5
0
int main(void)
{
    SYSTEMConfigPerformance(SYS_CLOCK);
    
    enableInterrupts();
    initADC();
    initTimer2(); //for PWM
    initPWM();
    initLCD();
    initTimer4(); //for pwm
    initSW();
    
    int track = 1;
    int SpeedR = 0;
    int SpeedL = 0;
    int ones = 0;
    int dec = 0;
    float voltage = 0;

    //Actual main state machine loop
    while(1)
    {
        Speed = ADC1BUF0;
        
        moveCursorLCD(0,0);
        voltage = Speed * ((double)3.3/1023);
        ones = floor(voltage);
        dec = (voltage - ones) * 10;
        printCharLCD('0'+ones);
        printCharLCD('.');
        printCharLCD('0'+dec);
        printCharLCD('V');
        
       delayUs(10000); //10ms - Just to help the LCD not strobe too much
        
        switch(state)
        {
            case wait_Press: //handled by ISR
                break;
            case debouncePress:
                state = wait_Release;
                break;
            case wait_Release: //handled by ISR
                break;
            case debounceRelease:
                if (track == 1){
                    state = forward;
                }
                if (track == 2){
                    state = idle2;
                }
                if (track == 3){
                    state = reverse;
                }
                if (track == 4){
                    state = idle1;
                }
                break;
            case idle1:
                track = 1;
                motorsOff();
                state = wait_Press;
                break;
            case forward:
                track = 2;       
                if(Speed == 511){
                    SpeedR = 1023;
                    SpeedL = 1023;
                }
                else if(Speed < 511){
                    SpeedR = 1023;
                    SpeedL = (2*Speed);
                }
                else if(Speed > 511){
                    SpeedR = 2*(1023 - Speed);
                    SpeedL = 1023;
                }
                else if (Speed == 1023){
                    SpeedR = 0;
                    SpeedL = 1023;
                }
                else if (Speed == 0){
                    SpeedR = 1023;
                    SpeedL = 0;
                }                
                RightMotor_Write(SpeedR);
                LeftMotor_Write(SpeedL);
                break;
            case idle2:
                track = 3;
                motorsOff();
                state = wait_Press;
                break;
            case reverse:
                track = 4;
                if(Speed == 511){
                    SpeedR = 1023;
                    SpeedL = 1023;
                }
                else if(Speed < 511){
                    SpeedR = 1023;
                    SpeedL = 2*Speed;
                }
                else if(Speed > 511){
                    SpeedR = 2*(1023 - Speed);
                    SpeedL = 1023;
                }
                else if (Speed == 1023){
                    SpeedR = 1023;
                    SpeedL = 0;
                }
                else if (Speed == 0){
                    SpeedR = 0;
                    SpeedL = 1023;
                }

                
                RightMotor_Write(0-SpeedR); //maybe it needs the zero to be interpreted as negative?
                LeftMotor_Write(0-SpeedL);
                break;                       
        }
    }
    
    return 0;
}
Пример #6
0
void pathManagerInit(void) {
    initTimer4();
    
    initLED(0);
    
    //Communication with GPS
    initGPS();
    initBatterySensor();
    initAirspeedSensor();

    initSPI(IC_DMA_PORT, DMA_CLOCK_KHZ, SPI_MODE1, SPI_BYTE, SPI_MASTER);
    initInterchip(DMA_CHIP_ID_PATH_MANAGER);

    //Communication with Altimeter
    if (initAltimeter()){
        float initialValue = 0;
        while (initialValue == 0) initialValue = getAltitude();
        calibrateAltimeter(initialValue);
    }
    //Initialize Home Location
    home.altitude = 400;
    home.latitude = RELATIVE_LATITUDE;
    home.longitude = RELATIVE_LONGITUDE;
    home.radius = 1;
    home.id = -1;

    //Initialize first path nodes
//    PathData* node = initializePathNode();
//    node->altitude = 10;
//    node->latitude = 43.473662;
//    node->longitude = -80.540019;
//    node->radius = 5;
//    appendPathNode(node);
//    node = initializePathNode();
//    node->altitude = 10;
//    node->latitude = 43.473479;
//    node->longitude = -80.540601;
//    node->radius = 5;
//    appendPathNode(node);
//    node = initializePathNode();
//    node->altitude = 10;
//    node->latitude = 43.473718;
//    node->longitude = -80.540837;
//    node->radius = 5;
//    appendPathNode(node);
//    node = initializePathNode();
//    node->altitude = 10;
//    node->latitude = 43.473946;
//    node->longitude = -80.540261;
//    node->radius = 5;
//    appendPathNode(node);
//    node = initializePathNode();
//    node->altitude = 10;
//    node->latitude = 43.473685;
//    node->longitude = -80.540073;
//    node->radius = 5;
//    appendPathNode(node);
#if DEBUG
    char str[20];
    sprintf(str, "PM:%d, AM:%d", sizeof(PMData),sizeof(AMData));
    debug(str);
#endif
}
Пример #7
0
int main() {
initPWM();
a=0;b=0;c=0;
a1=0;b1=0;c1=0;
start=0;
first=1;
alm=0;
motor_position=0;
initIntGlobal();
initCN();
initTimer2();
initTimer4();
initPort();
LCD_init(); 

while(1)
{
while (start)
{
int i=0,j=0;
for (i=1;i<=8;i++)
{
motor_position=i;
for (j=0;j<32;j++)
{
PORTDCLR = 0x0002;
PORTDSET = 0x0010;
DelayMotor();
PORTDCLR = 0x0010;
PORTDSET = 0x0008;
DelayMotor();
PORTDCLR = 0x0008;
PORTDSET = 0x0004;
DelayMotor();
PORTDCLR = 0x0004;
PORTDSET = 0x0002;
DelayMotor(); 
}
///////////////////////////////////////////////////////////////////////////////////////////
TMR2=0; TMR4=0;
PORTDSET=0x0220;
DelayUsec(15);
PORTDCLR=0x0220;
DelayMsec(16);
a=TMR2; a1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0220;
DelayUsec(15);
PORTDCLR=0x0220;
DelayMsec(16);
b=TMR2; b1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0220;
DelayUsec(15);
PORTDCLR=0x0220;
DelayMsec(16);
c=TMR2; c1=TMR4;

//DisplayTMR2();
//DisplayTMR4();
if ( (a<80000 || a1<80000 || b<80000 || b1<80000 || c<80000 || c1<80000)&& (b-c>800 
|| c-b>800 || b1-c1>800 || c1-b1>800 || a-b>800 || b-a>800 ||
a1-b1>800 || b1-a1>800 || a-c>800 || c-a>800 || a1-c1>800 || c1-a1>800 ))
{alarm();
break;}
//DelayMsec(20);
///////////////////////////////////////////////////////////////////////////////////////////
} 
if (alm) {alm=0;break;}
for (i=7;i>=0;i--)
{
motor_position=i;
for (j=0;j<32;j++)
{
PORTDCLR = 0x0010;
PORTDSET = 0x0002;
DelayMotor();
PORTDCLR = 0x0002;
PORTDSET = 0x0004;
DelayMotor();
PORTDCLR = 0x0004;
PORTDSET = 0x0008;
DelayMotor();
PORTDCLR = 0x0008;
PORTDSET = 0x0010;
DelayMotor(); 
}   
///////////////////////////////////////////////////////////////////////////////////////////
TMR2=0; TMR4=0;
PORTDSET=0x0220;
DelayUsec(15);
PORTDCLR=0x0220;
DelayMsec(16);
a=TMR2; a1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0220;
DelayUsec(15);
PORTDCLR=0x0220;
DelayMsec(16);
b=TMR2; b1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0220;
DelayUsec(15);
PORTDCLR=0x0220;
DelayMsec(16);
c=TMR2; c1=TMR4;

//DisplayTMR2();
//DisplayTMR4();
if ( (a<80000 || a1<80000 || b<80000 || b1<80000 || c<80000 || c1<80000)&& (b-c>800 
|| c-b>800 || b1-c1>800 || c1-b1>800 || a-b>800 || b-a>800 ||
a1-b1>800 || b1-a1>800 || a-c>800 || c-a>800 || a1-c1>800 || c1-a1>800 ))
{alarm();
break;
}
//DelayMsec(20);
///////////////////////////////////////////////////////////////////////////////////////////
}
//if (alm) {alm=0;break;}
}
}
}
Пример #8
0
int main() {
a=0;b=0;c=0;
a1=0;b1=0;c1=0;
first=1;
start=0;
int k=0;
for (k=0;k<=7;k++) {ref_distance1[k]=0;ref_distance2[k]=0;cur_distance1[k]=0;cur_distance2[k]=0;}
initIntGlobal();
initCN();
initTimer2();
initTimer4();
initPort();
LCD_init(); 

while(1)
{
while(start)
{
int i=0,j=0;
for (i=1;i<=8;i++)
{
for (j=0;j<32;j++)
{
PORTDCLR = 0x0002;
PORTDSET = 0x0010;
DelayMotor();
PORTDCLR = 0x0010;
PORTDSET = 0x0008;
DelayMotor();
PORTDCLR = 0x0008;
PORTDSET = 0x0004;
DelayMotor();
PORTDCLR = 0x0004;
PORTDSET = 0x0002;
DelayMotor(); 
}
///////////////////////////////////////////////////////////////////////////////////////////
TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(16);
a=TMR2; a1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(16);
b=TMR2; b1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(16);
c=TMR2; c1=TMR4;

//DisplayTMR2();
//DisplayTMR4();
if ( (a<80000 || a1<80000 || b<80000 || b1<80000 || c<80000 || c1<80000)&& (b-c>500 
|| c-b>500 || b1-c1>500 || c1-b1>500 || a-b>500 || b-a>500 ||
a1-b1>500 || b1-a1>500 || a-c>500 || c-a>500 || a1-c1>500 || c1-a1>500 ))
{PORTDbits.RD7=1;}
DelayMsec(20);
PORTDbits.RD7=0;
///////////////////////////////////////////////////////////////////////////////////////////
} 
first=0;

for (i=7;i>=0;i--)
{
for (j=0;j<32;j++)
{
PORTDCLR = 0x0010;
PORTDSET = 0x0002;
DelayMotor();
PORTDCLR = 0x0002;
PORTDSET = 0x0004;
DelayMotor();
PORTDCLR = 0x0004;
PORTDSET = 0x0008;
DelayMotor();
PORTDCLR = 0x0008;
PORTDSET = 0x0010;
DelayMotor(); 
}   
///////////////////////////////////////////////////////////////////////////////////////////
TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(16);
a=TMR2; a1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(16);
b=TMR2; b1=TMR4;

TMR2=0; TMR4=0;
PORTDSET=0x0021;
DelayUsec(15);
PORTDCLR=0x0021;
DelayMsec(16);
c=TMR2; c1=TMR4;

//DisplayTMR2();
//DisplayTMR4();
if ( (a<80000 || a1<80000 || b<80000 || b1<80000 || c<80000 || c1<80000)&& (b-c>500 
|| c-b>500 || b1-c1>500 || c1-b1>500 || a-b>500 || b-a>500 ||
a1-b1>500 || b1-a1>500 || a-c>500 || c-a>500 || a1-c1>500 || c1-a1>500 ))
{PORTDbits.RD7=1;}
DelayMsec(20);
PORTDbits.RD7=0;
///////////////////////////////////////////////////////////////////////////////////////////
}
}
}
}
Пример #9
0
int main(void) {
    
    SYSTEMConfigPerformance(40000000); //System clock is 40MHz
    //Because interrupts are good to have
    enableInterrupts();
    //Because ADC is good to have
    initADC();
    //Because a timer is good to have for PWM
    initTimer2();
    //Because PWM is good to have
    initPWM();
//    initMotorDirPins();
    //Because the delayUs function is typically pretty good to have
    initTimer4();
    //Because UART is good to have for interfacing with our speech chip
    initUART(40000000);
    //Because a talking robot is the absolute best thing to have
    //initSpeakJet();
    
    initSevenSegment();            
    
    initSW();
    
    int HelloBytes[] = {0, 0, 0, 0b01110110, 0b01111001, 0b00111000, 0b00111000, 0b00111111, 0, 0, 0};
    int helloCounter = 2;
    
    int myCounter = 0;    
    int timesInFwd = 0;
    //sendSpeakjet(initByteArray);
    
    while(1) {
                
        if(millis >= 5000) //if it's been some seconds
        {
            millis = 0; //reset the timer    
            //tell speakjet to speak state here                
            sendSpeakjet(AllYour);
        }
            
        if(ScrollMillis >= 600)
        {
            ScrollMillis = 0;
            helloCounter = ((helloCounter + 1) % 8);
            sevenSeg_write(0, HelloBytes[WRAPPOS((helloCounter-3), 8)]);
            sevenSeg_write(1, HelloBytes[WRAPPOS(helloCounter-2,8)]);
            sevenSeg_write(2, HelloBytes[(helloCounter-1) % 8]);
            sevenSeg_write(2, HelloBytes[WRAPPOS((helloCounter-1), 8)]);
            sevenSeg_write(3, HelloBytes[(helloCounter)]);
        }
            
        switch(myState) {
            case idle:
                motorsOff();
                break;
            case init:
                //Wait for a button press to start us up
                motorsOff();
                sendSpeakjet(BiteMy);
                delayUs(3000000);                
                myState = backwards;
                break;
            case backwards:
                timesInFwd = 0;
                LeftMotor_Write(-800);
                RightMotor_Write(-800);
                if(leftPairReading < THRESHOLD && rightPairReading < THRESHOLD)
                    myState = pivot_right;
                else if (rightPairReading < THRESHOLD)
                    myState = turnL_back;
                else if (leftPairReading < THRESHOLD)
                    myState = turnR_back;
                else
                    myState = backwards;
                break;
            case turnR_back:
                turnRight_back(73); //makes the LEFT motor turn at near full power. Yes, it IS the left motor and not the right one.
                turnLeft_back(300);
                sampleIRPairs(&leftPairReading, &rightPairReading, 10);
//                myState = (rightPairReading >= THRESHOLD) ? forward : turnR;
                if (leftPairReading < THRESHOLD && rightPairReading < THRESHOLD) //both dark
                    myState = pivot_right;
                else if (rightPairReading < THRESHOLD) 
                    myState = turnR_back;
                else if (leftPairReading < THRESHOLD) 
                    myState = turnL_back;
                else 
                    myState = backwards;
                break;
            case turnL_back:
                turnRight_back(300); //makes the LEFT motor turn at near full power. Yes, it IS the left motor and not the right one.
                turnLeft_back(73);
                sampleIRPairs(&leftPairReading, &rightPairReading, 10);
//                myState = (rightPairReading >= THRESHOLD) ? forward : turnR;
                if (leftPairReading < THRESHOLD && rightPairReading < THRESHOLD) //both dark
                    myState = pivot_right;
                else if (rightPairReading < THRESHOLD) 
                    myState = turnR_back;
                else if (leftPairReading < THRESHOLD) 
                    myState = turnL_back;
                else 
                    myState = backwards;
                break;
            case pivot_right:
//                if(leftPairReading >= THRESHOLD) //left is light
//                    myState = forward;
//                break;
                RightMotor_Write(-650);
                LeftMotor_Write(700);
                if(rightPairReading > THRESHOLD)
                    myState = forward;
                break;
            case turnR:
//                turnRight(512);
                turnRight(73); //makes the LEFT motor turn at near full power. Yes, it IS the left motor and not the right one.
                turnLeft(800);
                sampleIRPairs(&leftPairReading, &rightPairReading, 10);
//                myState = (rightPairReading >= THRESHOLD) ? forward : turnR;
                if (leftPairReading < THRESHOLD && rightPairReading < THRESHOLD) //both dark
                    myState = turnR;
                else if (rightPairReading < THRESHOLD) 
                    myState = turnR;
                else if (leftPairReading < THRESHOLD) 
                    myState = turnL;
                else 
                    myState = forward;
                break;
            case turnL:
//                turnLeft(512);
                turnLeft(73); //makes RIGHT motor run at near full power. Yes, it IS the right motor, not the left one.
                turnRight(800);
                sampleIRPairs(&leftPairReading, &rightPairReading, 10);
//                myState = (leftPairReading >= THRESHOLD) ? forward : turnL;
                if (leftPairReading < THRESHOLD && rightPairReading < THRESHOLD) 
                    myState = turnR;
                else if (rightPairReading < THRESHOLD) 
                    myState = turnR;
                else if (leftPairReading < THRESHOLD)  
                    myState = turnL;
                else 
                    myState = forward;                
                break;
            case forward:
                if(timesInFwd >= 25000)
                {
                    sendSpeakjet(finishedPhrase);
                    myState = backwards;
//                    myState = idle;
                    break;
                }
                timesInFwd++;
                goForward();
                sampleIRPairs(&leftPairReading, &rightPairReading, 100);
                if (rightPairReading < THRESHOLD) {
                    myState = turnR; 
                    timesInFwd = 0;
                }
                else if (leftPairReading < THRESHOLD) { 
                    myState = turnL;
                    timesInFwd = 0;
                }
                break;
        }
    }
    
    return (EXIT_SUCCESS);
}