#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#ifdef UNIX
# include <malloc.h>
#else
# include <stdlib.h>
#endif
#include "vxUtils.h"
#include "DeviceInterface.h"
#include "DmErrno.h"

Nat16 DeviceInterface::channelNo()
{
  return _channelNo;
}


DeviceInterface::DeviceInterface(const char *name, Nat16 channelNo,
				 const char *dmPowerName)
{
  char chanName[256];
  sprintf(chanName, "/sio32/%s", name);
  _chanName = strdup(chanName);
  
  _channelNo = channelNo;

  if (dmPowerName)
  {
    dmPowerSwitchStatus = new DmEnumObject(dmPowerName);

    char errorBuf[errorMsgSize];
    
    if (dmPowerSwitchStatus->error())
    {
      dmPowerSwitchStatus->errorMsg(errorBuf);
      setError(errorBuf);
      return;
    }
    
    Errno err;
    
    if ((err = dmPowerSwitchStatus->startConsume(DM_STATIC)) != SUCCESS)
    {
      sprintDmError(err, "dmPowerSwitchStatus->startConsume(DM_STATIC)",
		    errorBuf);
      
      setError(errorBuf);
      return;
    }
  }
  else
    dmPowerSwitchStatus = NULL;

  return;
}


DeviceInterface::~DeviceInterface()
{
  free(_chanName);
}


switchStatus DeviceInterface::powerSwitchStatus()
{
  if (!dmPowerSwitchStatus)
    return SWITCH_ON;
  
  DM_Time t;
  long status;

  if (dmPowerSwitchStatus->read(&status, &t) == SUCCESS)
    return (switchStatus )status;
  else
    return SWITCH_OFF;
}
