#ifndef _SEMIMOTORDM_H
#define _SEMIMOTORDM_H

#include "ErrorHandler.h"
#include "MicroDm.h"
#include "semiPower.h"

///////////////////////////////////////////////////////////////////
// AppRole enumerates what kind of role the application plays
enum AppRole {
  RealtimeApp,
  UserInterfaceApp
};


class DmMotorFaultObject : public DmObject
{
public:

  DmMotorFaultObject(const char *itemName);
  ~DmMotorFaultObject();

  struct Queue {

    faultQueueEntry entry[FAULT_QUEUE_LENGTH];
  };

  virtual Errno read(faultQueueEntry *entries, DM_Time *t);
  virtual Errno write(faultQueueEntry *entries, DM_Time *t);

protected:

  DmItemSts _status;
};


/*
CLASS 
SemiMotorDm

DESCRIPTION
Contains DataManager objects for SemiPower motor application

AUTHOR
Tom O'Reilly
*/
class SemiMotorDm : public ComponentDmObjects
{
  public:

  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] name: Component name
  // [input] dmPrefix: Prefix for DataManager object names
  SemiMotorDm(const char *name, const char *dmPrefix);

  ~SemiMotorDm();

  DmInt16Object *heatSinkTemp;
  DmNat16Object *humidity;
  DmEnumObject *enable;
  DmEnumObject *enableStatus;
  DmEnumObject *cntrlMode;
  DmInt16Object *cmdThrust;
  DmInt16Object *velocity;
  DmInt16Object *currentGain;
  DmInt16Object *velocityGains;
  DmInt16Object *modelParamK4;
  DmNat16Object *outputPower;
  DmNat16Object *inputVoltage;
  DmNat16Object *elapsedHours;
  DmInt16Object *torque;

  DmMotorFaultObject *faultQueue;

  DmEnumObject *faultCode;
  DmNat16Object *current;

  DmEmptyObject *clearFaultQueue;
  DmEmptyObject *readFaultQueue;


};


#endif
