Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C12832 Servo mbed-rtos-edited mbed
Fork of NervousPuppySprintOne by
Diff: nervousPuppy.cpp
- Revision:
- 2:8415bea33a95
- Parent:
- 1:8fe6802d6971
- Child:
- 3:74dfce05dd99
--- a/nervousPuppy.cpp Mon Jan 12 19:32:28 2015 +0000
+++ b/nervousPuppy.cpp Tue Jan 13 16:08:22 2015 +0000
@@ -1,27 +1,106 @@
#include "nervousPuppy.h"
+/**
+ * Constructor - contains running loop
+ */
nervousPuppy::nervousPuppy(){
bool isRunning = true;
while(isRunning){
- if(isLonely()){} // MoveForward
- else if(isScared()){} //MoveBack
+ 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;
}
