rts-sim-testing-service/ts/simulation/wayside/memory/wayside_memory_ckm.go
thesai 1facbfeb2b
All checks were successful
local-test分支打包构建docker并发布运行 / Docker-Build (push) Successful in 1m38s
【bug】车库门强制开关门无效;洗车机取消故障后依然有紧急停车
2024-04-07 13:38:30 +08:00

83 lines
2.5 KiB
Go

package memory
import (
"fmt"
"joylink.club/bj-rtsts-server/dto/data_proto"
"joylink.club/bj-rtsts-server/dto/request_proto"
"joylink.club/bj-rtsts-server/sys_error"
appcomponent "joylink.club/bj-rtsts-server/ts/simulation/app_component"
"joylink.club/ecs"
"joylink.club/rtsssimulation/component"
"joylink.club/rtsssimulation/entity"
"unsafe"
)
func CkmOperation(simulation *VerifySimulation, req *request_proto.CkmOperationReq) *sys_error.BusinessError {
switch req.Operation {
case request_proto.Ckm_SetParams:
return setParam(simulation, req)
default:
panic(fmt.Sprintf("未知的屏蔽门操作:%s", req.Operation))
}
return nil
}
func setParam(simulation *VerifySimulation, req *request_proto.CkmOperationReq) *sys_error.BusinessError {
uid := QueryUidByMidAndComId(req.MapId, req.DeviceId, &data_proto.GarageDoor{})
result := <-ecs.Request[ecs.EmptyType](simulation.World, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(simulation.World)
entry, ok := wd.EntityMap[uid]
if ok {
entry.AddComponent(appcomponent.CkmParamType, unsafe.Pointer(req.Param))
//故障
if req.Param.Fault == request_proto.Ckm_FA_State_Loss {
setRelayStateLoss(entry)
} else {
clearRelayStateLoss(entry)
}
//强制
switch req.Param.Force {
case request_proto.Ckm_F_NONE:
entry.RemoveComponent(component.CkmForceCloseTag)
entry.RemoveComponent(component.CkmForceOpenTag)
case request_proto.Ckm_F_KM:
entry.AddComponent(component.CkmForceOpenTag)
entry.RemoveComponent(component.CkmForceCloseTag)
case request_proto.Ckm_F_GM:
entry.AddComponent(component.CkmForceCloseTag)
entry.RemoveComponent(component.CkmForceOpenTag)
}
} else {
return ecs.NewErrResult(fmt.Errorf("未找到id=%s的实体", uid))
}
return ecs.NewOkEmptyResult()
})
if result.Err != nil {
return sys_error.New("车库门设置参数失败", result.Err)
} else {
return nil
}
}
func setRelayStateLoss(entry *ecs.Entry) {
if entry.HasComponent(component.CkmCircuitType) {
ckmCircuit := component.CkmCircuitType.Get(entry)
for _, relayEntry := range ckmCircuit.RelayList() {
if relayEntry != nil {
relayEntry.AddComponent(appcomponent.RelayStateLossTag)
}
}
}
}
func clearRelayStateLoss(entry *ecs.Entry) {
if entry.HasComponent(component.CkmCircuitType) {
ckmCircuit := component.CkmCircuitType.Get(entry)
for _, relayEntry := range ckmCircuit.RelayList() {
if relayEntry != nil {
relayEntry.RemoveComponent(appcomponent.RelayStateLossTag)
}
}
}
}