/* Tiptoes Hexapod Code Version 0.2.11 29/08/2006 
    Tiptoes is a semiautonomous 6 legged hexapod that walks with the use
    of 3 servos and has a 4th servo for head movements/edge sensor
    Cobbled together by RifRaf with significant assistance
               from rue_mohr, Puff-n-Stuff and pepsi      */

 /*                       ATmega32 - 40 PIN DIP LAYOUT - TipToes RX Unit
                                      _______________________
                        HEAD/SPARE    [ 1]PB0         PA0[40] -> HEAD SERVO
                        HEAD/SPARE    [ 2]PB1         PA1[39] -> CENTER SERVO
                        HEAD/SPARE    [ 3]PB2         PA2[38] <- LM35 TEMP SENSE
                        HEAD/SPARE    [ 4]PB3         PA3[37] -> SPARE _ ADDON BRD
                 FRONT LEFT FEELER -> [ 5]PB4         PA4[36] -> HEAD LDR LIGHT SENSE
                FRONT RIGHT FEELER -> [ 6]PB5         PA5[35] <- BODY LDR LIGHT SENSE
                 REAR RIGHT FEELER -> [ 7]PB6         PA6[34] -> LEFT LEG SERVO
                  REAR LEFT FEELER -> [ 8]PB7         PA7[33] -> RIGHT LEG SERVO
                       RESET/TRAIN -> [ 9]RST        AREF[32] <- +5V VCC
                            5V VCC -> [10]VCC         GND[31] <- GROUND
                            GROUND -> [11]GND        AVCC[30] <- +5V VCC
                  16 MHZ 22pf XTAL -> [12]XTAL1       PC7[29]    SPARE _ ADDON BRD
                  16 MHZ 22pf XTAL -> [13]XTAL2       PC6[28]    SPARE _ ADDON BRD
                           RWS-433 -> [14]PD0         PC5[27]    SPARE _ ADDON BRD
                           TWS-434 <- [15]PD1         PC4[26]    SPARE _ ADDON BRD
                 SPARE _ ADDON BRD    [16]PD2         PC3[25]    SPARE _ ADDON BRD
                 SPARE _ ADDON BRD    [17]PD3         PC2[24]    SPARE _ ADDON BRD
                 SPARE _ ADDON BRD    [18]PD4         PC1[23]    SPARE _ ADDON BRD
                 SPARE _ ADDON BRD    [19]PD5         PC0[22]    SPARE _ ADDON BRD
                     RIGHT EYE LED <- [20]PD6         PD7[21] -> LEFT EYE LED    
                                                               */

 /*                       ATmega32 - 44 PIN TQFP LAYOUT - TipToes RX Unit
    
                                                 +-------------------Gnd
 HEAD/SPARE     (XCK, T0) PB0-----------------+  |  +----------------Vcc
 HEAD/SPARE          (T1) PB1--------------+  |  |  |  +-------------PA0 (ADC0)  HEAD SERVO
 HEAD/SPARE  (AIN0, INT2) PB2-----------+  |  |  |  |  |  +----------PA1 (ADC1)  CENTER SERVO
 HEAD/SPARE   (AIN1, OC0) PB3--------+  |  |  |  |  |  |  |  +-------PA2 (ADC2)  LM35 TEMP SENSE
 FRONT LEFT FEELER  (/SS) PB4-----+  |  |  |  |  |  |  |  |  |  +----PA3 (ADC3)  SPARE _ ADDON BRD
                                  |  |  |  |  |  |  |  |  |  |  |
                                 44 43 42 41 40 39 38 37 36 35 34
                     
 FRONT RIGHT FEELER(MOSI) PB5  1  /\                              33 PA4 (ADC4)  SPARE _ ADDON BRD
 REAR RIGHT FEELER (MISO) PB6  2 /__\   ____________________      32 PA5 (ADC5)  BODY LDR LIGHT SENSE
 REAR LEFT FEELER   (SCK) PB7  3           |   _ _   ___          31 PA6 (ADC6)  LEFT LEG SERVO
 RESET/TRAIN BUTTON    /RESET  4      / |  |  | | | |    |        30 PA7 (ADC7)  RIGHT LEG SERVO
 +5V                      Vcc  5     /_ |  |  | | | |--- |        29 AREF        +5V
 GROUND                   Gnd  6    /   |  |  | | | |___ |___     28 Gnd         GROUND
 16 MHZ 22pf CRYSTAL    XTAL2  7    --------------------------    27 AVcc        +5V
 16 MHZ 22pf CRYSTAL    XTAL1  8                                  26 PC7 (TOSC2) SPARE _ ADDON BRD 
 RWS-433 RX         (RXD) PD0  9             ATMEGA32             25 PC6 (TOSC1) SPARE _ ADDON BRD 
 TWS-434 TX         (TXD) PD1 10           16AU  0449B            24 PC5 (TDI)   SPARE _ ADDON BRD 
 SPARE _ ADDON BRD (INT0) PD2 11                                  23 PC4 (TDO)   SPARE _ ADDON BRD 
                    
                                12 13 14 15 16 17 18 19 20 21 22
                                 |  |  |  |  |  |  |  |  |  |  |
 SPARE _ ADDON BRD (INT1) PD3----+  |  |  |  |  |  |  |  |  |  +-----PC3 (TMS)   SPARE _ ADDON BRD 
 SPARE _ ADDON BRD (OC1B) PD4-------+  |  |  |  |  |  |  |  +--------PC2 (TCK)   SPARE _ ADDON BRD 
 SPARE _ ADDON BRD (OC1A) PD5----------+  |  |  |  |  |  +-----------PC1 (SDA)   SPARE _ ADDON BRD 
 RIGHT EYE LED      (ICP) PD6-------------+  |  |  |  +--------------PC0 (SCL)   SPARE _ ADDON BRD 
 LEFT EYE LED       (OC2) PD7----------------+  |  +-----------------Gnd         GROUND
 +5V                      Vcc-------------------+                                            */
                                                                                     
