/****************************************************************************/
/* Copyright 1992, 1993 MBARI                                               */
/****************************************************************************/
/* SummAry  : IBC Quad Serial Board Data Manager Functions for VxWorks      */
/* Filename : quadSerDm.c                                                   */
/* Author   : Andrew Pearce                                                 */
/* Project  : New ROV                                                       */
/* Version  : Version 1.0                                                   */
/* Created  : 06/08/93                                                      */
/* Modified : 06/08/93                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header: $
 * $Log: $
 * Revision 1.1  93/07/01  14:34:29  14:34:29  pean (Andrew Pearce)
 * Initial revision
 *
 *
 */
/****************************************************************************/

#include <vxWorks.h>                /* vxWorks system declarations          */
#include <semLib.h>                 /* vxWorks semaphore functions          */
#include <rngLib.h>
#include <taskLib.h>                /* vxWorks task library functions       */
#include <wdLib.h>                  /* vxWorks watch dog timer functions    */
#include <systime.h>                /* vxWorks time and date functions      */
#include <msgQLib.h>                /* vxWorks Message Queue Library        */

#include <mbariTypes.h>             /* MBARI style guide type declarations  */
#include <mbariConst.h>             /* Miscellaneous MBARI constants        */

#include <sio32.h>                  /* SIO32 hardware and driver information*/
#include <sio32Server.h>            /* Sio32 server communication services  */
#include <sio32Client.h>            /* Sio32 client communication services  */
#include <powerTypes.h>             /* Power management Data Types          */
#include <powerDM.h>                /* Power/Switching Data Manager Items   */

#include <datamgr.h>                /* Data Manager declarations            */
#include <dm_errno.h>               /* Data Manager error declarations      */

#define Boolean MBool               /* Map microcontroller Boolean to MBool */

#undef RS232_MODE
#undef RS485_MODE

#include "ring.h"                   /* Microcontroller ring buffer defs     */
#include "ibc_card.h"               /* IBC Card Types                       */
#include "ibc_cmd.h"                /* IBC Serial Commands                  */
#include "filter.h"                 /* General Filter Routines              */
#include "quad_ser.h"               /* Quad Serial Board Definitions        */

#include "microcmd.h"               /* Microcontroller commands             */
#include "microDm.h"                /* Micro Data Manager Items & Functions */

#include "ibc.h"                    /* IBC Communication Interface Functions*/
#include "quadSerDm.h"              /* Defines & Functions for quadSerDm.c  */
#include "quadSerCmd.h"             /* Function Prototypes for quadSerCmd.c */


/*****************************************************************************/
/* Function    : createIbcQuadSerDmItems                                     */
/* Purpose     : Initialize Data Manager Item Handles for IBC Quad Ser Board */
/* Inputs      : Pointer to structure containing Quad Ser Data Manager Handes*/
/*               and IBC Data Concentrator Name                              */
/* Outputs     : None, but Data Manager Items change                         */
/*****************************************************************************/
    STATUS
createIbcQuadSerDmItems( ibcQuadSerDmItems *quadSerDmItems,
    const char* ibcDmPrefix, const char* ibcDataCon, Int16 quadSerBoardNum )
{
    Int32   item;                   /* Counter for DM Item Initialization   */
    Errno   status;                 /* Result of dm_create function call    */
    const   char itemPrefix[MAX_NMLEN]; /* Data Manager Item Prefix Name    */

    struct                          /* Data Manager Item Table for table    */
    {                               /* driven item initialization           */
        DM_Item *dmItem;            /* pointer to actual dm item handle     */
        char    *errorMsg;          /* Message to display of dmCreate fails */
        char    *name;              /* Data Manager Item Name               */
        DM_Type type;               /* Data Manager Item Type               */
        DM_Num  len;                /* Data Manager Item Element Count      */
    } quadSerDmInit[] =

      { { &quadSerDmItems->psuStatus,  "Quad Serial PSU Status",
                QUAD_SER_PSU_STATUS_DM,      DM_NAT16, 1 },

        { NO_ITEM, NULL, NULL, DM_ENDT, 0 } };

    sprintf(itemPrefix, "%sQUAD_SER%d.", ibcDmPrefix, quadSerBoardNum);

                                    /* Clear list of Data Manager Item handles*/
    bzero(quadSerDmItems, sizeof(ibcQuadSerDmItems));

                                   /* Initialize Data Manager Items from table*/
    for (item = 0; quadSerDmInit[item].dmItem != NO_ITEM; item++)
    {
        if ((*quadSerDmInit[item].dmItem =
             initMicroDmItem(itemPrefix, quadSerDmInit[item].name,
             quadSerDmInit[item].type, quadSerDmInit[item].len)) == ERROR)

        {                           /* Error occurred so print message & exit */
            logMsg("%s: Error Initializing %s DM Item\n",
                ibcDataCon, quadSerDmInit[item].errorMsg);
            return(ERROR);
        } /* if */
    } /* for */

    return(OK);                     /* All IBC CPU Data Mgr items initialized */
} /* createIbcQuadSerDmItems() */

    Void
initIbcQuadSerAlarmProvider( ibcQuadSerDmItems* quadSerItems )
{
    dm_start_provider(quadSerItems->psuStatus, DM_STATIC);
} /* initIbcQuadSerAlarmProvider() */

    STATUS
updateIbcQuadSerAlarmsDm( sio32Chan *sio32DataChan, Word boardAddr,
     ibcQuadSerDmItems *quadSerItems )
{
    Nat16 psuStatus;

    if (IBC_QUAD_SERIAL_GetPsuStatus( sio32DataChan, boardAddr, &psuStatus )
        != OK)
        return (ERROR);

                                    /* Write alarm status to Data Manager */
    return (writeDmItem(quadSerItems->psuStatus, &psuStatus,
       sizeof(psuStatus))) ;
} /* updateQuadSerAlarmsDm() */

    MBool
processIbcQuadSerSRQ( Word srqRequest, Byte* buffer, Word quadSerBoardAddr,
    ibcQuadSerDmItems* quadSerItems )
{
    Word boardAddr;                 /* IBC Board Address                      */
    Word channel;                   /* IBC Board Channel Number               */
    Word psuStatus;                 /* Quad Serial PSU Status Word            */
    Word recvStatus;                /* Quad Serial Receiver Status            */
    ibcAlarm alarmStatus;           /* IBC Alarm Status                       */

    switch (srqRequest)
    {
        case QUAD_SER_PSU_FAULT_SRQ:
            wordsFromBuf(buffer, 3, &srqRequest, &boardAddr, &psuStatus);

            if (boardAddr != quadSerBoardAddr)
                return(FALSE);          /* Address missmatch                 */

            writeDmItem(quadSerItems->psuStatus, &psuStatus, sizeof(psuStatus));
            break;

        case QUAD_SER_RECV_ERROR_SRQ:
            wordsFromBuf(buffer, 3, &srqRequest, &boardAddr, &recvStatus);

            if (boardAddr != quadSerBoardAddr)
                return(FALSE);          /* Address missmatch                 */

#if 0              /* Do Nothing for now because this is normally handled by */
                   /*  VSP software                                           */
            writeDmItem(quadSerItems->psuStatus, &psuStatus, sizeof(psuStatus));
#endif
            break;

        default:
            return(FALSE);              /* SRQ Request not recognized        */

    } /* switch */

    return(TRUE);                       /* SRQ Request recognized            */
} /* processIbcQuadSerSRQ() */












