package com.example;

import static com.example.mtnlib.nmc_lib20.*;
import static com.example.mtnlib.nmc_lib20_ext.*;
import static com.example.mtnlib.nmc_lib20_oem.*;
import static com.example.mtnlib.nmc_lib20_err.*;
import com.example.mtnlib.nmc_lib20_com.*;
import com.sun.jna.ptr.*;

public class Main {
    // 错误处理工具类
    private static class ErrorHandler {
        /**
         * 检查返回值并处理错误
         * @param rtn 函数返回值
         * @throws RuntimeException 如果返回值不是0(成功)
         */
        public static void checkError(short rtn) {
            if (rtn != 0) {
                throw new RuntimeException(String.format("操作失败，错误代码: %d", rtn));
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("二维位置补偿功能测试开始...");

        try {
            short devNum = 0;               // 设备序号，从0开始
            short axisNum = 0;              // 轴号，从0开始
            PHAND pDevHandle = new PHAND(); // 设备句柄
            PHAND pAxisHandle = new PHAND(); // 轴句柄
            
            // 打开设备
            short rtn = NMC_DevOpen(devNum, pDevHandle);
            ErrorHandler.checkError(rtn);
            System.out.println("打开设备 - 成功");
            
            HAND devHandle = pDevHandle.getHandle();

            //打开轴,并获得轴句柄
            rtn = NMC_MtOpen(devHandle, axisNum, pAxisHandle);
            ErrorHandler.checkError(rtn);
            System.out.println("打开轴 - 成功");
            
            HAND axisHandle = pAxisHandle.getHandle();
            
            //打开轴使能(根据实际情况使用)
            rtn = NMC_MtSetSvOn(axisHandle);
            ErrorHandler.checkError(rtn);
            System.out.println("轴伺服使能 - 成功");
            
            // 设置2D补偿表
            T2DCompensationTable t2DCompensationTable = new T2DCompensationTable();
            t2DCompensationTable.angle = 20;          //标定坐标系与机械坐标系的夹角，单位：度
            t2DCompensationTable.count[0] = 3;          // X方向的数据点数
            t2DCompensationTable.count[1] = 4;          // Y方向的数据点数
            t2DCompensationTable.posBegin[0] = 0;       // X方向的起始补偿位置
            t2DCompensationTable.posBegin[1] = 0;       // Y方向的起始补偿位置
            t2DCompensationTable.step[0] = 3000;        // 为X方向的补偿步长
            t2DCompensationTable.step[1] = 4000;        // 为Y方向的补偿步长
            
            // 设置补偿数据
            TCompData tCompData = new TCompData();
            tCompData.xDirComp = 10;                    // X方向补偿值
            tCompData.yDirComp = 20;                    // Y方向补偿值
            tCompData.zDirComp = 0;                     // Z方向补偿值
            
            // 应用2D补偿表
            rtn = NMC_Set2DCompensationTable(devHandle, (short)0, t2DCompensationTable, tCompData);
            ErrorHandler.checkError(rtn);
            System.out.println("设置2D补偿表 - 成功");
            
            // 配置2D补偿参数
            T2DCompensation t2DCompensation = new T2DCompensation();
            t2DCompensation.tableIndex = 0;     // 使用的目录表：取值0
            t2DCompensation.axisType[0] = 1;    // 0表示规划，1表示编码器；axisType[0]对应X方向类型
            t2DCompensation.axisType[1] = 1;    // 0表示规划，1表示编码器；axisType[1]对应Y方向类型
            t2DCompensation.axisIndex[0] = 0;   // axisIndex[0]表示X方向使用的轴号
            t2DCompensation.axisIndex[1] = 1;   // axisIndex[0]表示Y方向使用的轴号
            t2DCompensation.axisIndex[2] = 2;   // axisIndex[0]表示Z方向使用的轴号
            t2DCompensation.enable = 1;         // 启动(1)或停止(0)补偿
            
            // 启用2D补偿
            rtn = NMC_Set2DCompensation(devHandle, t2DCompensation);
            ErrorHandler.checkError(rtn);
            System.out.println("启用2D补偿 - 成功");
            
            // 等待2秒让补偿生效
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                System.out.println("等待被中断");
            }
            
        } catch (Exception e) {
            System.err.println("测试过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 确保资源被释放
            System.out.println("\n释放资源...");
        }
        
        System.out.println("二维位置补偿功能测试完成");
    }
}