初步完成龙台的读卡逻辑

This commit is contained in:
2024-12-09 18:28:36 +08:00
parent aa634c8860
commit 37fb40672a
15 changed files with 313 additions and 43 deletions

View File

@@ -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
}

View File

@@ -1,4 +1,4 @@
package card_device
package card_pusher
import (
"fmt"

View File

@@ -1,4 +1,4 @@
package card_device
package card_pusher
type LineGroup struct {
Name string

View File

@@ -1,4 +1,4 @@
package card_device
package card_pusher
import (
"strconv"

View File

@@ -5,7 +5,7 @@ import (
"encoding/json"
"game-driver/config"
"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/utils"
@@ -16,19 +16,20 @@ import (
)
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)
devices := make([]*card_pusher.Device, 0)
for _, group := range config.C.Game.CardGroups {
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)
}

View File

@@ -1,44 +1,109 @@
package play
import (
"context"
"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"
"sync"
"time"
)
func WaitCard(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)
}
func WaitCard(ctx context.Context) leaf.HandlerFunc {
reader, err := card_reader.NewReader("rtu:///dev/ttyUSB0")
if err != nil {
zap.S().Panicln("读卡器串口连接失败", err)
}
// 等待组
var wait sync.WaitGroup
defer wait.Wait()
a := make(chan string)
defer close(a)
wait.Add(1)
go func() {
defer wait.Done()
//TODO: 模拟卡片 3s 插入
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)
}
}
}
}
}