David Spillman / Mbed 2 deprecated GPSNavigationNew

Dependencies:   GPS2 L3GD20 LSM303DLHC2 PID mbed SDFileSystem

Fork of GPSNavigation by David Spillman

Revision:
12:273479524c71
Parent:
11:1b34319671eb
Child:
13:17f04a55c6e2
diff -r 1b34319671eb -r 273479524c71 main.cpp
--- a/main.cpp	Mon Apr 27 18:10:52 2015 +0000
+++ b/main.cpp	Wed Apr 29 18:07:43 2015 +0000
@@ -20,7 +20,7 @@
 //  Requires a serial to usb adapter to connect an X-Bee to a PC
 //  Set both X-Bees up for 115200 baud
 //  Use TeraTerm (or other serial program) to read and send data over X-Bees
-//
+//  Set TeraTerm new line character from CR (carrage return) to LF (line feed)
 //  Program starts by prompting user to press any key
 //  Once user presses a key, the program waits for a DGPS fix (can be set by changing "FIX")
 //  Once the program sees a DGPS fix, manual mode is enabled
@@ -56,11 +56,20 @@
 //
 /*************************************************************************************************************************************************************************************************/
 
+//unmodified
+//mbed folder
 #include "mbed.h"
+//SDFileSystem folder
+#include "SDFileSystem.h"
+
+//modified
+//GPS folder
 #include "GPS.h"
+//PID folder
 #include "PID.h"
-#include "SDFileSystem.h"
-#include "modSensData.h"
+
+//from scratch
+#include "IMUDataAndFilters.h"
 #include "navigation.h"
 #include "Actuator.h"
 #include "TrollingMotor.h"
@@ -82,24 +91,32 @@
 #define headKc          1.0f                            //directly proportional
 #define headTi          0.0f                            //a larger number makes the integral have less affect on the output
 #define headTd          0.0f                            //a smaller number makes the derivative have less affect on the output
+
+//PID/PID.cpp
 PID headingPID(headKc, headTi, headTd, MAGN_PERIOD);    //Kc, Ti, Td, interval
 
-AnalogIn battery(A0);
-AnalogIn pot(A1);
-
-Serial xBee(PTB11, PTB10);                              //UART 3
-GPS gps(PTC15, PTC14);                                  //UART 4
-
+//mbed classes
 Timer headingTime;
 Timer acc;
 Timer magn;
 Timer inputTimer;
 Timer loopTimer;
-
-FILE *fr;                                               //file pointer for SD card
+AnalogIn battery(A0);                                   //analog input from +12v side of linear actuator potentiometer (uses voltage divider)
+AnalogIn pot(A1);                                       //analog input from the wiper of linear actuator potentionmeter (uses voltage divider)
+DigitalOut ldo(PTC10);                                  //Controls 3.3V LDO v-reg powering MTK3339 (GPS) 1 = GPS powered on and 0 = GPS powered down
+DigitalOut green(D3);                                   //Light output
+DigitalOut white(PTB9);                                 //Light output
+Serial xBee(PTB11, PTB10);                              //UART 3
 
-//On board microSD
-SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd", PTE6, SDFileSystem::SWITCH_POS_NO, 50000000);
+//GPS/GPS.cpp
+GPS gps(PTC15, PTC14);                                  //UART 4
+
+//Not sure where "FILE" is defined
+FILE *way;                                              //file pointer for waypoints on SD card
+FILE *data;                                             //file pointer for datalog
+
+//SDFileSystem/SDFileSystem.h
+SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd", PTE6, SDFileSystem::SWITCH_POS_NO, 50000000); //On board microSD
 
 /***************************************************Prototype functions****************************************************************************************************************************/
 void getDist(double posZero, double posOne, double curPos[2]);
@@ -107,35 +124,35 @@
 /***************************************************End of prototype functions*********************************************************************************************************************/
 
 /***************************************************Global Variables*******************************************************************************************************************************/
-double polarVector[2]   =       {0,0.0000001f};
-float manualSpeed       =       0.5f;
-double curPos[2]        =       {0,0};
+//TODO: rewrite polar vector functions to allow elimination of global variables
 
