13 changed files with 303 additions and 71 deletions
-
5src/main/java/a8k/OS.java
-
3src/main/java/a8k/app/channel/iflytophald/type/protocol/OutputIOId.java
-
2src/main/java/a8k/app/constant/AppVersion.java
-
16src/main/java/a8k/app/controler/api/v1/app/ctrl/OsCtrlControler.java
-
21src/main/java/a8k/app/controler/api/v1/app/setting/DeviceInfoControler.java
-
27src/main/java/a8k/app/service/appsetup/AppEnvInitializer.java
-
116src/main/java/a8k/app/service/os/OSBeepCtrlService.java
-
96src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java
-
27src/main/java/a8k/app/service/peripheral_ctrl/BeepCtrlService.java
-
15src/main/java/a8k/app/service/statemgr/GStateMgrService.java
-
8src/main/java/a8k/app/type/GState.java
-
28src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java
-
10src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java
@ -1,5 +1,5 @@ |
|||||
package a8k.app.constant; |
package a8k.app.constant; |
||||
|
|
||||
public class AppVersion { |
public class AppVersion { |
||||
public static final String APP_VERSION = "1.0.1"; |
|
||||
|
public static final String APP_VERSION = "1.0.3"; |
||||
} |
} |
@ -0,0 +1,27 @@ |
|||||
|
package a8k.app.service.appsetup; |
||||
|
|
||||
|
import a8k.OS; |
||||
|
import a8k.app.service.os.OSDeviceInfoMgrService; |
||||
|
import a8k.app.service.statemgr.GStateMgrService; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
@Slf4j |
||||
|
@RequiredArgsConstructor |
||||
|
public class AppEnvInitializer { |
||||
|
private final GStateMgrService gStateMgrService; |
||||
|
private final OSDeviceInfoMgrService osDeviceInfoMgrService; |
||||
|
|
||||
|
@PostConstruct |
||||
|
void init() { |
||||
|
log.info("AppEnvInitializer init"); |
||||
|
gStateMgrService.setSn(osDeviceInfoMgrService.readSN()); |
||||
|
gStateMgrService.setAssetId(osDeviceInfoMgrService.readAssetId()); |
||||
|
gStateMgrService.setDeviceInited(false); |
||||
|
// 其他初始化逻辑 |
||||
|
log.info("AppEnvInitializer init completed"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,116 @@ |
|||||
|
package a8k.app.service.os; |
||||
|
|
||||
|
import a8k.OS; |
||||
|
import a8k.app.channel.iflytophald.channel.A8kCanBusService; |
||||
|
import a8k.app.channel.iflytophald.driver.OutputIOCtrlDriver; |
||||
|
import a8k.app.channel.iflytophald.type.protocol.OutputIOId; |
||||
|
import a8k.app.service.statemgr.GStateMgrService; |
||||
|
import a8k.app.teststate.VirtualDevice; |
||||
|
import a8k.app.type.exception.AppException; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
@RequiredArgsConstructor |
||||
|
@Slf4j |
||||
|
public class OSBeepCtrlService { |
||||
|
|
||||
|
|
||||
|
private final A8kCanBusService a8kCanBusService; |
||||
|
boolean beepState = false;//beep底层状态 |
||||
|
boolean beepStateIsSync = false;//底层状态是否同步 |
||||
|
boolean hardwareErrorFlag = false;//硬件错误标志 |
||||
|
|
||||
|
Boolean beepTrigger = false; // 蜂鸣器是否启用 |
||||
|
Thread beepThread = new Thread(this::beepLoopThread); |
||||
|
|
||||
|
|
||||
|
private final OutputIOCtrlDriver outputIOCtrlDriver; |
||||
|
private final GStateMgrService gStateMgrService; |
||||
|
private final VirtualDevice virtualDevice; |
||||
|
|
||||
|
public synchronized void triggerBeep() { |
||||
|
beepTrigger = true; |
||||
|
log.info("触发蜂鸣器"); |
||||
|
} |
||||
|
|
||||
|
public synchronized void stopBeep() { |
||||
|
beepTrigger = false; |
||||
|
log.info("停止蜂鸣器"); |
||||
|
beepThread.interrupt(); |
||||
|
} |
||||
|
|
||||
|
public synchronized boolean getBeepState() { |
||||
|
return beepTrigger; |
||||
|
} |
||||
|
|
||||
|
private void beepLoopThread() { |
||||
|
while (true) { |
||||
|
if (hardwareErrorFlag) { |
||||
|
OS.forceSleep(3000); |
||||
|
} else { |
||||
|
OS.forceSleep(100); |
||||
|
} |
||||
|
|
||||
|
if (!a8kCanBusService.isConnect()) { |
||||
|
OS.forceSleep(1000); |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
if (!beepStateIsSync) { |
||||
|
setBeepState(beepState); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
if (beepTrigger) { |
||||
|
setBeepState(true); |
||||
|
sleep(10); |
||||
|
setBeepState(false); |
||||
|
|
||||
|
sleep(300); |
||||
|
|
||||
|
setBeepState(true); |
||||
|
sleep(10); |
||||
|
setBeepState(false); |
||||
|
|
||||
|
sleep(1000); |
||||
|
} else { |
||||
|
if (beepState) { |
||||
|
setBeepState(false); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void sleep(int millis) { |
||||
|
try { |
||||
|
Thread.sleep(millis); |
||||
|
} catch (InterruptedException ignored) { |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void setBeepState(Boolean state) { |
||||
|
beepState = state; |
||||
|
log.info("设置蜂鸣器状态: {}", state); |
||||
|
if (virtualDevice.isEnable()) { |
||||
|
log.info("虚拟设备模式下,蜂鸣器状态设置为: {}", state); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
outputIOCtrlDriver.setIOState(OutputIOId.BeepCtrl, state); |
||||
|
beepStateIsSync = true; |
||||
|
hardwareErrorFlag = false; |
||||
|
} catch (AppException e) { |
||||
|
beepStateIsSync = false; |
||||
|
hardwareErrorFlag = true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@PostConstruct |
||||
|
void init() { |
||||
|
beepThread.start(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,96 @@ |
|||||
|
package a8k.app.service.os; |
||||
|
|
||||
|
import a8k.OS; |
||||
|
import a8k.app.channel.iflytophald.type.protocol.A8kEcode; |
||||
|
import a8k.app.service.statemgr.GStateMgrService; |
||||
|
import a8k.app.type.exception.AppException; |
||||
|
import cn.hutool.core.io.FileUtil; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.scheduling.annotation.EnableScheduling; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
@Slf4j |
||||
|
@RequiredArgsConstructor |
||||
|
@EnableScheduling |
||||
|
public class OSDeviceInfoMgrService { |
||||
|
/** |
||||
|
* |
||||
|
* 设备ID设置与读取 |
||||
|
* |
||||
|
* 编码参考: |
||||
|
* https://iflytop1.feishu.cn/wiki/L1n0wKWDtiBTC3kLLjycjvD8nib?fromScene=spaceOverview |
||||
|
*/ |
||||
|
|
||||
|
private final GStateMgrService gStateMgrService; |
||||
|
|
||||
|
String snOnWindows = "W-SN-00001"; |
||||
|
String assetIdOnWindows = "W-AId-00001"; |
||||
|
|
||||
|
|
||||
|
public String readSN() { |
||||
|
if (OS.isRunOnWindows()) { |
||||
|
return snOnWindows; |
||||
|
} |
||||
|
try { |
||||
|
return FileUtil.readUtf8String("/iflytop/env/sn"); |
||||
|
} catch (Exception e) { |
||||
|
log.error("读取SN失败: {}", e.getMessage()); |
||||
|
return "error"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public String readAssetId() { |
||||
|
if (OS.isRunOnWindows()) { |
||||
|
return assetIdOnWindows; |
||||
|
} |
||||
|
try { |
||||
|
return FileUtil.readUtf8String("/iflytop/env/assetId"); |
||||
|
} catch (Exception e) { |
||||
|
log.error("读取AssetId失败: {}", e.getMessage()); |
||||
|
return "error"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public String setSN(String sn) throws AppException { |
||||
|
if (sn == null || sn.isEmpty()) { |
||||
|
throw AppException.of(A8kEcode.CODEERROR, "SN不能为空"); |
||||
|
} |
||||
|
if (OS.isRunOnWindows()) { |
||||
|
snOnWindows = sn; |
||||
|
gStateMgrService.setSn(snOnWindows); |
||||
|
return snOnWindows; |
||||
|
} else { |
||||
|
try { |
||||
|
FileUtil.writeUtf8String(sn, "/iflytop/env/sn"); |
||||
|
gStateMgrService.setSn(sn); |
||||
|
return sn; |
||||
|
} catch (Exception e) { |
||||
|
throw AppException.of(A8kEcode.CODEERROR, e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public String setAssetId(String assetId) throws AppException { |
||||
|
if (assetId == null || assetId.isEmpty()) { |
||||
|
throw AppException.of(A8kEcode.CODEERROR, "AssetId不能为空"); |
||||
|
} |
||||
|
if (OS.isRunOnWindows()) { |
||||
|
assetIdOnWindows = assetId; |
||||
|
gStateMgrService.setAssetId(assetIdOnWindows); |
||||
|
return assetIdOnWindows; |
||||
|
} else { |
||||
|
try { |
||||
|
FileUtil.writeUtf8String(assetId, "/iflytop/env/assetId"); |
||||
|
gStateMgrService.setSn(assetId); |
||||
|
return assetId; |
||||
|
} catch (Exception e) { |
||||
|
throw AppException.of(A8kEcode.CODEERROR, e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
@ -1,27 +0,0 @@ |
|||||
package a8k.app.service.peripheral_ctrl; |
|
||||
|
|
||||
import lombok.RequiredArgsConstructor; |
|
||||
import lombok.extern.slf4j.Slf4j; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
@Component |
|
||||
@Slf4j |
|
||||
@RequiredArgsConstructor |
|
||||
public class BeepCtrlService { |
|
||||
Boolean beepWarning = true; // 假设蜂鸣器默认开启状态 |
|
||||
|
|
||||
public void startBeepWarning() { |
|
||||
log.info("打开蜂鸣器"); |
|
||||
beepWarning = true; |
|
||||
} |
|
||||
|
|
||||
public void stopBeepWarning() { |
|
||||
log.info("关闭蜂鸣器"); |
|
||||
beepWarning = false; |
|
||||
|
|
||||
} |
|
||||
|
|
||||
public Boolean isBeepWarning() { |
|
||||
return beepWarning; // 假设蜂鸣器总是开启状态 |
|
||||
} |
|
||||
} |
|
@ -1,28 +0,0 @@ |
|||||
package a8k.extui.page.driver; |
|
||||
|
|
||||
import a8k.app.type.exception.AppException; |
|
||||
import a8k.app.channel.iflytophald.driver.OutputIOCtrlDriver; |
|
||||
import a8k.app.channel.iflytophald.type.protocol.OutputIOId; |
|
||||
import a8k.extui.mgr.ExtApiPageMgr; |
|
||||
import jakarta.annotation.PostConstruct; |
|
||||
import lombok.RequiredArgsConstructor; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
@Component |
|
||||
@RequiredArgsConstructor |
|
||||
public class OutputIOCtrlDebugPage { |
|
||||
final private ExtApiPageMgr extApiPageMgr; |
|
||||
final private OutputIOCtrlDriver outputIOCtrlDriver; |
|
||||
|
|
||||
|
|
||||
public void setIOState(Boolean state) throws AppException { |
|
||||
outputIOCtrlDriver.setIOState(OutputIOId.RecycleBinOverflowPPSPowerCtrl, state); |
|
||||
} |
|
||||
|
|
||||
@PostConstruct |
|
||||
void init() { |
|
||||
var page = extApiPageMgr.newPage(this); |
|
||||
page.addFunction("废料仓光栅控制", this::setIOState).setParamVal("state", ()->true); |
|
||||
extApiPageMgr.addPage(page); |
|
||||
} |
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue