/****************************************************************************/
/* Copyright 1995 to 1996 MBARI                                             */
/****************************************************************************/
/* Summary  : Prints out Data Manager Items for Log Sheet                   */
/* Filename : logSheet.c                                                    */
/* Author   : Andrew Pearce                                                 */
/* Project  : Tiburon                                                       */
/* Version  : Version 1.0                                                   */
/* Created  : 03/21/96                                                      */
/* Modified : 03/21/96                                                      */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/* $Header:
 * $Log:
 */
/****************************************************************************/

#include <types.h>
#include <dmUnix.h>
#include <semLib.h>
#include <datamgr.h>
#include <dm_errno.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#define CONFIG_FILE     "/usr/tiburon/config/logSheet"

#define ALIGN(n, t)     ((t>1) ? (((n)+t-1) & ~(t-1)) : (n))

Extern Nat32            type_sizes[], *type_align;

#define NAME_LEN 60

/************************************************************************/
/* Function    : ShowData                                               */
/* Purpose     : Print DM Data to tty                                   */
/* Inputs      : Status ptr, data ptr                                   */
/* Outputs     : Error number                                           */
/************************************************************************/
    Int32
ShowData( DmItemSts *sp, void *data )
{
    Reg Nat32           i, j, n;
    Reg DM_Element      *ep;
    Reg char            *p;
    MBool               comma;
    Flt32               f;
    Flt64               g;

    comma = FALSE;
    ep = sp->is_compound;

    for ( i = n = 0; i < sp->is_num_compounds; i++, ep++ )
    {
        for ( j = 0; j < ep->elt_num; j++ )
        {
            if ( comma )
                printf(", ");
            comma = TRUE;

            n = ALIGN( n, type_align[ep->elt_type] );
            p = data + n;

            switch( ep->elt_type )
            {
              case DM_EMPTY:
                break;

              case DM_CHAR:
              case DM_UCHAR:
                printf("%c", *p);
                comma = FALSE;
                break;

              case DM_INT16:
              case DM_MBOOL:
                printf("%hd", *(Int16 *)p);
                break;

              case DM_NAT16:
                printf("%hu", *(Nat16 *)p);
                break;

              case DM_INT32:
              case DM_ENUM:
                printf("%d", *(Int32 *)p);
                break;

              case DM_NAT32:
                printf("%u", *(Nat32 *)p);
                break;

              case DM_FLT32:
                bcopy(p, (char *)&f, sizeof(Flt32));
                g = f;
                printf("%f", g);
                break;

              case DM_FLT64:
                bcopy(p, (char *)&g, sizeof(Flt64));
                printf("%f", g);
                break;

              case DM_PTR:
                printf("%#x", *(Nat32 *)p);
                break;

              default:
                printf("Unknown type %d\n", ep->elt_type );
            }

            n += type_sizes[ep->elt_type];
        }
        comma = TRUE;
    }

    return( SUCCESS );

} /* ShowData() */

/************************************************************************/
/* Function    : printDmItem                                            */
/* Purpose     : Print one Data Manager Item                            */
/* Inputs      : DM_Item to print out                                   */
/* Outputs     : Error number                                           */
/************************************************************************/
    STATUS
printDmItem( DM_Item item )
{
    DmItemSts           sts;            /* Status struct                */
    void* dmData[MAX_ITM_SIZE];         /* Buffer for the item data     */
    Reg Errno           rtn;            /* Return code from dm calls    */
    char name[NAME_LEN + 1];
    Int16 c;

    if ( (rtn = dm_item_status(item, &sts)) != SUCCESS )
    {
        printf("Failure of dm_item_status(), return = %#x\n", rtn);
        return( rtn );
    } /* if */

    if ( (rtn = dm_read(item, dmData, sts.is_size, (DM_Time *) NULL))
        != SUCCESS)
    {
        printf("Failure of dm_read(), return = %#x\n", rtn);
        return( rtn );
    } /* if */

    strcpy(name, sts.is_name);
    if ((c = strlen(name)) < NAME_LEN)
    {
        for (name[c] = ' ', c++; c < NAME_LEN; c++)
            name[c] = '.';

        name[c] = '\0';
    }

    printf("%-60s ", name);
    ShowData( &sts, dmData );

    printf("\n");

    dm_item_status_free( &sts );

    return( SUCCESS );
} /* printDmItem() */

/****************************************************************************/
/* Function    : main                                                       */
/* Purpose     : Prints value if various Data Manager Items for log sheet   */
/* Inputs      : None                                                       */
/* Outputs     : None                                                       */
/****************************************************************************/
   int
main( Void )
{
    FILE    *itemFile;              /* Data Manager Item Name File          */
    char    dmItemName[MAX_NMLEN];  /* Data Manager Item Name               */
    char    *newLine;
    DM_Item dmItem;                 /* Data Manager Item Handle             */

    time_t timeNow;                 /* Time from real-time clock            */
    struct tm *localTime;           /* GMT                                  */

#if UNIX
    if (dm_init(0) == EDM_NO_DAEMON)/* Initialize Data Manage Services      */
    {
        printf("Data Manager Not Running\n");
        return(ERROR);
    } /* if */
#endif

    dmItem = NO_ITEM;               /* Clear Data Manager Item handle       */

    if ( (itemFile = fopen(CONFIG_FILE, "r")) == (FILE *) NULL )
    {
        printf("Can't open logShet config file: %s\n", CONFIG_FILE);
        return (ERROR);
    } /* if */

    timeNow = time ( (time_t *) 0); /* Read real-time clock to print time   */
    localTime = localtime (&timeNow);
    printf("Tiburon Log Sheet for %s", asctime(localTime));

                                    /* Read Data Manager Items from file    */
    while (fgets(dmItemName, MAX_NMLEN, itemFile) != NULL)
    {
        if ((newLine = strchr(dmItemName, '\n')) != NULL)
        {
            *newLine = '\0';        /* Remove newline from string           */

                                    /* Get Data Manager Item Handle         */
            if ( (dmItem = dm_lookup(dmItemName, 0)) != NO_ITEM)
            {
                                    /* Consumer item                        */
                dm_start_consumer(dmItem, DM_STATIC, SEM_NULL);
                printDmItem(dmItem);
                dm_stop_consumer(dmItem);
            } /* if */
        } /* if */
    } /* while */

    return (OK);
} /* main() */







