using System;
using System.Collections.Generic;
//using System.Numerics;
using System.Text;
using System.Runtime.InteropServices;


namespace BPASmartClient.JakaRobot
{

    public class JKTYPE
    {
        /**
        * @brief 笛卡尔空间位置数据类型
        */
        [StructLayout(LayoutKind.Sequential)]
        public struct CartesianTran
        {

            public double x;       ///< x轴坐标，单位mm
			public double y;       ///< y轴坐标，单位mm
			public double z;       ///< z轴坐标，单位mm
		};

        /**
		* @brief 欧拉角姿态数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct Rpy
        {
            public double rx;      ///< 绕固定轴X旋转角度，单位：rad
			public double ry;	   ///< 绕固定轴Y旋转角度，单位：rad
			public double rz;      ///< 绕固定轴Z旋转角度，单位：rad
		};

        /**
		* @brief 四元数姿态数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct Quaternion
        {
            public double s;
            public double x;
            public double y;
            public double z;
        };

        /**
		*@brief 笛卡尔空间位姿类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct CartesianPose
        {
            public CartesianTran tran;     ///< 笛卡尔空间位置
			public Rpy rpy;                ///< 笛卡尔空间姿态
		};

        /**
		* @brief 旋转矩阵数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct RotMatrix
        {
            public CartesianTran x;        ///< x轴列分量
			public CartesianTran y;		   ///< y轴列分量
			public CartesianTran z;        ///< z轴列分量
		};

        /**
		* @brief 程序运行状态枚举类型
		*/
        public enum ProgramState
        {
            PROGRAM_IDLE,					///< 机器人停止运行
			PROGRAM_RUNNING,				///< 机器人正在运行
			PROGRAM_PAUSED					///< 机器人暂停	
		};

        /**
		* @brief 坐标系选择枚举类型
		*/
        public enum CoordType
        {
            COORD_BASE,						///< 基坐标系
			COORD_JOINT,					///< 关节空间
			COORD_TOOL						///< 工具坐标系
		};

        /**
		* @brief jog运动模式枚举
		*/
        public enum MoveMode
        {
            ABS = 0,						///< 绝对运动
			INCR							///< 增量运动
		};