-//waypoint data is overwritten by data from SD card
-double goalPos[10][2]   =   {   {35.339289, -81.913164},
-                                {35.338943, -81.911024},
-                                {35.339289, -81.913164},
-                                {35.338943, -81.911024},
-                                {35.339289, -81.913164},
-                                {35.338943, -81.911024},
-                                {35.339289, -81.913164},
-                                {35.338943, -81.911024},
-                                {35.339289, -81.913164},
-                                {35.338943, -81.911024}
-                            };
+double polarVector[2]   =       {0,0.0000001f};         //poalarVector[0] = magnitude of vector, polarVector[1] = angle in degrees of vector
 
 /*************************************************************************************************************************************************************************************************/
 //                                                  MAIN
 /*************************************************************************************************************************************************************************************************/
 
 int main()
-{
+{    
     int wayPtNum = 0, mode = 0, adjustMode = 0;
     float magDiff = 0;
     float batVoltage = 0.0f, potVoltage = 0.0f, voltRatio = 0.0f;
     float curSet = 0.0f, prevSet = 0.29f;
     float filtered = 0.0000001f;
+    double curPos[2]        =       {0,0};
+    double goalPos[10][2];                                  //positions are initially read from SD card
+                                                            //when a position is recorded in record mode, the previously stored position on the SD card is overwritten with the new position
+                                                            
+    //set the initial state of the lights
+    green = 1;
+    white = 0;
     
+    //turn the GPS 3.3V LDO v-reg on
+    ldo = 1;
+    //wait for the GPS unit to boot
+    wait(1);
+    
+    //set xBee baud rate
     xBee.baud(115200);
     xBee.printf("\nI'm Alive...\n");
     xBee.printf("Press any key to begin\n");
@@ -143,17 +160,18 @@
     //wait for keypress to begin
     while(!xBee.readable());
     
+    //Get goal positions from SD card
     //start of SD card read
-    fr = fopen ("/sd/GPS_CORDS.txt", "rt");
+    way = fopen ("/sd/GPS_CORDS.txt", "r");
     
     xBee.printf("Reading SD Card Please Wait\n");
     
     for(int x = 0; x<=9; x++)
     {
-        fscanf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+        fscanf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
         xBee.printf("waypoint %d = %f,%f\n", x, goalPos[x][0], goalPos[x][1]);
     }
-    fclose(fr);
+    fclose(way);
     //end of SD card read
     
     //initialize magnetometer, accelerometer
@@ -176,28 +194,30 @@
         }
         else xBee.printf("Waiting for DGPS fix\tcurrent fix = no fix\n");
     }
+    
     //get IMU data and calculate the tilt compensated compass
-    getAccel();
-    getMagn();
-    updateAngles();
+    getAccel();                                     //IMUDataAndFilters.h
+    getMagn();                                      //IMUDataAndFilters.h
+    updateAngles();                                 //IMUDataAndFilters.h
     
     xBee.printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
     xBee.printf("dist %f\theading %f\n", polarVector[0], polarVector[1]);
     xBee.printf("\n\nstarting main loop\n");
         
-    //PID control of left and right motors based on input from tilt compensated compass
-    //Goal is to have the vehicle go straight
+    //set input constraints (heading difference)
     headingPID.setInputLimits(-180, 180);
     
     //set proportional output limits based on physical limits of actuator and mounting error
-    float distFromCenter = calcEnds(CENTER_RATIO, MAX_RATIO, MIN_RATIO);
+    float distFromCenter = calcEnds(CENTER_RATIO, MAX_RATIO, MIN_RATIO);        //navigation.h
     
+    //set output constraints (linear actuator max and min)
     headingPID.setOutputLimits((CENTER_RATIO - distFromCenter), (CENTER_RATIO + distFromCenter));
     //set mode to auto
     headingPID.setMode(0);
-    //We want the difference to be zero
+    //We want the difference between actual heading and the heading needed to be zero
     headingPID.setSetPoint(0);
     
+    //start timers
     loopTimer.start();
     headingTime.start();
     acc.start();