//----- Include Files ---------------------------------------------------------
#include <avr/io.h>        
#include <avr/signal.h>    
#include <avr/interrupt.h>    
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "global.h"        
#include "uart.h"        
#include "rprintf.h"    
#include "a2d.h"        
#include "timer.h"        
#include "servo.h"        
#include "vt100.h"    
#include "cmdline.h"

//----- Defines ---------------------------------------------------------
#define    WALKPAUSE      300   //set speed
#define    LONGPAUSE      800   //set speed

enum servoChannel { head, left, right, center, arm, gripper, channel_max};

//preset head Servo Positions
#define lookHardLeft() 	servoSetPosition(head, 50);
#define lookLeft() 		servoSetPosition(head, 80);
#define lookCenter() 	servoSetPosition(head, 128);
#define lookRight() 	servoSetPosition(head, 170);
#define lookHardRight()	servoSetPosition(head, 200);
  // preset left servo positions
#define leftLegsForward()  		servoSetPosition(left, 180);
#define leftLegsSemiForward()	servoSetPosition(left, 150);
#define leftLegsCenter()		servoSetPosition(left, 128);
#define leftLegsSemiBackward()	servoSetPosition(left, 100);
#define leftLegsBackward()		servoSetPosition(left, 80);

//preset right servo positions
#define rightLegsForward()		servoSetPosition(right, 80);
#define rightLegsSemiForward()	servoSetPosition(right, 110);
#define rightLegsCenter()		servoSetPosition(right, 128);
#define rightLegsSemiBackward()	servoSetPosition(right, 160);
#define rightLegsBackward()		servoSetPosition(right, 180);
//preset Center Servo Positions
#define rockHardLeft()	servoSetPosition(center, 175);
#define rockLeft()		servoSetPosition(center, 160);
#define rockCenter()	servoSetPosition(center, 135);
#define rockRight()		servoSetPosition(center, 100);
#define rockHardRight()	servoSetPosition(center, 80);

