/****************************************************************************/
/* Copyright 1997 to 1998 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 : 03/03/98                                                      */
/* 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 <ioLib.h>                  /* vxWorks I/O library, for file I/O    */
#include <netDrv.h>
#include <logLib.h>

#include "mbariTypes.h"             /* mbari style guide type declarations  */
#include "rovPriority.h"            /* MBARI Rov Application Priorities     */

extern "C" {

#include "datamgr.h"                /* Data Manager Declarations            */
#include "usrTime.h"                /* MBARI time and date functions        */
#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     */

extern  void sysVmeBusReset( void );
}

#include "mwsledDcon.h"             /* MidWater Toolsled Dcon Interface     */
extern  int telnetTaskPriority;

MLocal  int             tibLogFd;


/****************************************************************************/
/* Function    : myLogMsg                                                   */
/* Purpose     : Interface to vxWorks lgoMsg deals ignores extra int args   */
/* Inputs      : name, priority, stack size, task options, messages for     */
/*               successful and unsuccessful task creation. func ptr & args */
/* Outputs     : Returns OK or ERROR                                        */
/****************************************************************************/
     LOCAL STATUS
myLogMsg(char *msg)
{
  return (logMsg(msg, 0, 0, 0, 0, 0, 0));
};

/****************************************************************************/
/* 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,
       entryPoint, arg1, arg2, 0, 0, 0, 0, 0, 0, 0, 0 ) != ERROR)
    {
       myLogMsg(okMsg);
       return (OK);
    } /* if */

    myLogMsg(errorMsg);
    return(ERROR);
} /* spawnTask() */

/****************************************************************************/
/* Function    : rovShutdown                                                */
/* Purpose     : Called by rebootHook when vehicle rebooted                 */
/* Inputs      : None                                                       */
/* Outputs     : None                                                       */
/****************************************************************************/
    Void
rovShutdown( Void )
{
    close( tibLogFd );
    sysVmeBusReset();

} /* rovShutdown() */

/****************************************************************************/
/* 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);

    rebootHookAdd ( (FUNCPTR)rovShutdown );

    usrTimeInit();                  /* Initialize MBARI time library         */

    telnetTaskPriority = 200;

    if (netDevCreate ("batray:", "batray.mbari.org", 0) != OK)
        myLogMsg("ROV Init: error creating ftp file system device\n");

    tibLogFd = open("/usr/tiburon/logs/tiburon.log", O_WRONLY | O_CREAT, 0444);
    logFdAdd( tibLogFd );

    dm_init( (DM_Define*) NULL );   /* Initialize Data Manager              */

    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);

#ifdef BUILD_MIDWATER_SLED
    spawnTask("mwsledDcon", TOOLSLED_DCON_SRQ_PRIORITY,
         TOOLSLED_IBC_STACKSIZE, 0,
        "ROV Init: MidWater Toolsled DCon Task Initialized\n",
        "ROV Init: MidWater Toolsled DCon Task Initialization Failed\n",
        (FUNCPTR) midWaterApp, TOOLSLED_RS485_0_CHAN, NULL);
#endif

#ifdef BUILD_GENERIC_SLED
    spawnTask("toolsledDcon", TOOLSLED_DCON_SRQ_PRIORITY,
         TOOLSLED_IBC_STACKSIZE, 0,
        "ROV Init: Generic Toolsled DCon Task Initialized\n",
        "ROV Init: Generic Toolsled DCon Task Initialization Failed\n",
        (FUNCPTR) toolsledDconTask, TOOLSLED_RS485_0_CHAN, NULL);
#endif

    myLogMsg("ROV VME Init: Software Initialization Complete\n");
} /* rovInit() */


