/****************************************************************************/
/* Copyright 1995 to 1996 MBARI                                             */
/****************************************************************************/
/* Summary  : Tiburon Console Status Monitor for vxWorks                    */
/* Filename : consoleStatus.c                                               */
/* Author   : Andrew Pearce                                                 */
/* Project  : Tiburon                                                       */
/* Version  : Version 1.0                                                   */
/* Created  : 10/12/94                                                      */
/* Modified : 05/20/96                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header:
 * $Log:
 */
/****************************************************************************/

#include <vxWorks.h>                /* vxWorks system declarations          */
#include <semLib.h>                 /* vxWorks semaphore functions          */
#include <stdioLib.h>               /* vxWorks standard I/O functions       */
#include <msgQLib.h>                /* vxWorks Message Queue Library        */

#include "mbariTypes.h"             /* MBARI style guide type declarations  */
#include "mbariConst.h"             /* Miscellaneous constants              */

#include "rovPriority.h"            /* MBARI Rov Application Priorities     */
#include "usrTime.h"                /* MBARI time and date functions        */

#include "datamgr.h"                /* Data Manager declarations            */
#include "dm_errno.h"               /* Data Manager error declarations      */

#include "tiburon.h"                /* Tiburon definitions                  */

#define STATUS_MONITOR_RATE TIBURON_HEARTBEAT_RATE

/****************************************************************************/
/* Function    : consoleStatusTask                                          */
/* Purpose     : Monitors console to VME communications link                */
/* Inputs      : NONE                                                       */
/* Outputs     : NONE, but DM Item is modified                              */
/****************************************************************************/
   STATUS
consoleStatusTask( Void )
{
    SEM_ID  wakeupSem;              /* Used wake up this task periodically  */
    DM_Item consoleHeartBeatDm;     /* Vehicle Heartbeat Data Manager Item  */
    DM_Item consoleAliveDm;         /* Console Alive Data Manager Item      */
    DM_Time heartbeatTime, lastTime;/* Vehicle Heartbeat Update Time        */

    Nat32  heartbeat, lastHeartbeat;/* Vehicle Heartbeat                    */
    MBool  consoleAlive, lastAlive; /* Vehicle Alive Flag                   */

                                    /* Set this task priority               */
    taskPrioritySet(taskIdSelf(), TIBURON_STATUS_PRIORITY);

                                    /* Create wakeup semaphore              */
    if ((wakeupSem = semBCreate(SEM_Q_FIFO, SEM_EMPTY)) == NULL )
    {
        logMsg("Console Status Task: Error creating semaphore\n");
        return;
    } /* if */

    consoleAliveDm =
        initMicroDmItem(TIBURON_DM_PREFIX, CONSOLE_ALIVE_DM, DM_MBOOL, 1);

    consoleHeartBeatDm =
        initMicroDmItem(TIBURON_DM_PREFIX, CONSOLE_HEARTBEAT_DM, DM_NAT32, 1);

    dm_start_provider(consoleAliveDm, DM_STATIC);
    dm_start_consumer(consoleHeartBeatDm, TIBURON_HEARTBEAT_RATE, wakeupSem);

    if (dm_read( consoleHeartBeatDm, (char *) &heartbeat, sizeof(heartbeat),
        &heartbeatTime) != SUCCESS)
    {
        logMsg("consoleStatus: Can't read Console Heartbeat\n");
        return (ERROR);
    } /* if */

    lastAlive = TRUE;              /* Assume its dead so we write the Data   */
    consoleAlive = TRUE;

    writeBooleanDmItem(consoleAliveDm, consoleAlive);

    FOREVER
    {
        lastHeartbeat    = heartbeat;
        lastTime.tv_sec  = heartbeatTime.tv_sec;
        lastTime.tv_usec = heartbeatTime.tv_usec;
        lastAlive        = consoleAlive;

                                   /* Wait heartbeat time + 1 second         */
        semTake(wakeupSem, sysClkRateGet() *
                ((TIBURON_HEARTBEAT_RATE / USECS_PER_SEC) + 1));

        if (dm_read( consoleHeartBeatDm, (char *) &heartbeat, sizeof(heartbeat),
           &heartbeatTime) == SUCCESS)
        {                          /* Decide if console is alive             */
            consoleAlive = ( (heartbeat != lastHeartbeat) &&
                ((lastTime.tv_sec  !=  heartbeatTime.tv_sec) ||
                 (lastTime.tv_usec !=  heartbeatTime.tv_usec)) );

                                   /* Change in Alive State so write item    */
            if (consoleAlive != lastAlive)
                writeBooleanDmItem(consoleAliveDm, consoleAlive);
        } /* if */
        else
            logMsg("consoleStatus: Can't read Console Heartbeat\n");

    } /* FOREVER */
} /* consoleStatusTask() */




