New version of quadcopter software written to OO principles

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

Status/Status.cpp

Committer:
joe4465
Date:
2015-04-01
Revision:
2:969dfa4f2436
Parent:
0:c6a85bb2a827
Child:
3:4823d6750629

File content as of revision 2:969dfa4f2436:

#include "Status.h"

Status::Status()
{
    setFlightMode(STAB);
    setBaseStationMode(STATUS);
    setNavigationMode(NONE);
    setBatteryLevel(0);
    setRcConnected(false);
    setArmed(false);
    setMotorsSpinning(false);
    setDeadZone(false);
    setInitialised(false);
    DEBUG("Status initialised\r\n");    
}

Status::~Status(){}

bool Status::update()
{
         if(getInitialised() == false && getRcConnected() == false) setState(Status::PREFLIGHT);
    else if(getInitialised() == true && getRcConnected() == false) setState(Status::PREFLIGHT);
    else if(getInitialised() == true && getRcConnected() == true && getArmed() == false) setState(Status::STANDBY);
    else if(getInitialised() == true && getRcConnected() == true && getArmed() == true && getMotorsSpinning() == false) setState(Status::GROUND_READY);
    else if(getInitialised() == true && getRcConnected() == true && getArmed() == true && getMotorsSpinning() == true && getNavigationMode() == Status::NONE) setState(Status::MANUAL);
    else if(getInitialised() == true && getRcConnected() == true && getArmed() == true && getMotorsSpinning() == true && getNavigationMode() == Status::POSITION_HOLD) setState(Status::AUTO);
    else if(getInitialised() == true && getRcConnected() == true && getArmed() == true && getMotorsSpinning() == true && getNavigationMode() == Status::ALTITUDE_HOLD) setState(Status::STABILISED);

    //else setState(Status::ERROR); 
    
    return true;
}

bool Status::setState(State state)
{
    switch(state)
    {
        case PREFLIGHT:
            if(_state != Status::PREFLIGHT)
            {
                _state = PREFLIGHT;
                _statusLights.clear();
                DEBUG("State set to PREFLIGHT\r\n");
                return true;
            }
            _statusLights.preFlight();
            return true;
              
        case STANDBY:
            if(_state != Status::STANDBY)
            {
                _state = STANDBY;
                _statusLights.clear();
                DEBUG("State set to STANDBY\r\n");
                return true;
            }
            _statusLights.standby();
            return true;
            
        case GROUND_READY:
            if(_state != Status::GROUND_READY)
            {
                _state = GROUND_READY;
                _statusLights.clear();
                DEBUG("State set to GROUND_READY\r\n");
                return true;
            }
            _statusLights.groundReady();
            return true;
                 
        case MANUAL:
            if(_state != Status::MANUAL)
            {
                _state = MANUAL;
                _statusLights.clear();
                DEBUG("State set to MANUAL\r\n");
                return true;   
            }
            _statusLights.flying();
            return true;              
        
        case STABILISED:
            if(_state != Status::STABILISED)
            {
                _state = STABILISED;
                _statusLights.clear();
                DEBUG("State set to STABILISED\r\n");
                return true;   
            }
            _statusLights.flying();
            return true;  
              
        
        case AUTO:
            
            return true;
              
            
        case ERROR:
            if(_state != Status::ERROR)
            {
                _state = Status::ERROR;
                _statusLights.clear();
                DEBUG("State set to ERROR\r\n");
                return true;
            }
            _statusLights.error();
            return true;
              
        default:
            
            return false;
              
    }    
}

Status::State Status::getState()
{
    return _state;    
}

bool Status::setFlightMode(FlightMode flightMode)
{
    if(flightMode != _flightMode)
    {
        _flightMode = flightMode;
        DEBUG("Flight mode set to %d\r\n", _flightMode);
        return true;
    }
    else return false;
}

Status::FlightMode Status::getFlightMode()
{
    return _flightMode;
}

bool Status::setNavigationMode(NavigationMode navigationMode)
{
    if(navigationMode != _navigationMode)
    {
        _navigationMode = navigationMode;
        DEBUG("Navigation mode set to %d\r\n", _navigationMode);
        return true;
    }
    else return false;
}

Status::NavigationMode Status::getNavigationMode()
{
    return _navigationMode;
}

bool Status::setBaseStationMode(BaseStationMode baseStationMode)
{
    if(baseStationMode != _baseStationMode)
    {
        _baseStationMode = baseStationMode;
        DEBUG("Base station mode set to %d\r\n", _baseStationMode);
        return true;
    }
    return false;
}

Status::BaseStationMode Status::getBaseStationMode()
{
    return _baseStationMode;
}

bool Status::setBatteryLevel(double batteryLevel)
{
    _batteryLevel = batteryLevel;
    return true;
}

double Status::getBatteryLevel()
{
    return _batteryLevel;
}

bool Status::setArmed(bool armed)
{
    if(armed != _armed)
    {
        if(armed == false)
        {
            _armed = armed;
            DEBUG("Armed set to %d\r\n", _armed);
            return true;
        }
        else if (armed == true && _navigationMode == Status::NONE && getMotorsSpinning() == false)
        {
            _armed = armed;
            DEBUG("Armed set to %d\r\n", _armed);
            return true;
        }
        else if (armed == true && _navigationMode == Status::ALTITUDE_HOLD && getMotorsSpinning() == false && getDeadZone() == true)
        {
            _armed = armed;
            DEBUG("Armed set to %d\r\n", _armed);
            return true;
        }
    }
    return false;
}

bool Status::getArmed()
{
    return _armed;
}

bool Status::setInitialised(bool initialised)
{
    if(initialised != _initialised)
    {
        _initialised = initialised;
        DEBUG("Initialised set to %d\r\n", _initialised);
        return true;
    }
    else return false;
}

bool Status::getInitialised()
{
    return _initialised;
}

bool Status::setRcConnected(bool rcConnected)
{
    if(rcConnected != _rcConnected)
    {
        _rcConnected = rcConnected;
        if(_rcConnected == false)
        {
            setArmed(false);
            setMotorsSpinning(false);
            setDeadZone(false);
        }
        DEBUG("Rc connected set to %d\r\n", _rcConnected);
        return true;
    }
    else return false;
}

bool Status::getRcConnected()
{
    return _rcConnected;
}

bool Status::setMotorsSpinning(bool flying)
{
    if(flying != _flying)
    {
        _flying = flying;
        DEBUG("Flying set to %d\r\n", _flying);
        return true;
    }
    else return false;
}

bool Status::getMotorsSpinning()
{
    return _flying;
}

bool Status::setDeadZone(bool deadZone)
{
    if(deadZone != _deadZone)
    {
        _deadZone = deadZone;
        DEBUG("Dead zone set to %d\r\n", _deadZone);
        return true;
    }
    else return false;
}

bool Status::getDeadZone()
{
    return _deadZone;
}