//$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;

public:
    Mission();

protected:
    Q_STATE_DECL(initial);
    Q_STATE_DECL(InitProfile);
    Q_STATE_DECL(FindNeutralBuoyancy);
    Q_STATE_DECL(CheckDepthFNB);
    Q_STATE_DECL(StartDescend);
    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(Profile);
    Q_STATE_DECL(Park);
    Q_STATE_DECL(CheckDepthAndTimeProfile);
    Q_STATE_DECL(GetSamples);
    Q_STATE_DECL(Anchor);
    Q_STATE_DECL(StartVelocityController);
    Q_STATE_DECL(InitPlatform);
    Q_STATE_DECL(SurfaceOps);
    Q_STATE_DECL(BuildSBD_SO);
    Q_STATE_DECL(UploadSBD_SO);
    Q_STATE_DECL(GetPositionSO);
    Q_STATE_DECL(DownloadSBD_SO);
    Q_STATE_DECL(UploadFileActions);
    Q_STATE_DECL(Action1);
    Q_STATE_DECL(Action2);
    Q_STATE_DECL(Action3);
};
//$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} ............................................................
//${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::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::FindNeutralBuoya~::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&Profile);
            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::NeedToDescend}
        case NeedToDescend_SIG: {
            status_ = tran(&StartDescend);
            break;
        }
        //${AOs::Mission::SM::FindNeutralBuoya~::CheckDepthFNB::FNB_CheckDepthTIMEOUT}
        case FNB_CheckDepthTIMEOUT_SIG: {
            status_ = tran(&CheckDepthFNB);
            break;
        }
        //${AOs::Mission::SM::FindNeutralBuoya~::CheckDepthFNB::FoundNeutral}
        case FoundNeutral_SIG: {
            status_ = tran(&Profile);
            break;
        }
        default: {
            status_ = super(&FindNeutralBuoyancy);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::FindNeutralBuoya~::StartDescend} .......................
Q_STATE_DEF(Mission, StartDescend) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::FindNeutralBuoya~::StartDescend::FNBDescending}
        case FNBDescending_SIG: {
            status_ = tran(&CheckDepthFNB);
            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::RecoverySurfaceOps}
        case Q_EXIT_SIG: {
            printf("Exiting RecoverySurfaceOps State");
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::RecoverySurfaceO~::GotGo}
        case GotGo_SIG: {
            status_ = tran(&InitProfile);
            break;
        }
        //${AOs::Mission::SM::RecoverySurfaceO~::SO_TIMEOUT_Rec}
        case SO_TIMEOUT_Rec_SIG: {
            status_ = tran(&GetPositionRec);
            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::GotNewMissionRec}
        case GotNewMissionRec_SIG: {
            status_ = tran(&InitMission);
            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::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}
        case Q_ENTRY_SIG: {
            printf("Entering GetPositionRec State");
            Sleep(1000):

            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::RecoverySurfaceO~::GetPositionRec}
        case Q_EXIT_SIG: {
            printf("Exiting GetPositionRec State");
            status_ = Q_RET_HANDLED;
            break;
        }
        //${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: {
            printf("Entering InitMission State");
            Sleep(1000);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::InitMission}
        case Q_EXIT_SIG: {
            printf("Exiting InitMission State");
            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::Profile} ...............................................
Q_STATE_DEF(Mission, Profile) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Profile::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&SurfaceOps);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Profile::Park} .........................................
Q_STATE_DEF(Mission, Park) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Profile::Park::ProfileSampleInstr}
        case ProfileSampleInstr_SIG: {
            status_ = tran(&GetSamples);
            break;
        }
        //${AOs::Mission::SM::Profile::Park::DescParkTIMEOUT}
        case DescParkTIMEOUT_SIG: {
            status_ = tran(&StartVelocityController);
            break;
        }
        //${AOs::Mission::SM::Profile::Park::ParkCheckDandT}
        case ParkCheckDandT_SIG: {
            status_ = tran(&CheckDepthAndTimeProfile);
            break;
        }
        default: {
            status_ = super(&Profile);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Profile::CheckDepthAndTimeProfile} .....................
Q_STATE_DEF(Mission, CheckDepthAndTimeProfile) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Profile::CheckDepthAndTim~::AtParkPt}
        case AtParkPt_SIG: {
            status_ = tran(&Park);
            break;
        }
        //${AOs::Mission::SM::Profile::CheckDepthAndTim~::SampleInstr}
        case SampleInstr_SIG: {
            status_ = tran(&GetSamples);
            break;
        }
        //${AOs::Mission::SM::Profile::CheckDepthAndTim~::HitBottom}
        case HitBottom_SIG: {
            status_ = tran(&Anchor);
            break;
        }
        //${AOs::Mission::SM::Profile::CheckDepthAndTim~::ProfileDone}
        case ProfileDone_SIG: {
            status_ = tran(&SurfaceOps);
            break;
        }
        default: {
            status_ = super(&Profile);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Profile::GetSamples} ...................................
Q_STATE_DEF(Mission, GetSamples) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Profile::GetSamples::DoneSampling}
        case DoneSampling_SIG: {
            status_ = tran(&CheckDepthAndTimeProfile);
            break;
        }
        default: {
            status_ = super(&Profile);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Profile::Anchor} .......................................
Q_STATE_DEF(Mission, Anchor) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Profile::Anchor::AnchorOffBottom}
        case AnchorOffBottom_SIG: {
            status_ = tran(&StartVelocityController);
            break;
        }
        //${AOs::Mission::SM::Profile::Anchor::AnchorCheckDandT}
        case AnchorCheckDandT_SIG: {
            status_ = tran(&CheckDepthAndTimeProfile);
            break;
        }
        default: {
            status_ = super(&Profile);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::Profile::StartVelocityController} ......................
Q_STATE_DEF(Mission, StartVelocityController) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::Profile::StartVelocityCon~::ProfileVelCtrlrStarted}
        case ProfileVelCtrlrStarted_SIG: {
            status_ = tran(&CheckDepthAndTimeProfile);
            break;
        }
        default: {
            status_ = super(&Profile);
            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: {
            printf("Entering InitPlatform State");
            Sleep(1000);
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::InitPlatform}
        case Q_EXIT_SIG: {
            printf("Exiting InitPlatform State");
            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::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::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_;
}
//$enddef${AOs::Mission} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
