airobot/lib/ai.go
2022-12-12 08:30:21 +08:00

137 lines
2.3 KiB
Go

package lib
import (
"bytes"
"fmt"
"sync"
"github.com/sirupsen/logrus"
)
type myAI struct {
robots []*Robot
scenes []*scene
callers []ICaller
tickets Tickets //票池
robotCount uint32 //机器人数量
lock sync.Mutex //
}
func NewAI(aip AIParam) (*myAI, error) {
logrus.Debug("创建AI")
if err := aip.Check(); err != nil {
return nil, err
}
ai := &myAI{
scenes: make([]*scene, 0),
robotCount: aip.RobotCount,
}
if err := ai.init(); err != nil {
return nil, err
}
return ai, nil
}
func (m *myAI) init() error {
var buf bytes.Buffer
buf.WriteString("初始化AI")
tickets, err := NewTickets(m.robotCount)
if err != nil {
return err
}
m.tickets = tickets
buf.WriteString(fmt.Sprintf("完成 机器人数量:%d", m.robotCount))
logrus.Debug(buf.String())
return nil
}
//启动时载入所有Caller
func (m *myAI) LoadCallers() []ICaller {
return m.callers
}
// 初始化caller
func (m *myAI) InitCaller(callers ...ICaller) {
m.callers = append(m.callers, callers...)
}
// 加入机器人
func (m *myAI) AddRobot(scene *scene) {
//
robot := NewRobot()
robot.SelScene(scene)
m.robots = append(m.robots, robot)
}
// 获取场景下的机器人
func (m *myAI) GetRobots(sceneName string) (robots []*Robot) {
for _, robot := range m.robots {
scene := robot.GetCurrentScene()
if scene != nil && scene.Name == sceneName {
robots = append(robots, robot)
}
}
return
}
func (m *myAI) CurrentScene() *scene {
for _, v := range m.scenes {
if v.status == STATUS_ENABLE {
return v
}
}
return nil
}
func (m *myAI) appendRobot(robot *Robot) {
defer m.lock.Unlock()
m.lock.Lock()
m.robots = append(m.robots, robot)
}
func (m *myAI) Start() bool {
if len(m.scenes) == 0 {
logrus.Warn("还未设置场景")
return false
}
// 只有一个场景是启用状态,所有启动的机器人使用一个场景
scene := m.CurrentScene()
if scene == nil {
logrus.Warn("至少要启用一个场景")
return false
}
// i := uint32(0); i < m.robotCount; i++
go func() {
for {
m.tickets.Take()
go func() {
// m.AddRobot(scene)
robot := NewRobot()
robot.SelScene(scene)
m.appendRobot(robot)
robot.Start()
}()
}
}()
return true
}
func (m *myAI) Stop() {
}
func (m *myAI) ShowResult() {
}