//eye control
#define leftEyeOn() sbi(PORTD, 7);
#define rightEyeOn() sbi(PORTD, 6);
#define leftEyeOff() cbi(PORTD, 7);
#define rightEyeOff() cbi(PORTD, 6);

//global variables

//uint8_t leftServoPos, rightServoPos, centerServoPos, headServoPos;
//this is crap. use servoGetPosition(left); etc. instead

int leftLight, rightLight, centerLight, backLight, leftLightSet, rightLightSet, centerLightSet, backLightSet;
unsigned char move;
u08 Run;


//procedure defines
void centerAllLegs(void);
void checkSwitch(void);
void checkLDR(void);
void setupLDR(void);
void goCmdline(void);
void servoSetup(void);
void lightFollow(void);
void lightAvoid(void);
void lightDecide(void);
void stepBackward(void);
void stepForward(void);
void stepLeft(void);
void stepRight(void);


int main(void)    {
    // initialize our libraries
    // initialize the UART (serial port)
    uartInit();
    // make all rprintf statements use uart for output
    rprintfInit(uartSendByte);
    // initialize the timer system
    timerInit();

    // set the baud rate of the UART for our debug/reporting output
    uartSetBaudRate(9600);
    // initialize the timer system
    timerInit();
    // initialize vt100 library
    vt100Init();
    vt100ClearScreen();
    rprintf("Version 0.2.11\r\n");
    servoSetup();
    goCmdline();
    while(1);
    return 0;
}


//preset Multi Servo Positions
void centerAllLegs(void)    {
     leftLegsCenter();
     rightLegsCenter();
     rockCenter();
     lookCenter();
}

void forwardAllLegs(void)     {
    leftLegsSemiForward();
     rightLegsSemiForward();
     rockCenter();
}

void semiforwardLeftLegs(void)    {
    leftLegsSemiForward();
    lookRight();
}

void semiforwardRightLegs(void)    {
    rightLegsSemiForward();
    lookLeft();
}

void forwardLeftLegs(void)    {
    leftLegsForward();
    lookRight();
}

void forwardRightLegs(void)    {
    rightLegsForward();
    lookLeft();
}
void backwardAllLegs(void)     {
    rockCenter();
    leftLegsSemiBackward();
    rightLegsSemiBackward();
    lookCenter();
}

void opposeLegsLeft(void)    {
    rockCenter();
    leftLegsSemiForward();
    rightLegsSemiBackward();
    lookCenter();
}

void opposeLegsRight(void)    {
    rockCenter();
    rightLegsSemiForward();
    leftLegsSemiBackward();
    lookCenter();
}

//Forward Walking Motion
void stepForward(void)     {
    rprintf("Forward\r\n");
    leftEyeOn();
    rightEyeOn();
    rockLeft();
    timerPause(WALKPAUSE);
    semiforwardLeftLegs();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    semiforwardRightLegs();
    timerPause(WALKPAUSE);
    rockLeft();
    timerPause(WALKPAUSE);
    forwardLeftLegs();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    forwardRightLegs();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    backwardAllLegs();
    timerPause(WALKPAUSE);
    lookCenter();
    timerPause(WALKPAUSE);
    leftEyeOff();
    rightEyeOff();
}

//Forward Left Walking Motion
void stepForwardLeft(void)    {
    rprintf("Forward Left\r\n");
    leftEyeOn();
    rockLeft();
    timerPause(WALKPAUSE);
    forwardLeftLegs();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    forwardRightLegs();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    leftLegsBackward();
    timerPause(WALKPAUSE);
    rightLegsCenter();
    timerPause(WALKPAUSE);
    leftEyeOff();
}

