Quadcopter software. Flying - Contact me for more details or a copy of the PC ground station code

Dependencies:   ConfigFile PID PPM MODSERIAL mbed-rtos mbed MaxbotixDriver TinyGPS filter

Revision:
6:4c207e7b1203
Parent:
5:7b7db24ef6eb
Child:
7:bc5822aa8878
--- a/serialPortMonitor.h	Mon Sep 22 10:16:31 2014 +0000
+++ b/serialPortMonitor.h	Thu Jan 22 18:03:22 2015 +0000
@@ -3,99 +3,148 @@
 #include "hardware.h"
 
 //Declarations
-void SerialPortMonitorTask(void const *n);
 void CheckWirelessSerialCommand();
 //void CheckGPSSerialCommand();
-void WriteSettingsToConfig();
-void ConvertToCharArray(float number);
-void ConvertToCharArray(int number);
 void UpdatePID();
 
 //Variables
-char* _str = new char[1024];
 char _wirelessSerialBuffer[255];
 int _wirelessSerialRxPos = 0;
-char _gpsSerialBuffer[255];
-int _gpsSerialRxPos = 0;
-
-//Timers
-RtosTimer       *_serialPortMonitorUpdateTimer;
+//char _gpsSerialBuffer[255];
+//int _gpsSerialRxPos = 0;
 
 // A thread to monitor the serial ports
 void SerialPortMonitorThread(void const *args) 
