138 lines
2.3 KiB
Go
138 lines
2.3 KiB
Go
package lib
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"legu.airobot/storage"
|
|
)
|
|
|
|
type myAI struct {
|
|
robots []*Robot
|
|
scenes []*scene
|
|
iscenes []IScene
|
|
tickets Tickets //票池
|
|
robotCount uint32 //机器人数量
|
|
lock sync.Mutex //
|
|
config *storage.Config //
|
|
}
|
|
|
|
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,
|
|
config: aip.Config,
|
|
iscenes: aip.Scenes,
|
|
}
|
|
|
|
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
|
|
// Deprecated
|
|
func (m *myAI) LoadCallers() []IScene {
|
|
return m.iscenes
|
|
|
|
}
|
|
|
|
// 根据场景名称获取场景接口
|
|
// Deprecated
|
|
func (m *myAI) GetSceneInstance(sceneName string) IScene {
|
|
for _, v := range m.iscenes {
|
|
if v.Info().Name == sceneName {
|
|
return v
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// 加入机器人
|
|
// 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
|
|
}
|
|
|
|
// Deprecated
|
|
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.config.Scenes) == 0 {
|
|
logrus.Warn("还未设置场景")
|
|
return false
|
|
}
|
|
|
|
go func() {
|
|
for {
|
|
m.tickets.Take()
|
|
go func() {
|
|
robot := NewRobot(m.config)
|
|
robot.SetScenes(m.iscenes)
|
|
m.appendRobot(robot)
|
|
robot.Start()
|
|
}()
|
|
}
|
|
}()
|
|
|
|
return true
|
|
}
|
|
|
|
func (m *myAI) Stop() {
|
|
|
|
}
|
|
|
|
func (m *myAI) ShowResult() {
|
|
|
|
}
|