/****************************************************************************/
/* Copyright 1992 to 1996 MBARI                                             */
/****************************************************************************/
/* Summary  : Main Pilot Console Initialization Task for VxWorks            */
/* Filename : startup.c                                                     */
/* Author   : Andrew Pearce                                                 */
/* Project  : Tiburon ROV                                                   */
/* Version  : Version 1.0                                                   */
/* Created  : 10/05/92                                                      */
/* Modified : 05/02/96                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header: $
 * $Log:    $
 * 
 */
/****************************************************************************/

#include <vxWorks.h>                /* vxWorks system declarations          */
#include <stdioLib.h>               /* VxWorks standard I/O library         */
#include <strLib.h>                 /* vxWorks string library functions     */
#include <taskLib.h>                /* vxWorks task library functions       */
#include <lstLib.h>                 /* vxWorks linked list library          */
#include <rebootLib.h>              /* vxWorks system reboot library funcs  */

#include "mbariTypes.h"             /* mbari style guide type declarations  */
#include "mbariConst.h"
#include "rovPriority.h"            /* mbari Rov Application Priorities     */


extern "C" {
#include "usrTime.h"                /* MBARI time and date functions        */
#include "datamgr.h"                /* Data Manager Declarations            */
#include "sio32Drv.h"
#include "sio32Server.h"            /* SIO32 Protocol Server Declarations   */
#include "tiburon.h"	            /* Tiburon definitions                  */
#include "idleCpu.h"                /* Idle CPU Monitor Task                */
#include "telemDiag.h"              /* Telemetery Board Micro Task          */
#include "console.h"                /* Console Input/Output Task            */
#include "pduMicro.h"	            /* PDU Microcontroller Interface Task   */

#include "bellyPack.h"	            /* Belly pack interface task            */
#include "powerDown.h"	            /* Tiburon Power Down Task              */
#include "videoOverlay.h"	    /* Video Overlay Task                   */
#include "recorder.h"               /* Flight recorder Task                 */
#include "../sio32Chan.h"	    /* SIO32 Serial Channel Allocations     */

extern void sysVmeBusReset(void);   /* Sends Reset to VME Bus               */

} 

#include "iviewTask.h"	            /* Integrated Viewing Task (IView)      */
#include "lapBox.h"	            /* Lapbox Interface Task                */
#include "pilotTray.h"	            /* Pilot Tray Interface Task            */
#include "vehicleTurnsDM.h"	    /* Vehicle Cable Turns Logging Task     */

extern  int telnetTaskPriority;

#define FLT_RECORDER_CFG_FILE  "/usr/tiburon/config/fltRecorder.cfg"

/****************************************************************************/
/* Function    : spawnTask                                                  */
/* Purpose     : Executes a vxWorks task. Convenience function for taskSpawn*/
/* Inputs      : name, priority, stack size, task options, messages for     */
/*               successful and unsuccessful task creation. func ptr & args */
/* Outputs     : Returns OK or ERROR                                        */
/****************************************************************************/
    LOCAL STATUS
spawnTask( char *taskName, int priority, int stacksize, int options,
    char *okMsg, char *errorMsg, FUNCPTR entryPoint,
    int arg1, int arg2, int arg3)
{
                                    /* Initialize Task                      */
    if ( taskSpawn( taskName, priority, options, stacksize,
       entryPoint, arg1, arg2, arg3, 0, 0, 0, 0, 0, 0, 0 ) != ERROR)
       logMsg(okMsg);
    else
    {
        logMsg(errorMsg);
        return(ERROR);
    } /* else */
} /* spawnTask() */

/****************************************************************************/
/* Function    : consoleInit                                                */
/* Purpose     : Initializes application software for the pilot console     */
/* Inputs      : None - Add calls to start application software here        */
/* Outputs     : None                                                       */
/****************************************************************************/
    Void
