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 {