From c6d1219cfc6f7bbcec88c080ca3c9a59e9183d7d Mon Sep 17 00:00:00 2001 From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at> Date: Wed, 24 Mar 2021 13:33:07 +0100 Subject: [PATCH] make component entries nullable of multistage bus xml --- .../BusHVACSystemConfiguration.cs | 10 +- .../InputData/DeclarationInputData.cs | 26 +-- .../InputData/FileIO/JSON/JSONSubComponent.cs | 26 +-- ...MLDeclarationBusAuxiliariesDataProvider.cs | 207 ++++++++++++++---- .../XMLDeclarationComponentsDataProvider.cs | 14 ++ .../XMLDeclarationVehicleDataProvider.cs | 8 +- ...larationDataAdapterCompletedBusSpecific.cs | 12 +- .../Reader/Impl/CombinedBusAuxiliaries.cs | 26 +-- .../Models/Declaration/DeclarationData.cs | 2 +- .../Models/Declaration/HVACCoolingPower.cs | 6 +- .../VectoCore/Models/Declaration/Mission.cs | 4 +- .../CompletedBusSanityCheckTests.cs | 2 +- ..._input_only_component_nullable_entries.xml | 2 +- VectoCore/VectoCoreTest/VectoCoreTest.csproj | 3 + .../XML/XMLMultistageBusInputDataTest.cs | 58 +++++ 15 files changed, 306 insertions(+), 100 deletions(-) diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/BusHVACSystemConfiguration.cs b/VectoCommon/VectoCommon/BusAuxiliaries/BusHVACSystemConfiguration.cs index 025ac25c87..d40626c700 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/BusHVACSystemConfiguration.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/BusHVACSystemConfiguration.cs @@ -23,12 +23,12 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { { private const string Prefix = "Configuration"; - public static BusHVACSystemConfiguration Parse(string text) + public static BusHVACSystemConfiguration? Parse(string text) { return (Prefix + text).ParseEnum<BusHVACSystemConfiguration>(); } - public static string GetLabel(this BusHVACSystemConfiguration hvacConfiguration) + public static string GetLabel(this BusHVACSystemConfiguration? hvacConfiguration) { if (hvacConfiguration == BusHVACSystemConfiguration.Unknown) { return BusHVACSystemConfiguration.Unknown.ToString(); @@ -37,7 +37,7 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { return Prefix + " " + hvacConfiguration.ToString().Replace(Prefix, ""); } - public static string GetName(this BusHVACSystemConfiguration hvacConfig) + public static string GetName(this BusHVACSystemConfiguration? hvacConfig) { if (hvacConfig == BusHVACSystemConfiguration.Unknown) { return "Unknown"; @@ -46,7 +46,7 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { return hvacConfig.ToString().Replace(Prefix, ""); } - public static string GetXmlFormat(this BusHVACSystemConfiguration hvacConfiguration) + public static string GetXmlFormat(this BusHVACSystemConfiguration? hvacConfiguration) { if (hvacConfiguration == BusHVACSystemConfiguration.Unknown) { return "0"; @@ -55,7 +55,7 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { return GetName(hvacConfiguration); } - public static bool RequiresDriverAC(this BusHVACSystemConfiguration hvacConfig) + public static bool RequiresDriverAC(this BusHVACSystemConfiguration? hvacConfig) { switch (hvacConfig) { case BusHVACSystemConfiguration.Configuration2: diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index 2bbb9e9e29..354b0a60cc 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -821,15 +821,15 @@ namespace TUGraz.VectoCommon.InputData public interface IElectricConsumersDeclarationData { - bool InteriorLightsLED { get; } + bool? InteriorLightsLED { get; } - bool DayrunninglightsLED { get; } + bool? DayrunninglightsLED { get; } - bool PositionlightsLED { get; } + bool? PositionlightsLED { get; } - bool HeadlightsLED { get; } + bool? HeadlightsLED { get; } - bool BrakelightsLED { get; } + bool? BrakelightsLED { get; } } public interface IAlternatorDeclarationInputData @@ -860,7 +860,7 @@ namespace TUGraz.VectoCommon.InputData public interface IHVACBusAuxiliariesDeclarationData { - BusHVACSystemConfiguration SystemConfiguration { get; } + BusHVACSystemConfiguration? SystemConfiguration { get; } HeatPumpType? HeatPumpTypeDriverCompartment { get; } @@ -872,19 +872,19 @@ namespace TUGraz.VectoCommon.InputData Watt AuxHeaterPower { get; } - bool DoubleGlazing { get; } + bool? DoubleGlazing { get; } - bool AdjustableAuxiliaryHeater { get; } + bool? AdjustableAuxiliaryHeater { get; } - bool SeparateAirDistributionDucts { get; } + bool? SeparateAirDistributionDucts { get; } - bool WaterElectricHeater { get; } + bool? WaterElectricHeater { get; } - bool AirElectricHeater { get; } + bool? AirElectricHeater { get; } - bool OtherHeatingTechnology { get; } + bool? OtherHeatingTechnology { get; } - bool AdjustableCoolantThermostat { get; } + bool? AdjustableCoolantThermostat { get; } bool EngineWasteGasHeatExchanger { get; } } diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs index fe721e9a55..3de7b5a374 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONSubComponent.cs @@ -548,27 +548,27 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON #region Implementation of IElectricConsumersDeclarationData - public virtual bool InteriorLightsLED + public virtual bool? InteriorLightsLED { get { return false; } } - public virtual bool DayrunninglightsLED + public virtual bool? DayrunninglightsLED { get { return false; } } - public virtual bool PositionlightsLED + public virtual bool? PositionlightsLED { get { return false; } } - public virtual bool HeadlightsLED + public virtual bool? HeadlightsLED { get { return false; } } - public virtual bool BrakelightsLED + public virtual bool? BrakelightsLED { get { return false; } } @@ -630,7 +630,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON #region Implementation of IHVACBusAuxiliariesDeclarationData - public virtual BusHVACSystemConfiguration SystemConfiguration { get; set; } + public virtual BusHVACSystemConfiguration? SystemConfiguration { get; set; } public virtual HeatPumpType? HeatPumpTypeDriverCompartment { get { return null; } } public virtual HeatPumpMode? HeatPumpModeDriverCompartment { get { return null; } } public virtual HeatPumpType? HeatPumpTypePassengerCompartment { get{ return null; } } @@ -638,15 +638,15 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON public virtual ACCompressorType CompressorTypeDriver { get { return ACCompressorType.Unknown; } } public virtual ACCompressorType CompressorTypePassenger { get { return ACCompressorType.Unknown; } } public virtual Watt AuxHeaterPower { get { return null; } } - public virtual bool DoubleGlazing { get { return false; } } + public virtual bool? DoubleGlazing { get { return false; } } public virtual bool HeatPump { get { return false; } } - public bool OtherHeatingTechnology { get; } - public virtual bool AdjustableCoolantThermostat { get { return Body["Aux"]?["HVAC"]?.GetEx<bool>("AdjustableCoolantThermostat") ?? false; } } - public virtual bool AdjustableAuxiliaryHeater { get { return false; } } + public bool? OtherHeatingTechnology { get; } + public virtual bool? AdjustableCoolantThermostat { get { return Body["Aux"]?["HVAC"]?.GetEx<bool>("AdjustableCoolantThermostat") ?? false; } } + public virtual bool? AdjustableAuxiliaryHeater { get { return false; } } public virtual bool EngineWasteGasHeatExchanger { get { return Body["Aux"]?["HVAC"]?.GetEx<bool>("EngineWasteGasHeatExchanger") ?? false; } } - public virtual bool SeparateAirDistributionDucts { get { return false; } } - public virtual bool WaterElectricHeater { get; } - public virtual bool AirElectricHeater { get; } + public virtual bool? SeparateAirDistributionDucts { get { return false; } } + public virtual bool? WaterElectricHeater { get; } + public virtual bool? AirElectricHeater { get; } #endregion diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs index 3bc719b2a5..c454b9f7ea 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs @@ -25,7 +25,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE); - + public XMLDeclarationPrimaryBusAuxiliariesDataProviderV26( IXMLDeclarationVehicleData vehicle, XmlNode componentNode, string sourceFile) : base(componentNode) { } @@ -43,7 +43,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual IList<string> SteeringPumpTechnology { - get { + get + { return GetNodes(new[] { "SteeringPump", XMLNames.Auxiliaries_Auxiliary_Technology }) .Cast<XmlNode>().Select(x => x.InnerText).ToList(); } @@ -80,7 +81,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual IList<IAlternatorDeclarationInputData> Alternators { - get { + get + { return GetNodes(new[] { XMLNames.BusAux_ElectricSystem, XMLNames.BusAux_ElectricSystem_AlternatorTechnology }) .Cast<XmlNode>().Select(x => new AlternatorInputData(x.InnerText)) .Cast<IAlternatorDeclarationInputData>().ToList(); @@ -99,7 +101,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual WattSecond ElectricStorageCapacity { - get { + get + { return ElementExists("ElectricStorageCapacity") ? GetDouble("ElectricStorageCapacity").SI(Unit.SI.Watt.Hour).Cast<WattSecond>() : null; @@ -113,7 +116,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual ConsumerTechnology AirsuspensionControl { - get { + get + { return ConsumerTechnologyHelper.Parse( GetString(new[] { XMLNames.BusAux_PneumaticSystem, XMLNames.BusAux_PneumaticSystem_AirsuspensionControl })); } @@ -121,7 +125,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual ConsumerTechnology AdBlueDosing { - get { + get + { return GetBool( new[] { XMLNames.BusAux_PneumaticSystem, XMLNames.BusAux_PneumaticSystem_AdBlueDosing }) ? ConsumerTechnology.Pneumatically @@ -147,14 +152,16 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual bool SmartAirCompression { - get { + get + { return GetBool(new[] { XMLNames.BusAux_PneumaticSystem, XMLNames.BusAux_PneumaticSystem_SmartcompressionSystem }); } } public virtual bool SmartRegeneration { - get { + get + { return GetBool(new[] { XMLNames.BusAux_PneumaticSystem, XMLNames.BusAux_PneumaticSystem_SmartRegenerationSystem }); } } @@ -163,7 +170,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #region Implementation of IHVACBusAuxiliariesDeclarationData - public virtual BusHVACSystemConfiguration SystemConfiguration + public virtual BusHVACSystemConfiguration? SystemConfiguration { get { return BusHVACSystemConfiguration.Unknown; } } @@ -188,7 +195,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider get { return 0.SI<Watt>(); } } - public virtual bool DoubleGlazing + public virtual bool? DoubleGlazing { get { return false; } } @@ -198,17 +205,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider get { return false; } } - public virtual bool OtherHeatingTechnology + public virtual bool? OtherHeatingTechnology { get { return false; } } - public virtual bool AdjustableCoolantThermostat + public virtual bool? AdjustableCoolantThermostat { get { return GetBool(new[] { "HVAC", "AdjustableCoolantThermostat" }); } } - public virtual bool AdjustableAuxiliaryHeater + public virtual bool? AdjustableAuxiliaryHeater { get { return false; } } @@ -218,16 +225,16 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider get { return GetBool(new[] { "HVAC", "EngineWasteGasHeatExchanger" }); } } - public virtual bool SeparateAirDistributionDucts + public virtual bool? SeparateAirDistributionDucts { get { return false; } } - public virtual bool WaterElectricHeater + public virtual bool? WaterElectricHeater { get { return false; } } - public virtual bool AirElectricHeater + public virtual bool? AirElectricHeater { get { return false; } } @@ -248,14 +255,15 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #region Implementation of IBusAuxiliariesDeclarationData - + public override IList<string> SteeringPumpTechnology { get { return null; } } public override IElectricConsumersDeclarationData ElectricConsumers { - get { + get + { return this; } } @@ -264,7 +272,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider //public override IPneumaticConsumersDeclarationData PneumaticConsumers { get { return null; } } - public override BusHVACSystemConfiguration SystemConfiguration + public override BusHVACSystemConfiguration? SystemConfiguration { get { return BusHVACSystemConfigurationHelper.Parse(GetString(XMLNames.Bus_SystemConfiguration)); } } @@ -284,7 +292,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider get { return GetDouble(XMLNames.Bus_AuxiliaryHeaterPower).SI<Watt>(); } } - public override bool DoubleGlazing + public override bool? DoubleGlazing { get { return GetBool(XMLNames.Bus_DoubleGlazing); } } @@ -294,12 +302,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider get { return GetBool(XMLNames.Bus_HeatPump); } } - public override bool AdjustableCoolantThermostat + public override bool? AdjustableCoolantThermostat { get { return GetBool(new[] { "HVAC", XMLNames.Bus_AdjustableCoolantThermostat }); } } - public override bool AdjustableAuxiliaryHeater + public override bool? AdjustableAuxiliaryHeater { get { return GetBool(XMLNames.Bus_AdjustableAuxiliaryHeater); } } @@ -309,7 +317,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider get { return false; } } - public override bool SeparateAirDistributionDucts + public override bool? SeparateAirDistributionDucts { get { return GetBool(XMLNames.Bus_SeparateAirDistributionDucts); } } @@ -318,15 +326,15 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #region Implementation of IElectricConsumersDeclarationData - public virtual bool InteriorLightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Interiorlights }); } } + public virtual bool? InteriorLightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Interiorlights }); } } - public virtual bool DayrunninglightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Dayrunninglights }); } } + public virtual bool? DayrunninglightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Dayrunninglights }); } } - public virtual bool PositionlightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Positionlights }); } } + public virtual bool? PositionlightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Positionlights }); } } - public virtual bool HeadlightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Headlights }); } } + public virtual bool? HeadlightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Headlights }); } } - public virtual bool BrakelightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Brakelights }); } } + public virtual bool? BrakelightsLED { get { return GetBool(new[] { "LEDLights", XMLNames.Bus_Brakelights }); } } #endregion } @@ -344,39 +352,162 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider : base(vehicle, componentNode, sourceFile) { } + public override BusHVACSystemConfiguration? SystemConfiguration + { + get { return ElementExists(XMLNames.Bus_SystemConfiguration) + ? BusHVACSystemConfigurationHelper.Parse(GetString(XMLNames.Bus_SystemConfiguration)) : null; } + } + public override HeatPumpType? HeatPumpTypeDriverCompartment { - get { return HeatPumpTypeHelper.Parse(GetString(XMLNames.Bus_HeatPumpTypeDriver)); } + get + { + return ElementExists(XMLNames.Bus_HeatPumpTypeDriver) + ? HeatPumpTypeHelper.Parse(GetString(XMLNames.Bus_HeatPumpTypeDriver)) : null; + } } public override HeatPumpMode? HeatPumpModeDriverCompartment { - get { return HeatPumpModeHelper.Parse(GetString(XMLNames.Bus_HeatPumpModeDriver)); } + get + { + return ElementExists(XMLNames.Bus_HeatPumpModeDriver) + ? HeatPumpModeHelper.Parse(GetString(XMLNames.Bus_HeatPumpModeDriver)) : null; + } } public override HeatPumpType? HeatPumpTypePassengerCompartment { - get { return HeatPumpTypeHelper.Parse(GetString(XMLNames.Bus_HeatPumpTypePassenger)); } + get + { + return ElementExists(XMLNames.Bus_HeatPumpTypePassenger) + ? HeatPumpTypeHelper.Parse(GetString(XMLNames.Bus_HeatPumpTypePassenger)) : null; + } } public override HeatPumpMode? HeatPumpModePassengerCompartment { - get { return HeatPumpModeHelper.Parse(GetString(XMLNames.Bus_HeatPumpModePassenger)); } + get + { + return ElementExists(XMLNames.Bus_HeatPumpModePassenger) + ? HeatPumpModeHelper.Parse(GetString(XMLNames.Bus_HeatPumpModePassenger)) : null; + } + } + + public override Watt AuxHeaterPower + { + get + { + return ElementExists(XMLNames.Bus_AuxiliaryHeaterPower) + ? GetDouble(XMLNames.Bus_AuxiliaryHeaterPower).SI<Watt>() : null; + } + } + + public override bool? DoubleGlazing + { + get + { + return ElementExists(XMLNames.Bus_DoubleGlazing) + ? GetBool(XMLNames.Bus_DoubleGlazing) : (bool?)null; + } + } + + public override bool? AdjustableAuxiliaryHeater + { + get + { + return ElementExists(XMLNames.Bus_AdjustableAuxiliaryHeater) + ? GetBool(XMLNames.Bus_AdjustableAuxiliaryHeater) : (bool?)null; + } + } + + public override bool? SeparateAirDistributionDucts + { + get + { + return ElementExists(XMLNames.Bus_SeparateAirDistributionDucts) + ? GetBool(XMLNames.Bus_SeparateAirDistributionDucts) : (bool?)null; + } + } + + + public override bool? WaterElectricHeater + { + get + { + return ElementExists(XMLNames.Bus_WaterElectricHeater) + ? GetBool(XMLNames.Bus_WaterElectricHeater) : (bool?)null; + } + } + + public override bool? AirElectricHeater + { + get + { + return ElementExists(XMLNames.Bus_AirElectricHeater) + ? GetBool(XMLNames.Bus_AirElectricHeater) : (bool?)null; + } + } + + public override bool? OtherHeatingTechnology + { + get + { + return ElementExists(XMLNames.Bus_OtherHeatingTechnology) + ? GetBool(XMLNames.Bus_OtherHeatingTechnology) : (bool?)null; + } + } + + + public override bool? InteriorLightsLED + { + get + { + if (!ElementExists(XMLNames.Bus_Interiorlights)) + return null; + return GetBool(new[] { "LEDLights", XMLNames.Bus_Interiorlights }); + } } - public override bool WaterElectricHeater + public override bool? DayrunninglightsLED { - get { return GetBool(XMLNames.Bus_WaterElectricHeater); } + get + { + if (!ElementExists(XMLNames.Bus_Dayrunninglights)) + return null; + return GetBool(new[] { "LEDLights", XMLNames.Bus_Dayrunninglights }); + } } - public override bool AirElectricHeater + public override bool? PositionlightsLED { - get { return GetBool(XMLNames.Bus_AirElectricHeater); } + get + { + if (!ElementExists(XMLNames.Bus_Positionlights)) + return null; + return GetBool(new[] { "LEDLights", XMLNames.Bus_Positionlights }); + } } - public override bool OtherHeatingTechnology + public override bool? HeadlightsLED { - get { return GetBool(XMLNames.Bus_OtherHeatingTechnology); } + get + { + if (!ElementExists(XMLNames.Bus_Headlights)) + return null; + return GetBool(new[] { "LEDLights", XMLNames.Bus_Headlights }); + } + } + + public override bool? BrakelightsLED + { + get + { + if (!ElementExists(XMLNames.Bus_Brakelights)) + return null; + return GetBool(new[] { "LEDLights", XMLNames.Bus_Brakelights }); + } } + } } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs index d504f3488f..7ce1448b37 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs @@ -3,6 +3,7 @@ using System.Xml; using System.Xml.Linq; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Resources; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader; using TUGraz.VectoCore.Utils; @@ -310,6 +311,19 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public XMLDeclarationInterimStageBusComponentsDataProviderV28(IXMLDeclarationVehicleData vehicle, XmlNode componentNode, string sourceFile) : base(vehicle, componentNode, sourceFile) { } + + public override IAirdragDeclarationInputData AirdragInputData + { + get + { + if (!ElementExists(XMLNames.Component_AirDrag)) + return null; + + return _airdragInputData ?? (_airdragInputData = ComponentReader.AirdragInputData); + } + } + + public override IGearboxDeclarationInputData GearboxInputData { get { return null; } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs index a96c2b49b3..612adc0efc 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs @@ -1323,11 +1323,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public override IAdvancedDriverAssistantSystemDeclarationInputData ADAS { - get + get { - if(ADASNode != null) - return _adas ?? (_adas = ADASReader.ADASInputData); - return null; + if (ADASNode == null) + return null; + return _adas ?? (_adas = ADASReader.ADASInputData); } } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs index 7ee50889ef..781d75afc3 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs @@ -184,7 +184,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var busAux = completedVehicle.Components.BusAuxiliaries.HVACAux; if (mission.BusParameter.SeparateAirDistributionDuctsHVACCfg.Contains(hvacConfiguration) && - !completedVehicle.Components.BusAuxiliaries.HVACAux.SeparateAirDistributionDucts) { + !(bool)completedVehicle.Components.BusAuxiliaries.HVACAux.SeparateAirDistributionDucts) { throw new VectoException("Input parameter 'separate air distribution ducts' has to be set to 'true' for vehicle group '{0}' and HVAC configuration '{1}'", mission.BusParameter.BusGroup.GetClassNumber(), hvacConfiguration.GetName()); } @@ -301,15 +301,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter protected override bool VehicleHasElectricalConsumer(string consumerName, IBusAuxiliariesDeclarationData busAux) { - if (consumerName == "Day running lights LED bonus" && busAux.ElectricConsumers.DayrunninglightsLED) + if (consumerName == "Day running lights LED bonus" && (bool)busAux.ElectricConsumers.DayrunninglightsLED) return true; - if (consumerName == "Position lights LED bonus" && busAux.ElectricConsumers.PositionlightsLED) + if (consumerName == "Position lights LED bonus" && (bool)busAux.ElectricConsumers.PositionlightsLED) return true; - if (consumerName == "Brake lights LED bonus" && busAux.ElectricConsumers.BrakelightsLED) + if (consumerName == "Brake lights LED bonus" && (bool)busAux.ElectricConsumers.BrakelightsLED) return true; - if (consumerName == "Interior lights LED bonus" && busAux.ElectricConsumers.InteriorLightsLED) + if (consumerName == "Interior lights LED bonus" && (bool)busAux.ElectricConsumers.InteriorLightsLED) return true; - if (consumerName == "Headlights LED bonus" && busAux.ElectricConsumers.HeadlightsLED) + if (consumerName == "Headlights LED bonus" && (bool)busAux.ElectricConsumers.HeadlightsLED) return true; return false; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/CombinedBusAuxiliaries.cs b/VectoCore/VectoCore/InputData/Reader/Impl/CombinedBusAuxiliaries.cs index ae858ca918..43fefb4958 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/CombinedBusAuxiliaries.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/CombinedBusAuxiliaries.cs @@ -55,11 +55,11 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { #region Implementation of IElectricConsumersDeclarationData - public bool InteriorLightsLED { get; } - public bool DayrunninglightsLED { get; } - public bool PositionlightsLED { get; } - public bool HeadlightsLED { get; } - public bool BrakelightsLED { get; } + public bool? InteriorLightsLED { get; } + public bool? DayrunninglightsLED { get; } + public bool? PositionlightsLED { get; } + public bool? HeadlightsLED { get; } + public bool? BrakelightsLED { get; } #endregion @@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { #region Implementation of IHVACBusAuxiliariesDeclarationData - public BusHVACSystemConfiguration SystemConfiguration { get; } + public BusHVACSystemConfiguration? SystemConfiguration { get; } public HeatPumpType? HeatPumpTypeDriverCompartment { get; } public HeatPumpMode? HeatPumpModeDriverCompartment { get; } public HeatPumpType? HeatPumpTypePassengerCompartment { get; } @@ -81,15 +81,15 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { public ACCompressorType CompressorTypeDriver { get; } public ACCompressorType CompressorTypePassenger { get; } public Watt AuxHeaterPower { get; } - public bool DoubleGlazing { get; } + public bool? DoubleGlazing { get; } public bool HeatPump { get; } - public bool OtherHeatingTechnology { get; } - public bool AdjustableCoolantThermostat { get; } - public bool AdjustableAuxiliaryHeater { get; } + public bool? OtherHeatingTechnology { get; } + public bool? AdjustableCoolantThermostat { get; } + public bool? AdjustableAuxiliaryHeater { get; } public bool EngineWasteGasHeatExchanger { get; } - public bool SeparateAirDistributionDucts { get; } - public bool WaterElectricHeater { get; } - public bool AirElectricHeater { get; } + public bool? SeparateAirDistributionDucts { get; } + public bool? WaterElectricHeater { get; } + public bool? AirElectricHeater { get; } #endregion } diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 1a19121b3c..a801af87d5 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -240,7 +240,7 @@ namespace TUGraz.VectoCore.Models.Declaration get { return hvacMaxCoolingPower ?? (hvacMaxCoolingPower = new HVACCoolingPower()); } } - public static PerSecond VentilationRate(BusHVACSystemConfiguration hvacSystemConfig, bool heating) + public static PerSecond VentilationRate(BusHVACSystemConfiguration? hvacSystemConfig, bool heating) { switch (hvacSystemConfig) { diff --git a/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs b/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs index 3ad906a673..f320d5cf9b 100644 --- a/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs +++ b/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs @@ -12,18 +12,18 @@ namespace TUGraz.VectoCore.Models.Declaration { private static HVACLookup DriverCoolingPower = new HVACLookup(".Buses.HVACCoolingPowerDriver.csv"); private static HVACLookup PassengerCoolingPower = new HVACLookup(".Buses.HVACCoolingPowerPassenger.csv"); - public Watt DriverMaxCoolingPower(BusHVACSystemConfiguration configuration, MissionType mission) + public Watt DriverMaxCoolingPower(BusHVACSystemConfiguration? configuration, MissionType mission) { return DriverCoolingPower.Lookup(configuration, mission).SI<Watt>(); } - public Watt PassengerMaxCoolingPower(BusHVACSystemConfiguration configuration, MissionType mission, CubicMeter volume) + public Watt PassengerMaxCoolingPower(BusHVACSystemConfiguration? configuration, MissionType mission, CubicMeter volume) { return PassengerCoolingPower.Lookup(configuration, mission).SI<WattPerCubicMeter>() * volume; } - private class HVACLookup : LookupData<BusHVACSystemConfiguration, MissionType, double>{ + private class HVACLookup : LookupData<BusHVACSystemConfiguration?, MissionType, double>{ public HVACLookup(string resource) { ResourceId = DeclarationData.DeclarationDataResourcePrefix + resource; diff --git a/VectoCore/VectoCore/Models/Declaration/Mission.cs b/VectoCore/VectoCore/Models/Declaration/Mission.cs index 3b45a86d40..59dee51957 100644 --- a/VectoCore/VectoCore/Models/Declaration/Mission.cs +++ b/VectoCore/VectoCore/Models/Declaration/Mission.cs @@ -119,7 +119,7 @@ namespace TUGraz.VectoCore.Models.Declaration // #### HVAC Model Parameters - public BusHVACSystemConfiguration HVACConfiguration { get; internal set; } + public BusHVACSystemConfiguration? HVACConfiguration { get; internal set; } public Watt HVACAuxHeaterPower { get; internal set; } @@ -157,7 +157,7 @@ namespace TUGraz.VectoCore.Models.Declaration public Meter EntranceHeight { get; set; } public VehicleCode? VehicleCode { get; set; } public FloorType FloorType { get; set; } - public IList<BusHVACSystemConfiguration> SeparateAirDistributionDuctsHVACCfg { get; set; } + public IList<BusHVACSystemConfiguration?> SeparateAirDistributionDuctsHVACCfg { get; set; } } diff --git a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusSanityCheckTests.cs b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusSanityCheckTests.cs index 872c091075..1f2bc9e3c0 100644 --- a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusSanityCheckTests.cs +++ b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusSanityCheckTests.cs @@ -112,7 +112,7 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus //}, messageContains: "Input parameter 'separate air distribution ducts' has to be set to 'true' for vehicle group "); } - private static XmlReader GetModifiedXML(string completedJob, BusHVACSystemConfiguration hvacConfig, bool separateDucts) + private static XmlReader GetModifiedXML(string completedJob, BusHVACSystemConfiguration? hvacConfig, bool separateDucts) { var completedXML = new XmlDocument(); completedXML.Load(completedJob); diff --git a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.8/vecto_vehicle-stage_input_only_component_nullable_entries.xml b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.8/vecto_vehicle-stage_input_only_component_nullable_entries.xml index 8bceb88f42..554834a7ac 100644 --- a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.8/vecto_vehicle-stage_input_only_component_nullable_entries.xml +++ b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.8/vecto_vehicle-stage_input_only_component_nullable_entries.xml @@ -1 +1 @@ -<?xml version="1.0" encoding="UTF-8"?> <tns:VectoInputDeclaration schemaVersion="2.8" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0" xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.3" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xmlns:di="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob E:\VECTO_DEV\fk_vecto-dev\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd"> <v2.0:Vehicle id="VEH-1234567890" xsi:type="InterimStageInputType" > <Manufacturer>Some Manufacturer 3</Manufacturer> <ManufacturerAddress>Some Manufacturer Address 3</ManufacturerAddress> <VIN>VEH-1234567890</VIN> <Date>2020-01-09T11:00:00Z</Date> <StateOfCompletion>incomplete</StateOfCompletion> <ADAS> <v2.3:EngineStopStart>true</v2.3:EngineStopStart> <v2.3:EcoRollWithoutEngineStop>false</v2.3:EcoRollWithoutEngineStop> <v2.3:EcoRollWithEngineStop>true</v2.3:EcoRollWithEngineStop> <v2.3:PredictiveCruiseControl>1,2,3</v2.3:PredictiveCruiseControl> </ADAS> <Components xsi:type="CompletedVehicleComponentsDeclarationType"> <Auxiliaries> <Data xsi:type="CompletedVehicleAuxiliaryDataDeclarationType"> <ElectricSystem> <LEDLights> <Headlights>true</Headlights> </LEDLights> </ElectricSystem> <HVAC> <AuxiliaryHeaterPower>20</AuxiliaryHeaterPower> </HVAC> </Data> </Auxiliaries> </Components> </v2.0:Vehicle> </tns:VectoInputDeclaration> \ No newline at end of file +<?xml version="1.0" encoding="UTF-8"?> <tns:VectoInputDeclaration schemaVersion="2.8" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0" xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.3" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xmlns:di="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob E:\VECTO_DEV\fk_vecto-dev\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd"> <v2.0:Vehicle id="VEH-1234567890" xsi:type="InterimStageInputType" > <Manufacturer>Some Manufacturer 4</Manufacturer> <ManufacturerAddress>Some Manufacturer Address 4</ManufacturerAddress> <VIN>VEH-1234567894</VIN> <Date>2022-01-09T11:00:00Z</Date> <StateOfCompletion>incomplete</StateOfCompletion> <ADAS> <v2.3:EngineStopStart>true</v2.3:EngineStopStart> <v2.3:EcoRollWithoutEngineStop>false</v2.3:EcoRollWithoutEngineStop> <v2.3:EcoRollWithEngineStop>true</v2.3:EcoRollWithEngineStop> <v2.3:PredictiveCruiseControl>1,2,3</v2.3:PredictiveCruiseControl> </ADAS> <Components xsi:type="CompletedVehicleComponentsDeclarationType"> <Auxiliaries> <Data xsi:type="CompletedVehicleAuxiliaryDataDeclarationType"> <ElectricSystem> <LEDLights> </LEDLights> </ElectricSystem> <HVAC> </HVAC> </Data> </Auxiliaries> </Components> </v2.0:Vehicle> </tns:VectoInputDeclaration> \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index 3d826534af..92a912c391 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -4669,6 +4669,9 @@ <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersion2.8\vecto_vehicle-stage_input_only_certain_entries02-sample.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersion2.8\vecto_vehicle-stage_input_only_component_nullable_entries.xml"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersion2.8\vecto_vehicle-stage_input_only_mandatory_entries.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> diff --git a/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs b/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs index e36d08f925..ef53b49fc6 100644 --- a/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLMultistageBusInputDataTest.cs @@ -19,6 +19,7 @@ namespace TUGraz.VectoCore.Tests.XML const string VehicleInterimStageInput = DirPath + "vecto_vehicle-stage_input_full-sample.xml"; const string VehicleExemptedInterimStageInput = DirPath + "vecto_vehicle-exempted_input_full-sample.xml"; const string VehicleExemptedMandatoryOnly = DirPath + "vecto_vehicle-exempted_input_only_mandatory_entries.xml"; + const string VehicleComponentsEntriesNullable = DirPath + "vecto_vehicle-stage_input_only_component_nullable_entries.xml"; [OneTimeSetUp] @@ -156,6 +157,7 @@ namespace TUGraz.VectoCore.Tests.XML Assert.AreEqual("Some Manufacturer Address 3", vehicle.ManufacturerAddress); Assert.AreEqual("VEH-1234567891", vehicle.VIN); Assert.AreEqual(DateTime.Parse("2021-01-09T11:00:00Z").ToUniversalTime(), vehicle.Date); + Assert.AreEqual(StateOfCompletion.incomplete, vehicle.StateOfCompletion); Assert.AreEqual(null, vehicle.Model); Assert.AreEqual(null, vehicle.LegislativeClass); @@ -169,5 +171,61 @@ namespace TUGraz.VectoCore.Tests.XML Assert.AreEqual(null, vehicle.Height); Assert.AreEqual(null, vehicle.Components); } + + [TestCase] + public void TestNullableComponentEntriesInput() + { + var reader = XmlReader.Create(VehicleComponentsEntriesNullable); + var inputDataProvider = xmlInputReader.CreateDeclaration(reader); + var vehicle = inputDataProvider.JobInputData.Vehicle; + + + Assert.AreEqual("VEH-1234567890", vehicle.Identifier); + Assert.AreEqual("Some Manufacturer 4", vehicle.Manufacturer); + Assert.AreEqual("Some Manufacturer Address 4", vehicle.ManufacturerAddress); + Assert.AreEqual("VEH-1234567894", vehicle.VIN); + Assert.AreEqual(DateTime.Parse("2022-01-09T11:00:00Z").ToUniversalTime(), vehicle.Date); + Assert.AreEqual(StateOfCompletion.incomplete, vehicle.StateOfCompletion); + + Assert.AreEqual(null, vehicle.Model); + Assert.AreEqual(null, vehicle.LegislativeClass); + Assert.AreEqual(null, vehicle.CurbMassChassis); + Assert.AreEqual(null, vehicle.GrossVehicleMassRating); + Assert.AreEqual(null, vehicle.RegisteredClass); + Assert.AreEqual(null, vehicle.NumberOfPassengersLowerDeck); + Assert.AreEqual(null, vehicle.NumberOfPassengersUpperDeck); + Assert.AreEqual(null, vehicle.VehicleCode); + Assert.AreEqual(null, vehicle.LowEntry); + Assert.AreEqual(null, vehicle.Height); + + Assert.AreEqual(true, vehicle.ADAS.EngineStopStart); + Assert.AreEqual(EcoRollType.WithEngineStop, vehicle.ADAS.EcoRoll); + Assert.AreEqual(PredictiveCruiseControlType.Option_1_2_3, vehicle.ADAS.PredictiveCruiseControl); + Assert.AreEqual(null, vehicle.ADAS.ATEcoRollReleaseLockupClutch); + + Assert.AreEqual(null, vehicle.Components.AirdragInputData); + + var electricConsumer = vehicle.Components.BusAuxiliaries.ElectricConsumers; + Assert.AreEqual(null, electricConsumer.InteriorLightsLED); + Assert.AreEqual(null, electricConsumer.DayrunninglightsLED); + Assert.AreEqual(null, electricConsumer.PositionlightsLED); + Assert.AreEqual(null, electricConsumer.BrakelightsLED); + Assert.AreEqual(null, electricConsumer.HeadlightsLED); + + var hvacAux = vehicle.Components.BusAuxiliaries.HVACAux; + Assert.AreEqual(null, hvacAux.SystemConfiguration); + Assert.AreEqual(null, hvacAux.HeatPumpTypeDriverCompartment); + Assert.AreEqual(null, hvacAux.HeatPumpModeDriverCompartment); + Assert.AreEqual(null, hvacAux.HeatPumpTypePassengerCompartment); + Assert.AreEqual(null, hvacAux.HeatPumpModePassengerCompartment); + + Assert.AreEqual(null, hvacAux.AuxHeaterPower); + Assert.AreEqual(null, hvacAux.DoubleGlazing); + Assert.AreEqual(null, hvacAux.AdjustableAuxiliaryHeater); + Assert.AreEqual(null, hvacAux.SeparateAirDistributionDucts); + Assert.AreEqual(null, hvacAux.WaterElectricHeater); + Assert.AreEqual(null, hvacAux.AirElectricHeater); + Assert.AreEqual(null, hvacAux.OtherHeatingTechnology); + } } } -- GitLab