#if 0
LX200-based Omegon EQ500X Equatorial Mount

Copyright (C) 2019 Eric Dejouhanet (eric.dejouhanet@gmail.com)

This library is free software;
you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY;
without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library;
if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110 - 1301  USA
#endif

#ifndef EQ500X_H
#define EQ500X_H

class EQ500X : public LX200Generic
{
public:
    class MechanicalPoint
    {
    public:
        MechanicalPoint(double, double);
        MechanicalPoint() {}
    public:
        bool atParkingPosition() const;
    public:
        double RAm() const;
        double DECm() const;
        double RAm(double const);
        double DECm(double const);
    public:
        double RAsky() const;
        double DECsky() const;
        double RAsky(double const);
        double DECsky(double const);
    public:
        enum PointingState { POINTING_NORMAL, POINTING_BEYOND_POLE };
        enum PointingState setPointingState(enum PointingState);
        enum PointingState getPointingState() const;
    public:
        bool parseStringDEC(char const *, size_t);
        bool parseStringRA(char const *, size_t);
        char const * toStringDEC(char *, size_t) const;
        char const * toStringRA(char *, size_t) const;
    public:
        char const * toStringDEC_Sim(char *, size_t) const;
    public:
        double RA_degrees_to(MechanicalPoint const &) const;
        double DEC_degrees_to(MechanicalPoint const &) const;
    public:
        double operator -(MechanicalPoint const &) const;
        bool operator !=(MechanicalPoint const &) const;
        bool operator ==(MechanicalPoint const &) const;
    protected:
        enum PointingState _pointingState {POINTING_NORMAL};
        long _RAm {0*3600}, _DECm {0*3600};
    };
public:
    EQ500X();
    const char *getDefautName();
protected:
    bool getCurrentMechanicalPosition(MechanicalPoint&);
    bool setTargetMechanicalPosition(MechanicalPoint const&);
    bool gotoTargetPosition(MechanicalPoint const&);
protected:
    virtual double getLST();
protected:
    bool isParked();
    void resetSimulation();
protected:
    int sendCmd(char const *);
    int getReply(char *, size_t const);
protected:
    virtual bool checkConnection() override;
    virtual bool updateLocation(double, double, double) override;
    virtual void getBasicData() override;
    virtual bool ReadScopeStatus() override;
    virtual bool initProperties() override;
    virtual bool Goto(double, double) override;
    virtual bool Sync(double, double) override;
    virtual bool Abort() override;
    virtual void setPierSide(TelescopePierSide);
    virtual bool MoveNS(INDI_DIR_NS, TelescopeMotionCommand) override;
private:
    MechanicalPoint currentMechPosition, targetMechPosition;
    double previousRA = {0}, previousDEC = {0};
    ln_lnlat_posn lnobserver { 0, 0 };
    int countdown {0};
    // Movement markers, adjustment is done when no movement is required and all flags are cleared
    bool RAmIncrease {false}, RAmDecrease {false};
    bool DECmIncrease {false}, DECmDecrease {false};
    // Current adjustment rate
    struct _adjustment const * adjustment {nullptr};
    bool _gotoEngaged {false};
    enum TelescopeSlewRate savedSlewRateIndex {SLEW_MAX};
};

#endif // EQ500X_H
