118 lines
2.7 KiB
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
|
|
}
|