Zachary Sunberg / Mbed 2 deprecated SAILORSbot

Dependencies:   mbed

main.cpp

Committer:
Zachary Sunberg
Date:
2015-07-21
Revision:
4:70fea94b29ae
Parent:
3:47cd6b9e4dbb
Child:
5:70c86dbc8832

File content as of revision 4:70fea94b29ae:

#include "robot.h"
#include <sstream>

int mode;
const int MANUAL_MODE = 0;
const int LINE_FOLLOW_MODE = 1;

volatile double leftspeed;
volatile double rightspeed;

char received[80];
int r_index;
int sensors[5];

// PUT GLOBAL CONSTANTS HERE
//////////////////////////////

//////////////////////////////

/*
 * This function will be called at approximately 20 Hz when the control mode is LINE_FOLLOW_MODE
 */
int line_follow_loop(){
    led4 = 1;

    // set these variables to control the robot
    leftspeed = 0.0;
    rightspeed = 0.0;

    // set mode to MANUAL_MODE when the end is detected
    // mode = MANUAL_MODE

    led4 = 0;
}


// INPUT COMMANDS
// l:<float>    set left wheel speed (only effective in MANUAL_MODE)
// r:<float>    set right wheel speed (only effective in MANUAL_MODE)
// c:<int>      change mode

// OUTPUT MESSAGES
// p:<float>    line position
// s:<int>,<int>,<int>,<int>,<int>
//              light sensor values
// m:<int>      mode

int parse_command(const char* cmd)
{
    if(cmd[1]==':'){
        if(cmd[0]=='l' && mode==MANUAL_MODE){
            leftspeed = atof(&cmd[2]);
        }else if(cmd[0]=='r' && mode==MANUAL_MODE){
            rightspeed = atof(&cmd[2]);
        }else if(cmd[0]=='c'){
            mode = atoi(&cmd[2]);
        }
        }else{
            xbee.printf("%s\n",cmd); 
        }
    }else{
        xbee.printf("%s\n",cmd);
    }
    return 0;
}

void Rx_interrupt()
{
    // assume recursive interrupt is not possible
    led2 = 1;
    char read;
    
    while(xbee.readable()){
        read = xbee.getc();
        if(read=='\n'){
            received[r_index]='\0'; // put a null character at the end
            parse_command(received);
            r_index=0;
        } else {
            if(r_index >= 80){
                r_index=0;
            }
            received[r_index]=read;
            r_index++;
        }
    }
    
    led2=0;
    
    return;
}

int main() {
    
    xbee.attach(&Rx_interrupt, Serial::RxIrq);
    xbeeReset = 0;
    wait(2);
    xbeeReset = 1;
    pi.sensor_auto_calibrate();
    r_index = 0;
    received[0] = '\0';

    while(1){

        led1 = 1;
        wait_ms(25);
        if(mode==LINE_FOLLOW_MODE){
            line_follow_loop()
        }
        pi.left_motor(leftspeed);
        pi.right_motor(rightspeed);

        led1 = 0;
        wait_ms(25);
        pi.sensor_reading(sensors);
        int* s = sensors;
        __disable_irq();
        xbee.printf("s:%i,%i,%i,%i,%i\n", s[0], s[1], s[2], s[3], s[4]);
        __enable_irq();
        __disable_irq();
        xbee.printf("p:%f\n", pi.line_position());
        __enable_irq();
        __disable_irq();
        xbee.printf("m:%d\n", mode);
        __enable_irq();
    }

    return 0;
}