consoleInit( Void )
{				    /* Set priority of initialization task  */
    taskPrioritySet(taskIdSelf(),  CONSOLE_INIT_TASK_PRIORITY);

    rebootHookAdd ( (FUNCPTR) sysVmeBusReset);
    
    usrTimeInit();		    /* Initialize MBARI time library         */
    
    telnetTaskPriority = 200;

    if (netDevCreate ("batray:", "batray.mbari.org", 0) != OK)
	logMsg("Console Init: error creating ftp file system device\n");

    dm_init( (DM_Define*) NULL, 0 ); /* Initialize Data Manager              */	

    spawnTask("heartbeat", HEARTBEAT_TASK_PRIORITY, HEARTBEAT_TASK_STACKSIZE, 0,
	"Heartbeat Task Initialized\n",
        "Heartbeat Task Initialization Failed\n", 
	(FUNCPTR) heartbeatTask, CONSOLE_CPU, NULL, NULL);

    spawnTask("rovStatus", TIBURON_STATUS_PRIORITY, TIBURON_STATUS_STACKSIZE,
        VX_FP_TASK,
        "Console Init: Tiburon Status Monitor Task Initialized\n",
        "Console Init: Tiburon Status Monitor Task Initialization Failed\n",
	(FUNCPTR) tiburonStatusTask, NULL, NULL, NULL);       

    spawnTask("idleCpu", IDLE_CPU_TASK_PRIORITY, IDLE_CPU_TASK_STACKSIZE, 0,
	"Idle CPU Task Initialized\n",
        "Idle CPU Task Initialization Failed\n", 
	(FUNCPTR) idleCpuTask,
        (int) TIBURON_DM_PREFIX CONSOLE_IDLE_CPU_PERCENT_DM,
        (int) TIBURON_DM_PREFIX CONSOLE_IDLE_CPU_ALARM_DM, NULL);

    spawnTask("sio32Deamon", SIO32_DEAMON_PRIORITY, SIO32_DEAMON_STACK, 0,
        "Console Init: Telem board SIO32 Deamon Task Initialized\n",
        "Console Init: Telem board SIO32 Deamon Task Initialization Failed\n",
	(FUNCPTR) sio32DeamonTask, (int) TELEM_BOARD_NAME, NULL, NULL);       

    spawnTask("telemDiag", TELEM_DIAG_SRQ_PRIORITY, TELEM_DIAG_STACKSIZE,
        VX_FP_TASK, "Console Init: Telem Diagnostic Task Initialized\n",
  	"Console Init: Telem Diagnostic Task Initialization Failed\n",
	(FUNCPTR) telemDiagTask, TOPSIDE_TELEM_BOARD,
        CONSOLE_TELEM_MICRO_CHAN, NULL);

    spawnTask("pduMicro", PDU_MICRO_SRQ_PRIORITY, PDU_MICRO_STACKSIZE, 0,
        "Console Init: PDU Micro Task Initialized\n",
	"Console Init: PDU Micro Task Initialization Failed\n",
	(FUNCPTR) pduMicroTask, PDU_MICRO_SERIAL_CHAN, NULL, NULL);

    recordInit();			    /* Initialize Flight Recorder    */
    recordStart(FLT_RECORDER_CFG_FILE, 0);  /* Start Flight Recorder         */

#if 0
    spawnTask("powerDownTask",
        TIBURON_DOWN_TASK_PRIORITY, TIBURON_POWER_DOWN_TASK_STACKSIZE, 0,
        "Console Init: Tiburon Power Down Task Initialized\n",
	"Console Init: Tiburon Power Down Task Initialization Failed\n",
	(FUNCPTR) tiburonPowerDownTask, NULL, NULL, NULL);
#endif

    spawnTask("overlay1",
        VIDEO_OVERLAY_TASK_PRIORITY, VIDEO_OVERLAY_TASK_STACKSIZE, VX_FP_TASK,
        "Console Init: Tiburon Video Overlay Task Initialized\n",
	"Console Init: Tiburon  Video Overlay Task Initialization Failed\n",
	(FUNCPTR) videoOverlayTask1, NULL, NULL, NULL);

    spawnTask("bellyPack", BELLY_PACK_SRQ_PRIORITY, BELLY_PACK_STACKSIZE, 0,
        "Console Init: Belly Pack Task Initialized\n",
	"Console Init: Belly Pack Task Failed\n",
        (FUNCPTR) bellyPackTask, BELLYPACK_SERIAL_CHAN, NULL, NULL);

    spawnTask("turnsLogger",
        TURNS_LOG_TASK_PRIORITY, TURNS_LOG_TASK_STACKSIZE, VX_FP_TASK,
        "Console Init: Cable Turns Log Task Initialized\n",
	"Console Init: Cable Turns Log Task Initialization Failed\n",
	(FUNCPTR) turnsLogger, NULL, NULL, NULL);

    consoleTask();		    /* Initialize console Input/Output     */

    logMsg("Console VME Init: Software Initialization Complete\n");
} /* consoleInit() */