//Forward Right Walking Motion
void stepForwardRight(void)    {
    rprintf("Forward Right\r\n");
    rightEyeOn();
    rockLeft();
    timerPause(WALKPAUSE);
    forwardLeftLegs();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    forwardRightLegs();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    rightLegsBackward();
    timerPause(WALKPAUSE);
    leftLegsCenter();
    timerPause(WALKPAUSE);
    rightEyeOff();
}

//Backward Walking Motion
void stepBackward(void)    {
    rprintf("Backwards\r\n");
    leftEyeOn();
    rightEyeOn();
    rockLeft();
    timerPause(WALKPAUSE);
    leftLegsBackward();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    rightLegsBackward();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    forwardAllLegs();
    timerPause(WALKPAUSE);
    leftEyeOff();
    rightEyeOff();
}

//Backward Left Walking Motion
void stepBackwardLeft(void)    {
    rprintf("Backward Left\r\n");
    leftEyeOn();
    rockLeft();
    timerPause(WALKPAUSE);
    leftLegsBackward();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    rightLegsBackward();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    leftLegsForward();
    timerPause(WALKPAUSE);
    rightLegsCenter();
    timerPause(WALKPAUSE);
    leftEyeOff();
}

//Backward Right Walking Motion
void stepBackwardRight(void)     {
    rprintf("Backward Right\r\n");
    rightEyeOn();
    rockLeft();
    timerPause(WALKPAUSE);
    leftLegsBackward();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    rightLegsBackward();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    rightLegsForward();
    timerPause(WALKPAUSE);
    leftLegsCenter();
    timerPause(WALKPAUSE);
    rightEyeOff();
}

//Turn Left (anti-clockwise)
void stepLeft(void)    {
    rprintf("Turning Left\r\n");
    leftEyeOn();
    rockRight();
    timerPause(WALKPAUSE);
    rightLegsForward();
    timerPause(WALKPAUSE);
    rockLeft();
    timerPause(WALKPAUSE);
    leftLegsBackward();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    opposeLegsLeft();
    timerPause(WALKPAUSE);
    leftEyeOff();
}

//Turn Right (clockwise)
void stepRight(void)     {
    rprintf("Turning Right\r\n");
    rightEyeOn();
    rockLeft();
    timerPause(WALKPAUSE);
    leftLegsForward();
    timerPause(WALKPAUSE);
    rockRight();
    timerPause(WALKPAUSE);
    rightLegsBackward();
    timerPause(WALKPAUSE);
    rockCenter();
    timerPause(WALKPAUSE);
    opposeLegsRight();
    timerPause(WALKPAUSE);
    rightEyeOff();
}

//Feeler Switch Checks
void checkSwitch(void)    {
        if (0) {
        }
        else if ( !(PINB & (1<<PB4)) & !(PINB & (1<<PB5)))        {
            rprintf("2 Front Feelers\r\n");
            stepBackward();    
        } 
        else if ( !(PINB & (1<<PB6)) & !(PINB & (1<<PB7)))        {
            rprintf("2 Back Feelers\r\n");
            stepForward();
        } 
        else if ( !(PINB & (1<<PB4)) )        {
            rprintf("Front L Feeler\r\n");
            stepBackwardLeft();
        }
        else if ( !(PINB & (1<<PB5)) )        {
            rprintf("Front R Feeler\r\n");
            stepBackwardRight();
        }
        else if ( !(PINB & (1<<PB7)) )        {
            rprintf("Back L Feeler\r\n");
            stepForwardLeft();
        }
        else if ( !(PINB & (1<<PB6)) )        {
            rprintf("Back R Feeler\r\n");
            stepForwardRight();
        }
        else         {
        }
}

