/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : GNC.cc                                                        */
/* Author   : K. Headley                                                    */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/25/2016                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <sys/sched.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <unistd.h>
#include "Syslog.h"
#include "System.h"
#include "Navigation.h"
#include "LayeredControl.h"
#include "DynamicControl.h"
#include "GncOutput.h"
#include "Gnc.h"


int main(int argc, char **argv){
    Boolean debug=True;
    
    dprintf("\nGNC Unit Test args:[%d]",argc);
    int i=0;
    while (i<argc) {
        dprintf("  arg[%d]:[%s]",i,(argv[i] ? argv[i]: "NULL"));
        i++;
    }
    
    
    try{
        
        dprintf("\n=======[start]======\n");
        
        // test owns these, must release when finished
        Navigation *nav = NULL;
        LayeredControl *laycon = NULL;
        DynamicControl *dyncon = NULL;

        try{
            dprintf("create Navigation");
            nav = new Navigation();
        }catch(Exception naverr){
            Syslog::write("test_gnc -- Caught exception: %s\n", naverr.msg );
            nav=NULL;
        }
        
        try{
            dprintf("create LayeredControl");
            laycon = new LayeredControl();
        }catch(Exception layerr){
            Syslog::write("test_gnc -- Caught exception: %s\n", layerr.msg );
            laycon=NULL;
        }
        
        try{
            dprintf("create DynamicControl");
            dyncon = new DynamicControl();
        }catch(Exception dynerr){
            Syslog::write("test_gnc -- Caught exception: %s\n", dynerr.msg );
            dyncon=NULL;
        }
        
        dprintf("create GNC");
        Gnc *gnc= new Gnc();
        
        if (gnc) {
            // configure GNC instance with nav, lcon, dcon
            dprintf("[configure gnc...]");
            gnc->configure(nav,laycon,dyncon);
            // do stuff with GNC...
            dprintf("[TBD: exercise GNC API...]");
            dprintf("[run gnc...]");
            gnc->run();
            // release GNC resources
            dprintf("[destroy GNC]");
            delete gnc;
        }
        
        // release resources
        if (nav) {
            dprintf("test_gnc - destroy Navigation");
            delete nav;
        }
        if (laycon) {
            dprintf("test_gnc - destroy LayeredControl");
            delete laycon;
        }
        
        if (dyncon) {
            dprintf("test_gnc - destroy DynamicControl");
            delete dyncon;
        }
    } catch( Exception e ) {
            Syslog::write("test_gnc -- Caught exception: %s\n", e.msg );
        }

    dprintf("\n=======[end]======\n");
    return 0;
}