Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Forked from VECTO / VECTO Sim
8385 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
AuxiliaryConfig.vb 19.16 KiB
' Copyright 2015 European Union.
' Licensed under the EUPL (the 'Licence');
'
' * You may not use this work except in compliance with the Licence.
' * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
' * Unless required by applicable law or agreed to in writing,
'   software distributed under the Licence is distributed on an "AS IS" basis,
'   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
'
' See the LICENSE.txt for the specific language governing permissions and limitations.

Imports VectoAuxiliaries.Electrics
Imports VectoAuxiliaries.Pneumatics
Imports VectoAuxiliaries.Hvac
Imports System.IO
Imports VectoAuxiliaries.DownstreamModules
Imports System.Windows.Forms
Imports Newtonsoft.Json
Imports TUGraz.VectoCommon.Utils
Imports VectoAuxiliaries

<Serializable()>
Public Class AuxiliaryConfig
	Implements IAuxiliaryConfig

	'Vecto
	Public Property VectoInputs As IVectoInputs Implements IAuxiliaryConfig.VectoInputs

	'Electrical
	Public Property ElectricalUserInputsConfig As IElectricsUserInputsConfig _
		Implements IAuxiliaryConfig.ElectricalUserInputsConfig

	'Pneumatics
	Public Property PneumaticUserInputsConfig As IPneumaticUserInputsConfig _
		Implements IAuxiliaryConfig.PneumaticUserInputsConfig

	Public Property PneumaticAuxillariesConfig As IPneumaticsAuxilliariesConfig _
		Implements IAuxiliaryConfig.PneumaticAuxillariesConfig

	'Hvac
	Public Property HvacUserInputsConfig As IHVACUserInputsConfig Implements IAuxiliaryConfig.HvacUserInputsConfig

	'Vecto Signals
	<JsonIgnore>
	Public Property Signals As ISignals

	'Constructors
	Sub New()

		Call Me.New("EMPTY")
	End Sub

	Public Sub New(auxConfigFile As String)

		'Special Condition
		If auxConfigFile = "EMPTY" Then
			ElectricalUserInputsConfig = New ElectricsUserInputsConfig() With {.PowerNetVoltage = 28.3}
			ElectricalUserInputsConfig.ElectricalConsumers = New ElectricalConsumerList(28.3, 0.096,
																						False)
			ElectricalUserInputsConfig.ResultCardIdle = New ResultCard(New List(Of SmartResult))
			ElectricalUserInputsConfig.ResultCardOverrun = New ResultCard(New List(Of SmartResult))
			ElectricalUserInputsConfig.ResultCardTraction = New ResultCard(New List(Of SmartResult))
			PneumaticAuxillariesConfig = New PneumaticsAuxilliariesConfig(False)
			PneumaticUserInputsConfig = New PneumaticUserInputsConfig(False)
			HvacUserInputsConfig = New HVACUserInputsConfig(String.Empty, String.Empty, False)
			Exit Sub

		End If

		If auxConfigFile Is Nothing OrElse auxConfigFile.Trim().Length = 0 OrElse Not File.Exists(auxConfigFile) Then

			setDefaults()

		Else

			setDefaults()

			If Not Load(auxConfigFile) Then
				MessageBox.Show(String.Format("Unable to load file  {0}", auxConfigFile))
			End If

		End If
	End Sub

	'Set Default Values
	Private Sub setDefaults()

		Dim tmp As VectoInputs = New VectoInputs _
				With {.Cycle = "Urban", .VehicleWeightKG = 16500.SI(Of Kilogram)(), .PowerNetVoltage = 28.3.SI(Of Volt)()}
		VectoInputs = tmp
		Signals = New Signals With {.EngineSpeed = 2000.RPMtoRad(), .TotalCycleTimeSeconds = 3114, .ClutchEngaged = False}

		'Pneumatics set deault values
		PneumaticUserInputsConfig = New PneumaticUserInputsConfig(True)
		PneumaticAuxillariesConfig = New PneumaticsAuxilliariesConfig(True)

		'Electrical set deault values
		ElectricalUserInputsConfig = New ElectricsUserInputsConfig(True, tmp)
		ElectricalUserInputsConfig.ElectricalConsumers = New ElectricalConsumerList(28.3, 0.096, True)

		'HVAC set deault values
		HvacUserInputsConfig = New HVACUserInputsConfig(String.Empty, String.Empty, False)
	End Sub

	Private Function GetDoorActuationTimeFraction() As Single

		Dim actuationsMap As PneumaticActuationsMAP = New PneumaticActuationsMAP(PneumaticUserInputsConfig.ActuationsMap)
		Dim actuationsKey As ActuationsKey = New ActuationsKey("Park brake + 2 doors", VectoInputs.Cycle)

		Dim numActuations As Single = actuationsMap.GetNumActuations(actuationsKey)
		Dim secondsPerActuation As Single = ElectricalUserInputsConfig.DoorActuationTimeSecond

		Dim doorDutyCycleFraction As Single = (numActuations * secondsPerActuation) / Signals.TotalCycleTimeSeconds

		Return doorDutyCycleFraction
	End Function

