airobot/lib/scene.go
2022-12-12 11:20:37 +08:00

73 lines
1.2 KiB
Go

package lib
import (
"sync"
)
type IScene interface {
Run(robot IRobot) error
Info() SceneInfo
}
type scene struct {
ai *myAI
Name string
Desc string
callerQueue *Queue[ICaller] //确定运行的caller队列
status uint32 //场景状态
lock sync.Mutex
}
// 创建场景
func NewScene(ai *myAI, param SceneParam) *scene {
s := &scene{
ai: ai,
Name: param.Name,
Desc: param.Desc,
callerQueue: NewQueue[ICaller](),
}
ai.scenes = append(ai.scenes, s)
return s
}
// 给场景添加调用器
func (s *scene) AddCaller(caller ICaller) {
s.callerQueue.Add(caller)
}
// 列表
func (s *scene) CallerList() []ICaller {
return s.callerQueue.List()
}
// 取出
func (s *scene) PopCaller() ICaller {
action, err := s.callerQueue.Pop()
if err != nil {
return nil
}
return action
}
// 启用场景
func (s *scene) Enable(name string) {
for _, v := range s.ai.scenes {
if v.Name == name {
v.status = STATUS_ENABLE
} else {
v.status = STATUS_DISENABLE
}
}
}
//禁用场景
func (s *scene) Disable(name string) {
for _, v := range s.ai.scenes {
if v.Name == name {
v.status = STATUS_DISENABLE
}
}
}