#!D:\IDE\Anaconda3\envs\Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
 @Author: Administrator
 @FileName: HitbotLevel.py
 @DateTime: 2025/4/8 20:58
 @SoftWare: PyCharm
 @Author  ：xsh
"""
HitBot_DLL_Warning: int = -1
HitBot_DLL_Error  : int = -1
class HitbotLevel(int):
    Hitbot400 = 1
    Hitbot320 = 5

class HitbotAxisZLength(int):
    Max180  = 180
    Max210  = 210
class HitbotInitStatus(int):
    Disconnected            = 0             # 机械臂不在线
    HitbotSucceed           = 1             # 初始化成功
    HitbotLevelError        = 2             # 参数错误
    HitbotPositionRange     = 3             # 机械臂当前位置不在限定范围 ，可以使关节强制回零
    HitbotParameterError    = 12            # z_travel 传参错误
    HitbotCardNumberError   = 101           # 传入参数 NOT A NUMBER
    HitbotJointError        = 105           # 存在某一个关节失效
    HitbotOther             = 10000         # pid 自检异常
    @staticmethod
    def toList() -> list[int]:
        return [
            HitbotInitStatus.Disconnected            ,
            HitbotInitStatus.HitbotSucceed           ,
            HitbotInitStatus.HitbotLevelError        ,
            HitbotInitStatus.HitbotPositionRange     ,
            HitbotInitStatus.HitbotParameterError    ,
            HitbotInitStatus.HitbotCardNumberError   ,
            HitbotInitStatus.HitbotJointError        ,
            HitbotInitStatus.HitbotOther             ,
        ]

    @staticmethod
    def exists(value: int) -> bool:
        return HitbotInitStatus.toList().index(value) >= 0

    @staticmethod
    def isPIDWrong(value: int) -> bool:
        return HitbotInitStatus.toList().index(value) < 0 and value >= 10000

class HitBotMoveWarning(int):
    HitBotMoveWarning0   = 0
    HitBotMoveWarning1   = 1
    HitBotMoveWarning2   = 2
    HitBotMoveWarning3   = 3
    HitBotMoveWarning4   = 4
    HitBotMoveWarning6   = 6
    HitBotMoveWarning7   = 7
    HitBotMoveWarning11  = 11
    HitBotMoveWarning99  = 99
    HitBotMoveWarning101 = 101
    HitBotMoveWarning102 = 102
    HitBotMoveWarning103 = 103

    @classmethod
    def toItems(cls) -> dict[object, object]:
        return {
            cls.HitBotMoveWarning0   : '正在执行其他指令，本次指令无效' ,
            cls.HitBotMoveWarning1   : '本次指令生效，机械臂开始运动' ,
            cls.HitBotMoveWarning2   : '设置速度小于等于零' ,
            cls.HitBotMoveWarning3   : '未初始化' ,
            cls.HitBotMoveWarning4   : '过程点无法到达' ,
            cls.HitBotMoveWarning6   : '伺服未开启' ,
            cls.HitBotMoveWarning7   : '存在中间过程点无法以机械臂当前姿态（手系）达到' ,
            cls.HitBotMoveWarning11  : '手机端在控制' ,
            cls.HitBotMoveWarning99  : '急停中' ,
            cls.HitBotMoveWarning101 : '传入参数 NOT A NUMBER' ,
            cls.HitBotMoveWarning102 : '发生碰撞，本次指令无效' ,
            cls.HitBotMoveWarning103 : '轴发生复位，需要重新初始化，本次指令无效' ,
        }

    @classmethod
    def all(cls) -> list[int]:
        return [
            cls.HitBotMoveWarning0  ,
            cls.HitBotMoveWarning1  ,
            cls.HitBotMoveWarning2  ,
            cls.HitBotMoveWarning3  ,
            cls.HitBotMoveWarning4  ,
            cls.HitBotMoveWarning6  ,
            cls.HitBotMoveWarning7  ,
            cls.HitBotMoveWarning11 ,
            cls.HitBotMoveWarning99 ,
            cls.HitBotMoveWarning101,
            cls.HitBotMoveWarning102,
            cls.HitBotMoveWarning103,
        ]

    @classmethod
    def toString(cls, value: int) -> str:
        return cls.toItems().get(value, '')

class HitBotMoveType(int):
    JMove_XYZR_G        = 0
    JMove_G_XYZR        = 1
    LMove_XYZR_G        = 2
    LMove_G_XYZR        = 3
    Move_XYZ_RG         = 4
    Move_RG_XYZ         = 5
    Move_XYZ_GR         = 6
    Move_GR_XYZ         = 7
    SingleMove_Axis_G   = 8
    SingleMove_G_Axis   = 9
    Move_GR             = 10
    Move_RG             = 11
    @classmethod
    def toItem(cls) -> dict[str, int]:

        return {
            'JMove_XYZR_G'        : cls.JMove_XYZR_G     ,
            'JMove_G_XYZR'        : cls.JMove_G_XYZR     ,
            'LMove_XYZR_G'        : cls.LMove_XYZR_G     ,
            'LMove_G_XYZR'        : cls.LMove_G_XYZR     ,
            'Move_XYZ_RG'         : cls.Move_XYZ_RG      ,
            'Move_RG_XYZ'         : cls.Move_RG_XYZ      ,
            'Move_XYZ_GR'         : cls.Move_XYZ_GR      ,
            'Move_GR_XYZ'         : cls.Move_GR_XYZ      ,
            'SingleMove_Axis_G'   : cls.SingleMove_Axis_G,
            'SingleMove_G_Axis'   : cls.SingleMove_G_Axis,
            'Move_GR'             : cls.Move_GR          ,
            'Move_RG'             : cls.Move_RG          ,

        }
    @classmethod
    def toList(cls) -> list[int]:
        return [
            cls.JMove_XYZR_G     ,
            cls.JMove_G_XYZR     ,
            cls.LMove_XYZR_G     ,
            cls.LMove_G_XYZR     ,
            cls.Move_XYZ_RG      ,
            cls.Move_RG_XYZ      ,
            cls.Move_XYZ_GR      ,
            cls.Move_GR_XYZ      ,
            cls.SingleMove_Axis_G,
            cls.SingleMove_G_Axis,
            cls.Move_GR          ,
            cls.Move_RG          ,
        ]
    @classmethod
    def toValue(cls, value: str) -> int:
        return cls.toItem().get(value, cls.LMove_XYZR_G)

    @classmethod
    def toString(cls, value: int) -> str:
        buffer: dict[int, str] = {value: key for key, value in cls.toItem().items()}
        return buffer.get(value, 'JMove_XYZR_G')

class JointStatus(int):
    AXIS_RESET          =  0        # 轴发生复位，需要重新初始化
    NORMAL              =  1        # 关节正常　　　　　　　　　
    PARAM_OUT_RANGE     =  2        # 传入参数超范围　　　　　　
    NOT_INITIALIZED     =  3        # 未初始化　　　　　　　　　
    GET_STATUS_FAILED   =  4        # 轴状态获取失败　　　　　　　　
    COLLISION           =  5        # 发生碰撞
    DRAG_MODE           =  6        # 处于拖动模式
    JOINT_FAILED        =  7        # 关节缺轴/失效
    ENCODER_ERROR       =  8        # 编码器错误
    MOTOR_STALL         =  9        # 电机堵转/过电流保护
    OVER_VOLTAGE        =  10       # 过压保护
    PC_ERROR_DATA       =  11       # 手臂收到 PC 发送的错误数据
    COMM_ERROR          =  12       # 手臂主控与驱动通讯异常
    MOS_NTC_OPEN        =  21       # MOS ntc 开路
    MOS_NTC_SHORT       =  22       # MOS ntc 短路
    MOTOR_NTC_OPEN      =  23       # 电机 ntc 开路
    MOTOR_NTC_SHORT     =  24       # 电机 ntc 短路
    MOS_NTC_HIGH        =  25       # MOS ntc 温度过高
    MOS_NTC_LOW         =  26       # MOS ntc 温度过低
    MOTOR_NTC_HIGH      =  27       # 电机 ntc 温度过高
    MOTOR_NTC_LOW       =  28       # 电机 ntc 温度过低

    @classmethod
    def tolist(cls) -> list[int]:
        return [
            JointStatus.AXIS_RESET          ,
            JointStatus.NORMAL              ,
            JointStatus.PARAM_OUT_RANGE     ,
            JointStatus.NOT_INITIALIZED     ,
            JointStatus.GET_STATUS_FAILED   ,
            JointStatus.COLLISION           ,
            JointStatus.DRAG_MODE           ,
            JointStatus.JOINT_FAILED        ,
            JointStatus.ENCODER_ERROR       ,
            JointStatus.MOTOR_STALL         ,
            JointStatus.OVER_VOLTAGE        ,
            JointStatus.PC_ERROR_DATA       ,
            JointStatus.COMM_ERROR          ,
            JointStatus.MOS_NTC_OPEN        ,
            JointStatus.MOS_NTC_SHORT       ,
            JointStatus.MOTOR_NTC_OPEN      ,
            JointStatus.MOTOR_NTC_SHORT     ,
            JointStatus.MOS_NTC_HIGH        ,
            JointStatus.MOS_NTC_LOW         ,
            JointStatus.MOTOR_NTC_HIGH      ,
            JointStatus.MOTOR_NTC_LOW       ,
        ]

    @classmethod
    def toItem(cls) -> dict[int, str]:
        return {
            JointStatus.AXIS_RESET          : '轴发生复位，需要重新初始化　',
            JointStatus.NORMAL              : '关节正常　　　　　　　　　　',
            JointStatus.PARAM_OUT_RANGE     : '传入参数超范围　　　　　　　',
            JointStatus.NOT_INITIALIZED     : '未初始化　　　　　　　　　　',
            JointStatus.GET_STATUS_FAILED   : '轴状态获取失败　　　　　　　',
            JointStatus.COLLISION           : '发生碰撞　　　　　　　　　　',
            JointStatus.DRAG_MODE           : '处于拖动模式　　　　　　　　',
            JointStatus.JOINT_FAILED        : '关节缺轴失效　　　　　　　　',
            JointStatus.ENCODER_ERROR       : '编码器错误　　　　　　　　　',
            JointStatus.MOTOR_STALL         : '电机堵转过电流保护　　　　　',
            JointStatus.OVER_VOLTAGE        : '过压保护　　　　　　　　　　',
            JointStatus.PC_ERROR_DATA       : '手臂收到上位机发送的错误数据',
            JointStatus.COMM_ERROR          : '手臂主控与驱动通讯异常　　　',
            JointStatus.MOS_NTC_OPEN        : 'MOS   ntc 开路　　　　　　',
            JointStatus.MOS_NTC_SHORT       : 'MOS   ntc 短路　　　　　　',
            JointStatus.MOTOR_NTC_OPEN      : 'motor ntc 开路　　　　　　',
            JointStatus.MOTOR_NTC_SHORT     : 'motor ntc 短路　　　　　　',
            JointStatus.MOS_NTC_HIGH        : 'MOS   ntc 温度过高　　　　',
            JointStatus.MOS_NTC_LOW         : 'MOS   ntc 温度过低　　　　',
            JointStatus.MOTOR_NTC_HIGH      : 'motor ntc 温度过高　　　　',
            JointStatus.MOTOR_NTC_LOW       : 'motor ntc 温度过低　　　　',
        }

class JointHomeStatus(int):
    NOT_CONNECTED   = 0                  # 未连接
    SUCCESS         = 1                  # 调用成功
    PARAM_ERROR     = 2                  # 传入参数错误
    INITIALIZING    = 3                  # 机械臂正在初始化

    @classmethod
    def tolist(cls) -> list[int]:
        return [
            cls.NOT_CONNECTED,
            cls.SUCCESS      ,
            cls.PARAM_ERROR  ,
            cls.INITIALIZING ,
        ]

class HitBotMoveStatus(int):
    EXECUTING_OTHER         = 0             # 正在执行其他指令，本次指令无效
    COMMAND_ACTIVE          = 1             # 本次指令生效，机械臂开始运动
    SPEED_INVALID           = 2             # 设置速度小于等于零
    NOT_INITIALIZED         = 3             # 未初始化
    POINT_UNREACHABLE       = 4             # 过程点无法到达
    SERVO_OFF               = 6             # 伺服未开启
    POSTURE_UNREACHABLE     = 7             # 存在中间过程点无法以机械臂当前姿态（手系）达到
    MOBILE_CONTROL          = 11            # 手机端在控制
    EMERGENCY_STOP          = 99            # 急停中
    PARAM_NAN               = 101           # 传入参数 NOT A NUMBER
    COLLISION_INVALID       = 102           # 发生碰撞，本次指令无效
    AXIS_RESET_INVALID      = 103           # 轴发生复位，需要重新初始化，本次指令无效
    @classmethod
    def tolist(cls) -> list[int]:
        return [
            cls.EXECUTING_OTHER         ,
            cls.COMMAND_ACTIVE          ,
            cls.SPEED_INVALID           ,
            cls.NOT_INITIALIZED         ,
            cls.POINT_UNREACHABLE       ,
            cls.SERVO_OFF               ,
            cls.POSTURE_UNREACHABLE     ,
            cls.MOBILE_CONTROL          ,
            cls.EMERGENCY_STOP          ,
            cls.PARAM_NAN               ,
            cls.COLLISION_INVALID       ,
            cls.AXIS_RESET_INVALID      ,
        ]

class GripperLevel(int):
    EFG_8   = 8,
    EFG_20  = 20

