// Servos & Manual Control
#ifndef __SERVO
#define __SERVO

#include <wx/wx.h>
#include <wx/panel.h>
#include <wx/config.h>   // wxconfig

#define ID_SERVO           300
#define SLD_PAN            ID_SERVO+1
#define SLD_TILT           ID_SERVO+2
#define SLD_FIRE           ID_SERVO+3
#define TXT_PAN_MIN        ID_SERVO+4
#define TXT_PAN_MAX        ID_SERVO+5
#define TXT_TILT_MIN       ID_SERVO+6
#define TXT_TILT_MAX       ID_SERVO+7
#define TXT_FIRE_ON        ID_SERVO+8
#define TXT_FIRE_OFF       ID_SERVO+9
#define CMD_SET_PAN_MIN    ID_SERVO+10
#define CMD_SET_PAN_MAX    ID_SERVO+11
#define CMD_SET_TILT_MIN   ID_SERVO+12
#define CMD_SET_TILT_MAX   ID_SERVO+13
#define CMD_SET_FIRE_ON    ID_SERVO+14
#define CMD_SET_FIRE_OFF   ID_SERVO+15
#define TXT_SERVO_PAN      ID_SERVO+17
#define TXT_SERVO_TILT     ID_SERVO+18
#define TXT_SERVO_FIRE     ID_SERVO+19
#define SLD_MAN_PAN        ID_SERVO+20
#define SLD_MAN_TILT       ID_SERVO+21
#define CMD_MAN_CENTER     ID_SERVO+22
#define CMD_MAN_FIRE       ID_SERVO+23
#define LBL_FIRING         ID_SERVO+24
#define TIMER_FIRING       ID_SERVO+25
#define TXT_DIST_X1        ID_SERVO+26
#define TXT_DIST_X2        ID_SERVO+27
#define TXT_DIST_Y1        ID_SERVO+28
#define TXT_DIST_Y2        ID_SERVO+29
#define CMD_DIST_X1        ID_SERVO+30
#define CMD_DIST_X2        ID_SERVO+31
#define CMD_DIST_Y1        ID_SERVO+32
#define CMD_DIST_Y2        ID_SERVO+33

class clsServo: public wxPanel {
	public:
		clsServo(wxPanel*);
		wxPanel*  m_panel;
		void txtServoPan(wxCommandEvent&);  // text changes
		void txtServoTilt(wxCommandEvent&);  // text changes
		void txtServoFire(wxCommandEvent&);  // text changes
		void sldPan(wxScrollEvent&);         // slider for the pan servo
		void sldTilt(wxScrollEvent&);        // slider for the tilt servo
		void sldFire(wxScrollEvent&);        // slider for the fire servo
		void cmdSetPanMin(wxCommandEvent&); // sets the pan minimum
		void cmdSetPanMax(wxCommandEvent&); // 
		void cmdSetTiltMin(wxCommandEvent&); // 
		void cmdSetTiltMax(wxCommandEvent&); // 
		void cmdSetFireOn(wxCommandEvent&); // 
		void cmdSetFireOff(wxCommandEvent&); // 
		// manual control
		void sldManPan(wxScrollEvent&);      // slider for the pan servo
		void sldManTilt(wxScrollEvent&);     // slider for the tilt servo
		void cmdManCenter(wxCommandEvent&);  // center
		void cmdManFire(wxCommandEvent&);  // fire
		wxSlider*     sld_man_pan;      // slider for the pan servo
		wxSlider*     sld_man_tilt;     // slider for the tilt servo
		// Automatic control
		void OnTimer(wxCommandEvent&);
//		void StartTimerFiring();
		void StopFiring(); // stop firing
		bool IsFiring() { return firing; } // are we currently firing?
	
		// distance for a pan
		void txtDistX1(wxCommandEvent&);  // text changes
		void txtDistX2(wxCommandEvent&);  // text changes
		void txtDistY1(wxCommandEvent&);  // text changes
		void txtDistY2(wxCommandEvent&);  // text changes
		void cmdDistX1(wxCommandEvent&); // 
		void cmdDistX2(wxCommandEvent&); // 
		void cmdDistY1(wxCommandEvent&); // 
		void cmdDistY2(wxCommandEvent&); // 
		double RatioX();
		double RatioY();
		void MoveRelative(int, int);

	private:
		wxConfigBase* config;
		wxSlider*     sld_pan;          // slider for the pan servo
		wxSlider*     sld_tilt;         // slider for the tilt servo
		wxSlider*     sld_fire;         // slider for the fire servo
		wxTextCtrl*   txt_pan_min;      // display/set the min/max
		wxTextCtrl*   txt_pan_max;      // 
		wxTextCtrl*   txt_tilt_min;     // 
		wxTextCtrl*   txt_tilt_max;     // 
		wxTextCtrl*   txt_fire_on;      // 
		wxTextCtrl*   txt_fire_off;     // 
		wxButton*     btn_set_pan_min;  // sets the pan minimum
		wxButton*     btn_set_pan_max;  // 
		wxButton*     btn_set_tilt_min; // 
		wxButton*     btn_set_tilt_max; // 
		wxButton*     btn_set_fire_on;  // 
		wxButton*     btn_set_fire_off; // 
		wxTextCtrl*   txt_servo_pan;    // 
		wxTextCtrl*   txt_servo_tilt;   // 
		wxTextCtrl*   txt_servo_fire;   // 
		wxButton*     btn_man_center;   // center
		wxButton*     btn_man_fire;     // fire
		wxStaticText* lbl_firing;       // text to display "firing" when firing
		wxTimer*      timer;
		bool          firing;           // currently firing (don't retrigger)
		
		// distance for a pan
		wxTextCtrl*   txt_dist_x1;      // 
		wxTextCtrl*   txt_dist_x2;      // 
		wxTextCtrl*   txt_dist_y1;      // 
		wxTextCtrl*   txt_dist_y2;      // 
		wxButton*     btn_dist_x1;      //
		wxButton*     btn_dist_x2;      //
		wxButton*     btn_dist_y1;      //
		wxButton*     btn_dist_y2;      //
};
#endif
