#pragma once
#include <string>

enum AxisType{
    ServoAxis,
    ForcerAxis,
    StepAxis,
    WrongAxis,//错误轴
};

enum CardType {
    GTS = 0,
    LeiSai = 1,
    APS = 2,
    ACS = 3,
};

enum HomeMethod
{
    IO2HOME = 1,
    HOME2HOME = 2,
    INDEX2HOME = 4,
    DIRECT2HOME = 5,
    LEFTLIMITHOME = 6,
    RIGHTLIMITHOME = 7,

};

struct CardData
{
    int m_nBoardIndex;
    CardType m_nCardType;
    int m_nCardIndex;
};

struct AxisData{
    virtual void virtualMark(){};//!<提供用于转换的虚函数表
    
    int m_nID;                   //!<整个控制库中独特的轴编号
    std::string m_sName;              //!<轴名称
    int m_nCardType /*= GTS; */;  //!<卡的类型,固高,雷赛,ACS,
    int m_nCardIndex;                      //!<卡号,属于这种类型的第几张卡
    int m_nAxisIndexInCard;                //!<该轴在卡中的索引

    int m_nAxisNumInCard;        //!<该轴对应卡所含轴的总轴数

//********************************************************************
//UI中不使用
    //int m_nBoardNum;                       //卡号,所有卡的排序;2024/10/28
    int m_nAxisType = ServoAxis;           //轴类型,不从具体表column中读取

    std::string m_sCommAddress;             //通讯地址
    int m_nPort;                            //端口号
    int m_nSerialPort;                      //串口号
    unsigned int m_nBaudRate;               //波特率,需要为无符号整型

    std::string m_sIPLocal;                 //上位机本地IP地址
    std::string m_sIPDriver;             //驱动器IP地址
    int m_nRemotePort;                      //驱动器端口

    int m_nHeadType;                        //?
    int m_nModuleType;                      //模块类型是什么东西?
    int m_nMotorID;                       //卡?
    int m_nTranceducerType;                 //超声类型
//********************************************************************

//General Parameters
    int m_nNegativeLimitSwitch;             //负限位开关(用1和0表示开关)(!!!)

    int m_nNegLimSwIndex;                   //负限位开关io的index
    int m_nNegLimSwLevel;                   //负限位电平(01常开常闭)
    int m_nPositiveLimitSwitch;             //正限位开关,用1和0表示开关
    int m_nPosLimSwIndex;                   //正限位开关io的index
    int m_nPosLimSwLevel;                   //正限位电平(01常开常闭)

    int m_nAbortAtHWLimit;                  //在硬件限位触发时是否中止操作(0,1)
    int m_nHighVoltageMode;                 //是否处于高压模式(0,1)

    //********************************************************************
    //advance parameter 先进参数
    int m_nEncoderFaultIndex;               //编码器故障索引:暂时不需要
    int m_nEncoderFaultBit;                 //编码器故障位:暂时不需要
    int m_nEncoderFaultLevel;               //编码器故障级别:暂时不需要

    double m_fMotorTemperatureGain;         //电机温度增益:暂时不需要
    double m_fMotorTemperatureTimeConstant; //电机温度时间常数:暂时不需要
    double m_fMotorTemperatureLimit;        //电机温度限制:暂时不需要
    int m_nDriveCardType;                   //驱动器类型(控制卡?):暂时不需要
    int m_nDriveCardStatusBitMask;          //驱动器卡状态位掩码:暂时不需要

    double m_fKxab;                         //暂时不需要
    double m_fKyab;                         //暂时不需要
    double m_fKza;                          //暂时不需要
    double m_fKza2;                         //暂时不需要
    double m_fKtv;                          //电压到达时间:暂时不需要

    double m_fKta;                          //电流到达时间:暂时不需要

    //**********************************************************************
    //trackball parameter
    double m_fPositionerRate1;              //定位器比率1:暂时不需要
    double m_fPositionerRate2;              //定位器比率2:暂时不需要
    double m_fPositionerGain1;              //定位器增益1:暂时不需要
    double m_fPositionerGain2;              //定位器增益2:暂时不需要

    double m_fPositionerGain3;              //定位器增益3:暂时不需要

    //**********************************************************************

//other parameters
    double m_fPosScaleFactor;             //位置比例因子:物理单位与脉冲的关系 cnts/um;CntsPerCircle/Pitch
    double m_fSpringCoefficient1 = 0;           //弹簧系数1:暂时不需要
    double m_fSpringCoefficient2 = 0;           //弹簧系数2:暂时不需要
    double m_fSpringCoefficient3 = 0;           //弹簧系数3:暂时不需要

    int m_nUPHEnhance;                      //(!!!)
};

// //控制轴
struct ControlAxisData : AxisData {
//********************************************************************
    //Home Parameter 回零参数
    double m_fPositionTolerance;            //位置公差(相当于已有的误差带ErrBand)
    int m_nHomeSwitch;                      //原点开关!Home开关
    int m_nHomeSwitchIndex;                 //原点开关索引(Home开关对应的索引)
    int m_nHomeSwitchLevel;                 //原点开关电平(Home触发电平,默认应该都是低电平)