@@ -211,43 +231,62 @@
 
         if(mode == 0)
         {
-            if(gps.getData())
-            {
-                //gps.parseData();
-                //xBee.printf("lat %f\tlon %f\tHDOP %f\tfix %d\tsat %d\tspd %f\n", gps.degLat, gps.degLon, gps.HDOP, gps.fixtype, gps.satellites, gps.speed);
-                //GPSTimer.reset();
-            }
-            //This moves actuator to the requested position
-            //This is proportional feedback only
+            //checks to see if all three NEMA sentences from the GPS UART has been received
+            gps.getData();
+            
+            //check timer
             if(loopTimer.read() > RATE)
             {
+                //TODO: put this in a function
+                
+                //This moves actuator to the requested position
+                //This is proportional feedback ONLY
+                
+                //read analog input from wiper on potentiometer on linear actuator
                 potVoltage = pot.read();
+                //read analog input from battery voltage
                 batVoltage = battery.read();
-                //voltage = voltage * 3.3f;
+                //calculate ratio of the two (using a ratio prevents battery voltage fluctuation from affecting actual position)
                 voltRatio = potVoltage / batVoltage;
                 
+                //calculate the absolute value of how far off from requested actuator position we are (saves a few processor cycles)
                 float absDiff = sqrt((prevSet - voltRatio) * (prevSet - voltRatio));
+                //are we off enough to care?  if so, stop moving the actuator
                 if(absDiff <= RATIO_TOLERANCE)
                 {
                     turnStop(1.0f, 1.0f);
                     //xBee.printf("done\n");
                 }
+                
+                //do we need to go further right?
                 else if((prevSet - voltRatio) >= 0)
                 {
                     turnRight(1.0f, 1.0f);
                     //xBee.printf("turning right\n");
                 }
+                
+                //do we need to go further left?
                 else
                 {
                     turnLeft(1.0f, 1.0f);
                     //xBee.printf("turning left\n");
                 }
-                xBee.printf("battery = %f\tpot = %f\tratio = %f\tset %f\tHDOP = %f\tfix = %f\n", (batVoltage * VOLT_MULT), (potVoltage* VOLT_MULT), voltRatio, prevSet, gps.HDOP, gps.fixtype);
+                xBee.printf("battery = %f\tpot = %f\tratio = %f\tset %f\tHDOP = %f\tfix = %d\n", (batVoltage * VOLT_MULT), (potVoltage* VOLT_MULT), voltRatio, prevSet, gps.HDOP, gps.fixtype);
+                
+                //toggle lights
+                green = !green;
+                white = !white;
+                
+                //reset timer to zero
                 loopTimer.reset();
             }
+            
             //check to see if data is available on xBee
             if(xBee.readable())
             {
+                
+                //TODO: put this in a function
+                
                 char recChar = xBee.getc();
                 
                 //change to autonomous mode
@@ -264,6 +303,15 @@
                     goStop();
                     mode = 3;
                 }
+                else if(recChar == '<')
+                {
+                    xBee.printf("Power cycling GPS\nPlease wait\n");
+                    goStop();
+                    ldo = 0;
+                    wait(0.5);
+                    ldo = 1;
+                    wait(0.5);
+                }
                 else if(recChar == '1')
                 {
                     xBee.printf("stop\n");
@@ -344,18 +392,22 @@
         /*********************************************************************************************************************************************************************************************/
         //                                          autonomous mode
         /*********************************************************************************************************************************************************************************************/
-
+        //default trolling motor state when entering autonomous mode is off (user must press "w" to go forward)
         if(mode == 1)
         {
             //check xBee
             if(xBee.readable())
             {
+                //TODO: put this in a function
+                
                 char recChar = xBee.getc();
+                //stop
                 if(recChar == '1')
                 {
                     xBee.printf("stop\n");
                     goStop();
                 }
+                //go forward
                 if(recChar == 'w')
                 {
                     xBee.printf("forward\n");
@@ -381,8 +433,11 @@
                     polarVector[1] = polarVector[1] - 1;
                     xBee.printf("reduced angle %f\n", polarVector[1]);
                 }
+                
+                //increments settings based on adjust mode
                 else if(recChar == '+')
                 {
+                    //adjust waypoint
                     if(adjustMode == 0)
                     {
                         if(wayPtNum != 9)
@@ -395,6 +450,7 @@
                             xBee.printf("maximum waypoint reached\n");
                         }
                     }
+                    //increment proportional gain of heading PID
                     else if(adjustMode == 1)
                     {
                         float curKc = headingPID.getPParam();
@@ -404,6 +460,7 @@
                         headingPID.setTunings(curKc, curTi, curTd);
                         xBee.printf("Kc set to %f\n", curKc);
                     }
+                    //increment integral gain of heading PID
                     else if(adjustMode == 2)
                     {
                         float curKc = headingPID.getPParam();
@@ -413,6 +470,7 @@
                         headingPID.setTunings(curKc, curTi, curTd);
                         xBee.printf("Ti set to %f\n", curTi);
                     }
+                    //increment derivative gain of heading PID
                     else if(adjustMode == 3)
                     {
                         float curKc = headingPID.getPParam();
@@ -423,6 +481,7 @@
                         xBee.printf("Td set to %f\n", curTd);
                     }
                 }
+                //decrements setting based on adjust mode
                 else if(recChar == '-')
                 {
                     if(adjustMode == 0)
@@ -437,6 +496,7 @@
                             xBee.printf("minimum waypoint reached\n");
                         }
                     }
+                    //decrement proportional gain of heading PID
                     else if(adjustMode == 1)
                     {
                         float curKc = headingPID.getPParam();
@@ -446,6 +506,7 @@
                         headingPID.setTunings(curKc, curTi, curTd);
                         xBee.printf("Kc set to %f\n", curKc);
                     }
+                    //decrement integral gain of heading PID
                     else if(adjustMode == 2)
                     {
                         float curKc = headingPID.getPParam();
@@ -455,6 +516,7 @@
                         headingPID.setTunings(curKc, curTi, curTd);
                         xBee.printf("Ti set to %f\n", curTi);
                     }
+                    //decrement derivative gain of heading PID
                     else if(adjustMode == 3)
                     {
                         float curKc = headingPID.getPParam();
@@ -465,7 +527,7 @@
                         xBee.printf("Td set to %f\n", curTd);
                     }
                 }
-                //change current waypoint number
+                //change or reset current waypoint number
                 else if(recChar == 'r')
                 {
                     goStop();
@@ -475,64 +537,92 @@
                     while(!xBee.readable());
                     char tempWS[2];
                     tempWS[0] = xBee.getc();
+                    
+                    //press "r" again to reset waypoint number to zero
                     if(tempWS[0] == 'r')
                     {
                         wayPtNum = 0;
                     }
+                    
+                    //else enter the number of waypoint desired
                     else
                     {
                         sscanf(tempWS, "%d", &wayPtNum);
                         xBee.printf("waypoint is now %d\n", wayPtNum);
                     }
                 }
+                //change adjust mode
                 else if(recChar == 'p')
                 {
                     xBee.printf("To set adjust mode:\nEnter w to adjust waypoint number\nEnter c to adjust Kc\nEnter i to adjust Ti\nEnter d to adjust Td\nEnter z to exit\n");
                     while(!xBee.readable());
                     char recCharTemp = xBee.getc();
+                    
+                    //set adjust to edit waypoints
                     if(recCharTemp == 'w')
                     {
                         adjustMode = 0;
                     }
+                    
+                    //set adjust to edit proportional gain
                     else if(recCharTemp == 'c')
                     {
                         adjustMode = 1;
                         xBee.printf("Adjust mode set to Kc\tEnter + to increment and - to decrement Kc\n");
                     }
+                    
+                    //set adjust to edit integral gain
                     else if(recCharTemp == 'i')
                     {
                         adjustMode = 2;
                         xBee.printf("Adjust mode set to Ti\tEnter + to increment and - to decrement Ti\n");
                     }
+                    
+                    //set adjust to edit derivative gain
                     else if(recCharTemp == 'd')
                     {
                         adjustMode = 3;
                         xBee.printf("Adjust mode set to Td\tEnter + to increment and - to decrement Td\n");
                     }
+                    //if any other key is pressed no change to adjust mode is made
                     else
                     {
                         xBee.printf("No changes made\n");
                     }
                 }
             }
