package jiekou;
|
import chushihua.SlotManager;
|
import xitongshezhi.Fkj;
|
|
/**
|
* 轮询卡槽状态类
|
* 用于定期轮询并输出所有卡槽的状态信息
|
*/
|
public class lunxunkazhuangtai {
|
private static Thread pollThread;
|
private static volatile boolean isRunning = false;
|
private static final int POLL_INTERVAL = 30000; // 30秒间隔
|
|
/**
|
* 启动轮询线程
|
*/
|
public static void startPolling() {
|
if (isRunning) {;
|
return;
|
}
|
|
isRunning = true;
|
pollThread = new Thread(new PollingTask(), "SlotStatusPollingThread");
|
pollThread.setDaemon(true); // 设置为守护线程,当主线程结束时自动结束
|
pollThread.start();
|
}
|
|
/**
|
* 停止轮询线程
|
*/
|
public static void stopPolling() {
|
isRunning = false;
|
if (pollThread != null) {
|
pollThread.interrupt();
|
pollThread = null;
|
}
|
System.out.println("卡槽状态轮询线程已停止");
|
}
|
|
/**
|
* 检查轮询线程是否在运行
|
* @return 运行状态
|
*/
|
public static boolean isPolling() {
|
return isRunning;
|
}
|
|
/**
|
* 轮询任务实现
|
*/
|
private static class PollingTask implements Runnable {
|
@Override
|
public void run() {
|
while (isRunning && !Thread.currentThread().isInterrupted()) {
|
try {
|
// 输出所有卡槽状态
|
printAllSlotsStatus();
|
|
// 等待指定间隔
|
Thread.sleep(POLL_INTERVAL);
|
} catch (InterruptedException e) {
|
System.out.println("轮询线程被中断");
|
Thread.currentThread().interrupt();
|
break;
|
} catch (Exception e) {
|
System.err.println("轮询过程中发生错误: " + e.getMessage());
|
e.printStackTrace();
|
}
|
}
|
isRunning = false;
|
}
|
|
/**
|
* 输出所有卡槽状态信息
|
*/
|
private void printAllSlotsStatus() {
|
Fkj[] slots = SlotManager.getSlotArray();
|
if (slots == null || slots.length == 0) {
|
return;
|
}
|
for (Fkj slot : slots) {
|
if (slot != null) {
|
//使用下面的推给服务器卡的状态
|
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";
|
}
|
|
/**
|
* 格式化有卡状态
|
*/
|
private String formatHasCard(String hasCard) {
|
if ("1".equals(hasCard)) return "有卡";
|
if ("0".equals(hasCard)) return "无卡";
|
if ("-1".equals(hasCard)) return "未知";
|
return hasCard;
|
}
|
|
/**
|
* 格式化工作状态
|
*/
|
private String formatWorkStatus(String status) {
|
switch (status) {
|
case "0": return "无效";
|
case "1": return "待机";
|
case "2": return "充电中";
|
case "3": return "已充满";
|
case "4": return "故障";
|
case "5": return "授权到期";
|
case "6": return "通信超时";
|
case "-1": return "未知";
|
default: return status;
|
}
|
}
|
|
/**
|
* 格式化故障状态
|
*/
|
private String formatFault(String fault) {
|
switch (fault) {
|
case "0": return "正常";
|
case "1": return "插卡错误";
|
case "2": return "过流";
|
case "3": return "门控故障";
|
case "4": return "过压";
|
case "5": return "欠压";
|
case "-1": return "未知";
|
default: return fault;
|
}
|
}
|
}
|
|
/**
|
* 设置轮询间隔(单位:毫秒)
|
* @param interval 间隔时间,毫秒
|
*/
|
public static void setPollInterval(int interval) {
|
// 注意:这个设置不会立即生效,需要重启轮询线程
|
System.out.println("新的轮询间隔将在下次启动时生效: " + interval + "ms");
|
}
|
|
/**
|
* 获取当前轮询间隔
|
* @return 轮询间隔(毫秒)
|
*/
|
public static int getPollInterval() {
|
return POLL_INTERVAL;
|
}
|
|
/**
|
* 手动触发一次状态输出(不等待间隔)
|
*/
|
public static void triggerManualOutput() {
|
if (isRunning) {
|
new PollingTask().printAllSlotsStatus();
|
} else {
|
System.out.println("轮询线程未运行,无法手动触发输出");
|
}
|
}
|
}
|