package jiekou;
|
import chushihua.SlotManager;
|
import home.Fkj;
|
|
/**
|
* 轮询卡槽状态类
|
* 用于定期轮询并输出所有卡槽的状态信息
|
*/
|
public class lunxunkazhuangtai {
|
private static Thread pollThread;
|
private static volatile boolean isRunning = false;
|
private static volatile int pollInterval = 30000; // 30秒间隔,改为可变的
|
|
// 常量定义,避免重复创建字符串
|
private static final String THREAD_NAME = "SlotStatusPollingThread";
|
private static final String UNKNOWN = "未知";
|
private static final String NORMAL = "正常";
|
private static final String NULL_VALUE = "null";
|
|
// 状态常量
|
private static final String STATUS_INVALID = "0";
|
private static final String STATUS_STANDBY = "1";
|
private static final String STATUS_CHARGING = "2";
|
private static final String STATUS_FULL = "3";
|
private static final String STATUS_FAULT = "4";
|
private static final String STATUS_AUTH_EXPIRED = "5";
|
private static final String STATUS_TIMEOUT = "6";
|
private static final String STATUS_UNKNOWN = "-1";
|
|
// 故障常量
|
private static final String FAULT_NORMAL = "0";
|
private static final String FAULT_CARD_ERROR = "1";
|
private static final String FAULT_OVER_CURRENT = "2";
|
private static final String FAULT_DOOR_FAULT = "3";
|
private static final String FAULT_OVER_VOLTAGE = "4";
|
private static final String FAULT_UNDER_VOLTAGE = "5";
|
private static final String FAULT_UNKNOWN = "-1";
|
|
/**
|
* 启动轮询线程
|
*/
|
public static void startPolling() {
|
if (isRunning) {
|
System.out.println("轮询线程已在运行中");
|
return;
|
}
|
|
isRunning = true;
|
pollThread = new Thread(new PollingTask(), THREAD_NAME);
|
pollThread.setDaemon(true);
|
pollThread.start();
|
System.out.println("卡槽状态轮询线程已启动,间隔: " + pollInterval + "ms");
|
}
|
|
/**
|
* 停止轮询线程
|
*/
|
public static void stopPolling() {
|
if (!isRunning) {
|
return;
|
}
|
|
isRunning = false;
|
if (pollThread != null) {
|
pollThread.interrupt();
|
try {
|
// 等待线程安全结束,最多等待2秒
|
pollThread.join(2000);
|
} catch (InterruptedException e) {
|
Thread.currentThread().interrupt();
|
System.out.println("等待轮询线程停止时被中断");
|
}
|
pollThread = null;
|
}
|
System.out.println("卡槽状态轮询线程已停止");
|
}
|
|
/**
|
* 检查轮询线程是否在运行
|
* @return 运行状态
|
*/
|
public static boolean isPolling() {
|
return isRunning;
|
}
|
|
/**
|
* 轮询任务实现
|
*/
|
private static class PollingTask implements Runnable {
|
@Override
|
public void run() {
|
System.out.println("轮询任务开始执行");
|
|
while (isRunning && !Thread.currentThread().isInterrupted()) {
|
try {
|
// 输出所有卡槽状态
|
printAllSlotsStatus();
|
|
// 使用动态间隔,支持运行时调整
|
Thread.sleep(pollInterval);
|
|
} catch (InterruptedException e) {
|
System.out.println("轮询线程被中断,正在退出...");
|
Thread.currentThread().interrupt();
|
break;
|
} catch (Exception e) {
|
System.err.println("轮询过程中发生错误: " + e.getMessage());
|
// 记录异常但继续运行,避免因单次异常导致整个监控停止
|
e.printStackTrace();
|
|
// 发生异常时短暂等待后再继续,避免频繁错误循环
|
try {
|
Thread.sleep(5000);
|
} catch (InterruptedException ie) {
|
Thread.currentThread().interrupt();
|
break;
|
}
|
}
|
}
|
|
isRunning = false;
|
// System.out.println("轮询任务执行结束");
|
}
|
|
/**
|
* 输出所有卡槽状态信息
|
*/
|
private void printAllSlotsStatus() {
|
Fkj[] slots = SlotManager.getSlotArray();
|
if (slots == null || slots.length == 0) {
|
// System.out.println("无卡槽数据");
|
return;
|
}
|
|
// 使用StringBuilder减少字符串拼接开销
|
StringBuilder statusBuilder = new StringBuilder();
|
|
|
int validSlotCount = 0;
|
for (Fkj slot : slots) {
|
if (slot != null) {
|
validSlotCount++;
|
// 使用下面的推给服务器卡的状态
|
String kacaobianhao = safeGetValue(slot.getSlotNumber());
|
String kahao = safeGetValue(slot.getCardNumber());
|
String shifouyouka = formatHasCard(safeGetValue(slot.getHasCard()));
|
String kazhuangtai = formatWorkStatus(safeGetValue(slot.getWorkStatus()));
|
String kacaodianya = safeGetValue(slot.getVoltage());
|
String kacaodianliu = safeGetValue(slot.getCurrent());
|
String guzhangyuanyin = formatFault(safeGetValue(slot.getFault()));
|
|
|
}
|
}
|
|
}
|
|
/**
|
* 安全获取值,避免空指针
|
*/
|
private String safeGetValue(String value) {
|
return value != null ? value : NULL_VALUE;
|
}
|
|
/**
|
* 格式化有卡状态
|
*/
|
private String formatHasCard(String hasCard) {
|
if ("1".equals(hasCard)) return "有卡";
|
if ("0".equals(hasCard)) return "无卡";
|
if ("-1".equals(hasCard)) return UNKNOWN;
|
return hasCard;
|
}
|
|
/**
|
* 格式化工作状态
|
*/
|
private String formatWorkStatus(String status) {
|
switch (status) {
|
case STATUS_INVALID: return "无效";
|
case STATUS_STANDBY: return "待机";
|
case STATUS_CHARGING: return "充电中";
|
case STATUS_FULL: return "已充满";
|
case STATUS_FAULT: return "故障";
|
case STATUS_AUTH_EXPIRED: return "授权到期";
|
case STATUS_TIMEOUT: return "通信超时";
|
case STATUS_UNKNOWN: return UNKNOWN;
|
default: return status;
|
}
|
}
|
|
/**
|
* 格式化故障状态
|
*/
|
private String formatFault(String fault) {
|
switch (fault) {
|
case FAULT_NORMAL: return NORMAL;
|
case FAULT_CARD_ERROR: return "插卡错误";
|
case FAULT_OVER_CURRENT: return "过流";
|
case FAULT_DOOR_FAULT: return "门控故障";
|
case FAULT_OVER_VOLTAGE: return "过压";
|
case FAULT_UNDER_VOLTAGE: return "欠压";
|
case FAULT_UNKNOWN: return UNKNOWN;
|
default: return fault;
|
}
|
}
|
}
|
|
/**
|
* 设置轮询间隔(单位:毫秒)
|
* @param interval 间隔时间,毫秒
|
*/
|
public static void setPollInterval(int interval) {
|
if (interval <= 0) {
|
throw new IllegalArgumentException("轮询间隔必须大于0");
|
}
|
pollInterval = interval;
|
System.out.println("轮询间隔已更新: " + interval + "ms");
|
}
|
|
/**
|
* 获取当前轮询间隔
|
* @return 轮询间隔(毫秒)
|
*/
|
public static int getPollInterval() {
|
return pollInterval;
|
}
|
|
/**
|
* 手动触发一次状态输出(不等待间隔)
|
*/
|
public static void triggerManualOutput() {
|
if (isRunning && pollThread != null) {
|
new PollingTask().printAllSlotsStatus();
|
} else {
|
System.out.println("轮询线程未运行,无法手动触发输出");
|
}
|
}
|
|
/**
|
* 安全关闭所有资源
|
*/
|
public static void shutdown() {
|
stopPolling();
|
}
|
}
|