//$file${.::Mission.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//
// Model: CPF.qm
// File:  ${.::Mission.cpp}
//
// This code has been generated by QM 4.5.1 (https://www.state-machine.com/qm).
// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost.
//
// This program is open source software: you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
//$endhead${.::Mission.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#include "qpcpp.h" // QP/C++ framework API
#include "bsp.h"   // Board Support Package interface

#include <Windows.h>
#include <stdio.h>

using namespace QP;

// ask QM to declare the Mission class ----------------------------------------
//$declare${AOs::Mission} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//${AOs::Mission} ............................................................
class Mission : public QP::QActive {
private:
    QP::QTimeEvt m_timeEvt;

public:
    QP::QTimeEvt StateTIMEOUT;
    static QP::QEQueue MissionQ;

public:
    Mission();

protected:
    Q_STATE_DECL(initial);
    Q_STATE_DECL(InitProfile);
    Q_STATE_DECL(FindNeutralBuoyancy);
    Q_STATE_DECL(CheckDepthFNB);
    Q_STATE_DECL(EmergencyAscend);
    Q_STATE_DECL(RecoverySurfaceOps);
    Q_STATE_DECL(DownloadSBD_Rec);
    Q_STATE_DECL(BuildSBD_Rec);
    Q_STATE_DECL(UploadSBD_Rec);
    Q_STATE_DECL(GetPositionRec);
    Q_STATE_DECL(InitMission);
    Q_STATE_DECL(Descend);
    Q_STATE_DECL(CheckDepthAndTimeDescend);
    Q_STATE_DECL(InitPlatform);
    Q_STATE_DECL(SurfaceOps);
    Q_STATE_DECL(BuildSBD_SO);
    Q_STATE_DECL(UploadSBD_SO);
    Q_STATE_DECL(DownloadSBD_SO);
    Q_STATE_DECL(UploadFileActions);
    Q_STATE_DECL(Action1);
    Q_STATE_DECL(Action2);
    Q_STATE_DECL(Action3);
    Q_STATE_DECL(GetAirSamples);
    Q_STATE_DECL(GetPositionSO);
    Q_STATE_DECL(GetSamples);
    Q_STATE_DECL(LogResponses);
    Q_STATE_DECL(Park);
    Q_STATE_DECL(CheckDepthAndTimePark);
    Q_STATE_DECL(Anchor);
    Q_STATE_DECL(CheckDepthAndTimeAnchor);
    Q_STATE_DECL(ASCEND);
    Q_STATE_DECL(CheckDepthAndTimeAscend);
    Q_STATE_DECL(Questions);
};
//$enddecl${AOs::Mission} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// instantiate the Mission active object --------------------------------------
static Mission l_mission;
QActive * const AO_Mission = &l_mission;

// ask QM to define the Mission class (including the state machine) -----------
//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Check for the minimum required QP version
#if (QP_VERSION < 650U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
#error qpcpp version 6.5.0 or higher required
#endif
//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//$define${AOs::Mission} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//${AOs::Mission} ............................................................
QP::QEQueue Mission::MissionQ;
//${AOs::Mission::Mission} ...................................................
Mission::Mission()
  : QActive(Q_STATE_CAST(&Mission::initial)),
    m_timeEvt(this, TIMEOUT_SIG, 0U)
{}

//${AOs::Mission::SM} ........................................................
Q_STATE_DEF(Mission, initial) {
    //${AOs::Mission::SM::initial}
    // arm the private time event to expire in 1/2s
    // and periodically every 1/2 second
    m_timeEvt.armX(BSP::TICKS_PER_SEC/2,
                   BSP::TICKS_PER_SEC/2);
    (void)e; // unused parameter
    return tran(&InitPlatform);
}
//${AOs::Mission::SM::InitProfile} ...........................................
Q_STATE_DEF(Mission, InitProfile) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::InitProfile}
        case Q_ENTRY_SIG: {
            initProfile();
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::InitProfile::IPDone}
        case IPDone_SIG: {
            status_ = tran(&FindNeutralBuoyancy);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::FindNeutralBuoyancy} ...................................
Q_STATE_DEF(Mission, FindNeutralBuoyancy) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::FindNeutralBuoyancy}
        case Q_ENTRY_SIG: {
            startNegativeBuoyancy();
            startSendFPTimer();
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::FindNeutralBuoyancy}
        case Q_EXIT_SIG: {
            startPVController(FPMode);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::FindNeutralBuoya~::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&Descend);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::FindNeutralBuoya~::CheckDepthFNB} ......................
Q_STATE_DEF(Mission, CheckDepthFNB) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::FindNeutralBuoya~::CheckDepthFNB::FoundNeutral}
        case FoundNeutral_SIG: {
            status_ = tran(&Descend);
            break;
        }
        default: {
            status_ = super(&FindNeutralBuoyancy);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::EmergencyAscend} .......................................
Q_STATE_DEF(Mission, EmergencyAscend) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::EmergencyAscend::atSurfaceRecovery}
        case atSurfaceRecovery_SIG: {
            status_ = tran(&RecoverySurfaceOps);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::RecoverySurfaceOps} ....................................
