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; |
|||
|
|||
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