+            //if no xBee data is received
             else
             {
+                
+                //TODO: put this in a function
+                
+                //checks to see if all three NEMA sentences from the GPS UART has been received
                 if(gps.getData())
                 {
                     double tempPos[2] = {0,0};
                     
+                    //store most recent gps location in a temporary variable (using temporary variables because GPS data is accumulated in a low pass filter)
                     tempPos[0] = gps.degLat;
                     tempPos[1] = gps.degLon;
+                    
+                    //calculate the magnitude of the vector
                     getDist(goalPos[wayPtNum][0],goalPos[wayPtNum][1], tempPos);
+                    
+                    //calculate the angle of the vector
                     getAngle(goalPos[wayPtNum][0],goalPos[wayPtNum][1], tempPos, 0);
-                    //xBee.printf("dist %f\tMagDiff %f\tHDOP = %f\n", polarVector[0], magDiff, gps.HDOP);
                     
+                    //checks if the magnitude of distance from goal position is less than threshold for "arriving"
                     if(polarVector[0] <= ARRIVED)
                     {
                         xBee.printf("Goal Position %d reached!\n", wayPtNum);
                         wait(1);
+                        
+                        //increment waypoint number
                         wayPtNum ++;
-                        if(wayPtNum >= 6)
+                        
+                        //we only have ten waypoints so we mus stop at ten
+                        if(wayPtNum >= 10)
                         {
                             xBee.printf("Final Position Reached!\nShutting down\n");
                             goStop();
@@ -543,27 +633,41 @@
                         {
                             //flush heading PID data since we have a new heading
                             headingPID.reset();
+                            
+                            //calculate the angle of the vector
                             getAngle(goalPos[wayPtNum ][0],goalPos[wayPtNum][1], goalPos[wayPtNum - 1], 1);
+                            
                             xBee.printf("Moving to Goal Position %d\theading = %f\n", wayPtNum, polarVector[1]);
                         }
                     }
                 }
                 
+                //time to read accelerometer?
                 if(acc.read() >= ACCEL_PERIOD)
                 {
+                    //get accelerometer data
                     getAccel(); 
+                    
+                    //reset timer to zero
                     acc.reset();
                 }
-                //Heading PID
+                
+                //time to read magnatometer and calculate heading PID?
                 if(magn.read() >= MAGN_PERIOD)
                 {
-                    getMagn();
-                    updateAngles();
-                    filtered = lowPass(yaw, filtered, 0);
-                    magDiff = whichWay(filtered, 0);
+                    //get magnatometer data
+                    getMagn();                              //IMUDataAndFilters.h
+                    updateAngles();                         //IMUDataAndFilters.h
+                    filtered = lowPass(yaw, filtered, 0);   //IMUDataAndFilters.h
+                    magDiff = whichWay(filtered, 0);        //navigation.h
+                    
+                    //give PID input
                     headingPID.setProcessValue(-magDiff);
+                    
+                    //get output from PID
                     curSet = headingPID.compute();
-                    xBee.printf("ratio = %f\tcurset = %f\theading = %f\tdiff = %f\n", voltRatio, curSet, filtered, magDiff);
+                    
+                    //reset timer to zero
                     magn.reset();
                 }
                              
@@ -571,44 +675,68 @@
                 //This is proportional feedback only
                 if(loopTimer.read() > RATE)
                 {
+                    //TODO: put this in a function
+                    
+                    //This moves actuator to the requested position
+                    //This is proportional feedback ONLY
+                    
+                    //read analog input from wiper on potentiometer on linear actuator
                     potVoltage = pot.read();
+                    //read analog input from battery voltage
                     batVoltage = battery.read();
-                    //voltage = voltage * 3.3f;
+                    //calculate ratio of the two (using a ratio prevents battery voltage fluctuation from affecting actual position)
                     voltRatio = potVoltage / batVoltage;
                     
+                    //calculate the absolute value of how far off from requested actuator position we are (saves a few processor cycles)
                     float absDiff = sqrt((curSet - voltRatio) * (curSet - voltRatio));
+                    
+                    //are we off enough to care?  if so, stop moving the actuator
                     if(absDiff <= RATIO_TOLERANCE)
                     {
                         turnStop(1.0f, 1.0f);
-                        xBee.printf("done\n");
+                        //xBee.printf("done\n");
                     }
+                    //do we need to turn right?
                     else if((curSet - voltRatio) >= 0)
                     {
                         if(voltRatio > MAX_RATIO)
                         {
-                            xBee.printf("Max Limit Reached\n");
+                            //xBee.printf("Max Limit Reached\n");
                             turnStop(1.0f, 1.0f);
                         }
                         else
                         {
                             turnRight(1.0f, 1.0f);
-                            xBee.printf("turning Right\n");
+                            //xBee.printf("turning Right\n");
                         }
                     }
+                    //do we need to turn left?
                     else
                     {
                         if(voltRatio < MIN_RATIO)
                         {
-                            xBee.printf("Min Limit Reached\n");
+                            //xBee.printf("Min Limit Reached\n");
                             turnStop(1.0f, 1.0f);
                         }
                         else
                         {
                             turnLeft(1.0f, 1.0f);
-                            xBee.printf("turning Left\n");
+                            //xBee.printf("turning Left\n");
                         }
                     }
-                    //xBee.printf("battery = %f\tpot = %f\tratio = %f\tmotorSpeed = %f\tmoveSpeed %f\n", (batVoltage * VOLT_MULT), (potVoltage* VOLT_MULT), voltRatio, motorSpeed, moveSpeed);
+                    
+                    //toggle light state
+                    green = !green;
+                    white = !white;
+                    
+                    xBee.printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
+                    
+                    //record data to SD card
+                    data = fopen("/sd/data.txt", "a");
+                    fprintf(data, "%d,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n", wayPtNum, (batVoltage * VOLT_MULT), voltRatio, curSet, filtered, magDiff, polarVector[0], gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
+                    fclose(data);
+                    
+                    //reset timer to zero
                     loopTimer.reset();
                 }
             }
@@ -620,7 +748,9 @@
         
         if(mode == 3)
         {
+            //stop the trolling motor
             goStop();
+            
             xBee.printf("\nPlease enter position number (0-9), or press y to return to manual mode\n");
             
             while(!xBee.readable());
@@ -634,6 +764,8 @@
             }
             else 
             {
+                //TODO: put this in a function
+                
                 xBee.printf("\nFinding most accurate GPS position\nThis will take a few seconds\n\n");
             
                 float lowestHDOP = 100;
@@ -654,6 +786,9 @@
                     }
                     xBee.printf("lat %f\tlon %f\thead %f\talt %f\tspd %f\tfix %d\tsat %d\n", gps.degLat, gps.degLon, gps.heading, gps.altitude, gps.speed, gps.fixtype, gps.satellites);
                     char tempChar = 'n';
+                    
+                    //first lockup was here
+                    //now pressing "1" will break out of while loop
                     while(!gps.getData() && !(tempChar == '1'))
                     {
                         if(xBee.readable())
@@ -667,79 +802,79 @@
                 {
                     goalPos[0][0] = curPos[0];
                     goalPos[0][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);                    
+                    fclose(way);                    
                 }
                 else if(recChar == '1')
                 {
                     goalPos[1][0] = curPos[0];
                     goalPos[1][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 else if(recChar == '2')
                 {
                     goalPos[2][0] = curPos[0];
                     goalPos[2][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 else if(recChar == '3')
                 {
                     goalPos[3][0] = curPos[0];
                     goalPos[3][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 else if(recChar == '4')
                 {
                     goalPos[4][0] = curPos[0];
                     goalPos[4][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 else if(recChar == '5')
                 {
                     goalPos[5][0] = curPos[0];
                     goalPos[5][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 else if(recChar == '6')
                 {
@@ -750,40 +885,40 @@
                 {
                     goalPos[7][0] = curPos[0];
                     goalPos[7][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 else if(recChar == '8')
                 {
                     goalPos[8][0] = curPos[0];
                     goalPos[8][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 else if(recChar == '9')
                 {
                     goalPos[9][0] = curPos[0];
                     goalPos[9][1] = curPos[1];
+                    
                     //write new coords to SD card
-                    fr = fopen("/sd/GPS_CORDS.txt", "w+");
-                    
+                    way = fopen("/sd/GPS_CORDS.txt", "w+");
                     for(int x = 0; x<=9; x++)
                     {
-                        fprintf(fr, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
+                        fprintf(way, "%f,%f\n", &goalPos[x][0], &goalPos[x][1]);
                     }
-                    fclose(fr);            
+                    fclose(way);            
                 }
                 xBee.printf("position %c updated\t", recChar);
             }
@@ -830,7 +965,8 @@
     arcLength[1] = EARTHRADIUS * ((goalPos[0] - curPos[0]) * DEGREETORAD);
     //X
     arcLength[0] = EARTHRADIUS * ((goalPos[1] - curPos[1]) * DEGREETORAD);
-
+    
+    //get rid of previous low passed angle data
     if(flush)
     {
         //Use arcTan(x/y) b/c we want our heading to be in respect to North (North = 0 degrees, East = 90 deg, etc.)
@@ -838,6 +974,8 @@
         //make negative angles positive
         if(polarVector[1] < 0) polarVector[1] = polarVector[1] + 360;    
     }
+    
+    //lowpass filter the angle
     else
     {