#ifndef __CStepper_H__
#define __CStepper_H__

#include "PicServo.h"

#define STEP_DEF_MINSPEED	(10)
#define STEP_DEF_RUNCUR		(40)
#define STEP_DEF_HOLDCUR	(20)
#define STEP_DEF_SPEED		(100)
#define STEP_DEF_ACCEL		(10)
#define STEP_DEF_MAX_POT	(255)
#define STEP_DEF_MIN_POT	(0)
#define STEP_DEF_ZERO_POT	(128)
#define STEP_DEF_TOT_STEPS	(9800)
#define STEP_ANG_MAX		(15.0)
#define STEP_ANG_MIN		(-15.0)
#define STEP_ANG_PER_AD		((STEP_ANG_MAX-STEP_ANG_MIN)/255)
#define DEF_ANG_ERR_LIM		(0.6) // deadband on controller in +/- degrees

typedef struct {
	long		minspeed;
	long		runcur;
	long		holdcur;
	long		speed;
	long		accel;
} stepparams_t;

class CStepper {

private:
	BOOL		m_bAmpEn;
	int		m_nNumNodes;
	UCHAR		m_cStatus; // status byte
	UCHAR		m_cInputs; // digital inputs state byte
	CPicServo	*m_pPicServo; //pointer to PicServo object

	double	m_fAngErrLim; // angular error limit deadband region

	void	LoadParams(); // loads in new settings from registry
	void	SaveParams(); // saves settings in registry
	int _Pot1CntsToSteps;
	int _Pot1Home;
	int _currentSteps;
	int _goalSteps;
	int _Pot1;
	int _A2D;
	int _offset;

public:
	int		m_nNodeNum;
	stepparams_t	m_params;
		CStepper();
	virtual ~CStepper();

	void	Initialize(CPicServo *pic_servo, int num_nodes);
	void	EnableAmp();
	void	DisableAmp();
	BOOL	GetAmpEnabled() {return m_bAmpEn;}
	double	GetDestPos() {return _goalSteps;}
	int	GetCurPos() {return _currentSteps;}
	UCHAR	GetInputs() {return m_cInputs;}
	UCHAR   GetStatus() {return m_cStatus;}
	int	Update(); // updates status and registers
	int	SetDestPos(int pos);
	int	ClosePosLoop();
	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 A2D() {
	  return _A2D;
	}
	int pot1Steps() {
	  return (_A2D -_Pot1Home)*_Pot1CntsToSteps;
	}
	void currentSteps(int val) {
	  _currentSteps = val;
	}

	int offset() {
	  return _offset;
	}

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

};

#endif // __CStepper_H__