#Region "Comparison"

	Private Function CompareElectricalConfiguration(other As AuxiliaryConfig) As Boolean

		'AlternatorGearEfficiency
		If Me.ElectricalUserInputsConfig.AlternatorGearEfficiency <> other.ElectricalUserInputsConfig.AlternatorGearEfficiency _
			Then Return False

		'AlternatorMap
		If Me.ElectricalUserInputsConfig.AlternatorMap <> other.ElectricalUserInputsConfig.AlternatorMap Then Return False

		'DoorActuationTimeSecond
		If Me.ElectricalUserInputsConfig.DoorActuationTimeSecond <> other.ElectricalUserInputsConfig.DoorActuationTimeSecond _
			Then Return False


		'Consumer list
		If _
			Me.ElectricalUserInputsConfig.ElectricalConsumers.Items.Count <>
			other.ElectricalUserInputsConfig.ElectricalConsumers.Items.Count Then Return False
		Dim i As Integer
		For i = 0 To Me.ElectricalUserInputsConfig.ElectricalConsumers.Items.Count - 1
			Dim thisConsumer, otherConsumer As IElectricalConsumer
			thisConsumer = Me.ElectricalUserInputsConfig.ElectricalConsumers.Items(i)
			otherConsumer = other.ElectricalUserInputsConfig.ElectricalConsumers.Items(i)

			If thisConsumer.AvgConsumptionAmps <> otherConsumer.AvgConsumptionAmps OrElse
				thisConsumer.BaseVehicle <> otherConsumer.BaseVehicle OrElse
				thisConsumer.Category <> otherConsumer.Category OrElse
				thisConsumer.ConsumerName <> otherConsumer.ConsumerName OrElse
				thisConsumer.NominalConsumptionAmps <> otherConsumer.NominalConsumptionAmps OrElse
				thisConsumer.NumberInActualVehicle <> otherConsumer.NumberInActualVehicle OrElse
				thisConsumer.PhaseIdle_TractionOn <> otherConsumer.PhaseIdle_TractionOn OrElse
				thisConsumer.TotalAvgConsumptionInWatts <> otherConsumer.TotalAvgConsumptionInWatts OrElse
				thisConsumer.TotalAvgConumptionAmps <> otherConsumer.TotalAvgConumptionAmps Then Return False

		Next

		'PowerNetVoltage
		If Me.ElectricalUserInputsConfig.PowerNetVoltage <> other.ElectricalUserInputsConfig.PowerNetVoltage Then Return False

		'ResultCardIdle
		If _
			Me.ElectricalUserInputsConfig.ResultCardIdle.Results.Count <>
			other.ElectricalUserInputsConfig.ResultCardIdle.Results.Count Then Return False
		For i = 0 To Me.ElectricalUserInputsConfig.ResultCardIdle.Results.Count - 1
			If _
				Me.ElectricalUserInputsConfig.ResultCardIdle.Results(i).Amps <>
				other.ElectricalUserInputsConfig.ResultCardIdle.Results(i).Amps OrElse
				Me.ElectricalUserInputsConfig.ResultCardIdle.Results(i).SmartAmps <>
				other.ElectricalUserInputsConfig.ResultCardIdle.Results(i).SmartAmps Then Return False
		Next

		'ResultCardOverrun
		If _
			Me.ElectricalUserInputsConfig.ResultCardOverrun.Results.Count <>
			other.ElectricalUserInputsConfig.ResultCardOverrun.Results.Count Then Return False
		For i = 0 To Me.ElectricalUserInputsConfig.ResultCardOverrun.Results.Count - 1
			If _
				Me.ElectricalUserInputsConfig.ResultCardOverrun.Results(i).Amps <>
				other.ElectricalUserInputsConfig.ResultCardOverrun.Results(i).Amps OrElse
				Me.ElectricalUserInputsConfig.ResultCardOverrun.Results(i).SmartAmps <>
				other.ElectricalUserInputsConfig.ResultCardOverrun.Results(i).SmartAmps Then Return False
		Next


		'ResultCardTraction
		If _
			Me.ElectricalUserInputsConfig.ResultCardTraction.Results.Count <>
			other.ElectricalUserInputsConfig.ResultCardTraction.Results.Count Then Return False
		For i = 0 To Me.ElectricalUserInputsConfig.ResultCardTraction.Results.Count - 1
			If _
				Me.ElectricalUserInputsConfig.ResultCardTraction.Results(i).Amps <>
				other.ElectricalUserInputsConfig.ResultCardTraction.Results(i).Amps OrElse
				Me.ElectricalUserInputsConfig.ResultCardTraction.Results(i).SmartAmps <>
				other.ElectricalUserInputsConfig.ResultCardTraction.Results(i).SmartAmps Then Return False
		Next

		'SmartElectrical
		If Me.ElectricalUserInputsConfig.SmartElectrical <> other.ElectricalUserInputsConfig.SmartElectrical Then Return False


		Return True
	End Function

	Private Function ComparePneumaticAuxiliariesConfig(other As AuxiliaryConfig) As Boolean

		If Me.PneumaticAuxillariesConfig.AdBlueNIperMinute <> other.PneumaticAuxillariesConfig.AdBlueNIperMinute Then _
			Return False
		If _
			Me.PneumaticAuxillariesConfig.AirControlledSuspensionNIperMinute <>
			other.PneumaticAuxillariesConfig.AirControlledSuspensionNIperMinute Then Return False
		If Me.PneumaticAuxillariesConfig.BrakingNoRetarderNIperKG <> other.PneumaticAuxillariesConfig.BrakingNoRetarderNIperKG _
			Then Return False
		If _
			Me.PneumaticAuxillariesConfig.BrakingWithRetarderNIperKG <>
			other.PneumaticAuxillariesConfig.BrakingWithRetarderNIperKG Then Return False
		If _
			Me.PneumaticAuxillariesConfig.BreakingPerKneelingNIperKGinMM <>
			other.PneumaticAuxillariesConfig.BreakingPerKneelingNIperKGinMM Then Return False
		If _
			Me.PneumaticAuxillariesConfig.DeadVolBlowOutsPerLitresperHour <>
			other.PneumaticAuxillariesConfig.DeadVolBlowOutsPerLitresperHour Then Return False
		If Me.PneumaticAuxillariesConfig.DeadVolumeLitres <> other.PneumaticAuxillariesConfig.DeadVolumeLitres Then _
			Return False
		If _
			Me.PneumaticAuxillariesConfig.NonSmartRegenFractionTotalAirDemand <>
			other.PneumaticAuxillariesConfig.NonSmartRegenFractionTotalAirDemand Then Return False
		If Me.PneumaticAuxillariesConfig.PerDoorOpeningNI <> other.PneumaticAuxillariesConfig.PerDoorOpeningNI Then _
			Return False
		If _
			Me.PneumaticAuxillariesConfig.PerStopBrakeActuationNIperKG <>
			other.PneumaticAuxillariesConfig.PerStopBrakeActuationNIperKG Then Return False
		If _
			Me.PneumaticAuxillariesConfig.SmartRegenFractionTotalAirDemand <>
			other.PneumaticAuxillariesConfig.SmartRegenFractionTotalAirDemand Then Return False
		If _
			Me.PneumaticAuxillariesConfig.OverrunUtilisationForCompressionFraction <>
			other.PneumaticAuxillariesConfig.OverrunUtilisationForCompressionFraction Then Return False

		Return True
	End Function

	Private Function ComparePneumaticUserConfig(other As AuxiliaryConfig) As Boolean

		If Me.PneumaticUserInputsConfig.ActuationsMap <> other.PneumaticUserInputsConfig.ActuationsMap Then Return False
		If Me.PneumaticUserInputsConfig.AdBlueDosing <> other.PneumaticUserInputsConfig.AdBlueDosing Then Return False
		If Me.PneumaticUserInputsConfig.AirSuspensionControl <> other.PneumaticUserInputsConfig.AirSuspensionControl Then _
			Return False
		If Me.PneumaticUserInputsConfig.CompressorGearEfficiency <> other.PneumaticUserInputsConfig.CompressorGearEfficiency _
			Then Return False
		If Me.PneumaticUserInputsConfig.CompressorGearRatio <> other.PneumaticUserInputsConfig.CompressorGearRatio Then _
			Return False
		If Me.PneumaticUserInputsConfig.CompressorMap <> other.PneumaticUserInputsConfig.CompressorMap Then Return False
		If Me.PneumaticUserInputsConfig.Doors <> other.PneumaticUserInputsConfig.Doors Then Return False
		If Me.PneumaticUserInputsConfig.KneelingHeightMillimeters <> other.PneumaticUserInputsConfig.KneelingHeightMillimeters _
			Then Return False
		If Me.PneumaticUserInputsConfig.RetarderBrake <> other.PneumaticUserInputsConfig.RetarderBrake Then Return False
		If Me.PneumaticUserInputsConfig.SmartAirCompression <> other.PneumaticUserInputsConfig.SmartAirCompression Then _
			Return False
		If Me.PneumaticUserInputsConfig.SmartRegeneration <> other.PneumaticUserInputsConfig.SmartRegeneration Then _
			Return False

		Return True
	End Function

	Private Function CompareHVACConfig(other As AuxiliaryConfig) As Boolean _
		Implements IAuxiliaryConfig.ConfigValuesAreTheSameAs

		If Me.HvacUserInputsConfig.SSMFilePath <> other.HvacUserInputsConfig.SSMFilePath Then Return False
		If Me.HvacUserInputsConfig.BusDatabasePath <> other.HvacUserInputsConfig.BusDatabasePath Then Return False
		If Me.HvacUserInputsConfig.SSMDisabled <> other.HvacUserInputsConfig.SSMDisabled Then Return False

		Return True
	End Function

	Public Function ConfigValuesAreTheSameAs(other As AuxiliaryConfig) As Boolean

		If Not CompareElectricalConfiguration(other) Then Return False
		If Not ComparePneumaticAuxiliariesConfig(other) Then Return False
		If Not ComparePneumaticUserConfig(other) Then Return False
		If Not CompareHVACConfig(other) Then Return False
		Return True
	End Function


