

#ifndef __STP100_H__
#define __STP100_H__


#include "SerialDevice.h"
#include "ourTypes.h"
#include "Exception.h"


#define STEPHALF 1
#define STEPFULL 2
#define STEPWAVE 3
#define COMMANDDELAY 3       // millisec delay inserted before all commands
                             // controller docs say 3 millisec minimum  


#define EEPROM_ADDR (0)
#define EEPROM_SD_LOBYTE (2)
#define EEPROM_SD_HIBYTE (3)
#define EEPROM_MSF_LOBYTE (4)
#define EEPROM_MSF_HIBYTE (5)
#define EEPROM_SAF (6)
#define EEPROM_STEP_MODE (7)
#define EEPROM_STEP_PWRHLD (8)
#define EEPROM_BAUD (9)
#define EEPROM_PRE_ENABLE (10)

class stp100 {
  
 public:

  stp100(SerialDevice *dev, int board);

  ~stp100();

  int selectBoard();
  int moveImmediate(int abspos);
  int moveCued(int abspos);
  int incrementImmediate(int inc);
  int incrementCued(int inc);
  int cue();
  int pinSet(int pinnum);
  int pinClear(int pinnum);
  int readPin(int pinnum);
  int readA2D(int chan);
  int writeRam(int addr, int val);
  int readRam(int addr);
  int eepromWrite(int addr, int val);
  int eepromRead(int addr);
  int writeSysSet();
  int readPos();
  int readDest();
  int readDelta();
  int home(int pos);
  int haltSmooth();
  int haltImmediate(); 
  int turnClockwise();
  int turnCounterClockwise();
  int provideHoldingTorque(Boolean hold);
  int setStepMode(int mode);
  int setDelay(int del);
  int readDelay();
  int setAccelFactor(int accelfactor);
  int readAccelFactor();
  int setMinStepDelayFactor(int del);
  int readMinStepDelayFactor();
  void readState();
  int Pot1Home() {
    return _Pot1Home;
  }
  void Pot1Home(int val) {
    _Pot1Home = val;
  }

  int Pot1CntsToSteps() {
    return _Pot1CntsToSteps;
  }
  void Pot1CntsToSteps(int val) {
    _Pot1CntsToSteps = val;
  }
  int currentSteps() {
    return _currentSteps;
  }
  int goalSteps() {
    return _goalSteps;
  }
  int pot1() {
    return _Pot1;
  }
  int AD2() {
    return _AD2;
  }
  int pot1Steps() {
    return _Pot1*_Pot1CntsToSteps;
  }
  void currentSteps(int val) {
    _currentSteps = val;
  }

  int offset() {
    return _offset;
  }

  void offset(int val) {
    _offset = val;
  }

 private:

  ////////////////////////////////////
  // routines to build the command strings

  int constructCmd(char* cmd);
  int constructCmd(char* cmd, int p1);
  int constructCmd(char* cmd, int p1, int p2);
  int constructCmd(char *cmd1, int p1, char *cmd2);

  //////////////////////////////////////////////
  // routine to read reply strings from stp100
  int readReply(int numbytes); 
  void readReply(int num, int vals[], int numbytes);
  void mywrite(char *data, int nbytes);

  ///////////////////////////////////////
  // attributes
  
  SerialDevice *_dev;
  int _timeout;
  unsigned int _board;
  char *_boardcmd;
  char *_cmdstr;
  char *_replystr;
  int _Pot1CntsToSteps;
  int _Pot1Home;
  int _currentSteps;
  int _goalSteps;
  int _Pot1;
  int _AD2;
  int _offset;
};



class stp100Exception : public Exception{
 public:
  stp100Exception(char* msg) : Exception(msg){}

};



#endif
