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.*;
import com.sun.jna.NativeLong;

public class Main {
    // 错误处理工具类
    private static class ErrorHandler {
        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 {
            // 使用设备0
            short devNum = 0;
            short[] axisNums = {0, 1}; // 使用轴0和轴1
            
            // 设备句柄
            PHAND pDevHandle = new PHAND();
            //打开控制器
            short rtn = NMC_DevOpen(devNum, pDevHandle);
            ErrorHandler.checkError(rtn);
            System.out.println("打开设备 - 成功");

            // 打开两个轴
            HAND devHandle = pDevHandle.getHandle();
            HAND[] axisHandles = new HAND[2];
            for (short i = 0; i < 2; i++) {
                // 轴句柄
                PHAND pAxisHandle = new PHAND();
                //打开轴,并获得轴句柄
                rtn = NMC_MtOpen(devHandle, axisNums[i], pAxisHandle);
                ErrorHandler.checkError(rtn);
                System.out.printf("打开轴%d - 成功\n", axisNums[i]);
                axisHandles[i] = pAxisHandle.getHandle();
                
                //打开轴使能(根据实际情况使用)
                rtn = NMC_MtSetSvOn(axisHandles[i]);
                ErrorHandler.checkError(rtn);
                System.out.printf("轴%d伺服使能 - 成功\n", axisNums[i]);
            }

            //设置轴1的运动模式为电子齿轮模式(轴1为主轴，轴0为从轴)
            rtn = NMC_MtSetPrfMode(axisHandles[0], MT_GEAR_PRF_MODE);
            ErrorHandler.checkError(rtn);
            System.out.println("设置轴1为电子齿轮模式 - 成功");
            
            //设置Gear跟随方向
            rtn = NMC_MtGearSetDir(axisHandles[0], (short)0);
            ErrorHandler.checkError(rtn);
            System.out.println("设置电子齿轮方向 - 成功");
            
            //设置主轴1规划器
            rtn = NMC_MtGearSetMaster(axisHandles[0], (short)1, (short)1);
            ErrorHandler.checkError(rtn);
            System.out.println("设置轴1跟随轴0 - 成功");
            
            //设置传动比5:4和离合区（修正参数类型）
            rtn = NMC_MtGearSetRatio(axisHandles[0], new NativeLong(5),  new NativeLong(4), new NativeLong(2000));
            ErrorHandler.checkError(rtn);
            System.out.println("设置齿轮比5:4 - 成功");
            
            //启动电子齿轮运动
            short[] syncAxArray = new short[0]; 
            rtn = NMC_MtGearStartMtn(axisHandles[0], (short)0, syncAxArray);
            ErrorHandler.checkError(rtn);
            System.out.println("启动电子齿轮运动 - 成功");
            
            // 等待1秒让运动开始
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("等待被中断");
            }            
        } catch (Exception e) {
            System.err.println("测试过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 确保资源被释放
            System.out.println("\n释放资源...");
        }
        
        System.out.println("电子齿轮运动测试完成");
    }
}