/****************************************************************************/
/* Copyright 1992 to 1997 MBARI                                             */
/****************************************************************************/
/* Summary  : Second CPU Software Initialization Task for VxWorks           */
/* Filename : startup.c                                                     */
/* Author   : Andrew Pearce                                                 */
/* Project  : Tiburon ROV                                                   */
/* Version  : Version 1.0                                                   */
/* Created  : 01/15/97                                                      */
/* Modified : 01/15/97                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header: $
 * $Log:    $
 * 
 */
/****************************************************************************/

#include <vxWorks.h>                /* vxWorks system declarations          */
#include <strLib.h>                 /* vxWorks string library functions     */
#include <taskLib.h>                /* vxWorks task library functions       */
#include <rebootLib.h>              /* vxWorks system reboot library funcs  */

#include "types.h"            	    /* mbari style guide type declarations  */
#include "rovPriority.h"      	    /* MBARI Rov Application Priorities     */
#include "datamgr.h"         	    /* Data Manager Declarations            */
#include "tiburon.h"	    	    /* Tiburon Definitions                  */
#include "idleCpu.h"          	    /* Idle CPU Monitor Task                */
#include "hourLog.h"	    	    /* Hour log task Declarations           */
#include "powerMgr.h"	    	    /* Power Manager Declarations           */
#include "sio32Server.h"     	    /* SIO32 serial I/O Declarations        */
#include "ersDcon.h"          	    /* Emergency Recover System Declarations*/
#include "vmeIbc.h"           	    /* VME Can IBC Declarations             */
#include "sonarDcon.h"        	    /* Sonar Dcon Declarations              */
#include "sensorDcon.h"       	    /* Sensor Dcon Declarations             */
#include "sio32Diag.h"        	    /* SIO32 Diagnostic Task                */
#include "telemDiag.h"        	    /* Telemetery Board Micro Task          */
#include "thrusterIF.h"	    	    /* Thruster Interface Task              */
#include "powerIbc.h"         	    /* Power Can DCon Task                  */
#include "lightingDcon.h"     	    /* Lighting DCon Task                   */
#include "rovControl.h"	    	    /* ROV Controller Definitions           */
#include "panTilt.h"	    	    /* Pan/Tilt Interface Task              */
#include "cameraDcon.h"	    	    /* Camera Dcon Interface Task           */
#include "camera.h"	    	    /* Panasonic Camera Interface Task      */
#include "acMicro.h"	    	    /* AC Microcontroller Interface Task    */
#include "vbSystem.h"	   	    /* Variable Buoyancy System Definitions */
#include "toolsledDcon.h"	    /* Toolsled Dcon Interface Task         */
#include "advDistanceLog.h"  	    /* ADV Distance Logger Task             */
#include "state.h"      	    /* Kalman State Switch Task Definitions */
#include "../sio32Chan.h"	    /* SIO32 Serial Channel Allocations     */

#define EXTRA_STACK_SIZE  10000

extern  int telnetTaskPriority;

/****************************************************************************/
/* 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)
{
                                    /* Initialize Task                      */
    if ( taskSpawn( taskName, priority, options, stacksize + EXTRA_STACK_SIZE,
       entryPoint, arg1, arg2, 0, 0, 0, 0, 0, 0, 0, 0 ) != ERROR)
       logMsg(okMsg);
    else
    {
        logMsg(errorMsg);
        return(ERROR);
    } /* else */
} /* spawnTask() */

/****************************************************************************/
/* Function    : rovInit                                                    */
/* Purpose     : Initializes application software for Tiburon main VME CPU  */
/* Inputs      : None - Add calls to start application software here        */
/* Outputs     : None                                                       */
/****************************************************************************/
    Void
