From 8c81bc8e24acac9a584b5a08f2b6aa85eb6b07e7 Mon Sep 17 00:00:00 2001 From: Terekhin Alexandr Date: Thu, 6 Jul 2023 12:07:16 +0300 Subject: [PATCH] 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 +}