Q_STATE_DEF(Mission, RecoverySurfaceOps) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::RecoverySurfaceOps}
        case Q_ENTRY_SIG: {
            printf("Entering RecoverySurfaceOps State");
            Sleep(1000);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::RecoverySurfaceO~::GotGo}
        case GotGo_SIG: {
            status_ = tran(&InitProfile);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::RecoverySurfaceO~::DownloadSBD_Rec} ....................
Q_STATE_DEF(Mission, DownloadSBD_Rec) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::RecoverySurfaceO~::DownloadSBD_Rec::RestartMission}
        case RestartMission_SIG: {
            status_ = tran(&InitProfile);
            break;
        }
        //${AOs::Mission::SM::RecoverySurfaceO~::DownloadSBD_Rec::GotNewMissionCmd}
        case GotNewMissionCmd_SIG: {
            status_ = tran(&InitMission);
            break;
        }
        //${AOs::Mission::SM::RecoverySurfaceO~::DownloadSBD_Rec::SO_TIMEOUT_Rec}
        case SO_TIMEOUT_Rec_SIG: {
            status_ = tran(&GetPositionRec);
            break;
        }
        default: {
            status_ = super(&RecoverySurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::RecoverySurfaceO~::BuildSBD_Rec} .......................
Q_STATE_DEF(Mission, BuildSBD_Rec) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::RecoverySurfaceO~::BuildSBD_Rec::SBDBuiltRec}
        case SBDBuiltRec_SIG: {
            status_ = tran(&UploadSBD_Rec);
            break;
        }
        default: {
            status_ = super(&RecoverySurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::RecoverySurfaceO~::UploadSBD_Rec} ......................
Q_STATE_DEF(Mission, UploadSBD_Rec) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::RecoverySurfaceO~::UploadSBD_Rec}
        case Q_ENTRY_SIG: {
            sendCR(4, true);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::RecoverySurfaceO~::UploadSBD_Rec::SBDUploadedRec}
        case SBDUploadedRec_SIG: {
            status_ = tran(&DownloadSBD_Rec);
            break;
        }
        default: {
            status_ = super(&RecoverySurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::RecoverySurfaceO~::GetPositionRec} .....................
Q_STATE_DEF(Mission, GetPositionRec) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::RecoverySurfaceO~::GetPositionRec::GotPositionRec}
        case GotPositionRec_SIG: {
            status_ = tran(&BuildSBD_Rec);
            break;
        }
        default: {
            status_ = super(&RecoverySurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::InitMission} ...........................................
Q_STATE_DEF(Mission, InitMission) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::InitMission}
        case Q_ENTRY_SIG: {
            initMission();
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::InitMission::IMDone}
        case IMDone_SIG: {
            status_ = tran(&RecoverySurfaceOps);
            break;
        }
        //${AOs::Mission::SM::InitMission::StateTIMEOUT}
        case StateTIMEOUT_SIG: {
            status_ = tran(&RecoverySurfaceOps);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Descend} ...............................................
Q_STATE_DEF(Mission, Descend) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Descend::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&ASCEND);
            break;
        }
        //${AOs::Mission::SM::Descend::FatalError(most states will have~}
        case FatalError(most states will have this)_SIG: {
            status_ = tran(&EmergencyAscend);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Descend::CheckDepthAndTimeDescend} .....................
Q_STATE_DEF(Mission, CheckDepthAndTimeDescend) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Descend::CheckDepthAndTim~::AtParkPt}
        case AtParkPt_SIG: {
            status_ = tran(&Park);
            break;
        }
        //${AOs::Mission::SM::Descend::CheckDepthAndTim~::SampleInstr}
        case SampleInstr_SIG: {
            status_ = tran(&GetSamples);
            break;
        }
        //${AOs::Mission::SM::Descend::CheckDepthAndTim~::HitBottom}
        case HitBottom_SIG: {
            status_ = tran(&Anchor);
            break;
        }
        //${AOs::Mission::SM::Descend::CheckDepthAndTim~::DescendDone}
        case DescendDone_SIG: {
            status_ = tran(&ASCEND);
            break;
        }
        default: {
            status_ = super(&Descend);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::InitPlatform} ..........................................
Q_STATE_DEF(Mission, InitPlatform) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::InitPlatform}
        case Q_ENTRY_SIG: {
            initPlatform();
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::InitPlatform::IPDone}
        case IPDone_SIG: {
            status_ = tran(&InitMission);
            break;
        }
        //${AOs::Mission::SM::InitPlatform::StateTIMEOUT}
        case StateTIMEOUT_SIG: {
            status_ = tran(&InitMission);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps} ............................................
