增加待机报文缓存,无网状态也能执行待机任务;投影仪指令结果以设备状态为准

This commit is contained in:
2025-04-29 13:48:35 +08:00
parent 40293e5e9b
commit e1384504f1
13 changed files with 266 additions and 32 deletions

101
internal/routes/standby.go Normal file
View File

@@ -0,0 +1,101 @@
package routes
import (
"context"
"game-driver/internal/common"
"game-driver/internal/middleware"
"game-driver/internal/routes/standby"
"game-driver/internal/routes/standby_ctrl"
"game-driver/internal/schema"
"game-driver/leaf"
"github.com/go-pkgz/cronrange"
"go.uber.org/zap"
"sync"
)
// StandbyAction 待机任务支持音乐、TTS、继电器、视频、网页、投影仪、大型激光秀 ctrl
func StandbyAction(ctrl *common.CtrlWait, device *common.Device) leaf.HandlerFunc {
ps := common.NewPauseSub(ctrl)
return func(c *leaf.Context) {
payload := leaf.Value[*schema.WaitModel](c, middleware.PayloadJSONKey)
// 设定默认时间规则,ctrl
if payload.Cron == "" {
payload.Cron = "* * * *"
}
rules, err := cronrange.Parse(payload.Cron)
if err != nil {
zap.S().Errorln("解析时间规则异常: ", err)
return
}
// 等待组
var waitGroup sync.WaitGroup
defer waitGroup.Wait()
// 开启暂停监听
waitGroup.Add(1)
go func() {
defer waitGroup.Done()
ps.Run(c)
}()
// 处理每个待机控制
handleItem := func(title string, item schema.WaitItemModel, f func(c context.Context) error) {
waitGroup.Add(1)
go func() {
defer waitGroup.Done()
if f == nil {
return
}
f = standby_ctrl.Duration(item.Duration, f)
if f == nil {
return
}
f = standby_ctrl.Device(device, item.Lock, f)
if f == nil {
return
}
f = standby_ctrl.Interval(item.Interval, f)
if f == nil {
return
}
f = standby_ctrl.Pause(ps, item.Pause, f)
if f == nil {
return
}
f = standby_ctrl.Cron(rules, item.Cron, f)
if f == nil {
return
}
e := f(c)
if e != nil {
zap.S().Errorf("%s异常: %s\n", title, e)
}
}()
}
for _, item := range payload.Items {
switch item.Type {
case schema.WaitAudio:
handleItem("音乐待机控制", item, standby.Audio(item))
case schema.WaitTTS:
handleItem("TTS待机控制", item, standby.TTS(item))
case schema.WaitRelay:
handleItem("继电器待机控制", item, standby.Relay(item))
case schema.WaitVideo:
handleItem("视频待机控制", item, standby.Video(item))
case schema.WaitWeb:
handleItem("网页待机控制", item, standby.Web(item))
case schema.WaitPJLink:
handleItem("投影仪待机控制", item, standby.PJLink(item))
case schema.WaitLaserShow:
handleItem("大型激光秀控制", item, standby.LaserShow(item))
default:
zap.S().Infof("不支持的类型: %d\n", item.Type)
}
}
}
}