#pragma once

#include <mutex>
#include "JAxis.h"

#include <vector>
//#include "config.h"
//#include "LookAheadEx.h"
//#include "src/Common/JFile.h"
//#include "3rd/json/json.h"

struct CoordPara
{
    int m_nCoordNo;  //坐标系号
    std::string m_sCoordName;//坐标系名称
    int m_nCardType; //卡的类型
    int m_nCardIndex; //卡号
    std::string stAxisName[4]={};//坐标系中各轴名
    double dMaxCoordVel;
    double dMaxCoordAcc;
    bool bAxisLimitMode = true;
    double dJerkCoef = 0;
    double dJerkTime = 5;
    double dRadiusRatio = 50;
    double dLookAheadTime = 0.01;

};
enum enum_Coord_Axis
{
    enum_CoordX = 0,
    enum_CoordY,
    enum_CoordZ,
    enum_CoordR
};

//坐标系运动的基类,不同的控制卡都是继承于该基类
class ICoord
{
public:
    //2024/10/10 19:18添加,解决ICoord不存在默认构造函数的问题(在GTSCoord.cpp中)
    ICoord() {};

    virtual bool InitCoord(/*const std::map<std::string,int> &mpInit,*/HANDLE hCtrlComm) = 0;
    virtual void SetCrdPrm(CoordPara& stCoordPara)
    {
        m_stCrdPara = stCoordPara;
    }
    virtual CoordPara GetCrdPara()
    {
        return m_stCrdPara;
    }
    virtual int GetAxisNum()
    {
        return m_nAxisNum;
    }

    //ICoord(int crdNo, JAxis* x, JAxis* y, JAxis* z, JAxis* r) {};
    //析构缺实现
    virtual ~ICoord() {};

    //! 使能坐标系运动,
    virtual int SetToCrdMode() = 0;//double dRadiusRatio) = 0;
    //关闭插补模式
    virtual int SetToPTPMode() = 0;
    //! 停止坐标系运动
    virtual int StopAll() = 0;
    //开始坐标系运动
    virtual int CrdStart() = 0;

    virtual int CrdClear() = 0;

    virtual int SetCrdJerk(double dJerk/*, double dJerkCoef*/) = 0;

    //XY/XYZ/XYZR直线运动
    //指定同步速度,加速度,加加速度
    virtual int LnXY(double dX, double dY, double dSynVel, double dSynAcc,
                       double dSynJerk, double dEndVel = 0) = 0;
    virtual int LnXYG0(double dX, double y, double dSynVel, double dSynAcc,
                         double dSynJerk) = 0;
    virtual int LnXYZ(double dX, double dY, double dZ, double dSynVel, double dSynAcc,
                        double dSynJerk, double dEndVel = 0) = 0;
    virtual int LnXYZG0(double dX, double dY, double dZ, double dSynVel, double dSynAcc,double dSynJerk) = 0;
    virtual int LnXYZR(double dX, double dY, double dZ, double dR,double dSynVel,
                         double dSynAcc,double dSynJerk,double dEndVel = 0) = 0;
    virtual int LnXYZRG0(double dX, double dY, double dZ, double dR,double dSynVel,
                         double dSynAcc,double dSynJerk) = 0;