Q_STATE_DEF(Mission, SurfaceOps) {
    QP::QState status_;
    switch (e->sig) {
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::BuildSBD_SO} ...............................
Q_STATE_DEF(Mission, BuildSBD_SO) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::BuildSBD_SO::SO_SBDBuilt}
        case SO_SBDBuilt_SIG: {
            status_ = tran(&UploadSBD_SO);
            break;
        }
        default: {
            status_ = super(&SurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::UploadSBD_SO} ..............................
Q_STATE_DEF(Mission, UploadSBD_SO) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::UploadSBD_SO::SO_SBDUploaded}
        case SO_SBDUploaded_SIG: {
            status_ = tran(&DownloadSBD_SO);
            break;
        }
        default: {
            status_ = super(&SurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::DownloadSBD_SO} ............................
Q_STATE_DEF(Mission, DownloadSBD_SO) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::DownloadSBD_SO::SO_SBDUploaded}
        case SO_SBDUploaded_SIG: {
            status_ = tran(&Action1);
            break;
        }
        default: {
            status_ = super(&SurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::UploadFileActions} .........................
Q_STATE_DEF(Mission, UploadFileActions) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::UploadFileAction~::SOGotNewMission}
        case SOGotNewMission_SIG: {
            status_ = tran(&InitMission);
            break;
        }
        default: {
            status_ = super(&SurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::UploadFileAction~::Action1} ................
Q_STATE_DEF(Mission, Action1) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::UploadFileAction~::Action1::Action1Done}
        case Action1Done_SIG: {
            status_ = tran(&Action2);
            break;
        }
        default: {
            status_ = super(&UploadFileActions);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::UploadFileAction~::Action2} ................
Q_STATE_DEF(Mission, Action2) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::UploadFileAction~::Action2::Action2Done}
        case Action2Done_SIG: {
            status_ = tran(&Action3);
            break;
        }
        default: {
            status_ = super(&UploadFileActions);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::UploadFileAction~::Action3} ................
Q_STATE_DEF(Mission, Action3) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::UploadFileAction~::Action3::SODone}
        case SODone_SIG: {
            status_ = tran(&InitProfile);
            break;
        }
        default: {
            status_ = super(&UploadFileActions);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::GetAirSamples} .............................
Q_STATE_DEF(Mission, GetAirSamples) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::GetAirSamples::AirSamplesDone}
        case AirSamplesDone_SIG: {
            status_ = tran(&GetPositionSO);
            break;
        }
        default: {
            status_ = super(&SurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::SurfaceOps::GetPositionSO} .............................
Q_STATE_DEF(Mission, GetPositionSO) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::SurfaceOps::GetPositionSO::GotSOPosition}
        case GotSOPosition_SIG: {
            status_ = tran(&BuildSBD_SO);
            break;
        }
        default: {
            status_ = super(&SurfaceOps);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::GetSamples} ............................................
Q_STATE_DEF(Mission, GetSamples) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::GetSamples}
        case Q_ENTRY_SIG: {
            sendSampleCommands();
            status_ = Q_RET_HANDLED;
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::GetSamples::LogResponses} ..............................
Q_STATE_DEF(Mission, LogResponses) {
    QP::QState status_;
    switch (e->sig) {
        default: {
            status_ = super(&GetSamples);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Park} ..................................................
Q_STATE_DEF(Mission, Park) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Park}
        case Q_ENTRY_SIG: {
            stopPVController();
            startDepthController();
            status_ = Q_RET_HANDLED;
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Park::CheckDepthAndTimePark} ...........................
Q_STATE_DEF(Mission, CheckDepthAndTimePark) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Park::CheckDepthAndTim~::SampleInstr}
        case SampleInstr_SIG: {
            status_ = tran(&GetSamples);
            break;
        }
        default: {
            status_ = super(&Park);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Anchor} ................................................
Q_STATE_DEF(Mission, Anchor) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Anchor}
        case Q_ENTRY_SIG: {
            stopPVController();
            status_ = Q_RET_HANDLED;
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Anchor::CheckDepthAndTimeAnchor} .......................
Q_STATE_DEF(Mission, CheckDepthAndTimeAnchor) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Anchor::CheckDepthAndTim~::SampleInstr}
        case SampleInstr_SIG: {
            status_ = tran(&GetSamples);
            break;
        }
        default: {
            status_ = super(&Anchor);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::ASCEND} ................................................
Q_STATE_DEF(Mission, ASCEND) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::ASCEND}
        case Q_ENTRY_SIG: {
            stopSendFPTimer();
            startCPMode();
            startPVController(CPMode);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::ASCEND::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&SurfaceOps);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::ASCEND::CheckDepthAndTimeAscend} .......................
Q_STATE_DEF(Mission, CheckDepthAndTimeAscend) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::ASCEND::CheckDepthAndTim~::AtParkPt}
        case AtParkPt_SIG: {
            status_ = tran(&Park);
            break;
        }
        //${AOs::Mission::SM::ASCEND::CheckDepthAndTim~::SampleInstr}
        case SampleInstr_SIG: {
            status_ = tran(&GetSamples);
            break;
        }
        //${AOs::Mission::SM::ASCEND::CheckDepthAndTim~::AtSurface}
        case AtSurface_SIG: {
            stopPVController();
            status_ = tran(&SurfaceOps);
            break;
        }
        default: {
            status_ = super(&ASCEND);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Questions} .............................................
Q_STATE_DEF(Mission, Questions) {
    QP::QState status_;
    switch (e->sig) {
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//$enddef${AOs::Mission} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
