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 void checkError(short rtn, String operation) {
        if (rtn != 0) {
            System.err.printf("错误: %s (代码: %d)\n", operation, rtn);
//            System.exit(1);
        }
    }
    public static void main(String[] args) {

        short rtn;// 指令返回值
        short axisNum = 0;// 轴号，从0开始
        HAND devHandle = new HAND();// 设备句柄
        PHAND pDevHandle = new PHAND();
        HAND axisHandle = new HAND();// 轴句柄
        PHAND pAxisHandle = new PHAND();

        short[] devCount = new short[1];
        TDevInfo[] devInfoList = new TDevInfo[10];
        rtn = NMC_DevSearch(TSearchMode.Ethernet, devCount, devInfoList);
        checkError(rtn,"搜索设备出错");
        rtn = NMC_DevOpen(devInfoList[0].address, pDevHandle);				//打开控制器
        checkError(rtn,"打开控制器出错");
        devHandle = pDevHandle.getHandle();
        rtn = NMC_MtOpen(devHandle, axisNum, pAxisHandle); // 打开轴
        checkError(rtn,"打开轴出错");
        axisHandle = pAxisHandle.getHandle();
        rtn = NMC_MtSetSvOn(axisHandle);//打开轴使能(根据实际情况使用)
        checkError(rtn,"轴使能出错");

        THomeSetting homeSetup = new THomeSetting();			// 回零参数设置(根据自身机构特点配置)
        homeSetup.mode = THomeMode.HM_MODE1;		// 回零模式(HM_MODE1单原点回零)
        homeSetup.dir = 0;				// 搜寻零点方向（必须）, 0:负向,1：正向,其它值无意义
        homeSetup.offset = new NativeLong(0);			// 原点偏移
        homeSetup.scan1stVel = 5;		// 基本搜寻速度
        homeSetup.scan2ndVel = 0;		// 二次回零时使用，低速(建议小于10p/ms)，与参数reScanEn一起使用
        homeSetup.acc = 0.5;			// 加速度
        homeSetup.reScanEn = 0;			// 二次搜寻零点，与参数scan2ndVel一起使用
        homeSetup.homeEdge = 0;			// 原点，触发沿,下降沿
        homeSetup.lmtEdge = 0;			// 限位,触发沿(默认下降沿)
        homeSetup.zEdge = 0;			// Z相位,触发沿(默认下降沿)
        homeSetup.iniRetPos = new NativeLong(0);		// 起始反向运动距离（可选,不用时设为0）
        homeSetup.retSwOffset = new NativeLong(0);		// 反向运动时离开开关距离（可选,不用时设为0）
        homeSetup.safeLen = new NativeLong(0);			// 安全距离,回零时最远搜寻距离（可选,不用时设为0,不限制距离）
        homeSetup.usePreSetPtpPara = 0;	//当usePreSetPtpPara=0时，回零运动的
        //减加速度默认等于acc,起跳速度、终点速度、平滑系数默认为0
        rtn = NMC_MtSetHomePara(axisHandle, homeSetup);	// 设置回零参数
        checkError(rtn,"设置回零参数出错");
        rtn = NMC_MtHome(axisHandle);	// 启动回零
        checkError(rtn,"启动回零出错");
        /****************************** 查询回零过程 ****************************/
        ShortByReference homeSts = new ShortByReference();
        while (true)
        {
            rtn = NMC_MtGetHomeSts(axisHandle, homeSts);	//读取回零状态
            checkError(rtn,"读取回零状态出错");
            if ((homeSts.getValue() & BIT_AXHOME_OK) != 0)
            {
                break;						// 对应轴原点信号被触发，回零完成
            }
            if (((homeSts.getValue() & BIT_AXHOME_FAIL) != 0) || ((homeSts.getValue() & BIT_AXHOME_ERR_MV) != 0) || ((homeSts.getValue() & BIT_AXHOME_ERR_SWT) != 0))
            {
                System.err.printf("回零失败，错误码：%d\n", homeSts.getValue());
                break;
            }
        }
    }
}
