rts-sim-module/component/ci_qc.go

77 lines
1.4 KiB
Go

package component
import (
"fmt"
"joylink.club/ecs"
"joylink.club/rtsssimulation/component/component_data"
"joylink.club/rtsssimulation/repository/model/proto"
)
var (
// 驱采表引用
CiQcTableType = ecs.NewComponentType[CiQcTable]()
// 联锁驱动、采集状态表
CiQcStateType = ecs.NewComponentType[CiQcState]()
)
// 联锁驱采数据表
type CiQcTable struct {
EcsUid string
// 驱动码表
QdBits []*proto.QdData
// 采集码表
CjBits []*proto.CjData
// 驱动索引
QdIndex map[string]int
}
func NewCiQcTable(ecsUid string, qdbits []*proto.QdData, cjbits []*proto.CjData) *CiQcTable {
return &CiQcTable{
EcsUid: ecsUid,
QdBits: qdbits,
CjBits: cjbits,
}
}
func (qc *CiQcTable) BuildQcIndex() error {
qc.QdIndex = make(map[string]int)
for i, qd := range qc.QdBits {
if len(qd.RefRelays) > 0 {
key := qd.RefRelays[0]
if _, ok := qc.QdIndex[key]; ok {
return fmt.Errorf("联锁驱动数据重复,驱动码表存在多个相同继电器: '%s'", key)
} else {
qc.QdIndex[key] = i
}
}
}
return nil
}
func (qc *CiQcTable) QueryQdIndex(uid string) (int, bool) {
idx, ok := qc.QdIndex[uid]
return idx, ok
}
type CiQcState struct {
component_data.CiQcState
}
func NewCiQcState(qlen int, clen int) *CiQcState {
qbl := qlen / 8
if qlen%8 != 0 {
qbl++
}
cbl := clen / 8
if clen%8 != 0 {
cbl++
}
return &CiQcState{
component_data.CiQcState{
Qbs: make([]byte, qbl),
Cbs: make([]byte, cbl),
},
}
}