rovInit( Void )
{				    /* Set priority of initialization task  */
    taskPrioritySet(taskIdSelf(),  ROV_INIT_TASK_PRIORITY);

    telnetTaskPriority = 200; 

    if (netDevCreate ("batray:", "batray.mbari.org", 0) != OK)
	logMsg("ROV Init: error creating ftp file system device\n");

    dm_init( (DM_Define*) NULL );   /* Initialize Data Manager              */	

    taskDelay( 180 );

    spawnTask("heartbeat", HEARTBEAT_TASK_PRIORITY, HEARTBEAT_TASK_STACKSIZE, 0,
	"Heartbeat Task Initialized\n",
        "Heartbeat Task Initialization Failed\n", 
	(FUNCPTR) heartbeatTask, TIBURON_CPU2, 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 TIBURON_IDLE_CPU2_PERCENT_DM,
        (int) TIBURON_DM_PREFIX TIBURON_IDLE_CPU2_ALARM_DM);

    spawnTask("telemDiag", TELEM_DIAG_SRQ_PRIORITY, TELEM_DIAG_STACKSIZE,
         VX_FP_TASK, "ROV Init: Telem Diagnostic Task Initialized\n",
	"ROV Init: Telem Diagnostic Task Initialization Failed\n",
	(FUNCPTR) telemDiagTask, ROV_TELEM_BOARD,
        TIBURON_TELEM_MICRO_CHAN);

    spawnTask("sio32Diag", SIO32_DIAG_SRQ_PRIORITY, SIO32_DIAG_STACKSIZE, 0,
        "ROV Init: SIO32 Diagnostic Task Initialized\n",
	"ROV Init: SIO32 Diagnostic Task Initialization Failed\n",
	(FUNCPTR) sio32DiagTask, SIO32_MICROCONTROLLER_CHAN, NULL);

    spawnTask("rovState", KALMAN_STATE_TASK_PRIORITY, KALMAN_STATE_STACKSIZE,
         VX_FP_TASK,
	"ROV Init: Kalman State Switch Task Initialized\n",
	"ROV Init: Kalman State Switch Task Failed\n",
	(FUNCPTR) stateSwitch, NULL, NULL );

    spawnTask("acMicro", AC_MICRO_SRQ_PRIORITY, AC_MICRO_STACKSIZE, 0,
        "ROV Init: AC Micro Interface Task Initialized\n",
	"ROV Init: AC Micro Interface Task Initialization Failed\n",
	(FUNCPTR) acMicroTask, AC_MICRO_SERIAL_CHAN, NULL);

    spawnTask("busCap", BUS_CAP_TASK_PRIORITY, BUS_CAP_TASK_STACKSIZE, 0,
	"ROV Init: Bus Capacitance Task Initialized\n",
	"ROV Init: Bus Capacitance Task Failed\n",
	(FUNCPTR) busCapTask, 0, NULL );

    spawnTask("ersDcon", ERS_DCON_SRQ_PRIORITY, ERS_DCON_STACKSIZE, 0,
        "ROV Init: ERS DCon Interface Task Initialized\n",
	"ROV Init: ERS DCon Interface Task Initialization Failed\n",
	(FUNCPTR) ersDconTask, EMERGENCY_REC_SERIAL_CHAN, NULL);

    spawnTask("pwrIbcA", PWR_IBC_SRQ_PRIORITY, PWR_IBC_STACKSIZE, 0,
	"ROV Init: Power DCon A Task Initialized\n",
	"ROV Init: Power DCon A Task Failed\n",
	(FUNCPTR) PWR_IBC_A_Task, POWER_CAN_IBC_A_SERIAL_CHAN,  NULL );


    spawnTask("pwrIbcB", PWR_IBC_SRQ_PRIORITY, PWR_IBC_STACKSIZE, 0,
	"ROV Init: Power DCon B Task Initialized\n",
	"ROV Init: Power DCon B Task Failed\n",
	(FUNCPTR) PWR_IBC_B_Task, POWER_CAN_IBC_B_SERIAL_CHAN, NULL );

    spawnTask("lightIbc", LIGHTING_DCON_SRQ_PRIORITY, LIGHTING_DCON_STACKSIZE,
         0, "ROV Init: Lighting DCon Interface Task Initialized\n",
            "ROV Init: Lighting DCon Interface Task Failed\n",
 	(FUNCPTR) lightingDconTask, LIGHTING_IBC_SERIAL_CHAN,  NULL);

    spawnTask("cameraDcon", CAMERA_IBC_SRQ_PRIORITY, CAMERA_IBC_STACKSIZE, 0,
	"ROV Init: Camera DCon Task Initialized\n",
	"ROV Init: Camera DCon Task Failed\n",
	(FUNCPTR) cameraDconTask, CAMERA_IBC_SERIAL_CHAN, NULL);    

    spawnTask("portCamera", CAMERA_SRQ_PRIORITY, CAMERA_TASK_STACKSIZE, 0,
	"ROV Init: Port Camera Task Initialized\n",
	"ROV Init: Port Camera Task Failed\n",
	(FUNCPTR) portCameraTask, PORT_CAMERA_SERIAL_CHAN, NULL);

    spawnTask("stbdCamera", CAMERA_SRQ_PRIORITY, CAMERA_TASK_STACKSIZE, 0,
	"ROV Init: Stbd Camera Task Initialized\n",
	"ROV Init: Stbd Camera Task Failed\n",
	(FUNCPTR) stbdCameraTask, STBD_CAMERA_SERIAL_CHAN, NULL);

    spawnTask("sonarDcon", SONAR_IBC_SRQ_PRIORITY, SONAR_IBC_STACKSIZE,
        VX_FP_TASK,
	"ROV Init: Sonar DCon Interface Task Initialized\n",
        "ROV Init: Sonar DCon Interface Task Failed\n",
 	(FUNCPTR) sonarDconTask, SONAR_IBC_SERIAL_CHAN,  NULL);

    spawnTask("advLog", ADV_DISTANCE_LOG_PRIORITY, ADV_DISTANCE_LOG_STACKSIZE,
        VX_FP_TASK,
	"ROV Init: ADV Distance Log Task Initialized\n",
        "ROV Init: ADV Distance Log Task Failed\n",
 	(FUNCPTR) advDistanceLogTask, 0,  NULL);

    spawnTask("portPT", PAN_TILT_SRQ_PRIORITY, PAN_TILT_STACKSIZE, VX_FP_TASK,
	"ROV Init: Port Pan/Tilt Task Initialized\n",
	"ROV Init: Port Pan/Tilt Task Failed\n",
	(FUNCPTR) panTiltTask, PAN_TILT_CAN0, PORT_PAN_TILT_CHAN);

    spawnTask("stbdPT", PAN_TILT_SRQ_PRIORITY, PAN_TILT_STACKSIZE, VX_FP_TASK,
	"ROV Init: Stbd Pan/Tilt Task Initialized\n",
	"ROV Init: Stbd Pan/Tilt Task Failed\n",
	(FUNCPTR) panTiltTask, PAN_TILT_CAN1, STBD_PAN_TILT_CHAN);

    spawnTask("vbMotor", VB_MOTOR_SRQ_PRIORITY, VB_MOTOR_SRQ_STACKSIZE, 0,
	"ROV Init: VB Motor Task Initialized\n",
	"ROV Init: VB Motor Task Failed\n",
	(FUNCPTR) vbMotorTask, VB_MOTOR_SERIAL_CHAN, 0);

    spawnTask("toolsledDcon", TOOLSLED_DCON_SRQ_PRIORITY,
         TOOLSLED_IBC_STACKSIZE, 0,
        "ROV Init: Toolsled DCon Interface Task Initialized\n",
	"ROV Init: Toolsled DCon Interface Task Initialization Failed\n",
	(FUNCPTR) toolsledDconTask, TOOLSLED_RS485_0_CHAN, NULL);

    logMsg("ROV VME Init: Software Initialization Complete\n");

    taskDelay(sysClkRateGet() * 5);
} /* rovInit() */




