#ifndef _MICRODM_H
#define _MICRODM_H
static char MicroDm_h_id[] = "$Header: /u/oreilly/rov/datamgr/RCS/MicroDm.h,v 1.4 1998/02/23 16:33:45 oreilly Exp $";

/*
$Log: MicroDm.h,v $
Revision 1.4  1998/02/23 16:33:45  oreilly
*** empty log message ***

 * Revision 1.3  97/05/06  16:40:48  16:40:48  oreilly (Thomas C. O'Reilly)
 * *** empty log message ***
 * 
 * Revision 1.2  97/04/30  20:14:58  20:14:58  oreilly (Thomas C. O'Reilly)
 * Added bus capacitance and capacitor current to Gf 5v. 
 * Made currents and chargeTimes into arrays.
 * 
 * Revision 1.1  97/03/20  12:25:08  12:25:08  oreilly (Thomas C. O'Reilly)
 * Initial revision
 * 
 * Revision 1.1  96/10/28  09:13:47  09:13:47  oreilly (Thomas C. O'Reilly)
 * Initial revision
 * 
*/

#define N_GF5V_CHANNELS 4

#include "array.h" 
#include "DataManager.h"
#include "ibc_card.h"

/* The definitions of these strings are scattered all over the
mbari header files; not sure which files to include! Define them here
for now! */
#define HUMIDITY_ALARM_DM         "HUMIDITY_ALARM"
#define JBOX_WATER_ALARM_DM       "JBOX_WATER_ALARM"
#define HOUSING_WATER_ALARM_DM    "HOUSING_WATER_ALARM"

typedef ibcCardConfig IbcCardConfig;

class DmIbcCardConfig : public DmObject
{
  public:
  DmIbcCardConfig(const char *name);
  ~DmIbcCardConfig();
  
  Errno write(IbcCardConfig *config, DM_Time *t);
  Errno read(IbcCardConfig *config, DM_Time *t);
};



class ComponentDmObjects : public ErrorHandler
{
  public:
  
  ComponentDmObjects(const char *name, const char *dmPrefix);
  ~ComponentDmObjects();
  
  const char *name()
  {
    return (const char *)_name;
  }
  
  const char *dmPrefix()
  {
    return (const char *)_dmPrefix;
  }

  // Start consuming DmObjects at specified period
  Errno startConsuming(Period period, SEM_ID wakeup = SEM_NULL);

  // Start providing DmObjects at specified period
  Errno startProviding(Period period);

  protected:
  char *_name;
  char *_dmPrefix;

  // Add a datamanager object of specified name and type
  DmObject *add(const char *name, 
		DmObjectType type, 
		int len = 1);         // Used only for DmStringType

  // Array of all the DmObjects
  DynArray<DmObject *> _dmObjects;
};


class Gf5vDm : public ComponentDmObjects
{
  public:
  Gf5vDm(const char *name, const char *dmPrefix);
  ~Gf5vDm();
  
  static char *chargeTimeDmName(int chan);
  static char *currentDmName(int chan);
  static char *currentAlarmDmName(int chan);
  
  DmEmptyObject *selfTestCmd;
  DmEnumObject *selfTest;
  DmInt16Object *temp;
  DmInt16Object *vicorVoltage;
  DmInt16Object *offsetCurrent;
  DmBooleanObject *scanEnabled;
  DmInt16Object *current[N_GF5V_CHANNELS];
  DmInt32Object *chargeTime[N_GF5V_CHANNELS];
  DmInt16Object *sampledChannel;
  DmNat16Object *busCapacitance;
  DmInt16Object *busCapacitorCurrent;
};


/* MicroDm and subclasses contain Data Manager objects */
class MicroDm : public ComponentDmObjects
{
  public:
  MicroDm(const char *name, const char *dmPrefix);
  ~MicroDm();

  DmEmptyObject *resetCmd;
  DmEmptyObject *resetEvent;
  DmBooleanObject *ramTestStatus;
  DmStringObject *softwareRev;
  DmStringObject *id;
  DmStringObject *microSerialNo;
};


class IbcDm : public MicroDm
{
  public:
  
  IbcDm(const char *name, const char *dmPrefix);
  ~IbcDm(); 

  DmNat16Object *cardError;
  DmIbcCardConfig *cardConfig;
  DmNat16Object *humidity;
  Gf5vDm *gf5vDm;
};


class ThreeByFiveDm : public MicroDm
{
  public:

  ThreeByFiveDm(const char *name, const char *dmPrefix);
  ~ThreeByFiveDm();

  DmInt16Object *microTemp;  
};


/* --------------------------------------------------- */
/*                 Alarm objects                       */
/* --------------------------------------------------- */

class Gf5vAlarmDm : public ComponentDmObjects
{
  public:
  Gf5vAlarmDm(const char *name, const char *dmPrefix);
  ~Gf5vAlarmDm();
  
  DmEnumObject *selfTest;
  DmEnumObject *temp;
  DmEnumObject *vicorVoltage;
  DmEnumObject *current[N_GF5V_CHANNELS];

  static char *currentDmName(int chan);
};


/* MicroAlarmDm and subclasses contain Data Manager objects */
class MicroAlarmDm : public ComponentDmObjects
{
  public:
  MicroAlarmDm(const char *name, const char *dmPrefix);
  ~MicroAlarmDm();
};


class IbcAlarmDm : public MicroAlarmDm
{
  public:
  
  IbcAlarmDm(const char *name, const char *dmPrefix);
  ~IbcAlarmDm(); 

  DmEnumObject *humidity;
  DmNat16Object *humidityWarnThreshold;
  DmNat16Object *humidityAlarmThreshold;
  Gf5vAlarmDm *gf5vDm;
};


class ThreeByFiveAlarmDm : public MicroAlarmDm
{
  public:

  ThreeByFiveAlarmDm(const char *name, const char *dmPrefix);
  ~ThreeByFiveAlarmDm();

  DmEnumObject *humidity;  
  DmEnumObject *microTemp;  
};


#endif

