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.RgvCommand; import com.zy.core.network.api.ZyRgvConnectApi; import com.zy.core.network.entity.ZyRgvStatusEntity; import com.zy.core.network.fake.ZyRgvFakeConnect; import com.zy.core.network.real.ZyRgvRealConnect; import lombok.extern.slf4j.Slf4j; @Slf4j public class ZyRgvConnectDriver implements ThreadHandler { private boolean connected = false; private DeviceConfig deviceConfig; private ZyRgvConnectApi zyRgvConnectApi; private volatile boolean closed = false; private Thread selfThread; public ZyRgvConnectDriver(DeviceConfig deviceConfig) { this.deviceConfig = deviceConfig; } @Override @SuppressWarnings("InfiniteLoopStatement") public void run() { selfThread = Thread.currentThread(); while (!closed && !Thread.currentThread().isInterrupted()) { try { if (!connected) { connect(); } Thread.sleep(1000); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); break; } catch (Exception e) { e.printStackTrace(); } } } @Override public boolean connect() { if (deviceConfig.getFake() == 0) { zyRgvConnectApi = new ZyRgvRealConnect(deviceConfig); } else { zyRgvConnectApi = new ZyRgvFakeConnect(deviceConfig); } boolean connect = zyRgvConnectApi.connect(); connected = connect; return connect; } @Override public void close() { closed = true; Thread t = selfThread; if (t != null) { try { t.interrupt(); } catch (Exception ignore) {} } if (zyRgvConnectApi != null) { zyRgvConnectApi.disconnect(); zyRgvConnectApi = null; } connected = false; } public void start() { Thread t = new Thread(this); t.start(); } public ZyRgvStatusEntity getStatus() { if (zyRgvConnectApi == null) { return null; } return zyRgvConnectApi.getStatus(); } public CommandResponse sendCommand(RgvCommand command) { return zyRgvConnectApi.sendCommand(command); } }