-{   
-    //Update Timer
-    _serialPortMonitorUpdateTimer = new RtosTimer(SerialPortMonitorTask, osTimerPeriodic, (void *)0);
-    int updateTime = (1.0 / SERIAL_MONITOR_FREQUENCY) * 1000;
-    _serialPortMonitorUpdateTimer->start(updateTime);
+{     
+    printf("Serial port monitor thread started\r\n");
     
-    // Wait here forever
-    Thread::wait(osWaitForever);
-}
-
-void SerialPortMonitorTask(void const *n)
-{
-    //Print to windows application
-    int batt = 0;
-    _wirelessSerial.printf("<%1.6f:%1.6f:%1.6f:%1.6f:%1.6f:%1.6f:%1.6f:%d:%1.6f:%1.6f:%1.6f:%1.6f:%1.6f:%1.6f:%d:%d:%d:%d:%1.6f:%1.6f:%1.6f:%1.2f:%1.2f:%1.2f:%1.2f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%1.8f:%d>",
-    _motorPower[0], _motorPower[1], _motorPower[2], _motorPower[3], _ypr[0], _ypr[1], _ypr[2], batt, _ratePIDControllerOutputs[0], _ratePIDControllerOutputs[1], _ratePIDControllerOutputs[2], _stabPIDControllerOutputs[0], _stabPIDControllerOutputs[1], _stabPIDControllerOutputs[2], _armed, _initialised, _rate, _stab, _gyroRate[0], _gyroRate[1], _gyroRate[2], _rcMappedCommands[0], _rcMappedCommands[1], _rcMappedCommands[2], _rcMappedCommands[3], _yawRatePIDControllerP, _yawRatePIDControllerI, _yawRatePIDControllerD, _pitchRatePIDControllerP, _pitchRatePIDControllerI, _pitchRatePIDControllerD, _rollRatePIDControllerP, _rollRatePIDControllerI, _rollRatePIDControllerD, _yawStabPIDControllerP, _yawStabPIDControllerI, _yawStabPIDControllerD, _pitchStabPIDControllerP, _pitchStabPIDControllerI, _pitchStabPIDControllerD, _rollStabPIDControllerP, _rollStabPIDControllerI, _rollStabPIDControllerD, 0/*_gpsValues[0]*/, 0/* _gpsValues[1]*/, 0/*_gpsValues[2]*/, 0/*_gpsValues[3]*/, 0/*_gpsValues[4]*/, 0/*_gpsConnected*/); 
+    while(true)
+    {
+        //Print to windows application
+        //int batt = 0;
+        //_wirelessSerial.printf("<%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%d:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%d:%d:%d:%d:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f:%1.2f::1.2f:%d:%1.2f:%1.2f:%1.2f:%1.2f>",
+        //_motorPower[0], _motorPower[1], _motorPower[2], _motorPower[3], _ypr[0], _ypr[1], _ypr[2], batt, _ratePIDControllerOutputs[0], _ratePIDControllerOutputs[1], _ratePIDControllerOutputs[2], _stabPIDControllerOutputs[0], _stabPIDControllerOutputs[1], _stabPIDControllerOutputs[2], _armed, _initialised, _rate, _stab, _gyroRate[0], _gyroRate[1], _gyroRate[2], _rcMappedCommands[0], _rcMappedCommands[1], _rcMappedCommands[2], _rcMappedCommands[3], _yawRatePIDControllerP, _yawRatePIDControllerI, _yawRatePIDControllerD, _pitchRatePIDControllerP, _pitchRatePIDControllerI, _pitchRatePIDControllerD, _rollRatePIDControllerP, _rollRatePIDControllerI, _rollRatePIDControllerD, _yawStabPIDControllerP, _yawStabPIDControllerI, _yawStabPIDControllerD, _pitchStabPIDControllerP, _pitchStabPIDControllerI, _pitchStabPIDControllerD, _rollStabPIDControllerP, _rollStabPIDControllerI, _rollStabPIDControllerD, 0/*_gpsValues[0]*/, 0/* _gpsValues[1]*/, 0/*_gpsValues[2]*/, 0/*_gpsValues[3]*/, 0/*_gpsValues[4]*/, 0/*_gpsConnected*/, _zeroValues[1], _zeroValues[2], _oldZeroValues[1], _oldZeroValues[2]); 
+        //      0               1               2               3            4        5       6       7                   8                       9                                   10                              11  
         
-    //Check for wireless serial command
-    if (_wirelessSerial.readable() > 0)
-    {
-        int c = _wirelessSerial.getc();
-        
-        switch (c)
+        //Check comms mode and print correct data back to PC application
+        switch(_commsMode)
         {
-            case 60: // 
-                _wirelessSerialRxPos = 0;
+            //Motor power
+            case 0:
+                _wirelessSerial.printf("<M1=%1.2f:M2=%1.2f:M3=%1.2f:M4=%1.2f>",
+                _motorPower[0], _motorPower[1], _motorPower[2], _motorPower[3]);
+                break;
+            
+            //PID outputs
+            case 1:
+                _wirelessSerial.printf("<SYPID=%1.2f:SPPID=%1.2f:SRPID=%1.2f:RYPID=%1.2f:RPPID=%1.2f:RRPID=%1.2f>",
+                _stabPIDControllerOutputs[0], _stabPIDControllerOutputs[1], _stabPIDControllerOutputs[2], _ratePIDControllerOutputs[0], _ratePIDControllerOutputs[1], _ratePIDControllerOutputs[2]);
+                break;
+            
+            //IMU outputs 
+            case 2:
+                _wirelessSerial.printf("<SY=%1.2f:SP=%1.2f:SR=%1.2f:RY=%1.2f:RP=%1.2f:RR=%1.2f>",
+                _ypr[0], _ypr[1], _ypr[2], _gyroRate[0], _gyroRate[1], _gyroRate[2]);
                 break;
             
-            case 10: // LF
-            case 13: // CR
-            case 62: // >
-                CheckWirelessSerialCommand();
+            //Status  
+            case 3:
+                _wirelessSerial.printf("<Batt=%d:Armed=%d:Init=%d:Rate=%d:Stab=%d:Lev=%d>",
+                _batt, _armed, _initialised, _rate, _stab, _levelOffset);
+                break;
+            
+            //Mapped RC commands   
+            case 4:
+                _wirelessSerial.printf("<MRCY=%1.2f:MRCP=%1.2f:MRCR=%1.2f:MRCT=%1.2f>",
+                _rcMappedCommands[0], _rcMappedCommands[1], _rcMappedCommands[2], _rcMappedCommands[3]);
+                break;
+            
+            //PID Tuning
+            case 5:
+                _wirelessSerial.printf("<RYPIDP=%1.2f:RYPIDI=%1.2f:RYPIDD=%1.2f:RPPIDP=%1.2f:RPPIDI=%1.2f:RPPIDD=%1.2f:RRPIDP=%1.2f:RRPIDI=%1.2f:RRPIDD=%1.2f:SYPIDP=%1.2f:SYPIDI=%1.2f:SYPIDD=%1.2f:SPPIDP=%1.2f:SPPIDI=%1.2f:SPPIDD=%1.2f:SRPIDP=%1.2f:SRPIDI=%1.2f:SRPIDD=%1.2f>",
+                _yawRatePIDControllerP, _yawRatePIDControllerI, _yawRatePIDControllerD, _pitchRatePIDControllerP, _pitchRatePIDControllerI, _pitchRatePIDControllerD, _rollRatePIDControllerP, _rollRatePIDControllerI, _rollRatePIDControllerD, _yawStabPIDControllerP, _yawStabPIDControllerI, _yawStabPIDControllerD, _pitchStabPIDControllerP, _pitchStabPIDControllerI, _pitchStabPIDControllerD, _rollStabPIDControllerP, _rollStabPIDControllerI, _rollStabPIDControllerD);
+                break;
+              
+            //GPS  
+            case 6:
+                _wirelessSerial.printf("<GLat=%1.6f:GLon=%1.6f:GAlt=%1.2f:GAng=%1.2f:GSpd=%1.2f:GInit=%d>",
+                _gpsValues[0], _gpsValues[1], _gpsValues[2], _gpsValues[3], _gpsValues[4], _gpsConnected);
+                break;
+            
+            //Zero mode  
+            case 7:
+                _wirelessSerial.printf("<ZY=%1.6f:ZP=%1.6f:ZR=%1.6f>",
+                _zeroValues[0], _zeroValues[1], _zeroValues[2]);
+                break;  
+            
+            //Raw RC Commands
+            case 8:
+                _wirelessSerial.printf("<RRC1=%1.2f:RRC2=%1.2f:RRC3=%1.2f:RRC4=%1.2f:RRC5=%1.2f:RRC6=%1.2f:RRC7=%1.2f:RRC8=%1.2f>",
+                _rcCommands[0], _rcCommands[1], _rcCommands[2], _rcCommands[3], _rcCommands[4], _rcCommands[5], _rcCommands[6], _rcCommands[7]);
                 break;
                 
             default:
-                _wirelessSerialBuffer[_wirelessSerialRxPos++] = c;
-                if (_wirelessSerialRxPos > 200)
-                {
-                    _wirelessSerialRxPos = 0;
-                }
-                break;
+                break;                  
         }
-    } 
-
-    //Check for GPS serial command
-    /*if (_gpsSerial.readable() > 0)
-    {
-        int c = _gpsSerial.getc();
-        //printf("%c", c);
-        _wiredSerial.putc(c);
         
-        switch (c)
+        //Check for wireless serial command
+        if (_wirelessSerial.readable() > 0)
         {
-            case 60: // <
-                _gpsSerialRxPos = 0;
-                break;
+            int c = _wirelessSerial.getc();
             
-            case 10: // LF
-            case 13: // CR
-            case 62: // >
-                CheckGPSSerialCommand();
-                break;
+            switch (c)
+            {
+                case 60: // 
+                    _wirelessSerialRxPos = 0;
+                    break;
                 
-            default:
-                _gpsSerialBuffer[_gpsSerialRxPos++] = c;
-                if (_gpsSerialRxPos > 200)
-                {
+                case 10: // LF
+                case 13: // CR
+                case 62: // >
+                    CheckWirelessSerialCommand();
+                    break;
+                    
+                default:
+                    _wirelessSerialBuffer[_wirelessSerialRxPos++] = c;
+                    if (_wirelessSerialRxPos > 200)
+                    {
+                        _wirelessSerialRxPos = 0;
+                    }
+                    break;
+            }
+        } 
+    
+        //Check for GPS serial command
+        /*if (_gpsSerial.readable() > 0)
+        {
+            int c = _gpsSerial.getc();
+            //printf("%c", c);
+            _wiredSerial.putc(c);
+            
+            switch (c)
+            {
+                case 60: // <
                     _gpsSerialRxPos = 0;
-                    printf("oh no \r\n");
-                }
-                break;
-        }
-    } */
+                    break;
+                
+                case 10: // LF
+                case 13: // CR
+                case 62: // >
+                    CheckGPSSerialCommand();
+                    break;
+                    
+                default:
+                    _gpsSerialBuffer[_gpsSerialRxPos++] = c;
+                    if (_gpsSerialRxPos > 200)
+                    {
+                        _gpsSerialRxPos = 0;
+                        printf("oh no \r\n");
+                    }
+                    break;
+            }
+        } */
+        Thread::wait(100);
+    }
 }
 
 //Checks for a valid command from the serial port and executes it
