Fixed Sonar

Dependencies:   C12832 Servo mbed-rtos-edited mbed

Fork of NervousPuppy by Sean Doyle

nervousPuppy.cpp

Committer:
SeanDoyle
Date:
2015-01-13
Revision:
2:8415bea33a95
Parent:
1:8fe6802d6971
Child:
3:74dfce05dd99

File content as of revision 2:8415bea33a95:

#include "nervousPuppy.h"

/**
 *  Constructor - contains running loop
 */
nervousPuppy::nervousPuppy(){
    bool isRunning = true;
    while(isRunning){
        if(shutdown()){//TurnOff
            isRunning = !isRunning; 
        } else if(isScared()){//MoveBack
            scared = true;
            playerError = playerDistance - SCARED;
            
            if(calculateVerticalAdjustment() != 0)changePosition("tilt",calculateVerticalAdjustment());
            else changePosition("rotate",calculateHorizontalAdjustment());
            scared = false;
        } else if(isLonely()){// MoveForward
            lonely = true;
            playerError = playerDistance - LONELY;
            
            if(calculateVerticalAdjustment() !=0)changePosition("tilt",calculateVerticalAdjustment());
            else changePosition("rotate",calculateHorizontalAdjustment());
            lonely = false;
        }
    }
}

/**
 * Returns the vertical adjustment
 */
float nervousPuppy::calculateVerticalAdjustment(){
    return calculateAngle("Vertical");
}

/**
 * Returns the horizontal adjustment
 */
float nervousPuppy::calculateHorizontalAdjustment(){
    return calculateAngle("Horizontal");
}

/**
 * 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 axis){
    float deltaDist = 0.0;
    float limiter,y;
    if(axis == "Vertical") limiter = SERVO_TILT_LIMIT;
    else limiter = SERVO_ROTATE_LIMIT;
    
    for(float theta = 0.0; theta < limiter; ++theta){
        y = RADIUS*Sin(theta);
        deltaDist = sqrt(pow(y,2) + pow(playerDistance,2));
        if(scared){
            if((deltaDist - SCARED) > SCARED) return theta;
        }else if(lonely){
            if((deltaDist - LONELY) < LONELY) return theta;
        }
    }
    return 0.0;
}

/**
 * Move 'puppy' to the calculated 'safe' point
 */
void nervousPuppy::changePosition(string servo,float angle){
    if(servo == "tilt"){}
    else if(servo == "rotate"){}
}

/**
 * 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();
}