    int m_nIndexPulse;                      //索引脉冲(Index)
    int m_nIndexPulseIndex;                 //index脉冲的索引

    int m_nHomingBuffer;                    //轴对应回零程序存储的Buffer号
    int m_nHomingProcId;                    //回零过程id(回零方式)
    int m_nHomingDir1;                      //回零方向1(HomeDir:Home回零方向)
    int m_nHomingDir2;                      //回零方向2(IndexDir:Index回零方向)

    double m_fHomingVel1;                   //回零速度1;(快速回零速度)
    double m_fHomingVel2;                   //回零速度2;(慢速回零速度)
    double m_fHomingAccel;                  //回零加速度
    double m_fHomingDecel;                  //回零减速度
    double m_fHomingOutputLimit;            //回零输出限制:暂时不需要

    double m_fHomingErrThresh;              //回零错误阈值:暂时不需要
    double m_fHomePosition;                 //回零位置
    double m_fInitialPosition;              //初始位置(!!!或许相当于已有的零位偏置)

    //General Parameters 常规参数
    double m_fNegCmdLimit;                  //负命令限位(软限位)
    double m_fPosCmdLimit;                  //正命令限位(软限位)

    double m_fMinimumVelocity;              //最小速度
    double m_fStopDeceleration;             //停止减速度(平滑值)
    double m_fStopDecelerationSD;           //停止减速度(急停)

    int m_nFindLimitsProc;                  //寻找限位过程;(?)
    //****************************************************************************
    //other Parameter
    double m_fMaximumJerk = 0;                  //最大的加加速度(um/s^3)
    double m_fMaximumAcceleration = 0;          //最大加速度(um/s^2)

    double m_fMaximumVelocity = 0;              //最大速度(um/s)
    double m_fEndVelocity = 0;                       //每一段的末端速度(um/s)
    double m_fNegativeLimitMargin;          //负限位外边距(负限位与电机停止位置之间的距离):暂时不需要
    double m_fPositiveLimitMargin;          //正限位外边距:暂时不需要
};


// //力矩轴
struct ForcerAxisData : AxisData {

    int m_nOpenPositionMargin;         //开环位置边距:暂时不需要
    int m_nClosePositionMargin;        //闭环位置边距:暂时不需要
    double m_fOutputScaleFactor;            //输出比例系数:这个目前只在力轴上使用
    double m_fOutputOffset;                 //输出补偿:这个目前只在力轴上使用
    double m_fOutputLimit;                  //输出极限:这个目前只在力轴上使用
    double m_fWireClampForceCoefficient;//线夹力系数
};

// //伺服轴
struct ServoAxisData : ControlAxisData {

    double m_fSafetyModeGain;           //安全模式增益
    double m_fErrorThreshold;           //误差阈值

    int m_nErrThreshCount;             //错误触发计数
    double m_fKa;                       //电流
    double m_fKv;                       //电压
    double m_fKp;                       //比例调节系数
    double m_fKi;                       //积分调节系数

    double m_fKd;                       //微分调节系数
    double m_fIntegratorLimit;          //积分器限制
    double m_fForceOffset;              //力补偿
    double m_fForceScaleFactor;         //力标度系数
    double m_fStaticFriction;           //静摩檫力:暂时不需要

    double m_fDynamicFrictionCoefficient;//动摩擦系数:暂时不需要
    double m_fInertia;                  //惯性,测试,后删:暂时不需要
    double m_fPidOutputErrorThreshold;  //pid输出错误阈值
    double m_fKip;                      //电流调节器的比例系数
    double m_fKii;                      //电流调节器的积分系数

    int m_nECPR;                        //电子齿轮比
    int m_nQuadDiv;                     //四阶分频;:暂时不需要
    double m_fEpdOnTime;                //使能时间:暂时不需要
    double m_fEpdOffTime;               //关闭时间:暂时不需要
    double m_fEpdCurrent;               //电流:暂时不需要

    double m_fEpdPeak;                  //峰值:暂时不需要
    double m_fDriveAngleCalibCurrent;   //驱动角校准电流:暂时不需要
    double m_fDriveAngleCalibPos;       //驱动角校准位置:暂时不需要
    double m_fDriveAngleCalibAngle;     //驱动角校准角度:暂时不需要
    double m_fDriveAngleAtHome;         //原点时的驱动角度:暂时不需要

    int m_nDriveAngleCalibCycles;      //驱动角校准周期:暂时不需要
    double m_fJerkFeedForward;          //加加速前馈
    double m_fIntegratorSwitchVelocity; //积分开关速度
    double m_fBaseMass;                 //基础质量(负载质量)
    double m_fForceConstant;            //力常数

    double m_fOutputLimitGain;          //输出限制增益
};

//步进轴
struct StepAxisData :ControlAxisData {
    //*******************************************************************
    //other parameter
    double m_fHoldCurrent;              //保持电流
    double m_fRunCurrent;               //运行电流
    double m_fSettlingTime;             //稳定时间
    int m_nErrorCorrectionMode;        //误差修正模型:暂时不需要
};