/****************************************************************************/
/* Copyright 1997 to 1998 MBARI                                             */
/****************************************************************************/
/* Summary  : Power IBC Interface Module for VxWorks                        */
/* Filename : busCap.c                                                      */
/* Author   : Andrew Pearce                                                 */
/* Project  : Tiburon ROV                                                   */
/* Version  : Version 1.0                                                   */
/* Created  : 04/24/97                                                      */
/* Modified : 05/05/98                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header:
 * $Log:
 */
/****************************************************************************/

#include <vxWorks.h>                /* vxWorks system declarations          */
#include <semLib.h>                 /* vxWorks semaphore functions          */
#include <taskLib.h>                /* vxWorks task library functions       */
#include <systime.h>                /* vxWorks time and date functions      */
#include <strLib.h>                 /* vxWorks string function library      */
#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 "powerAlloc.h"             /* Device Power Requirements            */
#include "powerDM.h"                /* Power System Data Manager Items      */
#include "powerTypes.h"             /* Power management Data Types          */

#include "sio32Drv.h"               /* Sio32 hardware and driver information*/
#include "sio32Server.h"            /* Sio32 server communication services  */
#include "sio32Client.h"            /* Sio32 client communication services  */
#include "powerIbc.h"               /* Power Can IBC Data Manager Items     */

#define Boolean MBool               /* Map microcontroller Boolean to MBool */

#include "ibc_card.h"               /* IBC Card Types                       */
#include "filter.h"                 /* IBC General IIR Filter Routines      */
#include "gf_board.h"               /* GF/5V Controller Board Definitions   */

#include "ibc.h"                    /* Function Prototypes for ibc.c        */
#include "switch.h"                 /* IBC Power Switch Function Definitions*/
#include "hpsDm.h"                  /* IBC HPS Board Data Manager Functions */
#include "gf_5vDm.h"                /* IBC Ground Fault Board DMgr Functions*/
#include "gf_5v.h"                  /* IBC Ground Fault Board Definitions   */

#include "moogdef.h"                /* Moog motor software definitions      */
#include "pwr_ibc_a.h"              /* Power IBC A Can Configuration        */

typedef struct
{
    char        *name;
    DM_Item     dmItem;
} dmStruct;


MLocal dmStruct switchItems[] =
{
    { THRUSTER_PORT_HORIZ_SWITCH_STATUS_DM, NO_ITEM },
    { THRUSTER_STBD_HORIZ_SWITCH_STATUS_DM, NO_ITEM },
    { THRUSTER_PORT_VERT_SWITCH_STATUS_DM,  NO_ITEM },
    { THRUSTER_STBD_VERT_SWITCH_STATUS_DM,  NO_ITEM },
    { THRUSTER_FWD_LAT_SWITCH_STATUS_DM,    NO_ITEM },
    { THRUSTER_AFT_LAT_SWITCH_STATUS_DM,    NO_ITEM },
    { VB_MOTOR_SWITCH_STATUS_DM,            NO_ITEM },
    { NULL,                                 NO_ITEM }
};

/*****************************************************************************/
/* Function    : busCapTask                                                  */
/* Purpose     : Calculates 240V Bus Capacitance for GF Model                */
/* Inputs      : None                                                        */
/* Outputs     : Normally runs forever, but exits if error occurs            */
/*****************************************************************************/
    Void
busCapTask( Void )
{
    SEM_ID  dmUpdateSem;            /* Data Manager Item Change wakeup sem   */
    Int32   device;                 /* Index for device switches             */
    switchStatus switchState;       /* Device switch state                   */

    DM_Item busCapacitanceDmItem;   /* Bus Capacitance Data Manager Handle   */
    Nat16   busCapacitance;         /* Calculated bus capacitance            */

                                    /* Set this task priority                */
    taskPrioritySet(taskIdSelf(), BUS_CAP_TASK_PRIORITY);

    busCapacitanceDmItem = initMicroDmItem(PWR_IBC_A_DM_PREFIX,
        GF_5V_BUS_CAPACITANCE_DM, DM_NAT16, 1);

    dm_start_provider(busCapacitanceDmItem, DM_STATIC);

                                    /* Create wakeup semaphore               */
    if ((dmUpdateSem = semBCreate(SEM_Q_FIFO, SEM_EMPTY)) == NULL )
    {
        logMsg("Bus Capacitance Task: Error creating semaphore\n");
        return;
    } /* if */

    device = 0;
    while(switchItems[device].name != NULL)
    {
        switchItems[device].dmItem =
            initMicroDmItem("", switchItems[device].name, DM_ENUM, 1);

        dm_start_consumer(switchItems[device].dmItem, DM_STATIC, dmUpdateSem);

        device++;
    } /* while */

    FOREVER
    {
        busCapacitance = 0;
        device = 0;
        while(switchItems[device].dmItem != NO_ITEM)
        {
            if (dm_read(switchItems[device].dmItem, (char *) &switchState,
                sizeof(switchState), (DM_Time *) NULL) == SUCCESS)
                if (switchState == SWITCH_ON)
                    busCapacitance += MOTOR_BYPASS_CAPACITANCE;
            device++;
        } /* while */

        writeDmItem(busCapacitanceDmItem, &busCapacitance,
           sizeof(busCapacitance));

        semTake(dmUpdateSem, WAIT_FOREVER);
    } /* FOREVER */
} /* busCapTask() */


