#include <sys/time.h>
#include "CameraDmIF.h"
#include "DmErrno.h"


struct timezone CameraServerDmIF::_timezone = 
{
  0, 0
};


CameraServerDmIF::CameraServerDmIF(SEM_ID wakeupSem)
{
  _localDmObjects = FALSE;
  _dmObjects = NULL;
  _wakeupSem = wakeupSem;
  _dmGroup = new DmGroup();
}


CameraServerDmIF::~CameraServerDmIF()
{
  if (_dmObjects && _localDmObjects)
    delete _dmObjects;
}


int CameraServerDmIF::start()
{
  if (!_dmObjects)
    return -1;
  
  Errno errno;
  char errorBuf[errorMsgSize];

  if ((errno = _dmObjects->gainStatus->startProvide(GainPeriod, 
						    MultiProviders)) 
      != SUCCESS)
  {
  }

  if ((errno = _dmObjects->colorBarsStatus->startProvide(ColorBarsPeriod, 
							 MultiProviders)) 
      != SUCCESS)
  {
  }

  // Start consuming aperiodic items, attaching semaphore
  _dmObjects->gainRequest->startConsume(GainPeriod, _wakeupSem);
  _dmObjects->colorBarsRequest->startConsume(ColorBarsPeriod, _wakeupSem);

  // Add aperiodic items to DmGroup
  _dmGroup->addItem(_dmObjects->gainRequest);
  _dmGroup->addItem(_dmObjects->colorBarsRequest);
  

  _dmObjects->zoomRequest->startConsume(ZoomPeriod);
  _dmObjects->focusRequest->startConsume(FocusPeriod);
  _dmObjects->irisRequest->startConsume(IrisPeriod);
  
  if ((errno = _dmObjects->zoomStatus->startProvide(ZoomPeriod, 
						    ExclusiveProvider)) 
      != SUCCESS)
  {
    sprintDmError(errno, "zoomStatus->startProvide()", errorBuf);
    setError(errorBuf);
    return -1;
  }

  if ((errno = _dmObjects->focusStatus->startProvide(FocusPeriod, 
						     ExclusiveProvider)) 
      != SUCCESS)
  {
    sprintDmError(errno, "focusStatus->startProvide()", errorBuf);
    setError(errorBuf);
    return -1;
  }

  if ((errno = _dmObjects->irisStatus->startProvide(IrisPeriod, 
						    ExclusiveProvider)) 
      != SUCCESS)
  {
    sprintDmError(errno, "irisStatus->startProvide()", errorBuf);
    setError(errorBuf);
    return -1;
  }

  if ((errno = _dmObjects->serverAlive->startProvide(ServerAlivePeriod, 
						     ExclusiveProvider)) 
      != SUCCESS)
  {
    sprintDmError(errno, "serverAlive->startProvide()", errorBuf);
    setError(errorBuf);
    return -1;
  }

  return 0;
}

int CameraServerDmIF::readGainRequest(CameraGain *value, DM_Time *t)
{
  if ((_errno = _dmObjects->gainRequest->read((Int32 *)value, t)) != SUCCESS)
  {
    sprintDmError(_errno, "readGain()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }

  return 0;
}


int CameraServerDmIF::readColorBarsRequest(MBool *value, DM_Time *t)
{
  if ((_errno = _dmObjects->colorBarsRequest->read(value, t)) != SUCCESS)
  {
    sprintDmError(_errno, "readColorBars()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }

  return 0;
}


int CameraServerDmIF::readZoomRequest(Int16 *value, DM_Time *t)
{
  if ((_errno = _dmObjects->zoomRequest->read(value, t)) != SUCCESS)
  {
    sprintDmError(_errno, "readZoomRequest()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }

  return 0;
}


int CameraServerDmIF::readFocusRequest(Int16 *value, DM_Time *t)
{
  if ((_errno = _dmObjects->focusRequest->read(value, t)) != SUCCESS)
  {
    sprintDmError(_errno, "readFocusRequest()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }

  return 0;
}


int CameraServerDmIF::readIrisRequest(Int16 *value, DM_Time *t)
{
  if ((_errno = _dmObjects->irisRequest->read(value, t)) != SUCCESS)
  {
    sprintDmError(_errno, "readIrisRequest()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }

  return 0;
}


int CameraServerDmIF::writeGainStatus(CameraGain value)
{
  gettimeofday(&_t, &_timezone);
  if ((_errno = _dmObjects->gainStatus->write(value, &_t)) != SUCCESS)
  {
    sprintDmError(_errno, "writeGain()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }
  else
    return 0;
}


int CameraServerDmIF::writeColorBarsStatus(MBool value)
{
  gettimeofday(&_t, &_timezone);
  if ((_errno = _dmObjects->colorBarsStatus->write(value, &_t)) != SUCCESS)
  {
    sprintDmError(_errno, "writeColorBars()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }
  else
    return 0;
}


int CameraServerDmIF::writeZoomStatus(Int16 value)
{
  gettimeofday(&_t, &_timezone);
  if ((_errno = _dmObjects->zoomStatus->write(value, &_t)) != SUCCESS)
  {
    sprintDmError(_errno, "writeZoom()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }
  else
    return 0;
}


int CameraServerDmIF::writeFocusStatus(Int16 value)
{
  gettimeofday(&_t, &_timezone);
  if ((_errno = _dmObjects->focusStatus->write(value, &_t)) != SUCCESS)
  {
    sprintDmError(_errno, "writeFocus()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }
  else
    return 0;
}


int CameraServerDmIF::writeIrisStatus(Int16 value)
{
  gettimeofday(&_t, &_timezone);
  if ((_errno = _dmObjects->irisStatus->write(value, &_t)) != SUCCESS)
  {
    sprintDmError(_errno, "writeIris()", _errorBuf);
    setError(_errorBuf);
    return -1;
  }
  else
    return 0;
}


MBool CameraServerDmIF::newGainRequest()
{
  return _dmGroup->itemChanged(_dmObjects->gainRequest);
}


MBool CameraServerDmIF::newColorBarsRequest()
{
  return _dmGroup->itemChanged(_dmObjects->colorBarsRequest);
}


