From a5f30132807989bdaa4e16a1cd27c0bcda831999 Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Wed, 5 Jul 2023 14:51:59 +0300 Subject: [PATCH 01/15] Refactor, add new data --- yabl/protocol.go | 266 +++++++++++++++++++++++++++----- yabl/protocol_test.go | 45 ++++++ yabl/setters.go | 341 ++++++++++++++++++++++++++++++++++++++++++ yabl/strings.go | 76 +++++++++- 4 files changed, 685 insertions(+), 43 deletions(-) create mode 100644 yabl/protocol_test.go create mode 100644 yabl/setters.go diff --git a/yabl/protocol.go b/yabl/protocol.go index 6b8b908..a0915c3 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -1,46 +1,62 @@ package yabl import ( - can "cli-mon/can" + "cli-mon/can" "encoding/binary" ) const ( - CONTACTOR_MAX = 18 + 1 - CONNECTOR_MAX = 6 + 1 - ALL_BITS = 0xFFFFFFFFFFFFFFFF - UNIT_ID_OFFSET = 12 - UNIT_ID_MASK = 0b111111111111 << UNIT_ID_OFFSET - ACTION_ID_MASK = 0b111111111111 - BOARD_READY_OK BoardReadyType = 0 - BOARD_READY_INFO BoardReadyType = 1 - BOARD_READY_WARNING BoardReadyType = 2 - BOARD_READY_DEBUG BoardReadyType = 3 - BOARD_READY_DEP_ERROR BoardReadyType = 4 - BOARD_READY_ERROR BoardReadyType = 5 - BOARD_READY_CRITICAL BoardReadyType = 6 - OFF BooleanType = 0 - ON BooleanType = 1 - NO_ERROR ErrorType = 0 - ERROR ErrorType = 1 - OTHER_NO_ERROR ContactorInternalOtherErrorType = 0 - NO_PENDING_CHANGES ContactorGroupChangedType = 0 - INITIALIZED_CHANGE ContactorGroupChangedType = 1 - CHANGE_IN_PROGRESS ContactorGroupChangedType = 2 - V2G_MODE_G2V V2GModeType = 0 - V2G_MODE_V2G V2GModeType = 1 - V2G_MODE_INV V2GModeType = 2 - NOT_ENABLE CpLineLevelType = 0 - TWELVE CpLineLevelType = 1 - NINE CpLineLevelType = 2 - SIX CpLineLevelType = 3 - THREE CpLineLevelType = 4 - MINUS_TWELVE CpLineLevelType = 5 - UNKNOWN IsolationStateType = 0 - ONGOING IsolationStateType = 1 - PASSED IsolationStateType = 2 - WARNING IsolationStateType = 3 - FAILED IsolationStateType = 4 + CONTACTOR_MAX = 18 + 1 + CONNECTOR_MAX = 6 + 1 + ALL_BITS = 0xFFFFFFFFFFFFFFFF + UNIT_ID_OFFSET = 12 + UNIT_ID_MASK = 0b111111111111 << UNIT_ID_OFFSET + ACTION_ID_MASK = 0b111111111111 + BOARD_READY_OK BoardReadyType = 0 + BOARD_READY_INFO BoardReadyType = 1 + BOARD_READY_WARNING BoardReadyType = 2 + BOARD_READY_DEBUG BoardReadyType = 3 + BOARD_READY_DEP_ERROR BoardReadyType = 4 + BOARD_READY_ERROR BoardReadyType = 5 + BOARD_READY_CRITICAL BoardReadyType = 6 + OFF BooleanType = 0 + ON BooleanType = 1 + NO_ERROR ErrorType = 0 + ERROR ErrorType = 1 + OTHER_NO_ERROR ContactorInternalOtherErrorType = 0 + NO_PENDING_CHANGES ContactorGroupChangedType = 0 + INITIALIZED_CHANGE ContactorGroupChangedType = 1 + CHANGE_IN_PROGRESS ContactorGroupChangedType = 2 + V2G_MODE_G2V V2GModeType = 0 + V2G_MODE_V2G V2GModeType = 1 + V2G_MODE_INV V2GModeType = 2 + NOT_ENABLE CpLineLevelType = 0 + TWELVE CpLineLevelType = 1 + NINE CpLineLevelType = 2 + SIX CpLineLevelType = 3 + THREE CpLineLevelType = 4 + MINUS_TWELVE CpLineLevelType = 5 + ISOLATION_STATE_UNKNOWN IsolationStateType = 0 + ONGOING IsolationStateType = 1 + PASSED IsolationStateType = 2 + WARNING IsolationStateType = 3 + FAILED IsolationStateType = 4 + AUTH AuthModeType = 0 + PNC AuthModeType = 1 + AUTH_STATE_UNKNOWN AuthStateType = 0 + AUTH_STATE_ALLOW AuthStateType = 1 + AUTH_STATE_DENY AuthStateType = 2 + CONTACTOR_NO_MODE ContactorModeType = 0 + CONTACTOR_TRANSACTION_PROCESS ContactorModeType = 1 + CONTACTOR_CUSTOM_MODE ContactorModeType = 2 + CONTACTOR_ONLY_ONE_OUT_MODE ContactorModeType = 3 + CONTACTOR_ONE_TO_ONE_OUT_MODE ContactorModeType = 4 + CONTACTOR_SIMPLE_DYNAMIC_MODE ContactorModeType = 5 + DEBUG_SWITCH_MODE_AUTO DebugSwitchModeType = 0 + DEBUG_SWITCH_MODE_OFF DebugSwitchModeType = 1 + DEBUG_SWITCH_MODE_ON DebugSwitchModeType = 2 + DEBUG_SWITCH_MODE_PERMANENT_OFF DebugSwitchModeType = 4 + DEBUG_SWITCH_MODE_PERMANENT_ON DebugSwitchModeType = 5 ) type Packet interface { @@ -87,6 +103,126 @@ type PuPeriphery struct { CpLineVoltage Voltage9BitType } +type LogicAuth struct { + UnitId uint + AuthMode AuthModeType + AuthState AuthStateType +} + +type LogicEnergyMode struct { + UnitId uint + V2gMode V2GModeType + CurrentMax Current10BitType + VoltageMax Voltage11BitType + PowerMax Power14BitType +} + +type LogicWorkingMode struct { + UnitId uint + TargetContactorMode ContactorModeType + Availability BooleanType +} + +type CpuPresentEnergy struct { + UnitId uint + PowerDirectionMode V2GModeType + PresentCurrent Current10BitType + PresentVoltage Voltage11BitType +} + +type CpuPeriphery struct { + UnitId uint + ContactorInput BooleanType + CircuitBreakerInput BooleanType + CircuitBreakerPowerCBInput BooleanType +} + +type CpuEnergySettings struct { + UnitId uint + CurrentMax Current10BitType + VoltageMax Voltage11BitType + PowerMax Power14BitType + TargetBatteryVoltage Voltage11BitType + TargetGoalVoltage Voltage11BitType +} + +type CpuErrors struct { + UnitId uint + BoardReady BoardReadyType + OtherError OtherError4BitType + RedButtonHard ErrorType + RedButtonSoft ErrorType + ModulesGone ErrorType + GridVoltageHighErr ErrorType + GridVoltageHighWarn ErrorType + GridVoltageLowWarn ErrorType + GridVoltageLowErr ErrorType + GridVoltageLow Voltage11BitType + GridVoltageHigh Voltage11BitType + GridVoltageEmpty ErrorType + NotReadySecc ErrorType + NotReadyPu ErrorType + NotReadyContactors ErrorType + DebugConvertersEnabled ErrorType + ContactorInputError ErrorType + NotReadyPeriphery ErrorType +} + +type CpuDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugContactorInputOn DebugSwitchModeType + DebugCircuitBreakerOn DebugSwitchModeType + DebugRedButtonSoftware DebugSwitchModeType +} + +type PuErrors struct { + UnitId uint + BoardReady BoardReadyType + OtherError OtherError4BitType + IncorrectVoltage ErrorType + IncorrectVoltageValue Voltage11BitType + IncorrectCurrent ErrorType + IncorrectCurrentValue Current10BitType + IsolationBroken ErrorType + CpLineBroken ErrorType + CpLineGap69 ErrorType + CableReady BoardReadyType + NotReadyCpu ErrorType + NotReadySecc ErrorType + ContactorOutputError ErrorType + DebugContactorOutputEnabled BooleanType + OutputCircuitBreakerEnabled ErrorType + OutputCircuitBreakerEnabledValue SignedVoltage12bitType +} + +type PuDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugContactorOutputOn DebugSwitchModeType +} + +type SeccTargetEnergy struct { + UnitId uint + TargetChargingAllow BooleanType + TargetBatteryVoltage Voltage11BitType + TargetGoalVoltage Voltage11BitType + TargetCurrent Current10BitType +} + +type SeccErrors struct { + UnitId uint + BoardReady BoardReadyType + NotReadyLogic ErrorType +} + +type SignedVoltage12bitType int +type DebugSwitchModeType uint +type OtherError4BitType uint +type ContactorModeType uint +type Power14BitType uint +type AuthStateType uint +type AuthModeType uint type BoardReadyType uint type BooleanType uint type ErrorType uint @@ -114,7 +250,7 @@ func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan Packet { continue } - var unitId uint = uint((frame.CanId & UNIT_ID_MASK) >> UNIT_ID_OFFSET) + var unitId = uint((frame.CanId & UNIT_ID_MASK) >> UNIT_ID_OFFSET) switch { case frame.CanId&ACTION_ID_MASK == can.CAN_ID_071: @@ -263,18 +399,66 @@ func get(from uint, size uint, buffer []byte) (uint64, bool) { } } -func (t ContactorInternalState) GetUnitId() uint { +func (t *ContactorInternalState) GetUnitId() uint { return t.UnitId } -func (t ContactorInternalErrors) GetUnitId() uint { +func (t *ContactorInternalErrors) GetUnitId() uint { return t.UnitId } -func (t PuPresentEnergy) GetUnitId() uint { +func (t *PuPresentEnergy) GetUnitId() uint { return t.UnitId } -func (t PuPeriphery) GetUnitId() uint { +func (t *PuPeriphery) GetUnitId() uint { return t.UnitId } + +func (a *LogicAuth) GetUnitId() uint { + return a.UnitId +} + +func (l *LogicEnergyMode) GetUnitId() uint { + return l.UnitId +} + +func (l *LogicWorkingMode) GetUnitId() uint { + return l.UnitId +} + +func (c *CpuPresentEnergy) GetUnitId() uint { + return c.UnitId +} + +func (c *CpuPeriphery) GetUnitId() uint { + return c.UnitId +} + +func (c *CpuEnergySettings) GetUnitId() uint { + return c.UnitId +} + +func (c *CpuErrors) GetUnitId() uint { + return c.UnitId +} + +func (d *CpuDebug) GetUnitId() uint { + return d.UnitId +} + +func (p *PuErrors) GetUnitId() uint { + return p.UnitId +} + +func (d *PuDebug) GetUnitId() uint { + return d.UnitId +} + +func (s *SeccTargetEnergy) GetUnitId() uint { + return s.UnitId +} + +func (e *SeccErrors) GetUnitId() uint { + return e.UnitId +} diff --git a/yabl/protocol_test.go b/yabl/protocol_test.go new file mode 100644 index 0000000..637682c --- /dev/null +++ b/yabl/protocol_test.go @@ -0,0 +1,45 @@ +package yabl + +import ( + "cli-mon/can" + "log" + "testing" + "time" +) + +type parameters struct { + fields []content + interval uint +} + +type content struct { + length uint8 + setter func(uint64 uint64) + last time.Time +} + +func TestStartProtocolParsing(t *testing.T) { + + var cis = ContactorInternalState{} + + var cisMsg = parameters{fields: []content{ + {length: 3, setter: cis.setContactorReady}, + {length: 2, setter: cis.setContactorOn}, + {length: 2, setter: cis.setUnexpectedState}, + {length: 2, setter: cis.setIsolated}, + {length: 2, setter: cis.setDebugEnabled}, + }} + + var messages = map[uint]parameters{ + can.CAN_ID_071: cisMsg, + } + + // try to use + var values = messages[can.CAN_ID_071] + for num, item := range values.fields { + item.setter(uint64(num)) + + log.Println(cis) + } + +} diff --git a/yabl/setters.go b/yabl/setters.go new file mode 100644 index 0000000..1c74445 --- /dev/null +++ b/yabl/setters.go @@ -0,0 +1,341 @@ +package yabl + +func (t *ContactorInternalState) setContactorReady(val uint64) { + t.ContactorReady = BoardReadyType(val) +} + +func (t *ContactorInternalState) setContactorOn(val uint64) { + t.ContactorOn = BooleanType(val) +} + +func (t *ContactorInternalState) setUnexpectedState(val uint64) { + t.UnexpectedState = ErrorType(val) +} + +func (t *ContactorInternalState) setIsolated(val uint64) { + t.Isolated = ErrorType(val) +} + +func (t *ContactorInternalState) setDebugEnabled(val uint64) { + t.DebugEnabled = BooleanType(val) +} + +func (t *ContactorInternalErrors) setBoardReady(val uint64) { + t.BoardReady = BoardReadyType(val) +} + +func (t *ContactorInternalErrors) setOtherError(val uint64) { + t.OtherError = ContactorInternalOtherErrorType(val) +} + +func (t *ContactorInternalErrors) setContactorGroupChanged(val uint64) { + t.ContactorGroupChanged = ContactorGroupChangedType(val) +} + +func (t *ContactorInternalErrors) setUnexpectedFormation(val uint64) { + t.UnexpectedFormation = ContactorInternalOtherErrorType(val) +} + +func (t *ContactorInternalErrors) setCpuNotReady(val uint64) { + t.CpuNotReady = ErrorType(val) +} + +func (t *ContactorInternalErrors) setPuNotReady(val uint64) { + t.PuNotReady = ErrorType(val) +} + +func (t *ContactorInternalErrors) setDebug(val uint64) { + t.Debug = BooleanType(val) +} + +func (t *PuPresentEnergy) setV2GMode(val uint64) { + t.V2GMode = V2GModeType(val) +} + +func (t *PuPresentEnergy) setVoltageBefore(val uint64) { + t.VoltageBefore = Voltage11BitType(val) +} + +func (t *PuPresentEnergy) setVoltageAfter(val uint64) { + t.VoltageAfter = Voltage11BitType(val) +} + +func (t *PuPresentEnergy) setPresentCurrent(val uint64) { + t.PresentCurrent = Current10BitType(val) +} + +func (t *PuPeriphery) setConnectorInsert(val uint64) { + t.ConnectorInsert = BooleanType(val) +} + +func (t *PuPeriphery) setContactorOn(val uint64) { + t.ContactorOn = BooleanType(val) +} + +func (t *PuPeriphery) setConnectorLocked(val uint64) { + t.ConnectorLocked = BooleanType(val) +} + +func (t *PuPeriphery) setCpLineLevel(val uint64) { + t.CpLineLevel = CpLineLevelType(val) +} + +func (t *PuPeriphery) setIsolationState(val uint64) { + t.IsolationState = IsolationStateType(val) +} + +func (t *PuPeriphery) setChargingAllowed(val uint64) { + t.ChargingAllowed = BooleanType(val) +} + +func (t *PuPeriphery) setPwmEnabled(val uint64) { + t.PwmEnabled = BooleanType(val) +} + +func (t *PuPeriphery) setCpLineVoltage(val uint64) { + t.CpLineVoltage = Voltage9BitType(val) +} + +func (t *LogicAuth) setAuthMode(val uint64) { + t.AuthMode = AuthModeType(val) +} + +func (t *LogicAuth) setAuthState(val uint64) { + t.AuthState = AuthStateType(val) +} + +func (l *LogicWorkingMode) setTargetContactorMode(val uint64) { + l.TargetContactorMode = ContactorModeType(val) +} + +func (l *LogicWorkingMode) setAvailability(val uint64) { + l.Availability = BooleanType(val) +} + +func (c *CpuPresentEnergy) setPowerDirectionMode(val uint64) { + c.PowerDirectionMode = V2GModeType(val) +} + +func (c *CpuPresentEnergy) setPresentCurrent(val uint64) { + c.PresentCurrent = Current10BitType(val) +} + +func (c *CpuPresentEnergy) setPresentVoltage(val uint64) { + c.PresentVoltage = Voltage11BitType(val) +} + +func (c *CpuPeriphery) setCircuitBreakerInput(val uint64) { + c.CircuitBreakerInput = BooleanType(val) +} + +func (c *CpuPeriphery) setCircuitBreakerPowerCBInput(val uint64) { + c.CircuitBreakerPowerCBInput = BooleanType(val) +} + +func (c *CpuPeriphery) setContactorInput(val uint64) { + c.ContactorInput = BooleanType(val) +} + +func (c *CpuEnergySettings) setCurrentMax(val uint64) { + c.CurrentMax = Current10BitType(val) +} + +func (c *CpuEnergySettings) setVoltageMax(val uint64) { + c.VoltageMax = Voltage11BitType(val) +} + +func (c *CpuEnergySettings) setPowerMax(val uint64) { + c.PowerMax = Power14BitType(val * 100) +} + +func (c *CpuEnergySettings) setTargetBatteryVoltage(val uint64) { + c.TargetBatteryVoltage = Voltage11BitType(val) +} + +func (c *CpuEnergySettings) setTargetGoalVoltage(val uint64) { + c.TargetGoalVoltage = Voltage11BitType(val) +} + +func (c *CpuErrors) setBoardReady(val uint64) { + c.BoardReady = BoardReadyType(val) +} + +func (c *CpuErrors) setOtherError(val uint64) { + c.OtherError = OtherError4BitType(val) +} + +func (c *CpuErrors) setRedButtonHard(val uint64) { + c.RedButtonHard = ErrorType(val) +} + +func (c *CpuErrors) setRedButtonSoft(val uint64) { + c.RedButtonSoft = ErrorType(val) +} + +func (c *CpuErrors) setModulesGone(val uint64) { + c.ModulesGone = ErrorType(val) +} + +func (c *CpuErrors) setGridVoltageHighErr(val uint64) { + c.GridVoltageHighErr = ErrorType(val) +} + +func (c *CpuErrors) setGridVoltageHighWarn(val uint64) { + c.GridVoltageHighWarn = ErrorType(val) +} + +func (c *CpuErrors) setGridVoltageLowWarn(val uint64) { + c.GridVoltageLowWarn = ErrorType(val) +} + +func (c *CpuErrors) setGridVoltageLowErr(val uint64) { + c.GridVoltageLowErr = ErrorType(val) +} + +func (c *CpuErrors) setGridVoltageLow(val uint64) { + c.GridVoltageLow = Voltage11BitType(val) +} + +func (c *CpuErrors) setGridVoltageHigh(val uint64) { + c.GridVoltageHigh = Voltage11BitType(val) +} + +func (c *CpuErrors) setGridVoltageEmpty(val uint64) { + c.GridVoltageEmpty = ErrorType(val) +} + +func (c *CpuErrors) setNotReadySecc(val uint64) { + c.NotReadySecc = ErrorType(val) +} + +func (c *CpuErrors) setNotReadyPu(val uint64) { + c.NotReadyPu = ErrorType(val) +} + +func (c *CpuErrors) setNotReadyContactors(val uint64) { + c.NotReadyContactors = ErrorType(val) +} + +func (c *CpuErrors) setDebugConvertersEnabled(val uint64) { + c.DebugConvertersEnabled = ErrorType(val) +} + +func (c *CpuErrors) setContactorInputError(val uint64) { + c.ContactorInputError = ErrorType(val) +} + +func (c *CpuErrors) setNotReadyPeriphery(val uint64) { + c.NotReadyPeriphery = ErrorType(val) +} + +func (d *CpuDebug) setDebugModeOn(val uint64) { + d.DebugModeOn = BooleanType(val) +} + +func (d *CpuDebug) setDebugContactorInputOn(val uint64) { + d.DebugContactorInputOn = DebugSwitchModeType(val) +} + +func (d *CpuDebug) setDebugCircuitBreakerOn(val uint64) { + d.DebugCircuitBreakerOn = DebugSwitchModeType(val) +} + +func (d *CpuDebug) setDebugRedButtonSoftware(val uint64) { + d.DebugRedButtonSoftware = DebugSwitchModeType(val) +} + +func (p *PuErrors) setBoardReady(val uint64) { + p.BoardReady = BoardReadyType(val) +} + +func (p *PuErrors) setOtherError(val uint64) { + p.OtherError = OtherError4BitType(val) +} + +func (p *PuErrors) setIncorrectVoltage(val uint64) { + p.IncorrectVoltage = ErrorType(val) +} + +func (p *PuErrors) setIncorrectVoltageValue(val uint64) { + p.IncorrectVoltageValue = Voltage11BitType(val) +} + +func (p *PuErrors) setIncorrectCurrent(val uint64) { + p.IncorrectCurrent = ErrorType(val) +} + +func (p *PuErrors) setIncorrectCurrentValue(val uint64) { + p.IncorrectCurrentValue = Current10BitType(val) +} + +func (p *PuErrors) setIsolationBroken(val uint64) { + p.IsolationBroken = ErrorType(val) +} + +func (p *PuErrors) setCpLineBroken(val uint64) { + p.CpLineBroken = ErrorType(val) +} + +func (p *PuErrors) setCpLineGap69(val uint64) { + p.CpLineGap69 = ErrorType(val) +} + +func (p *PuErrors) setCableReady(val uint64) { + p.CableReady = BoardReadyType(val) +} + +func (p *PuErrors) setNotReadyCpu(val uint64) { + p.NotReadyCpu = ErrorType(val) +} + +func (p *PuErrors) setNotReadySecc(val uint64) { + p.NotReadySecc = ErrorType(val) +} + +func (p *PuErrors) setContactorOutputError(val uint64) { + p.ContactorOutputError = ErrorType(val) +} + +func (p *PuErrors) setDebugContactorOutputEnabled(val uint64) { + p.DebugContactorOutputEnabled = BooleanType(val) +} + +func (p *PuErrors) setOutputCircuitBreakerEnabled(val uint64) { + p.OutputCircuitBreakerEnabled = ErrorType(val) +} + +func (p *PuErrors) setOutputCircuitBreakerEnabledValue(val uint64) { + p.OutputCircuitBreakerEnabledValue = SignedVoltage12bitType(val - 1000) +} + +func (d *PuDebug) setDebugModeOn(val uint64) { + d.DebugModeOn = BooleanType(val) +} + +func (d *PuDebug) setDebugContactorOutputOn(val uint64) { + d.DebugContactorOutputOn = DebugSwitchModeType(val) +} + +func (s *SeccTargetEnergy) setTargetChargingAllow(val uint64) { + s.TargetChargingAllow = BooleanType(val) +} + +func (s *SeccTargetEnergy) setTargetBatteryVoltage(val uint64) { + s.TargetBatteryVoltage = Voltage11BitType(val) +} + +func (s *SeccTargetEnergy) setTargetGoalVoltage(val uint64) { + s.TargetGoalVoltage = Voltage11BitType(val) +} + +func (s *SeccTargetEnergy) setTargetCurrent(val uint64) { + s.TargetCurrent = Current10BitType(val) +} + +func (e *SeccErrors) setBoardReady(val uint64) { + e.BoardReady = BoardReadyType(val) +} + +func (e *SeccErrors) setNotReadyLogic(val uint64) { + e.NotReadyLogic = ErrorType(val) +} diff --git a/yabl/strings.go b/yabl/strings.go index a44789f..a748f9a 100644 --- a/yabl/strings.go +++ b/yabl/strings.go @@ -109,8 +109,8 @@ func (t CpLineLevelType) String() string { func (t IsolationStateType) String() string { switch t { - case UNKNOWN: - return "UNKNOWN" + case ISOLATION_STATE_UNKNOWN: + return "ISOLATION_STATE_UNKNOWN" case ONGOING: return "ONGOING" case PASSED: @@ -127,3 +127,75 @@ func (t IsolationStateType) String() string { func (t Voltage9BitType) String() string { return fmt.Sprintf("%.1fV", t) } + +func (t AuthModeType) String() string { + switch t { + case AUTH: + return "AUTH" + case PNC: + return "PNC" + default: + panic("AuthModeType not defended") + } +} + +func (a AuthStateType) String() string { + switch a { + case AUTH_STATE_UNKNOWN: + return "UNKNOWN" + case AUTH_STATE_ALLOW: + return "ALLOW" + case AUTH_STATE_DENY: + return "DENY" + default: + panic("AuthStateType not defended") + } +} + +func (p Power14BitType) String() string { + return fmt.Sprintf("%dW", p) +} + +func (c ContactorModeType) String() string { + switch c { + case CONTACTOR_NO_MODE: + return "NO_MODE" + case CONTACTOR_TRANSACTION_PROCESS: + return "TRANSACTION_PROCESS" + case CONTACTOR_CUSTOM_MODE: + return "CUSTOM_MODE" + case CONTACTOR_ONLY_ONE_OUT_MODE: + return "ONLY_ONE_OUT_MODE" + case CONTACTOR_ONE_TO_ONE_OUT_MODE: + return "ONE_TO_ONE_OUT_MODE" + case CONTACTOR_SIMPLE_DYNAMIC_MODE: + return "SIMPLE_DYNAMIC_MODE" + default: + panic("ContactorModeType not defended") + } +} + +func (e OtherError4BitType) String() string { + return fmt.Sprintf("ErrCode_%d", e) +} + +func (d DebugSwitchModeType) String() string { + switch d { + case DEBUG_SWITCH_MODE_AUTO: + return "AUTO" + case DEBUG_SWITCH_MODE_OFF: + return "OFF" + case DEBUG_SWITCH_MODE_ON: + return "ON" + case DEBUG_SWITCH_MODE_PERMANENT_OFF: + return "PERMANENT_OFF" + case DEBUG_SWITCH_MODE_PERMANENT_ON: + return "PERMANENT_ON" + default: + panic("DebugSwitchModeType not defended") + } +} + +func (s SignedVoltage12bitType) String() string { + return fmt.Sprintf("%d", s) +} -- 2.54.0 From c7d660a762857864e73ffccf17627a5c620da6e3 Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Thu, 6 Jul 2023 00:30:01 +0300 Subject: [PATCH 02/15] New data, complete initialization --- can/can.go | 42 ++++ yabl/protocol.go | 537 ++++++++++++++++++++++++++++++++++++++++++++++- yabl/setters.go | 270 +++++++++++++++++++++++- yabl/strings.go | 12 ++ 4 files changed, 859 insertions(+), 2 deletions(-) diff --git a/can/can.go b/can/can.go index f441dc4..1bc6b6e 100644 --- a/can/can.go +++ b/can/can.go @@ -13,8 +13,29 @@ import ( const CAN_ID_071 = 0x071 const CAN_ID_073 = 0x073 +const CAN_ID_074 = 0x074 +const CAN_ID_075 = 0x075 const CAN_ID_021 = 0x021 const CAN_ID_022 = 0x022 +const CAN_ID_023 = 0x023 +const CAN_ID_011 = 0x011 +const CAN_ID_014 = 0x014 +const CAN_ID_015 = 0x015 +const CAN_ID_016 = 0x016 +const CAN_ID_01A = 0x01A +const CAN_ID_02A = 0x02A +const CAN_ID_041 = 0x041 +const CAN_ID_042 = 0x042 +const CAN_ID_046 = 0x046 +const CAN_ID_047 = 0x047 +const CAN_ID_048 = 0x048 +const CAN_ID_049 = 0x049 +const CAN_ID_067 = 0x067 +const CAN_ID_068 = 0x068 +const CAN_ID_06C = 0x06C +const CAN_ID_061 = 0x061 +const CAN_ID_062 = 0x062 +const CAN_ID_065 = 0x065 type CanFrame struct { CanId uint32 @@ -109,8 +130,29 @@ func StartCan(canbus string) (<-chan *CanFrame, error) { var filter []unix.CanFilter = []unix.CanFilter{ {Id: CAN_ID_071, Mask: 0xFFF}, {Id: CAN_ID_073, Mask: 0xFFF}, + {Id: CAN_ID_074, Mask: 0xFFF}, + {Id: CAN_ID_075, Mask: 0xFFF}, {Id: CAN_ID_021, Mask: 0xFFF}, {Id: CAN_ID_022, Mask: 0xFFF}, + {Id: CAN_ID_011, Mask: 0xFFF}, + {Id: CAN_ID_014, Mask: 0xFFF}, + {Id: CAN_ID_015, Mask: 0xFFF}, + {Id: CAN_ID_016, Mask: 0xFFF}, + {Id: CAN_ID_01A, Mask: 0xFFF}, + {Id: CAN_ID_023, Mask: 0xFFF}, + {Id: CAN_ID_02A, Mask: 0xFFF}, + {Id: CAN_ID_041, Mask: 0xFFF}, + {Id: CAN_ID_042, Mask: 0xFFF}, + {Id: CAN_ID_046, Mask: 0xFFF}, + {Id: CAN_ID_047, Mask: 0xFFF}, + {Id: CAN_ID_048, Mask: 0xFFF}, + {Id: CAN_ID_049, Mask: 0xFFF}, + {Id: CAN_ID_067, Mask: 0xFFF}, + {Id: CAN_ID_068, Mask: 0xFFF}, + {Id: CAN_ID_06C, Mask: 0xFFF}, + {Id: CAN_ID_061, Mask: 0xFFF}, + {Id: CAN_ID_062, Mask: 0xFFF}, + {Id: CAN_ID_065, Mask: 0xFFF}, } if socket, err := NewCan(); err == nil { diff --git a/yabl/protocol.go b/yabl/protocol.go index a0915c3..a242201 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -3,11 +3,14 @@ package yabl import ( "cli-mon/can" "encoding/binary" + "time" ) const ( + CONVERTERS_MAX = 18 + 1 CONTACTOR_MAX = 18 + 1 - CONNECTOR_MAX = 6 + 1 + CONNECTOR_COUNT = 6 + CONNECTOR_MAX = CONNECTOR_COUNT + 1 ALL_BITS = 0xFFFFFFFFFFFFFFFF UNIT_ID_OFFSET = 12 UNIT_ID_MASK = 0b111111111111 << UNIT_ID_OFFSET @@ -81,6 +84,19 @@ type ContactorInternalErrors struct { CpuNotReady ErrorType PuNotReady ErrorType Debug BooleanType + PresentContactorMode ContactorModeType +} + +type ContactorsInternalForce struct { + UnitId uint + ForceModeEnabled BooleanType + ForceModeValue ForceModeType +} + +type ContactorInternalDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugContactorOn DebugSwitchModeType } type PuPresentEnergy struct { @@ -117,6 +133,12 @@ type LogicEnergyMode struct { PowerMax Power14BitType } +type LogicErrors struct { + UnitId uint + BoardReady BoardReadyType + NotReadySettings ErrorType +} + type LogicWorkingMode struct { UnitId uint TargetContactorMode ContactorModeType @@ -216,6 +238,89 @@ type SeccErrors struct { NotReadyLogic ErrorType } +type PeripheryState struct { + UnitId uint + OtherErrorSeverity BoardReadyType + OtherError OtherError4BitType + ErrorShakeSensor ErrorType + ErrorCoolingGroup ErrorType + PeripheryErrorCoolingGroup ErrorType + ErrorFireEmergency ErrorType + ErrorFireEmergencyRun ErrorType + ErrorFireEmergencyControl ErrorType + ErrorOvervoltageIn ErrorType + PeripheryErrorPowerSupply ErrorType + ErrorFan ErrorType + ErrorOvervoltageOut ErrorType + ErrorStateRemoteMode ErrorType + DebugShsnFanEnabled BooleanType + DebugShptFanEnabled BooleanType + DebugIoBoardTestLampEnabled BooleanType + ErrorFireEmergencyCircuitBreaker ErrorType + ErrorExtLightCircuitBreaker ErrorType + ErrorIndicationCircuitBreaker ErrorType + ErrorLowVoltagePowerCircuitBreaker ErrorType + ErrorContactorsInternalCircuitBreaker ErrorType + ErrorPlcCircuitBreaker ErrorType +} + +type PeripheryInfo struct { + UnitId uint + InfoDoorOpen BooleanType + TempAirIn SignedAirTemp8BitType + TempAirOut SignedAirTemp8BitType + StateShsnFan BooleanType + StateShptFan BooleanType +} + +type PeripheryDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugShsnFan DebugSwitchModeType + DebugShptFan DebugSwitchModeType + DebugIoBoardTestLamp DebugSwitchModeType +} + +type ConverterPresentEnergy struct { + UnitId uint + V2gMode V2GModeType + PresentVoltage Voltage11BitType + PresentCurrent Current10BitType + ConnectedOut ConnectedOut8bitType +} + +type ConverterErrors struct { + UnitId uint + BoardReady BoardReadyType + OtherError OtherError4BitType + NotConnectedOut ErrorType + NoCommunicationConverter ErrorType + NoCommunicationPuConverter ErrorType + InputGridVoltageHigh ErrorType + InputGridVoltageLow ErrorType + OutputGridVoltageHigh ErrorType + OutputGridVoltageLow ErrorType + InputGridVoltage Voltage11BitType + OutputGridVoltage Voltage11BitType + ShortCircuit ErrorType + OverHeat ErrorType + FanBroken ErrorType + OtherHardwareError ErrorType + DebugConvEnabled BooleanType + DebugConvDisabled BooleanType +} + +type ConverterDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugEnergyOn DebugSwitchModeType + DebugTargetVoltage Voltage11BitType + DebugTargetCurrent Current10BitType +} + +type SignedAirTemp8BitType int +type ConnectedOut8bitType uint +type ForceModeType uint type SignedVoltage12bitType int type DebugSwitchModeType uint type OtherError4BitType uint @@ -235,6 +340,400 @@ type CpLineLevelType uint type IsolationStateType uint type Voltage9BitType float32 +type parameters struct { + fields []content + interval uint +} + +type content struct { + length uint8 + setter func(uint64 uint64) + value uint64 + last time.Time +} + +type key struct { + canId, unitId uint +} + +var protocolMap map[key]parameters +var cpuPresentEnergyArray [CONNECTOR_MAX]*CpuPresentEnergy +var cpuPeripheryInstance *CpuPeriphery +var cpuEnergySettingsArray [CONNECTOR_MAX]*CpuEnergySettings +var cpuErrorsInstance *CpuErrors +var cpuDebugInstance *CpuDebug +var puPresentEnergyArray [CONNECTOR_MAX]*PuPresentEnergy +var puPeripheryArray [CONNECTOR_MAX]*PuPeriphery +var puErrorsArray [CONNECTOR_MAX]*PuErrors +var puDebugArray [CONNECTOR_MAX]*PuDebug +var seccTargetEnergyArray [CONNECTOR_MAX]*SeccTargetEnergy +var seccErrorsArray [CONNECTOR_MAX]*SeccErrors +var logicAuthArray [CONNECTOR_MAX]*LogicAuth +var logicEnergyMode [CONNECTOR_MAX]*LogicEnergyMode +var logicErrorsInstance *LogicErrors +var logicWorkingMode *LogicWorkingMode +var contactorInternalStateArray [CONNECTOR_MAX]*ContactorInternalState +var contactorInternalErrorsInstance *ContactorInternalErrors +var contactorsInternalForce *ContactorsInternalForce +var contactorInternalDebugArray [CONNECTOR_MAX]*ContactorInternalDebug +var peripheryStateArray [CONNECTOR_MAX]*PeripheryState +var peripheryInfoArray [CONNECTOR_MAX]*PeripheryInfo +var peripheryDebugArray [CONNECTOR_MAX]*PeripheryDebug +var converterPresentEnergyArray [CONVERTERS_MAX]*ConverterPresentEnergy +var converterErrorsArray [CONVERTERS_MAX]*ConverterErrors +var converterDebugArray [CONVERTERS_MAX]*ConverterDebug + +func init() { + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_011, uint(i)} + cpe := CpuPresentEnergy{} + cpuPresentEnergyArray[i] = &cpe + fields := []content{ + {length: 2, setter: cpe.setPowerDirectionMode}, + {length: 10, setter: cpe.setPresentCurrent}, + {length: 11, setter: cpe.setPresentVoltage}, + } + protocolMap[key] = parameters{fields: fields, interval: 50} + } + + cpuPeripheryInstance = &CpuPeriphery{} + fields := []content{ + {length: 2, setter: cpuPeripheryInstance.setContactorInput}, + {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerInput}, + {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerPowerCBInput}, + } + protocolMap[key{can.CAN_ID_014, 0}] = parameters{fields: fields, interval: 1000} + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_015, uint(i)} + ces := CpuEnergySettings{} + cpuEnergySettingsArray[i] = &ces + fields := []content{ + {length: 10, setter: ces.setCurrentMax}, + {length: 11, setter: ces.setVoltageMax}, + {length: 14, setter: ces.setPowerMax}, + {length: 11, setter: ces.setTargetBatteryVoltage}, + {length: 11, setter: ces.setTargetGoalVoltage}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + cpuErrorsInstance = &CpuErrors{} + fields = []content{ + {length: 3, setter: cpuErrorsInstance.setBoardReady}, + {length: 4, setter: cpuErrorsInstance.setOtherError}, + {length: 2, setter: cpuErrorsInstance.setRedButtonHard}, + {length: 2, setter: cpuErrorsInstance.setRedButtonSoft}, + {length: 2, setter: cpuErrorsInstance.setModulesGone}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageHighErr}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageHighWarn}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageLowWarn}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageLowErr}, + {length: 11, setter: cpuErrorsInstance.setGridVoltageLow}, + {length: 11, setter: cpuErrorsInstance.setGridVoltageHigh}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageEmpty}, + {length: 2, setter: cpuErrorsInstance.setNotReadySecc}, + {length: 2, setter: cpuErrorsInstance.setNotReadyPu}, + {length: 2, setter: cpuErrorsInstance.setNotReadyContactors}, + {length: 2, setter: cpuErrorsInstance.setDebugConvertersEnabled}, + {length: 2, setter: cpuErrorsInstance.setContactorInputError}, + {length: 2, setter: cpuErrorsInstance.setNotReadyPeriphery}, + } + protocolMap[key{can.CAN_ID_016, 0}] = parameters{fields: fields, interval: 1000} + + cpuDebugInstance = &CpuDebug{} + fields = []content{ + {length: 2, setter: cpuDebugInstance.setDebugModeOn}, + {length: 3, setter: cpuDebugInstance.setDebugContactorInputOn}, + {length: 3, setter: cpuDebugInstance.setDebugCircuitBreakerOn}, + {length: 3, setter: cpuDebugInstance.setDebugRedButtonSoftware}, + } + protocolMap[key{can.CAN_ID_01A, 0}] = parameters{fields: fields, interval: 1000} + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_021, uint(i)} + ppe := PuPresentEnergy{} + puPresentEnergyArray[i] = &ppe + fields := []content{ + {length: 2, setter: ppe.setV2GMode}, + {length: 11, setter: ppe.setVoltageBefore}, + {length: 11, setter: ppe.setVoltageAfter}, + {length: 10, setter: ppe.setPresentCurrent}, + } + protocolMap[key] = parameters{fields: fields, interval: 50} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_022, uint(i)} + pp := PuPeriphery{} + puPeripheryArray[i] = &pp + fields := []content{ + {length: 2, setter: pp.setConnectorInsert}, + {length: 2, setter: pp.setContactorOn}, + {length: 2, setter: pp.setConnectorLocked}, + {length: 3, setter: pp.setCpLineLevel}, + {length: 3, setter: pp.setIsolationState}, + {length: 2, setter: pp.setChargingAllowed}, + {length: 2, setter: pp.setPwmEnabled}, + {length: 9, setter: pp.setCpLineVoltage}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_023, uint(i)} + pe := PuErrors{} + puErrorsArray[i] = &pe + fields := []content{ + {length: 3, setter: pe.setBoardReady}, + {length: 4, setter: pe.setOtherError}, + {length: 2, setter: pe.setIncorrectVoltage}, + {length: 11, setter: pe.setIncorrectVoltageValue}, + {length: 2, setter: pe.setIncorrectCurrent}, + {length: 10, setter: pe.setIncorrectCurrentValue}, + {length: 2, setter: pe.setIsolationBroken}, + {length: 2, setter: pe.setCpLineBroken}, + {length: 2, setter: pe.setCpLineGap69}, + {length: 3, setter: pe.setCableReady}, + {length: 2, setter: pe.setNotReadyCpu}, + {length: 2, setter: pe.setNotReadySecc}, + {length: 2, setter: pe.setContactorOutputError}, + {length: 2, setter: pe.setDebugContactorOutputEnabled}, + {length: 2, setter: pe.setOutputCircuitBreakerEnabled}, + {length: 12, setter: pe.setOutputCircuitBreakerEnabledValue}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_02A, uint(i)} + pd := PuDebug{} + puDebugArray[i] = &pd + fields = []content{ + {length: 2, setter: pd.setDebugModeOn}, + {length: 3, setter: pd.setDebugContactorOutputOn}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_041, uint(i)} + ste := SeccTargetEnergy{} + seccTargetEnergyArray[i] = &ste + fields = []content{ + {length: 2, setter: ste.setTargetChargingAllow}, + {length: 11, setter: ste.setTargetBatteryVoltage}, + {length: 11, setter: ste.setTargetGoalVoltage}, + {length: 10, setter: ste.setTargetCurrent}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_042, uint(i)} + se := SeccErrors{} + seccErrorsArray[i] = &se + fields = []content{ + {length: 3, setter: se.setBoardReady}, + {length: 2, setter: se.setNotReadyLogic}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_046, uint(i)} + la := LogicAuth{} + logicAuthArray[i] = &la + fields = []content{ + {length: 2, setter: la.setAuthMode}, + {length: 3, setter: la.setAuthState}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_047, uint(i)} + la := LogicEnergyMode{} + logicEnergyMode[i] = &la + fields = []content{ + {length: 2, setter: la.setV2gMode}, + {length: 10, setter: la.setCurrentMax}, + {length: 11, setter: la.setVoltageMax}, + {length: 14, setter: la.setPowerMax}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + logicErrorsInstance = &LogicErrors{} + fields = []content{ + {length: 3, setter: logicErrorsInstance.setBoardReady}, + {length: 2, setter: logicErrorsInstance.setNotReadySettings}, + } + protocolMap[key{can.CAN_ID_048, 0}] = parameters{fields: fields, interval: 1000} + + logicWorkingMode = &LogicWorkingMode{} + fields = []content{ + {length: 5, setter: logicWorkingMode.setTargetContactorMode}, + {length: 2, setter: logicWorkingMode.setAvailability}, + } + protocolMap[key{can.CAN_ID_049, 0}] = parameters{fields: fields, interval: 1000} + + for i := 0; i <= CONTACTOR_MAX; i++ { + key := key{can.CAN_ID_071, uint(i)} + cis := ContactorInternalState{} + contactorInternalStateArray[i] = &cis + fields = []content{ + {length: 3, setter: cis.setContactorReady}, + {length: 2, setter: cis.setContactorOn}, + {length: 2, setter: cis.setUnexpectedState}, + {length: 2, setter: cis.setIsolated}, + {length: 2, setter: cis.setDebugEnabled}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + contactorInternalErrorsInstance = &ContactorInternalErrors{} + fields = []content{ + {length: 3, setter: contactorInternalErrorsInstance.setBoardReady}, + {length: 4, setter: contactorInternalErrorsInstance.setOtherError}, + {length: 3, setter: contactorInternalErrorsInstance.setContactorGroupChanged}, + {length: 4, setter: contactorInternalErrorsInstance.setUnexpectedFormation}, + {length: 2, setter: contactorInternalErrorsInstance.setCpuNotReady}, + {length: 2, setter: contactorInternalErrorsInstance.setPuNotReady}, + {length: 2, setter: contactorInternalErrorsInstance.setDebug}, + {length: 5, setter: contactorInternalErrorsInstance.setPresentContactorMode}, + } + protocolMap[key{can.CAN_ID_073, 0}] = parameters{fields: fields, interval: 1000} + + contactorsInternalForce = &ContactorsInternalForce{} + fields = []content{ + {length: 2, setter: contactorsInternalForce.setForceModeEnabled}, + {length: 4, setter: contactorsInternalForce.setForceModeValue}, + } + protocolMap[key{can.CAN_ID_074, 0}] = parameters{fields: fields, interval: 1000} + + for i := 0; i <= CONTACTOR_MAX; i++ { + key := key{can.CAN_ID_075, uint(i)} + cid := ContactorInternalDebug{} + contactorInternalDebugArray[i] = &cid + fields = []content{ + {length: 2, setter: cid.setDebugModeOn}, + {length: 3, setter: cid.setDebugContactorOn}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_067, uint(i)} + ps := PeripheryState{} + peripheryStateArray[i] = &ps + fields = []content{ + {length: 3, setter: ps.setOtherErrorSeverity}, + {length: 4, setter: ps.setOtherError}, + {length: 2, setter: ps.setErrorShakeSensor}, + {length: 2, setter: ps.setErrorCoolingGroup}, + {length: 2, setter: ps.setPeripheryErrorCoolingGroup}, + {length: 2, setter: ps.setErrorFireEmergency}, + {length: 2, setter: ps.setErrorFireEmergencyRun}, + {length: 2, setter: ps.setErrorFireEmergencyControl}, + {length: 2, setter: ps.setErrorOvervoltageIn}, + {length: 2, setter: ps.setPeripheryErrorPowerSupply}, + {length: 2, setter: ps.setErrorFan}, + {length: 2, setter: ps.setErrorOvervoltageOut}, + {length: 2, setter: ps.setErrorStateRemoteMode}, + {length: 2, setter: ps.setDebugShsnFanEnabled}, + {length: 2, setter: ps.setDebugShptFanEnabled}, + {length: 2, setter: ps.setDebugIoBoardTestLampEnabled}, + {length: 2, setter: ps.setErrorFireEmergencyCircuitBreaker}, + {length: 2, setter: ps.setErrorExtLightCircuitBreaker}, + {length: 2, setter: ps.setErrorIndicationCircuitBreaker}, + {length: 2, setter: ps.setErrorLowVoltagePowerCircuitBreaker}, + {length: 2, setter: ps.setErrorContactorsInternalCircuitBreaker}, + {length: 2, setter: ps.setErrorPlcCircuitBreaker}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_068, uint(i)} + pi := PeripheryInfo{} + peripheryInfoArray[i] = &pi + fields = []content{ + {length: 2, setter: pi.setInfoDoorOpen}, + {length: 8, setter: pi.setTempAirIn}, + {length: 8, setter: pi.setTempAirOut}, + {length: 2, setter: pi.setStateShsnFan}, + {length: 2, setter: pi.setStateShptFan}, + } + protocolMap[key] = parameters{fields: fields, interval: 5000} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_06C, uint(i)} + pd := PeripheryDebug{} + peripheryDebugArray[i] = &pd + fields = []content{ + {length: 2, setter: pd.setDebugModeOn}, + {length: 3, setter: pd.setDebugShsnFan}, + {length: 3, setter: pd.setDebugShptFan}, + {length: 3, setter: pd.setDebugIoBoardTestLamp}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 1; i <= CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_061, uint(i)} + cpe := ConverterPresentEnergy{} + converterPresentEnergyArray[i] = &cpe + fields = []content{ + {length: 2, setter: cpe.setV2gMode}, + {length: 11, setter: cpe.setPresentVoltage}, + {length: 10, setter: cpe.setPresentCurrent}, + {length: 8, setter: cpe.setConnectedOut}, + } + protocolMap[key] = parameters{fields: fields, interval: 500} + } + + for i := 1; i <= CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_062, uint(i)} + ce := ConverterErrors{} + converterErrorsArray[i] = &ce + fields = []content{ + {length: 3, setter: ce.setBoardReady}, + {length: 4, setter: ce.setOtherError}, + {length: 2, setter: ce.setNotConnectedOut}, + {length: 2, setter: ce.setNoCommunicationConverter}, + {length: 2, setter: ce.setNoCommunicationPuConverter}, + {length: 2, setter: ce.setInputGridVoltageHigh}, + {length: 2, setter: ce.setInputGridVoltageLow}, + {length: 2, setter: ce.setOutputGridVoltageHigh}, + {length: 2, setter: ce.setOutputGridVoltageLow}, + {length: 11, setter: ce.setInputGridVoltage}, + {length: 11, setter: ce.setOutputGridVoltage}, + {length: 2, setter: ce.setShortCircuit}, + {length: 2, setter: ce.setOverHeat}, + {length: 2, setter: ce.setFanBroken}, + {length: 2, setter: ce.setOtherHardwareError}, + {length: 2, setter: ce.setDebugConvEnabled}, + {length: 2, setter: ce.setDebugConvDisabled}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } + + for i := 0; i <= CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_065, uint(i)} + cd := ConverterDebug{} + converterDebugArray[i] = &cd + fields = []content{ + {length: 3, setter: cd.setDebugModeOn}, + {length: 4, setter: cd.setDebugEnergyOn}, + {length: 2, setter: cd.setDebugTargetVoltage}, + {length: 2, setter: cd.setDebugTargetCurrent}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000} + } +} + func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan Packet { result := make(chan Packet) @@ -423,6 +922,10 @@ func (l *LogicEnergyMode) GetUnitId() uint { return l.UnitId } +func (l *LogicErrors) GetUnitId() uint { + return l.UnitId +} + func (l *LogicWorkingMode) GetUnitId() uint { return l.UnitId } @@ -462,3 +965,35 @@ func (s *SeccTargetEnergy) GetUnitId() uint { func (e *SeccErrors) GetUnitId() uint { return e.UnitId } + +func (c *ContactorsInternalForce) GetUnitId() uint { + return c.UnitId +} + +func (c *ContactorInternalDebug) GetUnitId() uint { + return c.UnitId +} + +func (p *PeripheryState) GetUnitId() uint { + return p.UnitId +} + +func (p *PeripheryInfo) GetUnitId() uint { + return p.UnitId +} + +func (p *PeripheryDebug) GetUnitId() uint { + return p.UnitId +} + +func (c *ConverterPresentEnergy) GetUnitId() uint { + return c.UnitId +} + +func (c *ConverterErrors) GetUnitId() uint { + return c.UnitId +} + +func (c *ConverterDebug) GetUnitId() uint { + return c.UnitId +} diff --git a/yabl/setters.go b/yabl/setters.go index 1c74445..00ca94a 100644 --- a/yabl/setters.go +++ b/yabl/setters.go @@ -48,6 +48,10 @@ func (t *ContactorInternalErrors) setDebug(val uint64) { t.Debug = BooleanType(val) } +func (t *ContactorInternalErrors) setPresentContactorMode(val uint64) { + t.PresentContactorMode = ContactorModeType(val) +} + func (t *PuPresentEnergy) setV2GMode(val uint64) { t.V2GMode = V2GModeType(val) } @@ -93,7 +97,7 @@ func (t *PuPeriphery) setPwmEnabled(val uint64) { } func (t *PuPeriphery) setCpLineVoltage(val uint64) { - t.CpLineVoltage = Voltage9BitType(val) + t.CpLineVoltage = Voltage9BitType(val)/10 - 15 } func (t *LogicAuth) setAuthMode(val uint64) { @@ -339,3 +343,267 @@ func (e *SeccErrors) setBoardReady(val uint64) { func (e *SeccErrors) setNotReadyLogic(val uint64) { e.NotReadyLogic = ErrorType(val) } + +func (l *LogicEnergyMode) setV2gMode(val uint64) { + l.V2gMode = V2GModeType(val) +} + +func (l *LogicEnergyMode) setCurrentMax(val uint64) { + l.CurrentMax = Current10BitType(val) +} + +func (l *LogicEnergyMode) setVoltageMax(val uint64) { + l.VoltageMax = Voltage11BitType(val) +} + +func (l *LogicEnergyMode) setPowerMax(val uint64) { + l.PowerMax = Power14BitType(val * 100) +} + +func (l *LogicErrors) setBoardReady(val uint64) { + l.BoardReady = BoardReadyType(val) +} + +func (l *LogicErrors) setNotReadySettings(val uint64) { + l.NotReadySettings = ErrorType(val) +} + +func (c *ContactorsInternalForce) setForceModeEnabled(val uint64) { + c.ForceModeEnabled = BooleanType(val) +} + +func (c *ContactorsInternalForce) setForceModeValue(val uint64) { + c.ForceModeValue = ForceModeType(val) +} + +func (c *ContactorInternalDebug) setDebugModeOn(val uint64) { + c.DebugModeOn = BooleanType(val) +} + +func (c *ContactorInternalDebug) setDebugContactorOn(val uint64) { + c.DebugContactorOn = DebugSwitchModeType(val) +} + +func (p *PeripheryState) setOtherErrorSeverity(val uint64) { + p.OtherErrorSeverity = BoardReadyType(val) +} + +func (p *PeripheryState) setOtherError(val uint64) { + p.OtherError = OtherError4BitType(val) +} + +func (p *PeripheryState) setErrorShakeSensor(val uint64) { + p.ErrorShakeSensor = ErrorType(val) +} + +func (p *PeripheryState) setErrorCoolingGroup(val uint64) { + p.ErrorCoolingGroup = ErrorType(val) +} + +func (p *PeripheryState) setPeripheryErrorCoolingGroup(val uint64) { + p.PeripheryErrorCoolingGroup = ErrorType(val) +} + +func (p *PeripheryState) setErrorFireEmergency(val uint64) { + p.ErrorFireEmergency = ErrorType(val) +} + +func (p *PeripheryState) setErrorFireEmergencyRun(val uint64) { + p.ErrorFireEmergencyRun = ErrorType(val) +} + +func (p *PeripheryState) setErrorFireEmergencyControl(val uint64) { + p.ErrorFireEmergencyControl = ErrorType(val) +} + +func (p *PeripheryState) setErrorOvervoltageIn(val uint64) { + p.ErrorOvervoltageIn = ErrorType(val) +} + +func (p *PeripheryState) setPeripheryErrorPowerSupply(val uint64) { + p.PeripheryErrorPowerSupply = ErrorType(val) +} + +func (p *PeripheryState) setErrorFan(val uint64) { + p.ErrorFan = ErrorType(val) +} + +func (p *PeripheryState) setErrorOvervoltageOut(val uint64) { + p.ErrorOvervoltageOut = ErrorType(val) +} + +func (p *PeripheryState) setErrorStateRemoteMode(val uint64) { + p.ErrorStateRemoteMode = ErrorType(val) +} + +func (p *PeripheryState) setDebugShsnFanEnabled(val uint64) { + p.DebugShsnFanEnabled = BooleanType(val) +} + +func (p *PeripheryState) setDebugShptFanEnabled(val uint64) { + p.DebugShptFanEnabled = BooleanType(val) +} + +func (p *PeripheryState) setDebugIoBoardTestLampEnabled(val uint64) { + p.DebugIoBoardTestLampEnabled = BooleanType(val) +} + +func (p *PeripheryState) setErrorFireEmergencyCircuitBreaker(val uint64) { + p.ErrorFireEmergencyCircuitBreaker = ErrorType(val) +} + +func (p *PeripheryState) setErrorExtLightCircuitBreaker(val uint64) { + p.ErrorExtLightCircuitBreaker = ErrorType(val) +} + +func (p *PeripheryState) setErrorIndicationCircuitBreaker(val uint64) { + p.ErrorIndicationCircuitBreaker = ErrorType(val) +} + +func (p *PeripheryState) setErrorLowVoltagePowerCircuitBreaker(val uint64) { + p.ErrorLowVoltagePowerCircuitBreaker = ErrorType(val) +} + +func (p *PeripheryState) setErrorContactorsInternalCircuitBreaker(val uint64) { + p.ErrorContactorsInternalCircuitBreaker = ErrorType(val) +} + +func (p *PeripheryState) setErrorPlcCircuitBreaker(val uint64) { + p.ErrorPlcCircuitBreaker = ErrorType(val) +} + +func (p *PeripheryInfo) setInfoDoorOpen(val uint64) { + p.InfoDoorOpen = BooleanType(val) +} + +func (p *PeripheryInfo) setTempAirIn(val uint64) { + p.TempAirIn = SignedAirTemp8BitType(val - 67) +} + +func (p *PeripheryInfo) setTempAirOut(val uint64) { + p.TempAirOut = SignedAirTemp8BitType(val - 67) +} + +func (p *PeripheryInfo) setStateShsnFan(val uint64) { + p.StateShsnFan = BooleanType(val) +} + +func (p *PeripheryInfo) setStateShptFan(val uint64) { + p.StateShptFan = BooleanType(val) +} + +func (p *PeripheryDebug) setDebugModeOn(val uint64) { + p.DebugModeOn = BooleanType(val) +} + +func (p *PeripheryDebug) setDebugShsnFan(val uint64) { + p.DebugShsnFan = DebugSwitchModeType(val) +} + +func (p *PeripheryDebug) setDebugShptFan(val uint64) { + p.DebugShptFan = DebugSwitchModeType(val) +} + +func (p *PeripheryDebug) setDebugIoBoardTestLamp(val uint64) { + p.DebugIoBoardTestLamp = DebugSwitchModeType(val) +} + +func (c *ConverterPresentEnergy) setV2gMode(val uint64) { + c.V2gMode = V2GModeType(val) +} + +func (c *ConverterPresentEnergy) setPresentVoltage(val uint64) { + c.PresentVoltage = Voltage11BitType(val) +} + +func (c *ConverterPresentEnergy) setPresentCurrent(val uint64) { + c.PresentCurrent = Current10BitType(val) +} + +func (c *ConverterPresentEnergy) setConnectedOut(val uint64) { + c.ConnectedOut = ConnectedOut8bitType(val) +} + +func (c *ConverterErrors) setBoardReady(val uint64) { + c.BoardReady = BoardReadyType(val) +} + +func (c *ConverterErrors) setOtherError(val uint64) { + c.OtherError = OtherError4BitType(val) +} + +func (c *ConverterErrors) setNotConnectedOut(val uint64) { + c.NotConnectedOut = ErrorType(val) +} + +func (c *ConverterErrors) setNoCommunicationConverter(val uint64) { + c.NoCommunicationConverter = ErrorType(val) +} + +func (c *ConverterErrors) setNoCommunicationPuConverter(val uint64) { + c.NoCommunicationPuConverter = ErrorType(val) +} + +func (c *ConverterErrors) setInputGridVoltageHigh(val uint64) { + c.InputGridVoltageHigh = ErrorType(val) +} + +func (c *ConverterErrors) setInputGridVoltageLow(val uint64) { + c.InputGridVoltageLow = ErrorType(val) +} + +func (c *ConverterErrors) setOutputGridVoltageHigh(val uint64) { + c.OutputGridVoltageHigh = ErrorType(val) +} + +func (c *ConverterErrors) setOutputGridVoltageLow(val uint64) { + c.OutputGridVoltageLow = ErrorType(val) +} + +func (c *ConverterErrors) setInputGridVoltage(val uint64) { + c.InputGridVoltage = Voltage11BitType(val) +} + +func (c *ConverterErrors) setOutputGridVoltage(val uint64) { + c.OutputGridVoltage = Voltage11BitType(val) +} + +func (c *ConverterErrors) setShortCircuit(val uint64) { + c.ShortCircuit = ErrorType(val) +} + +func (c *ConverterErrors) setOverHeat(val uint64) { + c.OverHeat = ErrorType(val) +} + +func (c *ConverterErrors) setFanBroken(val uint64) { + c.FanBroken = ErrorType(val) +} + +func (c *ConverterErrors) setOtherHardwareError(val uint64) { + c.OtherHardwareError = ErrorType(val) +} + +func (c *ConverterErrors) setDebugConvEnabled(val uint64) { + c.DebugConvEnabled = BooleanType(val) +} + +func (c *ConverterErrors) setDebugConvDisabled(val uint64) { + c.DebugConvDisabled = BooleanType(val) +} + +func (d *ConverterDebug) setDebugModeOn(val uint64) { + d.DebugModeOn = BooleanType(val) +} + +func (d *ConverterDebug) setDebugEnergyOn(val uint64) { + d.DebugEnergyOn = DebugSwitchModeType(val) +} + +func (d *ConverterDebug) setDebugTargetVoltage(val uint64) { + d.DebugTargetVoltage = Voltage11BitType(val) +} + +func (d *ConverterDebug) setDebugTargetCurrent(val uint64) { + d.DebugTargetCurrent = Current10BitType(val) +} diff --git a/yabl/strings.go b/yabl/strings.go index a748f9a..bd5b38a 100644 --- a/yabl/strings.go +++ b/yabl/strings.go @@ -199,3 +199,15 @@ func (d DebugSwitchModeType) String() string { func (s SignedVoltage12bitType) String() string { return fmt.Sprintf("%d", s) } + +func (f ForceModeType) String() string { + return fmt.Sprintf("MODE_%d", f) +} + +func (t SignedAirTemp8BitType) String() string { + return fmt.Sprintf("%d", t) +} + +func (c ConnectedOut8bitType) String() string { + return fmt.Sprintf("%d", c) +} -- 2.54.0 From 8c81bc8e24acac9a584b5a08f2b6aa85eb6b07e7 Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Thu, 6 Jul 2023 12:07:16 +0300 Subject: [PATCH 03/15] Field und parameters names as constants, small fixes --- yabl/const.go | 281 ++++++++++++++++++ yabl/init.go | 354 ++++++++++++++++++++++ yabl/protocol.go | 668 +----------------------------------------- yabl/protocol_test.go | 45 --- yabl/setters.go | 2 +- yabl/types.go | 253 ++++++++++++++++ 6 files changed, 896 insertions(+), 707 deletions(-) create mode 100644 yabl/const.go create mode 100644 yabl/init.go delete mode 100644 yabl/protocol_test.go create mode 100644 yabl/types.go diff --git a/yabl/const.go b/yabl/const.go new file mode 100644 index 0000000..76eff8d --- /dev/null +++ b/yabl/const.go @@ -0,0 +1,281 @@ +package yabl + +const ( + CONVERTERS_MAX = 18 + 1 + CONTACTOR_MAX = 18 + 1 + CONNECTOR_COUNT = 6 + CONNECTOR_MAX = CONNECTOR_COUNT + 1 + ALL_BITS = 0xFFFFFFFFFFFFFFFF + UNIT_ID_OFFSET = 12 + UNIT_ID_MASK = 0b111111111111 << UNIT_ID_OFFSET + ACTION_ID_MASK = 0b111111111111 + BOARD_READY_OK BoardReadyType = 0 + BOARD_READY_INFO BoardReadyType = 1 + BOARD_READY_WARNING BoardReadyType = 2 + BOARD_READY_DEBUG BoardReadyType = 3 + BOARD_READY_DEP_ERROR BoardReadyType = 4 + BOARD_READY_ERROR BoardReadyType = 5 + BOARD_READY_CRITICAL BoardReadyType = 6 + OFF BooleanType = 0 + ON BooleanType = 1 + NO_ERROR ErrorType = 0 + ERROR ErrorType = 1 + OTHER_NO_ERROR ContactorInternalOtherErrorType = 0 + NO_PENDING_CHANGES ContactorGroupChangedType = 0 + INITIALIZED_CHANGE ContactorGroupChangedType = 1 + CHANGE_IN_PROGRESS ContactorGroupChangedType = 2 + V2G_MODE_G2V V2GModeType = 0 + V2G_MODE_V2G V2GModeType = 1 + V2G_MODE_INV V2GModeType = 2 + NOT_ENABLE CpLineLevelType = 0 + TWELVE CpLineLevelType = 1 + NINE CpLineLevelType = 2 + SIX CpLineLevelType = 3 + THREE CpLineLevelType = 4 + MINUS_TWELVE CpLineLevelType = 5 + ISOLATION_STATE_UNKNOWN IsolationStateType = 0 + ONGOING IsolationStateType = 1 + PASSED IsolationStateType = 2 + WARNING IsolationStateType = 3 + FAILED IsolationStateType = 4 + AUTH AuthModeType = 0 + PNC AuthModeType = 1 + AUTH_STATE_UNKNOWN AuthStateType = 0 + AUTH_STATE_ALLOW AuthStateType = 1 + AUTH_STATE_DENY AuthStateType = 2 + CONTACTOR_NO_MODE ContactorModeType = 0 + CONTACTOR_TRANSACTION_PROCESS ContactorModeType = 1 + CONTACTOR_CUSTOM_MODE ContactorModeType = 2 + CONTACTOR_ONLY_ONE_OUT_MODE ContactorModeType = 3 + CONTACTOR_ONE_TO_ONE_OUT_MODE ContactorModeType = 4 + CONTACTOR_SIMPLE_DYNAMIC_MODE ContactorModeType = 5 + DEBUG_SWITCH_MODE_AUTO DebugSwitchModeType = 0 + DEBUG_SWITCH_MODE_OFF DebugSwitchModeType = 1 + DEBUG_SWITCH_MODE_ON DebugSwitchModeType = 2 + DEBUG_SWITCH_MODE_PERMANENT_OFF DebugSwitchModeType = 4 + DEBUG_SWITCH_MODE_PERMANENT_ON DebugSwitchModeType = 5 + + PCpuPresentEnergy PName = "CpuPresentEnergy" + PCpuPeriphery PName = "CpuPeriphery" + PCpuEnergySettings PName = "CpuEnergySettings" + PCpuErrors PName = "CpuErrors" + PCpuDebug PName = "CpuDebug" + PPuPresentEnergy PName = "PuPresentEnergy" + PPuPeriphery PName = "PuPeriphery" + PPuErrors PName = "PuErrors" + PPuDebug PName = "PuDebug" + PSeccTargetEnergy PName = "SeccTargetEnergy" + PSeccErrors PName = "SeccErrors" + PLogicAuth PName = "LogicAuth" + PLogicEnergyMode PName = "LogicEnergyMode" + PLogicErrors PName = "LogicErrors" + PLogicWorkingMode PName = "LogicWorkingMode" + PContactorInternalState PName = "ContactorInternalState" + PContactorInternalErrors PName = "ContactorInternalErrors" + PContactorsInternalForce PName = "ContactorsInternalForce" + PContactorInternalDebug PName = "ContactorInternalDebug" + PPeripheryState PName = "PeripheryState" + PPeripheryInfo PName = "PeripheryInfo" + PPeripheryDebug PName = "PeripheryDebug" + PConverterPresentEnergy PName = "ConverterPresentEnergy" + PConverterErrors PName = "ConverterErrors" + PConverterDebug PName = "ConverterDebug" + + FContactorReady FName = "FContactorReady" + FContactorOn FName = "ContactorOn" + FUnexpectedState FName = "UnexpectedState" + FIsolated FName = "Isolated" + FDebugEnabled FName = "DebugEnabled" + + FBoardReady FName = "BoardReady" + FOtherError FName = "OtherError" + FContactorGroupChanged FName = "ContactorGroupChanged" + FUnexpectedFormation FName = "UnexpectedFormation" + FCpuNotReady FName = "CpuNotReady" + FPuNotReady FName = "PuNotReady" + FDebug FName = "Debug" + FPresentContactorMode FName = "PresentContactorMode" + + FForceModeEnabled FName = "ForceModeEnabled" + FForceModeValue FName = "ForceModeValue" + + FDebugModeOn FName = "DebugModeOn" + FDebugContactorOn FName = "DebugContactorOn" + + FV2GMode FName = "V2GMode" + FVoltageBefore FName = "VoltageBefore" + FVoltageAfter FName = "VoltageAfter" + FPresentCurrent FName = "PresentCurrent" + + FConnectorInsert FName = "ConnectorInsert" + + // FContactorOn FName = "ContactorOn" + + FConnectorLocked FName = "ConnectorLocked" + FCpLineLevel FName = "CpLineLevel" + FIsolationState FName = "IsolationState" + FChargingAllowed FName = "ChargingAllowed" + FPwmEnabled FName = "PwmEnabled" + FCpLineVoltage FName = "CpLineVoltage" + + FAuthMode FName = "AuthMode" + FAuthState FName = "AuthState" + + FV2gMode FName = "V2gMode" + FCurrentMax FName = "CurrentMax" + FVoltageMax FName = "VoltageMax" + FPowerMax FName = "PowerMax" + + // FBoardReady FName = "BoardReady" + + FNotReadySettings FName = "NotReadySettings" + + FTargetContactorMode FName = "TargetContactorMode" + FAvailability FName = "Availability" + + FPowerDirectionMode FName = "PowerDirectionMode" + + // FPresentCurrent FName = "PresentCurrent" + + FPresentVoltage FName = "PresentVoltage" + + FContactorInput FName = "ContactorInput" + FCircuitBreakerInput FName = "CircuitBreakerInput" + FCircuitBreakerPowerCBInput FName = "CircuitBreakerPowerCBInput" + + // FCurrentMax FName = "CurrentMax" + // FVoltageMax FName = "VoltageMax" + // FPowerMax FName = "PowerMax" + + FTargetBatteryVoltage FName = "TargetBatteryVoltage" + FTargetGoalVoltage FName = "TargetGoalVoltage" + + // FBoardReady FName = "BoardReady" + // FOtherError FName = "OtherError" + + FRedButtonHard FName = "RedButtonHard" + FRedButtonSoft FName = "RedButtonSoft" + FModulesGone FName = "ModulesGone" + FGridVoltageHighErr FName = "GridVoltageHighErr" + FGridVoltageHighWarn FName = "GridVoltageHighWarn" + FGridVoltageLowWarn FName = "GridVoltageLowWarn" + FGridVoltageLowErr FName = "GridVoltageLowErr" + FGridVoltageLow FName = "GridVoltageLow" + FGridVoltageHigh FName = "GridVoltageHigh" + FGridVoltageEmpty FName = "GridVoltageEmpty" + FNotReadySecc FName = "NotReadySecc" + FNotReadyPu FName = "NotReadyPu" + FNotReadyContactors FName = "NotReadyContactors" + FDebugConvertersEnabled FName = "DebugConvertersEnabled" + FContactorInputError FName = "ContactorInputError" + FNotReadyPeriphery FName = "NotReadyPeriphery" + + // FDebugModeOn FName = "DebugModeOn" + + FDebugContactorInputOn FName = "DebugContactorInputOn" + FDebugCircuitBreakerOn FName = "DebugCircuitBreakerOn" + FDebugRedButtonSoftware FName = "DebugRedButtonSoftware" + + // FBoardReady FName = "BoardReady" + // FOtherError FName = "OtherError" + + FIncorrectVoltage FName = "IncorrectVoltage" + FIncorrectVoltageValue FName = "IncorrectVoltageValue" + FIncorrectCurrent FName = "IncorrectCurrent" + FIncorrectCurrentValue FName = "IncorrectCurrentValue" + FIsolationBroken FName = "IsolationBroken" + FCpLineBroken FName = "CpLineBroken" + FCpLineGap69 FName = "CpLineGap69" + FCableReady FName = "CableReady" + FNotReadyCpu FName = "NotReadyCpu" + + // FNotReadySecc FName = "NotReadySecc" + + FContactorOutputError FName = "ContactorOutputError" + FDebugContactorOutputEnabled FName = "DebugContactorOutputEnabled" + FOutputCircuitBreakerEnabled FName = "OutputCircuitBreakerEnabled" + FOutputCircuitBreakerEnabledValue FName = "OutputCircuitBreakerEnabledValue" + + // FDebugModeOn FName = "DebugModeOn" + + FDebugContactorOutputOn FName = "DebugContactorOutputOn" + + FTargetChargingAllow FName = "TargetChargingAllow" + + // FTargetBatteryVoltage FName = "TargetBatteryVoltage" + // FTargetGoalVoltage FName = "TargetGoalVoltage" + + FTargetCurrent FName = "TargetCurrent" + + // FBoardReady FName = "BoardReady" + + FNotReadyLogic FName = "NotReadyLogic" + + FOtherErrorSeverity FName = "OtherErrorSeverity" + + // FOtherError FName = "OtherError" + + FErrorShakeSensor FName = "ErrorShakeSensor" + FErrorCoolingGroup FName = "ErrorCoolingGroup" + FPeripheryErrorCoolingGroup FName = "PeripheryErrorCoolingGroup" + FErrorFireEmergency FName = "ErrorFireEmergency" + FErrorFireEmergencyRun FName = "ErrorFireEmergencyRun" + FErrorFireEmergencyControl FName = "ErrorFireEmergencyControl" + FErrorOvervoltageIn FName = "ErrorOvervoltageIn" + FPeripheryErrorPowerSupply FName = "PeripheryErrorPowerSupply" + FErrorFan FName = "ErrorFan" + FErrorOvervoltageOut FName = "ErrorOvervoltageOut" + FErrorStateRemoteMode FName = "ErrorStateRemoteMode" + FDebugShsnFanEnabled FName = "DebugShsnFanEnabled" + FDebugShptFanEnabled FName = "DebugShptFanEnabled" + FDebugIoBoardTestLampEnabled FName = "DebugIoBoardTestLampEnabled" + FErrorFireEmergencyCircuitBreaker FName = "ErrorFireEmergencyCircuitBreaker" + FErrorExtLightCircuitBreaker FName = "ErrorExtLightCircuitBreaker" + FErrorIndicationCircuitBreaker FName = "ErrorIndicationCircuitBreaker" + FErrorLowVoltagePowerCircuitBreaker FName = "ErrorLowVoltagePowerCircuitBreaker" + FErrorContactorsInternalCircuitBreaker FName = "ErrorContactorsInternalCircuitBreaker" + FErrorPlcCircuitBreaker FName = "ErrorPlcCircuitBreaker" + + FInfoDoorOpen FName = "InfoDoorOpen" + FTempAirIn FName = "TempAirIn" + FTempAirOut FName = "TempAirOut" + FStateShsnFan FName = "StateShsnFan" + FStateShptFan FName = "StateShptFan" + + // FDebugModeOn FName = "DebugModeOn" + + FDebugShsnFan FName = "DebugShsnFan" + FDebugShptFan FName = "DebugShptFan" + FDebugIoBoardTestLamp FName = "DebugIoBoardTestLamp" + + // FV2gMode FName = "V2gMode" + // FPresentVoltage FName = "PresentVoltage" + // FPresentCurrent FName = "PresentCurrent" + + FConnectedOut FName = "ConnectedOut" + + // FBoardReady FName = "BoardReady" + // FOtherError FName = "OtherError" + + FNotConnectedOut FName = "NotConnectedOut" + FNoCommunicationConverter FName = "NoCommunicationConverter" + FNoCommunicationPuConverter FName = "NoCommunicationPuConverter" + FInputGridVoltageHigh FName = "InputGridVoltageHigh" + FInputGridVoltageLow FName = "InputGridVoltageLow" + FOutputGridVoltageHigh FName = "OutputGridVoltageHigh" + FOutputGridVoltageLow FName = "OutputGridVoltageLow" + FInputGridVoltage FName = "InputGridVoltage" + FOutputGridVoltage FName = "OutputGridVoltage" + FShortCircuit FName = "ShortCircuit" + FOverHeat FName = "OverHeat" + FFanBroken FName = "FanBroken" + FOtherHardwareError FName = "OtherHardwareError" + FDebugConvEnabled FName = "DebugConvEnabled" + FDebugConvDisabled FName = "DebugConvDisabled" + + // FDebugModeOn FName = "DebugModeOn" + + FDebugEnergyOn FName = "DebugEnergyOn" + FDebugTargetVoltage FName = "DebugTargetVoltage" + FDebugTargetCurrent FName = "DebugTargetCurrent" +) diff --git a/yabl/init.go b/yabl/init.go new file mode 100644 index 0000000..0c0e2ca --- /dev/null +++ b/yabl/init.go @@ -0,0 +1,354 @@ +package yabl + +import "cli-mon/can" + +func init() { + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_011, uint(i)} + cpe := CpuPresentEnergy{} + cpuPresentEnergyArray[i] = &cpe + fields := []field{ + {length: 2, setter: cpe.setPowerDirectionMode}, + {length: 10, setter: cpe.setPresentCurrent}, + {length: 11, setter: cpe.setPresentVoltage}, + } + protocolMap[key] = parameters{fields: fields, interval: 50, name: PCpuPresentEnergy} + } + + cpuPeripheryInstance = &CpuPeriphery{} + fields := []field{ + {length: 2, setter: cpuPeripheryInstance.setContactorInput}, + {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerInput}, + {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerPowerCBInput}, + } + protocolMap[key{can.CAN_ID_014, 0}] = parameters{fields: fields, interval: 1000, name: PCpuPeriphery} + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_015, uint(i)} + ces := CpuEnergySettings{} + cpuEnergySettingsArray[i] = &ces + fields := []field{ + {length: 10, setter: ces.setCurrentMax}, + {length: 11, setter: ces.setVoltageMax}, + {length: 14, setter: ces.setPowerMax}, + {length: 11, setter: ces.setTargetBatteryVoltage}, + {length: 11, setter: ces.setTargetGoalVoltage}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PCpuEnergySettings} + } + + cpuErrorsInstance = &CpuErrors{} + fields = []field{ + {length: 3, setter: cpuErrorsInstance.setBoardReady}, + {length: 4, setter: cpuErrorsInstance.setOtherError}, + {length: 2, setter: cpuErrorsInstance.setRedButtonHard}, + {length: 2, setter: cpuErrorsInstance.setRedButtonSoft}, + {length: 2, setter: cpuErrorsInstance.setModulesGone}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageHighErr}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageHighWarn}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageLowWarn}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageLowErr}, + {length: 11, setter: cpuErrorsInstance.setGridVoltageLow}, + {length: 11, setter: cpuErrorsInstance.setGridVoltageHigh}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageEmpty}, + {length: 2, setter: cpuErrorsInstance.setNotReadySecc}, + {length: 2, setter: cpuErrorsInstance.setNotReadyPu}, + {length: 2, setter: cpuErrorsInstance.setNotReadyContactors}, + {length: 2, setter: cpuErrorsInstance.setDebugConvertersEnabled}, + {length: 2, setter: cpuErrorsInstance.setContactorInputError}, + {length: 2, setter: cpuErrorsInstance.setNotReadyPeriphery}, + } + protocolMap[key{can.CAN_ID_016, 0}] = parameters{fields: fields, interval: 1000, name: PCpuErrors} + + cpuDebugInstance = &CpuDebug{} + fields = []field{ + {length: 2, setter: cpuDebugInstance.setDebugModeOn}, + {length: 3, setter: cpuDebugInstance.setDebugContactorInputOn}, + {length: 3, setter: cpuDebugInstance.setDebugCircuitBreakerOn}, + {length: 3, setter: cpuDebugInstance.setDebugRedButtonSoftware}, + } + protocolMap[key{can.CAN_ID_01A, 0}] = parameters{fields: fields, interval: 1000, name: PCpuDebug} + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_021, uint(i)} + ppe := PuPresentEnergy{} + puPresentEnergyArray[i] = &ppe + fields := []field{ + {length: 2, setter: ppe.setV2GMode}, + {length: 11, setter: ppe.setVoltageBefore}, + {length: 11, setter: ppe.setVoltageAfter}, + {length: 10, setter: ppe.setPresentCurrent}, + } + protocolMap[key] = parameters{fields: fields, interval: 50, name: PPuPresentEnergy} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_022, uint(i)} + pp := PuPeriphery{} + puPeripheryArray[i] = &pp + fields := []field{ + {length: 2, setter: pp.setConnectorInsert}, + {length: 2, setter: pp.setContactorOn}, + {length: 2, setter: pp.setConnectorLocked}, + {length: 3, setter: pp.setCpLineLevel}, + {length: 3, setter: pp.setIsolationState}, + {length: 2, setter: pp.setChargingAllowed}, + {length: 2, setter: pp.setPwmEnabled}, + {length: 9, setter: pp.setCpLineVoltage}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPuPeriphery} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_023, uint(i)} + pe := PuErrors{} + puErrorsArray[i] = &pe + fields := []field{ + {length: 3, setter: pe.setBoardReady}, + {length: 4, setter: pe.setOtherError}, + {length: 2, setter: pe.setIncorrectVoltage}, + {length: 11, setter: pe.setIncorrectVoltageValue}, + {length: 2, setter: pe.setIncorrectCurrent}, + {length: 10, setter: pe.setIncorrectCurrentValue}, + {length: 2, setter: pe.setIsolationBroken}, + {length: 2, setter: pe.setCpLineBroken}, + {length: 2, setter: pe.setCpLineGap69}, + {length: 3, setter: pe.setCableReady}, + {length: 2, setter: pe.setNotReadyCpu}, + {length: 2, setter: pe.setNotReadySecc}, + {length: 2, setter: pe.setContactorOutputError}, + {length: 2, setter: pe.setDebugContactorOutputEnabled}, + {length: 2, setter: pe.setOutputCircuitBreakerEnabled}, + {length: 12, setter: pe.setOutputCircuitBreakerEnabledValue}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPuErrors} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_02A, uint(i)} + pd := PuDebug{} + puDebugArray[i] = &pd + fields = []field{ + {length: 2, setter: pd.setDebugModeOn}, + {length: 3, setter: pd.setDebugContactorOutputOn}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPuDebug} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_041, uint(i)} + ste := SeccTargetEnergy{} + seccTargetEnergyArray[i] = &ste + fields = []field{ + {length: 2, setter: ste.setTargetChargingAllow}, + {length: 11, setter: ste.setTargetBatteryVoltage}, + {length: 11, setter: ste.setTargetGoalVoltage}, + {length: 10, setter: ste.setTargetCurrent}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PSeccTargetEnergy} + } + + for i := 1; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_042, uint(i)} + se := SeccErrors{} + seccErrorsArray[i] = &se + fields = []field{ + {length: 3, setter: se.setBoardReady}, + {length: 2, setter: se.setNotReadyLogic}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PSeccErrors} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_046, uint(i)} + la := LogicAuth{} + logicAuthArray[i] = &la + fields = []field{ + {length: 2, setter: la.setAuthMode}, + {length: 3, setter: la.setAuthState}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PLogicAuth} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_047, uint(i)} + la := LogicEnergyMode{} + logicEnergyMode[i] = &la + fields = []field{ + {length: 2, setter: la.setV2gMode}, + {length: 10, setter: la.setCurrentMax}, + {length: 11, setter: la.setVoltageMax}, + {length: 14, setter: la.setPowerMax}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PLogicEnergyMode} + } + + logicErrorsInstance = &LogicErrors{} + fields = []field{ + {length: 3, setter: logicErrorsInstance.setBoardReady}, + {length: 2, setter: logicErrorsInstance.setNotReadySettings}, + } + protocolMap[key{can.CAN_ID_048, 0}] = parameters{fields: fields, interval: 1000, name: PLogicErrors} + + logicWorkingMode = &LogicWorkingMode{} + fields = []field{ + {length: 5, setter: logicWorkingMode.setTargetContactorMode}, + {length: 2, setter: logicWorkingMode.setAvailability}, + } + protocolMap[key{can.CAN_ID_049, 0}] = parameters{fields: fields, interval: 1000, name: PLogicWorkingMode} + + for i := 0; i <= CONTACTOR_MAX; i++ { + key := key{can.CAN_ID_071, uint(i)} + cis := ContactorInternalState{} + contactorInternalStateArray[i] = &cis + fields = []field{ + {length: 3, setter: cis.setContactorReady}, + {length: 2, setter: cis.setContactorOn}, + {length: 2, setter: cis.setUnexpectedState}, + {length: 2, setter: cis.setIsolated}, + {length: 2, setter: cis.setDebugEnabled}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PContactorInternalState} + } + + contactorInternalErrorsInstance = &ContactorInternalErrors{} + fields = []field{ + {length: 3, setter: contactorInternalErrorsInstance.setBoardReady}, + {length: 4, setter: contactorInternalErrorsInstance.setOtherError}, + {length: 3, setter: contactorInternalErrorsInstance.setContactorGroupChanged}, + {length: 4, setter: contactorInternalErrorsInstance.setUnexpectedFormation}, + {length: 2, setter: contactorInternalErrorsInstance.setCpuNotReady}, + {length: 2, setter: contactorInternalErrorsInstance.setPuNotReady}, + {length: 2, setter: contactorInternalErrorsInstance.setDebug}, + {length: 5, setter: contactorInternalErrorsInstance.setPresentContactorMode}, + } + protocolMap[key{can.CAN_ID_073, 0}] = parameters{fields: fields, interval: 1000, name: PContactorInternalErrors} + + contactorsInternalForce = &ContactorsInternalForce{} + fields = []field{ + {length: 2, setter: contactorsInternalForce.setForceModeEnabled}, + {length: 4, setter: contactorsInternalForce.setForceModeValue}, + } + protocolMap[key{can.CAN_ID_074, 0}] = parameters{fields: fields, interval: 1000, name: PContactorsInternalForce} + + for i := 0; i <= CONTACTOR_MAX; i++ { + key := key{can.CAN_ID_075, uint(i)} + cid := ContactorInternalDebug{} + contactorInternalDebugArray[i] = &cid + fields = []field{ + {length: 2, setter: cid.setDebugModeOn}, + {length: 3, setter: cid.setDebugContactorOn}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PContactorInternalDebug} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_067, uint(i)} + ps := PeripheryState{} + peripheryStateArray[i] = &ps + fields = []field{ + {length: 3, setter: ps.setOtherErrorSeverity}, + {length: 4, setter: ps.setOtherError}, + {length: 2, setter: ps.setErrorShakeSensor}, + {length: 2, setter: ps.setErrorCoolingGroup}, + {length: 2, setter: ps.setPeripheryErrorCoolingGroup}, + {length: 2, setter: ps.setErrorFireEmergency}, + {length: 2, setter: ps.setErrorFireEmergencyRun}, + {length: 2, setter: ps.setErrorFireEmergencyControl}, + {length: 2, setter: ps.setErrorOvervoltageIn}, + {length: 2, setter: ps.setPeripheryErrorPowerSupply}, + {length: 2, setter: ps.setErrorFan}, + {length: 2, setter: ps.setErrorOvervoltageOut}, + {length: 2, setter: ps.setErrorStateRemoteMode}, + {length: 2, setter: ps.setDebugShsnFanEnabled}, + {length: 2, setter: ps.setDebugShptFanEnabled}, + {length: 2, setter: ps.setDebugIoBoardTestLampEnabled}, + {length: 2, setter: ps.setErrorFireEmergencyCircuitBreaker}, + {length: 2, setter: ps.setErrorExtLightCircuitBreaker}, + {length: 2, setter: ps.setErrorIndicationCircuitBreaker}, + {length: 2, setter: ps.setErrorLowVoltagePowerCircuitBreaker}, + {length: 2, setter: ps.setErrorContactorsInternalCircuitBreaker}, + {length: 2, setter: ps.setErrorPlcCircuitBreaker}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPeripheryState} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_068, uint(i)} + pi := PeripheryInfo{} + peripheryInfoArray[i] = &pi + fields = []field{ + {length: 2, setter: pi.setInfoDoorOpen}, + {length: 8, setter: pi.setTempAirIn}, + {length: 8, setter: pi.setTempAirOut}, + {length: 2, setter: pi.setStateShsnFan}, + {length: 2, setter: pi.setStateShptFan}, + } + protocolMap[key] = parameters{fields: fields, interval: 5000, name: PPeripheryInfo} + } + + for i := 0; i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_06C, uint(i)} + pd := PeripheryDebug{} + peripheryDebugArray[i] = &pd + fields = []field{ + {length: 2, setter: pd.setDebugModeOn}, + {length: 3, setter: pd.setDebugShsnFan}, + {length: 3, setter: pd.setDebugShptFan}, + {length: 3, setter: pd.setDebugIoBoardTestLamp}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPeripheryDebug} + } + + for i := 1; i <= CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_061, uint(i)} + cpe := ConverterPresentEnergy{} + converterPresentEnergyArray[i] = &cpe + fields = []field{ + {length: 2, setter: cpe.setV2gMode}, + {length: 11, setter: cpe.setPresentVoltage}, + {length: 10, setter: cpe.setPresentCurrent}, + {length: 8, setter: cpe.setConnectedOut}, + } + protocolMap[key] = parameters{fields: fields, interval: 500, name: PConverterPresentEnergy} + } + + for i := 1; i <= CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_062, uint(i)} + ce := ConverterErrors{} + converterErrorsArray[i] = &ce + fields = []field{ + {length: 3, setter: ce.setBoardReady}, + {length: 4, setter: ce.setOtherError}, + {length: 2, setter: ce.setNotConnectedOut}, + {length: 2, setter: ce.setNoCommunicationConverter}, + {length: 2, setter: ce.setNoCommunicationPuConverter}, + {length: 2, setter: ce.setInputGridVoltageHigh}, + {length: 2, setter: ce.setInputGridVoltageLow}, + {length: 2, setter: ce.setOutputGridVoltageHigh}, + {length: 2, setter: ce.setOutputGridVoltageLow}, + {length: 11, setter: ce.setInputGridVoltage}, + {length: 11, setter: ce.setOutputGridVoltage}, + {length: 2, setter: ce.setShortCircuit}, + {length: 2, setter: ce.setOverHeat}, + {length: 2, setter: ce.setFanBroken}, + {length: 2, setter: ce.setOtherHardwareError}, + {length: 2, setter: ce.setDebugConvEnabled}, + {length: 2, setter: ce.setDebugConvDisabled}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PConverterErrors} + } + + for i := 0; i <= CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_065, uint(i)} + cd := ConverterDebug{} + converterDebugArray[i] = &cd + fields = []field{ + {length: 3, setter: cd.setDebugModeOn}, + {length: 4, setter: cd.setDebugEnergyOn}, + {length: 2, setter: cd.setDebugTargetVoltage}, + {length: 2, setter: cd.setDebugTargetCurrent}, + } + protocolMap[key] = parameters{fields: fields, interval: 1000, name: PConverterDebug} + } +} diff --git a/yabl/protocol.go b/yabl/protocol.go index a242201..6f9b51b 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -6,318 +6,10 @@ import ( "time" ) -const ( - CONVERTERS_MAX = 18 + 1 - CONTACTOR_MAX = 18 + 1 - CONNECTOR_COUNT = 6 - CONNECTOR_MAX = CONNECTOR_COUNT + 1 - ALL_BITS = 0xFFFFFFFFFFFFFFFF - UNIT_ID_OFFSET = 12 - UNIT_ID_MASK = 0b111111111111 << UNIT_ID_OFFSET - ACTION_ID_MASK = 0b111111111111 - BOARD_READY_OK BoardReadyType = 0 - BOARD_READY_INFO BoardReadyType = 1 - BOARD_READY_WARNING BoardReadyType = 2 - BOARD_READY_DEBUG BoardReadyType = 3 - BOARD_READY_DEP_ERROR BoardReadyType = 4 - BOARD_READY_ERROR BoardReadyType = 5 - BOARD_READY_CRITICAL BoardReadyType = 6 - OFF BooleanType = 0 - ON BooleanType = 1 - NO_ERROR ErrorType = 0 - ERROR ErrorType = 1 - OTHER_NO_ERROR ContactorInternalOtherErrorType = 0 - NO_PENDING_CHANGES ContactorGroupChangedType = 0 - INITIALIZED_CHANGE ContactorGroupChangedType = 1 - CHANGE_IN_PROGRESS ContactorGroupChangedType = 2 - V2G_MODE_G2V V2GModeType = 0 - V2G_MODE_V2G V2GModeType = 1 - V2G_MODE_INV V2GModeType = 2 - NOT_ENABLE CpLineLevelType = 0 - TWELVE CpLineLevelType = 1 - NINE CpLineLevelType = 2 - SIX CpLineLevelType = 3 - THREE CpLineLevelType = 4 - MINUS_TWELVE CpLineLevelType = 5 - ISOLATION_STATE_UNKNOWN IsolationStateType = 0 - ONGOING IsolationStateType = 1 - PASSED IsolationStateType = 2 - WARNING IsolationStateType = 3 - FAILED IsolationStateType = 4 - AUTH AuthModeType = 0 - PNC AuthModeType = 1 - AUTH_STATE_UNKNOWN AuthStateType = 0 - AUTH_STATE_ALLOW AuthStateType = 1 - AUTH_STATE_DENY AuthStateType = 2 - CONTACTOR_NO_MODE ContactorModeType = 0 - CONTACTOR_TRANSACTION_PROCESS ContactorModeType = 1 - CONTACTOR_CUSTOM_MODE ContactorModeType = 2 - CONTACTOR_ONLY_ONE_OUT_MODE ContactorModeType = 3 - CONTACTOR_ONE_TO_ONE_OUT_MODE ContactorModeType = 4 - CONTACTOR_SIMPLE_DYNAMIC_MODE ContactorModeType = 5 - DEBUG_SWITCH_MODE_AUTO DebugSwitchModeType = 0 - DEBUG_SWITCH_MODE_OFF DebugSwitchModeType = 1 - DEBUG_SWITCH_MODE_ON DebugSwitchModeType = 2 - DEBUG_SWITCH_MODE_PERMANENT_OFF DebugSwitchModeType = 4 - DEBUG_SWITCH_MODE_PERMANENT_ON DebugSwitchModeType = 5 -) - type Packet interface { GetUnitId() uint } -type ContactorInternalState struct { - UnitId uint - ContactorReady BoardReadyType - ContactorOn BooleanType - UnexpectedState ErrorType - Isolated ErrorType - DebugEnabled BooleanType -} - -type ContactorInternalErrors struct { - UnitId uint - BoardReady BoardReadyType - OtherError ContactorInternalOtherErrorType - ContactorGroupChanged ContactorGroupChangedType - UnexpectedFormation ContactorInternalOtherErrorType - CpuNotReady ErrorType - PuNotReady ErrorType - Debug BooleanType - PresentContactorMode ContactorModeType -} - -type ContactorsInternalForce struct { - UnitId uint - ForceModeEnabled BooleanType - ForceModeValue ForceModeType -} - -type ContactorInternalDebug struct { - UnitId uint - DebugModeOn BooleanType - DebugContactorOn DebugSwitchModeType -} - -type PuPresentEnergy struct { - UnitId uint - V2GMode V2GModeType - VoltageBefore Voltage11BitType - VoltageAfter Voltage11BitType - PresentCurrent Current10BitType -} - -type PuPeriphery struct { - UnitId uint - ConnectorInsert BooleanType - ContactorOn BooleanType - ConnectorLocked BooleanType - CpLineLevel CpLineLevelType - IsolationState IsolationStateType - ChargingAllowed BooleanType - PwmEnabled BooleanType - CpLineVoltage Voltage9BitType -} - -type LogicAuth struct { - UnitId uint - AuthMode AuthModeType - AuthState AuthStateType -} - -type LogicEnergyMode struct { - UnitId uint - V2gMode V2GModeType - CurrentMax Current10BitType - VoltageMax Voltage11BitType - PowerMax Power14BitType -} - -type LogicErrors struct { - UnitId uint - BoardReady BoardReadyType - NotReadySettings ErrorType -} - -type LogicWorkingMode struct { - UnitId uint - TargetContactorMode ContactorModeType - Availability BooleanType -} - -type CpuPresentEnergy struct { - UnitId uint - PowerDirectionMode V2GModeType - PresentCurrent Current10BitType - PresentVoltage Voltage11BitType -} - -type CpuPeriphery struct { - UnitId uint - ContactorInput BooleanType - CircuitBreakerInput BooleanType - CircuitBreakerPowerCBInput BooleanType -} - -type CpuEnergySettings struct { - UnitId uint - CurrentMax Current10BitType - VoltageMax Voltage11BitType - PowerMax Power14BitType - TargetBatteryVoltage Voltage11BitType - TargetGoalVoltage Voltage11BitType -} - -type CpuErrors struct { - UnitId uint - BoardReady BoardReadyType - OtherError OtherError4BitType - RedButtonHard ErrorType - RedButtonSoft ErrorType - ModulesGone ErrorType - GridVoltageHighErr ErrorType - GridVoltageHighWarn ErrorType - GridVoltageLowWarn ErrorType - GridVoltageLowErr ErrorType - GridVoltageLow Voltage11BitType - GridVoltageHigh Voltage11BitType - GridVoltageEmpty ErrorType - NotReadySecc ErrorType - NotReadyPu ErrorType - NotReadyContactors ErrorType - DebugConvertersEnabled ErrorType - ContactorInputError ErrorType - NotReadyPeriphery ErrorType -} - -type CpuDebug struct { - UnitId uint - DebugModeOn BooleanType - DebugContactorInputOn DebugSwitchModeType - DebugCircuitBreakerOn DebugSwitchModeType - DebugRedButtonSoftware DebugSwitchModeType -} - -type PuErrors struct { - UnitId uint - BoardReady BoardReadyType - OtherError OtherError4BitType - IncorrectVoltage ErrorType - IncorrectVoltageValue Voltage11BitType - IncorrectCurrent ErrorType - IncorrectCurrentValue Current10BitType - IsolationBroken ErrorType - CpLineBroken ErrorType - CpLineGap69 ErrorType - CableReady BoardReadyType - NotReadyCpu ErrorType - NotReadySecc ErrorType - ContactorOutputError ErrorType - DebugContactorOutputEnabled BooleanType - OutputCircuitBreakerEnabled ErrorType - OutputCircuitBreakerEnabledValue SignedVoltage12bitType -} - -type PuDebug struct { - UnitId uint - DebugModeOn BooleanType - DebugContactorOutputOn DebugSwitchModeType -} - -type SeccTargetEnergy struct { - UnitId uint - TargetChargingAllow BooleanType - TargetBatteryVoltage Voltage11BitType - TargetGoalVoltage Voltage11BitType - TargetCurrent Current10BitType -} - -type SeccErrors struct { - UnitId uint - BoardReady BoardReadyType - NotReadyLogic ErrorType -} - -type PeripheryState struct { - UnitId uint - OtherErrorSeverity BoardReadyType - OtherError OtherError4BitType - ErrorShakeSensor ErrorType - ErrorCoolingGroup ErrorType - PeripheryErrorCoolingGroup ErrorType - ErrorFireEmergency ErrorType - ErrorFireEmergencyRun ErrorType - ErrorFireEmergencyControl ErrorType - ErrorOvervoltageIn ErrorType - PeripheryErrorPowerSupply ErrorType - ErrorFan ErrorType - ErrorOvervoltageOut ErrorType - ErrorStateRemoteMode ErrorType - DebugShsnFanEnabled BooleanType - DebugShptFanEnabled BooleanType - DebugIoBoardTestLampEnabled BooleanType - ErrorFireEmergencyCircuitBreaker ErrorType - ErrorExtLightCircuitBreaker ErrorType - ErrorIndicationCircuitBreaker ErrorType - ErrorLowVoltagePowerCircuitBreaker ErrorType - ErrorContactorsInternalCircuitBreaker ErrorType - ErrorPlcCircuitBreaker ErrorType -} - -type PeripheryInfo struct { - UnitId uint - InfoDoorOpen BooleanType - TempAirIn SignedAirTemp8BitType - TempAirOut SignedAirTemp8BitType - StateShsnFan BooleanType - StateShptFan BooleanType -} - -type PeripheryDebug struct { - UnitId uint - DebugModeOn BooleanType - DebugShsnFan DebugSwitchModeType - DebugShptFan DebugSwitchModeType - DebugIoBoardTestLamp DebugSwitchModeType -} - -type ConverterPresentEnergy struct { - UnitId uint - V2gMode V2GModeType - PresentVoltage Voltage11BitType - PresentCurrent Current10BitType - ConnectedOut ConnectedOut8bitType -} - -type ConverterErrors struct { - UnitId uint - BoardReady BoardReadyType - OtherError OtherError4BitType - NotConnectedOut ErrorType - NoCommunicationConverter ErrorType - NoCommunicationPuConverter ErrorType - InputGridVoltageHigh ErrorType - InputGridVoltageLow ErrorType - OutputGridVoltageHigh ErrorType - OutputGridVoltageLow ErrorType - InputGridVoltage Voltage11BitType - OutputGridVoltage Voltage11BitType - ShortCircuit ErrorType - OverHeat ErrorType - FanBroken ErrorType - OtherHardwareError ErrorType - DebugConvEnabled BooleanType - DebugConvDisabled BooleanType -} - -type ConverterDebug struct { - UnitId uint - DebugModeOn BooleanType - DebugEnergyOn DebugSwitchModeType - DebugTargetVoltage Voltage11BitType - DebugTargetCurrent Current10BitType -} - type SignedAirTemp8BitType int type ConnectedOut8bitType uint type ForceModeType uint @@ -340,16 +32,21 @@ type CpLineLevelType uint type IsolationStateType uint type Voltage9BitType float32 +type PName string +type FName string + type parameters struct { - fields []content + fields []field interval uint + name PName } -type content struct { +type field struct { length uint8 setter func(uint64 uint64) value uint64 last time.Time + name FName } type key struct { @@ -383,357 +80,6 @@ var converterPresentEnergyArray [CONVERTERS_MAX]*ConverterPresentEnergy var converterErrorsArray [CONVERTERS_MAX]*ConverterErrors var converterDebugArray [CONVERTERS_MAX]*ConverterDebug -func init() { - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_011, uint(i)} - cpe := CpuPresentEnergy{} - cpuPresentEnergyArray[i] = &cpe - fields := []content{ - {length: 2, setter: cpe.setPowerDirectionMode}, - {length: 10, setter: cpe.setPresentCurrent}, - {length: 11, setter: cpe.setPresentVoltage}, - } - protocolMap[key] = parameters{fields: fields, interval: 50} - } - - cpuPeripheryInstance = &CpuPeriphery{} - fields := []content{ - {length: 2, setter: cpuPeripheryInstance.setContactorInput}, - {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerInput}, - {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerPowerCBInput}, - } - protocolMap[key{can.CAN_ID_014, 0}] = parameters{fields: fields, interval: 1000} - - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_015, uint(i)} - ces := CpuEnergySettings{} - cpuEnergySettingsArray[i] = &ces - fields := []content{ - {length: 10, setter: ces.setCurrentMax}, - {length: 11, setter: ces.setVoltageMax}, - {length: 14, setter: ces.setPowerMax}, - {length: 11, setter: ces.setTargetBatteryVoltage}, - {length: 11, setter: ces.setTargetGoalVoltage}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - cpuErrorsInstance = &CpuErrors{} - fields = []content{ - {length: 3, setter: cpuErrorsInstance.setBoardReady}, - {length: 4, setter: cpuErrorsInstance.setOtherError}, - {length: 2, setter: cpuErrorsInstance.setRedButtonHard}, - {length: 2, setter: cpuErrorsInstance.setRedButtonSoft}, - {length: 2, setter: cpuErrorsInstance.setModulesGone}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageHighErr}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageHighWarn}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageLowWarn}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageLowErr}, - {length: 11, setter: cpuErrorsInstance.setGridVoltageLow}, - {length: 11, setter: cpuErrorsInstance.setGridVoltageHigh}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageEmpty}, - {length: 2, setter: cpuErrorsInstance.setNotReadySecc}, - {length: 2, setter: cpuErrorsInstance.setNotReadyPu}, - {length: 2, setter: cpuErrorsInstance.setNotReadyContactors}, - {length: 2, setter: cpuErrorsInstance.setDebugConvertersEnabled}, - {length: 2, setter: cpuErrorsInstance.setContactorInputError}, - {length: 2, setter: cpuErrorsInstance.setNotReadyPeriphery}, - } - protocolMap[key{can.CAN_ID_016, 0}] = parameters{fields: fields, interval: 1000} - - cpuDebugInstance = &CpuDebug{} - fields = []content{ - {length: 2, setter: cpuDebugInstance.setDebugModeOn}, - {length: 3, setter: cpuDebugInstance.setDebugContactorInputOn}, - {length: 3, setter: cpuDebugInstance.setDebugCircuitBreakerOn}, - {length: 3, setter: cpuDebugInstance.setDebugRedButtonSoftware}, - } - protocolMap[key{can.CAN_ID_01A, 0}] = parameters{fields: fields, interval: 1000} - - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_021, uint(i)} - ppe := PuPresentEnergy{} - puPresentEnergyArray[i] = &ppe - fields := []content{ - {length: 2, setter: ppe.setV2GMode}, - {length: 11, setter: ppe.setVoltageBefore}, - {length: 11, setter: ppe.setVoltageAfter}, - {length: 10, setter: ppe.setPresentCurrent}, - } - protocolMap[key] = parameters{fields: fields, interval: 50} - } - - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_022, uint(i)} - pp := PuPeriphery{} - puPeripheryArray[i] = &pp - fields := []content{ - {length: 2, setter: pp.setConnectorInsert}, - {length: 2, setter: pp.setContactorOn}, - {length: 2, setter: pp.setConnectorLocked}, - {length: 3, setter: pp.setCpLineLevel}, - {length: 3, setter: pp.setIsolationState}, - {length: 2, setter: pp.setChargingAllowed}, - {length: 2, setter: pp.setPwmEnabled}, - {length: 9, setter: pp.setCpLineVoltage}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_023, uint(i)} - pe := PuErrors{} - puErrorsArray[i] = &pe - fields := []content{ - {length: 3, setter: pe.setBoardReady}, - {length: 4, setter: pe.setOtherError}, - {length: 2, setter: pe.setIncorrectVoltage}, - {length: 11, setter: pe.setIncorrectVoltageValue}, - {length: 2, setter: pe.setIncorrectCurrent}, - {length: 10, setter: pe.setIncorrectCurrentValue}, - {length: 2, setter: pe.setIsolationBroken}, - {length: 2, setter: pe.setCpLineBroken}, - {length: 2, setter: pe.setCpLineGap69}, - {length: 3, setter: pe.setCableReady}, - {length: 2, setter: pe.setNotReadyCpu}, - {length: 2, setter: pe.setNotReadySecc}, - {length: 2, setter: pe.setContactorOutputError}, - {length: 2, setter: pe.setDebugContactorOutputEnabled}, - {length: 2, setter: pe.setOutputCircuitBreakerEnabled}, - {length: 12, setter: pe.setOutputCircuitBreakerEnabledValue}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_02A, uint(i)} - pd := PuDebug{} - puDebugArray[i] = &pd - fields = []content{ - {length: 2, setter: pd.setDebugModeOn}, - {length: 3, setter: pd.setDebugContactorOutputOn}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_041, uint(i)} - ste := SeccTargetEnergy{} - seccTargetEnergyArray[i] = &ste - fields = []content{ - {length: 2, setter: ste.setTargetChargingAllow}, - {length: 11, setter: ste.setTargetBatteryVoltage}, - {length: 11, setter: ste.setTargetGoalVoltage}, - {length: 10, setter: ste.setTargetCurrent}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_042, uint(i)} - se := SeccErrors{} - seccErrorsArray[i] = &se - fields = []content{ - {length: 3, setter: se.setBoardReady}, - {length: 2, setter: se.setNotReadyLogic}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_046, uint(i)} - la := LogicAuth{} - logicAuthArray[i] = &la - fields = []content{ - {length: 2, setter: la.setAuthMode}, - {length: 3, setter: la.setAuthState}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_047, uint(i)} - la := LogicEnergyMode{} - logicEnergyMode[i] = &la - fields = []content{ - {length: 2, setter: la.setV2gMode}, - {length: 10, setter: la.setCurrentMax}, - {length: 11, setter: la.setVoltageMax}, - {length: 14, setter: la.setPowerMax}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - logicErrorsInstance = &LogicErrors{} - fields = []content{ - {length: 3, setter: logicErrorsInstance.setBoardReady}, - {length: 2, setter: logicErrorsInstance.setNotReadySettings}, - } - protocolMap[key{can.CAN_ID_048, 0}] = parameters{fields: fields, interval: 1000} - - logicWorkingMode = &LogicWorkingMode{} - fields = []content{ - {length: 5, setter: logicWorkingMode.setTargetContactorMode}, - {length: 2, setter: logicWorkingMode.setAvailability}, - } - protocolMap[key{can.CAN_ID_049, 0}] = parameters{fields: fields, interval: 1000} - - for i := 0; i <= CONTACTOR_MAX; i++ { - key := key{can.CAN_ID_071, uint(i)} - cis := ContactorInternalState{} - contactorInternalStateArray[i] = &cis - fields = []content{ - {length: 3, setter: cis.setContactorReady}, - {length: 2, setter: cis.setContactorOn}, - {length: 2, setter: cis.setUnexpectedState}, - {length: 2, setter: cis.setIsolated}, - {length: 2, setter: cis.setDebugEnabled}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - contactorInternalErrorsInstance = &ContactorInternalErrors{} - fields = []content{ - {length: 3, setter: contactorInternalErrorsInstance.setBoardReady}, - {length: 4, setter: contactorInternalErrorsInstance.setOtherError}, - {length: 3, setter: contactorInternalErrorsInstance.setContactorGroupChanged}, - {length: 4, setter: contactorInternalErrorsInstance.setUnexpectedFormation}, - {length: 2, setter: contactorInternalErrorsInstance.setCpuNotReady}, - {length: 2, setter: contactorInternalErrorsInstance.setPuNotReady}, - {length: 2, setter: contactorInternalErrorsInstance.setDebug}, - {length: 5, setter: contactorInternalErrorsInstance.setPresentContactorMode}, - } - protocolMap[key{can.CAN_ID_073, 0}] = parameters{fields: fields, interval: 1000} - - contactorsInternalForce = &ContactorsInternalForce{} - fields = []content{ - {length: 2, setter: contactorsInternalForce.setForceModeEnabled}, - {length: 4, setter: contactorsInternalForce.setForceModeValue}, - } - protocolMap[key{can.CAN_ID_074, 0}] = parameters{fields: fields, interval: 1000} - - for i := 0; i <= CONTACTOR_MAX; i++ { - key := key{can.CAN_ID_075, uint(i)} - cid := ContactorInternalDebug{} - contactorInternalDebugArray[i] = &cid - fields = []content{ - {length: 2, setter: cid.setDebugModeOn}, - {length: 3, setter: cid.setDebugContactorOn}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_067, uint(i)} - ps := PeripheryState{} - peripheryStateArray[i] = &ps - fields = []content{ - {length: 3, setter: ps.setOtherErrorSeverity}, - {length: 4, setter: ps.setOtherError}, - {length: 2, setter: ps.setErrorShakeSensor}, - {length: 2, setter: ps.setErrorCoolingGroup}, - {length: 2, setter: ps.setPeripheryErrorCoolingGroup}, - {length: 2, setter: ps.setErrorFireEmergency}, - {length: 2, setter: ps.setErrorFireEmergencyRun}, - {length: 2, setter: ps.setErrorFireEmergencyControl}, - {length: 2, setter: ps.setErrorOvervoltageIn}, - {length: 2, setter: ps.setPeripheryErrorPowerSupply}, - {length: 2, setter: ps.setErrorFan}, - {length: 2, setter: ps.setErrorOvervoltageOut}, - {length: 2, setter: ps.setErrorStateRemoteMode}, - {length: 2, setter: ps.setDebugShsnFanEnabled}, - {length: 2, setter: ps.setDebugShptFanEnabled}, - {length: 2, setter: ps.setDebugIoBoardTestLampEnabled}, - {length: 2, setter: ps.setErrorFireEmergencyCircuitBreaker}, - {length: 2, setter: ps.setErrorExtLightCircuitBreaker}, - {length: 2, setter: ps.setErrorIndicationCircuitBreaker}, - {length: 2, setter: ps.setErrorLowVoltagePowerCircuitBreaker}, - {length: 2, setter: ps.setErrorContactorsInternalCircuitBreaker}, - {length: 2, setter: ps.setErrorPlcCircuitBreaker}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_068, uint(i)} - pi := PeripheryInfo{} - peripheryInfoArray[i] = &pi - fields = []content{ - {length: 2, setter: pi.setInfoDoorOpen}, - {length: 8, setter: pi.setTempAirIn}, - {length: 8, setter: pi.setTempAirOut}, - {length: 2, setter: pi.setStateShsnFan}, - {length: 2, setter: pi.setStateShptFan}, - } - protocolMap[key] = parameters{fields: fields, interval: 5000} - } - - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_06C, uint(i)} - pd := PeripheryDebug{} - peripheryDebugArray[i] = &pd - fields = []content{ - {length: 2, setter: pd.setDebugModeOn}, - {length: 3, setter: pd.setDebugShsnFan}, - {length: 3, setter: pd.setDebugShptFan}, - {length: 3, setter: pd.setDebugIoBoardTestLamp}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 1; i <= CONVERTERS_MAX; i++ { - key := key{can.CAN_ID_061, uint(i)} - cpe := ConverterPresentEnergy{} - converterPresentEnergyArray[i] = &cpe - fields = []content{ - {length: 2, setter: cpe.setV2gMode}, - {length: 11, setter: cpe.setPresentVoltage}, - {length: 10, setter: cpe.setPresentCurrent}, - {length: 8, setter: cpe.setConnectedOut}, - } - protocolMap[key] = parameters{fields: fields, interval: 500} - } - - for i := 1; i <= CONVERTERS_MAX; i++ { - key := key{can.CAN_ID_062, uint(i)} - ce := ConverterErrors{} - converterErrorsArray[i] = &ce - fields = []content{ - {length: 3, setter: ce.setBoardReady}, - {length: 4, setter: ce.setOtherError}, - {length: 2, setter: ce.setNotConnectedOut}, - {length: 2, setter: ce.setNoCommunicationConverter}, - {length: 2, setter: ce.setNoCommunicationPuConverter}, - {length: 2, setter: ce.setInputGridVoltageHigh}, - {length: 2, setter: ce.setInputGridVoltageLow}, - {length: 2, setter: ce.setOutputGridVoltageHigh}, - {length: 2, setter: ce.setOutputGridVoltageLow}, - {length: 11, setter: ce.setInputGridVoltage}, - {length: 11, setter: ce.setOutputGridVoltage}, - {length: 2, setter: ce.setShortCircuit}, - {length: 2, setter: ce.setOverHeat}, - {length: 2, setter: ce.setFanBroken}, - {length: 2, setter: ce.setOtherHardwareError}, - {length: 2, setter: ce.setDebugConvEnabled}, - {length: 2, setter: ce.setDebugConvDisabled}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } - - for i := 0; i <= CONVERTERS_MAX; i++ { - key := key{can.CAN_ID_065, uint(i)} - cd := ConverterDebug{} - converterDebugArray[i] = &cd - fields = []content{ - {length: 3, setter: cd.setDebugModeOn}, - {length: 4, setter: cd.setDebugEnergyOn}, - {length: 2, setter: cd.setDebugTargetVoltage}, - {length: 2, setter: cd.setDebugTargetCurrent}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000} - } -} - func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan Packet { result := make(chan Packet) diff --git a/yabl/protocol_test.go b/yabl/protocol_test.go deleted file mode 100644 index 637682c..0000000 --- a/yabl/protocol_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package yabl - -import ( - "cli-mon/can" - "log" - "testing" - "time" -) - -type parameters struct { - fields []content - interval uint -} - -type content struct { - length uint8 - setter func(uint64 uint64) - last time.Time -} - -func TestStartProtocolParsing(t *testing.T) { - - var cis = ContactorInternalState{} - - var cisMsg = parameters{fields: []content{ - {length: 3, setter: cis.setContactorReady}, - {length: 2, setter: cis.setContactorOn}, - {length: 2, setter: cis.setUnexpectedState}, - {length: 2, setter: cis.setIsolated}, - {length: 2, setter: cis.setDebugEnabled}, - }} - - var messages = map[uint]parameters{ - can.CAN_ID_071: cisMsg, - } - - // try to use - var values = messages[can.CAN_ID_071] - for num, item := range values.fields { - item.setter(uint64(num)) - - log.Println(cis) - } - -} diff --git a/yabl/setters.go b/yabl/setters.go index 00ca94a..7948eae 100644 --- a/yabl/setters.go +++ b/yabl/setters.go @@ -97,7 +97,7 @@ func (t *PuPeriphery) setPwmEnabled(val uint64) { } func (t *PuPeriphery) setCpLineVoltage(val uint64) { - t.CpLineVoltage = Voltage9BitType(val)/10 - 15 + t.CpLineVoltage = Voltage9BitType(val)*0.1 - 15 } func (t *LogicAuth) setAuthMode(val uint64) { diff --git a/yabl/types.go b/yabl/types.go new file mode 100644 index 0000000..8f1b0a6 --- /dev/null +++ b/yabl/types.go @@ -0,0 +1,253 @@ +package yabl + +type ContactorInternalState struct { + UnitId uint + ContactorReady BoardReadyType + ContactorOn BooleanType + UnexpectedState ErrorType + Isolated ErrorType + DebugEnabled BooleanType +} + +type ContactorInternalErrors struct { + UnitId uint + BoardReady BoardReadyType + OtherError ContactorInternalOtherErrorType + ContactorGroupChanged ContactorGroupChangedType + UnexpectedFormation ContactorInternalOtherErrorType + CpuNotReady ErrorType + PuNotReady ErrorType + Debug BooleanType + PresentContactorMode ContactorModeType +} + +type ContactorsInternalForce struct { + UnitId uint + ForceModeEnabled BooleanType + ForceModeValue ForceModeType +} + +type ContactorInternalDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugContactorOn DebugSwitchModeType +} + +type PuPresentEnergy struct { + UnitId uint + V2GMode V2GModeType + VoltageBefore Voltage11BitType + VoltageAfter Voltage11BitType + PresentCurrent Current10BitType +} + +type PuPeriphery struct { + UnitId uint + ConnectorInsert BooleanType + ContactorOn BooleanType + ConnectorLocked BooleanType + CpLineLevel CpLineLevelType + IsolationState IsolationStateType + ChargingAllowed BooleanType + PwmEnabled BooleanType + CpLineVoltage Voltage9BitType +} + +type LogicAuth struct { + UnitId uint + AuthMode AuthModeType + AuthState AuthStateType +} + +type LogicEnergyMode struct { + UnitId uint + V2gMode V2GModeType + CurrentMax Current10BitType + VoltageMax Voltage11BitType + PowerMax Power14BitType +} + +type LogicErrors struct { + UnitId uint + BoardReady BoardReadyType + NotReadySettings ErrorType +} + +type LogicWorkingMode struct { + UnitId uint + TargetContactorMode ContactorModeType + Availability BooleanType +} + +type CpuPresentEnergy struct { + UnitId uint + PowerDirectionMode V2GModeType + PresentCurrent Current10BitType + PresentVoltage Voltage11BitType +} + +type CpuPeriphery struct { + UnitId uint + ContactorInput BooleanType + CircuitBreakerInput BooleanType + CircuitBreakerPowerCBInput BooleanType +} + +type CpuEnergySettings struct { + UnitId uint + CurrentMax Current10BitType + VoltageMax Voltage11BitType + PowerMax Power14BitType + TargetBatteryVoltage Voltage11BitType + TargetGoalVoltage Voltage11BitType +} + +type CpuErrors struct { + UnitId uint + BoardReady BoardReadyType + OtherError OtherError4BitType + RedButtonHard ErrorType + RedButtonSoft ErrorType + ModulesGone ErrorType + GridVoltageHighErr ErrorType + GridVoltageHighWarn ErrorType + GridVoltageLowWarn ErrorType + GridVoltageLowErr ErrorType + GridVoltageLow Voltage11BitType + GridVoltageHigh Voltage11BitType + GridVoltageEmpty ErrorType + NotReadySecc ErrorType + NotReadyPu ErrorType + NotReadyContactors ErrorType + DebugConvertersEnabled ErrorType + ContactorInputError ErrorType + NotReadyPeriphery ErrorType +} + +type CpuDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugContactorInputOn DebugSwitchModeType + DebugCircuitBreakerOn DebugSwitchModeType + DebugRedButtonSoftware DebugSwitchModeType +} + +type PuErrors struct { + UnitId uint + BoardReady BoardReadyType + OtherError OtherError4BitType + IncorrectVoltage ErrorType + IncorrectVoltageValue Voltage11BitType + IncorrectCurrent ErrorType + IncorrectCurrentValue Current10BitType + IsolationBroken ErrorType + CpLineBroken ErrorType + CpLineGap69 ErrorType + CableReady BoardReadyType + NotReadyCpu ErrorType + NotReadySecc ErrorType + ContactorOutputError ErrorType + DebugContactorOutputEnabled BooleanType + OutputCircuitBreakerEnabled ErrorType + OutputCircuitBreakerEnabledValue SignedVoltage12bitType +} + +type PuDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugContactorOutputOn DebugSwitchModeType +} + +type SeccTargetEnergy struct { + UnitId uint + TargetChargingAllow BooleanType + TargetBatteryVoltage Voltage11BitType + TargetGoalVoltage Voltage11BitType + TargetCurrent Current10BitType +} + +type SeccErrors struct { + UnitId uint + BoardReady BoardReadyType + NotReadyLogic ErrorType +} + +type PeripheryState struct { + UnitId uint + OtherErrorSeverity BoardReadyType + OtherError OtherError4BitType + ErrorShakeSensor ErrorType + ErrorCoolingGroup ErrorType + PeripheryErrorCoolingGroup ErrorType + ErrorFireEmergency ErrorType + ErrorFireEmergencyRun ErrorType + ErrorFireEmergencyControl ErrorType + ErrorOvervoltageIn ErrorType + PeripheryErrorPowerSupply ErrorType + ErrorFan ErrorType + ErrorOvervoltageOut ErrorType + ErrorStateRemoteMode ErrorType + DebugShsnFanEnabled BooleanType + DebugShptFanEnabled BooleanType + DebugIoBoardTestLampEnabled BooleanType + ErrorFireEmergencyCircuitBreaker ErrorType + ErrorExtLightCircuitBreaker ErrorType + ErrorIndicationCircuitBreaker ErrorType + ErrorLowVoltagePowerCircuitBreaker ErrorType + ErrorContactorsInternalCircuitBreaker ErrorType + ErrorPlcCircuitBreaker ErrorType +} + +type PeripheryInfo struct { + UnitId uint + InfoDoorOpen BooleanType + TempAirIn SignedAirTemp8BitType + TempAirOut SignedAirTemp8BitType + StateShsnFan BooleanType + StateShptFan BooleanType +} + +type PeripheryDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugShsnFan DebugSwitchModeType + DebugShptFan DebugSwitchModeType + DebugIoBoardTestLamp DebugSwitchModeType +} + +type ConverterPresentEnergy struct { + UnitId uint + V2gMode V2GModeType + PresentVoltage Voltage11BitType + PresentCurrent Current10BitType + ConnectedOut ConnectedOut8bitType +} + +type ConverterErrors struct { + UnitId uint + BoardReady BoardReadyType + OtherError OtherError4BitType + NotConnectedOut ErrorType + NoCommunicationConverter ErrorType + NoCommunicationPuConverter ErrorType + InputGridVoltageHigh ErrorType + InputGridVoltageLow ErrorType + OutputGridVoltageHigh ErrorType + OutputGridVoltageLow ErrorType + InputGridVoltage Voltage11BitType + OutputGridVoltage Voltage11BitType + ShortCircuit ErrorType + OverHeat ErrorType + FanBroken ErrorType + OtherHardwareError ErrorType + DebugConvEnabled BooleanType + DebugConvDisabled BooleanType +} + +type ConverterDebug struct { + UnitId uint + DebugModeOn BooleanType + DebugEnergyOn DebugSwitchModeType + DebugTargetVoltage Voltage11BitType + DebugTargetCurrent Current10BitType +} -- 2.54.0 From 00762d173bb2feac9de8389763bc149ea0f05c21 Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Fri, 7 Jul 2023 04:28:46 +0300 Subject: [PATCH 04/15] New events api implementation --- cli-mon.go | 17 +- ui/helper.go | 43 ---- ui/model.go | 81 ------- ui/ui.go | 23 +- ui/view.go | 37 ++-- yabl/const.go | 52 ++--- yabl/init.go | 555 +++++++++++++++++++++++++---------------------- yabl/protocol.go | 186 ++++------------ 8 files changed, 428 insertions(+), 566 deletions(-) delete mode 100644 ui/helper.go delete mode 100644 ui/model.go diff --git a/cli-mon.go b/cli-mon.go index 262890d..78f75ac 100644 --- a/cli-mon.go +++ b/cli-mon.go @@ -7,12 +7,14 @@ import ( "flag" "fmt" "os" + "reflect" ) func main() { filename := flag.String("f", "", "Candump filename") canbus := flag.String("i", "", "CAN bus interface") stdin := flag.Bool("s", false, "Read from stdin") + gui := flag.Bool("gui", false, "Text mode gui") flag.Parse() var frames <-chan *can.CanFrame @@ -40,5 +42,18 @@ func main() { var messages = yabl.StartProtocolParsing(frames) - ui.InitCliApp(messages) + if *gui { + ui.InitCliApp(messages) + } else { + for msg := range messages { + val := getField(msg.Object, msg.Field) + fmt.Printf("%v %v %v %v\n", msg.Updated, msg.ActionName, msg.Field, val) + } + } +} + +func getField(v yabl.Action, field yabl.FName) interface{} { + r := reflect.ValueOf(v) + f := reflect.Indirect(r).FieldByName(string(field)) + return f.Interface() } diff --git a/ui/helper.go b/ui/helper.go deleted file mode 100644 index 0ab17a9..0000000 --- a/ui/helper.go +++ /dev/null @@ -1,43 +0,0 @@ -package ui - -import "cli-mon/yabl" - -var fNewCIS = func(packet *yabl.ContactorInternalState) *contactorType { - return &contactorType{state: packet} -} -var fGetCIS = func(c *contactorType) *yabl.ContactorInternalState { - return c.state -} -var fSetCIS = func(c *contactorType, packet *yabl.ContactorInternalState) { - c.state = packet -} - -var fNewCES = func(packet *yabl.ContactorInternalErrors) *contactorType { - return &contactorType{errors: packet} -} -var fGetCES = func(c *contactorType) *yabl.ContactorInternalErrors { - return c.errors -} -var fSetCES = func(c *contactorType, packet *yabl.ContactorInternalErrors) { - c.errors = packet -} - -var fNewPPE = func(packet *yabl.PuPresentEnergy) *connectorType { - return &connectorType{energy: packet} -} -var fGetPPE = func(c *connectorType) *yabl.PuPresentEnergy { - return c.energy -} -var fSetPPE = func(c *connectorType, packet *yabl.PuPresentEnergy) { - c.energy = packet -} - -var fNewPP = func(packet *yabl.PuPeriphery) *connectorType { - return &connectorType{state: packet} -} -var fGetPP = func(c *connectorType) *yabl.PuPeriphery { - return c.state -} -var fSetPP = func(c *connectorType, packet *yabl.PuPeriphery) { - c.state = packet -} diff --git a/ui/model.go b/ui/model.go deleted file mode 100644 index 7622406..0000000 --- a/ui/model.go +++ /dev/null @@ -1,81 +0,0 @@ -package ui - -import ( - "cli-mon/yabl" - "github.com/gizak/termui/v3/widgets" - "reflect" -) - -type connectorType struct { - energy *yabl.PuPresentEnergy - state *yabl.PuPeriphery -} - -type contactorType struct { - state *yabl.ContactorInternalState - errors *yabl.ContactorInternalErrors -} - -type modelTypes interface { - *connectorType | *contactorType -} - -type dataTypes interface { - *yabl.PuPresentEnergy | *yabl.PuPeriphery | *yabl.ContactorInternalState | *yabl.ContactorInternalErrors -} - -type fNewType[T modelTypes, V dataTypes] func(e V) T -type fGetType[T modelTypes, V dataTypes] func(m T) V -type fSetType[T modelTypes, V dataTypes] func(m T, e V) - -var connectors = make([]*connectorType, connectorsCount+1) -var contactors = make([]*contactorType, contactorsCount+1) - -var connUI [connectorsCount + 1]*widgets.Paragraph -var contUI [contactorsCount + 1]*widgets.Paragraph -var contactorsErr *widgets.Paragraph - -func process(message yabl.Packet) { - if message == nil { - return - } - - unitId := message.GetUnitId() - - switch msg := message.(type) { - case *yabl.ContactorInternalState: - if updateOrNew(contactors, unitId, msg, fNewCIS, fGetCIS, fSetCIS) { - updateContactorsView(unitId) - } - - case *yabl.ContactorInternalErrors: - if updateOrNew(contactors, unitId, msg, fNewCES, fGetCES, fSetCES) { - updateContactorsStateView() - } - - case *yabl.PuPeriphery: - if updateOrNew(connectors, unitId, msg, fNewPP, fGetPP, fSetPP) { - updateConnectorsView(unitId) - } - - case *yabl.PuPresentEnergy: - if updateOrNew(connectors, unitId, msg, fNewPPE, fGetPPE, fSetPPE) { - updateConnectorsView(unitId) - } - - } -} - -func updateOrNew[T modelTypes, V dataTypes](array []T, id uint, msg V, fNew fNewType[T, V], fGet fGetType[T, V], fSet fSetType[T, V]) bool { - if model := array[id]; model != nil { - if element := fGet(model); !reflect.DeepEqual(element, msg) { - fSet(model, msg) - return true - } - } else { - model = fNew(msg) - array[id] = model - return true - } - return false -} diff --git a/ui/ui.go b/ui/ui.go index 6ae7959..4cf7f1e 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -12,7 +12,11 @@ const headerHeight int = 4 const contactorsCount = 18 const connectorsCount = 6 -func InitCliApp(events <-chan yabl.Packet) { +var connUI [connectorsCount + 1]*widgets.Paragraph +var contUI [contactorsCount + 1]*widgets.Paragraph +var contactorsErr *widgets.Paragraph + +func InitCliApp(events <-chan *yabl.Event) { if err := ui.Init(); err != nil { log.Fatalf("failed to initialize termui: %v", err) } @@ -86,3 +90,20 @@ func InitCliApp(events <-chan yabl.Packet) { } } } + +func process(message *yabl.Event) { + if message == nil || message.Object == nil { + return + } + + switch msg := message.Object.(type) { + case *yabl.ContactorInternalState: + updateContactorsView(msg) + case *yabl.PuPeriphery: + updateConnectorsView(msg) + case *yabl.PuPresentEnergy: + updateConnectorsView(msg) + case *yabl.ContactorInternalErrors: + updateContactorsStateView(msg) + } +} diff --git a/ui/view.go b/ui/view.go index 5397408..36db113 100644 --- a/ui/view.go +++ b/ui/view.go @@ -125,9 +125,10 @@ func newContactorsErrView() *widgets.Paragraph { return p } -func updateContactorsView(unitId uint) { - p := contUI[unitId] - s := contactors[unitId].state +func updateContactorsView(msg *yabl.ContactorInternalState) { + + p := contUI[msg.GetUnitId()] + s := msg if s == nil || p == nil { return @@ -154,10 +155,26 @@ func updateContactorsView(unitId uint) { } } -func updateConnectorsView(unitId uint) { +var connectorsState [connectorsCount + 1]*yabl.PuPeriphery +var connectorsEnergy [connectorsCount + 1]*yabl.PuPresentEnergy + +func updateConnectorsView(action yabl.Action) { + if action == nil { + return + } + + var unitId = action.GetUnitId() + + switch msg := action.(type) { + case *yabl.PuPeriphery: + connectorsState[unitId] = msg + case *yabl.PuPresentEnergy: + connectorsEnergy[unitId] = msg + } + p := connUI[unitId] - s := connectors[unitId].state - e := connectors[unitId].energy + s := connectorsState[unitId] + e := connectorsEnergy[unitId] if s == nil || e == nil { return @@ -192,15 +209,9 @@ func updateConnectorsView(unitId uint) { e.PresentCurrent) } -func updateContactorsStateView() { +func updateContactorsStateView(e *yabl.ContactorInternalErrors) { p := contactorsErr - if contactors[1] == nil { - return - } - - e := contactors[1].errors - if e == nil { return } diff --git a/yabl/const.go b/yabl/const.go index 76eff8d..2acd615 100644 --- a/yabl/const.go +++ b/yabl/const.go @@ -55,33 +55,33 @@ const ( DEBUG_SWITCH_MODE_PERMANENT_OFF DebugSwitchModeType = 4 DEBUG_SWITCH_MODE_PERMANENT_ON DebugSwitchModeType = 5 - PCpuPresentEnergy PName = "CpuPresentEnergy" - PCpuPeriphery PName = "CpuPeriphery" - PCpuEnergySettings PName = "CpuEnergySettings" - PCpuErrors PName = "CpuErrors" - PCpuDebug PName = "CpuDebug" - PPuPresentEnergy PName = "PuPresentEnergy" - PPuPeriphery PName = "PuPeriphery" - PPuErrors PName = "PuErrors" - PPuDebug PName = "PuDebug" - PSeccTargetEnergy PName = "SeccTargetEnergy" - PSeccErrors PName = "SeccErrors" - PLogicAuth PName = "LogicAuth" - PLogicEnergyMode PName = "LogicEnergyMode" - PLogicErrors PName = "LogicErrors" - PLogicWorkingMode PName = "LogicWorkingMode" - PContactorInternalState PName = "ContactorInternalState" - PContactorInternalErrors PName = "ContactorInternalErrors" - PContactorsInternalForce PName = "ContactorsInternalForce" - PContactorInternalDebug PName = "ContactorInternalDebug" - PPeripheryState PName = "PeripheryState" - PPeripheryInfo PName = "PeripheryInfo" - PPeripheryDebug PName = "PeripheryDebug" - PConverterPresentEnergy PName = "ConverterPresentEnergy" - PConverterErrors PName = "ConverterErrors" - PConverterDebug PName = "ConverterDebug" + PCpuPresentEnergy AName = "CpuPresentEnergy" + PCpuPeriphery AName = "CpuPeriphery" + PCpuEnergySettings AName = "CpuEnergySettings" + PCpuErrors AName = "CpuErrors" + PCpuDebug AName = "CpuDebug" + PPuPresentEnergy AName = "PuPresentEnergy" + PPuPeriphery AName = "PuPeriphery" + PPuErrors AName = "PuErrors" + PPuDebug AName = "PuDebug" + PSeccTargetEnergy AName = "SeccTargetEnergy" + PSeccErrors AName = "SeccErrors" + PLogicAuth AName = "LogicAuth" + PLogicEnergyMode AName = "LogicEnergyMode" + PLogicErrors AName = "LogicErrors" + PLogicWorkingMode AName = "LogicWorkingMode" + PContactorInternalState AName = "ContactorInternalState" + PContactorInternalErrors AName = "ContactorInternalErrors" + PContactorsInternalForce AName = "ContactorsInternalForce" + PContactorInternalDebug AName = "ContactorInternalDebug" + PPeripheryState AName = "PeripheryState" + PPeripheryInfo AName = "PeripheryInfo" + PPeripheryDebug AName = "PeripheryDebug" + PConverterPresentEnergy AName = "ConverterPresentEnergy" + PConverterErrors AName = "ConverterErrors" + PConverterDebug AName = "ConverterDebug" - FContactorReady FName = "FContactorReady" + FContactorReady FName = "ContactorReady" FContactorOn FName = "ContactorOn" FUnexpectedState FName = "UnexpectedState" FIsolated FName = "Isolated" diff --git a/yabl/init.go b/yabl/init.go index 0c0e2ca..7687be5 100644 --- a/yabl/init.go +++ b/yabl/init.go @@ -2,353 +2,388 @@ package yabl import "cli-mon/can" -func init() { - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_011, uint(i)} - cpe := CpuPresentEnergy{} - cpuPresentEnergyArray[i] = &cpe +func initialize() { + for i := uint(1); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_011, i} + cpe := &CpuPresentEnergy{UnitId: 1} + cpuPresentEnergyArray[i] = cpe fields := []field{ - {length: 2, setter: cpe.setPowerDirectionMode}, - {length: 10, setter: cpe.setPresentCurrent}, - {length: 11, setter: cpe.setPresentVoltage}, + {length: 2, setter: cpe.setPowerDirectionMode, name: FPowerDirectionMode}, + {length: 10, setter: cpe.setPresentCurrent, name: FPresentCurrent}, + {length: 11, setter: cpe.setPresentVoltage, name: FPresentVoltage}, } - protocolMap[key] = parameters{fields: fields, interval: 50, name: PCpuPresentEnergy} + protocolMap[key] = action{fields: fields, interval: 50, name: PCpuPresentEnergy, object: cpe} } - cpuPeripheryInstance = &CpuPeriphery{} + cpuPeripheryInstance = &CpuPeriphery{UnitId: 0} fields := []field{ - {length: 2, setter: cpuPeripheryInstance.setContactorInput}, - {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerInput}, - {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerPowerCBInput}, + {length: 2, setter: cpuPeripheryInstance.setContactorInput, name: FContactorInput}, + {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerInput, name: FCircuitBreakerInput}, + {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerPowerCBInput, name: FCircuitBreakerPowerCBInput}, + } + protocolMap[key{can.CAN_ID_014, 0}] = action{ + fields: fields, + interval: 1000, + name: PCpuPeriphery, + object: cpuPeripheryInstance, } - protocolMap[key{can.CAN_ID_014, 0}] = parameters{fields: fields, interval: 1000, name: PCpuPeriphery} - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_015, uint(i)} - ces := CpuEnergySettings{} - cpuEnergySettingsArray[i] = &ces + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_015, i} + ces := &CpuEnergySettings{UnitId: i} + cpuEnergySettingsArray[i] = ces fields := []field{ - {length: 10, setter: ces.setCurrentMax}, - {length: 11, setter: ces.setVoltageMax}, - {length: 14, setter: ces.setPowerMax}, - {length: 11, setter: ces.setTargetBatteryVoltage}, - {length: 11, setter: ces.setTargetGoalVoltage}, + {length: 10, setter: ces.setCurrentMax, name: FCurrentMax}, + {length: 11, setter: ces.setVoltageMax, name: FVoltageMax}, + {length: 14, setter: ces.setPowerMax, name: FPowerMax}, + {length: 11, setter: ces.setTargetBatteryVoltage, name: FTargetBatteryVoltage}, + {length: 11, setter: ces.setTargetGoalVoltage, name: FTargetGoalVoltage}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PCpuEnergySettings} + protocolMap[key] = action{fields: fields, interval: 1000, name: PCpuEnergySettings, object: ces} } - cpuErrorsInstance = &CpuErrors{} + cpuErrorsInstance = &CpuErrors{UnitId: 0} fields = []field{ - {length: 3, setter: cpuErrorsInstance.setBoardReady}, - {length: 4, setter: cpuErrorsInstance.setOtherError}, - {length: 2, setter: cpuErrorsInstance.setRedButtonHard}, - {length: 2, setter: cpuErrorsInstance.setRedButtonSoft}, - {length: 2, setter: cpuErrorsInstance.setModulesGone}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageHighErr}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageHighWarn}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageLowWarn}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageLowErr}, - {length: 11, setter: cpuErrorsInstance.setGridVoltageLow}, - {length: 11, setter: cpuErrorsInstance.setGridVoltageHigh}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageEmpty}, - {length: 2, setter: cpuErrorsInstance.setNotReadySecc}, - {length: 2, setter: cpuErrorsInstance.setNotReadyPu}, - {length: 2, setter: cpuErrorsInstance.setNotReadyContactors}, - {length: 2, setter: cpuErrorsInstance.setDebugConvertersEnabled}, - {length: 2, setter: cpuErrorsInstance.setContactorInputError}, - {length: 2, setter: cpuErrorsInstance.setNotReadyPeriphery}, + {length: 3, setter: cpuErrorsInstance.setBoardReady, name: FBoardReady}, + {length: 4, setter: cpuErrorsInstance.setOtherError, name: FOtherError}, + {length: 2, setter: cpuErrorsInstance.setRedButtonHard, name: FRedButtonHard}, + {length: 2, setter: cpuErrorsInstance.setRedButtonSoft, name: FRedButtonSoft}, + {length: 2, setter: cpuErrorsInstance.setModulesGone, name: FModulesGone}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageHighErr, name: FGridVoltageHighErr}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageHighWarn, name: FGridVoltageHighWarn}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageLowWarn, name: FGridVoltageLowWarn}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageLowErr, name: FGridVoltageLowErr}, + {length: 11, setter: cpuErrorsInstance.setGridVoltageLow, name: FGridVoltageLow}, + {length: 11, setter: cpuErrorsInstance.setGridVoltageHigh, name: FGridVoltageHigh}, + {length: 2, setter: cpuErrorsInstance.setGridVoltageEmpty, name: FGridVoltageEmpty}, + {length: 2, setter: cpuErrorsInstance.setNotReadySecc, name: FNotReadySecc}, + {length: 2, setter: cpuErrorsInstance.setNotReadyPu, name: FNotReadyPu}, + {length: 2, setter: cpuErrorsInstance.setNotReadyContactors, name: FNotReadyContactors}, + {length: 2, setter: cpuErrorsInstance.setDebugConvertersEnabled, name: FDebugConvertersEnabled}, + {length: 2, setter: cpuErrorsInstance.setContactorInputError, name: FContactorInputError}, + {length: 2, setter: cpuErrorsInstance.setNotReadyPeriphery, name: FNotReadyPeriphery}, + } + protocolMap[key{can.CAN_ID_016, 0}] = action{ + fields: fields, + interval: 1000, + name: PCpuErrors, + object: cpuErrorsInstance, } - protocolMap[key{can.CAN_ID_016, 0}] = parameters{fields: fields, interval: 1000, name: PCpuErrors} - cpuDebugInstance = &CpuDebug{} + cpuDebugInstance = &CpuDebug{UnitId: 0} fields = []field{ - {length: 2, setter: cpuDebugInstance.setDebugModeOn}, - {length: 3, setter: cpuDebugInstance.setDebugContactorInputOn}, - {length: 3, setter: cpuDebugInstance.setDebugCircuitBreakerOn}, - {length: 3, setter: cpuDebugInstance.setDebugRedButtonSoftware}, + {length: 2, setter: cpuDebugInstance.setDebugModeOn, name: FDebugModeOn}, + {length: 3, setter: cpuDebugInstance.setDebugContactorInputOn, name: FDebugContactorInputOn}, + {length: 3, setter: cpuDebugInstance.setDebugCircuitBreakerOn, name: FDebugCircuitBreakerOn}, + {length: 3, setter: cpuDebugInstance.setDebugRedButtonSoftware, name: FDebugRedButtonSoftware}, + } + protocolMap[key{can.CAN_ID_01A, 0}] = action{ + fields: fields, + interval: 1000, + name: PCpuDebug, + object: cpuDebugInstance, } - protocolMap[key{can.CAN_ID_01A, 0}] = parameters{fields: fields, interval: 1000, name: PCpuDebug} - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_021, uint(i)} - ppe := PuPresentEnergy{} - puPresentEnergyArray[i] = &ppe + for i := uint(1); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_021, i} + ppe := &PuPresentEnergy{UnitId: i} + puPresentEnergyArray[i] = ppe fields := []field{ - {length: 2, setter: ppe.setV2GMode}, - {length: 11, setter: ppe.setVoltageBefore}, - {length: 11, setter: ppe.setVoltageAfter}, - {length: 10, setter: ppe.setPresentCurrent}, + {length: 2, setter: ppe.setV2GMode, name: FV2GMode}, + {length: 11, setter: ppe.setVoltageBefore, name: FVoltageBefore}, + {length: 11, setter: ppe.setVoltageAfter, name: FVoltageAfter}, + {length: 10, setter: ppe.setPresentCurrent, name: FPresentCurrent}, } - protocolMap[key] = parameters{fields: fields, interval: 50, name: PPuPresentEnergy} + protocolMap[key] = action{fields: fields, interval: 50, name: PPuPresentEnergy, object: ppe} } - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_022, uint(i)} - pp := PuPeriphery{} - puPeripheryArray[i] = &pp + for i := uint(1); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_022, i} + pp := &PuPeriphery{UnitId: i} + puPeripheryArray[i] = pp fields := []field{ - {length: 2, setter: pp.setConnectorInsert}, - {length: 2, setter: pp.setContactorOn}, - {length: 2, setter: pp.setConnectorLocked}, - {length: 3, setter: pp.setCpLineLevel}, - {length: 3, setter: pp.setIsolationState}, - {length: 2, setter: pp.setChargingAllowed}, - {length: 2, setter: pp.setPwmEnabled}, - {length: 9, setter: pp.setCpLineVoltage}, + {length: 2, setter: pp.setConnectorInsert, name: FConnectorInsert}, + {length: 2, setter: pp.setContactorOn, name: FContactorOn}, + {length: 2, setter: pp.setConnectorLocked, name: FConnectorLocked}, + {length: 3, setter: pp.setCpLineLevel, name: FCpLineLevel}, + {length: 3, setter: pp.setIsolationState, name: FIsolationState}, + {length: 2, setter: pp.setChargingAllowed, name: FChargingAllowed}, + {length: 2, setter: pp.setPwmEnabled, name: FPwmEnabled}, + {length: 9, setter: pp.setCpLineVoltage, name: FCpLineVoltage}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPuPeriphery} + protocolMap[key] = action{fields: fields, interval: 1000, name: PPuPeriphery, object: pp} } - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_023, uint(i)} - pe := PuErrors{} - puErrorsArray[i] = &pe + for i := uint(1); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_023, i} + pe := &PuErrors{UnitId: 1} + puErrorsArray[i] = pe fields := []field{ - {length: 3, setter: pe.setBoardReady}, - {length: 4, setter: pe.setOtherError}, - {length: 2, setter: pe.setIncorrectVoltage}, - {length: 11, setter: pe.setIncorrectVoltageValue}, - {length: 2, setter: pe.setIncorrectCurrent}, - {length: 10, setter: pe.setIncorrectCurrentValue}, - {length: 2, setter: pe.setIsolationBroken}, - {length: 2, setter: pe.setCpLineBroken}, - {length: 2, setter: pe.setCpLineGap69}, - {length: 3, setter: pe.setCableReady}, - {length: 2, setter: pe.setNotReadyCpu}, - {length: 2, setter: pe.setNotReadySecc}, - {length: 2, setter: pe.setContactorOutputError}, - {length: 2, setter: pe.setDebugContactorOutputEnabled}, - {length: 2, setter: pe.setOutputCircuitBreakerEnabled}, - {length: 12, setter: pe.setOutputCircuitBreakerEnabledValue}, + {length: 3, setter: pe.setBoardReady, name: FBoardReady}, + {length: 4, setter: pe.setOtherError, name: FOtherError}, + {length: 2, setter: pe.setIncorrectVoltage, name: FIncorrectVoltage}, + {length: 11, setter: pe.setIncorrectVoltageValue, name: FIncorrectVoltageValue}, + {length: 2, setter: pe.setIncorrectCurrent, name: FIncorrectCurrent}, + {length: 10, setter: pe.setIncorrectCurrentValue, name: FIncorrectCurrentValue}, + {length: 2, setter: pe.setIsolationBroken, name: FIsolationBroken}, + {length: 2, setter: pe.setCpLineBroken, name: FCpLineBroken}, + {length: 2, setter: pe.setCpLineGap69, name: FCpLineGap69}, + {length: 3, setter: pe.setCableReady, name: FCableReady}, + {length: 2, setter: pe.setNotReadyCpu, name: FNotReadyCpu}, + {length: 2, setter: pe.setNotReadySecc, name: FNotReadySecc}, + {length: 2, setter: pe.setContactorOutputError, name: FContactorOutputError}, + {length: 2, setter: pe.setDebugContactorOutputEnabled, name: FDebugContactorOutputEnabled}, + {length: 2, setter: pe.setOutputCircuitBreakerEnabled, name: FOutputCircuitBreakerEnabled}, + {length: 12, setter: pe.setOutputCircuitBreakerEnabledValue, name: FOutputCircuitBreakerEnabledValue}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPuErrors} + protocolMap[key] = action{fields: fields, interval: 1000, name: PPuErrors, object: pe} } - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_02A, uint(i)} - pd := PuDebug{} - puDebugArray[i] = &pd + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_02A, i} + pd := &PuDebug{UnitId: i} + puDebugArray[i] = pd fields = []field{ - {length: 2, setter: pd.setDebugModeOn}, - {length: 3, setter: pd.setDebugContactorOutputOn}, + {length: 2, setter: pd.setDebugModeOn, name: FDebugModeOn}, + {length: 3, setter: pd.setDebugContactorOutputOn, name: FDebugContactorOutputOn}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPuDebug} + protocolMap[key] = action{fields: fields, interval: 1000, name: PPuDebug, object: pd} } - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_041, uint(i)} - ste := SeccTargetEnergy{} - seccTargetEnergyArray[i] = &ste + for i := uint(1); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_041, i} + ste := &SeccTargetEnergy{UnitId: i} + seccTargetEnergyArray[i] = ste fields = []field{ - {length: 2, setter: ste.setTargetChargingAllow}, - {length: 11, setter: ste.setTargetBatteryVoltage}, - {length: 11, setter: ste.setTargetGoalVoltage}, - {length: 10, setter: ste.setTargetCurrent}, + {length: 2, setter: ste.setTargetChargingAllow, name: FTargetChargingAllow}, + {length: 11, setter: ste.setTargetBatteryVoltage, name: FTargetBatteryVoltage}, + {length: 11, setter: ste.setTargetGoalVoltage, name: FTargetGoalVoltage}, + {length: 10, setter: ste.setTargetCurrent, name: FTargetCurrent}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PSeccTargetEnergy} + protocolMap[key] = action{fields: fields, interval: 1000, name: PSeccTargetEnergy, object: ste} } - for i := 1; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_042, uint(i)} - se := SeccErrors{} - seccErrorsArray[i] = &se + for i := uint(1); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_042, i} + se := &SeccErrors{UnitId: i} + seccErrorsArray[i] = se fields = []field{ - {length: 3, setter: se.setBoardReady}, - {length: 2, setter: se.setNotReadyLogic}, + {length: 3, setter: se.setBoardReady, name: FBoardReady}, + {length: 2, setter: se.setNotReadyLogic, name: FNotReadyLogic}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PSeccErrors} + protocolMap[key] = action{fields: fields, interval: 1000, name: PSeccErrors, object: se} } - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_046, uint(i)} - la := LogicAuth{} - logicAuthArray[i] = &la + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_046, i} + la := &LogicAuth{UnitId: i} + logicAuthArray[i] = la fields = []field{ - {length: 2, setter: la.setAuthMode}, - {length: 3, setter: la.setAuthState}, + {length: 2, setter: la.setAuthMode, name: FAuthMode}, + {length: 3, setter: la.setAuthState, name: FAuthState}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PLogicAuth} + protocolMap[key] = action{fields: fields, interval: 1000, name: PLogicAuth, object: la} } - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_047, uint(i)} - la := LogicEnergyMode{} - logicEnergyMode[i] = &la + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_047, i} + lem := &LogicEnergyMode{UnitId: i} + logicEnergyMode[i] = lem fields = []field{ - {length: 2, setter: la.setV2gMode}, - {length: 10, setter: la.setCurrentMax}, - {length: 11, setter: la.setVoltageMax}, - {length: 14, setter: la.setPowerMax}, + {length: 2, setter: lem.setV2gMode, name: FV2gMode}, + {length: 10, setter: lem.setCurrentMax, name: FCurrentMax}, + {length: 11, setter: lem.setVoltageMax, name: FVoltageMax}, + {length: 14, setter: lem.setPowerMax, name: FPowerMax}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PLogicEnergyMode} + protocolMap[key] = action{fields: fields, interval: 1000, name: PLogicEnergyMode, object: lem} } - logicErrorsInstance = &LogicErrors{} + logicErrorsInstance = &LogicErrors{UnitId: 0} fields = []field{ - {length: 3, setter: logicErrorsInstance.setBoardReady}, - {length: 2, setter: logicErrorsInstance.setNotReadySettings}, + {length: 3, setter: logicErrorsInstance.setBoardReady, name: FBoardReady}, + {length: 2, setter: logicErrorsInstance.setNotReadySettings, name: FNotReadySettings}, + } + protocolMap[key{can.CAN_ID_048, 0}] = action{ + fields: fields, + interval: 1000, + name: PLogicErrors, + object: logicErrorsInstance, } - protocolMap[key{can.CAN_ID_048, 0}] = parameters{fields: fields, interval: 1000, name: PLogicErrors} - logicWorkingMode = &LogicWorkingMode{} + logicWorkingMode = &LogicWorkingMode{UnitId: 0} fields = []field{ - {length: 5, setter: logicWorkingMode.setTargetContactorMode}, - {length: 2, setter: logicWorkingMode.setAvailability}, + {length: 5, setter: logicWorkingMode.setTargetContactorMode, name: FTargetContactorMode}, + {length: 2, setter: logicWorkingMode.setAvailability, name: FAvailability}, + } + protocolMap[key{can.CAN_ID_049, 0}] = action{ + fields: fields, + interval: 1000, + name: PLogicWorkingMode, + object: logicWorkingMode, } - protocolMap[key{can.CAN_ID_049, 0}] = parameters{fields: fields, interval: 1000, name: PLogicWorkingMode} - for i := 0; i <= CONTACTOR_MAX; i++ { - key := key{can.CAN_ID_071, uint(i)} - cis := ContactorInternalState{} - contactorInternalStateArray[i] = &cis + for i := uint(0); i < CONTACTOR_MAX; i++ { + key := key{can.CAN_ID_071, i} + cis := &ContactorInternalState{UnitId: i} + contactorInternalStateArray[i] = cis fields = []field{ - {length: 3, setter: cis.setContactorReady}, - {length: 2, setter: cis.setContactorOn}, - {length: 2, setter: cis.setUnexpectedState}, - {length: 2, setter: cis.setIsolated}, - {length: 2, setter: cis.setDebugEnabled}, + {length: 3, setter: cis.setContactorReady, name: FContactorReady}, + {length: 2, setter: cis.setContactorOn, name: FContactorOn}, + {length: 2, setter: cis.setUnexpectedState, name: FUnexpectedState}, + {length: 2, setter: cis.setIsolated, name: FIsolated}, + {length: 2, setter: cis.setDebugEnabled, name: FDebugEnabled}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PContactorInternalState} + protocolMap[key] = action{fields: fields, interval: 1000, name: PContactorInternalState, object: cis} } - contactorInternalErrorsInstance = &ContactorInternalErrors{} + contactorInternalErrorsInstance = &ContactorInternalErrors{UnitId: 0} fields = []field{ - {length: 3, setter: contactorInternalErrorsInstance.setBoardReady}, - {length: 4, setter: contactorInternalErrorsInstance.setOtherError}, - {length: 3, setter: contactorInternalErrorsInstance.setContactorGroupChanged}, - {length: 4, setter: contactorInternalErrorsInstance.setUnexpectedFormation}, - {length: 2, setter: contactorInternalErrorsInstance.setCpuNotReady}, - {length: 2, setter: contactorInternalErrorsInstance.setPuNotReady}, - {length: 2, setter: contactorInternalErrorsInstance.setDebug}, - {length: 5, setter: contactorInternalErrorsInstance.setPresentContactorMode}, + {length: 3, setter: contactorInternalErrorsInstance.setBoardReady, name: FBoardReady}, + {length: 4, setter: contactorInternalErrorsInstance.setOtherError, name: FOtherError}, + {length: 3, setter: contactorInternalErrorsInstance.setContactorGroupChanged, name: FContactorGroupChanged}, + {length: 4, setter: contactorInternalErrorsInstance.setUnexpectedFormation, name: FUnexpectedFormation}, + {length: 2, setter: contactorInternalErrorsInstance.setCpuNotReady, name: FCpuNotReady}, + {length: 2, setter: contactorInternalErrorsInstance.setPuNotReady, name: FPuNotReady}, + {length: 2, setter: contactorInternalErrorsInstance.setDebug, name: FDebug}, + {length: 5, setter: contactorInternalErrorsInstance.setPresentContactorMode, name: FPresentContactorMode}, + } + protocolMap[key{can.CAN_ID_073, 0}] = action{ + fields: fields, + interval: 1000, + name: PContactorInternalErrors, + object: contactorInternalErrorsInstance, } - protocolMap[key{can.CAN_ID_073, 0}] = parameters{fields: fields, interval: 1000, name: PContactorInternalErrors} - contactorsInternalForce = &ContactorsInternalForce{} + contactorsInternalForce = &ContactorsInternalForce{UnitId: 0} fields = []field{ - {length: 2, setter: contactorsInternalForce.setForceModeEnabled}, - {length: 4, setter: contactorsInternalForce.setForceModeValue}, + {length: 2, setter: contactorsInternalForce.setForceModeEnabled, name: FForceModeEnabled}, + {length: 4, setter: contactorsInternalForce.setForceModeValue, name: FForceModeValue}, } - protocolMap[key{can.CAN_ID_074, 0}] = parameters{fields: fields, interval: 1000, name: PContactorsInternalForce} - - for i := 0; i <= CONTACTOR_MAX; i++ { - key := key{can.CAN_ID_075, uint(i)} - cid := ContactorInternalDebug{} - contactorInternalDebugArray[i] = &cid - fields = []field{ - {length: 2, setter: cid.setDebugModeOn}, - {length: 3, setter: cid.setDebugContactorOn}, - } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PContactorInternalDebug} + protocolMap[key{can.CAN_ID_074, 0}] = action{ + fields: fields, + interval: 1000, + name: PContactorsInternalForce, + object: contactorsInternalForce, } - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_067, uint(i)} - ps := PeripheryState{} - peripheryStateArray[i] = &ps + for i := uint(0); i < CONTACTOR_MAX; i++ { + key := key{can.CAN_ID_075, i} + cid := &ContactorInternalDebug{UnitId: i} + contactorInternalDebugArray[i] = cid fields = []field{ - {length: 3, setter: ps.setOtherErrorSeverity}, - {length: 4, setter: ps.setOtherError}, - {length: 2, setter: ps.setErrorShakeSensor}, - {length: 2, setter: ps.setErrorCoolingGroup}, - {length: 2, setter: ps.setPeripheryErrorCoolingGroup}, - {length: 2, setter: ps.setErrorFireEmergency}, - {length: 2, setter: ps.setErrorFireEmergencyRun}, - {length: 2, setter: ps.setErrorFireEmergencyControl}, - {length: 2, setter: ps.setErrorOvervoltageIn}, - {length: 2, setter: ps.setPeripheryErrorPowerSupply}, - {length: 2, setter: ps.setErrorFan}, - {length: 2, setter: ps.setErrorOvervoltageOut}, - {length: 2, setter: ps.setErrorStateRemoteMode}, - {length: 2, setter: ps.setDebugShsnFanEnabled}, - {length: 2, setter: ps.setDebugShptFanEnabled}, - {length: 2, setter: ps.setDebugIoBoardTestLampEnabled}, - {length: 2, setter: ps.setErrorFireEmergencyCircuitBreaker}, - {length: 2, setter: ps.setErrorExtLightCircuitBreaker}, - {length: 2, setter: ps.setErrorIndicationCircuitBreaker}, - {length: 2, setter: ps.setErrorLowVoltagePowerCircuitBreaker}, - {length: 2, setter: ps.setErrorContactorsInternalCircuitBreaker}, - {length: 2, setter: ps.setErrorPlcCircuitBreaker}, + {length: 2, setter: cid.setDebugModeOn, name: FDebugModeOn}, + {length: 3, setter: cid.setDebugContactorOn, name: FDebugContactorOn}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPeripheryState} + protocolMap[key] = action{fields: fields, interval: 1000, name: PContactorInternalDebug, object: cid} } - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_068, uint(i)} - pi := PeripheryInfo{} - peripheryInfoArray[i] = &pi + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_067, i} + ps := &PeripheryState{UnitId: i} + peripheryStateArray[i] = ps fields = []field{ - {length: 2, setter: pi.setInfoDoorOpen}, - {length: 8, setter: pi.setTempAirIn}, - {length: 8, setter: pi.setTempAirOut}, - {length: 2, setter: pi.setStateShsnFan}, - {length: 2, setter: pi.setStateShptFan}, + {length: 3, setter: ps.setOtherErrorSeverity, name: FOtherErrorSeverity}, + {length: 4, setter: ps.setOtherError, name: FOtherError}, + {length: 2, setter: ps.setErrorShakeSensor, name: FErrorShakeSensor}, + {length: 2, setter: ps.setErrorCoolingGroup, name: FErrorCoolingGroup}, + {length: 2, setter: ps.setPeripheryErrorCoolingGroup, name: FPeripheryErrorCoolingGroup}, + {length: 2, setter: ps.setErrorFireEmergency, name: FErrorFireEmergency}, + {length: 2, setter: ps.setErrorFireEmergencyRun, name: FErrorFireEmergencyRun}, + {length: 2, setter: ps.setErrorFireEmergencyControl, name: FErrorFireEmergencyControl}, + {length: 2, setter: ps.setErrorOvervoltageIn, name: FErrorOvervoltageIn}, + {length: 2, setter: ps.setPeripheryErrorPowerSupply, name: FPeripheryErrorPowerSupply}, + {length: 2, setter: ps.setErrorFan, name: FErrorFan}, + {length: 2, setter: ps.setErrorOvervoltageOut, name: FErrorOvervoltageOut}, + {length: 2, setter: ps.setErrorStateRemoteMode, name: FErrorStateRemoteMode}, + {length: 2, setter: ps.setDebugShsnFanEnabled, name: FDebugShsnFanEnabled}, + {length: 2, setter: ps.setDebugShptFanEnabled, name: FDebugShptFanEnabled}, + {length: 2, setter: ps.setDebugIoBoardTestLampEnabled, name: FDebugIoBoardTestLampEnabled}, + {length: 2, setter: ps.setErrorFireEmergencyCircuitBreaker, name: FErrorFireEmergencyCircuitBreaker}, + {length: 2, setter: ps.setErrorExtLightCircuitBreaker, name: FErrorExtLightCircuitBreaker}, + {length: 2, setter: ps.setErrorIndicationCircuitBreaker, name: FErrorIndicationCircuitBreaker}, + {length: 2, setter: ps.setErrorLowVoltagePowerCircuitBreaker, name: FErrorLowVoltagePowerCircuitBreaker}, + {length: 2, setter: ps.setErrorContactorsInternalCircuitBreaker, name: FErrorContactorsInternalCircuitBreaker}, + {length: 2, setter: ps.setErrorPlcCircuitBreaker, name: FErrorPlcCircuitBreaker}, } - protocolMap[key] = parameters{fields: fields, interval: 5000, name: PPeripheryInfo} + protocolMap[key] = action{fields: fields, interval: 1000, name: PPeripheryState, object: ps} } - for i := 0; i <= CONNECTOR_COUNT; i++ { - key := key{can.CAN_ID_06C, uint(i)} - pd := PeripheryDebug{} - peripheryDebugArray[i] = &pd + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_068, i} + pi := &PeripheryInfo{UnitId: i} + peripheryInfoArray[i] = pi fields = []field{ - {length: 2, setter: pd.setDebugModeOn}, - {length: 3, setter: pd.setDebugShsnFan}, - {length: 3, setter: pd.setDebugShptFan}, - {length: 3, setter: pd.setDebugIoBoardTestLamp}, + {length: 2, setter: pi.setInfoDoorOpen, name: FInfoDoorOpen}, + {length: 8, setter: pi.setTempAirIn, name: FTempAirIn}, + {length: 8, setter: pi.setTempAirOut, name: FTempAirOut}, + {length: 2, setter: pi.setStateShsnFan, name: FStateShsnFan}, + {length: 2, setter: pi.setStateShptFan, name: FStateShptFan}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PPeripheryDebug} + protocolMap[key] = action{fields: fields, interval: 5000, name: PPeripheryInfo, object: pi} } - for i := 1; i <= CONVERTERS_MAX; i++ { - key := key{can.CAN_ID_061, uint(i)} - cpe := ConverterPresentEnergy{} - converterPresentEnergyArray[i] = &cpe + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_06C, i} + pd := &PeripheryDebug{UnitId: i} + peripheryDebugArray[i] = pd fields = []field{ - {length: 2, setter: cpe.setV2gMode}, - {length: 11, setter: cpe.setPresentVoltage}, - {length: 10, setter: cpe.setPresentCurrent}, - {length: 8, setter: cpe.setConnectedOut}, + {length: 2, setter: pd.setDebugModeOn, name: FDebugModeOn}, + {length: 3, setter: pd.setDebugShsnFan, name: FDebugShsnFan}, + {length: 3, setter: pd.setDebugShptFan, name: FDebugShptFan}, + {length: 3, setter: pd.setDebugIoBoardTestLamp, name: FDebugIoBoardTestLamp}, } - protocolMap[key] = parameters{fields: fields, interval: 500, name: PConverterPresentEnergy} + protocolMap[key] = action{fields: fields, interval: 1000, name: PPeripheryDebug, object: pd} } - for i := 1; i <= CONVERTERS_MAX; i++ { - key := key{can.CAN_ID_062, uint(i)} - ce := ConverterErrors{} - converterErrorsArray[i] = &ce + for i := uint(1); i < CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_061, i} + cpe := &ConverterPresentEnergy{UnitId: i} + converterPresentEnergyArray[i] = cpe fields = []field{ - {length: 3, setter: ce.setBoardReady}, - {length: 4, setter: ce.setOtherError}, - {length: 2, setter: ce.setNotConnectedOut}, - {length: 2, setter: ce.setNoCommunicationConverter}, - {length: 2, setter: ce.setNoCommunicationPuConverter}, - {length: 2, setter: ce.setInputGridVoltageHigh}, - {length: 2, setter: ce.setInputGridVoltageLow}, - {length: 2, setter: ce.setOutputGridVoltageHigh}, - {length: 2, setter: ce.setOutputGridVoltageLow}, - {length: 11, setter: ce.setInputGridVoltage}, - {length: 11, setter: ce.setOutputGridVoltage}, - {length: 2, setter: ce.setShortCircuit}, - {length: 2, setter: ce.setOverHeat}, - {length: 2, setter: ce.setFanBroken}, - {length: 2, setter: ce.setOtherHardwareError}, - {length: 2, setter: ce.setDebugConvEnabled}, - {length: 2, setter: ce.setDebugConvDisabled}, + {length: 2, setter: cpe.setV2gMode, name: FV2gMode}, + {length: 11, setter: cpe.setPresentVoltage, name: FPresentVoltage}, + {length: 10, setter: cpe.setPresentCurrent, name: FPresentCurrent}, + {length: 8, setter: cpe.setConnectedOut, name: FConnectedOut}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PConverterErrors} + protocolMap[key] = action{fields: fields, interval: 500, name: PConverterPresentEnergy, object: cpe} } - for i := 0; i <= CONVERTERS_MAX; i++ { - key := key{can.CAN_ID_065, uint(i)} - cd := ConverterDebug{} - converterDebugArray[i] = &cd + for i := uint(1); i < CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_062, i} + ce := &ConverterErrors{UnitId: i} + converterErrorsArray[i] = ce fields = []field{ - {length: 3, setter: cd.setDebugModeOn}, - {length: 4, setter: cd.setDebugEnergyOn}, - {length: 2, setter: cd.setDebugTargetVoltage}, - {length: 2, setter: cd.setDebugTargetCurrent}, + {length: 3, setter: ce.setBoardReady, name: FBoardReady}, + {length: 4, setter: ce.setOtherError, name: FOtherError}, + {length: 2, setter: ce.setNotConnectedOut, name: FNotConnectedOut}, + {length: 2, setter: ce.setNoCommunicationConverter, name: FNoCommunicationConverter}, + {length: 2, setter: ce.setNoCommunicationPuConverter, name: FNoCommunicationPuConverter}, + {length: 2, setter: ce.setInputGridVoltageHigh, name: FInputGridVoltageHigh}, + {length: 2, setter: ce.setInputGridVoltageLow, name: FInputGridVoltageLow}, + {length: 2, setter: ce.setOutputGridVoltageHigh, name: FOutputGridVoltageHigh}, + {length: 2, setter: ce.setOutputGridVoltageLow, name: FOutputGridVoltageLow}, + {length: 11, setter: ce.setInputGridVoltage, name: FInputGridVoltage}, + {length: 11, setter: ce.setOutputGridVoltage, name: FOutputGridVoltage}, + {length: 2, setter: ce.setShortCircuit, name: FShortCircuit}, + {length: 2, setter: ce.setOverHeat, name: FOverHeat}, + {length: 2, setter: ce.setFanBroken, name: FFanBroken}, + {length: 2, setter: ce.setOtherHardwareError, name: FOtherHardwareError}, + {length: 2, setter: ce.setDebugConvEnabled, name: FDebugConvEnabled}, + {length: 2, setter: ce.setDebugConvDisabled, name: FDebugConvDisabled}, } - protocolMap[key] = parameters{fields: fields, interval: 1000, name: PConverterDebug} + protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterErrors, object: ce} + } + + for i := uint(0); i < CONVERTERS_MAX; i++ { + key := key{can.CAN_ID_065, i} + cd := &ConverterDebug{UnitId: i} + converterDebugArray[i] = cd + fields = []field{ + {length: 3, setter: cd.setDebugModeOn, name: FDebugModeOn}, + {length: 4, setter: cd.setDebugEnergyOn, name: FDebugEnergyOn}, + {length: 2, setter: cd.setDebugTargetVoltage, name: FDebugTargetVoltage}, + {length: 2, setter: cd.setDebugTargetCurrent, name: FDebugTargetCurrent}, + } + protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterDebug, object: cd} } } diff --git a/yabl/protocol.go b/yabl/protocol.go index 6f9b51b..c58c1c8 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -3,10 +3,10 @@ package yabl import ( "cli-mon/can" "encoding/binary" - "time" + time "time" ) -type Packet interface { +type Action interface { GetUnitId() uint } @@ -32,13 +32,22 @@ type CpLineLevelType uint type IsolationStateType uint type Voltage9BitType float32 -type PName string +type AName string type FName string -type parameters struct { +type Event struct { + UnitId uint + ActionName AName + Field FName + Object Action + Updated time.Time +} + +type action struct { + object Action fields []field interval uint - name PName + name AName } type field struct { @@ -50,10 +59,11 @@ type field struct { } type key struct { - canId, unitId uint + canId uint32 + unitId uint } -var protocolMap map[key]parameters +var protocolMap map[key]action = make(map[key]action) var cpuPresentEnergyArray [CONNECTOR_MAX]*CpuPresentEnergy var cpuPeripheryInstance *CpuPeriphery var cpuEnergySettingsArray [CONNECTOR_MAX]*CpuEnergySettings @@ -69,10 +79,10 @@ var logicAuthArray [CONNECTOR_MAX]*LogicAuth var logicEnergyMode [CONNECTOR_MAX]*LogicEnergyMode var logicErrorsInstance *LogicErrors var logicWorkingMode *LogicWorkingMode -var contactorInternalStateArray [CONNECTOR_MAX]*ContactorInternalState +var contactorInternalStateArray [CONTACTOR_MAX]*ContactorInternalState var contactorInternalErrorsInstance *ContactorInternalErrors var contactorsInternalForce *ContactorsInternalForce -var contactorInternalDebugArray [CONNECTOR_MAX]*ContactorInternalDebug +var contactorInternalDebugArray [CONTACTOR_MAX]*ContactorInternalDebug var peripheryStateArray [CONNECTOR_MAX]*PeripheryState var peripheryInfoArray [CONNECTOR_MAX]*PeripheryInfo var peripheryDebugArray [CONNECTOR_MAX]*PeripheryDebug @@ -80,15 +90,12 @@ var converterPresentEnergyArray [CONVERTERS_MAX]*ConverterPresentEnergy var converterErrorsArray [CONVERTERS_MAX]*ConverterErrors var converterDebugArray [CONVERTERS_MAX]*ConverterDebug -func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan Packet { - result := make(chan Packet) +func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan *Event { + result := make(chan *Event) + initialize() go func() { defer close(result) - var contactorsFirstState [CONTACTOR_MAX]bool - var contactorsFirstErr [CONTACTOR_MAX]bool - var puFirst [CONNECTOR_MAX]bool - var puPeripheryFirst [CONNECTOR_MAX]bool for frame := range frames { if frames == nil { @@ -96,141 +103,38 @@ func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan Packet { } var unitId = uint((frame.CanId & UNIT_ID_MASK) >> UNIT_ID_OFFSET) + var canId = frame.CanId & ACTION_ID_MASK + var k = key{canId: canId, unitId: unitId} + var now = time.Now() - switch { - case frame.CanId&ACTION_ID_MASK == can.CAN_ID_071: - changed := false - var model = ContactorInternalState{UnitId: unitId} - if val, ok := get(0, 3, frame.Payload); ok && model.ContactorReady != BoardReadyType(val) { - model.ContactorReady = BoardReadyType(val) - changed = true - } - if val, ok := get(3, 2, frame.Payload); ok && model.ContactorOn != BooleanType(val) { - model.ContactorOn = BooleanType(val) - changed = true - } - if val, ok := get(5, 2, frame.Payload); ok && model.UnexpectedState != ErrorType(val) { - model.UnexpectedState = ErrorType(val) - changed = true - } - if val, ok := get(7, 2, frame.Payload); ok && model.Isolated != ErrorType(val) { - model.Isolated = ErrorType(val) - changed = true - } - if val, ok := get(9, 2, frame.Payload); ok && model.DebugEnabled != BooleanType(val) { - model.DebugEnabled = BooleanType(val) - changed = true - } - if changed || !contactorsFirstState[unitId] { - contactorsFirstState[unitId] = true - result <- &model - } - case frame.CanId&ACTION_ID_MASK == can.CAN_ID_073: - changed := false - model := ContactorInternalErrors{UnitId: unitId} - if val, ok := get(0, 3, frame.Payload); ok && model.BoardReady != BoardReadyType(val) { - model.BoardReady = BoardReadyType(val) - changed = true - } - if val, ok := get(3, 4, frame.Payload); ok && model.OtherError != ContactorInternalOtherErrorType(val) { - model.OtherError = ContactorInternalOtherErrorType(val) - changed = true - } - if val, ok := get(7, 3, frame.Payload); ok && model.ContactorGroupChanged != ContactorGroupChangedType(val) { - model.ContactorGroupChanged = ContactorGroupChangedType(val) - changed = true - } - if val, ok := get(10, 4, frame.Payload); ok && model.UnexpectedFormation != ContactorInternalOtherErrorType(val) { - model.UnexpectedFormation = ContactorInternalOtherErrorType(val) - changed = true - } - if val, ok := get(14, 2, frame.Payload); ok && model.CpuNotReady != ErrorType(val) { - model.CpuNotReady = ErrorType(val) - changed = true - } - if val, ok := get(16, 2, frame.Payload); ok && model.PuNotReady != ErrorType(val) { - model.PuNotReady = ErrorType(val) - changed = true - } - if val, ok := get(18, 2, frame.Payload); ok && model.Debug != BooleanType(val) { - model.Debug = BooleanType(val) - changed = true - } - if changed || !contactorsFirstErr[unitId] { - contactorsFirstErr[unitId] = true - result <- &model - } - case frame.CanId&ACTION_ID_MASK == can.CAN_ID_021: - changed := false - model := PuPresentEnergy{UnitId: unitId} - if val, ok := get(0, 2, frame.Payload); ok && model.V2GMode != V2GModeType(val) { - model.V2GMode = V2GModeType(val) - changed = true - } - if val, ok := get(2, 11, frame.Payload); ok && model.VoltageBefore != Voltage11BitType(val) { - model.VoltageBefore = Voltage11BitType(val) - changed = true - } - if val, ok := get(13, 11, frame.Payload); ok && model.VoltageAfter != Voltage11BitType(val) { - model.VoltageAfter = Voltage11BitType(val) - changed = true - } - if val, ok := get(24, 10, frame.Payload); ok && model.PresentCurrent != Current10BitType(val) { - model.PresentCurrent = Current10BitType(val) - changed = true - } - if changed || !puFirst[unitId] { - puFirst[unitId] = true - result <- &model - } - case frame.CanId&ACTION_ID_MASK == can.CAN_ID_022: - changed := false - model := PuPeriphery{UnitId: unitId} - if val, ok := get(0, 2, frame.Payload); ok && model.ConnectorInsert != BooleanType(val) { - model.ConnectorInsert = BooleanType(val) - changed = true - } - if val, ok := get(2, 2, frame.Payload); ok && model.ContactorOn != BooleanType(val) { - model.ContactorOn = BooleanType(val) - changed = true - } - if val, ok := get(4, 2, frame.Payload); ok && model.ConnectorLocked != BooleanType(val) { - model.ConnectorLocked = BooleanType(val) - changed = true - } - if val, ok := get(6, 3, frame.Payload); ok && model.CpLineLevel != CpLineLevelType(val) { - model.CpLineLevel = CpLineLevelType(val) - changed = true - } - if val, ok := get(9, 3, frame.Payload); ok && model.IsolationState != IsolationStateType(val) { - model.IsolationState = IsolationStateType(val) - changed = true - } - if val, ok := get(12, 2, frame.Payload); ok && model.ChargingAllowed != BooleanType(val) { - model.ChargingAllowed = BooleanType(val) - changed = true - } - if val, ok := get(14, 2, frame.Payload); ok && model.PwmEnabled != BooleanType(val) { - model.PwmEnabled = BooleanType(val) - changed = true - } - if val, ok := get(16, 9, frame.Payload); ok && model.CpLineVoltage != (Voltage9BitType(val)*0.1-15) { - model.CpLineVoltage = Voltage9BitType(val)*0.1 - 15 - changed = true - } - if changed || !puPeripheryFirst[unitId] { - puPeripheryFirst[unitId] = true - result <- &model - } + param := protocolMap[k] + var start uint8 = 0 + for _, f := range param.fields { + if val, found := get(start, f.length, frame.Payload); found { + start += f.length + f.last = now + if f.value != val { + f.value = val + f.setter(val) + result <- &Event{ + Field: f.name, + ActionName: param.name, + Object: param.object, + UnitId: unitId, + Updated: now, + } + } + } } + } }() return result } -func get(from uint, size uint, buffer []byte) (uint64, bool) { +func get(from uint8, size uint8, buffer []byte) (uint64, bool) { value := binary.LittleEndian.Uint64(buffer) var mask uint64 = ^(ALL_BITS << size) -- 2.54.0 From 8de1094b93186fea01245abce4778a4e5e6118cf Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Fri, 7 Jul 2023 05:24:42 +0300 Subject: [PATCH 05/15] Bugfixes, build and manual test --- cli-mon.go | 2 +- yabl/init.go | 56 +++++++++++++++++++++++++++--------------------- yabl/protocol.go | 6 +++++- yabl/strings.go | 4 ++-- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/cli-mon.go b/cli-mon.go index 78f75ac..55d79b7 100644 --- a/cli-mon.go +++ b/cli-mon.go @@ -47,7 +47,7 @@ func main() { } else { for msg := range messages { val := getField(msg.Object, msg.Field) - fmt.Printf("%v %v %v %v\n", msg.Updated, msg.ActionName, msg.Field, val) + fmt.Printf("%v %v.%v [%d] %v\n", msg.Updated.Format("Jan _2 15:04:05.000"), msg.ActionName, msg.Field, msg.UnitId, val) } } } diff --git a/yabl/init.go b/yabl/init.go index 7687be5..b2da6e4 100644 --- a/yabl/init.go +++ b/yabl/init.go @@ -7,7 +7,7 @@ func initialize() { key := key{can.CAN_ID_011, i} cpe := &CpuPresentEnergy{UnitId: 1} cpuPresentEnergyArray[i] = cpe - fields := []field{ + fields := []*field{ {length: 2, setter: cpe.setPowerDirectionMode, name: FPowerDirectionMode}, {length: 10, setter: cpe.setPresentCurrent, name: FPresentCurrent}, {length: 11, setter: cpe.setPresentVoltage, name: FPresentVoltage}, @@ -16,7 +16,7 @@ func initialize() { } cpuPeripheryInstance = &CpuPeriphery{UnitId: 0} - fields := []field{ + fields := []*field{ {length: 2, setter: cpuPeripheryInstance.setContactorInput, name: FContactorInput}, {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerInput, name: FCircuitBreakerInput}, {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerPowerCBInput, name: FCircuitBreakerPowerCBInput}, @@ -32,7 +32,7 @@ func initialize() { key := key{can.CAN_ID_015, i} ces := &CpuEnergySettings{UnitId: i} cpuEnergySettingsArray[i] = ces - fields := []field{ + fields := []*field{ {length: 10, setter: ces.setCurrentMax, name: FCurrentMax}, {length: 11, setter: ces.setVoltageMax, name: FVoltageMax}, {length: 14, setter: ces.setPowerMax, name: FPowerMax}, @@ -43,7 +43,7 @@ func initialize() { } cpuErrorsInstance = &CpuErrors{UnitId: 0} - fields = []field{ + fields = []*field{ {length: 3, setter: cpuErrorsInstance.setBoardReady, name: FBoardReady}, {length: 4, setter: cpuErrorsInstance.setOtherError, name: FOtherError}, {length: 2, setter: cpuErrorsInstance.setRedButtonHard, name: FRedButtonHard}, @@ -71,7 +71,7 @@ func initialize() { } cpuDebugInstance = &CpuDebug{UnitId: 0} - fields = []field{ + fields = []*field{ {length: 2, setter: cpuDebugInstance.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: cpuDebugInstance.setDebugContactorInputOn, name: FDebugContactorInputOn}, {length: 3, setter: cpuDebugInstance.setDebugCircuitBreakerOn, name: FDebugCircuitBreakerOn}, @@ -88,7 +88,7 @@ func initialize() { key := key{can.CAN_ID_021, i} ppe := &PuPresentEnergy{UnitId: i} puPresentEnergyArray[i] = ppe - fields := []field{ + fields := []*field{ {length: 2, setter: ppe.setV2GMode, name: FV2GMode}, {length: 11, setter: ppe.setVoltageBefore, name: FVoltageBefore}, {length: 11, setter: ppe.setVoltageAfter, name: FVoltageAfter}, @@ -101,7 +101,7 @@ func initialize() { key := key{can.CAN_ID_022, i} pp := &PuPeriphery{UnitId: i} puPeripheryArray[i] = pp - fields := []field{ + fields := []*field{ {length: 2, setter: pp.setConnectorInsert, name: FConnectorInsert}, {length: 2, setter: pp.setContactorOn, name: FContactorOn}, {length: 2, setter: pp.setConnectorLocked, name: FConnectorLocked}, @@ -118,7 +118,7 @@ func initialize() { key := key{can.CAN_ID_023, i} pe := &PuErrors{UnitId: 1} puErrorsArray[i] = pe - fields := []field{ + fields := []*field{ {length: 3, setter: pe.setBoardReady, name: FBoardReady}, {length: 4, setter: pe.setOtherError, name: FOtherError}, {length: 2, setter: pe.setIncorrectVoltage, name: FIncorrectVoltage}, @@ -143,7 +143,7 @@ func initialize() { key := key{can.CAN_ID_02A, i} pd := &PuDebug{UnitId: i} puDebugArray[i] = pd - fields = []field{ + fields = []*field{ {length: 2, setter: pd.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: pd.setDebugContactorOutputOn, name: FDebugContactorOutputOn}, } @@ -154,7 +154,7 @@ func initialize() { key := key{can.CAN_ID_041, i} ste := &SeccTargetEnergy{UnitId: i} seccTargetEnergyArray[i] = ste - fields = []field{ + fields = []*field{ {length: 2, setter: ste.setTargetChargingAllow, name: FTargetChargingAllow}, {length: 11, setter: ste.setTargetBatteryVoltage, name: FTargetBatteryVoltage}, {length: 11, setter: ste.setTargetGoalVoltage, name: FTargetGoalVoltage}, @@ -167,7 +167,7 @@ func initialize() { key := key{can.CAN_ID_042, i} se := &SeccErrors{UnitId: i} seccErrorsArray[i] = se - fields = []field{ + fields = []*field{ {length: 3, setter: se.setBoardReady, name: FBoardReady}, {length: 2, setter: se.setNotReadyLogic, name: FNotReadyLogic}, } @@ -178,7 +178,7 @@ func initialize() { key := key{can.CAN_ID_046, i} la := &LogicAuth{UnitId: i} logicAuthArray[i] = la - fields = []field{ + fields = []*field{ {length: 2, setter: la.setAuthMode, name: FAuthMode}, {length: 3, setter: la.setAuthState, name: FAuthState}, } @@ -189,7 +189,7 @@ func initialize() { key := key{can.CAN_ID_047, i} lem := &LogicEnergyMode{UnitId: i} logicEnergyMode[i] = lem - fields = []field{ + fields = []*field{ {length: 2, setter: lem.setV2gMode, name: FV2gMode}, {length: 10, setter: lem.setCurrentMax, name: FCurrentMax}, {length: 11, setter: lem.setVoltageMax, name: FVoltageMax}, @@ -199,7 +199,7 @@ func initialize() { } logicErrorsInstance = &LogicErrors{UnitId: 0} - fields = []field{ + fields = []*field{ {length: 3, setter: logicErrorsInstance.setBoardReady, name: FBoardReady}, {length: 2, setter: logicErrorsInstance.setNotReadySettings, name: FNotReadySettings}, } @@ -211,7 +211,7 @@ func initialize() { } logicWorkingMode = &LogicWorkingMode{UnitId: 0} - fields = []field{ + fields = []*field{ {length: 5, setter: logicWorkingMode.setTargetContactorMode, name: FTargetContactorMode}, {length: 2, setter: logicWorkingMode.setAvailability, name: FAvailability}, } @@ -226,7 +226,7 @@ func initialize() { key := key{can.CAN_ID_071, i} cis := &ContactorInternalState{UnitId: i} contactorInternalStateArray[i] = cis - fields = []field{ + fields = []*field{ {length: 3, setter: cis.setContactorReady, name: FContactorReady}, {length: 2, setter: cis.setContactorOn, name: FContactorOn}, {length: 2, setter: cis.setUnexpectedState, name: FUnexpectedState}, @@ -237,7 +237,7 @@ func initialize() { } contactorInternalErrorsInstance = &ContactorInternalErrors{UnitId: 0} - fields = []field{ + fields = []*field{ {length: 3, setter: contactorInternalErrorsInstance.setBoardReady, name: FBoardReady}, {length: 4, setter: contactorInternalErrorsInstance.setOtherError, name: FOtherError}, {length: 3, setter: contactorInternalErrorsInstance.setContactorGroupChanged, name: FContactorGroupChanged}, @@ -255,7 +255,7 @@ func initialize() { } contactorsInternalForce = &ContactorsInternalForce{UnitId: 0} - fields = []field{ + fields = []*field{ {length: 2, setter: contactorsInternalForce.setForceModeEnabled, name: FForceModeEnabled}, {length: 4, setter: contactorsInternalForce.setForceModeValue, name: FForceModeValue}, } @@ -270,7 +270,7 @@ func initialize() { key := key{can.CAN_ID_075, i} cid := &ContactorInternalDebug{UnitId: i} contactorInternalDebugArray[i] = cid - fields = []field{ + fields = []*field{ {length: 2, setter: cid.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: cid.setDebugContactorOn, name: FDebugContactorOn}, } @@ -281,7 +281,7 @@ func initialize() { key := key{can.CAN_ID_067, i} ps := &PeripheryState{UnitId: i} peripheryStateArray[i] = ps - fields = []field{ + fields = []*field{ {length: 3, setter: ps.setOtherErrorSeverity, name: FOtherErrorSeverity}, {length: 4, setter: ps.setOtherError, name: FOtherError}, {length: 2, setter: ps.setErrorShakeSensor, name: FErrorShakeSensor}, @@ -312,7 +312,7 @@ func initialize() { key := key{can.CAN_ID_068, i} pi := &PeripheryInfo{UnitId: i} peripheryInfoArray[i] = pi - fields = []field{ + fields = []*field{ {length: 2, setter: pi.setInfoDoorOpen, name: FInfoDoorOpen}, {length: 8, setter: pi.setTempAirIn, name: FTempAirIn}, {length: 8, setter: pi.setTempAirOut, name: FTempAirOut}, @@ -326,7 +326,7 @@ func initialize() { key := key{can.CAN_ID_06C, i} pd := &PeripheryDebug{UnitId: i} peripheryDebugArray[i] = pd - fields = []field{ + fields = []*field{ {length: 2, setter: pd.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: pd.setDebugShsnFan, name: FDebugShsnFan}, {length: 3, setter: pd.setDebugShptFan, name: FDebugShptFan}, @@ -339,7 +339,7 @@ func initialize() { key := key{can.CAN_ID_061, i} cpe := &ConverterPresentEnergy{UnitId: i} converterPresentEnergyArray[i] = cpe - fields = []field{ + fields = []*field{ {length: 2, setter: cpe.setV2gMode, name: FV2gMode}, {length: 11, setter: cpe.setPresentVoltage, name: FPresentVoltage}, {length: 10, setter: cpe.setPresentCurrent, name: FPresentCurrent}, @@ -352,7 +352,7 @@ func initialize() { key := key{can.CAN_ID_062, i} ce := &ConverterErrors{UnitId: i} converterErrorsArray[i] = ce - fields = []field{ + fields = []*field{ {length: 3, setter: ce.setBoardReady, name: FBoardReady}, {length: 4, setter: ce.setOtherError, name: FOtherError}, {length: 2, setter: ce.setNotConnectedOut, name: FNotConnectedOut}, @@ -378,7 +378,7 @@ func initialize() { key := key{can.CAN_ID_065, i} cd := &ConverterDebug{UnitId: i} converterDebugArray[i] = cd - fields = []field{ + fields = []*field{ {length: 3, setter: cd.setDebugModeOn, name: FDebugModeOn}, {length: 4, setter: cd.setDebugEnergyOn, name: FDebugEnergyOn}, {length: 2, setter: cd.setDebugTargetVoltage, name: FDebugTargetVoltage}, @@ -386,4 +386,10 @@ func initialize() { } protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterDebug, object: cd} } + + for _, element := range protocolMap { + for _, f := range element.fields { + f.value = ^uint64(0) + } + } } diff --git a/yabl/protocol.go b/yabl/protocol.go index c58c1c8..4a41d20 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -45,7 +45,7 @@ type Event struct { type action struct { object Action - fields []field + fields []*field interval uint name AName } @@ -58,6 +58,10 @@ type field struct { name FName } +func newField(length uint8, setter func(uint64 uint64), name FName) *field { + return &field{length: length, setter: setter, name: name, value: ^uint64(0)} +} + type key struct { canId uint32 unitId uint diff --git a/yabl/strings.go b/yabl/strings.go index bd5b38a..8acb656 100644 --- a/yabl/strings.go +++ b/yabl/strings.go @@ -148,7 +148,7 @@ func (a AuthStateType) String() string { case AUTH_STATE_DENY: return "DENY" default: - panic("AuthStateType not defended") + return fmt.Sprintf("AuthStateType %d not defended", a) } } @@ -171,7 +171,7 @@ func (c ContactorModeType) String() string { case CONTACTOR_SIMPLE_DYNAMIC_MODE: return "SIMPLE_DYNAMIC_MODE" default: - panic("ContactorModeType not defended") + return fmt.Sprintf("ContactorModeType %d not defended", c) } } -- 2.54.0 From 515a8db2c50f7d6368867bd85d88f5c0d47d28ab Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Fri, 7 Jul 2023 10:52:30 +0300 Subject: [PATCH 06/15] Initialization fix --- yabl/init.go | 7 ++++++- yabl/setters.go | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/yabl/init.go b/yabl/init.go index b2da6e4..f35479f 100644 --- a/yabl/init.go +++ b/yabl/init.go @@ -387,9 +387,14 @@ func initialize() { protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterDebug, object: cd} } + // set "null" values for _, element := range protocolMap { + var from uint8 = 0 for _, f := range element.fields { - f.value = ^uint64(0) + var mask uint64 = ^(ALL_BITS << f.length) + mask = mask << from + f.value = mask + from += f.length } } } diff --git a/yabl/setters.go b/yabl/setters.go index 7948eae..23b358c 100644 --- a/yabl/setters.go +++ b/yabl/setters.go @@ -197,11 +197,11 @@ func (c *CpuErrors) setGridVoltageLowErr(val uint64) { } func (c *CpuErrors) setGridVoltageLow(val uint64) { - c.GridVoltageLow = Voltage11BitType(val) + c.GridVoltageLow = Voltage11BitType(val / 100) } func (c *CpuErrors) setGridVoltageHigh(val uint64) { - c.GridVoltageHigh = Voltage11BitType(val) + c.GridVoltageHigh = Voltage11BitType(val / 100) } func (c *CpuErrors) setGridVoltageEmpty(val uint64) { -- 2.54.0 From 5d2c7e12fed9510d530a9f463eeeadf54f732baa Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Fri, 7 Jul 2023 15:48:12 +0300 Subject: [PATCH 07/15] Bugfix in reading --- yabl/protocol.go | 2 +- yabl/setters.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/yabl/protocol.go b/yabl/protocol.go index 4a41d20..f920796 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -116,7 +116,6 @@ func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan *Event { var start uint8 = 0 for _, f := range param.fields { if val, found := get(start, f.length, frame.Payload); found { - start += f.length f.last = now if f.value != val { f.value = val @@ -130,6 +129,7 @@ func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan *Event { } } } + start += f.length } } diff --git a/yabl/setters.go b/yabl/setters.go index 23b358c..7948eae 100644 --- a/yabl/setters.go +++ b/yabl/setters.go @@ -197,11 +197,11 @@ func (c *CpuErrors) setGridVoltageLowErr(val uint64) { } func (c *CpuErrors) setGridVoltageLow(val uint64) { - c.GridVoltageLow = Voltage11BitType(val / 100) + c.GridVoltageLow = Voltage11BitType(val) } func (c *CpuErrors) setGridVoltageHigh(val uint64) { - c.GridVoltageHigh = Voltage11BitType(val / 100) + c.GridVoltageHigh = Voltage11BitType(val) } func (c *CpuErrors) setGridVoltageEmpty(val uint64) { -- 2.54.0 From e42d3b5722693eb3650a138f3a0d1e9e8c765f1b Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Fri, 7 Jul 2023 20:44:20 +0300 Subject: [PATCH 08/15] Nil value instead zero by default --- cli-mon.go | 4 +- ui/view.go | 6 +- yabl/init.go | 8 +- yabl/protocol.go | 10 +- yabl/setters.go | 912 +++++++++++++++++++++++++++++++---------------- yabl/strings.go | 2 +- yabl/types.go | 304 ++++++++-------- 7 files changed, 774 insertions(+), 472 deletions(-) diff --git a/cli-mon.go b/cli-mon.go index 55d79b7..46a6635 100644 --- a/cli-mon.go +++ b/cli-mon.go @@ -46,8 +46,8 @@ func main() { ui.InitCliApp(messages) } else { for msg := range messages { - val := getField(msg.Object, msg.Field) - fmt.Printf("%v %v.%v [%d] %v\n", msg.Updated.Format("Jan _2 15:04:05.000"), msg.ActionName, msg.Field, msg.UnitId, val) + // val := getField(msg.Object, msg.Field) + fmt.Printf("%v %v.%v [%d] %v\n", msg.Updated.Format("Jan _2 15:04:05.000"), msg.ActionName, msg.Field, msg.UnitId, msg.Value) } } } diff --git a/ui/view.go b/ui/view.go index 36db113..3606193 100644 --- a/ui/view.go +++ b/ui/view.go @@ -142,13 +142,13 @@ func updateContactorsView(msg *yabl.ContactorInternalState) { s.Isolated, s.DebugEnabled) - if s.ContactorReady == yabl.BOARD_READY_OK { + if s.ContactorReady != nil && *s.ContactorReady == yabl.BOARD_READY_OK { p.TextStyle.Bg = ui.ColorClear } else { p.TextStyle.Bg = ui.ColorRed } - if s.ContactorOn == yabl.ON { + if s.ContactorOn != nil && *s.ContactorOn == yabl.ON { p.TitleStyle.Bg = ui.ColorBlue } else { p.TitleStyle.Bg = ui.ColorClear @@ -227,7 +227,7 @@ func updateContactorsStateView(e *yabl.ContactorInternalErrors) { e.Debug, ) - if e.BoardReady == yabl.BOARD_READY_OK { + if e.BoardReady != nil && *e.BoardReady == yabl.BOARD_READY_OK { p.TextStyle.Bg = ui.ColorClear } else { p.TextStyle.Bg = ui.ColorRed diff --git a/yabl/init.go b/yabl/init.go index f35479f..2578857 100644 --- a/yabl/init.go +++ b/yabl/init.go @@ -379,10 +379,10 @@ func initialize() { cd := &ConverterDebug{UnitId: i} converterDebugArray[i] = cd fields = []*field{ - {length: 3, setter: cd.setDebugModeOn, name: FDebugModeOn}, - {length: 4, setter: cd.setDebugEnergyOn, name: FDebugEnergyOn}, - {length: 2, setter: cd.setDebugTargetVoltage, name: FDebugTargetVoltage}, - {length: 2, setter: cd.setDebugTargetCurrent, name: FDebugTargetCurrent}, + {length: 2, setter: cd.setDebugModeOn, name: FDebugModeOn}, + {length: 3, setter: cd.setDebugEnergyOn, name: FDebugEnergyOn}, + {length: 11, setter: cd.setDebugTargetVoltage, name: FDebugTargetVoltage}, + {length: 10, setter: cd.setDebugTargetCurrent, name: FDebugTargetCurrent}, } protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterDebug, object: cd} } diff --git a/yabl/protocol.go b/yabl/protocol.go index f920796..c646450 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -41,6 +41,7 @@ type Event struct { Field FName Object Action Updated time.Time + Value any } type action struct { @@ -52,16 +53,12 @@ type action struct { type field struct { length uint8 - setter func(uint64 uint64) + setter func(uint64 uint64) any value uint64 last time.Time name FName } -func newField(length uint8, setter func(uint64 uint64), name FName) *field { - return &field{length: length, setter: setter, name: name, value: ^uint64(0)} -} - type key struct { canId uint32 unitId uint @@ -119,13 +116,14 @@ func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan *Event { f.last = now if f.value != val { f.value = val - f.setter(val) + obj := f.setter(val) result <- &Event{ Field: f.name, ActionName: param.name, Object: param.object, UnitId: unitId, Updated: now, + Value: obj, } } } diff --git a/yabl/setters.go b/yabl/setters.go index 7948eae..14348dd 100644 --- a/yabl/setters.go +++ b/yabl/setters.go @@ -1,609 +1,913 @@ package yabl -func (t *ContactorInternalState) setContactorReady(val uint64) { - t.ContactorReady = BoardReadyType(val) +func (t *ContactorInternalState) setContactorReady(val uint64) any { + value := BoardReadyType(val) + t.ContactorReady = &value + return &value } -func (t *ContactorInternalState) setContactorOn(val uint64) { - t.ContactorOn = BooleanType(val) +func (t *ContactorInternalState) setContactorOn(val uint64) any { + value := BooleanType(val) + t.ContactorOn = &value + return &value } -func (t *ContactorInternalState) setUnexpectedState(val uint64) { - t.UnexpectedState = ErrorType(val) +func (t *ContactorInternalState) setUnexpectedState(val uint64) any { + value := ErrorType(val) + t.UnexpectedState = &value + return &value } -func (t *ContactorInternalState) setIsolated(val uint64) { - t.Isolated = ErrorType(val) +func (t *ContactorInternalState) setIsolated(val uint64) any { + value := ErrorType(val) + t.Isolated = &value + return &value } -func (t *ContactorInternalState) setDebugEnabled(val uint64) { - t.DebugEnabled = BooleanType(val) +func (t *ContactorInternalState) setDebugEnabled(val uint64) any { + value := BooleanType(val) + t.DebugEnabled = &value + return &value } -func (t *ContactorInternalErrors) setBoardReady(val uint64) { - t.BoardReady = BoardReadyType(val) +func (t *ContactorInternalErrors) setBoardReady(val uint64) any { + value := BoardReadyType(val) + t.BoardReady = &value + return &value } -func (t *ContactorInternalErrors) setOtherError(val uint64) { - t.OtherError = ContactorInternalOtherErrorType(val) +func (t *ContactorInternalErrors) setOtherError(val uint64) any { + value := ContactorInternalOtherErrorType(val) + t.OtherError = &value + return &value } -func (t *ContactorInternalErrors) setContactorGroupChanged(val uint64) { - t.ContactorGroupChanged = ContactorGroupChangedType(val) +func (t *ContactorInternalErrors) setContactorGroupChanged(val uint64) any { + value := ContactorGroupChangedType(val) + t.ContactorGroupChanged = &value + return &value } -func (t *ContactorInternalErrors) setUnexpectedFormation(val uint64) { - t.UnexpectedFormation = ContactorInternalOtherErrorType(val) +func (t *ContactorInternalErrors) setUnexpectedFormation(val uint64) any { + value := ContactorInternalOtherErrorType(val) + t.UnexpectedFormation = &value + return &value } -func (t *ContactorInternalErrors) setCpuNotReady(val uint64) { - t.CpuNotReady = ErrorType(val) +func (t *ContactorInternalErrors) setCpuNotReady(val uint64) any { + value := ErrorType(val) + t.CpuNotReady = &value + return &value } -func (t *ContactorInternalErrors) setPuNotReady(val uint64) { - t.PuNotReady = ErrorType(val) +func (t *ContactorInternalErrors) setPuNotReady(val uint64) any { + value := ErrorType(val) + t.PuNotReady = &value + return &value } -func (t *ContactorInternalErrors) setDebug(val uint64) { - t.Debug = BooleanType(val) +func (t *ContactorInternalErrors) setDebug(val uint64) any { + value := BooleanType(val) + t.Debug = &value + return &value } -func (t *ContactorInternalErrors) setPresentContactorMode(val uint64) { - t.PresentContactorMode = ContactorModeType(val) +func (t *ContactorInternalErrors) setPresentContactorMode(val uint64) any { + value := ContactorModeType(val) + t.PresentContactorMode = &value + return &value } -func (t *PuPresentEnergy) setV2GMode(val uint64) { - t.V2GMode = V2GModeType(val) +func (t *PuPresentEnergy) setV2GMode(val uint64) any { + value := V2GModeType(val) + t.V2GMode = &value + return &value } -func (t *PuPresentEnergy) setVoltageBefore(val uint64) { - t.VoltageBefore = Voltage11BitType(val) +func (t *PuPresentEnergy) setVoltageBefore(val uint64) any { + value := Voltage11BitType(val) + t.VoltageBefore = &value + return &value } -func (t *PuPresentEnergy) setVoltageAfter(val uint64) { - t.VoltageAfter = Voltage11BitType(val) +func (t *PuPresentEnergy) setVoltageAfter(val uint64) any { + value := Voltage11BitType(val) + t.VoltageAfter = &value + return &value } -func (t *PuPresentEnergy) setPresentCurrent(val uint64) { - t.PresentCurrent = Current10BitType(val) +func (t *PuPresentEnergy) setPresentCurrent(val uint64) any { + value := Current10BitType(val) + t.PresentCurrent = &value + return &value } -func (t *PuPeriphery) setConnectorInsert(val uint64) { - t.ConnectorInsert = BooleanType(val) +func (t *PuPeriphery) setConnectorInsert(val uint64) any { + value := BooleanType(val) + t.ConnectorInsert = &value + return &value } -func (t *PuPeriphery) setContactorOn(val uint64) { - t.ContactorOn = BooleanType(val) +func (t *PuPeriphery) setContactorOn(val uint64) any { + value := BooleanType(val) + t.ContactorOn = &value + return &value } -func (t *PuPeriphery) setConnectorLocked(val uint64) { - t.ConnectorLocked = BooleanType(val) +func (t *PuPeriphery) setConnectorLocked(val uint64) any { + value := BooleanType(val) + t.ConnectorLocked = &value + return &value } -func (t *PuPeriphery) setCpLineLevel(val uint64) { - t.CpLineLevel = CpLineLevelType(val) +func (t *PuPeriphery) setCpLineLevel(val uint64) any { + value := CpLineLevelType(val) + t.CpLineLevel = &value + return &value } -func (t *PuPeriphery) setIsolationState(val uint64) { - t.IsolationState = IsolationStateType(val) +func (t *PuPeriphery) setIsolationState(val uint64) any { + value := IsolationStateType(val) + t.IsolationState = &value + return &value } -func (t *PuPeriphery) setChargingAllowed(val uint64) { - t.ChargingAllowed = BooleanType(val) +func (t *PuPeriphery) setChargingAllowed(val uint64) any { + value := BooleanType(val) + t.ChargingAllowed = &value + return &value } -func (t *PuPeriphery) setPwmEnabled(val uint64) { - t.PwmEnabled = BooleanType(val) +func (t *PuPeriphery) setPwmEnabled(val uint64) any { + value := BooleanType(val) + t.PwmEnabled = &value + return &value } -func (t *PuPeriphery) setCpLineVoltage(val uint64) { - t.CpLineVoltage = Voltage9BitType(val)*0.1 - 15 +func (t *PuPeriphery) setCpLineVoltage(val uint64) any { + value := Voltage9BitType(val)*0.1 - 15 + t.CpLineVoltage = &value + return &value } -func (t *LogicAuth) setAuthMode(val uint64) { - t.AuthMode = AuthModeType(val) +func (t *LogicAuth) setAuthMode(val uint64) any { + value := AuthModeType(val) + t.AuthMode = &value + return &value } -func (t *LogicAuth) setAuthState(val uint64) { - t.AuthState = AuthStateType(val) +func (t *LogicAuth) setAuthState(val uint64) any { + value := AuthStateType(val) + t.AuthState = &value + return &value } -func (l *LogicWorkingMode) setTargetContactorMode(val uint64) { - l.TargetContactorMode = ContactorModeType(val) +func (l *LogicWorkingMode) setTargetContactorMode(val uint64) any { + value := ContactorModeType(val) + l.TargetContactorMode = &value + return &value } -func (l *LogicWorkingMode) setAvailability(val uint64) { - l.Availability = BooleanType(val) +func (l *LogicWorkingMode) setAvailability(val uint64) any { + value := BooleanType(val) + l.Availability = &value + return &value } -func (c *CpuPresentEnergy) setPowerDirectionMode(val uint64) { - c.PowerDirectionMode = V2GModeType(val) +func (c *CpuPresentEnergy) setPowerDirectionMode(val uint64) any { + value := V2GModeType(val) + c.PowerDirectionMode = &value + return &value } -func (c *CpuPresentEnergy) setPresentCurrent(val uint64) { - c.PresentCurrent = Current10BitType(val) +func (c *CpuPresentEnergy) setPresentCurrent(val uint64) any { + value := Current10BitType(val) + c.PresentCurrent = &value + return &value } -func (c *CpuPresentEnergy) setPresentVoltage(val uint64) { - c.PresentVoltage = Voltage11BitType(val) +func (c *CpuPresentEnergy) setPresentVoltage(val uint64) any { + value := Voltage11BitType(val) + c.PresentVoltage = &value + return &value } -func (c *CpuPeriphery) setCircuitBreakerInput(val uint64) { - c.CircuitBreakerInput = BooleanType(val) +func (c *CpuPeriphery) setCircuitBreakerInput(val uint64) any { + value := BooleanType(val) + c.CircuitBreakerInput = &value + return &value } -func (c *CpuPeriphery) setCircuitBreakerPowerCBInput(val uint64) { - c.CircuitBreakerPowerCBInput = BooleanType(val) +func (c *CpuPeriphery) setCircuitBreakerPowerCBInput(val uint64) any { + value := BooleanType(val) + c.CircuitBreakerPowerCBInput = &value + return &value } -func (c *CpuPeriphery) setContactorInput(val uint64) { - c.ContactorInput = BooleanType(val) +func (c *CpuPeriphery) setContactorInput(val uint64) any { + value := BooleanType(val) + c.ContactorInput = &value + return &value } -func (c *CpuEnergySettings) setCurrentMax(val uint64) { - c.CurrentMax = Current10BitType(val) +func (c *CpuEnergySettings) setCurrentMax(val uint64) any { + value := Current10BitType(val) + c.CurrentMax = &value + return &value } -func (c *CpuEnergySettings) setVoltageMax(val uint64) { - c.VoltageMax = Voltage11BitType(val) +func (c *CpuEnergySettings) setVoltageMax(val uint64) any { + value := Voltage11BitType(val) + c.VoltageMax = &value + return &value } -func (c *CpuEnergySettings) setPowerMax(val uint64) { - c.PowerMax = Power14BitType(val * 100) +func (c *CpuEnergySettings) setPowerMax(val uint64) any { + value := Power14BitType(val * 100) + c.PowerMax = &value + return &value } -func (c *CpuEnergySettings) setTargetBatteryVoltage(val uint64) { - c.TargetBatteryVoltage = Voltage11BitType(val) +func (c *CpuEnergySettings) setTargetBatteryVoltage(val uint64) any { + value := Voltage11BitType(val) + c.TargetBatteryVoltage = &value + return &value } -func (c *CpuEnergySettings) setTargetGoalVoltage(val uint64) { - c.TargetGoalVoltage = Voltage11BitType(val) +func (c *CpuEnergySettings) setTargetGoalVoltage(val uint64) any { + value := Voltage11BitType(val) + c.TargetGoalVoltage = &value + return &value } -func (c *CpuErrors) setBoardReady(val uint64) { - c.BoardReady = BoardReadyType(val) +func (c *CpuErrors) setBoardReady(val uint64) any { + value := BoardReadyType(val) + c.BoardReady = &value + return &value } -func (c *CpuErrors) setOtherError(val uint64) { - c.OtherError = OtherError4BitType(val) +func (c *CpuErrors) setOtherError(val uint64) any { + value := OtherError4BitType(val) + c.OtherError = &value + return &value } -func (c *CpuErrors) setRedButtonHard(val uint64) { - c.RedButtonHard = ErrorType(val) +func (c *CpuErrors) setRedButtonHard(val uint64) any { + value := ErrorType(val) + c.RedButtonHard = &value + return &value } -func (c *CpuErrors) setRedButtonSoft(val uint64) { - c.RedButtonSoft = ErrorType(val) +func (c *CpuErrors) setRedButtonSoft(val uint64) any { + value := ErrorType(val) + c.RedButtonSoft = &value + return &value } -func (c *CpuErrors) setModulesGone(val uint64) { - c.ModulesGone = ErrorType(val) +func (c *CpuErrors) setModulesGone(val uint64) any { + value := ErrorType(val) + c.ModulesGone = &value + return &value } -func (c *CpuErrors) setGridVoltageHighErr(val uint64) { - c.GridVoltageHighErr = ErrorType(val) +func (c *CpuErrors) setGridVoltageHighErr(val uint64) any { + value := ErrorType(val) + c.GridVoltageHighErr = &value + return &value } -func (c *CpuErrors) setGridVoltageHighWarn(val uint64) { - c.GridVoltageHighWarn = ErrorType(val) +func (c *CpuErrors) setGridVoltageHighWarn(val uint64) any { + value := ErrorType(val) + c.GridVoltageHighWarn = &value + return &value } -func (c *CpuErrors) setGridVoltageLowWarn(val uint64) { - c.GridVoltageLowWarn = ErrorType(val) +func (c *CpuErrors) setGridVoltageLowWarn(val uint64) any { + value := ErrorType(val) + c.GridVoltageLowWarn = &value + return &value } -func (c *CpuErrors) setGridVoltageLowErr(val uint64) { - c.GridVoltageLowErr = ErrorType(val) +func (c *CpuErrors) setGridVoltageLowErr(val uint64) any { + value := ErrorType(val) + c.GridVoltageLowErr = &value + return &value } -func (c *CpuErrors) setGridVoltageLow(val uint64) { - c.GridVoltageLow = Voltage11BitType(val) +func (c *CpuErrors) setGridVoltageLow(val uint64) any { + value := Voltage11BitType(val) + c.GridVoltageLow = &value + return &value } -func (c *CpuErrors) setGridVoltageHigh(val uint64) { - c.GridVoltageHigh = Voltage11BitType(val) +func (c *CpuErrors) setGridVoltageHigh(val uint64) any { + value := Voltage11BitType(val) + c.GridVoltageHigh = &value + return &value } -func (c *CpuErrors) setGridVoltageEmpty(val uint64) { - c.GridVoltageEmpty = ErrorType(val) +func (c *CpuErrors) setGridVoltageEmpty(val uint64) any { + value := ErrorType(val) + c.GridVoltageEmpty = &value + return &value } -func (c *CpuErrors) setNotReadySecc(val uint64) { - c.NotReadySecc = ErrorType(val) +func (c *CpuErrors) setNotReadySecc(val uint64) any { + value := ErrorType(val) + c.NotReadySecc = &value + return &value } -func (c *CpuErrors) setNotReadyPu(val uint64) { - c.NotReadyPu = ErrorType(val) +func (c *CpuErrors) setNotReadyPu(val uint64) any { + value := ErrorType(val) + c.NotReadyPu = &value + return &value } -func (c *CpuErrors) setNotReadyContactors(val uint64) { - c.NotReadyContactors = ErrorType(val) +func (c *CpuErrors) setNotReadyContactors(val uint64) any { + value := ErrorType(val) + c.NotReadyContactors = &value + return &value } -func (c *CpuErrors) setDebugConvertersEnabled(val uint64) { - c.DebugConvertersEnabled = ErrorType(val) +func (c *CpuErrors) setDebugConvertersEnabled(val uint64) any { + value := ErrorType(val) + c.DebugConvertersEnabled = &value + return &value } -func (c *CpuErrors) setContactorInputError(val uint64) { - c.ContactorInputError = ErrorType(val) +func (c *CpuErrors) setContactorInputError(val uint64) any { + value := ErrorType(val) + c.ContactorInputError = &value + return &value } -func (c *CpuErrors) setNotReadyPeriphery(val uint64) { - c.NotReadyPeriphery = ErrorType(val) +func (c *CpuErrors) setNotReadyPeriphery(val uint64) any { + value := ErrorType(val) + c.NotReadyPeriphery = &value + return &value } -func (d *CpuDebug) setDebugModeOn(val uint64) { - d.DebugModeOn = BooleanType(val) +func (d *CpuDebug) setDebugModeOn(val uint64) any { + value := BooleanType(val) + d.DebugModeOn = &value + return &value } -func (d *CpuDebug) setDebugContactorInputOn(val uint64) { - d.DebugContactorInputOn = DebugSwitchModeType(val) +func (d *CpuDebug) setDebugContactorInputOn(val uint64) any { + value := DebugSwitchModeType(val) + d.DebugContactorInputOn = &value + return &value } -func (d *CpuDebug) setDebugCircuitBreakerOn(val uint64) { - d.DebugCircuitBreakerOn = DebugSwitchModeType(val) +func (d *CpuDebug) setDebugCircuitBreakerOn(val uint64) any { + value := DebugSwitchModeType(val) + d.DebugCircuitBreakerOn = &value + return &value } -func (d *CpuDebug) setDebugRedButtonSoftware(val uint64) { - d.DebugRedButtonSoftware = DebugSwitchModeType(val) +func (d *CpuDebug) setDebugRedButtonSoftware(val uint64) any { + value := DebugSwitchModeType(val) + d.DebugRedButtonSoftware = &value + return &value } -func (p *PuErrors) setBoardReady(val uint64) { - p.BoardReady = BoardReadyType(val) +func (p *PuErrors) setBoardReady(val uint64) any { + value := BoardReadyType(val) + p.BoardReady = &value + return &value } -func (p *PuErrors) setOtherError(val uint64) { - p.OtherError = OtherError4BitType(val) +func (p *PuErrors) setOtherError(val uint64) any { + value := OtherError4BitType(val) + p.OtherError = &value + return &value } -func (p *PuErrors) setIncorrectVoltage(val uint64) { - p.IncorrectVoltage = ErrorType(val) +func (p *PuErrors) setIncorrectVoltage(val uint64) any { + value := ErrorType(val) + p.IncorrectVoltage = &value + return &value } -func (p *PuErrors) setIncorrectVoltageValue(val uint64) { - p.IncorrectVoltageValue = Voltage11BitType(val) +func (p *PuErrors) setIncorrectVoltageValue(val uint64) any { + value := Voltage11BitType(val) + p.IncorrectVoltageValue = &value + return &value } -func (p *PuErrors) setIncorrectCurrent(val uint64) { - p.IncorrectCurrent = ErrorType(val) +func (p *PuErrors) setIncorrectCurrent(val uint64) any { + value := ErrorType(val) + p.IncorrectCurrent = &value + return &value } -func (p *PuErrors) setIncorrectCurrentValue(val uint64) { - p.IncorrectCurrentValue = Current10BitType(val) +func (p *PuErrors) setIncorrectCurrentValue(val uint64) any { + value := Current10BitType(val) + p.IncorrectCurrentValue = &value + return &value } -func (p *PuErrors) setIsolationBroken(val uint64) { - p.IsolationBroken = ErrorType(val) +func (p *PuErrors) setIsolationBroken(val uint64) any { + value := ErrorType(val) + p.IsolationBroken = &value + return &value } -func (p *PuErrors) setCpLineBroken(val uint64) { - p.CpLineBroken = ErrorType(val) +func (p *PuErrors) setCpLineBroken(val uint64) any { + value := ErrorType(val) + p.CpLineBroken = &value + return &value } -func (p *PuErrors) setCpLineGap69(val uint64) { - p.CpLineGap69 = ErrorType(val) +func (p *PuErrors) setCpLineGap69(val uint64) any { + value := ErrorType(val) + p.CpLineGap69 = &value + return &value } -func (p *PuErrors) setCableReady(val uint64) { - p.CableReady = BoardReadyType(val) +func (p *PuErrors) setCableReady(val uint64) any { + value := BoardReadyType(val) + p.CableReady = &value + return &value } -func (p *PuErrors) setNotReadyCpu(val uint64) { - p.NotReadyCpu = ErrorType(val) +func (p *PuErrors) setNotReadyCpu(val uint64) any { + value := ErrorType(val) + p.NotReadyCpu = &value + return &value } -func (p *PuErrors) setNotReadySecc(val uint64) { - p.NotReadySecc = ErrorType(val) +func (p *PuErrors) setNotReadySecc(val uint64) any { + value := ErrorType(val) + p.NotReadySecc = &value + return &value } -func (p *PuErrors) setContactorOutputError(val uint64) { - p.ContactorOutputError = ErrorType(val) +func (p *PuErrors) setContactorOutputError(val uint64) any { + value := ErrorType(val) + p.ContactorOutputError = &value + return &value } -func (p *PuErrors) setDebugContactorOutputEnabled(val uint64) { - p.DebugContactorOutputEnabled = BooleanType(val) +func (p *PuErrors) setDebugContactorOutputEnabled(val uint64) any { + value := BooleanType(val) + p.DebugContactorOutputEnabled = &value + return &value } -func (p *PuErrors) setOutputCircuitBreakerEnabled(val uint64) { - p.OutputCircuitBreakerEnabled = ErrorType(val) +func (p *PuErrors) setOutputCircuitBreakerEnabled(val uint64) any { + value := ErrorType(val) + p.OutputCircuitBreakerEnabled = &value + return &value } -func (p *PuErrors) setOutputCircuitBreakerEnabledValue(val uint64) { - p.OutputCircuitBreakerEnabledValue = SignedVoltage12bitType(val - 1000) +func (p *PuErrors) setOutputCircuitBreakerEnabledValue(val uint64) any { + value := SignedVoltage12bitType(val - 1000) + p.OutputCircuitBreakerEnabledValue = &value + return &value } -func (d *PuDebug) setDebugModeOn(val uint64) { - d.DebugModeOn = BooleanType(val) +func (d *PuDebug) setDebugModeOn(val uint64) any { + value := BooleanType(val) + d.DebugModeOn = &value + return &value } -func (d *PuDebug) setDebugContactorOutputOn(val uint64) { - d.DebugContactorOutputOn = DebugSwitchModeType(val) +func (d *PuDebug) setDebugContactorOutputOn(val uint64) any { + value := DebugSwitchModeType(val) + d.DebugContactorOutputOn = &value + return &value } -func (s *SeccTargetEnergy) setTargetChargingAllow(val uint64) { - s.TargetChargingAllow = BooleanType(val) +func (s *SeccTargetEnergy) setTargetChargingAllow(val uint64) any { + value := BooleanType(val) + s.TargetChargingAllow = &value + return &value } -func (s *SeccTargetEnergy) setTargetBatteryVoltage(val uint64) { - s.TargetBatteryVoltage = Voltage11BitType(val) +func (s *SeccTargetEnergy) setTargetBatteryVoltage(val uint64) any { + value := Voltage11BitType(val) + s.TargetBatteryVoltage = &value + return &value } -func (s *SeccTargetEnergy) setTargetGoalVoltage(val uint64) { - s.TargetGoalVoltage = Voltage11BitType(val) +func (s *SeccTargetEnergy) setTargetGoalVoltage(val uint64) any { + value := Voltage11BitType(val) + s.TargetGoalVoltage = &value + return &value } -func (s *SeccTargetEnergy) setTargetCurrent(val uint64) { - s.TargetCurrent = Current10BitType(val) +func (s *SeccTargetEnergy) setTargetCurrent(val uint64) any { + value := Current10BitType(val) + s.TargetCurrent = &value + return &value } -func (e *SeccErrors) setBoardReady(val uint64) { - e.BoardReady = BoardReadyType(val) +func (e *SeccErrors) setBoardReady(val uint64) any { + value := BoardReadyType(val) + e.BoardReady = &value + return &value } -func (e *SeccErrors) setNotReadyLogic(val uint64) { - e.NotReadyLogic = ErrorType(val) +func (e *SeccErrors) setNotReadyLogic(val uint64) any { + value := ErrorType(val) + e.NotReadyLogic = &value + return &value } -func (l *LogicEnergyMode) setV2gMode(val uint64) { - l.V2gMode = V2GModeType(val) +func (l *LogicEnergyMode) setV2gMode(val uint64) any { + value := V2GModeType(val) + l.V2gMode = &value + return &value } -func (l *LogicEnergyMode) setCurrentMax(val uint64) { - l.CurrentMax = Current10BitType(val) +func (l *LogicEnergyMode) setCurrentMax(val uint64) any { + value := Current10BitType(val) + l.CurrentMax = &value + return &value } -func (l *LogicEnergyMode) setVoltageMax(val uint64) { - l.VoltageMax = Voltage11BitType(val) +func (l *LogicEnergyMode) setVoltageMax(val uint64) any { + value := Voltage11BitType(val) + l.VoltageMax = &value + return &value } -func (l *LogicEnergyMode) setPowerMax(val uint64) { - l.PowerMax = Power14BitType(val * 100) +func (l *LogicEnergyMode) setPowerMax(val uint64) any { + value := Power14BitType(val * 100) + l.PowerMax = &value + return &value } -func (l *LogicErrors) setBoardReady(val uint64) { - l.BoardReady = BoardReadyType(val) +func (l *LogicErrors) setBoardReady(val uint64) any { + value := BoardReadyType(val) + l.BoardReady = &value + return &value } -func (l *LogicErrors) setNotReadySettings(val uint64) { - l.NotReadySettings = ErrorType(val) +func (l *LogicErrors) setNotReadySettings(val uint64) any { + value := ErrorType(val) + l.NotReadySettings = &value + return &value } -func (c *ContactorsInternalForce) setForceModeEnabled(val uint64) { - c.ForceModeEnabled = BooleanType(val) +func (c *ContactorsInternalForce) setForceModeEnabled(val uint64) any { + value := BooleanType(val) + c.ForceModeEnabled = &value + return &value } -func (c *ContactorsInternalForce) setForceModeValue(val uint64) { - c.ForceModeValue = ForceModeType(val) +func (c *ContactorsInternalForce) setForceModeValue(val uint64) any { + value := ForceModeType(val) + c.ForceModeValue = &value + return &value } -func (c *ContactorInternalDebug) setDebugModeOn(val uint64) { - c.DebugModeOn = BooleanType(val) +func (c *ContactorInternalDebug) setDebugModeOn(val uint64) any { + value := BooleanType(val) + c.DebugModeOn = &value + return &value } -func (c *ContactorInternalDebug) setDebugContactorOn(val uint64) { - c.DebugContactorOn = DebugSwitchModeType(val) +func (c *ContactorInternalDebug) setDebugContactorOn(val uint64) any { + value := DebugSwitchModeType(val) + c.DebugContactorOn = &value + return &value } -func (p *PeripheryState) setOtherErrorSeverity(val uint64) { - p.OtherErrorSeverity = BoardReadyType(val) +func (p *PeripheryState) setOtherErrorSeverity(val uint64) any { + value := BoardReadyType(val) + p.OtherErrorSeverity = &value + return &value } -func (p *PeripheryState) setOtherError(val uint64) { - p.OtherError = OtherError4BitType(val) +func (p *PeripheryState) setOtherError(val uint64) any { + value := OtherError4BitType(val) + p.OtherError = &value + return &value } -func (p *PeripheryState) setErrorShakeSensor(val uint64) { - p.ErrorShakeSensor = ErrorType(val) +func (p *PeripheryState) setErrorShakeSensor(val uint64) any { + value := ErrorType(val) + p.ErrorShakeSensor = &value + return &value } -func (p *PeripheryState) setErrorCoolingGroup(val uint64) { - p.ErrorCoolingGroup = ErrorType(val) +func (p *PeripheryState) setErrorCoolingGroup(val uint64) any { + value := ErrorType(val) + p.ErrorCoolingGroup = &value + return &value } -func (p *PeripheryState) setPeripheryErrorCoolingGroup(val uint64) { - p.PeripheryErrorCoolingGroup = ErrorType(val) +func (p *PeripheryState) setPeripheryErrorCoolingGroup(val uint64) any { + value := ErrorType(val) + p.PeripheryErrorCoolingGroup = &value + return &value } -func (p *PeripheryState) setErrorFireEmergency(val uint64) { - p.ErrorFireEmergency = ErrorType(val) +func (p *PeripheryState) setErrorFireEmergency(val uint64) any { + value := ErrorType(val) + p.ErrorFireEmergency = &value + return &value } -func (p *PeripheryState) setErrorFireEmergencyRun(val uint64) { - p.ErrorFireEmergencyRun = ErrorType(val) +func (p *PeripheryState) setErrorFireEmergencyRun(val uint64) any { + value := ErrorType(val) + p.ErrorFireEmergencyRun = &value + return &value } -func (p *PeripheryState) setErrorFireEmergencyControl(val uint64) { - p.ErrorFireEmergencyControl = ErrorType(val) +func (p *PeripheryState) setErrorFireEmergencyControl(val uint64) any { + value := ErrorType(val) + p.ErrorFireEmergencyControl = &value + return &value } -func (p *PeripheryState) setErrorOvervoltageIn(val uint64) { - p.ErrorOvervoltageIn = ErrorType(val) +func (p *PeripheryState) setErrorOvervoltageIn(val uint64) any { + value := ErrorType(val) + p.ErrorOvervoltageIn = &value + return &value } -func (p *PeripheryState) setPeripheryErrorPowerSupply(val uint64) { - p.PeripheryErrorPowerSupply = ErrorType(val) +func (p *PeripheryState) setPeripheryErrorPowerSupply(val uint64) any { + value := ErrorType(val) + p.PeripheryErrorPowerSupply = &value + return &value } -func (p *PeripheryState) setErrorFan(val uint64) { - p.ErrorFan = ErrorType(val) +func (p *PeripheryState) setErrorFan(val uint64) any { + value := ErrorType(val) + p.ErrorFan = &value + return &value } -func (p *PeripheryState) setErrorOvervoltageOut(val uint64) { - p.ErrorOvervoltageOut = ErrorType(val) +func (p *PeripheryState) setErrorOvervoltageOut(val uint64) any { + value := ErrorType(val) + p.ErrorOvervoltageOut = &value + return &value } -func (p *PeripheryState) setErrorStateRemoteMode(val uint64) { - p.ErrorStateRemoteMode = ErrorType(val) +func (p *PeripheryState) setErrorStateRemoteMode(val uint64) any { + value := ErrorType(val) + p.ErrorStateRemoteMode = &value + return &value } -func (p *PeripheryState) setDebugShsnFanEnabled(val uint64) { - p.DebugShsnFanEnabled = BooleanType(val) +func (p *PeripheryState) setDebugShsnFanEnabled(val uint64) any { + value := BooleanType(val) + p.DebugShsnFanEnabled = &value + return &value } -func (p *PeripheryState) setDebugShptFanEnabled(val uint64) { - p.DebugShptFanEnabled = BooleanType(val) +func (p *PeripheryState) setDebugShptFanEnabled(val uint64) any { + value := BooleanType(val) + p.DebugShptFanEnabled = &value + return &value } -func (p *PeripheryState) setDebugIoBoardTestLampEnabled(val uint64) { - p.DebugIoBoardTestLampEnabled = BooleanType(val) +func (p *PeripheryState) setDebugIoBoardTestLampEnabled(val uint64) any { + value := BooleanType(val) + p.DebugIoBoardTestLampEnabled = &value + return &value } -func (p *PeripheryState) setErrorFireEmergencyCircuitBreaker(val uint64) { - p.ErrorFireEmergencyCircuitBreaker = ErrorType(val) +func (p *PeripheryState) setErrorFireEmergencyCircuitBreaker(val uint64) any { + value := ErrorType(val) + p.ErrorFireEmergencyCircuitBreaker = &value + return &value } -func (p *PeripheryState) setErrorExtLightCircuitBreaker(val uint64) { - p.ErrorExtLightCircuitBreaker = ErrorType(val) +func (p *PeripheryState) setErrorExtLightCircuitBreaker(val uint64) any { + value := ErrorType(val) + p.ErrorExtLightCircuitBreaker = &value + return &value } -func (p *PeripheryState) setErrorIndicationCircuitBreaker(val uint64) { - p.ErrorIndicationCircuitBreaker = ErrorType(val) +func (p *PeripheryState) setErrorIndicationCircuitBreaker(val uint64) any { + value := ErrorType(val) + p.ErrorIndicationCircuitBreaker = &value + return &value } -func (p *PeripheryState) setErrorLowVoltagePowerCircuitBreaker(val uint64) { - p.ErrorLowVoltagePowerCircuitBreaker = ErrorType(val) +func (p *PeripheryState) setErrorLowVoltagePowerCircuitBreaker(val uint64) any { + value := ErrorType(val) + p.ErrorLowVoltagePowerCircuitBreaker = &value + return &value } -func (p *PeripheryState) setErrorContactorsInternalCircuitBreaker(val uint64) { - p.ErrorContactorsInternalCircuitBreaker = ErrorType(val) +func (p *PeripheryState) setErrorContactorsInternalCircuitBreaker(val uint64) any { + value := ErrorType(val) + p.ErrorContactorsInternalCircuitBreaker = &value + return &value } -func (p *PeripheryState) setErrorPlcCircuitBreaker(val uint64) { - p.ErrorPlcCircuitBreaker = ErrorType(val) +func (p *PeripheryState) setErrorPlcCircuitBreaker(val uint64) any { + value := ErrorType(val) + p.ErrorPlcCircuitBreaker = &value + return &value } -func (p *PeripheryInfo) setInfoDoorOpen(val uint64) { - p.InfoDoorOpen = BooleanType(val) +func (p *PeripheryInfo) setInfoDoorOpen(val uint64) any { + value := BooleanType(val) + p.InfoDoorOpen = &value + return &value } -func (p *PeripheryInfo) setTempAirIn(val uint64) { - p.TempAirIn = SignedAirTemp8BitType(val - 67) +func (p *PeripheryInfo) setTempAirIn(val uint64) any { + value := SignedAirTemp8BitType(val - 67) + p.TempAirIn = &value + return &value } -func (p *PeripheryInfo) setTempAirOut(val uint64) { - p.TempAirOut = SignedAirTemp8BitType(val - 67) +func (p *PeripheryInfo) setTempAirOut(val uint64) any { + value := SignedAirTemp8BitType(val - 67) + p.TempAirOut = &value + return &value } -func (p *PeripheryInfo) setStateShsnFan(val uint64) { - p.StateShsnFan = BooleanType(val) +func (p *PeripheryInfo) setStateShsnFan(val uint64) any { + value := BooleanType(val) + p.StateShsnFan = &value + return &value } -func (p *PeripheryInfo) setStateShptFan(val uint64) { - p.StateShptFan = BooleanType(val) +func (p *PeripheryInfo) setStateShptFan(val uint64) any { + value := BooleanType(val) + p.StateShptFan = &value + return &value } -func (p *PeripheryDebug) setDebugModeOn(val uint64) { - p.DebugModeOn = BooleanType(val) +func (p *PeripheryDebug) setDebugModeOn(val uint64) any { + value := BooleanType(val) + p.DebugModeOn = &value + return &value } -func (p *PeripheryDebug) setDebugShsnFan(val uint64) { - p.DebugShsnFan = DebugSwitchModeType(val) +func (p *PeripheryDebug) setDebugShsnFan(val uint64) any { + value := DebugSwitchModeType(val) + p.DebugShsnFan = &value + return &value } -func (p *PeripheryDebug) setDebugShptFan(val uint64) { - p.DebugShptFan = DebugSwitchModeType(val) +func (p *PeripheryDebug) setDebugShptFan(val uint64) any { + value := DebugSwitchModeType(val) + p.DebugShptFan = &value + return &value } -func (p *PeripheryDebug) setDebugIoBoardTestLamp(val uint64) { - p.DebugIoBoardTestLamp = DebugSwitchModeType(val) +func (p *PeripheryDebug) setDebugIoBoardTestLamp(val uint64) any { + value := DebugSwitchModeType(val) + p.DebugIoBoardTestLamp = &value + return &value } -func (c *ConverterPresentEnergy) setV2gMode(val uint64) { - c.V2gMode = V2GModeType(val) +func (c *ConverterPresentEnergy) setV2gMode(val uint64) any { + value := V2GModeType(val) + c.V2gMode = &value + return &value } -func (c *ConverterPresentEnergy) setPresentVoltage(val uint64) { - c.PresentVoltage = Voltage11BitType(val) +func (c *ConverterPresentEnergy) setPresentVoltage(val uint64) any { + value := Voltage11BitType(val) + c.PresentVoltage = &value + return &value } -func (c *ConverterPresentEnergy) setPresentCurrent(val uint64) { - c.PresentCurrent = Current10BitType(val) +func (c *ConverterPresentEnergy) setPresentCurrent(val uint64) any { + value := Current10BitType(val) + c.PresentCurrent = &value + return &value } -func (c *ConverterPresentEnergy) setConnectedOut(val uint64) { - c.ConnectedOut = ConnectedOut8bitType(val) +func (c *ConverterPresentEnergy) setConnectedOut(val uint64) any { + value := ConnectedOut8bitType(val) + c.ConnectedOut = &value + return &value } -func (c *ConverterErrors) setBoardReady(val uint64) { - c.BoardReady = BoardReadyType(val) +func (c *ConverterErrors) setBoardReady(val uint64) any { + value := BoardReadyType(val) + c.BoardReady = &value + return &value } -func (c *ConverterErrors) setOtherError(val uint64) { - c.OtherError = OtherError4BitType(val) +func (c *ConverterErrors) setOtherError(val uint64) any { + value := OtherError4BitType(val) + c.OtherError = &value + return &value } -func (c *ConverterErrors) setNotConnectedOut(val uint64) { - c.NotConnectedOut = ErrorType(val) +func (c *ConverterErrors) setNotConnectedOut(val uint64) any { + value := ErrorType(val) + c.NotConnectedOut = &value + return &value } -func (c *ConverterErrors) setNoCommunicationConverter(val uint64) { - c.NoCommunicationConverter = ErrorType(val) +func (c *ConverterErrors) setNoCommunicationConverter(val uint64) any { + value := ErrorType(val) + c.NoCommunicationConverter = &value + return &value } -func (c *ConverterErrors) setNoCommunicationPuConverter(val uint64) { - c.NoCommunicationPuConverter = ErrorType(val) +func (c *ConverterErrors) setNoCommunicationPuConverter(val uint64) any { + value := ErrorType(val) + c.NoCommunicationPuConverter = &value + return &value } -func (c *ConverterErrors) setInputGridVoltageHigh(val uint64) { - c.InputGridVoltageHigh = ErrorType(val) +func (c *ConverterErrors) setInputGridVoltageHigh(val uint64) any { + value := ErrorType(val) + c.InputGridVoltageHigh = &value + return &value } -func (c *ConverterErrors) setInputGridVoltageLow(val uint64) { - c.InputGridVoltageLow = ErrorType(val) +func (c *ConverterErrors) setInputGridVoltageLow(val uint64) any { + value := ErrorType(val) + c.InputGridVoltageLow = &value + return &value } -func (c *ConverterErrors) setOutputGridVoltageHigh(val uint64) { - c.OutputGridVoltageHigh = ErrorType(val) +func (c *ConverterErrors) setOutputGridVoltageHigh(val uint64) any { + value := ErrorType(val) + c.OutputGridVoltageHigh = &value + return &value } -func (c *ConverterErrors) setOutputGridVoltageLow(val uint64) { - c.OutputGridVoltageLow = ErrorType(val) +func (c *ConverterErrors) setOutputGridVoltageLow(val uint64) any { + value := ErrorType(val) + c.OutputGridVoltageLow = &value + return &value } -func (c *ConverterErrors) setInputGridVoltage(val uint64) { - c.InputGridVoltage = Voltage11BitType(val) +func (c *ConverterErrors) setInputGridVoltage(val uint64) any { + value := Voltage11BitType(val) + c.InputGridVoltage = &value + return &value } -func (c *ConverterErrors) setOutputGridVoltage(val uint64) { - c.OutputGridVoltage = Voltage11BitType(val) +func (c *ConverterErrors) setOutputGridVoltage(val uint64) any { + value := Voltage11BitType(val) + c.OutputGridVoltage = &value + return &value } -func (c *ConverterErrors) setShortCircuit(val uint64) { - c.ShortCircuit = ErrorType(val) +func (c *ConverterErrors) setShortCircuit(val uint64) any { + value := ErrorType(val) + c.ShortCircuit = &value + return &value } -func (c *ConverterErrors) setOverHeat(val uint64) { - c.OverHeat = ErrorType(val) +func (c *ConverterErrors) setOverHeat(val uint64) any { + value := ErrorType(val) + c.OverHeat = &value + return &value } -func (c *ConverterErrors) setFanBroken(val uint64) { - c.FanBroken = ErrorType(val) +func (c *ConverterErrors) setFanBroken(val uint64) any { + value := ErrorType(val) + c.FanBroken = &value + return &value } -func (c *ConverterErrors) setOtherHardwareError(val uint64) { - c.OtherHardwareError = ErrorType(val) +func (c *ConverterErrors) setOtherHardwareError(val uint64) any { + value := ErrorType(val) + c.OtherHardwareError = &value + return &value } -func (c *ConverterErrors) setDebugConvEnabled(val uint64) { - c.DebugConvEnabled = BooleanType(val) +func (c *ConverterErrors) setDebugConvEnabled(val uint64) any { + value := BooleanType(val) + c.DebugConvEnabled = &value + return &value } -func (c *ConverterErrors) setDebugConvDisabled(val uint64) { - c.DebugConvDisabled = BooleanType(val) +func (c *ConverterErrors) setDebugConvDisabled(val uint64) any { + value := BooleanType(val) + c.DebugConvDisabled = &value + return &value } -func (d *ConverterDebug) setDebugModeOn(val uint64) { - d.DebugModeOn = BooleanType(val) +func (d *ConverterDebug) setDebugModeOn(val uint64) any { + value := BooleanType(val) + d.DebugModeOn = &value + return &value } -func (d *ConverterDebug) setDebugEnergyOn(val uint64) { - d.DebugEnergyOn = DebugSwitchModeType(val) +func (d *ConverterDebug) setDebugEnergyOn(val uint64) any { + value := DebugSwitchModeType(val) + d.DebugEnergyOn = &value + return &value } -func (d *ConverterDebug) setDebugTargetVoltage(val uint64) { - d.DebugTargetVoltage = Voltage11BitType(val) +func (d *ConverterDebug) setDebugTargetVoltage(val uint64) any { + value := Voltage11BitType(val) + d.DebugTargetVoltage = &value + return &value } -func (d *ConverterDebug) setDebugTargetCurrent(val uint64) { - d.DebugTargetCurrent = Current10BitType(val) +func (d *ConverterDebug) setDebugTargetCurrent(val uint64) any { + value := Current10BitType(val) + d.DebugTargetCurrent = &value + return &value } diff --git a/yabl/strings.go b/yabl/strings.go index 8acb656..6a295d9 100644 --- a/yabl/strings.go +++ b/yabl/strings.go @@ -192,7 +192,7 @@ func (d DebugSwitchModeType) String() string { case DEBUG_SWITCH_MODE_PERMANENT_ON: return "PERMANENT_ON" default: - panic("DebugSwitchModeType not defended") + return fmt.Sprintf("DebugSwitchModeType_%d", d) } } diff --git a/yabl/types.go b/yabl/types.go index 8f1b0a6..9e7e07f 100644 --- a/yabl/types.go +++ b/yabl/types.go @@ -2,252 +2,252 @@ package yabl type ContactorInternalState struct { UnitId uint - ContactorReady BoardReadyType - ContactorOn BooleanType - UnexpectedState ErrorType - Isolated ErrorType - DebugEnabled BooleanType + ContactorReady *BoardReadyType + ContactorOn *BooleanType + UnexpectedState *ErrorType + Isolated *ErrorType + DebugEnabled *BooleanType } type ContactorInternalErrors struct { UnitId uint - BoardReady BoardReadyType - OtherError ContactorInternalOtherErrorType - ContactorGroupChanged ContactorGroupChangedType - UnexpectedFormation ContactorInternalOtherErrorType - CpuNotReady ErrorType - PuNotReady ErrorType - Debug BooleanType - PresentContactorMode ContactorModeType + BoardReady *BoardReadyType + OtherError *ContactorInternalOtherErrorType + ContactorGroupChanged *ContactorGroupChangedType + UnexpectedFormation *ContactorInternalOtherErrorType + CpuNotReady *ErrorType + PuNotReady *ErrorType + Debug *BooleanType + PresentContactorMode *ContactorModeType } type ContactorsInternalForce struct { UnitId uint - ForceModeEnabled BooleanType - ForceModeValue ForceModeType + ForceModeEnabled *BooleanType + ForceModeValue *ForceModeType } type ContactorInternalDebug struct { UnitId uint - DebugModeOn BooleanType - DebugContactorOn DebugSwitchModeType + DebugModeOn *BooleanType + DebugContactorOn *DebugSwitchModeType } type PuPresentEnergy struct { UnitId uint - V2GMode V2GModeType - VoltageBefore Voltage11BitType - VoltageAfter Voltage11BitType - PresentCurrent Current10BitType + V2GMode *V2GModeType + VoltageBefore *Voltage11BitType + VoltageAfter *Voltage11BitType + PresentCurrent *Current10BitType } type PuPeriphery struct { UnitId uint - ConnectorInsert BooleanType - ContactorOn BooleanType - ConnectorLocked BooleanType - CpLineLevel CpLineLevelType - IsolationState IsolationStateType - ChargingAllowed BooleanType - PwmEnabled BooleanType - CpLineVoltage Voltage9BitType + ConnectorInsert *BooleanType + ContactorOn *BooleanType + ConnectorLocked *BooleanType + CpLineLevel *CpLineLevelType + IsolationState *IsolationStateType + ChargingAllowed *BooleanType + PwmEnabled *BooleanType + CpLineVoltage *Voltage9BitType } type LogicAuth struct { UnitId uint - AuthMode AuthModeType - AuthState AuthStateType + AuthMode *AuthModeType + AuthState *AuthStateType } type LogicEnergyMode struct { UnitId uint - V2gMode V2GModeType - CurrentMax Current10BitType - VoltageMax Voltage11BitType - PowerMax Power14BitType + V2gMode *V2GModeType + CurrentMax *Current10BitType + VoltageMax *Voltage11BitType + PowerMax *Power14BitType } type LogicErrors struct { UnitId uint - BoardReady BoardReadyType - NotReadySettings ErrorType + BoardReady *BoardReadyType + NotReadySettings *ErrorType } type LogicWorkingMode struct { UnitId uint - TargetContactorMode ContactorModeType - Availability BooleanType + TargetContactorMode *ContactorModeType + Availability *BooleanType } type CpuPresentEnergy struct { UnitId uint - PowerDirectionMode V2GModeType - PresentCurrent Current10BitType - PresentVoltage Voltage11BitType + PowerDirectionMode *V2GModeType + PresentCurrent *Current10BitType + PresentVoltage *Voltage11BitType } type CpuPeriphery struct { UnitId uint - ContactorInput BooleanType - CircuitBreakerInput BooleanType - CircuitBreakerPowerCBInput BooleanType + ContactorInput *BooleanType + CircuitBreakerInput *BooleanType + CircuitBreakerPowerCBInput *BooleanType } type CpuEnergySettings struct { UnitId uint - CurrentMax Current10BitType - VoltageMax Voltage11BitType - PowerMax Power14BitType - TargetBatteryVoltage Voltage11BitType - TargetGoalVoltage Voltage11BitType + CurrentMax *Current10BitType + VoltageMax *Voltage11BitType + PowerMax *Power14BitType + TargetBatteryVoltage *Voltage11BitType + TargetGoalVoltage *Voltage11BitType } type CpuErrors struct { UnitId uint - BoardReady BoardReadyType - OtherError OtherError4BitType - RedButtonHard ErrorType - RedButtonSoft ErrorType - ModulesGone ErrorType - GridVoltageHighErr ErrorType - GridVoltageHighWarn ErrorType - GridVoltageLowWarn ErrorType - GridVoltageLowErr ErrorType - GridVoltageLow Voltage11BitType - GridVoltageHigh Voltage11BitType - GridVoltageEmpty ErrorType - NotReadySecc ErrorType - NotReadyPu ErrorType - NotReadyContactors ErrorType - DebugConvertersEnabled ErrorType - ContactorInputError ErrorType - NotReadyPeriphery ErrorType + BoardReady *BoardReadyType + OtherError *OtherError4BitType + RedButtonHard *ErrorType + RedButtonSoft *ErrorType + ModulesGone *ErrorType + GridVoltageHighErr *ErrorType + GridVoltageHighWarn *ErrorType + GridVoltageLowWarn *ErrorType + GridVoltageLowErr *ErrorType + GridVoltageLow *Voltage11BitType + GridVoltageHigh *Voltage11BitType + GridVoltageEmpty *ErrorType + NotReadySecc *ErrorType + NotReadyPu *ErrorType + NotReadyContactors *ErrorType + DebugConvertersEnabled *ErrorType + ContactorInputError *ErrorType + NotReadyPeriphery *ErrorType } type CpuDebug struct { UnitId uint - DebugModeOn BooleanType - DebugContactorInputOn DebugSwitchModeType - DebugCircuitBreakerOn DebugSwitchModeType - DebugRedButtonSoftware DebugSwitchModeType + DebugModeOn *BooleanType + DebugContactorInputOn *DebugSwitchModeType + DebugCircuitBreakerOn *DebugSwitchModeType + DebugRedButtonSoftware *DebugSwitchModeType } type PuErrors struct { UnitId uint - BoardReady BoardReadyType - OtherError OtherError4BitType - IncorrectVoltage ErrorType - IncorrectVoltageValue Voltage11BitType - IncorrectCurrent ErrorType - IncorrectCurrentValue Current10BitType - IsolationBroken ErrorType - CpLineBroken ErrorType - CpLineGap69 ErrorType - CableReady BoardReadyType - NotReadyCpu ErrorType - NotReadySecc ErrorType - ContactorOutputError ErrorType - DebugContactorOutputEnabled BooleanType - OutputCircuitBreakerEnabled ErrorType - OutputCircuitBreakerEnabledValue SignedVoltage12bitType + BoardReady *BoardReadyType + OtherError *OtherError4BitType + IncorrectVoltage *ErrorType + IncorrectVoltageValue *Voltage11BitType + IncorrectCurrent *ErrorType + IncorrectCurrentValue *Current10BitType + IsolationBroken *ErrorType + CpLineBroken *ErrorType + CpLineGap69 *ErrorType + CableReady *BoardReadyType + NotReadyCpu *ErrorType + NotReadySecc *ErrorType + ContactorOutputError *ErrorType + DebugContactorOutputEnabled *BooleanType + OutputCircuitBreakerEnabled *ErrorType + OutputCircuitBreakerEnabledValue *SignedVoltage12bitType } type PuDebug struct { UnitId uint - DebugModeOn BooleanType - DebugContactorOutputOn DebugSwitchModeType + DebugModeOn *BooleanType + DebugContactorOutputOn *DebugSwitchModeType } type SeccTargetEnergy struct { UnitId uint - TargetChargingAllow BooleanType - TargetBatteryVoltage Voltage11BitType - TargetGoalVoltage Voltage11BitType - TargetCurrent Current10BitType + TargetChargingAllow *BooleanType + TargetBatteryVoltage *Voltage11BitType + TargetGoalVoltage *Voltage11BitType + TargetCurrent *Current10BitType } type SeccErrors struct { UnitId uint - BoardReady BoardReadyType - NotReadyLogic ErrorType + BoardReady *BoardReadyType + NotReadyLogic *ErrorType } type PeripheryState struct { UnitId uint - OtherErrorSeverity BoardReadyType - OtherError OtherError4BitType - ErrorShakeSensor ErrorType - ErrorCoolingGroup ErrorType - PeripheryErrorCoolingGroup ErrorType - ErrorFireEmergency ErrorType - ErrorFireEmergencyRun ErrorType - ErrorFireEmergencyControl ErrorType - ErrorOvervoltageIn ErrorType - PeripheryErrorPowerSupply ErrorType - ErrorFan ErrorType - ErrorOvervoltageOut ErrorType - ErrorStateRemoteMode ErrorType - DebugShsnFanEnabled BooleanType - DebugShptFanEnabled BooleanType - DebugIoBoardTestLampEnabled BooleanType - ErrorFireEmergencyCircuitBreaker ErrorType - ErrorExtLightCircuitBreaker ErrorType - ErrorIndicationCircuitBreaker ErrorType - ErrorLowVoltagePowerCircuitBreaker ErrorType - ErrorContactorsInternalCircuitBreaker ErrorType - ErrorPlcCircuitBreaker ErrorType + OtherErrorSeverity *BoardReadyType + OtherError *OtherError4BitType + ErrorShakeSensor *ErrorType + ErrorCoolingGroup *ErrorType + PeripheryErrorCoolingGroup *ErrorType + ErrorFireEmergency *ErrorType + ErrorFireEmergencyRun *ErrorType + ErrorFireEmergencyControl *ErrorType + ErrorOvervoltageIn *ErrorType + PeripheryErrorPowerSupply *ErrorType + ErrorFan *ErrorType + ErrorOvervoltageOut *ErrorType + ErrorStateRemoteMode *ErrorType + DebugShsnFanEnabled *BooleanType + DebugShptFanEnabled *BooleanType + DebugIoBoardTestLampEnabled *BooleanType + ErrorFireEmergencyCircuitBreaker *ErrorType + ErrorExtLightCircuitBreaker *ErrorType + ErrorIndicationCircuitBreaker *ErrorType + ErrorLowVoltagePowerCircuitBreaker *ErrorType + ErrorContactorsInternalCircuitBreaker *ErrorType + ErrorPlcCircuitBreaker *ErrorType } type PeripheryInfo struct { UnitId uint - InfoDoorOpen BooleanType - TempAirIn SignedAirTemp8BitType - TempAirOut SignedAirTemp8BitType - StateShsnFan BooleanType - StateShptFan BooleanType + InfoDoorOpen *BooleanType + TempAirIn *SignedAirTemp8BitType + TempAirOut *SignedAirTemp8BitType + StateShsnFan *BooleanType + StateShptFan *BooleanType } type PeripheryDebug struct { UnitId uint - DebugModeOn BooleanType - DebugShsnFan DebugSwitchModeType - DebugShptFan DebugSwitchModeType - DebugIoBoardTestLamp DebugSwitchModeType + DebugModeOn *BooleanType + DebugShsnFan *DebugSwitchModeType + DebugShptFan *DebugSwitchModeType + DebugIoBoardTestLamp *DebugSwitchModeType } type ConverterPresentEnergy struct { UnitId uint - V2gMode V2GModeType - PresentVoltage Voltage11BitType - PresentCurrent Current10BitType - ConnectedOut ConnectedOut8bitType + V2gMode *V2GModeType + PresentVoltage *Voltage11BitType + PresentCurrent *Current10BitType + ConnectedOut *ConnectedOut8bitType } type ConverterErrors struct { UnitId uint - BoardReady BoardReadyType - OtherError OtherError4BitType - NotConnectedOut ErrorType - NoCommunicationConverter ErrorType - NoCommunicationPuConverter ErrorType - InputGridVoltageHigh ErrorType - InputGridVoltageLow ErrorType - OutputGridVoltageHigh ErrorType - OutputGridVoltageLow ErrorType - InputGridVoltage Voltage11BitType - OutputGridVoltage Voltage11BitType - ShortCircuit ErrorType - OverHeat ErrorType - FanBroken ErrorType - OtherHardwareError ErrorType - DebugConvEnabled BooleanType - DebugConvDisabled BooleanType + BoardReady *BoardReadyType + OtherError *OtherError4BitType + NotConnectedOut *ErrorType + NoCommunicationConverter *ErrorType + NoCommunicationPuConverter *ErrorType + InputGridVoltageHigh *ErrorType + InputGridVoltageLow *ErrorType + OutputGridVoltageHigh *ErrorType + OutputGridVoltageLow *ErrorType + InputGridVoltage *Voltage11BitType + OutputGridVoltage *Voltage11BitType + ShortCircuit *ErrorType + OverHeat *ErrorType + FanBroken *ErrorType + OtherHardwareError *ErrorType + DebugConvEnabled *BooleanType + DebugConvDisabled *BooleanType } type ConverterDebug struct { UnitId uint - DebugModeOn BooleanType - DebugEnergyOn DebugSwitchModeType - DebugTargetVoltage Voltage11BitType - DebugTargetCurrent Current10BitType + DebugModeOn *BooleanType + DebugEnergyOn *DebugSwitchModeType + DebugTargetVoltage *Voltage11BitType + DebugTargetCurrent *Current10BitType } -- 2.54.0 From 6521b707dd7478b81c2ad010b3a6330b024812a9 Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Fri, 4 Aug 2023 01:05:56 +0300 Subject: [PATCH 09/15] Correct timestamp when reading from stdin or file --- can/can.go | 5 ++-- can/input.go | 44 ++++++++++++++++++++++++----------- can/input_test.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++ yabl/protocol.go | 11 ++++----- 4 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 can/input_test.go diff --git a/can/can.go b/can/can.go index 1bc6b6e..bdf185b 100644 --- a/can/can.go +++ b/can/can.go @@ -40,7 +40,7 @@ const CAN_ID_065 = 0x065 type CanFrame struct { CanId uint32 Payload []uint8 - Date string + Date *time.Time } // NewCan New returns a new CAN bus socket. @@ -167,8 +167,9 @@ func StartCan(canbus string) (<-chan *CanFrame, error) { for { //TODO implement stop if id, data, serr := socket.Recv(); serr == nil { + var now = time.Now() canevents <- &CanFrame{ - Date: time.Now().String(), + Date: &now, CanId: id, Payload: data, } diff --git a/can/input.go b/can/input.go index 732332e..6ddca57 100644 --- a/can/input.go +++ b/can/input.go @@ -6,13 +6,15 @@ import ( "os" "regexp" "strconv" + "time" ) // (2022-07-08 16:54:15.587099) can0 100 [8] 00 00 00 00 00 00 64 00 // (1670578900.771868) can0 00004021#00000000FCFFFFFF const EXPR_HR = "\\((.*)\\)\\s+can\\d+\\s+(\\S+)\\s+\\[\\d\\]\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)\\s+([A-F0-9]+)" -const EXPR_M = "\\((.*)\\)\\s+can\\d+\\s+(\\S+)#([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})" -const length = 11 +const EXPR_M = "\\((\\d+)\\.(\\d+)\\)\\s+can\\d+\\s+(\\S+)#([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})([A-F0-9]{2})" +const time_hr_layout = "2006-01-02 15:04:05.000000" +const base_length = 11 var patternHr = regexp.MustCompile(EXPR_HR) var patternM = regexp.MustCompile(EXPR_M) @@ -40,7 +42,7 @@ func Readfile(filename *string) <-chan *CanFrame { func process(scanner *bufio.Scanner, ch chan<- *CanFrame) { for scanner.Scan() { text := scanner.Text() - if frame := fromString(&text); frame != nil { + if frame := fromString(text); frame != nil { ch <- frame } } @@ -60,22 +62,36 @@ func ReadStdin() <-chan *CanFrame { return c } -func fromString(text *string) *CanFrame { - var submatch []string - if submatch = patternHr.FindStringSubmatch(*text); submatch == nil { - if submatch = patternM.FindStringSubmatch(*text); submatch == nil { - return nil - } +func fromString(text string) *CanFrame { + var match []string + var now time.Time + var offset int + + if match = patternHr.FindStringSubmatch(text); match != nil { + now, _ = time.ParseInLocation(time_hr_layout, match[1], time.Local) + offset = 0 + } else if match = patternM.FindStringSubmatch(text); match != nil { + var seconds, _ = strconv.ParseInt(match[1], 10, 0) + var nanos, _ = strconv.ParseInt(match[2], 10, 0) + now = time.Unix(seconds, nanos*1000) //.In(time.Local) + + // Correct time to local zone + var _, zoneoffset = now.Zone() + now = now.Add(-time.Duration(zoneoffset) * time.Second) + + offset = 1 + } else { + return nil } - if len(submatch) == length { - canid, err := strconv.ParseUint(submatch[2], 16, 0) + if len(match) == base_length+offset { + canId, err := strconv.ParseUint(match[2+offset], 16, 0) if err != nil { return nil } payload := make([]uint8, 8) - for idx, octet := range submatch[3:] { + for idx, octet := range match[3+offset:] { val, err := strconv.ParseUint(octet, 16, 0) if err != nil { fmt.Println(err) @@ -86,8 +102,8 @@ func fromString(text *string) *CanFrame { } return &CanFrame{ - Date: submatch[1], - CanId: uint32(canid), + Date: &now, + CanId: uint32(canId), Payload: payload, } } diff --git a/can/input_test.go b/can/input_test.go new file mode 100644 index 0000000..88071ad --- /dev/null +++ b/can/input_test.go @@ -0,0 +1,59 @@ +package can + +import ( + "reflect" + "testing" + "time" +) + +const ( + frame_hr = "(2022-07-08 16:54:15.587099) can0 100 [8] 00 00 00 00 00 00 64 00" + frame_m = "(1670578900.771868) can0 00004021#00000000FCFFFFFF" +) + +func Test_fromString(t *testing.T) { + var time_m, err1 = time.ParseInLocation("2006-01-02T15:04:05.000000", "2022-12-09T09:41:40.771868", time.Local) + var time_p, err2 = time.ParseInLocation("2006-01-02 15:04:05.000000", "2022-07-08 16:54:15.587099", time.Local) + + if err1 != nil || err2 != nil { + t.Error() + } + + //time_m = time_m.In(time.Local) + //time_p = time_p.In(time.Local) + + type args struct { + text string + } + tests := []struct { + name string + args args + want *CanFrame + }{ + { + name: "Machine readable time", + args: args{text: frame_m}, + want: &CanFrame{ + Date: &time_m, + CanId: 0x4021, + Payload: []uint8{00, 00, 00, 00, 0xFC, 0xFF, 0xFF, 0xFF}, + }, + }, + { + name: "Human readable time", + args: args{text: frame_hr}, + want: &CanFrame{ + Date: &time_p, + CanId: 0x100, + Payload: []uint8{00, 00, 00, 00, 00, 00, 0x64, 00}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := fromString(tt.args.text); !reflect.DeepEqual(got, tt.want) { + t.Errorf("fromString() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/yabl/protocol.go b/yabl/protocol.go index c646450..310e4b2 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -1,7 +1,7 @@ package yabl import ( - "cli-mon/can" + can "cli-mon/can" "encoding/binary" time "time" ) @@ -40,7 +40,7 @@ type Event struct { ActionName AName Field FName Object Action - Updated time.Time + Updated *time.Time Value any } @@ -55,7 +55,7 @@ type field struct { length uint8 setter func(uint64 uint64) any value uint64 - last time.Time + last *time.Time name FName } @@ -106,14 +106,13 @@ func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan *Event { var unitId = uint((frame.CanId & UNIT_ID_MASK) >> UNIT_ID_OFFSET) var canId = frame.CanId & ACTION_ID_MASK var k = key{canId: canId, unitId: unitId} - var now = time.Now() param := protocolMap[k] var start uint8 = 0 for _, f := range param.fields { if val, found := get(start, f.length, frame.Payload); found { - f.last = now + f.last = frame.Date if f.value != val { f.value = val obj := f.setter(val) @@ -122,7 +121,7 @@ func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan *Event { ActionName: param.name, Object: param.object, UnitId: unitId, - Updated: now, + Updated: frame.Date, Value: obj, } } -- 2.54.0 From 3c46e309e0dd4e38f81ac766b8f3731fddf549ba Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Sat, 5 Aug 2023 04:36:13 +0300 Subject: [PATCH 10/15] New GUI framework --- go.mod | 14 ++- go.sum | 52 +++++++++-- ui/connectors.go | 140 ++++++++++++++++++++++++++++ ui/ui.go | 153 +++++++++++++----------------- ui/view.go | 235 ----------------------------------------------- 5 files changed, 256 insertions(+), 338 deletions(-) create mode 100644 ui/connectors.go delete mode 100644 ui/view.go diff --git a/go.mod b/go.mod index 5950aad..1a86a66 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,16 @@ module cli-mon go 1.19 require ( - github.com/gizak/termui/v3 v3.1.0 - golang.org/x/sys v0.3.0 + github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf + golang.org/x/sys v0.5.0 ) require ( - github.com/mattn/go-runewidth v0.0.2 // indirect - github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect - github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d // indirect + github.com/gdamore/encoding v1.0.0 // indirect + github.com/gdamore/tcell/v2 v2.6.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/rivo/uniseg v0.4.3 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect ) diff --git a/go.sum b/go.sum index 155a7a8..949c504 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,42 @@ -github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= -github.com/gizak/termui/v3 v3.1.0/go.mod h1:bXQEBkJpzxUAKf0+xq9MSWAvWZlE7c+aidmyFlkYTrY= -github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d h1:x3S6kxmy49zXVVyhcnrFqxvNVCBPb2KZ9hV2RBdS840= -github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= +github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf h1:IchpMMtnfvzg7T3je672bP1nKWz1M4tW3kMZT6CbgoM= +github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/ui/connectors.go b/ui/connectors.go new file mode 100644 index 0000000..53460d1 --- /dev/null +++ b/ui/connectors.go @@ -0,0 +1,140 @@ +package ui + +import ( + "cli-mon/yabl" + "fmt" + "github.com/gdamore/tcell/v2" + "github.com/rivo/tview" +) + +const connectorCount = 6 + +type cTable struct { + tview.Table + voltageBefore [connectorCount + 1]*tview.TableCell + voltageAfter [connectorCount + 1]*tview.TableCell + presentCurrent [connectorCount + 1]*tview.TableCell + connectorInsert [connectorCount + 1]*tview.TableCell + contactorClosed [connectorCount + 1]*tview.TableCell + connectorLocked [connectorCount + 1]*tview.TableCell + cpLevel [connectorCount + 1]*tview.TableCell + isolationState [connectorCount + 1]*tview.TableCell + chargingAllowed [connectorCount + 1]*tview.TableCell + pwmEnabled [connectorCount + 1]*tview.TableCell + cpAccurate [connectorCount + 1]*tview.TableCell + debugModeOn [connectorCount + 1]*tview.TableCell + debugContactorOutOn [connectorCount + 1]*tview.TableCell + boardReady [connectorCount + 1]*tview.TableCell +} + +func (t *cTable) updatePU(id uint, field yabl.FName, value any) { + var view *tview.TableCell + + switch field { + case yabl.FVoltageBefore: + view = t.voltageBefore[id] + case yabl.FVoltageAfter: + view = t.voltageAfter[id] + case yabl.FPresentCurrent: + view = t.presentCurrent[id] + case yabl.FConnectorInsert: + view = t.connectorInsert[id] + case yabl.FContactorOn: + view = t.contactorClosed[id] + case yabl.FConnectorLocked: + view = t.connectorLocked[id] + case yabl.FCpLineLevel: + view = t.cpLevel[id] + case yabl.FIsolationState: + view = t.isolationState[id] + case yabl.FChargingAllowed: + view = t.chargingAllowed[id] + case yabl.FPwmEnabled: + view = t.pwmEnabled[id] + case yabl.FCpLineVoltage: + view = t.cpAccurate[id] + case yabl.FDebugModeOn: + view = t.debugModeOn[id] + case yabl.FDebugContactorOutputOn: + view = t.debugContactorOutOn[id] + } + + if view != nil { + view.SetText(fmt.Sprintf("%v", value)) + } +} + +func (t *cTable) updatePuErrors(obj *yabl.PuErrors) { + id := obj.GetUnitId() + ready := t.boardReady[id] + ready.SetText(fmt.Sprintf("%v", obj.BoardReady)) + + if *obj.BoardReady != yabl.BOARD_READY_OK { + ready.SetBackgroundColor(tcell.ColorDarkRed) + } else { + ready.SetBackgroundColor(tcell.ColorDefault) + } +} + +func newConnectorsGrid() *cTable { + t := &cTable{} + t.Box = tview.NewBox() + t.SetBorderColor(tview.Styles.GraphicsColor) + t.SetSeparator(' ') + t.SetContent(nil) + t.SetTitle("Connectors") + t.SetBorders(true) + t.SetBorder(true) + + t.SetCell(1, 0, tview.NewTableCell("voltageBefore")) + t.SetCell(2, 0, tview.NewTableCell("voltageAfter")) + t.SetCell(3, 0, tview.NewTableCell("presentCurrent")) + t.SetCell(4, 0, tview.NewTableCell("connectorInsert")) + t.SetCell(5, 0, tview.NewTableCell("contactorClosed")) + t.SetCell(6, 0, tview.NewTableCell("connectorLocked")) + t.SetCell(7, 0, tview.NewTableCell("cpLevel")) + t.SetCell(8, 0, tview.NewTableCell("isolationState")) + t.SetCell(9, 0, tview.NewTableCell("chargingAllowed")) + t.SetCell(10, 0, tview.NewTableCell("pwmEnabled")) + t.SetCell(11, 0, tview.NewTableCell("cpAccurate")) + t.SetCell(12, 0, tview.NewTableCell("debugModeOn")) + t.SetCell(13, 0, tview.NewTableCell("debugContactorOutOn")) + t.SetCell(14, 0, tview.NewTableCell("boardReady")) + + for i := 1; i <= 6; i++ { + t.SetCell(0, i, tview.NewTableCell(fmt.Sprintf("Connector %d", i)).SetExpansion(2)) + + t.voltageBefore[i] = tview.NewTableCell("") + t.voltageAfter[i] = tview.NewTableCell("") + t.presentCurrent[i] = tview.NewTableCell("") + t.connectorInsert[i] = tview.NewTableCell("") + t.contactorClosed[i] = tview.NewTableCell("") + t.connectorLocked[i] = tview.NewTableCell("") + t.cpLevel[i] = tview.NewTableCell("") + t.isolationState[i] = tview.NewTableCell("") + t.chargingAllowed[i] = tview.NewTableCell("") + t.pwmEnabled[i] = tview.NewTableCell("") + t.cpAccurate[i] = tview.NewTableCell("") + t.debugModeOn[i] = tview.NewTableCell("") + t.debugContactorOutOn[i] = tview.NewTableCell("") + t.boardReady[i] = tview.NewTableCell("") + + t.SetCell(1, i, t.voltageBefore[i]) + t.SetCell(2, i, t.voltageAfter[i]) + t.SetCell(3, i, t.presentCurrent[i]) + t.SetCell(4, i, t.connectorInsert[i]) + t.SetCell(5, i, t.contactorClosed[i]) + t.SetCell(6, i, t.connectorLocked[i]) + t.SetCell(7, i, t.cpLevel[i]) + t.SetCell(8, i, t.isolationState[i]) + t.SetCell(9, i, t.chargingAllowed[i]) + t.SetCell(10, i, t.pwmEnabled[i]) + t.SetCell(11, i, t.cpAccurate[i]) + t.SetCell(12, i, t.debugModeOn[i]) + t.SetCell(13, i, t.debugContactorOutOn[i]) + t.SetCell(14, i, t.boardReady[i]) + + } + + return t +} diff --git a/ui/ui.go b/ui/ui.go index 4cf7f1e..95968b8 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -2,108 +2,85 @@ package ui import ( "cli-mon/yabl" - ui "github.com/gizak/termui/v3" - "github.com/gizak/termui/v3/widgets" - "log" - "time" + "github.com/gdamore/tcell/v2" + "github.com/rivo/tview" + "os" ) -const headerHeight int = 4 -const contactorsCount = 18 -const connectorsCount = 6 +const ( + connectors_page = "Connectors" +) -var connUI [connectorsCount + 1]*widgets.Paragraph -var contUI [contactorsCount + 1]*widgets.Paragraph -var contactorsErr *widgets.Paragraph +type page struct { + left string + right string + primitive tview.Primitive +} func InitCliApp(events <-chan *yabl.Event) { - if err := ui.Init(); err != nil { - log.Fatalf("failed to initialize termui: %v", err) - } - defer ui.Close() + var app = tview.NewApplication() + pages := tview.NewPages() - var connectorsTab *ui.Grid - //var contactorsErr *widgets.Paragraph - var contactorsStateTab *ui.Grid - var header *widgets.Paragraph + var active page + var layout map[string]page - tabpane := widgets.NewTabPane("Connectors", "Contactors States", "Contactors Errors") - tabpane.SetRect(0, 1, 150, 4) - tabpane.Border = true + connectors := newConnectorsGrid() + page2 := tview.NewBox().SetBorder(true).SetTitle("Bbbbbb") - header = newHeader() - connectorsTab = newConnectorsView() - contactorsStateTab = newContactorsView() - contactorsErr = newContactorsErrView() - - renderTab := func() { - switch tabpane.ActiveTabIndex { - case 0: - termWidth, termHeight := ui.TerminalDimensions() - connectorsTab.SetRect(0, headerHeight, termWidth, termHeight) - ui.Render(connectorsTab) - case 1: - termWidth, termHeight := ui.TerminalDimensions() - contactorsStateTab.SetRect(0, headerHeight, termWidth, termHeight) - ui.Render(contactorsStateTab) - case 2: - ui.Render(contactorsErr) - } + layout = map[string]page{ + connectors_page: { + left: "Page2", + right: "Page2", + primitive: connectors, + }, + "Page2": { + left: connectors_page, + right: connectors_page, + primitive: page2, + }, } - ui.Render(header, tabpane, connectorsTab) + for k, p := range layout { + pages.AddPage(k, p.primitive, true, true) + } - uiEvents := ui.PollEvents() - ticker := time.NewTicker(2 * time.Second).C - for { - select { - case e := <-uiEvents: - switch e.ID { // event string/identifier - case "q", "": // press 'q' or 'C-c' to quit - return - case "": - //payload := e.Payload.(ui.Mouse) - //x, y := payload.X, payload.Y - //p.Text = fmt.Sprintf("X = %d, Y = %d", x, y) - case "": - tabpane.FocusLeft() - ui.Clear() - ui.Render(header, tabpane) - renderTab() - case "": - tabpane.FocusRight() - ui.Clear() - ui.Render(header, tabpane) - renderTab() - } + active = layout["Page1"] + pages.SwitchToPage("Page1") - switch e.Type { - case ui.KeyboardEvent: // handle all key presses - //eventID := e.ID // keypress string - //p.Text = eventID - } - // use Go's built-in tickers for updating and drawing data - case <-ticker: - renderTab() - case message := <-events: - process(message) + app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + switch event.Key() { + case tcell.KeyRight: + pages.SwitchToPage(active.right) + active = layout[active.right] + return nil + case tcell.KeyLeft: + pages.SwitchToPage(active.left) + active = layout[active.left] + return nil + case tcell.KeyCtrlC: + app.Stop() } - } -} + return event + }) -func process(message *yabl.Event) { - if message == nil || message.Object == nil { - return - } + go func() { + if err := app.SetRoot(pages, true).EnableMouse(true).Run(); err != nil { + panic(err) + } + os.Exit(0) + }() - switch msg := message.Object.(type) { - case *yabl.ContactorInternalState: - updateContactorsView(msg) - case *yabl.PuPeriphery: - updateConnectorsView(msg) - case *yabl.PuPresentEnergy: - updateConnectorsView(msg) - case *yabl.ContactorInternalErrors: - updateContactorsStateView(msg) + for event := range events { + switch obj := event.Object.(type) { + case *yabl.PuPresentEnergy: + connectors.updatePU(event.UnitId, event.Field, event.Value) + case *yabl.PuPeriphery: + connectors.updatePU(event.UnitId, event.Field, event.Value) + case *yabl.PuDebug: + connectors.updatePU(event.UnitId, event.Field, event.Value) + case *yabl.PuErrors: + connectors.updatePuErrors(obj) + } + app.Draw() } } diff --git a/ui/view.go b/ui/view.go deleted file mode 100644 index 3606193..0000000 --- a/ui/view.go +++ /dev/null @@ -1,235 +0,0 @@ -package ui - -import ( - "cli-mon/yabl" - "fmt" - ui "github.com/gizak/termui/v3" - "github.com/gizak/termui/v3/widgets" -) - -func newHeader() *widgets.Paragraph { - widget := widgets.NewParagraph() - widget.Text = "Press q to quit, Press or to switch tabs" - widget.SetRect(0, 0, 50, 1) - widget.Border = false - widget.TextStyle.Bg = ui.ColorBlue - return widget -} - -func newConnectorsView() *ui.Grid { - grid := ui.NewGrid() - - termWidth, termHeight := ui.TerminalDimensions() - grid.SetRect(0, headerHeight, termWidth, termHeight) - - var conn [connectorsCount + 1]*widgets.Paragraph //ui.GridItem - - for i := 0; i <= connectorsCount; i++ { - p := widgets.NewParagraph() - p.Text = fmt.Sprintf("No data: #%2.d", i) - p.Title = fmt.Sprintf("Connector: #%2.d", i) - //p.SetRect(0, 0, 50, 30) - p.TextStyle.Bg = ui.ColorBlue - p.TextStyle.Fg = ui.ColorWhite - p.BorderStyle.Fg = ui.ColorYellow - p.Border = true - - connUI[i] = p - conn[i] = p //ui.NewCol(1.0/6, p) - } - - grid.Set( - ui.NewRow( - 1.0/2, - ui.NewCol(1.0/4, conn[1]), - ui.NewCol(1.0/4, conn[2]), - ui.NewCol(1.0/4, conn[3]), - ui.NewCol(1.0/4, conn[4]), - ), - ui.NewRow( - 1.0/2, - ui.NewCol(1.0/4, conn[5]), - ui.NewCol(1.0/4, conn[6]), - ui.NewCol(1.0/4, conn[0]), - ), - ) - - return grid -} - -func newContactorsView() *ui.Grid { - grid := ui.NewGrid() - - termWidth, termHeight := ui.TerminalDimensions() - grid.SetRect(0, headerHeight, termWidth, termHeight) - - var cont [contactorsCount + 1]ui.GridItem - - //var contactors = make([]ui.GridItem, contactorsCount) - for i := 1; i <= contactorsCount; i++ { - p := widgets.NewParagraph() - p.Text = fmt.Sprintf("No data: #%2.d", i) - p.Title = fmt.Sprintf("Contactor: #%2.d", i) - p.Border = false - p.TextStyle.Bg = ui.ColorBlue - p.TextStyle.Fg = ui.ColorWhite - p.BorderStyle.Fg = ui.ColorYellow - p.Border = true - - contUI[i] = p - cont[i] = ui.NewCol(1.0/6, p) - } - - grid.Set( - ui.NewRow( - 1.0/3, - cont[1], - cont[2], - cont[3], - cont[4], - cont[5], - cont[6], - ), - ui.NewRow( - 1.0/3, - cont[7], - cont[8], - cont[9], - cont[10], - cont[11], - cont[12], - ), - ui.NewRow( - 1.0/3, - cont[13], - cont[14], - cont[15], - cont[16], - cont[17], - cont[18], - )) - - //ui.NewRow(1, ui.InterfaceSlice(contactors)...) - grid.Set() - - return grid -} - -func newContactorsErrView() *widgets.Paragraph { - p := widgets.NewParagraph() - p.Text = "No data\n" - p.Title = "Contactors Errors" - p.SetRect(5, 5, 55, 15) - p.BorderStyle.Fg = ui.ColorYellow - - return p -} - -func updateContactorsView(msg *yabl.ContactorInternalState) { - - p := contUI[msg.GetUnitId()] - s := msg - - if s == nil || p == nil { - return - } - - p.Text = fmt.Sprintf( - "BoardReady: %s\nContactorOn: %s\nUnexpectedState: %s\nIsolated: %s\nDebug: %s", - s.ContactorReady, - s.ContactorOn, - s.UnexpectedState, - s.Isolated, - s.DebugEnabled) - - if s.ContactorReady != nil && *s.ContactorReady == yabl.BOARD_READY_OK { - p.TextStyle.Bg = ui.ColorClear - } else { - p.TextStyle.Bg = ui.ColorRed - } - - if s.ContactorOn != nil && *s.ContactorOn == yabl.ON { - p.TitleStyle.Bg = ui.ColorBlue - } else { - p.TitleStyle.Bg = ui.ColorClear - } -} - -var connectorsState [connectorsCount + 1]*yabl.PuPeriphery -var connectorsEnergy [connectorsCount + 1]*yabl.PuPresentEnergy - -func updateConnectorsView(action yabl.Action) { - if action == nil { - return - } - - var unitId = action.GetUnitId() - - switch msg := action.(type) { - case *yabl.PuPeriphery: - connectorsState[unitId] = msg - case *yabl.PuPresentEnergy: - connectorsEnergy[unitId] = msg - } - - p := connUI[unitId] - s := connectorsState[unitId] - e := connectorsEnergy[unitId] - - if s == nil || e == nil { - return - } - - fstring := "ConnectorInsert %s\n" + - "ContactorOn %s\n" + - "ConnectorLocked %s\n" + - "LineLevel %s\n" + - "IsolationState %s\n" + - "ChargingAllowed %s\n" + - "PwmEnabled %s\n" + - "CpLineVoltage %s\n" + - "V2GMode %s\n" + - "VoltageBefore %s\n" + - "VoltageAfter %s\n" + - "PresentCurrent %s" - - p.Text = fmt.Sprintf( - fstring, - s.ConnectorInsert, - s.ContactorOn, - s.ConnectorLocked, - s.CpLineLevel, - s.IsolationState, - s.ChargingAllowed, - s.PwmEnabled, - s.CpLineVoltage, - e.V2GMode, - e.VoltageBefore, - e.VoltageAfter, - e.PresentCurrent) -} - -func updateContactorsStateView(e *yabl.ContactorInternalErrors) { - p := contactorsErr - - if e == nil { - return - } - - p.Text = fmt.Sprintf( - "BoardReady: %s\nOtherError: %s\nGroupChanged: %s\nUnexpectedFormation: %s\nCpuNotReady: %s\nPuNotReady: %s\nDebug: %s", - e.BoardReady, - e.OtherError, - e.ContactorGroupChanged, - e.UnexpectedFormation, - e.CpuNotReady, - e.PuNotReady, - e.Debug, - ) - - if e.BoardReady != nil && *e.BoardReady == yabl.BOARD_READY_OK { - p.TextStyle.Bg = ui.ColorClear - } else { - p.TextStyle.Bg = ui.ColorRed - } -} -- 2.54.0 From f00c7431605459745542cb1aa128354fa4f4b5fd Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Sat, 5 Aug 2023 14:26:56 +0300 Subject: [PATCH 11/15] Refactoring and optimization --- cli-mon.go | 28 ++--- ui/ui.go | 113 +++++++++++++++------ yabl/init.go | 234 +++++++++++++++++++++--------------------- yabl/protocol.go | 259 ++++++++++++----------------------------------- yabl/types.go | 93 ++++++++++++----- 5 files changed, 349 insertions(+), 378 deletions(-) diff --git a/cli-mon.go b/cli-mon.go index 46a6635..dd554f2 100644 --- a/cli-mon.go +++ b/cli-mon.go @@ -3,11 +3,10 @@ package main import ( "cli-mon/can" "cli-mon/ui" - "cli-mon/yabl" + yabl "cli-mon/yabl" "flag" "fmt" "os" - "reflect" ) func main() { @@ -40,20 +39,25 @@ func main() { os.Exit(0) } - var messages = yabl.StartProtocolParsing(frames) + converter := yabl.NewProtocolConverter() + + var display ui.UI if *gui { - ui.InitCliApp(messages) + display = ui.NewUI() } else { - for msg := range messages { - // val := getField(msg.Object, msg.Field) - fmt.Printf("%v %v.%v [%d] %v\n", msg.Updated.Format("Jan _2 15:04:05.000"), msg.ActionName, msg.Field, msg.UnitId, msg.Value) + display = ui.NewLog() + } + + display.Start() + + for frame := range frames { + if events, ok := converter.EventsFromFrame(frame); ok { + for _, event := range events { + display.Consume(event) + } } } -} -func getField(v yabl.Action, field yabl.FName) interface{} { - r := reflect.ValueOf(v) - f := reflect.Indirect(r).FieldByName(string(field)) - return f.Interface() + display.Stop() } diff --git a/ui/ui.go b/ui/ui.go index 95968b8..36b714e 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -2,9 +2,10 @@ package ui import ( "cli-mon/yabl" + "fmt" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" - "os" + "reflect" ) const ( @@ -17,70 +18,122 @@ type page struct { primitive tview.Primitive } -func InitCliApp(events <-chan *yabl.Event) { - var app = tview.NewApplication() - pages := tview.NewPages() +type UI interface { + Consume(event *yabl.Event) + Start() + Stop() +} + +type gui struct { + app *tview.Application + pages *tview.Pages + connPage *cTable + page2 tview.Primitive +} + +type log struct { +} + +func (g *gui) Consume(event *yabl.Event) { + switch obj := event.Object.(type) { + case *yabl.PuPresentEnergy: + g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value) + case *yabl.PuPeriphery: + g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value) + case *yabl.PuDebug: + g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value) + case *yabl.PuErrors: + g.connPage.updatePuErrors(obj) + } + g.app.Draw() +} + +func NewUI() UI { + g := &gui{} + + g.app = tview.NewApplication() + g.pages = tview.NewPages() var active page var layout map[string]page - connectors := newConnectorsGrid() - page2 := tview.NewBox().SetBorder(true).SetTitle("Bbbbbb") + g.connPage = newConnectorsGrid() + g.page2 = tview.NewBox().SetBorder(true).SetTitle("Bbbbbb") layout = map[string]page{ connectors_page: { left: "Page2", right: "Page2", - primitive: connectors, + primitive: g.connPage, }, "Page2": { left: connectors_page, right: connectors_page, - primitive: page2, + primitive: g.page2, }, } for k, p := range layout { - pages.AddPage(k, p.primitive, true, true) + g.pages.AddPage(k, p.primitive, true, true) } - active = layout["Page1"] - pages.SwitchToPage("Page1") + active = layout[connectors_page] + g.pages.SwitchToPage(connectors_page) - app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + g.app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { case tcell.KeyRight: - pages.SwitchToPage(active.right) + g.pages.SwitchToPage(active.right) active = layout[active.right] return nil case tcell.KeyLeft: - pages.SwitchToPage(active.left) + g.pages.SwitchToPage(active.left) active = layout[active.left] return nil case tcell.KeyCtrlC: - app.Stop() + g.app.Stop() } return event }) + return g +} + +func (g *gui) Start() { go func() { - if err := app.SetRoot(pages, true).EnableMouse(true).Run(); err != nil { + if err := g.app.SetRoot(g.pages, true).EnableMouse(true).Run(); err != nil { panic(err) } - os.Exit(0) }() +} - for event := range events { - switch obj := event.Object.(type) { - case *yabl.PuPresentEnergy: - connectors.updatePU(event.UnitId, event.Field, event.Value) - case *yabl.PuPeriphery: - connectors.updatePU(event.UnitId, event.Field, event.Value) - case *yabl.PuDebug: - connectors.updatePU(event.UnitId, event.Field, event.Value) - case *yabl.PuErrors: - connectors.updatePuErrors(obj) - } - app.Draw() - } +func (g *gui) Stop() { + g.app.Stop() +} + +func NewLog() UI { + return &log{} + +} + +func (l log) Consume(event *yabl.Event) { + fmt.Printf( + "%v %v.%v [%d] %v\n", + event.Updated.Format("Jan _2 15:04:05.000"), + event.ActionName, + event.Field, + event.GetUnitId(), + event.Value) +} + +func (l log) Start() { +} + +func (l log) Stop() { +} + +func getField(v yabl.Action, field yabl.FName) interface{} { + r := reflect.ValueOf(v) + f := reflect.Indirect(r).FieldByName(string(field)) + return f.Interface() } diff --git a/yabl/init.go b/yabl/init.go index 2578857..d905740 100644 --- a/yabl/init.go +++ b/yabl/init.go @@ -2,36 +2,38 @@ package yabl import "cli-mon/can" -func initialize() { +func (c *converter) initialize() { + c.protocolMap = make(map[key]action) + for i := uint(1); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_011, i} - cpe := &CpuPresentEnergy{UnitId: 1} - cpuPresentEnergyArray[i] = cpe + cpe := &CpuPresentEnergy{unit: 1} + c.cpuPresentEnergyArray[i] = cpe fields := []*field{ {length: 2, setter: cpe.setPowerDirectionMode, name: FPowerDirectionMode}, {length: 10, setter: cpe.setPresentCurrent, name: FPresentCurrent}, {length: 11, setter: cpe.setPresentVoltage, name: FPresentVoltage}, } - protocolMap[key] = action{fields: fields, interval: 50, name: PCpuPresentEnergy, object: cpe} + c.protocolMap[key] = action{fields: fields, interval: 50, name: PCpuPresentEnergy, object: cpe} } - cpuPeripheryInstance = &CpuPeriphery{UnitId: 0} + c.cpuPeripheryInstance = &CpuPeriphery{unit: 0} fields := []*field{ - {length: 2, setter: cpuPeripheryInstance.setContactorInput, name: FContactorInput}, - {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerInput, name: FCircuitBreakerInput}, - {length: 2, setter: cpuPeripheryInstance.setCircuitBreakerPowerCBInput, name: FCircuitBreakerPowerCBInput}, + {length: 2, setter: c.cpuPeripheryInstance.setContactorInput, name: FContactorInput}, + {length: 2, setter: c.cpuPeripheryInstance.setCircuitBreakerInput, name: FCircuitBreakerInput}, + {length: 2, setter: c.cpuPeripheryInstance.setCircuitBreakerPowerCBInput, name: FCircuitBreakerPowerCBInput}, } - protocolMap[key{can.CAN_ID_014, 0}] = action{ + c.protocolMap[key{can.CAN_ID_014, 0}] = action{ fields: fields, interval: 1000, name: PCpuPeriphery, - object: cpuPeripheryInstance, + object: c.cpuPeripheryInstance, } for i := uint(0); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_015, i} - ces := &CpuEnergySettings{UnitId: i} - cpuEnergySettingsArray[i] = ces + ces := &CpuEnergySettings{unit: unit(i)} + c.cpuEnergySettingsArray[i] = ces fields := []*field{ {length: 10, setter: ces.setCurrentMax, name: FCurrentMax}, {length: 11, setter: ces.setVoltageMax, name: FVoltageMax}, @@ -39,68 +41,68 @@ func initialize() { {length: 11, setter: ces.setTargetBatteryVoltage, name: FTargetBatteryVoltage}, {length: 11, setter: ces.setTargetGoalVoltage, name: FTargetGoalVoltage}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PCpuEnergySettings, object: ces} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PCpuEnergySettings, object: ces} } - cpuErrorsInstance = &CpuErrors{UnitId: 0} + c.cpuErrorsInstance = &CpuErrors{unit: 0} fields = []*field{ - {length: 3, setter: cpuErrorsInstance.setBoardReady, name: FBoardReady}, - {length: 4, setter: cpuErrorsInstance.setOtherError, name: FOtherError}, - {length: 2, setter: cpuErrorsInstance.setRedButtonHard, name: FRedButtonHard}, - {length: 2, setter: cpuErrorsInstance.setRedButtonSoft, name: FRedButtonSoft}, - {length: 2, setter: cpuErrorsInstance.setModulesGone, name: FModulesGone}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageHighErr, name: FGridVoltageHighErr}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageHighWarn, name: FGridVoltageHighWarn}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageLowWarn, name: FGridVoltageLowWarn}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageLowErr, name: FGridVoltageLowErr}, - {length: 11, setter: cpuErrorsInstance.setGridVoltageLow, name: FGridVoltageLow}, - {length: 11, setter: cpuErrorsInstance.setGridVoltageHigh, name: FGridVoltageHigh}, - {length: 2, setter: cpuErrorsInstance.setGridVoltageEmpty, name: FGridVoltageEmpty}, - {length: 2, setter: cpuErrorsInstance.setNotReadySecc, name: FNotReadySecc}, - {length: 2, setter: cpuErrorsInstance.setNotReadyPu, name: FNotReadyPu}, - {length: 2, setter: cpuErrorsInstance.setNotReadyContactors, name: FNotReadyContactors}, - {length: 2, setter: cpuErrorsInstance.setDebugConvertersEnabled, name: FDebugConvertersEnabled}, - {length: 2, setter: cpuErrorsInstance.setContactorInputError, name: FContactorInputError}, - {length: 2, setter: cpuErrorsInstance.setNotReadyPeriphery, name: FNotReadyPeriphery}, + {length: 3, setter: c.cpuErrorsInstance.setBoardReady, name: FBoardReady}, + {length: 4, setter: c.cpuErrorsInstance.setOtherError, name: FOtherError}, + {length: 2, setter: c.cpuErrorsInstance.setRedButtonHard, name: FRedButtonHard}, + {length: 2, setter: c.cpuErrorsInstance.setRedButtonSoft, name: FRedButtonSoft}, + {length: 2, setter: c.cpuErrorsInstance.setModulesGone, name: FModulesGone}, + {length: 2, setter: c.cpuErrorsInstance.setGridVoltageHighErr, name: FGridVoltageHighErr}, + {length: 2, setter: c.cpuErrorsInstance.setGridVoltageHighWarn, name: FGridVoltageHighWarn}, + {length: 2, setter: c.cpuErrorsInstance.setGridVoltageLowWarn, name: FGridVoltageLowWarn}, + {length: 2, setter: c.cpuErrorsInstance.setGridVoltageLowErr, name: FGridVoltageLowErr}, + {length: 11, setter: c.cpuErrorsInstance.setGridVoltageLow, name: FGridVoltageLow}, + {length: 11, setter: c.cpuErrorsInstance.setGridVoltageHigh, name: FGridVoltageHigh}, + {length: 2, setter: c.cpuErrorsInstance.setGridVoltageEmpty, name: FGridVoltageEmpty}, + {length: 2, setter: c.cpuErrorsInstance.setNotReadySecc, name: FNotReadySecc}, + {length: 2, setter: c.cpuErrorsInstance.setNotReadyPu, name: FNotReadyPu}, + {length: 2, setter: c.cpuErrorsInstance.setNotReadyContactors, name: FNotReadyContactors}, + {length: 2, setter: c.cpuErrorsInstance.setDebugConvertersEnabled, name: FDebugConvertersEnabled}, + {length: 2, setter: c.cpuErrorsInstance.setContactorInputError, name: FContactorInputError}, + {length: 2, setter: c.cpuErrorsInstance.setNotReadyPeriphery, name: FNotReadyPeriphery}, } - protocolMap[key{can.CAN_ID_016, 0}] = action{ + c.protocolMap[key{can.CAN_ID_016, 0}] = action{ fields: fields, interval: 1000, name: PCpuErrors, - object: cpuErrorsInstance, + object: c.cpuErrorsInstance, } - cpuDebugInstance = &CpuDebug{UnitId: 0} + c.cpuDebugInstance = &CpuDebug{unit: 0} fields = []*field{ - {length: 2, setter: cpuDebugInstance.setDebugModeOn, name: FDebugModeOn}, - {length: 3, setter: cpuDebugInstance.setDebugContactorInputOn, name: FDebugContactorInputOn}, - {length: 3, setter: cpuDebugInstance.setDebugCircuitBreakerOn, name: FDebugCircuitBreakerOn}, - {length: 3, setter: cpuDebugInstance.setDebugRedButtonSoftware, name: FDebugRedButtonSoftware}, + {length: 2, setter: c.cpuDebugInstance.setDebugModeOn, name: FDebugModeOn}, + {length: 3, setter: c.cpuDebugInstance.setDebugContactorInputOn, name: FDebugContactorInputOn}, + {length: 3, setter: c.cpuDebugInstance.setDebugCircuitBreakerOn, name: FDebugCircuitBreakerOn}, + {length: 3, setter: c.cpuDebugInstance.setDebugRedButtonSoftware, name: FDebugRedButtonSoftware}, } - protocolMap[key{can.CAN_ID_01A, 0}] = action{ + c.protocolMap[key{can.CAN_ID_01A, 0}] = action{ fields: fields, interval: 1000, name: PCpuDebug, - object: cpuDebugInstance, + object: c.cpuDebugInstance, } for i := uint(1); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_021, i} - ppe := &PuPresentEnergy{UnitId: i} - puPresentEnergyArray[i] = ppe + ppe := &PuPresentEnergy{unit: unit(i)} + c.puPresentEnergyArray[i] = ppe fields := []*field{ {length: 2, setter: ppe.setV2GMode, name: FV2GMode}, {length: 11, setter: ppe.setVoltageBefore, name: FVoltageBefore}, {length: 11, setter: ppe.setVoltageAfter, name: FVoltageAfter}, {length: 10, setter: ppe.setPresentCurrent, name: FPresentCurrent}, } - protocolMap[key] = action{fields: fields, interval: 50, name: PPuPresentEnergy, object: ppe} + c.protocolMap[key] = action{fields: fields, interval: 50, name: PPuPresentEnergy, object: ppe} } for i := uint(1); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_022, i} - pp := &PuPeriphery{UnitId: i} - puPeripheryArray[i] = pp + pp := &PuPeriphery{unit: unit(i)} + c.puPeripheryArray[i] = pp fields := []*field{ {length: 2, setter: pp.setConnectorInsert, name: FConnectorInsert}, {length: 2, setter: pp.setContactorOn, name: FContactorOn}, @@ -111,13 +113,13 @@ func initialize() { {length: 2, setter: pp.setPwmEnabled, name: FPwmEnabled}, {length: 9, setter: pp.setCpLineVoltage, name: FCpLineVoltage}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PPuPeriphery, object: pp} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PPuPeriphery, object: pp} } for i := uint(1); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_023, i} - pe := &PuErrors{UnitId: 1} - puErrorsArray[i] = pe + pe := &PuErrors{unit: 1} + c.puErrorsArray[i] = pe fields := []*field{ {length: 3, setter: pe.setBoardReady, name: FBoardReady}, {length: 4, setter: pe.setOtherError, name: FOtherError}, @@ -136,96 +138,96 @@ func initialize() { {length: 2, setter: pe.setOutputCircuitBreakerEnabled, name: FOutputCircuitBreakerEnabled}, {length: 12, setter: pe.setOutputCircuitBreakerEnabledValue, name: FOutputCircuitBreakerEnabledValue}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PPuErrors, object: pe} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PPuErrors, object: pe} } for i := uint(0); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_02A, i} - pd := &PuDebug{UnitId: i} - puDebugArray[i] = pd + pd := &PuDebug{unit: unit(i)} + c.puDebugArray[i] = pd fields = []*field{ {length: 2, setter: pd.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: pd.setDebugContactorOutputOn, name: FDebugContactorOutputOn}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PPuDebug, object: pd} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PPuDebug, object: pd} } for i := uint(1); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_041, i} - ste := &SeccTargetEnergy{UnitId: i} - seccTargetEnergyArray[i] = ste + ste := &SeccTargetEnergy{unit: unit(i)} + c.seccTargetEnergyArray[i] = ste fields = []*field{ {length: 2, setter: ste.setTargetChargingAllow, name: FTargetChargingAllow}, {length: 11, setter: ste.setTargetBatteryVoltage, name: FTargetBatteryVoltage}, {length: 11, setter: ste.setTargetGoalVoltage, name: FTargetGoalVoltage}, {length: 10, setter: ste.setTargetCurrent, name: FTargetCurrent}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PSeccTargetEnergy, object: ste} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PSeccTargetEnergy, object: ste} } for i := uint(1); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_042, i} - se := &SeccErrors{UnitId: i} - seccErrorsArray[i] = se + se := &SeccErrors{unit: unit(i)} + c.seccErrorsArray[i] = se fields = []*field{ {length: 3, setter: se.setBoardReady, name: FBoardReady}, {length: 2, setter: se.setNotReadyLogic, name: FNotReadyLogic}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PSeccErrors, object: se} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PSeccErrors, object: se} } for i := uint(0); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_046, i} - la := &LogicAuth{UnitId: i} - logicAuthArray[i] = la + la := &LogicAuth{unit: unit(i)} + c.logicAuthArray[i] = la fields = []*field{ {length: 2, setter: la.setAuthMode, name: FAuthMode}, {length: 3, setter: la.setAuthState, name: FAuthState}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PLogicAuth, object: la} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PLogicAuth, object: la} } for i := uint(0); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_047, i} - lem := &LogicEnergyMode{UnitId: i} - logicEnergyMode[i] = lem + lem := &LogicEnergyMode{unit: unit(i)} + c.logicEnergyMode[i] = lem fields = []*field{ {length: 2, setter: lem.setV2gMode, name: FV2gMode}, {length: 10, setter: lem.setCurrentMax, name: FCurrentMax}, {length: 11, setter: lem.setVoltageMax, name: FVoltageMax}, {length: 14, setter: lem.setPowerMax, name: FPowerMax}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PLogicEnergyMode, object: lem} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PLogicEnergyMode, object: lem} } - logicErrorsInstance = &LogicErrors{UnitId: 0} + c.logicErrorsInstance = &LogicErrors{unit: 0} fields = []*field{ - {length: 3, setter: logicErrorsInstance.setBoardReady, name: FBoardReady}, - {length: 2, setter: logicErrorsInstance.setNotReadySettings, name: FNotReadySettings}, + {length: 3, setter: c.logicErrorsInstance.setBoardReady, name: FBoardReady}, + {length: 2, setter: c.logicErrorsInstance.setNotReadySettings, name: FNotReadySettings}, } - protocolMap[key{can.CAN_ID_048, 0}] = action{ + c.protocolMap[key{can.CAN_ID_048, 0}] = action{ fields: fields, interval: 1000, name: PLogicErrors, - object: logicErrorsInstance, + object: c.logicErrorsInstance, } - logicWorkingMode = &LogicWorkingMode{UnitId: 0} + c.logicWorkingMode = &LogicWorkingMode{unit: 0} fields = []*field{ - {length: 5, setter: logicWorkingMode.setTargetContactorMode, name: FTargetContactorMode}, - {length: 2, setter: logicWorkingMode.setAvailability, name: FAvailability}, + {length: 5, setter: c.logicWorkingMode.setTargetContactorMode, name: FTargetContactorMode}, + {length: 2, setter: c.logicWorkingMode.setAvailability, name: FAvailability}, } - protocolMap[key{can.CAN_ID_049, 0}] = action{ + c.protocolMap[key{can.CAN_ID_049, 0}] = action{ fields: fields, interval: 1000, name: PLogicWorkingMode, - object: logicWorkingMode, + object: c.logicWorkingMode, } for i := uint(0); i < CONTACTOR_MAX; i++ { key := key{can.CAN_ID_071, i} - cis := &ContactorInternalState{UnitId: i} - contactorInternalStateArray[i] = cis + cis := &ContactorInternalState{unit: unit(i)} + c.contactorInternalStateArray[i] = cis fields = []*field{ {length: 3, setter: cis.setContactorReady, name: FContactorReady}, {length: 2, setter: cis.setContactorOn, name: FContactorOn}, @@ -233,54 +235,54 @@ func initialize() { {length: 2, setter: cis.setIsolated, name: FIsolated}, {length: 2, setter: cis.setDebugEnabled, name: FDebugEnabled}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PContactorInternalState, object: cis} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PContactorInternalState, object: cis} } - contactorInternalErrorsInstance = &ContactorInternalErrors{UnitId: 0} + c.contactorInternalErrorsInstance = &ContactorInternalErrors{unit: 0} fields = []*field{ - {length: 3, setter: contactorInternalErrorsInstance.setBoardReady, name: FBoardReady}, - {length: 4, setter: contactorInternalErrorsInstance.setOtherError, name: FOtherError}, - {length: 3, setter: contactorInternalErrorsInstance.setContactorGroupChanged, name: FContactorGroupChanged}, - {length: 4, setter: contactorInternalErrorsInstance.setUnexpectedFormation, name: FUnexpectedFormation}, - {length: 2, setter: contactorInternalErrorsInstance.setCpuNotReady, name: FCpuNotReady}, - {length: 2, setter: contactorInternalErrorsInstance.setPuNotReady, name: FPuNotReady}, - {length: 2, setter: contactorInternalErrorsInstance.setDebug, name: FDebug}, - {length: 5, setter: contactorInternalErrorsInstance.setPresentContactorMode, name: FPresentContactorMode}, + {length: 3, setter: c.contactorInternalErrorsInstance.setBoardReady, name: FBoardReady}, + {length: 4, setter: c.contactorInternalErrorsInstance.setOtherError, name: FOtherError}, + {length: 3, setter: c.contactorInternalErrorsInstance.setContactorGroupChanged, name: FContactorGroupChanged}, + {length: 4, setter: c.contactorInternalErrorsInstance.setUnexpectedFormation, name: FUnexpectedFormation}, + {length: 2, setter: c.contactorInternalErrorsInstance.setCpuNotReady, name: FCpuNotReady}, + {length: 2, setter: c.contactorInternalErrorsInstance.setPuNotReady, name: FPuNotReady}, + {length: 2, setter: c.contactorInternalErrorsInstance.setDebug, name: FDebug}, + {length: 5, setter: c.contactorInternalErrorsInstance.setPresentContactorMode, name: FPresentContactorMode}, } - protocolMap[key{can.CAN_ID_073, 0}] = action{ + c.protocolMap[key{can.CAN_ID_073, 0}] = action{ fields: fields, interval: 1000, name: PContactorInternalErrors, - object: contactorInternalErrorsInstance, + object: c.contactorInternalErrorsInstance, } - contactorsInternalForce = &ContactorsInternalForce{UnitId: 0} + c.contactorsInternalForce = &ContactorsInternalForce{unit: 0} fields = []*field{ - {length: 2, setter: contactorsInternalForce.setForceModeEnabled, name: FForceModeEnabled}, - {length: 4, setter: contactorsInternalForce.setForceModeValue, name: FForceModeValue}, + {length: 2, setter: c.contactorsInternalForce.setForceModeEnabled, name: FForceModeEnabled}, + {length: 4, setter: c.contactorsInternalForce.setForceModeValue, name: FForceModeValue}, } - protocolMap[key{can.CAN_ID_074, 0}] = action{ + c.protocolMap[key{can.CAN_ID_074, 0}] = action{ fields: fields, interval: 1000, name: PContactorsInternalForce, - object: contactorsInternalForce, + object: c.contactorsInternalForce, } for i := uint(0); i < CONTACTOR_MAX; i++ { key := key{can.CAN_ID_075, i} - cid := &ContactorInternalDebug{UnitId: i} - contactorInternalDebugArray[i] = cid + cid := &ContactorInternalDebug{unit: unit(i)} + c.contactorInternalDebugArray[i] = cid fields = []*field{ {length: 2, setter: cid.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: cid.setDebugContactorOn, name: FDebugContactorOn}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PContactorInternalDebug, object: cid} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PContactorInternalDebug, object: cid} } for i := uint(0); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_067, i} - ps := &PeripheryState{UnitId: i} - peripheryStateArray[i] = ps + ps := &PeripheryState{unit: unit(i)} + c.peripheryStateArray[i] = ps fields = []*field{ {length: 3, setter: ps.setOtherErrorSeverity, name: FOtherErrorSeverity}, {length: 4, setter: ps.setOtherError, name: FOtherError}, @@ -305,13 +307,13 @@ func initialize() { {length: 2, setter: ps.setErrorContactorsInternalCircuitBreaker, name: FErrorContactorsInternalCircuitBreaker}, {length: 2, setter: ps.setErrorPlcCircuitBreaker, name: FErrorPlcCircuitBreaker}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PPeripheryState, object: ps} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PPeripheryState, object: ps} } for i := uint(0); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_068, i} - pi := &PeripheryInfo{UnitId: i} - peripheryInfoArray[i] = pi + pi := &PeripheryInfo{unit: unit(i)} + c.peripheryInfoArray[i] = pi fields = []*field{ {length: 2, setter: pi.setInfoDoorOpen, name: FInfoDoorOpen}, {length: 8, setter: pi.setTempAirIn, name: FTempAirIn}, @@ -319,39 +321,39 @@ func initialize() { {length: 2, setter: pi.setStateShsnFan, name: FStateShsnFan}, {length: 2, setter: pi.setStateShptFan, name: FStateShptFan}, } - protocolMap[key] = action{fields: fields, interval: 5000, name: PPeripheryInfo, object: pi} + c.protocolMap[key] = action{fields: fields, interval: 5000, name: PPeripheryInfo, object: pi} } for i := uint(0); i <= CONNECTOR_COUNT; i++ { key := key{can.CAN_ID_06C, i} - pd := &PeripheryDebug{UnitId: i} - peripheryDebugArray[i] = pd + pd := &PeripheryDebug{unit: unit(i)} + c.peripheryDebugArray[i] = pd fields = []*field{ {length: 2, setter: pd.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: pd.setDebugShsnFan, name: FDebugShsnFan}, {length: 3, setter: pd.setDebugShptFan, name: FDebugShptFan}, {length: 3, setter: pd.setDebugIoBoardTestLamp, name: FDebugIoBoardTestLamp}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PPeripheryDebug, object: pd} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PPeripheryDebug, object: pd} } for i := uint(1); i < CONVERTERS_MAX; i++ { key := key{can.CAN_ID_061, i} - cpe := &ConverterPresentEnergy{UnitId: i} - converterPresentEnergyArray[i] = cpe + cpe := &ConverterPresentEnergy{unit: unit(i)} + c.converterPresentEnergyArray[i] = cpe fields = []*field{ {length: 2, setter: cpe.setV2gMode, name: FV2gMode}, {length: 11, setter: cpe.setPresentVoltage, name: FPresentVoltage}, {length: 10, setter: cpe.setPresentCurrent, name: FPresentCurrent}, {length: 8, setter: cpe.setConnectedOut, name: FConnectedOut}, } - protocolMap[key] = action{fields: fields, interval: 500, name: PConverterPresentEnergy, object: cpe} + c.protocolMap[key] = action{fields: fields, interval: 500, name: PConverterPresentEnergy, object: cpe} } for i := uint(1); i < CONVERTERS_MAX; i++ { key := key{can.CAN_ID_062, i} - ce := &ConverterErrors{UnitId: i} - converterErrorsArray[i] = ce + ce := &ConverterErrors{unit: unit(i)} + c.converterErrorsArray[i] = ce fields = []*field{ {length: 3, setter: ce.setBoardReady, name: FBoardReady}, {length: 4, setter: ce.setOtherError, name: FOtherError}, @@ -371,24 +373,24 @@ func initialize() { {length: 2, setter: ce.setDebugConvEnabled, name: FDebugConvEnabled}, {length: 2, setter: ce.setDebugConvDisabled, name: FDebugConvDisabled}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterErrors, object: ce} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterErrors, object: ce} } for i := uint(0); i < CONVERTERS_MAX; i++ { key := key{can.CAN_ID_065, i} - cd := &ConverterDebug{UnitId: i} - converterDebugArray[i] = cd + cd := &ConverterDebug{unit: unit(i)} + c.converterDebugArray[i] = cd fields = []*field{ {length: 2, setter: cd.setDebugModeOn, name: FDebugModeOn}, {length: 3, setter: cd.setDebugEnergyOn, name: FDebugEnergyOn}, {length: 11, setter: cd.setDebugTargetVoltage, name: FDebugTargetVoltage}, {length: 10, setter: cd.setDebugTargetCurrent, name: FDebugTargetCurrent}, } - protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterDebug, object: cd} + c.protocolMap[key] = action{fields: fields, interval: 1000, name: PConverterDebug, object: cd} } // set "null" values - for _, element := range protocolMap { + for _, element := range c.protocolMap { var from uint8 = 0 for _, f := range element.fields { var mask uint64 = ^(ALL_BITS << f.length) diff --git a/yabl/protocol.go b/yabl/protocol.go index 310e4b2..428c719 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -6,44 +6,6 @@ import ( time "time" ) -type Action interface { - GetUnitId() uint -} - -type SignedAirTemp8BitType int -type ConnectedOut8bitType uint -type ForceModeType uint -type SignedVoltage12bitType int -type DebugSwitchModeType uint -type OtherError4BitType uint -type ContactorModeType uint -type Power14BitType uint -type AuthStateType uint -type AuthModeType uint -type BoardReadyType uint -type BooleanType uint -type ErrorType uint -type ContactorInternalOtherErrorType uint -type ContactorGroupChangedType uint -type V2GModeType uint -type Voltage11BitType uint -type Current10BitType uint -type CpLineLevelType uint -type IsolationStateType uint -type Voltage9BitType float32 - -type AName string -type FName string - -type Event struct { - UnitId uint - ActionName AName - Field FName - Object Action - Updated *time.Time - Value any -} - type action struct { object Action fields []*field @@ -64,75 +26,78 @@ type key struct { unitId uint } -var protocolMap map[key]action = make(map[key]action) -var cpuPresentEnergyArray [CONNECTOR_MAX]*CpuPresentEnergy -var cpuPeripheryInstance *CpuPeriphery -var cpuEnergySettingsArray [CONNECTOR_MAX]*CpuEnergySettings -var cpuErrorsInstance *CpuErrors -var cpuDebugInstance *CpuDebug -var puPresentEnergyArray [CONNECTOR_MAX]*PuPresentEnergy -var puPeripheryArray [CONNECTOR_MAX]*PuPeriphery -var puErrorsArray [CONNECTOR_MAX]*PuErrors -var puDebugArray [CONNECTOR_MAX]*PuDebug -var seccTargetEnergyArray [CONNECTOR_MAX]*SeccTargetEnergy -var seccErrorsArray [CONNECTOR_MAX]*SeccErrors -var logicAuthArray [CONNECTOR_MAX]*LogicAuth -var logicEnergyMode [CONNECTOR_MAX]*LogicEnergyMode -var logicErrorsInstance *LogicErrors -var logicWorkingMode *LogicWorkingMode -var contactorInternalStateArray [CONTACTOR_MAX]*ContactorInternalState -var contactorInternalErrorsInstance *ContactorInternalErrors -var contactorsInternalForce *ContactorsInternalForce -var contactorInternalDebugArray [CONTACTOR_MAX]*ContactorInternalDebug -var peripheryStateArray [CONNECTOR_MAX]*PeripheryState -var peripheryInfoArray [CONNECTOR_MAX]*PeripheryInfo -var peripheryDebugArray [CONNECTOR_MAX]*PeripheryDebug -var converterPresentEnergyArray [CONVERTERS_MAX]*ConverterPresentEnergy -var converterErrorsArray [CONVERTERS_MAX]*ConverterErrors -var converterDebugArray [CONVERTERS_MAX]*ConverterDebug +type converter struct { + protocolMap map[key]action + cpuPresentEnergyArray [CONNECTOR_MAX]*CpuPresentEnergy + cpuPeripheryInstance *CpuPeriphery + cpuEnergySettingsArray [CONNECTOR_MAX]*CpuEnergySettings + cpuErrorsInstance *CpuErrors + cpuDebugInstance *CpuDebug + puPresentEnergyArray [CONNECTOR_MAX]*PuPresentEnergy + puPeripheryArray [CONNECTOR_MAX]*PuPeriphery + puErrorsArray [CONNECTOR_MAX]*PuErrors + puDebugArray [CONNECTOR_MAX]*PuDebug + seccTargetEnergyArray [CONNECTOR_MAX]*SeccTargetEnergy + seccErrorsArray [CONNECTOR_MAX]*SeccErrors + logicAuthArray [CONNECTOR_MAX]*LogicAuth + logicEnergyMode [CONNECTOR_MAX]*LogicEnergyMode + logicErrorsInstance *LogicErrors + logicWorkingMode *LogicWorkingMode + contactorInternalStateArray [CONTACTOR_MAX]*ContactorInternalState + contactorInternalErrorsInstance *ContactorInternalErrors + contactorsInternalForce *ContactorsInternalForce + contactorInternalDebugArray [CONTACTOR_MAX]*ContactorInternalDebug + peripheryStateArray [CONNECTOR_MAX]*PeripheryState + peripheryInfoArray [CONNECTOR_MAX]*PeripheryInfo + peripheryDebugArray [CONNECTOR_MAX]*PeripheryDebug + converterPresentEnergyArray [CONVERTERS_MAX]*ConverterPresentEnergy + converterErrorsArray [CONVERTERS_MAX]*ConverterErrors + converterDebugArray [CONVERTERS_MAX]*ConverterDebug +} -func StartProtocolParsing(frames <-chan *can.CanFrame) <-chan *Event { - result := make(chan *Event) - initialize() +type Converter interface { + EventsFromFrame(*can.CanFrame) ([]*Event, bool) +} - go func() { - defer close(result) +func NewProtocolConverter() Converter { + c := &converter{} + c.initialize() + return c +} - for frame := range frames { - if frames == nil { - continue - } +func (c *converter) EventsFromFrame(frame *can.CanFrame) ([]*Event, bool) { + var unitId = uint((frame.CanId & UNIT_ID_MASK) >> UNIT_ID_OFFSET) + var canId = frame.CanId & ACTION_ID_MASK + var k = key{canId: canId, unitId: unitId} - var unitId = uint((frame.CanId & UNIT_ID_MASK) >> UNIT_ID_OFFSET) - var canId = frame.CanId & ACTION_ID_MASK - var k = key{canId: canId, unitId: unitId} + if param, ok := c.protocolMap[k]; ok { + result := make([]*Event, 0, len(param.fields)) - param := protocolMap[k] + var start uint8 = 0 + for _, f := range param.fields { + if val, found := get(start, f.length, frame.Payload); found { + f.last = frame.Date + if f.value != val { // value changed + f.value = val + obj := f.setter(val) - var start uint8 = 0 - for _, f := range param.fields { - if val, found := get(start, f.length, frame.Payload); found { - f.last = frame.Date - if f.value != val { - f.value = val - obj := f.setter(val) - result <- &Event{ - Field: f.name, - ActionName: param.name, - Object: param.object, - UnitId: unitId, - Updated: frame.Date, - Value: obj, - } + event := &Event{ + Field: f.name, + ActionName: param.name, + Object: param.object, + unit: unit(unitId), + Updated: frame.Date, + Value: obj, } + + result = append(result, event) } - start += f.length } - + start += f.length // next field } - }() - - return result + return result, len(result) > 0 + } + return nil, false } func get(from uint8, size uint8, buffer []byte) (uint64, bool) { @@ -149,102 +114,6 @@ func get(from uint8, size uint8, buffer []byte) (uint64, bool) { } } -func (t *ContactorInternalState) GetUnitId() uint { - return t.UnitId -} - -func (t *ContactorInternalErrors) GetUnitId() uint { - return t.UnitId -} - -func (t *PuPresentEnergy) GetUnitId() uint { - return t.UnitId -} - -func (t *PuPeriphery) GetUnitId() uint { - return t.UnitId -} - -func (a *LogicAuth) GetUnitId() uint { - return a.UnitId -} - -func (l *LogicEnergyMode) GetUnitId() uint { - return l.UnitId -} - -func (l *LogicErrors) GetUnitId() uint { - return l.UnitId -} - -func (l *LogicWorkingMode) GetUnitId() uint { - return l.UnitId -} - -func (c *CpuPresentEnergy) GetUnitId() uint { - return c.UnitId -} - -func (c *CpuPeriphery) GetUnitId() uint { - return c.UnitId -} - -func (c *CpuEnergySettings) GetUnitId() uint { - return c.UnitId -} - -func (c *CpuErrors) GetUnitId() uint { - return c.UnitId -} - -func (d *CpuDebug) GetUnitId() uint { - return d.UnitId -} - -func (p *PuErrors) GetUnitId() uint { - return p.UnitId -} - -func (d *PuDebug) GetUnitId() uint { - return d.UnitId -} - -func (s *SeccTargetEnergy) GetUnitId() uint { - return s.UnitId -} - -func (e *SeccErrors) GetUnitId() uint { - return e.UnitId -} - -func (c *ContactorsInternalForce) GetUnitId() uint { - return c.UnitId -} - -func (c *ContactorInternalDebug) GetUnitId() uint { - return c.UnitId -} - -func (p *PeripheryState) GetUnitId() uint { - return p.UnitId -} - -func (p *PeripheryInfo) GetUnitId() uint { - return p.UnitId -} - -func (p *PeripheryDebug) GetUnitId() uint { - return p.UnitId -} - -func (c *ConverterPresentEnergy) GetUnitId() uint { - return c.UnitId -} - -func (c *ConverterErrors) GetUnitId() uint { - return c.UnitId -} - -func (c *ConverterDebug) GetUnitId() uint { - return c.UnitId +func (u unit) GetUnitId() uint { + return uint(u) } diff --git a/yabl/types.go b/yabl/types.go index 9e7e07f..a193625 100644 --- a/yabl/types.go +++ b/yabl/types.go @@ -1,7 +1,50 @@ package yabl +import "time" + +type AName string +type FName string + +type unit uint + +type Action interface { + GetUnitId() uint +} + +type Event struct { + unit + ActionName AName + Field FName + Object Action + Updated *time.Time + Value any +} + +type SignedAirTemp8BitType int +type ConnectedOut8bitType uint +type ForceModeType uint +type SignedVoltage12bitType int +type DebugSwitchModeType uint +type OtherError4BitType uint +type ContactorModeType uint +type Power14BitType uint +type AuthStateType uint +type AuthModeType uint +type BoardReadyType uint +type BooleanType uint +type ErrorType uint +type ContactorInternalOtherErrorType uint +type ContactorGroupChangedType uint +type V2GModeType uint +type Voltage11BitType uint +type Current10BitType uint +type CpLineLevelType uint +type IsolationStateType uint +type Voltage9BitType float32 + type ContactorInternalState struct { - UnitId uint + unit + //UnitId uint ContactorReady *BoardReadyType ContactorOn *BooleanType UnexpectedState *ErrorType @@ -10,7 +53,7 @@ type ContactorInternalState struct { } type ContactorInternalErrors struct { - UnitId uint + unit BoardReady *BoardReadyType OtherError *ContactorInternalOtherErrorType ContactorGroupChanged *ContactorGroupChangedType @@ -22,19 +65,19 @@ type ContactorInternalErrors struct { } type ContactorsInternalForce struct { - UnitId uint + unit ForceModeEnabled *BooleanType ForceModeValue *ForceModeType } type ContactorInternalDebug struct { - UnitId uint + unit DebugModeOn *BooleanType DebugContactorOn *DebugSwitchModeType } type PuPresentEnergy struct { - UnitId uint + unit V2GMode *V2GModeType VoltageBefore *Voltage11BitType VoltageAfter *Voltage11BitType @@ -42,7 +85,7 @@ type PuPresentEnergy struct { } type PuPeriphery struct { - UnitId uint + unit ConnectorInsert *BooleanType ContactorOn *BooleanType ConnectorLocked *BooleanType @@ -54,13 +97,13 @@ type PuPeriphery struct { } type LogicAuth struct { - UnitId uint + unit AuthMode *AuthModeType AuthState *AuthStateType } type LogicEnergyMode struct { - UnitId uint + unit V2gMode *V2GModeType CurrentMax *Current10BitType VoltageMax *Voltage11BitType @@ -68,33 +111,33 @@ type LogicEnergyMode struct { } type LogicErrors struct { - UnitId uint + unit BoardReady *BoardReadyType NotReadySettings *ErrorType } type LogicWorkingMode struct { - UnitId uint + unit TargetContactorMode *ContactorModeType Availability *BooleanType } type CpuPresentEnergy struct { - UnitId uint + unit PowerDirectionMode *V2GModeType PresentCurrent *Current10BitType PresentVoltage *Voltage11BitType } type CpuPeriphery struct { - UnitId uint + unit ContactorInput *BooleanType CircuitBreakerInput *BooleanType CircuitBreakerPowerCBInput *BooleanType } type CpuEnergySettings struct { - UnitId uint + unit CurrentMax *Current10BitType VoltageMax *Voltage11BitType PowerMax *Power14BitType @@ -103,7 +146,7 @@ type CpuEnergySettings struct { } type CpuErrors struct { - UnitId uint + unit BoardReady *BoardReadyType OtherError *OtherError4BitType RedButtonHard *ErrorType @@ -125,7 +168,7 @@ type CpuErrors struct { } type CpuDebug struct { - UnitId uint + unit DebugModeOn *BooleanType DebugContactorInputOn *DebugSwitchModeType DebugCircuitBreakerOn *DebugSwitchModeType @@ -133,7 +176,7 @@ type CpuDebug struct { } type PuErrors struct { - UnitId uint + unit BoardReady *BoardReadyType OtherError *OtherError4BitType IncorrectVoltage *ErrorType @@ -153,13 +196,13 @@ type PuErrors struct { } type PuDebug struct { - UnitId uint + unit DebugModeOn *BooleanType DebugContactorOutputOn *DebugSwitchModeType } type SeccTargetEnergy struct { - UnitId uint + unit TargetChargingAllow *BooleanType TargetBatteryVoltage *Voltage11BitType TargetGoalVoltage *Voltage11BitType @@ -167,13 +210,13 @@ type SeccTargetEnergy struct { } type SeccErrors struct { - UnitId uint + unit BoardReady *BoardReadyType NotReadyLogic *ErrorType } type PeripheryState struct { - UnitId uint + unit OtherErrorSeverity *BoardReadyType OtherError *OtherError4BitType ErrorShakeSensor *ErrorType @@ -199,7 +242,7 @@ type PeripheryState struct { } type PeripheryInfo struct { - UnitId uint + unit InfoDoorOpen *BooleanType TempAirIn *SignedAirTemp8BitType TempAirOut *SignedAirTemp8BitType @@ -208,7 +251,7 @@ type PeripheryInfo struct { } type PeripheryDebug struct { - UnitId uint + unit DebugModeOn *BooleanType DebugShsnFan *DebugSwitchModeType DebugShptFan *DebugSwitchModeType @@ -216,7 +259,7 @@ type PeripheryDebug struct { } type ConverterPresentEnergy struct { - UnitId uint + unit V2gMode *V2GModeType PresentVoltage *Voltage11BitType PresentCurrent *Current10BitType @@ -224,7 +267,7 @@ type ConverterPresentEnergy struct { } type ConverterErrors struct { - UnitId uint + unit BoardReady *BoardReadyType OtherError *OtherError4BitType NotConnectedOut *ErrorType @@ -245,7 +288,7 @@ type ConverterErrors struct { } type ConverterDebug struct { - UnitId uint + unit DebugModeOn *BooleanType DebugEnergyOn *DebugSwitchModeType DebugTargetVoltage *Voltage11BitType -- 2.54.0 From 6f83643247a59ff806b984eb83c0da51e2cca21e Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Sun, 6 Aug 2023 07:43:21 +0300 Subject: [PATCH 12/15] New release --- cli-mon.go | 30 ++++++-- ui/connectors.go | 140 -------------------------------------- ui/parameters.go | 174 +++++++++++++++++++++++++++++++++++++++++++++++ ui/table.go | 96 ++++++++++++++++++++++++++ ui/ui.go | 142 +++++++++++++++++++++++++++++++------- yabl/protocol.go | 44 ++++++++++++ yabl/types.go | 1 - 7 files changed, 457 insertions(+), 170 deletions(-) delete mode 100644 ui/connectors.go create mode 100644 ui/parameters.go create mode 100644 ui/table.go diff --git a/cli-mon.go b/cli-mon.go index dd554f2..26f433e 100644 --- a/cli-mon.go +++ b/cli-mon.go @@ -3,10 +3,11 @@ package main import ( "cli-mon/can" "cli-mon/ui" - yabl "cli-mon/yabl" + "cli-mon/yabl" "flag" "fmt" "os" + "time" ) func main() { @@ -51,12 +52,33 @@ func main() { display.Start() - for frame := range frames { - if events, ok := converter.EventsFromFrame(frame); ok { + updates := make(chan *yabl.Event) + + var f func() + f = func() { + if events, ok := converter.CheckTimeouts(); ok { for _, event := range events { - display.Consume(event) + updates <- event } } + time.AfterFunc(50*time.Millisecond, f) + } + + time.AfterFunc(5*time.Second, f) + + go func() { + for frame := range frames { + if events, ok := converter.EventsFromFrame(frame); ok { + for _, event := range events { + updates <- event + } + } + } + close(updates) + }() + + for event := range updates { + display.Consume(event) } display.Stop() diff --git a/ui/connectors.go b/ui/connectors.go deleted file mode 100644 index 53460d1..0000000 --- a/ui/connectors.go +++ /dev/null @@ -1,140 +0,0 @@ -package ui - -import ( - "cli-mon/yabl" - "fmt" - "github.com/gdamore/tcell/v2" - "github.com/rivo/tview" -) - -const connectorCount = 6 - -type cTable struct { - tview.Table - voltageBefore [connectorCount + 1]*tview.TableCell - voltageAfter [connectorCount + 1]*tview.TableCell - presentCurrent [connectorCount + 1]*tview.TableCell - connectorInsert [connectorCount + 1]*tview.TableCell - contactorClosed [connectorCount + 1]*tview.TableCell - connectorLocked [connectorCount + 1]*tview.TableCell - cpLevel [connectorCount + 1]*tview.TableCell - isolationState [connectorCount + 1]*tview.TableCell - chargingAllowed [connectorCount + 1]*tview.TableCell - pwmEnabled [connectorCount + 1]*tview.TableCell - cpAccurate [connectorCount + 1]*tview.TableCell - debugModeOn [connectorCount + 1]*tview.TableCell - debugContactorOutOn [connectorCount + 1]*tview.TableCell - boardReady [connectorCount + 1]*tview.TableCell -} - -func (t *cTable) updatePU(id uint, field yabl.FName, value any) { - var view *tview.TableCell - - switch field { - case yabl.FVoltageBefore: - view = t.voltageBefore[id] - case yabl.FVoltageAfter: - view = t.voltageAfter[id] - case yabl.FPresentCurrent: - view = t.presentCurrent[id] - case yabl.FConnectorInsert: - view = t.connectorInsert[id] - case yabl.FContactorOn: - view = t.contactorClosed[id] - case yabl.FConnectorLocked: - view = t.connectorLocked[id] - case yabl.FCpLineLevel: - view = t.cpLevel[id] - case yabl.FIsolationState: - view = t.isolationState[id] - case yabl.FChargingAllowed: - view = t.chargingAllowed[id] - case yabl.FPwmEnabled: - view = t.pwmEnabled[id] - case yabl.FCpLineVoltage: - view = t.cpAccurate[id] - case yabl.FDebugModeOn: - view = t.debugModeOn[id] - case yabl.FDebugContactorOutputOn: - view = t.debugContactorOutOn[id] - } - - if view != nil { - view.SetText(fmt.Sprintf("%v", value)) - } -} - -func (t *cTable) updatePuErrors(obj *yabl.PuErrors) { - id := obj.GetUnitId() - ready := t.boardReady[id] - ready.SetText(fmt.Sprintf("%v", obj.BoardReady)) - - if *obj.BoardReady != yabl.BOARD_READY_OK { - ready.SetBackgroundColor(tcell.ColorDarkRed) - } else { - ready.SetBackgroundColor(tcell.ColorDefault) - } -} - -func newConnectorsGrid() *cTable { - t := &cTable{} - t.Box = tview.NewBox() - t.SetBorderColor(tview.Styles.GraphicsColor) - t.SetSeparator(' ') - t.SetContent(nil) - t.SetTitle("Connectors") - t.SetBorders(true) - t.SetBorder(true) - - t.SetCell(1, 0, tview.NewTableCell("voltageBefore")) - t.SetCell(2, 0, tview.NewTableCell("voltageAfter")) - t.SetCell(3, 0, tview.NewTableCell("presentCurrent")) - t.SetCell(4, 0, tview.NewTableCell("connectorInsert")) - t.SetCell(5, 0, tview.NewTableCell("contactorClosed")) - t.SetCell(6, 0, tview.NewTableCell("connectorLocked")) - t.SetCell(7, 0, tview.NewTableCell("cpLevel")) - t.SetCell(8, 0, tview.NewTableCell("isolationState")) - t.SetCell(9, 0, tview.NewTableCell("chargingAllowed")) - t.SetCell(10, 0, tview.NewTableCell("pwmEnabled")) - t.SetCell(11, 0, tview.NewTableCell("cpAccurate")) - t.SetCell(12, 0, tview.NewTableCell("debugModeOn")) - t.SetCell(13, 0, tview.NewTableCell("debugContactorOutOn")) - t.SetCell(14, 0, tview.NewTableCell("boardReady")) - - for i := 1; i <= 6; i++ { - t.SetCell(0, i, tview.NewTableCell(fmt.Sprintf("Connector %d", i)).SetExpansion(2)) - - t.voltageBefore[i] = tview.NewTableCell("") - t.voltageAfter[i] = tview.NewTableCell("") - t.presentCurrent[i] = tview.NewTableCell("") - t.connectorInsert[i] = tview.NewTableCell("") - t.contactorClosed[i] = tview.NewTableCell("") - t.connectorLocked[i] = tview.NewTableCell("") - t.cpLevel[i] = tview.NewTableCell("") - t.isolationState[i] = tview.NewTableCell("") - t.chargingAllowed[i] = tview.NewTableCell("") - t.pwmEnabled[i] = tview.NewTableCell("") - t.cpAccurate[i] = tview.NewTableCell("") - t.debugModeOn[i] = tview.NewTableCell("") - t.debugContactorOutOn[i] = tview.NewTableCell("") - t.boardReady[i] = tview.NewTableCell("") - - t.SetCell(1, i, t.voltageBefore[i]) - t.SetCell(2, i, t.voltageAfter[i]) - t.SetCell(3, i, t.presentCurrent[i]) - t.SetCell(4, i, t.connectorInsert[i]) - t.SetCell(5, i, t.contactorClosed[i]) - t.SetCell(6, i, t.connectorLocked[i]) - t.SetCell(7, i, t.cpLevel[i]) - t.SetCell(8, i, t.isolationState[i]) - t.SetCell(9, i, t.chargingAllowed[i]) - t.SetCell(10, i, t.pwmEnabled[i]) - t.SetCell(11, i, t.cpAccurate[i]) - t.SetCell(12, i, t.debugModeOn[i]) - t.SetCell(13, i, t.debugContactorOutOn[i]) - t.SetCell(14, i, t.boardReady[i]) - - } - - return t -} diff --git a/ui/parameters.go b/ui/parameters.go new file mode 100644 index 0000000..4bf225d --- /dev/null +++ b/ui/parameters.go @@ -0,0 +1,174 @@ +package ui + +import "cli-mon/yabl" + +var pu = []key{ + {yabl.PPuPresentEnergy, yabl.FVoltageBefore, 1}, + {yabl.PPuPresentEnergy, yabl.FVoltageAfter, 2}, + {yabl.PCpuPresentEnergy, yabl.FPresentVoltage, 3}, + {yabl.PPuPresentEnergy, yabl.FPresentCurrent, 4}, + {yabl.PCpuPresentEnergy, yabl.FPresentCurrent, 5}, + {yabl.PPuPeriphery, yabl.FConnectorInsert, 6}, + {yabl.PPuPeriphery, yabl.FDebugContactorOn, 7}, + {yabl.PPuPeriphery, yabl.FConnectorLocked, 8}, + {yabl.PPuPeriphery, yabl.FCpLineLevel, 9}, + {yabl.PPuPeriphery, yabl.FIsolationState, 10}, + {yabl.PPuPeriphery, yabl.FChargingAllowed, 11}, + {yabl.PPuPeriphery, yabl.FPwmEnabled, 12}, + {yabl.PPuPeriphery, yabl.FCpLineVoltage, 13}, + {yabl.PCpuEnergySettings, yabl.FTargetBatteryVoltage, 14}, + {yabl.PCpuEnergySettings, yabl.FTargetGoalVoltage, 15}, + {yabl.PCpuEnergySettings, yabl.FPowerMax, 16}, + {yabl.PCpuEnergySettings, yabl.FCurrentMax, 17}, + {yabl.PCpuEnergySettings, yabl.FVoltageMax, 18}, + {yabl.PPuDebug, yabl.FDebugModeOn, 19}, + {yabl.PPuDebug, yabl.FDebugContactorOutputOn, 20}, + {yabl.PPuErrors, yabl.FBoardReady, 21}, +} + +var pu_errors = []key{ + {yabl.PPuErrors, yabl.FBoardReady, 1}, + {yabl.PPuErrors, yabl.FOtherError, 2}, + {yabl.PPuErrors, yabl.FIncorrectVoltage, 3}, + {yabl.PPuErrors, yabl.FIncorrectVoltageValue, 4}, + {yabl.PPuErrors, yabl.FIncorrectCurrent, 5}, + {yabl.PPuErrors, yabl.FIncorrectCurrentValue, 6}, + {yabl.PPuErrors, yabl.FIsolationBroken, 7}, + {yabl.PPuErrors, yabl.FCpLineBroken, 8}, + {yabl.PPuErrors, yabl.FCpLineGap69, 9}, + {yabl.PPuErrors, yabl.FCableReady, 10}, + {yabl.PPuErrors, yabl.FNotReadyCpu, 11}, + {yabl.PPuErrors, yabl.FNotReadySecc, 12}, + {yabl.PPuErrors, yabl.FContactorOutputError, 13}, + {yabl.PPuErrors, yabl.FDebugContactorOutputEnabled, 14}, + {yabl.PPuErrors, yabl.FOutputCircuitBreakerEnabled, 15}, + {yabl.PPuDebug, yabl.FDebugModeOn, 16}, + {yabl.PPuDebug, yabl.FDebugContactorOutputOn, 17}, +} + +var contactors_errors = []key{ + {yabl.PContactorInternalErrors, yabl.FBoardReady, 1}, + {yabl.PContactorInternalErrors, yabl.FOtherError, 2}, + {yabl.PContactorInternalErrors, yabl.FContactorGroupChanged, 3}, + {yabl.PContactorInternalErrors, yabl.FUnexpectedFormation, 4}, + {yabl.PContactorInternalErrors, yabl.FCpuNotReady, 5}, + {yabl.PContactorInternalErrors, yabl.FPuNotReady, 6}, + {yabl.PContactorInternalErrors, yabl.FDebug, 7}, + {yabl.PContactorInternalErrors, yabl.FPresentContactorMode, 8}, + {yabl.PContactorsInternalForce, yabl.FForceModeEnabled, 9}, + {yabl.PContactorsInternalForce, yabl.FForceModeValue, 10}, + {yabl.PContactorInternalDebug, yabl.FDebugModeOn, 11}, +} + +var contactors_state = []key{ + {yabl.PContactorInternalState, yabl.FContactorReady, 1}, + {yabl.PContactorInternalState, yabl.FContactorOn, 2}, + {yabl.PContactorInternalState, yabl.FUnexpectedState, 3}, + {yabl.PContactorInternalState, yabl.FIsolated, 4}, + {yabl.PContactorInternalState, yabl.FDebugEnabled, 5}, + {yabl.PContactorInternalDebug, yabl.FDebugContactorOn, 6}, +} + +var periphery_state = []key{ + {yabl.PPeripheryState, yabl.FErrorShakeSensor, 1}, + {yabl.PPeripheryState, yabl.FErrorCoolingGroup, 2}, + {yabl.PPeripheryState, yabl.FOtherError, 3}, + {yabl.PPeripheryState, yabl.FDebugShptFanEnabled, 4}, + {yabl.PPeripheryState, yabl.FDebugIoBoardTestLampEnabled, 5}, + {yabl.PPeripheryInfo, yabl.FStateShptFan, 6}, + {yabl.PPeripheryDebug, yabl.FDebugShptFan, 7}, + {yabl.PPeripheryDebug, yabl.FDebugIoBoardTestLamp, 8}, +} + +var periphery_station_state = []key{ + {yabl.PPeripheryState, yabl.FOtherErrorSeverity, 1}, + {yabl.PPeripheryState, yabl.FOtherError, 2}, + {yabl.PPeripheryState, yabl.FPeripheryErrorCoolingGroup, 3}, + {yabl.PPeripheryState, yabl.FErrorFireEmergency, 4}, + {yabl.PPeripheryState, yabl.FErrorFireEmergencyRun, 5}, + {yabl.PPeripheryState, yabl.FErrorFireEmergencyControl, 6}, + {yabl.PPeripheryState, yabl.FErrorOvervoltageIn, 7}, + {yabl.PPeripheryState, yabl.FPeripheryErrorPowerSupply, 8}, + {yabl.PPeripheryState, yabl.FErrorFan, 9}, + {yabl.PPeripheryState, yabl.FErrorOvervoltageOut, 10}, + {yabl.PPeripheryState, yabl.FErrorStateRemoteMode, 11}, + {yabl.PPeripheryState, yabl.FDebugShsnFanEnabled, 12}, + {yabl.PPeripheryState, yabl.FDebugShptFanEnabled, 13}, + {yabl.PPeripheryState, yabl.FDebugIoBoardTestLampEnabled, 14}, + {yabl.PPeripheryState, yabl.FErrorFireEmergencyCircuitBreaker, 15}, + {yabl.PPeripheryState, yabl.FErrorExtLightCircuitBreaker, 16}, + {yabl.PPeripheryState, yabl.FErrorIndicationCircuitBreaker, 17}, + {yabl.PPeripheryState, yabl.FErrorLowVoltagePowerCircuitBreaker, 18}, + {yabl.PPeripheryState, yabl.FErrorContactorsInternalCircuitBreaker, 19}, + {yabl.PPeripheryState, yabl.FErrorPlcCircuitBreaker, 20}, + {yabl.PPeripheryInfo, yabl.FInfoDoorOpen, 21}, + {yabl.PPeripheryInfo, yabl.FTempAirIn, 22}, + {yabl.PPeripheryInfo, yabl.FTempAirOut, 23}, + {yabl.PPeripheryInfo, yabl.FStateShsnFan, 24}, + {yabl.PPeripheryDebug, yabl.FDebugModeOn, 25}, + {yabl.PPeripheryDebug, yabl.FDebugShsnFan, 26}, +} + +var converters = []key{ + {yabl.PConverterPresentEnergy, yabl.FPresentVoltage, 1}, + {yabl.PConverterPresentEnergy, yabl.FPresentCurrent, 2}, + {yabl.PConverterPresentEnergy, yabl.FConnectedOut, 3}, + {yabl.PConverterErrors, yabl.FBoardReady, 4}, + {yabl.PConverterErrors, yabl.FOtherError, 5}, + {yabl.PConverterErrors, yabl.FNotConnectedOut, 6}, + {yabl.PConverterErrors, yabl.FNoCommunicationConverter, 7}, + {yabl.PConverterErrors, yabl.FNoCommunicationPuConverter, 8}, + {yabl.PConverterPresentEnergy, yabl.FV2gMode, 9}, + {yabl.PConverterErrors, yabl.FDebugConvEnabled, 10}, + {yabl.PConverterErrors, yabl.FDebugConvDisabled, 11}, + {yabl.PConverterDebug, yabl.FDebugModeOn, 12}, + {yabl.PConverterDebug, yabl.FDebugEnergyOn, 13}, + {yabl.PConverterDebug, yabl.FDebugTargetVoltage, 14}, + {yabl.PConverterDebug, yabl.FDebugTargetCurrent, 15}, +} + +var converters_errors = []key{ + {yabl.PConverterErrors, yabl.FBoardReady, 1}, + {yabl.PConverterErrors, yabl.FOtherError, 2}, + {yabl.PConverterErrors, yabl.FNotConnectedOut, 3}, + {yabl.PConverterErrors, yabl.FNoCommunicationConverter, 4}, + {yabl.PConverterErrors, yabl.FNoCommunicationPuConverter, 5}, + {yabl.PConverterErrors, yabl.FInputGridVoltageHigh, 6}, + {yabl.PConverterErrors, yabl.FInputGridVoltageLow, 7}, + {yabl.PConverterErrors, yabl.FOutputGridVoltageHigh, 8}, + {yabl.PConverterErrors, yabl.FOutputGridVoltageLow, 9}, + {yabl.PConverterErrors, yabl.FInputGridVoltage, 10}, + {yabl.PConverterErrors, yabl.FOutputGridVoltage, 11}, + {yabl.PConverterErrors, yabl.FShortCircuit, 12}, + {yabl.PConverterErrors, yabl.FOverHeat, 13}, + {yabl.PConverterErrors, yabl.FFanBroken, 14}, + {yabl.PConverterErrors, yabl.FOtherHardwareError, 15}, +} + +var cpu = []key{ + {yabl.PCpuErrors, yabl.FBoardReady, 1}, + {yabl.PCpuErrors, yabl.FOtherError, 2}, + {yabl.PCpuErrors, yabl.FRedButtonHard, 3}, + {yabl.PCpuErrors, yabl.FRedButtonSoft, 4}, + {yabl.PCpuErrors, yabl.FModulesGone, 5}, + {yabl.PCpuErrors, yabl.FGridVoltageHighErr, 6}, + {yabl.PCpuErrors, yabl.FGridVoltageHighWarn, 7}, + {yabl.PCpuErrors, yabl.FGridVoltageLowWarn, 8}, + {yabl.PCpuErrors, yabl.FGridVoltageLowErr, 9}, + {yabl.PCpuErrors, yabl.FGridVoltageLow, 10}, + {yabl.PCpuErrors, yabl.FGridVoltageHigh, 11}, + {yabl.PCpuErrors, yabl.FGridVoltageEmpty, 12}, + {yabl.PCpuErrors, yabl.FNotReadySecc, 13}, + {yabl.PCpuErrors, yabl.FNotReadyPu, 14}, + {yabl.PCpuErrors, yabl.FNotReadyContactors, 15}, + {yabl.PCpuErrors, yabl.FDebugConvertersEnabled, 16}, + {yabl.PCpuErrors, yabl.FContactorInputError, 17}, + {yabl.PCpuErrors, yabl.FNotReadyPeriphery, 18}, + {yabl.PCpuPeriphery, yabl.FContactorInput, 19}, + {yabl.PCpuPeriphery, yabl.FCircuitBreakerInput, 20}, + {yabl.PCpuPeriphery, yabl.FCircuitBreakerPowerCBInput, 21}, + {yabl.PCpuDebug, yabl.FDebugModeOn, 22}, + {yabl.PCpuDebug, yabl.FDebugContactorInputOn, 23}, + {yabl.PCpuDebug, yabl.FDebugCircuitBreakerOn, 24}, + {yabl.PCpuDebug, yabl.FDebugRedButtonSoftware, 25}, +} diff --git a/ui/table.go b/ui/table.go new file mode 100644 index 0000000..8bf898a --- /dev/null +++ b/ui/table.go @@ -0,0 +1,96 @@ +package ui + +import ( + "cli-mon/yabl" + "fmt" + tview "github.com/rivo/tview" + "reflect" +) + +type table struct { + tview.Table + views map[key]*tview.TableCell + content []key +} + +type key struct { + action yabl.AName + field yabl.FName + id uint +} + +func (t *table) update(event *yabl.Event) { + if cell, ok := t.views[key{event.ActionName, event.Field, event.GetUnitId()}]; ok { + cell.SetText(fmt.Sprintf("%v", event.Value)) + } +} + +func (t *table) header(header string) *table { + t.SetTitle(header) + return t +} + +func (t *table) columns(name string, cols int) *table { + for i := 1; i <= cols; i++ { + t.SetCell(0, i, tview.NewTableCell(fmt.Sprintf("%s %d", name, i)).SetExpansion(2)) + } + return t +} + +func (t *table) rows(name string, rows int) *table { + for i := 1; i <= rows; i++ { + t.SetCell(i, 0, tview.NewTableCell(fmt.Sprintf("%s %d", name, i))) //.SetExpansion(2)) + } + return t +} + +func newTable(params []key, min, max int, invert bool, short bool) *table { + t := &table{} + t.Box = tview.NewBox() + t.SetBorderColor(tview.Styles.GraphicsColor) + t.SetSeparator(' ') + t.SetContent(nil) + t.SetBorders(true) + t.SetBorder(true) + + t.views = make(map[key]*tview.TableCell) + + for _, param := range params { + for i := min; i <= max; i++ { + k := param + k.id = uint(i) + cell := tview.NewTableCell("") + t.views[k] = cell + var col = i + if min == 0 { + col++ + } + if !invert { + t.SetCell(int(param.id), col, cell) + } else { + t.SetCell(col, int(param.id), cell) + } + + } + var desc string + if short { + desc = fmt.Sprintf("%s", param.field) + } else { + desc = fmt.Sprintf("%s.%s", param.action, param.field) + } + + if !invert { + t.SetCell(int(param.id), 0, tview.NewTableCell(desc)) + } else { + t.SetCell(0, int(param.id), tview.NewTableCell(desc)) + } + } + + return t +} + +func getField(v yabl.Action, field yabl.FName) interface{} { + r := reflect.ValueOf(v) + f := reflect.Indirect(r).FieldByName(string(field)) + return f.Interface() +} diff --git a/ui/ui.go b/ui/ui.go index 36b714e..2487c43 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -5,11 +5,22 @@ import ( "fmt" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" - "reflect" + "os" ) const ( - connectors_page = "Connectors" + connectors_page = "Connectors" + connectors_errors_page = "Connectors errors" + contactors_errors_page = "Contactors errors" + contactors_state_page = "Contactors states" + periphery_state_page = "Periphery state" + periphery_station_state_page = "Periphery station state" + converters_page = "Converters" + converters_errors_page = "Converters errors" + cpu_page = "CPU" + connectorCount = 6 + contactorsCount = 18 + convertersCount = 18 ) type page struct { @@ -25,25 +36,69 @@ type UI interface { } type gui struct { - app *tview.Application - pages *tview.Pages - connPage *cTable - page2 tview.Primitive + app *tview.Application + pages *tview.Pages + pu *table + puErrors *table + contactorsErrors *table + contactorsState *table + peripheryState *table + peripheryStationState *table + converters *table + convertersErrors *table + cpu *table } type log struct { } func (g *gui) Consume(event *yabl.Event) { - switch obj := event.Object.(type) { + switch event.Object.(type) { case *yabl.PuPresentEnergy: - g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value) + g.pu.update(event) case *yabl.PuPeriphery: - g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value) + g.pu.update(event) case *yabl.PuDebug: - g.connPage.updatePU(event.GetUnitId(), event.Field, event.Value) + g.pu.update(event) + g.puErrors.update(event) case *yabl.PuErrors: - g.connPage.updatePuErrors(obj) + g.pu.update(event) + g.puErrors.update(event) + case *yabl.ContactorInternalErrors: + g.contactorsErrors.update(event) + case *yabl.ContactorInternalDebug: + g.contactorsErrors.update(event) + g.contactorsState.update(event) + case *yabl.ContactorInternalState: + g.contactorsState.update(event) + case *yabl.ContactorsInternalForce: + g.contactorsErrors.update(event) + case *yabl.PeripheryState: + g.peripheryState.update(event) + g.peripheryStationState.update(event) + case *yabl.PeripheryInfo: + g.peripheryState.update(event) + g.peripheryStationState.update(event) + case *yabl.PeripheryDebug: + g.peripheryState.update(event) + g.peripheryStationState.update(event) + case *yabl.ConverterPresentEnergy: + g.converters.update(event) + case *yabl.ConverterErrors: + g.converters.update(event) + g.convertersErrors.update(event) + case *yabl.ConverterDebug: + g.converters.update(event) + case *yabl.CpuPresentEnergy: + g.pu.update(event) + case *yabl.CpuEnergySettings: + g.pu.update(event) + case *yabl.CpuErrors: + g.cpu.update(event) + case *yabl.CpuPeriphery: + g.cpu.update(event) + case *yabl.CpuDebug: + g.cpu.update(event) } g.app.Draw() } @@ -57,19 +112,61 @@ func NewUI() UI { var active page var layout map[string]page - g.connPage = newConnectorsGrid() - g.page2 = tview.NewBox().SetBorder(true).SetTitle("Bbbbbb") + g.pu = newTable(pu, 1, connectorCount, false, false).header(connectors_page).columns("Connector", connectorCount) + g.puErrors = newTable(pu_errors, 1, connectorCount, false, false).header(connectors_errors_page).columns("Connector", connectorCount) + g.contactorsErrors = newTable(contactors_errors, 0, 0, false, false).header(contactors_errors_page) + g.contactorsState = newTable(contactors_state, 1, contactorsCount, true, true).header(contactors_state_page).rows("Contactor", contactorsCount) + g.peripheryState = newTable(periphery_state, 1, connectorCount, false, false).header(periphery_state_page).columns("Connector", connectorCount) + g.peripheryStationState = newTable(periphery_station_state, 0, 1, false, false).header(periphery_station_state_page) + g.converters = newTable(converters, 1, convertersCount, false, true).header(converters_page).columns("", convertersCount) + g.convertersErrors = newTable(converters_errors, 1, convertersCount, false, true).header(converters_errors_page).columns("", convertersCount) + g.cpu = newTable(cpu, 0, 0, false, false).header(cpu_page) layout = map[string]page{ connectors_page: { - left: "Page2", - right: "Page2", - primitive: g.connPage, + left: cpu_page, + right: connectors_errors_page, + primitive: g.pu, }, - "Page2": { + connectors_errors_page: { left: connectors_page, + right: contactors_errors_page, + primitive: g.puErrors, + }, + contactors_errors_page: { + left: connectors_errors_page, + right: contactors_state_page, + primitive: g.contactorsErrors, + }, + contactors_state_page: { + left: contactors_errors_page, + right: periphery_state_page, + primitive: g.contactorsState, + }, + periphery_state_page: { + left: contactors_state_page, + right: periphery_station_state_page, + primitive: g.peripheryState, + }, + periphery_station_state_page: { + left: periphery_state_page, + right: converters_page, + primitive: g.peripheryStationState, + }, + converters_page: { + left: periphery_station_state_page, + right: converters_errors_page, + primitive: g.converters, + }, + converters_errors_page: { + left: converters_page, + right: cpu_page, + primitive: g.convertersErrors, + }, + cpu_page: { + left: converters_errors_page, right: connectors_page, - primitive: g.page2, + primitive: g.cpu, }, } @@ -91,7 +188,7 @@ func NewUI() UI { active = layout[active.left] return nil case tcell.KeyCtrlC: - g.app.Stop() + g.Stop() } return event }) @@ -109,6 +206,7 @@ func (g *gui) Start() { func (g *gui) Stop() { g.app.Stop() + os.Exit(0) } func NewLog() UI { @@ -131,9 +229,3 @@ func (l log) Start() { func (l log) Stop() { } - -func getField(v yabl.Action, field yabl.FName) interface{} { - r := reflect.ValueOf(v) - f := reflect.Indirect(r).FieldByName(string(field)) - return f.Interface() -} diff --git a/yabl/protocol.go b/yabl/protocol.go index 428c719..3bd80f0 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -57,6 +57,7 @@ type converter struct { type Converter interface { EventsFromFrame(*can.CanFrame) ([]*Event, bool) + CheckTimeouts() ([]*Event, bool) } func NewProtocolConverter() Converter { @@ -66,6 +67,9 @@ func NewProtocolConverter() Converter { } func (c *converter) EventsFromFrame(frame *can.CanFrame) ([]*Event, bool) { + if frame == nil { + return nil, false + } var unitId = uint((frame.CanId & UNIT_ID_MASK) >> UNIT_ID_OFFSET) var canId = frame.CanId & ACTION_ID_MASK var k = key{canId: canId, unitId: unitId} @@ -117,3 +121,43 @@ func get(from uint8, size uint8, buffer []byte) (uint64, bool) { func (u unit) GetUnitId() uint { return uint(u) } + +func (c *converter) CheckTimeouts() ([]*Event, bool) { + var multipler uint = 2 + var events []*Event + + for k, param := range c.protocolMap { + now := time.Now() + deadline := now.Add(-time.Duration(param.interval*multipler) * time.Millisecond) + + var from uint8 = 0 + + for _, fld := range param.fields { + if fld.last == nil { + continue + } else if deadline.After(*fld.last) { + if events == nil { + events = make([]*Event, 0, len(param.fields)) + } + + event := &Event{ + Field: fld.name, + ActionName: param.name, + Object: param.object, + unit: unit(k.unitId), + Updated: &now, + Value: nil, + } + + var mask uint64 = ^(ALL_BITS << fld.length) + mask = mask << from + fld.value = mask + + events = append(events, event) + fld.last = nil + } + from += fld.length + } + } + return events, events != nil +} diff --git a/yabl/types.go b/yabl/types.go index a193625..1d60d82 100644 --- a/yabl/types.go +++ b/yabl/types.go @@ -44,7 +44,6 @@ type Voltage9BitType float32 type ContactorInternalState struct { unit - //UnitId uint ContactorReady *BoardReadyType ContactorOn *BooleanType UnexpectedState *ErrorType -- 2.54.0 From 502890530cd872b1073e7ac04c7a1b770cf8fd6c Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Sun, 6 Aug 2023 17:57:03 +0300 Subject: [PATCH 13/15] Reuse redraws to decrease cpu load --- ui/parameters.go | 5 +++-- ui/table.go | 14 ++++++++------ ui/ui.go | 22 +++++++++++++++++++++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/ui/parameters.go b/ui/parameters.go index 4bf225d..119590f 100644 --- a/ui/parameters.go +++ b/ui/parameters.go @@ -9,7 +9,7 @@ var pu = []key{ {yabl.PPuPresentEnergy, yabl.FPresentCurrent, 4}, {yabl.PCpuPresentEnergy, yabl.FPresentCurrent, 5}, {yabl.PPuPeriphery, yabl.FConnectorInsert, 6}, - {yabl.PPuPeriphery, yabl.FDebugContactorOn, 7}, + {yabl.PPuPeriphery, yabl.FContactorOn, 7}, {yabl.PPuPeriphery, yabl.FConnectorLocked, 8}, {yabl.PPuPeriphery, yabl.FCpLineLevel, 9}, {yabl.PPuPeriphery, yabl.FIsolationState, 10}, @@ -23,7 +23,8 @@ var pu = []key{ {yabl.PCpuEnergySettings, yabl.FVoltageMax, 18}, {yabl.PPuDebug, yabl.FDebugModeOn, 19}, {yabl.PPuDebug, yabl.FDebugContactorOutputOn, 20}, - {yabl.PPuErrors, yabl.FBoardReady, 21}, + {yabl.PPuPeriphery, yabl.FDebugContactorOn, 21}, + {yabl.PPuErrors, yabl.FBoardReady, 22}, } var pu_errors = []key{ diff --git a/ui/table.go b/ui/table.go index 8bf898a..eb21c81 100644 --- a/ui/table.go +++ b/ui/table.go @@ -3,6 +3,7 @@ package ui import ( "cli-mon/yabl" "fmt" + "github.com/gdamore/tcell/v2" tview "github.com/rivo/tview" "reflect" ) @@ -32,14 +33,14 @@ func (t *table) header(header string) *table { func (t *table) columns(name string, cols int) *table { for i := 1; i <= cols; i++ { - t.SetCell(0, i, tview.NewTableCell(fmt.Sprintf("%s %d", name, i)).SetExpansion(2)) + t.SetCell(0, i, tview.NewTableCell(fmt.Sprintf("%s %d", name, i)).SetExpansion(2)).SetBackgroundColor(tcell.ColorDefault) } return t } func (t *table) rows(name string, rows int) *table { for i := 1; i <= rows; i++ { - t.SetCell(i, 0, tview.NewTableCell(fmt.Sprintf("%s %d", name, i))) //.SetExpansion(2)) + t.SetCell(i, 0, tview.NewTableCell(fmt.Sprintf("%s %d", name, i))).SetBackgroundColor(tcell.ColorDefault) //.SetExpansion(2)) } return t } @@ -47,7 +48,7 @@ func (t *table) rows(name string, rows int) *table { func newTable(params []key, min, max int, invert bool, short bool) *table { t := &table{} t.Box = tview.NewBox() - t.SetBorderColor(tview.Styles.GraphicsColor) + //t.SetBorderColor(tview.Styles.GraphicsColor) t.SetSeparator(' ') t.SetContent(nil) t.SetBorders(true) @@ -59,7 +60,7 @@ func newTable(params []key, min, max int, invert bool, short bool) *table { for i := min; i <= max; i++ { k := param k.id = uint(i) - cell := tview.NewTableCell("") + cell := tview.NewTableCell("").SetBackgroundColor(tcell.ColorDefault) t.views[k] = cell var col = i if min == 0 { @@ -79,10 +80,11 @@ func newTable(params []key, min, max int, invert bool, short bool) *table { desc = fmt.Sprintf("%s.%s", param.action, param.field) } + cell := tview.NewTableCell(desc).SetBackgroundColor(tcell.ColorDefault) if !invert { - t.SetCell(int(param.id), 0, tview.NewTableCell(desc)) + t.SetCell(int(param.id), 0, cell) } else { - t.SetCell(0, int(param.id), tview.NewTableCell(desc)) + t.SetCell(0, int(param.id), cell) } } diff --git a/ui/ui.go b/ui/ui.go index 2487c43..8da2e93 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -6,6 +6,7 @@ import ( "github.com/gdamore/tcell/v2" "github.com/rivo/tview" "os" + "time" ) const ( @@ -21,6 +22,7 @@ const ( connectorCount = 6 contactorsCount = 18 convertersCount = 18 + redrawMillis = 500 ) type page struct { @@ -38,6 +40,8 @@ type UI interface { type gui struct { app *tview.Application pages *tview.Pages + redraw bool + ticker *time.Ticker pu *table puErrors *table contactorsErrors *table @@ -99,8 +103,10 @@ func (g *gui) Consume(event *yabl.Event) { g.cpu.update(event) case *yabl.CpuDebug: g.cpu.update(event) + default: + return } - g.app.Draw() + g.redraw = true } func NewUI() UI { @@ -193,10 +199,23 @@ func NewUI() UI { return event }) + g.redraw = true + return g } func (g *gui) Start() { + g.ticker = time.NewTicker(redrawMillis * time.Millisecond) + + go func() { + for _ = range g.ticker.C { + if g.redraw { + g.app.Draw() + g.redraw = false + } + } + }() + go func() { if err := g.app.SetRoot(g.pages, true).EnableMouse(true).Run(); err != nil { panic(err) @@ -205,6 +224,7 @@ func (g *gui) Start() { } func (g *gui) Stop() { + g.ticker.Stop() g.app.Stop() os.Exit(0) } -- 2.54.0 From 776819ea00502a635581135199035dc08f251a4a Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Sun, 6 Aug 2023 18:22:56 +0300 Subject: [PATCH 14/15] Reuse redraws to decrease cpu load --- can/can.go | 3 ++- cli-mon.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/can/can.go b/can/can.go index bdf185b..c812f61 100644 --- a/can/can.go +++ b/can/can.go @@ -36,6 +36,7 @@ const CAN_ID_06C = 0x06C const CAN_ID_061 = 0x061 const CAN_ID_062 = 0x062 const CAN_ID_065 = 0x065 +const bufferSize = 100 type CanFrame struct { CanId uint32 @@ -159,7 +160,7 @@ func StartCan(canbus string) (<-chan *CanFrame, error) { if cerr := socket.Bind(canbus, filter); cerr == nil { - canevents := make(chan *CanFrame) + canevents := make(chan *CanFrame, bufferSize) go func() { defer close(canevents) diff --git a/cli-mon.go b/cli-mon.go index 26f433e..1801a31 100644 --- a/cli-mon.go +++ b/cli-mon.go @@ -52,7 +52,7 @@ func main() { display.Start() - updates := make(chan *yabl.Event) + updates := make(chan *yabl.Event, 1000) var f func() f = func() { -- 2.54.0 From 0017a237ab78e0549a614c77c21bc6591342460b Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Thu, 17 Aug 2023 13:58:25 +0300 Subject: [PATCH 15/15] Logic working mode for multiple connectors --- yabl/init.go | 24 ++++++++++++++---------- yabl/protocol.go | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/yabl/init.go b/yabl/init.go index d905740..b910d9f 100644 --- a/yabl/init.go +++ b/yabl/init.go @@ -212,16 +212,20 @@ func (c *converter) initialize() { object: c.logicErrorsInstance, } - c.logicWorkingMode = &LogicWorkingMode{unit: 0} - fields = []*field{ - {length: 5, setter: c.logicWorkingMode.setTargetContactorMode, name: FTargetContactorMode}, - {length: 2, setter: c.logicWorkingMode.setAvailability, name: FAvailability}, - } - c.protocolMap[key{can.CAN_ID_049, 0}] = action{ - fields: fields, - interval: 1000, - name: PLogicWorkingMode, - object: c.logicWorkingMode, + for i := uint(0); i <= CONNECTOR_COUNT; i++ { + key := key{can.CAN_ID_049, i} + lwm := &LogicWorkingMode{unit: unit(i)} + c.logicWorkingMode[i] = lwm + fields = []*field{ + {length: 5, setter: lwm.setTargetContactorMode, name: FTargetContactorMode}, + {length: 2, setter: lwm.setAvailability, name: FAvailability}, + } + c.protocolMap[key] = action{ + fields: fields, + interval: 1000, + name: PLogicWorkingMode, + object: lwm, + } } for i := uint(0); i < CONTACTOR_MAX; i++ { diff --git a/yabl/protocol.go b/yabl/protocol.go index 3bd80f0..47bfbfd 100644 --- a/yabl/protocol.go +++ b/yabl/protocol.go @@ -42,7 +42,7 @@ type converter struct { logicAuthArray [CONNECTOR_MAX]*LogicAuth logicEnergyMode [CONNECTOR_MAX]*LogicEnergyMode logicErrorsInstance *LogicErrors - logicWorkingMode *LogicWorkingMode + logicWorkingMode [CONNECTOR_MAX]*LogicWorkingMode contactorInternalStateArray [CONTACTOR_MAX]*ContactorInternalState contactorInternalErrorsInstance *ContactorInternalErrors contactorsInternalForce *ContactorsInternalForce -- 2.54.0