@@ -120,20 +169,23 @@
     
     switch (command)
     {
-        //Spare
+        //Start level offset mode to teach quad level
         case 'a':
+            _levelOffset = true;
             break;
+            
         //Arm disarm
         case 'b':
             if(_initialised == true && _armed == false)
             {
                 Arm();
             }
-            else
+            else if(_armed == true)
             {
                 Disarm();
             }
             break;
+            
         //Set mode
         case 'c':
             if(_rate == true)
@@ -147,118 +199,151 @@
                 _stab = false;
             }
             break;
+            
         //Set yaw
         case 'd':
             if(_armed == true) _rcMappedCommands[0] = value; //Yaw
+            else _rcMappedCommands[0] = 0;
             break;
+            
         //Set pitch
         case 'e':
             if(_armed == true) _rcMappedCommands[1] = value; //Pitch
+            else _rcMappedCommands[1] = 0;
             break;
+            
         //Set roll
         case 'f':
             if(_armed == true) _rcMappedCommands[2] = value; //Roll
+            else _rcMappedCommands[2] = 0;
             break;
+            
         //Set thrust
         case 'g':
             if(_armed == true) _rcMappedCommands[3] = value; //Thrust
+            else _rcMappedCommands[3] = 0;
             break;
+            
         //Set PID values
         case 'h':
             _yawRatePIDControllerP = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'i':
             _yawRatePIDControllerI = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'j':
             _yawRatePIDControllerD = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'k':
             _pitchRatePIDControllerP = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'l':
             _pitchRatePIDControllerI = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'm':
             _pitchRatePIDControllerD = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'n':
             _rollRatePIDControllerP = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'o':
             _rollRatePIDControllerI = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'p':
             _rollRatePIDControllerD = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'q':
             _yawStabPIDControllerP = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'r':
             _yawStabPIDControllerI = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 's':
             _yawStabPIDControllerD = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 't':
             _pitchStabPIDControllerP = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'u':
             _pitchStabPIDControllerI = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'v':
             _pitchStabPIDControllerD = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'w':
             _rollStabPIDControllerP = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'x':
             _rollStabPIDControllerI = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