void setupLDR(void)    {
    
    leftEyeOn();
    rightEyeOn();
    lookCenter();
    timerPause(WALKPAUSE);
    ADMUX = 4;
    ADCSRA |= _BV(ADSC);
    while (ADCSRA & _BV(ADSC) ) {}
    centerLight = ADC;
    rprintf("Center Light %d\r\n",centerLightSet);
    timerPause(WALKPAUSE);
    ADMUX = 5;
    ADCSRA |= _BV(ADSC);
    while (ADCSRA & _BV(ADSC) ) {}
    backLight = ADC;
    rprintf("Back Light %d\r\n",backLightSet);
    leftEyeOff();
    rightEyeOff();
}

void checkLDR(void)    {
    
    lookLeft();
    timerPause(WALKPAUSE);
    ADMUX = 4;
    ADCSRA |= _BV(ADSC);
    while (ADCSRA & _BV(ADSC) ) {}
    leftLight = ADC;
    rprintf("Left Light %d\r\n",leftLight);
    
    lookRight();
    timerPause(WALKPAUSE);
    ADMUX = 4;
    ADCSRA |= _BV(ADSC);
    while (ADCSRA & _BV(ADSC) ) {}
    rightLight = ADC;
    rprintf("Right Light %d\r\n",rightLight);

    lookCenter();
    timerPause(WALKPAUSE);
    ADMUX = 4;
    ADCSRA |= _BV(ADSC);
    while (ADCSRA & _BV(ADSC) ) {}
    centerLight = ADC;
    rprintf("Center Light %d\r\n",centerLight);
    
    ADMUX = 5;
    ADCSRA |= _BV(ADSC);
    while (ADCSRA & _BV(ADSC) ) {}
    backLight = ADC;
    rprintf("Back Light %d\r\n",backLight);

    lightDecide();
}

//Decide whether to find or avoid light
void lightDecide(void)    {
if (0) {
}
    else if ( backLight >= backLightSet)        {
    rprintf("Bright at back\r\n");
        if (0) {
        }
        else if ( centerLight >= centerLightSet)        {
        rprintf("Bright front too\r\n");
        lightAvoid();
        }
        else if ( centerLight <= centerLightSet)        {
        rprintf("Dimmer Ahead\r\n");
        lightFollow();
        }
        else         {
        checkSwitch();
        }
    }
    else if ( backLight <= backLightSet)        {
    rprintf("Very Dark\r\n");
        if (0) {
        }
        else if ( centerLight <= centerLightSet)        {
        rprintf("Dark at front too\r\n");
        lightFollow();
        }
        else if ( centerLight >= centerLightSet)        {
        rprintf("Brighter Ahead\r\n");
        lightAvoid();
        }
        else         {
        checkSwitch();
        }
    }
    else         {
    rprintf("Light Moderate\r\n");
    }
}

//Light Following Code
void lightFollow(void)    {
if (0) {
}
    else if ( leftLight == rightLight)        {
    rprintf("Side Light Equal\r\n");
        if (0) {
        }
        else if ( centerLight == backLight)        {
        rprintf("B/F Light Equal\r\n");
        }
        else if ( centerLight > backLight)        {
        rprintf("Brighter Ahead\r\n");
        stepForward();
        checkLDR();
        }
        else         {
        rprintf("Turning Around\r\n");
        stepLeft();
        stepLeft();
        stepLeft();
        checkLDR();
        }
    }
    else if ( leftLight > rightLight)        {
    rprintf("Light Left\r\n");
    stepLeft();
    checkLDR();
    }
    else         {
    rprintf("Light Right\r\n");
    stepRight();
    checkLDR();
    }
}

//Light Avoiding Code
void lightAvoid(void)    {
if (0) {
}
    else if ( leftLight == rightLight)        {
    rprintf("Side Light Equal\r\n");
        if (0) {
        }
        else if ( centerLight == backLight)        {
        rprintf("B/F Light Equal\r\n");
        }
        else if ( centerLight < backLight)        {
        rprintf("Darker Ahead\r\n");
        stepForward();
        checkLDR();
        }
        else         {
        rprintf("Turning Around\r\n");
        stepRight();
        stepRight();
        stepRight();
        checkLDR();
        }
    }
    else if ( leftLight < rightLight)        {
    rprintf("Darker on Left\r\n");
    stepLeft();
    checkLDR();
    }
    else         {
    rprintf("Darker on Right\r\n");
    stepRight();
    checkLDR();
    }
}