    //指定速度比例
    virtual int LnXY(double dX, double dY, double dVelRatio = 1.0) = 0;
    virtual int LnXYG0(double dX, double dY, double dVelRatio = 1.0) = 0;
    virtual int LnXYZ(double dX, double dY, double dZ, double dVelRatio = 1.0) = 0;
    virtual int LnXYZG0(double dX, double dY, double dZ, double dVelRatio = 1.0) = 0;
    virtual int LnXYZR(double dX, double dY, double dZ, double dR, double dVelRatio = 1.0) = 0;
    virtual int LnXYZRG0(double dX, double dY, double dZ, double dR, double dVelRatio = 1.0) = 0;
    //XY圆弧运动
    //指定同步速度,加速度,加加速度
    virtual int ArcXYC(double dXCenter, double dYCenter, double dXEnd, double dYEnd,
                         double dSynVel, double dSynAcc, double dSynJerk, double dEndVel = 0) = 0;
    virtual int ArcXYCGO(double dXCenter, double dYCenter, double dXEnd, double dYEnd,
                           double dsynVel, double dSynAcc, double dSynJerk) = 0;
    virtual int ArcXY(double dXStart, double dYStart, double dXEnd, double dYEnd,
                        double dSynVel, double dSynAcc, double dSynJerk, double dEndVel = 0) = 0;
    virtual int ArcXYG0(double dXStart, double dYStart, double dXEnd, double dYEnd,
                          double dSynVel, double dSynAcc, double dSynJerk) = 0;
    //指定速度比例
    virtual int ArcXYC(double dXCenter, double dYCenter, double dXEnd, double dYEnd,
                         double dVelRatio = 1.0) = 0;
    virtual int ArcXYCGO(double dXCenter, double dYCenter, double dXEnd, double dYEnd,
                           double dVelRatio = 1.0) = 0;
    virtual int ArcXY(double dXStart, double dYStart, double dXEnd, double dYEnd,
                        double dVelRatio = 1.0) = 0;
    virtual int ArcXYG0(double dXStart, double dYStart, double dXEnd, double dYEnd,
                        double dVelRatio = 1.0) = 0;
    //XYZ圆弧运动
    //指定同步速度,加速度,加加速度
    virtual int ArcXYZC(double dXCenter, double dYCenter, double dZCenter, double dXEnd,
                          double dYEnd, double dZEnd,  double dSynVel, double dSynAcc, double dSynJerk, double dEndVel = 0) = 0;
    virtual int ArcXYZCGO(double dXCenter, double dYCenter, double dZCenter, double dXEnd,
                            double dYEnd, double dZEnd,  double dSynVel, double dSynAcc, double dSynJerk) = 0;
    virtual int ArcXYZ(double dXStart, double dYStart, double dZStart, double dXEnd,
                         double dYEnd, double dZEnd,  double dSynVel, double dSynAcc, double dSynJerk, double dEndVel = 0) = 0;
    virtual int ArcXYZG0(double dXStart, double dYStart, double dZStart, double dXEnd,
                           double dYEnd, double dZEnd,  double dSynVel, double dSynAcc, double dSynJerk) = 0;
    //指定速度比例
    virtual int ArcXYZC(double dXCenter, double dYCenter, double dZCenter, double dXEnd,
                          double dYEnd, double dZEnd,  double dVelRatio = 1.0) = 0;
    virtual int ArcXYZCGO(double dXCenter, double dYCenter, double dZCenter, double dXEnd,
                            double dYEnd, double dZEnd,  double dVelRatio = 1.0) = 0;
    virtual int ArcXYZ(double dXStart, double dYStart, double dZStart, double dXEnd,
                         double dYEnd, double dZEnd,  double dVelRatio = 1.0) = 0;
    virtual int ArcXYZG0(double dXStart, double dYStart, double dZStart, double dXEnd,
                           double dYEnd, double dZEnd,  double dVelRatio = 1.0) = 0;

    //缓冲区延时
    virtual int BufDelay(int nTimeMs) = 0;

    //缓冲区移动
    virtual int BufMove(int nAxis, double dPos, double dVel, double dAcc, double dJerk, bool bWaitMove) = 0;
    //缓冲区电子齿轮移动
    virtual int BufGear(int nAxis, double dStartPos, double dMoveDist) = 0;
    //缓冲区IO动作
    virtual int BufDO(unsigned short doMask, unsigned short doValue) = 0;
    //缓冲区DA输出
    virtual int BufDA(short channel,short daValue) = 0;


    //对于错误码返回值的解释
    virtual std::string ErrCodeTransfer(int nRtn){return "";};

    //! 查看坐标系运动是否在运动
    virtual bool IsCrdMoving() = 0;

    virtual bool InICoordMode()
    {
        return m_bIsCrdMode;
    };
public:
    JAxis* m_jAxis[4] = {nullptr};
protected:
    //验证参考系内所有轴是否在软限位内
    virtual int CheckRange(std::vector<double> vAxisPos) = 0;
protected:

    bool m_bIsCrdMode = 0;
    int m_nSegNum = 0;

    CoordPara m_stCrdPara;
    int m_nAxisNum = 0;
    std::mutex  m_mutex;    //定义一个互斥锁变量
};