#End Region

#Region "Persistance"

	'Persistance Functions
	Public Function Save(auxFile As String) As Boolean Implements IAuxiliaryConfig.Save

		Dim returnValue As Boolean = True
		Dim settings As JsonSerializerSettings = New JsonSerializerSettings()
		settings.TypeNameHandling = TypeNameHandling.Objects

		'JSON METHOD
		Try

			Dim output As String = JsonConvert.SerializeObject(Me, Formatting.Indented, settings)

			File.WriteAllText(auxFile, output)

		Catch ex As Exception

			returnValue = False

		End Try

		Return returnValue
	End Function

	Public Function Load(auxFile As String) As Boolean Implements IAuxiliaryConfig.Load

		Dim returnValue As Boolean = True
		Dim settings As JsonSerializerSettings = New JsonSerializerSettings()
		Dim tmpAux As AuxiliaryConfig

		settings.TypeNameHandling = TypeNameHandling.Objects

		'JSON METHOD
		Try

			Dim output As String = File.ReadAllText(auxFile)


			tmpAux = JsonConvert.DeserializeObject(Of AuxiliaryConfig)(output, settings)

			'This is where we Assume values of loaded( Deserialized ) object.
			AssumeValuesOfOther(tmpAux)
			If Not tmpAux.VectoInputs.FuelMapFile Is Nothing Then
				Dim tmp As cMAP = New cMAP
				tmp.FilePath = Path.Combine(Path.GetDirectoryName(auxFile), tmpAux.VectoInputs.FuelMapFile)
				If Not tmp.ReadFile() Then
					MessageBox.Show("Unable to read fuel map, aborting.")
					Return False
				End If
				tmp.Triangulate()
				VectoInputs.FuelMap = tmp
			End If
		Catch ex As Exception

			returnValue = False
		End Try

		Return returnValue
	End Function

	'Persistance Helpers
	Public Sub AssumeValuesOfOther(other As AuxiliaryConfig)
		CloneElectricaConfiguration(other)
		ClonePneumaticsAuxiliariesConfig(other)
		ClonePneumaticsUserInputsConfig(other)
		CloneHVAC(other)
	End Sub

	Private Sub CloneElectricaConfiguration(other As AuxiliaryConfig)

		'AlternatorGearEfficiency
		Me.ElectricalUserInputsConfig.AlternatorGearEfficiency = other.ElectricalUserInputsConfig.AlternatorGearEfficiency
		'AlternatorMap
		Me.ElectricalUserInputsConfig.AlternatorMap = other.ElectricalUserInputsConfig.AlternatorMap
		'DoorActuationTimeSecond
		Me.ElectricalUserInputsConfig.DoorActuationTimeSecond = other.ElectricalUserInputsConfig.DoorActuationTimeSecond

		'Electrical Consumer list
		Me.ElectricalUserInputsConfig.ElectricalConsumers.Items.Clear()
		For Each otherConsumer As IElectricalConsumer In other.ElectricalUserInputsConfig.ElectricalConsumers.Items

			Dim newConsumer As ElectricalConsumer = New ElectricalConsumer(otherConsumer.BaseVehicle,
																			otherConsumer.Category,
																			otherConsumer.ConsumerName,
																			otherConsumer.NominalConsumptionAmps,
																			otherConsumer.PhaseIdle_TractionOn,
																			otherConsumer.PowerNetVoltage,
																			otherConsumer.NumberInActualVehicle,
																			otherConsumer.Info)

			Me.ElectricalUserInputsConfig.ElectricalConsumers.Items.Add(newConsumer)

		Next

		'PowerNetVoltage
		Me.ElectricalUserInputsConfig.PowerNetVoltage = other.ElectricalUserInputsConfig.PowerNetVoltage
		'ResultCardIdle
		Me.ElectricalUserInputsConfig.ResultCardIdle.Results.Clear()
		For Each result As SmartResult In other.ElectricalUserInputsConfig.ResultCardIdle.Results
			Me.ElectricalUserInputsConfig.ResultCardIdle.Results.Add(New SmartResult(result.Amps, result.SmartAmps))
		Next
		'ResultCardOverrun
		Me.ElectricalUserInputsConfig.ResultCardOverrun.Results.Clear()
		For Each result As SmartResult In other.ElectricalUserInputsConfig.ResultCardOverrun.Results
			Me.ElectricalUserInputsConfig.ResultCardOverrun.Results.Add(New SmartResult(result.Amps, result.SmartAmps))
		Next
		'ResultCardTraction
		Me.ElectricalUserInputsConfig.ResultCardTraction.Results.Clear()
		For Each result As SmartResult In other.ElectricalUserInputsConfig.ResultCardTraction.Results
			Me.ElectricalUserInputsConfig.ResultCardTraction.Results.Add(New SmartResult(result.Amps, result.SmartAmps))
		Next
		'SmartElectrical
		Me.ElectricalUserInputsConfig.SmartElectrical = other.ElectricalUserInputsConfig.SmartElectrical
	End Sub

	Private Sub ClonePneumaticsAuxiliariesConfig(other As AuxiliaryConfig)

		Me.PneumaticAuxillariesConfig.AdBlueNIperMinute = other.PneumaticAuxillariesConfig.AdBlueNIperMinute
		Me.PneumaticAuxillariesConfig.AirControlledSuspensionNIperMinute =
			other.PneumaticAuxillariesConfig.AirControlledSuspensionNIperMinute
		Me.PneumaticAuxillariesConfig.BrakingNoRetarderNIperKG = other.PneumaticAuxillariesConfig.BrakingNoRetarderNIperKG
		Me.PneumaticAuxillariesConfig.BrakingWithRetarderNIperKG = other.PneumaticAuxillariesConfig.BrakingWithRetarderNIperKG
		Me.PneumaticAuxillariesConfig.BreakingPerKneelingNIperKGinMM =
			other.PneumaticAuxillariesConfig.BreakingPerKneelingNIperKGinMM
		Me.PneumaticAuxillariesConfig.DeadVolBlowOutsPerLitresperHour =
			other.PneumaticAuxillariesConfig.DeadVolBlowOutsPerLitresperHour
		Me.PneumaticAuxillariesConfig.DeadVolumeLitres = other.PneumaticAuxillariesConfig.DeadVolumeLitres
		Me.PneumaticAuxillariesConfig.NonSmartRegenFractionTotalAirDemand =
			other.PneumaticAuxillariesConfig.NonSmartRegenFractionTotalAirDemand
		Me.PneumaticAuxillariesConfig.PerDoorOpeningNI = other.PneumaticAuxillariesConfig.PerDoorOpeningNI
		Me.PneumaticAuxillariesConfig.PerStopBrakeActuationNIperKG =
			other.PneumaticAuxillariesConfig.PerStopBrakeActuationNIperKG
		Me.PneumaticAuxillariesConfig.SmartRegenFractionTotalAirDemand =
			other.PneumaticAuxillariesConfig.SmartRegenFractionTotalAirDemand
		Me.PneumaticAuxillariesConfig.OverrunUtilisationForCompressionFraction =
			other.PneumaticAuxillariesConfig.OverrunUtilisationForCompressionFraction
	End Sub

	Private Sub ClonePneumaticsUserInputsConfig(other As AuxiliaryConfig)

		Me.PneumaticUserInputsConfig.ActuationsMap = other.PneumaticUserInputsConfig.ActuationsMap
		Me.PneumaticUserInputsConfig.AdBlueDosing = other.PneumaticUserInputsConfig.AdBlueDosing
		Me.PneumaticUserInputsConfig.AirSuspensionControl = other.PneumaticUserInputsConfig.AirSuspensionControl
		Me.PneumaticUserInputsConfig.CompressorGearEfficiency = other.PneumaticUserInputsConfig.CompressorGearEfficiency
		Me.PneumaticUserInputsConfig.CompressorGearRatio = other.PneumaticUserInputsConfig.CompressorGearRatio
		Me.PneumaticUserInputsConfig.CompressorMap = other.PneumaticUserInputsConfig.CompressorMap
		Me.PneumaticUserInputsConfig.Doors = other.PneumaticUserInputsConfig.Doors
		Me.PneumaticUserInputsConfig.KneelingHeightMillimeters = other.PneumaticUserInputsConfig.KneelingHeightMillimeters
		Me.PneumaticUserInputsConfig.RetarderBrake = other.PneumaticUserInputsConfig.RetarderBrake
		Me.PneumaticUserInputsConfig.SmartAirCompression = other.PneumaticUserInputsConfig.SmartAirCompression
		Me.PneumaticUserInputsConfig.SmartRegeneration = other.PneumaticUserInputsConfig.SmartRegeneration
	End Sub

	Private Sub CloneHVAC(other As AuxiliaryConfig)

		Me.HvacUserInputsConfig.SSMFilePath = other.HvacUserInputsConfig.SSMFilePath
		Me.HvacUserInputsConfig.BusDatabasePath = other.HvacUserInputsConfig.BusDatabasePath
		Me.HvacUserInputsConfig.SSMDisabled = other.HvacUserInputsConfig.SSMDisabled
	End Sub

#End Region
End Class