import static lib.mtn_lib20.*;
import static lib.mtn_lib20_com.*;
import static lib.mtn_lib20_ext.*;
import static lib.mtn_lib20_oem.*;
import static lib.mtn_lib20_err.*;
import com.sun.jna.*;
import com.sun.jna.ptr.*;

public class Main {
    static {
        String libPath = System.getProperty("user.dir") + "\\lib";
        System.setProperty("java.library.path", libPath);
        System.load(libPath + "\\msvcr100.dll");
        System.load(libPath + "\\msvcp100.dll");
        System.load(libPath + "\\nmc_lib20.dll");
    }
    // 错误处理工具类
    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 {
            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.printf("打开轴%d - 成功\n", axisNum);
            HAND axisHandle = pAxisHandle.getHandle();

            // 打开轴使能(根据实际情况使用)
            rtn = NMC_MtSetSvOn(axisHandle);
            ErrorHandler.checkError(rtn);
            System.out.printf("轴%d伺服使能 - 成功\n", axisNum);

            // 先关闭所有手脉
            rtn = NMC_ClrHandWheel(devHandle);
            ErrorHandler.checkError(rtn);
            System.out.println("清除手轮设置 - 成功");

            // 选择主轴为辅助编码器通道
            rtn = NMC_SetHandWheelInput(devHandle, (short)256);
            ErrorHandler.checkError(rtn);
            System.out.println("设置手轮输入通道 - 成功");

            // 设置手轮参数
            // 参数说明: 设备句柄, 手轮模式(0-位置模式), 速度(pulse/ms), 加速度(pulse/ms^2), 减速度(pulse/ms^2)
            rtn = NMC_SetHandWheel(devHandle, (short)0, 5, 1, 10);
            ErrorHandler.checkError(rtn);
            System.out.println("设置手轮参数 - 成功");

            // 设置手轮跟随倍率，启动后可以随时更改倍率
            // rtn = NMC_SetHandWheelRatio(devHandle, radio);
            // ErrorHandler.checkError(rtn);
            // System.out.println("设置手轮比率 - 成功");

            System.out.println("手脉运动功能已成功配置");
            
        } catch (Exception e) {
            System.err.println("测试过程中发生错误: " + e.getMessage());
            e.printStackTrace();
        } finally {
            System.out.println("\n释放资源...");
            // 实际应用中需要添加关闭轴和设备的代码
            // NMC_MtClose(pAxisHandle.getHandle());
            // NMC_DevClose(pDevHandle.getHandle());
        }
        
        System.out.println("手脉运动功能测试完成");
    }
}