#include "PanTiltDm.h"
#include "panTilt.h"


PanTiltDm::PanTiltDm(const char *name, const char *dmPrefix)
  : ThreeByFiveDm(name, dmPrefix)
{
  if (error())
    return;
  
  char itemName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(itemName, _dmPrefix);
  char *namePtr = itemName + strlen(itemName);

  strcpy(namePtr, HUMIDITY_DM);
  humidity = new DmNat16Object(itemName);
  if (humidity->error())
  {
    humidity->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  strcpy(namePtr, TEMPERATURE_DM);
  temperature = new DmInt16Object(itemName);
  if (temperature->error())
  {
    temperature->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  strcpy(namePtr, STEPPER_TEMP_DM);
  stepperTemperature = new DmInt16Object(itemName);
  if (stepperTemperature->error())
  {
    stepperTemperature->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  strcpy(namePtr, LOCAL_GND_FLT_CURRENT_DM);
  localGfCurrent = new DmInt16Object(itemName);
  if (localGfCurrent->error())
  {
    localGfCurrent->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  strcpy(namePtr, EXT_GND_FLT_CURRENT_DM);
  externGfCurrent = new DmInt16Object(itemName);
  if (externGfCurrent->error())
  {
    externGfCurrent->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  for (int i = 0; i < NControllers; i++)
  {
    strcpy(namePtr, deviceAxisName(i));
    
    char *suffix = itemName + strlen(itemName);
    
    strcpy(suffix, PT_RESET_CTRL_DM);
    reset[i] = new DmEmptyObject(itemName);
    
    strcpy(suffix, PT_INITIALIZE_CTRL_DM);
    initialize[i] = new DmEmptyObject(itemName);

    strcpy(suffix, PT_STEPPER_POS_DM);
    stepper[i] = new DmFlt32Object(itemName);
    
    strcpy(suffix, PT_ANALOG_POS_DM);
    analog[i] = new DmFlt32Object(itemName);
    
    strcpy(suffix, PT_CW_LIMIT_DM);
    cwSwitch[i] = new DmBooleanObject(itemName);
    
    strcpy(suffix, PT_CCW_LIMIT_DM);
    ccwSwitch[i] = new DmBooleanObject(itemName);

    strcpy(suffix, PT_DELTA_POS_ALARM_DM);
    deltaAlarm[i] = new DmBooleanObject(itemName);
    
    strcpy(suffix, PT_CTRL_FAULT_DM);
    fault[i] = new DmBooleanObject(itemName);
  }
}



PanTiltDm::~PanTiltDm()
{
}



const char *PanTiltDm::deviceAxisName(int index)
{
  switch (index)
  {
    case LightPan:
    return LIGHT_PAN_DM;
    break;
    
    case LightTilt:
    return LIGHT_TILT_DM;
    break;
    
    case CameraPan:
    return CAMERA_PAN_DM;
    break;
    
    case CameraTilt:
    return CAMERA_TILT_DM;
    break;
    
    default:
    return NULL;
  }
}
