rts-sim-module/component/singleton.go

118 lines
2.7 KiB
Go

package component
import (
"fmt"
"joylink.club/ecs"
"joylink.club/rtsssimulation/consts"
"joylink.club/rtsssimulation/repository"
)
// 世界公共数据
var WorldDataType = ecs.NewComponentType[WorldData]()
// 世界数据单例组件
type WorldData struct {
Repo *repository.Repository
// 世界时间,时间戳,单位ms
Time int64
// uid为key的实体对象map
EntityMap map[string]*ecs.Entry
// 联锁驱采卡实体
CiQcEntities []*ecs.Entry
// 集中站计轴管理设备实体
AxleManageDeviceEntities []*ecs.Entry
}
// 是否在驱动码表中
func (wd *WorldData) IsDefinedInQdTable(uid string) bool {
for _, entry := range wd.CiQcEntities {
qc := CiQcTableType.Get(entry)
_, ok := qc.QueryQdIndex(uid)
if ok {
return true
}
}
return false
}
// 查询驱动位值
func (wd *WorldData) QueryQdBit(uid string) (bool, error) {
for _, entry := range wd.CiQcEntities {
qc := CiQcTableType.Get(entry)
idx, ok := qc.QueryQdIndex(uid)
if ok {
states := CiQcStateType.Get(entry)
return consts.GetBitOfBytes(states.Qbs, idx), nil
}
}
return false, fmt.Errorf("没有定义id=%s的继电器的驱动码表", uid)
}
// 根据uid获取对应设备的驱动位值
// 注意: 若找不到uid驱动码位会panic
func (wd *WorldData) GetQdBit(uid string) bool {
bit, err := wd.QueryQdBit(uid)
if err != nil {
panic(err)
}
return bit
}
// 获取继电器驱动位值
// 注意: 若没有uid组件或者找不到uid驱动码位会panic
func (wd *WorldData) GetRelayEntityQdBit(entry *ecs.Entry) bool {
if !entry.HasComponent(UidType) {
panic(fmt.Errorf("获取继电器实体驱动位值异常,实体没有uid组件"))
}
return wd.GetQdBit(UidType.Get(entry).Id)
}
// 根据uid获取对应设备的驱动位值
func (wd *WorldData) SetQdBit(uid string, v bool) error {
for _, entry := range wd.CiQcEntities {
qc := CiQcTableType.Get(entry)
idx, ok := qc.QueryQdIndex(uid)
if ok {
states := CiQcStateType.Get(entry)
consts.SetBitOfBytes(states.Qbs, idx, v)
return nil
}
}
return fmt.Errorf("没有定义id=%s的继电器的驱动码表", uid)
}
// 获取集中站id对应的联锁驱采实体
func (wd *WorldData) FindQcEntityByEcsId(ecsId string) *ecs.Entry {
for _, entry := range wd.CiQcEntities {
qc := CiQcTableType.Get(entry)
if qc.EcsUid == ecsId {
return entry
}
}
return nil
}
type QdBitParam struct {
Uid string
Val bool
}
func NewQdBitParam(uid string, v bool) *QdBitParam {
return &QdBitParam{
Uid: uid,
Val: v,
}
}
func (wd *WorldData) SetQdBits(params []*QdBitParam) error {
for _, param := range params {
err := wd.SetQdBit(param.Uid, param.Val)
if err != nil {
return err
}
}
return nil
}