Merge branch 'refs/heads/main' into clean_beep
This commit is contained in:
@@ -53,7 +53,7 @@ func PlayBgm() leaf.HandlerFunc {
|
||||
// }
|
||||
//}()
|
||||
} else {
|
||||
zap.S().Errorln("背景音乐解析为空")
|
||||
zap.S().Infoln("未解析到背景音乐")
|
||||
}
|
||||
|
||||
c.Next()
|
||||
|
||||
@@ -8,12 +8,12 @@ import (
|
||||
)
|
||||
|
||||
// RelayMaster 继电器中间件
|
||||
func RelayMaster(r *relay.Device) leaf.HandlerFunc {
|
||||
func RelayMaster(r relay.Relay) leaf.HandlerFunc {
|
||||
return func(c *leaf.Context) {
|
||||
pm := leaf.Value[*schema.PlayModal](c, PayloadJSONKey)
|
||||
if r != nil && pm.Power {
|
||||
r.On(1)
|
||||
defer r.Off(1)
|
||||
r.On(0)
|
||||
defer r.Off(0)
|
||||
|
||||
zap.S().Infoln("开启电源")
|
||||
defer zap.S().Infoln("关闭电源")
|
||||
|
||||
@@ -24,7 +24,7 @@ func switchPoint(ctx context.Context, point int) leaf.HandlerFunc {
|
||||
return play.PushCard(ctx)
|
||||
case 5:
|
||||
// 5号点位(等待插卡)
|
||||
return play.WaitCard
|
||||
return play.WaitCard(ctx)
|
||||
default:
|
||||
return play.Default
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package card_device
|
||||
package card_pusher
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
@@ -1,4 +1,4 @@
|
||||
package card_device
|
||||
package card_pusher
|
||||
|
||||
type LineGroup struct {
|
||||
Name string
|
||||
@@ -1,4 +1,4 @@
|
||||
package card_device
|
||||
package card_pusher
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
@@ -3,32 +3,63 @@ package play
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"game-driver/config"
|
||||
"errors"
|
||||
"game-driver/config/game"
|
||||
"game-driver/internal/middleware"
|
||||
"game-driver/internal/routes/play/card_device"
|
||||
"game-driver/internal/routes/play/card_pusher"
|
||||
"game-driver/internal/schema"
|
||||
"game-driver/leaf"
|
||||
"game-driver/pkg/card_reader"
|
||||
"game-driver/pkg/utils"
|
||||
"github.com/eclipse/paho.golang/paho"
|
||||
"go.uber.org/zap"
|
||||
"io/fs"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type ResponseBody struct {
|
||||
Empty int `json:"empty"`
|
||||
Error int `json:"error"`
|
||||
OutOk int `json:"out_ok"`
|
||||
num int
|
||||
CardId string `json:"card_id"`
|
||||
Empty int `json:"empty"`
|
||||
Error int `json:"error"`
|
||||
OutOk int `json:"out_ok"`
|
||||
num int
|
||||
}
|
||||
|
||||
func PushCard(ctx context.Context) leaf.HandlerFunc {
|
||||
devices := make([]*card_device.Device, 0)
|
||||
for _, group := range config.C.Game.CardGroups {
|
||||
g := (game.G).(game.ConfigPush)
|
||||
|
||||
// 开始初始化读卡器
|
||||
reader, err := card_reader.NewReader(g.ReadAddr)
|
||||
if err != nil {
|
||||
if errors.Is(err, fs.ErrNotExist) {
|
||||
zap.S().Errorf("读卡器串口文件不存在: %s", g.ReadAddr)
|
||||
os.Exit(1)
|
||||
}
|
||||
zap.S().Panicf("读卡器串口连接失败 [%T]: %q", err, err)
|
||||
}
|
||||
go func() {
|
||||
<-ctx.Done()
|
||||
_ = reader.Close()
|
||||
}()
|
||||
|
||||
// 开始初始化发卡器
|
||||
devices := make([]*card_pusher.Device, 0)
|
||||
for i, group := range g.PushGroups {
|
||||
// 对读卡器初始化配置
|
||||
reader.SetSlave(byte(i + 1))
|
||||
err = reader.Init()
|
||||
if err != nil {
|
||||
zap.S().Panicln("读卡器初始配置失败", err)
|
||||
}
|
||||
|
||||
// 解析发卡器配置
|
||||
gv, _ := json.Marshal(group)
|
||||
zap.S().Info("发卡器指针:", string(gv))
|
||||
|
||||
device, err := card_device.New(group)
|
||||
// 初始化发卡器
|
||||
device, err := card_pusher.New(group)
|
||||
if err != nil {
|
||||
zap.S().Panicln("初始化发卡器失败: ", err)
|
||||
}
|
||||
@@ -81,6 +112,13 @@ func PushCard(ctx context.Context) leaf.HandlerFunc {
|
||||
// 延迟1秒获取结果并发送消息
|
||||
time.AfterFunc(time.Second, func() {
|
||||
if body.num != 0 {
|
||||
// 若卡片就位,读取卡片信息
|
||||
if devices[body.num-1].GetOutOk() == 1 {
|
||||
reader.SetSlave(byte(body.num))
|
||||
if info := reader.GetCardInfo(); info != nil {
|
||||
body.CardId = info.ID
|
||||
}
|
||||
}
|
||||
body.OutOk += devices[body.num-1].GetOutOk()
|
||||
}
|
||||
publishBody(ctx, c.Properties.ResponseTopic, body)
|
||||
|
||||
@@ -1,43 +1,119 @@
|
||||
package play
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"game-driver/config/game"
|
||||
"game-driver/internal/middleware"
|
||||
"game-driver/internal/schema"
|
||||
"game-driver/leaf"
|
||||
"game-driver/pkg/card_reader"
|
||||
"game-driver/pkg/channel"
|
||||
"game-driver/pkg/tts"
|
||||
"go.uber.org/zap"
|
||||
"io/fs"
|
||||
"os"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
func WaitCard(c *leaf.Context) {
|
||||
payload := leaf.Value[*schema.PlayModal](c, middleware.PayloadJSONKey)
|
||||
func WaitCard(ctx context.Context) leaf.HandlerFunc {
|
||||
g := (game.G).(game.ConfigWait)
|
||||
|
||||
var waitCard time.Duration
|
||||
if a, ok := payload.Game["wait_card"]; ok {
|
||||
if v, ok := a.(float64); ok {
|
||||
waitCard = time.Duration(v)
|
||||
reader, err := card_reader.NewReader(g.Addr)
|
||||
if err != nil {
|
||||
if errors.Is(err, fs.ErrNotExist) {
|
||||
zap.S().Errorf("读卡器串口文件不存在: %s", g.Addr)
|
||||
os.Exit(1)
|
||||
}
|
||||
zap.S().Panicf("读卡器串口连接失败 [%T]: %q", err, err)
|
||||
}
|
||||
|
||||
// 等待组
|
||||
var wait sync.WaitGroup
|
||||
defer wait.Wait()
|
||||
|
||||
a := make(chan string)
|
||||
defer close(a)
|
||||
|
||||
wait.Add(1)
|
||||
go func() {
|
||||
defer wait.Done()
|
||||
time.Sleep(3 * time.Second)
|
||||
a <- "卡片数据"
|
||||
<-ctx.Done()
|
||||
_ = reader.Close()
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-c.Done():
|
||||
case <-time.After(waitCard * time.Second):
|
||||
case _, ok := <-a: // 等待卡片插入
|
||||
if ok { // 非关闭信号
|
||||
Default(c)
|
||||
err = reader.Init()
|
||||
if err != nil {
|
||||
zap.S().Panicln("读卡器初始化失败", err)
|
||||
}
|
||||
|
||||
return func(c *leaf.Context) {
|
||||
payload := leaf.Value[*schema.PlayModal](c, middleware.PayloadJSONKey)
|
||||
|
||||
// 读取卡片等待时间
|
||||
var waitCard time.Duration
|
||||
if a, ok := payload.Game["wait_card"]; ok {
|
||||
if v, ok := a.(float64); ok {
|
||||
waitCard = time.Duration(v)
|
||||
}
|
||||
}
|
||||
// 卡片ID预期值
|
||||
var cardId string
|
||||
if a, ok := payload.Game["card_id"]; ok {
|
||||
if v, ok := a.(string); ok {
|
||||
cardId = v
|
||||
}
|
||||
}
|
||||
// 卡片比对成功语音内容
|
||||
var cardOk string
|
||||
if a, ok := payload.Game["card_ok"]; ok {
|
||||
if v, ok := a.(string); ok {
|
||||
cardOk = v
|
||||
}
|
||||
}
|
||||
// 卡片比对失败语音内容
|
||||
var cardError string
|
||||
if a, ok := payload.Game["card_error"]; ok {
|
||||
if v, ok := a.(string); ok {
|
||||
cardError = v
|
||||
}
|
||||
}
|
||||
|
||||
// 等待组
|
||||
var wait sync.WaitGroup
|
||||
defer wait.Wait()
|
||||
|
||||
// 卡片信息通道
|
||||
cardInfo := channel.NewClosed[string]()
|
||||
defer cardInfo.Close()
|
||||
|
||||
// 结束信号通道
|
||||
cc, cancel := context.WithCancel(context.TODO())
|
||||
defer cancel()
|
||||
|
||||
wait.Add(1)
|
||||
go func() {
|
||||
defer wait.Done()
|
||||
reader.OnCardInfo(cc, func(info *card_reader.CardInfo) {
|
||||
cardInfo.Send(info.ID)
|
||||
})
|
||||
}()
|
||||
|
||||
// 多次读取,直到读取到正确的卡片
|
||||
for isNeed := true; isNeed; {
|
||||
isNeed = false
|
||||
|
||||
select {
|
||||
case <-c.Done():
|
||||
case <-time.After(waitCard * time.Second):
|
||||
case id, ok := <-cardInfo.Data(): // 等待卡片插入
|
||||
if ok { // 非关闭信号
|
||||
// 比对卡号是否正确,不正确则重新读取
|
||||
if cardId != id {
|
||||
zap.S().Infof("读取到卡片数据%q,与预期卡片数据%q不一致", id, cardId)
|
||||
// 播报错误提示
|
||||
tts.DefaultTTS.Sound(cardError)
|
||||
isNeed = true
|
||||
break
|
||||
}
|
||||
// 播报恭喜语音
|
||||
tts.DefaultTTS.Sound(cardOk)
|
||||
//TODO: 打开炫酷光效,屏幕跳转恭喜页面
|
||||
zap.S().Infof("读取到卡片数据%q,开始打开炫酷光效", id)
|
||||
Default(c)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,12 +175,12 @@ func relayAction(c *leaf.Context, item schema.WaitItemModel, root schema.TimeMod
|
||||
defer cancel()
|
||||
}
|
||||
|
||||
device, err := relay.New(item.Data, nil)
|
||||
r, err := relay.New(item.Data)
|
||||
if err != nil {
|
||||
zap.S().Errorln("继电器初始化异常: ", err)
|
||||
return
|
||||
}
|
||||
defer device.Close()
|
||||
defer r.Close()
|
||||
|
||||
select {
|
||||
case <-c.Done():
|
||||
@@ -189,9 +189,9 @@ func relayAction(c *leaf.Context, item schema.WaitItemModel, root schema.TimeMod
|
||||
zap.S().Infoln("待机继电器供电")
|
||||
defer zap.S().Infoln("待机继电器断电")
|
||||
|
||||
device.On(1)
|
||||
r.On(0)
|
||||
<-c.Done()
|
||||
device.Off(1)
|
||||
r.Off(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
"game-driver/internal/schema"
|
||||
"game-driver/leaf"
|
||||
"game-driver/logger"
|
||||
"game-driver/pkg/relay"
|
||||
"game-driver/pkg/tts"
|
||||
"game-driver/pkg/utils"
|
||||
"github.com/eclipse/paho.golang/autopaho"
|
||||
@@ -108,13 +109,11 @@ func Run() {
|
||||
tts.DefaultTTS = tts.New(ctx, config.C.Aliyun)
|
||||
|
||||
// 构建继电器对象
|
||||
//r, err := relay.New(config.C.Relay, func(msg string) {
|
||||
// zap.S().Infoln("串口返回: ", msg)
|
||||
//})
|
||||
//if err != nil {
|
||||
// zap.S().Panicln("串口连接异常: ", err)
|
||||
//}
|
||||
//defer r.Close()
|
||||
r, err := relay.New(config.C.Relay)
|
||||
if err != nil {
|
||||
zap.S().Panicln("串口连接异常: ", err)
|
||||
}
|
||||
defer r.Close()
|
||||
|
||||
// 构建全局设备变量
|
||||
device := common.DefaultDevice(ctx, publishTopic)
|
||||
@@ -129,7 +128,7 @@ func Run() {
|
||||
middleware.EmergencyStop(common.GlobalStopper),
|
||||
middleware.SoundStart(),
|
||||
middleware.RelayMaster(nil),
|
||||
middleware.TimeoutOver(config.C.Game.MaxTimeout),
|
||||
middleware.TimeoutOver(config.C.MaxTimeout),
|
||||
middleware.TickerAction(),
|
||||
middleware.PlayBgm(),
|
||||
routes.PlayRouter(ctx, config.C.Location, config.C.Point),
|
||||
|
||||
Reference in New Issue
Block a user