/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : GNC.h                                                         */
/* Author   : K. Headley                                                    */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/05/2016                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _GNC_H
#define _GNC_H

#include <time.h>

#include "PeriodicTask.h"
#include "DynamicArray.h"
#include "TaskInterface.h"
#include "GncInput.h"
#include "GncOutput.h"
//#include "GncLog.h"
#include "LayeredControl.h"
//#include "DynamicControl.h"
#include "Navigation.h"
#include "Simulator.h"
#include "GncParentIF.h"
#include "SimulatorIF.h"
#include "Simulator.h"
#include "EventService.h"
/*
 CLASS
 Gnc
 
 DESCRIPTION
 
 Gnc (guidance, navigation, control) has the following responsibilities:
 
 AUTHOR
 K. Headley
 */
class GncOutput;
class GncInput;
class Navigation;
class LayeredControl;
class DynamicControl;

class Gnc : public PeriodicTask, public GncParentIF<Navigation>{
    
public:
        
    ///////////////////////////////////////////////////////////////////
    // No-arg Constructor
    Gnc();
    
    ///////////////////////////////////////////////////////////////////
    // periodic task Constructor    
    Gnc::Gnc(int millisec,
             Navigation *nav=NULL,
             LayeredControl *laycon=NULL,
             DynamicControl *dyncon=NULL,
             Boolean enSim=False);
    

    ///////////////////////////////////////////////////////////////////
    // Default Destructor
    virtual Gnc::~Gnc();
    virtual void startSampling();
    virtual void run();
    void configure(Navigation *nav, LayeredControl *lcon, DynamicControl *dcon);

    void triggerEvent(EventCode event);


    ///////////////////////////////////////////////////////////////////
    // implementation of GncIF trigger method
    // [template class pure virtual method]
    virtual void trigger(Navigation *nav, EventCode event);
    int initialize();

protected:
    GncOutput *_output;
    GncInput *_input;
    GncOutput::State _state;
 
private:
//    static Gnc *_gncInstance;

    Navigation *_navigation;
    LayeredControl *_laycon;
    DynamicControl *_dyncon;
    SimulatorIF *_simulatorIF;
    Boolean _enSim;
    EventService *_eventService;
    Boolean _quitFlag;
    
    ///////////////////////////////////////////////////////////////////
    // Periodic callback
    void callback();

    ////////////////////////////////////////////////////////////////////
    // Signal handler
    static void signalHandler(int signalNo);
    
    ////////////////////////////////////////////////////////////////////
    // Destroy latest TaskServer object
    //  static void cleanup();
    
    void missionStatusCallback(TaskInterface *taskInterface,
                               EventCode eventCode);

};


#endif
