Fixed Sonar

Dependencies:   C12832 Servo mbed-rtos-edited mbed

Fork of NervousPuppy by Sean Doyle

nervousPuppy.cpp

Committer:
SeanDoyle
Date:
2015-01-19
Revision:
5:cbb5d7460309
Parent:
4:2b47356f4b7d
Child:
6:f854aa2f41e2

File content as of revision 5:cbb5d7460309:

#include "nervousPuppy.h"

/**
 *  Constructor - contains running loop
 */
 
Servo tilt(p21);
Servo rotate(p22);      
AnalogIn ain(p20);

C12832 lcd(p5, p7, p6, p8, p11);


nervousPuppy::nervousPuppy(){
    bool isRunning = true;
    while(isRunning){
        playerDistance = 254*ain.read();
        
        lcd.cls();
        if(shutdown()){//TurnOff
            //isRunning = !isRunning; 
        } else if(isScared()){//MoveBack
            scared = true;
            playerError = playerDistance - SCARED;
            lcd.printf(" TOO CLOSE");
            wait(2.0);
            

            scared = false;
        } else if(isLonely()){// MoveForward
            lonely = true;
            playerError = playerDistance - LONELY;
            lcd.printf(" TOO FAR");
            wait(2.0);
            
            
            lonely = false;
        }
    }
}

/**
 * Calculates the angle required to bring the 'puppy' to a 'safe distance'
 * Returns 0 if it cannot find a 'safe distance'
 */
float nervousPuppy::calculateAngle(string issue){
    if(issue == "Too Close"){
        for(float theta = 0.0; theta < 45; theta++){
            float c = RADIUS*Cos(theta);
            float y = RADIUS*Sin(theta);
            float b = RADIUS - c;
           
            float x = sqrt(pow(y,2) + pow((playerDistance+b),2));
            if(x > SCARED){
               return theta;
            }
        }
    }
    if(issue == "Too Far"){
        for(float theta = 0.0; theta < 45; theta++){
            float c = RADIUS*Cos(theta);
            float y = RADIUS*Sin(theta);
            float b = RADIUS - c;
            float e = playerDistance - b;
            
            float a = sqrt(pow(e,2) + pow(y,2));
            if(a < LONELY){
                return theta;   
            }
        }
    }
    return 0.0;    
}

/**
 * Move 'puppy' to the calculated 'safe' point
 */
void nervousPuppy::changePosition(string servo,float angle){
    if(servo == "tilt"){
        tilt.position(angle);
    } else if(servo == "rotate"){
        rotate.position(angle);
    }
}
/**
 * Thread -> Running sonar to detect player
 */
void nervousPuppy::detectPlayer(){
    
}

/** check if we shutdown **/
bool nervousPuppy::shutdown(){
    if(playerDistance < SHUTDOWN)return true;
    else return false;   
}

/** check if player is to far away **/
bool nervousPuppy::isLonely(){
    if(playerDistance > LONELY)return true;
    else return false;    
}

/** check if player is to close **/
bool nervousPuppy::isScared(){
    if(playerDistance < SCARED)return true;
    else return false;
}

/** get player distance value **/
float nervousPuppy::getPlayerDistance(){
    return playerDistance;
}

/** set player distance value **/
void nervousPuppy::setPlayerDistance(float dist){
    playerDistance = dist;
}

int main(){
    nervousPuppy();
}