+            
         case 'y':
             _rollStabPIDControllerD = value;
             UpdatePID();
             WriteSettingsToConfig();
             break;
-        //Zero pitch and roll
+            
+        case 'z':
+            _commsMode = value;
+            break;
+            
         case '1':
-            ZeroPitchRoll();
+            _zeroValues[0] = 0;
+            _zeroValues[1] = 0;
+            _zeroValues[2] = 0;
             WriteSettingsToConfig();
             break;
+            
         default:
             break;
     }
@@ -335,162 +420,6 @@
     return;
 }*/
 
-//Saves settings to config file
-void WriteSettingsToConfig()
-{
-    _wiredSerial.printf("Writing settings to config file\n\r");
-    
-    if(_armed == false) //Not flying
-    {
-        _freeIMU.sample(false);
-        
-        //Write values
-        ConvertToCharArray(_yawRatePIDControllerP);
-        if (!_configFile.setValue("_yawRatePIDControllerP", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _yawRatePIDControllerP\n\r");
-        }
-        
-        ConvertToCharArray(_yawRatePIDControllerI);
-        if (!_configFile.setValue("_yawRatePIDControllerI", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _yawRatePIDControllerI\n\r");
-        }
-        
-        ConvertToCharArray(_yawRatePIDControllerD);
-        if (!_configFile.setValue("_yawRatePIDControllerD", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _yawRatePIDControllerD\n\r");
-        }
-        
-        ConvertToCharArray(_pitchRatePIDControllerP);
-        if (!_configFile.setValue("_pitchRatePIDControllerP", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _pitchRatePIDControllerP\n\r");
-        }
-        
-        ConvertToCharArray(_pitchRatePIDControllerI);
-        if (!_configFile.setValue("_pitchRatePIDControllerI", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _pitchRatePIDControllerI\n\r");
-        }
-        
-        ConvertToCharArray(_pitchRatePIDControllerD);
-        if (!_configFile.setValue("_pitchRatePIDControllerD", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _pitchRatePIDControllerD\n\r");
-        }
-        
-        ConvertToCharArray(_rollRatePIDControllerP);
-        if (!_configFile.setValue("_rollRatePIDControllerP", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _rollRatePIDControllerP\n\r");
-        }
-        
-        ConvertToCharArray(_rollRatePIDControllerI);
-        if (!_configFile.setValue("_rollRatePIDControllerI", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _rollRatePIDControllerI\n\r");
-        }
-        
-        ConvertToCharArray(_rollRatePIDControllerD);
-        if (!_configFile.setValue("_rollRatePIDControllerD", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _rollRatePIDControllerD\n\r");
-        }
-    
-        ConvertToCharArray(_yawStabPIDControllerP);
-        if (!_configFile.setValue("_yawStabPIDControllerP", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _yawStabPIDControllerP\n\r");
-        }
-        
-        ConvertToCharArray(_yawStabPIDControllerI);
-        if (!_configFile.setValue("_yawStabPIDControllerI", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _yawStabPIDControllerI\n\r");
-        }
-        
-        ConvertToCharArray(_yawStabPIDControllerD);
-        if (!_configFile.setValue("_yawStabPIDControllerD", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _yawStabPIDControllerD\n\r");
-        }
-        
-        ConvertToCharArray(_pitchStabPIDControllerP);
-        if (!_configFile.setValue("_pitchStabPIDControllerP", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _pitchStabPIDControllerP\n\r");
-        }
-        
-        ConvertToCharArray(_pitchStabPIDControllerI);
-        if (!_configFile.setValue("_pitchStabPIDControllerI", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _pitchStabPIDControllerI\n\r");
-        }
-        
-        ConvertToCharArray(_pitchStabPIDControllerD);
-        if (!_configFile.setValue("_pitchStabPIDControllerD", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _pitchStabPIDControllerD\n\r");
-        }
-        
-        ConvertToCharArray(_rollStabPIDControllerP);
-        if (!_configFile.setValue("_rollStabPIDControllerP", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _rollStabPIDControllerP\n\r");
-        }
-        
-        ConvertToCharArray(_rollStabPIDControllerI);
-        if (!_configFile.setValue("_rollStabPIDControllerI", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _rollStabPIDControllerI\n\r");
-        }
-        
-        ConvertToCharArray(_rollStabPIDControllerD);
-        if (!_configFile.setValue("_rollStabPIDControllerD", _str))
-        {
-            _wiredSerial.printf("Failed to write value for _rollStabPIDControllerD\n\r");
-        }
-    
-        ConvertToCharArray(_zeroValues[1]);
-        if (!_configFile.setValue("_zeroPitch", _str))
-        {
-            _wiredSerial.printf("Failed to write value for zero pitch\n\r");
-        }
-        
-        ConvertToCharArray(_zeroValues[2]);
-        if (!_configFile.setValue("_zeroRoll", _str))
-        {
-            _wiredSerial.printf("Failed to write value for zero roll\n\r");
-        }
-        
-        if (!_configFile.write("/local/config.cfg"))
-        {
-            _wiredSerial.printf("Failure to write settings to configuration file.\n\r");
-        }
-        else _wiredSerial.printf("Successfully wrote settings to configuration file.\n\r");
-        
-        _freeIMU.sample(true);
-    }
-    else
-    {
-        _wiredSerial.printf("Cannot write to config file whilst throttle is above 0\n\r");
-    }
-}
-
-//Converts float to char array
-void ConvertToCharArray(float number)
-{
-    sprintf(_str, "%1.8f", number );  
-}
-
-//Converts integer to char array
-void ConvertToCharArray(int number)
-{
-    sprintf(_str, "%d", number );  
-}
-
 //Updates PID tunings
 void UpdatePID()
 {