package com.zy.core.network; import com.zy.asrs.entity.DeviceConfig; import com.zy.core.ThreadHandler; import com.zy.core.model.CommandResponse; import com.zy.core.model.command.DualCrnCommand; import com.zy.core.network.api.ZyDualCrnConnectApi; import com.zy.core.network.entity.ZyDualCrnStatusEntity; import com.zy.core.network.fake.ZyDualCrnFakeConnect; import com.zy.core.network.real.ZyDualCrnRealConnect; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; /** * 连接驱动 */ @Slf4j public class ZyDualCrnConnectDriver implements ThreadHandler{ private boolean connected = false; private DeviceConfig deviceConfig; private ZyDualCrnConnectApi zyDualCrnConnectApi; private volatile boolean closed = false; private ScheduledExecutorService executor; public ZyDualCrnConnectDriver(DeviceConfig deviceConfig) { this.deviceConfig = deviceConfig; } @Override public void run() { } @Override public boolean connect() { if (deviceConfig.getFake() == 0) { zyDualCrnConnectApi = new ZyDualCrnRealConnect(deviceConfig); }else { zyDualCrnConnectApi = new ZyDualCrnFakeConnect(deviceConfig); } boolean connect = zyDualCrnConnectApi.connect(); connected = connect; return connect; } @Override public void close() { closed = true; ScheduledExecutorService ex = executor; if (ex != null) { try { ex.shutdownNow(); } catch (Exception ignore) {} } if (zyDualCrnConnectApi != null) { zyDualCrnConnectApi.disconnect(); zyDualCrnConnectApi = null; } connected = false; } public void start() { executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setName("CrnConnect-" + deviceConfig.getDeviceNo()); t.setDaemon(true); return t; } }); executor.scheduleAtFixedRate(() -> { if (closed || Thread.currentThread().isInterrupted()) { return; } try { if (!connected) { connect(); } } catch (Exception e) { e.printStackTrace(); } }, 0, 1000, TimeUnit.MILLISECONDS); } public ZyDualCrnStatusEntity getStatus() { if (zyDualCrnConnectApi == null) { return null; } return zyDualCrnConnectApi.getStatus(); } public CommandResponse sendCommand(DualCrnCommand command) { return zyDualCrnConnectApi.sendCommand(command); } }