跳到主要内容

事件

通过 device.events() 订阅运行态事件。​

自动日志

每个事件触发时都会再打 addLoggedListener(等级跟随源事件),无论是否另订了对应事件。绑 addLoggedListener 即可收到中文消息。

先订阅,再读运行态,才会比对变化并回调。第一次只记当前状态,不发事件。

功能概览​

类别事件说明自动日志
连接device.events().addConnectedChangedListener与 IO 控制器的周期交换通断✓
运行态device.events().addStateChangedListener运行态变化✓
运行错误device.events().addErrorOccurredListener运行错误✓
日志device.events().addLoggedListener上面每条事件都会再打这条—

连接​

addConnectedChangedListener​

public void addConnectedChangedListener(Consumer<ConnectedChanged> listener)

周期数据交换通断时触发(connected() == false 且 everConnected() == true = 掉线;everConnected() == false = 从未连上)。

回调参数:

public static final class ConnectedChanged {
public boolean connected() { } // 当前是否在换周期数据
public boolean everConnected() { } // 是否曾经连上过
public PnSEventLevel level() { } // 连接 = Info;掉线 / 从未连上 = Warn
}

示例:

device.events().addConnectedChangedListener(e -> {
if (!e.connected() && e.everConnected())
System.out.println("掉线");
});

运行态​

addStateChangedListener​

public void addStateChangedListener(Consumer<StateChanged> listener)

运行态变化时触发(SDK 只观测,不主动切状态)。

回调参数:

public static final class StateChanged {
public PnSState oldState() { } // 变化前,见 [PnSState](./api#pnsstate)
public PnSState newState() { } // 变化后
public PnSEventLevel level() { } // Info
}

示例:

device.events().addStateChangedListener(e ->
System.out.println(e.oldState() + " → " + e.newState()));

addErrorOccurredListener​

public void addErrorOccurredListener(Consumer<ErrorOccurred> listener)

运行错误出现时触发;e.errorCode() 是 int 原值,枚举形态请用 device.errorCodeEnum()。

回调参数:

public static final class ErrorOccurred {
public int errorCode() { } // 运行错误原值(不是枚举)
public String message() { } // 中文消息。缺失为空串
public PnSEventLevel level() { } // Warn
}

示例:

device.events().addErrorOccurredListener(e ->
System.out.println(e.errorCode() + ": " + e.message()));

日志​

addLoggedListener​

public void addLoggedListener(BiConsumer<PnSEventLevel, String> listener)

每个事件触发时都会再打这条,等级跟随源事件。

回调参数:

  • level (PnSEventLevel) — 日志级别
  • message (String) — 日志正文
PnSEventLevel

日志级别。取值见 枚举参考。

示例:

device.events().addLoggedListener((level, message) ->
System.out.println("[" + level + "] " + message));

线程安全​

事件回调不在 UI 线程上触发。更新界面时需要线程同步:

// Swing
device.events().addConnectedChangedListener(e ->
SwingUtilities.invokeLater(() ->
labelStatus.setText(e.connected() ? "已连接" : "未连接")));

// JavaFX
device.events().addConnectedChangedListener(e ->
Platform.runLater(() ->
statusText.set(e.connected() ? "已连接" : "未连接")));