From 3f4d8854a1a7212e086183d2607b18305930e963 Mon Sep 17 00:00:00 2001 From: wangqiyang Date: Tue, 28 Jul 2026 22:13:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=A7=A6=E6=91=B8=E5=B1=8F?= =?UTF-8?q?=E6=BC=94=E7=A4=BA=E6=95=B0=E6=8D=AE=E4=B8=8E=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/m9zCtrlTty/install.go | 9 +++--- apps/m9zCtrlTty/m9zCtrlTty.go | 21 +++++++++--- internal/module/m9zTtyApi/read.go | 53 +++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 8 deletions(-) diff --git a/apps/m9zCtrlTty/install.go b/apps/m9zCtrlTty/install.go index 9e0c1d6..b452ad4 100644 --- a/apps/m9zCtrlTty/install.go +++ b/apps/m9zCtrlTty/install.go @@ -6,7 +6,7 @@ import ( "path/filepath" ) -func install() { +func install() error { kioskInfof("checking firefox usability") // 1. 检查并修复 Firefox if !isFirefoxUsable() { @@ -15,7 +15,7 @@ func install() { if err := installFirefox(); err != nil { kioskErrorf("firefox install/repair failed err=%v", err) fmt.Printf("install/repair Firefox failed: %v\n", err) - os.Exit(1) + return fmt.Errorf("install/repair Firefox failed: %w", err) } kioskInfof("firefox install/repair success") fmt.Println("Firefox install/repair success") @@ -29,7 +29,7 @@ func install() { if err != nil { kioskErrorf("read executable path failed err=%v", err) fmt.Printf("读取应用路径失败: %v\n", err) - os.Exit(1) + return fmt.Errorf("read executable path failed: %w", err) } kioskInfof("current executable path=%s workdir=%s", appPath, filepath.Dir(appPath)) @@ -39,10 +39,11 @@ func install() { if err := enableAutoStart(appPath); err != nil { kioskErrorf("autostart setup failed service=%s err=%v", autoStartServiceFile(appPath), err) fmt.Printf("设置开机自启动失败: %v\n", err) - os.Exit(1) + return fmt.Errorf("setup autostart failed: %w", err) } fmt.Println("开机自启动设置成功") } else { fmt.Println("已设置开机自启动") } + return nil } diff --git a/apps/m9zCtrlTty/m9zCtrlTty.go b/apps/m9zCtrlTty/m9zCtrlTty.go index 30b3b1b..7a9cff5 100644 --- a/apps/m9zCtrlTty/m9zCtrlTty.go +++ b/apps/m9zCtrlTty/m9zCtrlTty.go @@ -3,6 +3,7 @@ package main import ( "fmt" "log" + "time" "github.com/gogf/gf/v2/errors/gerror" "github.com/towgo/towgo/errors/tcode" @@ -84,11 +85,23 @@ func start() { } } - kioskInfof("install checks begin") - install() - kioskInfof("install checks done; starting firefox client goroutine port=%d", g.Config().Server.Port) - go runClient(g.Config().Server.Port) + kioskInfof("starting firefox client goroutine port=%d", g.Config().Server.Port) + go func(port int) { + time.Sleep(500 * time.Millisecond) + runClient(port) + }(g.Config().Server.Port) + go runStartupChecks() core.RunServer() } +func runStartupChecks() { + startedAt := time.Now() + kioskInfof("startup checks begin") + if err := install(); err != nil { + kioskErrorf("startup checks failed elapsed=%s err=%v", time.Since(startedAt).Round(time.Millisecond), err) + return + } + kioskInfof("startup checks done elapsed=%s", time.Since(startedAt).Round(time.Millisecond)) +} + // TODO Build Cmd CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o m9zCtrlTty-arm64 . diff --git a/internal/module/m9zTtyApi/read.go b/internal/module/m9zTtyApi/read.go index 90bb41c..d95d1ec 100644 --- a/internal/module/m9zTtyApi/read.go +++ b/internal/module/m9zTtyApi/read.go @@ -141,6 +141,12 @@ type DeviceStatus struct { // 实时监控数据 func getDeviceStatus2(rpc towgo.JsonRpcConnection) { + // 临时演示模式:原串口读取实现已保留在 getDeviceStatus2Real。 + // getDeviceStatus2Real(rpc) + rpc.WriteResult(buildDemoDeviceStatus2()) +} + +func getDeviceStatus2Real(rpc towgo.JsonRpcConnection) { cuid, _ := getDeviceId(rpc) read, err := m9z.DeviceStatusRead(cuid) @@ -193,6 +199,53 @@ func getDeviceStatus2(rpc towgo.JsonRpcConnection) { } +func buildDemoDeviceStatus2() *DeviceStatus { + const loopCount = 10 + d := &DeviceStatus{ + ScanDeviceCount: loopCount, + Loops: make([]DeviceStatusLoop, loopCount), + } + d.Mode = 0 + d.DeviceTime = time.Now().UTC() + for i := 0; i < loopCount; i++ { + relayOpen := i%2 == 0 + pwm := uint8(35 + i*5) + d.Relays[i] = relayOpen + d.PWMOutputs[i] = pwm + + loop := DeviceStatusLoop{ + Loop: m9z.Loop{ + Index: i, + Name: fmt.Sprintf("#%d", i+1), + IsOpen: relayOpen, + Pwm: int(pwm), + }, + V: float32(218 + i*3), + A: float32(0.32 + float64(i)*0.08), + } + kw := float64(loop.V*loop.A) / 1000 + loop.Kw = float32(math.Round(kw*1000) / 1000) + + switch i { + case 0: + loop.Faults = m9z.BuildLoopFaults(uint(i+1), 0x01, "01 00") + case 1: + loop.Faults = m9z.BuildLoopFaults(uint(i+1), 0x02, "02 00") + case 6: + loop.Faults = m9z.BuildLoopFaults(uint(i+1), 0x04, "04 03") + case 8: + loop.Faults = m9z.BuildLoopFaults(uint(i+1), 0x03, "03 00") + } + loop.HasFault = len(loop.Faults) > 0 + loop.FaultMsg = joinLoopFaultMessages(loop.Faults) + loop.FaultCode = joinLoopFaultCodes(loop.Faults) + d.Loops[i] = loop + } + d.Optocoupler[0] = true + d.Optocoupler[3] = true + return d +} + func joinLoopFaultMessages(faults []m9z.LoopFault) string { messages := make([]string, 0, len(faults)) for _, fault := range faults {