void doRandom(void)    { //Decide to maybe do something
    move = random() % 13; //use random with modulo 13 to leave a remainder between 0 and 12
    rprintf("move value %d\r\n", move);  //print current value of case
    
    switch ( move )  { 
        case 0: //have a little rest
            // output movement to serial and have predefined pause
            rprintf("0 - lets do nothing\r\n"); timerPause(LONGPAUSE); timerPause(LONGPAUSE);
            break;
        case 1: //start 4 steps
            rprintf(" 1 - forward\r\n"); stepForward();
        case 2: //start 3 steps
            rprintf(" 2 - forward\r\n"); stepForward();
        case 3: //start 2 steps
            rprintf(" 3 - forward\r\n"); stepForward();
        case 4: //start 1 step
            rprintf(" 4 - forward\r\n"); stepForward();
            break;
        case 5:  // move forward left
            rprintf(" 5 - forwardleft\r\n"); stepForwardLeft(); stepForwardLeft();
            break;
        case 6:  // move forward right
            rprintf(" 6 - forwardright\r\n"); stepForwardRight(); stepForwardRight();
            break;
        case 7:  // rotate left
            rprintf(" 7 - left\r\n"); stepLeft(); stepLeft();
            stepLeft(); timerPause(LONGPAUSE);
            break;
        case 8:  //rotate right
            rprintf(" 8 - right\r\n"); stepRight(); stepRight(); 
            stepRight(); timerPause(LONGPAUSE);
            break;
        case 9:  //move back left
            rprintf(" 9 - backleft\r\n"); stepBackwardLeft();
            break;
        case 10: //move back right
            rprintf("10 - backright\r\n"); stepBackwardRight();
            break;
        case 11: //move back 2 steps
            rprintf("11 - back"); stepBackward();
        case 12: //move back one step
            rprintf("12 - back"); stepBackward();
            break;
    }
}

void servoSetup(void)    {
    servoInit();
    servoSetChannelIO(head, _SFR_IO_ADDR(PORTA), PA0); //head servo
    servoSetChannelIO(left, _SFR_IO_ADDR(PORTA), PA6); //left legs
    servoSetChannelIO(right, _SFR_IO_ADDR(PORTA), PA7); //right legs
    servoSetChannelIO(center, _SFR_IO_ADDR(PORTA), PA1); //center legs
    //servoSetChannelIO(arm, _SFR_IO_ADDR(PORTA), PA4); //gripper l/r
    //servoSetChannelIO(gripper, _SFR_IO_ADDR(PORTA), PA5); //gripper


    outb(DDRA, 0xFF);    //Set PORTA  11111111  
    outb(DDRB, 0x00);    //Set PORTB     00000000
    outb(DDRD, 0xE0);    //Set PORTB    11100000

    // enable and disable pullups
    PORTA = 0xFF;
    PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);  
    setupLDR();
    //armCenter();
    //gripperCenter();

    // Activate ADC with Prescaler 128 --> 16Mhz/128 = 125kHz
    ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);
    centerAllLegs();
    timerPause(LONGPAUSE);
    timerPause(LONGPAUSE);
}