        /**
		* @brief 系统监测数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct SystemMonitorData
        {
            public int scbMajorVersion;											///<scb主版本号
			public int scbMinorVersion;											///<scb次版本号
			public int cabTemperature;											///<控制柜温度	
			public double robotAveragePower;									///<控制柜总线平均功率
			public double robotAverageCurrent;									///<控制柜总线平均电流
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] instCurrent;										///<机器人6个轴的瞬时电流
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] instVoltage;										///<机器人6个轴的瞬时电压
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] instTemperature;									///<机器人6个轴的瞬时温度
		};

        /**
		* @brief 负载数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct PayLoad
        {
            public double mass;													///<负载质量，单位：kg
			public CartesianTran centroid;										///<负载质心, 单位：mm
		};

        /**
		* @brief 关节位置数据类型
		*/
        public struct JointValue
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] jVal;												///< 6关节位置值，单位：rad	
		};

        /**
		* @brief IO类型枚举
		*/
        public enum IOType
        {
            IO_CABINET,     ///< 控制柜面板IO
			IO_TOOL,        ///< 工具IO
			IO_EXTEND       ///< 扩展IO
		};

        /**
		* @brief 机器人状态数据
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct RobotState
        {
            public int estoped;			///< 是否急停
			public int poweredOn;		///< 是否打开电源
			public int servoEnabled;    ///< 是否使能
		};

        /**
		* @brief 机器人力矩数据
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct TorqueValue
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] jTorque;    ///< 是否使能
		}

        /**
		* @brief 机器人关节监测数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct JointMonitorData
        {
            double instCurrent;         ///< 瞬时电流
			double instVoltage;         ///< 瞬时电压
			double instTemperature;     ///< 瞬时温度
		}


        /**
		* @brief 机器人监测数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct RobotMonitorData
        {
            double scbMajorVersion;								///< scb主版本号
			double scbMinorVersion;								///< scb小版本号
			double cabTemperature;								///< 控制器温度
			double robotAveragePower;							///< 机器人平均电压
			double robotAverageCurrent;							///< 机器人平均电流
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public JointMonitorData[] jointMonitorData;			///< 机器人6个关节的监测数据
		}

        /**
		* @brief 力矩传感器监测数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct TorqSensorMonitorData
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public char[] ip;									///< 力矩传感器ip地址
			int port;											///< 力矩传感器端口号
			PayLoad payLoad;									///< 工具负载
			int status;											///< 力矩传感器状态
			int errcode;										///< 力矩传感器异常错误码
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] actTorque;							///< 力矩传感器实际接触力值
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] torque;								///< 力矩传感器原始读数值
		}

        /**
		* @brief 机器人状态监测数据,使用get_robot_status函数更新机器人状态数据
		*/

        [StructLayout(LayoutKind.Sequential)]
        public struct RobotStatus
        {
            public int errcode;												///< 机器人运行出错时错误编号，0为运行正常，其它为运行异常
			public int inpos;												///< 机器人运动是否到位标志，0为没有到位，1为运动到位
			public int powered_on;											///< 机器人是否上电标志，0为没有上电，1为上电
			public int enabled;												///< 机器人是否使能标志，0为没有使能，1为使能
			public double rapidrate;										///< 机器人运动倍率
			public int protective_stop;										///< 机器人是否检测到碰撞，0为没有检测到碰撞，1为检测到碰撞
			public int emergency_stop;										///< 机器人是否急停，0为没有急停，1为急停
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65)]
            public int[] dout;												///< 机器人控制柜数字输出信号,dout[0]为信号的个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public int[] tio_dout;											///< 机器人末端工具数字输出信号,tio_dout[0]为信号的个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65)]
            public int[] extio;												///< 机器人外部应用数字输出信号,extio[0]为信号的个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65)]
            public int[] din;												///< 机器人控制柜数字输入信号,din[0]为信号的个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public int[] tio_din;											///< 机器人末端工具数字输入信号,tio_din[0]为信号的个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65)]
            public double[] ain;											///< 机器人控制柜模拟输入信号,ain[0]为信号的个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public double[] tio_ain;										 ///< 机器人末端工具模拟输入信号,tio_ain[0]为信号的个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 65)]
            public double[] aout;											///< 机器人控制柜模拟输出信号,aout[0]为信号的个数
			public int current_tool_id;										///< 机器人目前使用的工具坐标系id
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] cartesiantran_position;							///< 机器人末端所在的笛卡尔空间位置
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public double[] joint_position;									///< 机器人关节空间位置
			public int on_soft_limit;										///< 机器人是否处于限位，0为没有触发限位保护，1为触发限位保护
			public int current_user_id;										///< 机器人目前使用的用户坐标系id
			public int drag_status;											///< 机器人是否处于拖拽状态，0为没有处于拖拽状态，1为处于拖拽状态
			public RobotMonitorData robot_monitor_data;                     ///< 机器人状态监测数据
			public TorqSensorMonitorData torq_sensor_monitor_data;          ///< 机器人力矩传感器状态监测数据
			int is_socket_connect;											///< sdk与控制器连接通道是否正常，0为连接通道异常，1为连接通道正常
		}


        /**
		* @brief 机器人错误码数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct ErrorCode
        {
            public long code;                                   ///< 错误码编号
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 120)]
            public char[] message;								///< 错误码对应提示信息
		}

        /**
		* @brief 轨迹复现配置参数数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct TrajTrackPara
        {
            public double xyz_interval;                         ///< 空间位置采集精度
			public double rpy_interval;                         ///< 姿态采集精度
			public double vel;                                  ///< 执行脚本运行速度
			public double acc;                                  ///< 执行脚本运行加速度
		}

        /**
		* @brief 多个字符串存储数据类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct MultStrStorType
        {
            public int len;										///< 字符串个数
			[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128 * 128)]
            public char[] message;                              ///< 错误码对应提示信息
		}

        /**
		* @brief 运动参数可选项
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct OptionalCond
        {
            int executingLineId;                                ///< 控制命令id编号
		}

        /**
		* @brief 网络异常机器人运动自动终止类型枚举
		*/
        public enum ProcessType
        {
            MOT_KEEP,  ///< 网络异常时机器人继续保持原来的运动
			MOT_PAUSE, ///< 网络异常时机器人暂停运动
			MOT_ABORT  ///< 网络异常时机器人终止运动
		}

        /**
		* @brief 柔顺控制参数类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct AdmitCtrlType
        {
            int opt;             ///< 柔顺方向，可选值为 1 2 3 4 5 6分别对应 fx fy fz mx my mz,0代表没有勾选
			double ft_user;      ///< 用户用多大的力才能让机器人的沿着某个方向以最大速度进行运动
			double ft_rebound;   ///< 回弹力:机器人回到初始状态的能力
			double ft_constant;  ///< 恒力
			int ft_normal_track; ///< 法向跟踪是否开启，0为没有开启，1为开启
		}

        /**
		* @brief 机器人柔顺控制参数类型
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct RobotAdmitCtrl
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public AdmitCtrlType[] admit_ctrl;
        }

        /**
		* @brief 速度柔顺控制等级和比率等级设置
		* 速度柔顺控制分三个等级，并且  1>rate1>rate2>rate3>rate4>0
		* 等级为1时，只能设置rate1,rate2两个等级。rate3,rate4的值为0
		* 等级为2时，只能设置rate1,rate2，rate3 三个等级。rate4的值为0
		* 等级为3时，能设置 rate1,rate2，rate3,rate4 4个等级
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct VelCom
        {
            int vc_level;                                         //速度柔顺控制等级
            double rate1;                                         //比率1等级
            double rate2;                                         //比率2等级
            double rate3;                                         //比率3等级
            double rate4;                                         //比率4等级
        }

        /**
		* @brief 力传感器的受力分量和力矩分量
		*/
        [StructLayout(LayoutKind.Sequential)]
        public struct FTxyz
        {
            double fx;                                           // 沿x轴受力分量
            double fy;                                           // 沿y轴受力分量
            double fz;                                           // 沿z轴受力分量
            double tx;                                           // 绕x轴力矩分量
            double ty;                                           // 绕y轴力矩分量
            double tz;                                           // 绕z轴力矩分量
        }

    }
}
