#include <stdio.h>
#include "LapBoxTaskControl.h"
#include "lapBox.h"
#include "DmErrno.h"

extern "C" 
{
# include "usrTime.h" 
};
#include "vxUtils.h"

#define dprintf if (debug) fprintf

// class used to pass Lapbox setting info between tasks
LapBoxTaskControl::LapBoxTaskControl(const char *name, int nTasks,
				     LapBoxMicro *micro, const char *dmPrefix)
  : TaskControl(name, nTasks, micro, dmPrefix, NO_ITEM)
{  
  char dmMaskName[MaxDmNameLen], dmCameraName[MaxDmNameLen]; 
  char dmEnabledName[MaxDmNameLen];
  char dmAutoIrisName[MaxDmNameLen];
  char dmSensitivityName[MaxDmNameLen];
  char dmMemoryName[MaxDmNameLen];
  
   _name = strdup(name);
   _dmPrefix = strdup(dmPrefix);
   
   strcpy(dmAutoIrisName, dmPrefix);
   strcat(dmAutoIrisName, "AUTO_IRIS");
   _dmAutoIris = new DmBooleanObject(dmAutoIrisName);
   _dmAutoIris->startProvide(DM_STATIC);
   _dmAutoIris->startConsume(DM_STATIC);

   strcpy(dmSensitivityName, dmPrefix);
   strcat(dmSensitivityName, "SENSITIVITY");
   _dmSensitivity = new DmEnumObject(dmSensitivityName);
   _dmSensitivity->startProvide(DM_STATIC);
   _dmSensitivity->startConsume(DM_STATIC);

   strcpy(dmMemoryName, dmPrefix);
   strcat(dmMemoryName, "MEMORY");
   _dmMemory = new DmBooleanObject(dmMemoryName);
   _dmMemory->startProvide(DM_STATIC);
   _dmMemory->startConsume(DM_STATIC);

   setPanTilts(0);
   setCamera(IviewNoDevice);
   setEnabled(FALSE);
   panoramic = FALSE;
} 


LapBoxTaskControl::~LapBoxTaskControl()
{
  free(_name);
}


void LapBoxTaskControl::setPanTilts(unsigned short mask) {

  _panTilts = mask;
} 


unsigned short LapBoxTaskControl::getPanTilts() {
  return _panTilts;
}


void LapBoxTaskControl::setCamera(IviewDevice camera) {
  _camera = camera;
}  


IviewDevice LapBoxTaskControl::getCamera() {
  return _camera;
}


MBool LapBoxTaskControl::getEnabled()
{
  return _enabled;
}


void LapBoxTaskControl::setEnabled(MBool state)
{
  _enabled = state;
}

MBool LapBoxTaskControl::getAutoIris()
{  
  MBool autoIris;
  DM_Time dmTime;

  char errorBuf[512];
  Errno err;

  _dmAutoIris->startConsume(DM_STATIC);
  if ((err = _dmAutoIris->read(&autoIris, &dmTime)) != SUCCESS)
  {
    sprintDmError(err, "LapBoxTaskControl::getAutoIris()", errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
  }
  return autoIris;
}

void LapBoxTaskControl::setAutoIris(MBool state)
{
  DM_Time dmTime;
  
  gettimeofday(&dmTime, (struct timezone *) NULL);

  char errorBuf[512];
  Errno err;

  _dmAutoIris->startProvide(DM_STATIC);
  if ((err = _dmAutoIris->write(state, &dmTime)) != SUCCESS)
  { 
    sprintDmError(err, "LapBoxTaskControl::setAutoIris()", errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
  }
}

IviewSensitivity LapBoxTaskControl::getSensitivity()
{  
  //IviewSensitivity state;
  Int32 state;
  DM_Time dmTime;

  char errorBuf[512];
  Errno err;

  _dmSensitivity->startConsume(DM_STATIC);
  if ((err = _dmSensitivity->read(&state, &dmTime)) != SUCCESS)
  {
    sprintDmError(err, "LapBoxTaskControl::getSensitivity()", errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
  }
  return (IviewSensitivity)state;
}

void LapBoxTaskControl::setSensitivity(IviewSensitivity state)
{
  DM_Time dmTime;
  
  gettimeofday(&dmTime, (struct timezone *) NULL);

  char errorBuf[512];
  Errno err;

  _dmSensitivity->startProvide(DM_STATIC);
  if ((err = _dmSensitivity->write(state, &dmTime)) != SUCCESS)
  { 
    sprintDmError(err, "LapBoxTaskControl::setSensitivity()", errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
  }
}


MBool LapBoxTaskControl::getMemory()
{  
  MBool memory;
  DM_Time dmTime;

  char errorBuf[512];
  Errno err;

  _dmMemory->startConsume(DM_STATIC);
  if ((err = _dmMemory->read(&memory, &dmTime)) != SUCCESS)
  {
    sprintDmError(err, "LapBoxTaskControl::getMemory()", errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
  }
  return memory;
}

void LapBoxTaskControl::setMemory(MBool state)
{
  DM_Time dmTime;
  
  gettimeofday(&dmTime, (struct timezone *) NULL);

  char errorBuf[512];
  Errno err;

  _dmMemory->startProvide(DM_STATIC);
  if ((err = _dmMemory->write(state, &dmTime)) != SUCCESS)
  { 
    sprintDmError(err, "LapBoxTaskControl::setMemory()", errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
  }
}