void goCmdline(void)    {
    u08 c;
    // print welcome message
    //vt100ClearScreen();
    //vt100SetCursorPos(2,0);
    rprintfProgStrM("\r\nTipToes Command Line Interface\r\n");

    cmdlineInit();
    cmdlineSetOutputFunc(uartSendByte);

    // add commands to the command database
    cmdlineAddCommand("forward", stepForward);
    cmdlineAddCommand("forwardleft", stepForwardLeft);
    cmdlineAddCommand("forwardright", stepForwardRight);
    cmdlineAddCommand("backward", stepBackward);
    cmdlineAddCommand("backwardright", stepBackwardRight);
    cmdlineAddCommand("backwardleft", stepBackwardLeft);
    cmdlineAddCommand("right", stepRight);
    cmdlineAddCommand("left", stepLeft);
    cmdlineAddCommand("rest", centerAllLegs);
    //cmdlineAddCommand("armleft", movearmLeft);
    //cmdlineAddCommand("armright", movearmRight);
    //cmdlineAddCommand("gripperopen", movegripperOpen);
    //cmdlineAddCommand("gripperclose", movegripperClose);


    cmdlineInputFunc('\r'); //prompt 

    Run = TRUE;  // set state to run

    while(Run)    {       // main loop
        // pass characters received on the uart (serial port)
        // into the cmdline processor
        while(uartReceiveByte(&c))
        cmdlineInputFunc(c);
        // run the cmdline execution functions
        cmdlineMainLoop();
        checkSwitch(); 
        doRandom();
   }
    rprintfCRLF();
    rprintf("Exited TipToes");
}



//removed for basic version 07/08/2006
//global variables
int leftLight, rightLight, centerLight, backLight, leftLightSet, rightLightSet, centerLightSet, backLightSet;
u08 Run;

#define    ARMPAUSE    40   //set speed
#define	   INCREMENT   1    //one step of the servo
//preset Arm Servo positions
#define armFullLeft()	servoSetPosition(arm, 50);
#define armLeft()		servoSetPosition(arm, servoGetPosition(arm)-INCREMENT);
#define armCenter()		servoSetPosition(arm, 128);
#define armRight()		servoSetPosition(arm, servoGetPosition(arm)+INCREMENT);
#define armFullRight()	servoSetPosition(arm, 160);
//preset Gripper Servo Positions
#define gripperFullOpen()	servoSetPosition(gripper, 50);
#define gripperOpen()		servoSetPosition(gripper, servoGetPosition(gripper)+INCREMENT);
#define gripperCenter()		servoSetPosition(gripper, 128);
#define gripperClose()		servoSetPosition(gripper, servoGetPosition(gripper)-INCREMENT);
#define gripperFullClose() 	servoSetPosition(gripper, 200);



void movearmLeft(void);
void movearmRight(void);
void movegripperOpen(void);
void movegripperClose(void);

//Arm Left
void movearmLeft(void)     {
    if ( !(PINB & (1<<PB4)) & (servoGetPosition(arm) !=0))         {
        leftEyeOn();
        lcdClear();
        rprintf("Arm Left");
        armLeft();
        timerPause(ARMPAUSE);
        leftEyeOff();
    }
    else    {
    }
}

//Arm Right
void movearmRight(void)     {
    if ( !(PINB & (1<<PB5)) & (servoGetPosition(arm) !=255))         {
        rightEyeOn();
        lcdClear();
        rprintf("Arm Right");
        armRight();
        timerPause(ARMPAUSE);
        rightEyeOff();
    }
    else    {
    }
}

//Gripper Open
void movegripperOpen(void)     {
    if ( !(PINB & (1<<PB6)) & (servoGetPosition(gripper) !=0))         {
        leftEyeOn();
        lcdClear();
        rprintf("Gripper Open");
        gripperOpen();
        timerPause(ARMPAUSE);
        leftEyeOff();
    }
    else    {
    }
}

//Gripper Close
void movegripperClose(void)     {
    if ( !(PINB & (1<<PB7)) & (servoGetPosition(gripper) !=255))         {
        rightEyeOn();
        lcdClear();
        rprintf("Gripper Close");
        gripperClose();
        timerPause(ARMPAUSE);
        rightEyeOff();
    }
    else    {
    }
}



