#include "MotorDm.h"

#ifndef UNIX
# define Boolean MBool
# include "msgQLib.h"
# include "sio32.h"
# include "sio32Server.h"
# include "sio32Client.h"
# include "microDm.h"
# include "ibc_card.h"
# include "filter.h"
# include "gf_board.h"
# include "vxUtils.h"
#endif

#include "microcmd.h"
#include "ibcDm.h"
#include "pduMicro.h"
#include "microDm.h"
#include "ersDcon.h"
#include "lightingDcon.h"
#include "powerIbc.h"
#include "vmeIbc.h"
#include "cameraDcon.h"
#include "sensorDcon.h"
#include "sonarDcon.h"
#include "gf_5vDm.h"
#include "moogdef.h"
#include "moogThrusterDM.h"

MotorDm::MotorDm(const char *name, const char *dmPrefix)
  : MicroDm(name, dmPrefix)
{
  char dmItemName[MaxDmNameLen];
  char errorBuf[errorMsgSize];

  strcpy(dmItemName, _dmPrefix);
  char *namePtr = dmItemName + strlen(dmItemName);
  
  strcpy(namePtr, TEMPERATURE_DM);
  microTemp = new DmInt16Object(dmItemName);
  if (microTemp->error())
  {
    microTemp->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MICRO_WRITE_NVRAM_DM);
  nvRamWrite = new DmEmptyObject(dmItemName);
  if (nvRamWrite->error())
  {
    nvRamWrite->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MICRO_NVRAM_CYCLES_DM);
  nvRamCycles = new DmNat16Object(dmItemName);
  if (nvRamCycles->error())
  {
    nvRamCycles->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MICRO_NVRAM_DATE_DM);
  nvRamDate = new DmStringObject(dmItemName, NV_RAM_DATE_LEN);
  if (nvRamDate->error())
  {
    nvRamDate->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MICRO_NVRAM_INITIALIZED_DM);
  nvRamInitialized = new DmEmptyObject(dmItemName);
  if (nvRamInitialized->error())
  {
    nvRamInitialized->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_SERIAL_NO_DM);
  motorSerialNo = new DmStringObject(dmItemName, MOTOR_SERNO_LEN);
  if (motorSerialNo->error())
  {
    motorSerialNo->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_VELOCITY_DM);
  velocity = new DmInt16Object(dmItemName);
  if (velocity->error())
  {
    velocity->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_STATUS_DM);
  status = new DmInt16Object(dmItemName);
  if (status->error())
  {
    status->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_TORQUE_OFFSET_DM);
  torqueOffset = new DmInt16Object(dmItemName);
  if (torqueOffset->error())
  {
    torqueOffset->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_CTRL_MODE_DM);
  cntrlMode = new DmEnumObject(dmItemName);
  if (cntrlMode->error())
  {
    cntrlMode->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_CMD_THRUST_DM);
  cmdThrust = new DmInt16Object(dmItemName);
  if (cmdThrust->error())
  {
    cmdThrust->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_CMD_POWER_DM);
  cmdPower = new DmInt16Object(dmItemName);
  if (cmdPower->error())
  {
    cmdPower->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_CURRENT_GAIN_DM);
  currentGain = new DmInt16Object(dmItemName);
  if (currentGain->error())
  {
    currentGain->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_TORQUE_GAIN_DM);
  torqueGain = new DmInt16Object(dmItemName);
  if (torqueGain->error())
  {
    torqueGain->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_VELOCITY_GAINS_DM);
  velocityGains = new DmInt16Object(dmItemName, VELOCITY_GAIN_SIZE);
  if (velocityGains->error())
  {
    velocityGains->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_LINEARIZED_GAINS_DM);
  linearGains = new DmInt16Object(dmItemName, LINEARIZED_GAIN_SIZE);
  if (linearGains->error())
  {
    linearGains->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_MODEL_PARAM_K4_DM);
  modelParamK4 = new DmInt16Object(dmItemName);
  if (modelParamK4->error())
  {
    modelParamK4->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_REGEN_LIMIT_MODE_DM);
  regenLimitMode = new DmBooleanObject(dmItemName);
  if (regenLimitMode->error())
  {
    regenLimitMode->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  strcpy(namePtr, MOTOR_REGEN_LIMIT_DM);
  regenLimit = new DmNat16Object(dmItemName);
  if (regenLimit->error())
  {
    regenLimit->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_RPM_CAL_DM);
  rpmCalibrate = new DmEmptyObject(dmItemName);
  if (rpmCalibrate->error())
  {
    rpmCalibrate->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_VEL_BUF_MODE_DM);
  velBufEnable = new DmEmptyObject(dmItemName);
  if (velBufEnable->error())
  {
    velBufEnable->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  strcpy(namePtr, MOTOR_VEL_BUF_READ_DM);
  velBufRead = new DmEmptyObject(dmItemName);
  if (velBufRead->error())
  {
    velBufRead->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
}


MotorDm::~MotorDm()
{
}
