Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Select Git revision
  • bc88f207acdfbfde24c91390c4639ea76ac42e0d
  • stable default
  • amdm3/develop
  • feat-fchv-singlebus
  • powertrains-multiple-axles
  • issue-1039
  • amdm3/main
  • test/nuget_publish
  • IEPC-experiments
  • amdm2/main
  • amdm2/develop
  • aptngearbox-not-auto
  • playground
  • official/main
  • official/develop
  • issue-templates
  • pdf-reports
  • HEV-timeruns-dev
  • timerun-empower-hybrids
  • timerun-pwheel-hybrids
  • Release/v5.0.3
  • Release/v5.0.1
  • Release/5.0.0-RC
  • Nuget/v0.11.4-DEV
  • Release/v0.11.4-DEV
  • Release/4.3.4-DEV
  • Release/4.3.3
  • Release/4.3.2-RC
  • Release/v4.3.0-DEV
  • Release/4.2.7
  • XMLConverterTool/4.2.6.0
  • Release/4.2.6-RC
  • Release/v4.2.5
  • Release/v4.2.3
  • Release/v4.2.2.3539-RC
  • Release/v4.2.1.3469
  • Release/v0.11.2.3456-DEV
  • Release/v4.2.0.3448-RC
  • Release/v4.1.3.3415
  • Release/v4.1.1.3413
40 results

cDeclaration.vb

Blame
  • Forked from VECTO / VECTO Sim
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    cDeclaration.vb 48.10 KiB
    ' Copyright 2014 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 System.Collections.Generic
    Imports iTextSharp.text.pdf
    Imports System.IO
    Imports iTextSharp.text
    
    Public Class cDeclaration
    	Public CurrentMission As cMission
    	Public CurrentLoading As tLoading
    	Public Missions As Dictionary(Of tMission, cMission)
    	Public SegmentTable As cSegmentTable
    	Public SegRef As cSegmentTableEntry
    
    	Public Const SSspeed As Single = 5
    	Public Const SStime As Single = 5
    	Public Const SSdelay As Single = 5
    	Public Const LACa As Single = -0.5
    	Public Const LACvmin As Single = 50
    	Public Const Overspeed As Single = 5
    	Public Const Underspeed As Single = 5
    	Public Const ECvmin As Single = 50
    
    	Public Const TqResv As Single = 20
    	Public Const TqResvStart As Single = 20
    	Public Const StartSpeed As Single = 2
    	Public Const StartAcc As Single = 0.6
    	Public Const GbInertia As Single = 0
    
    	Public Const RRCTr As Single = 0.00555
    	Public Const FzISOTr As Single = 37500
    	Public Const TyreTr As String = "385/65 R22.5"
    
    	Public Const AirDensity As Single = 1.188
    	Public Const FuelDens As Single = 0.832
    	Public Const CO2perFC As Single = 3.16
    
    	Public Const AuxESeff As Single = 0.7
    
    	Public Const Vwind As Single = 3.0
    
    	Private lPT1nU As List(Of Single)
    	Private lPT1 As List(Of Single)
    	Private PT1dim As Integer
    
    	Public WHTCcorrFactor As Single
    
    	Public Report As cReport
    
    	Public AuxTechs As Dictionary(Of tAux, List(Of String))
    	Public AuxPower As Dictionary(Of String, Single)
    
    	Private AuxFanPower As Dictionary(Of String, Dictionary(Of tMission, Single))
    
    	Private AuxSteerPumpPower As Dictionary(Of String, Dictionary(Of tMission, Single()))
    	Private AuxSteepPumpFactors As Dictionary(Of String, Single())
    
    	Private AuxHVACPower As Dictionary(Of String, Dictionary(Of tMission, Single))
    
    	Private AuxESbase As Dictionary(Of tMission, Single)
    	Public AuxESpower As Dictionary(Of String, Dictionary(Of tMission, Single))
    
    	Private AuxPSpower As Dictionary(Of String, Dictionary(Of tMission, Single))
    
    	Private Wheels As Dictionary(Of String, cWheel)
    	Private Rims As Dictionary(Of String, cRim)
    
    	Private VCDVvehClassParam As Dictionary(Of String, List(Of Single))
    
    	Public Const UpshiftAfterDownshiftDelay As Single = 10
    
    	Public Const DownshiftAfterUpshiftDelay As Single = 10
    
    	Public Const UpshiftMinAcceleration As Single = 0.1
    
    	Public Function VCDVparamPerCat(ByVal VehCat As tVehCat) As List(Of Single)
    		Select Case VehCat
    			Case tVehCat.Citybus, tVehCat.Coach, tVehCat.InterurbanBus
    				Return VCDVvehClassParam("CoachBus")
    			Case tVehCat.Tractor
    				Return VCDVvehClassParam("TractorSemitrailer")
    			Case Else 'tVehCat.RigidTruck, tVehCat.Undef
    				Return VCDVvehClassParam("RigidSolo")
    		End Select
    	End Function
    
    	Public Function Init() As Boolean
    
    		Dim file As New cFile_V3
    		Dim mc0 As cMission
    		Dim mt0 As tMission
    		Dim ste0 As cSegmentTableEntry
    		Dim line As String()
    		Dim i As Integer
    		Dim a As Integer
    		Dim s0 As String
    		Dim TrS As Single
    		Dim TrA As Single
    		Dim stl As String()
    		Dim First As Boolean
    
    		Dim BodyTrWeightList As List(Of String)
    		Dim LoadingList As List(Of String)
    		Dim AxleShares As List(Of String)
    		Dim AxleSharesTr As List(Of String)
    		Dim l0 As List(Of Single)
    
    		Dim at0 As List(Of String)
    		Dim AuxPower0 As Dictionary(Of tMission, Single)
    		Dim STEpower0 As Dictionary(Of tMission, Single())
    
    		Dim w0 As cWheel
    		Dim r0 As cRim
    
    		'Initialize
    		Missions = New Dictionary(Of tMission, cMission)
    		SegmentTable = New cSegmentTable
    
    		If Not Directory.Exists(MyDeclPath) Then
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config!")
    			Return False
    		End If
    
    		'Init Missionlist
    		mc0 = New cMission
    		mc0.MissionID = tMission.LongHaul
    		mc0.NameStr = "Long Haul"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Long_Haul.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.RegionalDelivery
    		mc0.NameStr = "Regional Delivery"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Regional_Delivery.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.UrbanDelivery
    		mc0.NameStr = "Urban Delivery"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Urban_Delivery.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.MunicipalUtility
    		mc0.NameStr = "Municipal Utility"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Municipal_Utility.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.Construction
    		mc0.NameStr = "Construction"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Construction.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.HeavyUrban
    		mc0.NameStr = "HeavyUrban"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Citybus_Heavy_Urban.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.Urban
    		mc0.NameStr = "Urban"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Citybus_Urban.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.Suburban
    		mc0.NameStr = "Suburban"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Citybus_Suburban.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.Interurban
    		mc0.NameStr = "Interurban"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Interurban_Bus.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		mc0 = New cMission
    		mc0.MissionID = tMission.Coach
    		mc0.NameStr = "Coach"
    		mc0.CyclePath = MyDeclPath & "MissionCycles\Coach.vdri"
    		Missions.Add(mc0.MissionID, mc0)
    		SegmentTable.MissionList.Add(mc0.MissionID)
    
    		'Cross Wind Correction parameters  (BEFORE Segment Table!)
    		VCDVvehClassParam = New Dictionary(Of String, List(Of Single))
    
    		If Not file.OpenRead(MyDeclPath & "VCDV\paramerters.csv") Then
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (VCDV\paramerters)!")
    			Return False
    		End If
    
    		'Skip Header
    		file.ReadLine()
    
    		Try
    
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				VCDVvehClassParam.Add(line(0), New List(Of Single))
    				VCDVvehClassParam(line(0)).Add(line(1))
    				VCDVvehClassParam(line(0)).Add(line(2))
    				VCDVvehClassParam(line(0)).Add(line(3))
    			Loop
    
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Error in VCDV\paramerters! " & ex.Message)
    			Return False
    		End Try
    
    		file.Close()
    
    		'WHTC-Weighting-Factors.csv
    		If Not file.OpenRead(MyDeclPath & "WHTC-Weighting-Factors.csv") Then
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (WHTC-Weighting-Factors.csv)!")
    			Return False
    		End If
    
    		'Skip Header
    		file.ReadLine()
    
    		Try
    
    			For i = 0 To 2
    				If file.EndOfFile Then Throw New Exception("Unexpected end of file.")
    				line = file.ReadLine
    
    				a = 0
    				For Each mt0 In Missions.Keys
    					a += 1
    					mc0 = Missions(mt0)
    					Select Case i
    						Case 0
    							mc0.WHTCWF = New Dictionary(Of tWHTCpart, Single)
    							mc0.WHTCWF.Add(tWHTCpart.Urban, line(a) / 100)
    						Case 1
    							mc0.WHTCWF.Add(tWHTCpart.Rural, line(a) / 100)
    						Case Else '2
    							mc0.WHTCWF.Add(tWHTCpart.Motorway, line(a) / 100)
    					End Select
    				Next
    			Next
    
    
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Error in WHTC-Weighting-Factors! " & ex.Message)
    			Return False
    		End Try
    
    		file.Close()
    
    		'Segment Table
    		If Not file.OpenRead(MyDeclPath & "SegmentTable.csv") Then
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Segment Table)!")
    			Return False
    		End If
    
    		Try
    			'Header
    			line = file.ReadLine
    
    			'Data
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    
    				If CBool(line(0)) Then
    					ste0 = New cSegmentTableEntry
    					BodyTrWeightList = New List(Of String)
    					LoadingList = New List(Of String)
    					AxleShares = New List(Of String)
    					AxleSharesTr = New List(Of String)
    
    					ste0.VehCat = ConvVehCat(line(1))
    
    					If ste0.VehCat = tVehCat.Undef Then
    						file.Close()
    						GUImsg(tMsgID.Err,
    								"Failed to load Declaration Config (Segment Table)! " & line(1) & " is no valid Vehicle Configuration.")
    						Return False
    					End If
    
    					ste0.AxleConf = ConvAxleConf(line(2))
    
    					If ste0.AxleConf = tAxleConf.Undef Then
    						file.Close()
    						GUImsg(tMsgID.Err,
    								"Failed to load Declaration Config (Segment Table)! " & line(2) & " is no valid Axle Configuration.")
    						Return False
    					End If
    
    					ste0.MinGVW = CSng(line(3))
    					ste0.MaxGVW = CSng(line(4))
    					ste0.HDVclass = line(5)
    					ste0.VACCfile = MyDeclPath & "VACC\" & line(6)
    
    					For Each mt0 In SegmentTable.MissionList
    						If mt0 = tMission.LongHaul Then
    							s0 = line(7)
    						Else
    							s0 = line(8)
    						End If
    						If VCDVvehClassParam.ContainsKey(s0) Then ste0.VCDVparam.Add(mt0, VCDVvehClassParam(s0))
    					Next
    
    					AxleShares.Add(line(9))	   'Long Haul
    					For Each mt0 In SegmentTable.MissionList 'Other cycles
    						If mt0 <> tMission.LongHaul Then AxleShares.Add(line(10))
    					Next
    
    					AxleSharesTr.Add(line(11))	 'Long Haul
    					For Each mt0 In SegmentTable.MissionList 'Other cycles
    						If mt0 <> tMission.LongHaul Then AxleSharesTr.Add(line(12))
    					Next
    
    					ste0.TrailerOnlyInLongHaul = (Trim(line(11)) <> "-" And Trim(line(12)) = "-" And ste0.VehCat = tVehCat.RigidTruck)
    
    					i = 12
    					For Each mt0 In SegmentTable.MissionList
    						i += 1
    						ste0.UseMission.Add(CBool(line(i)))
    					Next
    					For Each mt0 In SegmentTable.MissionList
    						i += 1
    						BodyTrWeightList.Add(line(i))
    					Next
    					For Each mt0 In SegmentTable.MissionList
    						i += 1
    						LoadingList.Add(line(i))
    					Next
    
    					For i = 0 To SegmentTable.MissionList.Count - 1
    						If ste0.UseMission(i) Then
    							ste0.Missions.Add(SegmentTable.MissionList(i))
    							ste0.Loading.Add(SegmentTable.MissionList(i), LoadingList(i))
    							ste0.BodyTrWeight.Add(SegmentTable.MissionList(i), BodyTrWeightList(i))
    
    							l0 = New List(Of Single)
    							For Each s0 In AxleShares(i).Split("/")
    								l0.Add(CSng(s0))
    							Next
    							ste0.AxleShares.Add(SegmentTable.MissionList(i), l0)
    
    							l0 = New List(Of Single)
    
    							If AxleSharesTr(i) = "-" Then
    								TrS = 0
    								TrA = 0
    							Else
    								TrS = AxleSharesTr(i).Split("/")(0)
    								TrA = AxleSharesTr(i).Split("/")(1)
    							End If
    
    
    							For a = 1 To TrA
    								l0.Add(TrS / TrA)
    							Next
    
    							ste0.AxleSharesTr.Add(SegmentTable.MissionList(i), l0)
    
    						End If
    					Next
    
    					SegmentTable.SegTableEntries.Add(ste0)
    
    				End If
    
    			Loop
    
    			file.Close()
    
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Segment Table)! " & ex.Message)
    			Return False
    		End Try
    
    
    		'Aux
    		AuxTechs = New Dictionary(Of tAux, List(Of String))
    
    		'Aux - Fan
    		AuxFanPower = New Dictionary(Of String, Dictionary(Of tMission, Single))
    		Try
    			If Not file.OpenRead(MyDeclPath & "VAUX\Fan-Tech.csv") Then
    				GUImsg(tMsgID.Err, "Failed to load Declaration Config (Fan aux config)!")
    				Return False
    			End If
    
    			'Skip Header
    			file.ReadLine()
    			at0 = New List(Of String)
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				at0.Add(line(0))
    				AuxPower0 = New Dictionary(Of tMission, Single)
    				i = 0
    				For Each mt0 In SegmentTable.MissionList
    					i += 1
    					AuxPower0.Add(mt0, line(i))
    				Next
    				AuxFanPower.Add(line(0), AuxPower0)
    			Loop
    			AuxTechs.Add(tAux.Fan, at0)
    			file.Close()
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Fan aux config)!" & ex.Message)
    			Return False
    		End Try
    
    		'Aux - Steering Pump
    		AuxSteerPumpPower = New Dictionary(Of String, Dictionary(Of tMission, Single()))
    		AuxSteepPumpFactors = New Dictionary(Of String, Single())
    		Try
    			If Not file.OpenRead(MyDeclPath & "VAUX\SP-Tech.csv") Then
    				GUImsg(tMsgID.Err, "Failed to load Declaration Config (Steering pump config)!")
    				Return False
    			End If
    			'Skip Header
    			file.ReadLine()
    			at0 = New List(Of String)
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				at0.Add(line(0))
    				AuxSteepPumpFactors.Add(line(0), New Single() {CSng(line(1)), CSng(line(2)), CSng(line(3)), CSng(line(4))})
    			Loop
    			file.Close()
    			If Not file.OpenRead(MyDeclPath & "VAUX\SP-Table.csv") Then
    				GUImsg(tMsgID.Err, "Failed to load Declaration Config (Steering pump config)!")
    				Return False
    			End If
    			'Skip Header
    			file.ReadLine()
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				STEpower0 = New Dictionary(Of tMission, Single())
    				i = 0
    				For Each mt0 In SegmentTable.MissionList
    					i += 1
    					If line(i) = "0" Then
    						STEpower0.Add(mt0, New Single() {0})
    					Else
    						stl = line(i).Split("/")
    						STEpower0.Add(mt0, New Single() {CSng(stl(0)), CSng(stl(1)), CSng(stl(2)), CSng(stl(3))})
    					End If
    				Next
    				AuxSteerPumpPower.Add(line(0), STEpower0)
    			Loop
    			AuxTechs.Add(tAux.SteerPump, at0)
    			file.Close()
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Steering pump config)!" & ex.Message)
    			Return False
    		End Try
    
    		'Aux - HVAC
    		AuxHVACPower = New Dictionary(Of String, Dictionary(Of tMission, Single))
    		Try
    			If Not file.OpenRead(MyDeclPath & "VAUX\HVAC-Table.csv") Then
    				GUImsg(tMsgID.Err, "Failed to load Declaration Config (HVAC config)!")
    				Return False
    			End If
    
    			'Skip Header
    			file.ReadLine()
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				AuxPower0 = New Dictionary(Of tMission, Single)
    				i = 0
    				For Each mt0 In SegmentTable.MissionList
    					i += 1
    					AuxPower0.Add(mt0, line(i))
    				Next
    				AuxHVACPower.Add(line(0), AuxPower0)
    			Loop
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (HVAC config)!" & ex.Message)
    			Return False
    		End Try
    
    		at0 = New List(Of String)
    		at0.Add("Default")
    		AuxTechs.Add(tAux.HVAC, at0)
    
    		'Aux - Electric System
    		AuxESbase = New Dictionary(Of tMission, Single)
    		AuxESpower = New Dictionary(Of String, Dictionary(Of tMission, Single))
    		Try
    			If Not file.OpenRead(MyDeclPath & "VAUX\ES-Tech.csv") Then
    				GUImsg(tMsgID.Err, "Failed to load Declaration Config (Electric system config)!")
    				Return False
    			End If
    
    			'Skip Header
    			file.ReadLine()
    			First = True
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				AuxPower0 = New Dictionary(Of tMission, Single)
    				i = 0
    				For Each mt0 In SegmentTable.MissionList
    					i += 1
    					AuxPower0.Add(mt0, line(i))
    				Next
    				If First Then
    					AuxESbase = AuxPower0
    					First = False
    				Else
    					AuxESpower.Add(line(0), AuxPower0)
    				End If
    			Loop
    			file.Close()
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Electric system config)!" & ex.Message)
    			Return False
    		End Try
    		at0 = New List(Of String)
    		at0.Add("Custom Technology List")
    		AuxTechs.Add(tAux.ElectricSys, at0)
    
    
    		'Aux - Pneumatic System
    		AuxPSpower = New Dictionary(Of String, Dictionary(Of tMission, Single))
    		Try
    			If Not file.OpenRead(MyDeclPath & "VAUX\PS-Table.csv") Then
    				GUImsg(tMsgID.Err, "Failed to load Declaration Config (Pneumatic system config)!")
    				Return False
    			End If
    
    			'Skip Header
    			file.ReadLine()
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				AuxPower0 = New Dictionary(Of tMission, Single)
    				i = 0
    				For Each mt0 In SegmentTable.MissionList
    					i += 1
    					AuxPower0.Add(mt0, line(i))
    				Next
    				AuxPSpower.Add(line(0), AuxPower0)
    			Loop
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Pneumatic system config)!" & ex.Message)
    			Return False
    		End Try
    
    		at0 = New List(Of String)
    		at0.Add("Default")
    		AuxTechs.Add(tAux.PneumSys, at0)
    
    		'Default PT1 values
    		lPT1nU = New List(Of Single)
    		lPT1 = New List(Of Single)
    		PT1dim = -1
    
    		If Not file.OpenRead(MyDeclPath & "PT1.csv") Then
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (PT1 table)!")
    			Return False
    		End If
    
    		'Skip Header
    		file.ReadLine()
    
    		Try
    
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    				PT1dim += 1
    				lPT1nU.Add(CDbl(line(0)))
    				lPT1.Add(CDbl(line(1)))
    			Loop
    
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (PT1 table)!" & ex.Message)
    			Return False
    		End Try
    
    		file.Close()
    
    
    		'Wheels
    		Wheels = New Dictionary(Of String, cWheel)
    
    		If Not file.OpenRead(MyDeclPath & "wheels.csv") Then
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Wheels table)!")
    			Return False
    		End If
    
    		'Skip Header
    		file.ReadLine()
    
    		Try
    
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    
    				w0 = New cWheel
    				w0.Inertia = CSng(line(1))
    				w0.Diam = CSng(line(2))
    				w0.SizeA = (line(3) = "a")
    
    				Wheels.Add(line(0), w0)
    
    			Loop
    
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Wheels table)!" & ex.Message)
    			Return False
    		End Try
    
    		file.Close()
    
    
    		'Rims
    		Rims = New Dictionary(Of String, cRim)
    
    		If Not file.OpenRead(MyDeclPath & "rims.csv") Then
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Rims table)!")
    			Return False
    		End If
    
    		'Skip Header
    		file.ReadLine()
    
    		Try
    
    			Do While Not file.EndOfFile
    				line = file.ReadLine
    
    				r0 = New cRim
    				r0.Fa = CSng(line(1))
    				r0.Fb = CSng(line(2))
    
    				Rims.Add(line(0), r0)
    
    			Loop
    
    		Catch ex As Exception
    			file.Close()
    			GUImsg(tMsgID.Err, "Failed to load Declaration Config (Rims table)!" & ex.Message)
    			Return False
    		End Try
    
    		file.Close()
    
    
    		GUImsg(tMsgID.Normal, "Declaration Config loaded.")
    
    		Return True
    	End Function
    
    	Public Function EngInertia(ByVal Displ As Single) As Single
    		Return 1.3 + 0.41 + 0.27 * (Displ / 1000)
    	End Function
    
    	Public Function TracInt(ByVal Gearbox As tGearbox) As Single
    		Select Case Gearbox
    			Case tGearbox.Manual
    				Return 2
    
    			Case tGearbox.SemiAutomatic
    				Return 1
    
    			Case Else 'tGearbox.Automatic
    				Return 0.8
    
    		End Select
    	End Function
    
    	Public Function SkipGears(ByVal Gearbox As tGearbox) As Boolean
    		If Gearbox = tGearbox.Automatic Then
    			Return False
    		Else
    			Return True
    		End If
    	End Function
    
    	Public Function ShiftInside(ByVal Gearbox As tGearbox) As Boolean
    		If Gearbox = tGearbox.SemiAutomatic Then
    			Return True
    		Else
    			Return False
    		End If
    	End Function
    
    	Public Function ShiftTime(ByVal Gearbox As tGearbox) As Single
    		Select Case Gearbox
    			Case tGearbox.Manual
    				Return 3
    
    			Case tGearbox.SemiAutomatic
    				Return 2
    
    			Case Else 'tGearbox.Automatic
    				Return 2
    
    		End Select
    	End Function
    
    	Public Function WheelsInertia(ByVal Wheel As String) As Single
    
    		If Wheels.ContainsKey(Wheel) Then
    			Return Wheels(Wheel).Inertia
    		Else
    			Return -1
    		End If
    	End Function
    
    	Public Function rdyn(ByVal Wheel As String, ByVal Rim As String) As Single
    		Dim F As Single
    		Dim w As cWheel
    
    		If Not Wheels.ContainsKey(Wheel) Then
    			Return -1
    		End If
    
    
    		If Not Rims.ContainsKey(Rim) Then
    			Return -1
    		End If
    
    		w = Wheels(Wheel)
    
    		If w.SizeA Then
    			F = Rims(Rim).Fa
    		Else
    			F = Rims(Rim).Fb
    		End If
    
    		Return (F * w.Diam) / (2 * Math.PI)
    	End Function
    
    	Public ReadOnly Property WheelsList As Dictionary(Of String, cWheel).KeyCollection
    		Get
    			Return Wheels.Keys
    		End Get
    	End Property
    
    	Public ReadOnly Property RimsList As Dictionary(Of String, cRim).KeyCollection
    		Get
    			Return Rims.Keys
    		End Get
    	End Property
    
    	Public Function ConvPicPath(ByVal HDVclass As String, ByVal LongHaul As Boolean) As String
    
    		Select Case HDVclass
    
    			Case 1, 2, 3
    				Return MyDeclPath & "Reports\4x2r.png"
    
    			Case 4
    				If LongHaul Then
    					Return MyDeclPath & "Reports\4x2rt.png"
    				Else
    					Return MyDeclPath & "Reports\4x2r.png"
    				End If
    
    			Case 5
    				Return MyDeclPath & "Reports\4x2tt.png"
    
    			Case 9
    				If LongHaul Then
    					Return MyDeclPath & "Reports\6x2rt.png"
    				Else
    					Return MyDeclPath & "Reports\6x2r.png"
    				End If
    
    			Case 10
    				Return MyDeclPath & "Reports\6x2tt.png"
    
    			Case Else
    				Return MyDeclPath & "Reports\Undef.png"
    
    		End Select
    	End Function
    
    
    	Public Function SetRef() As Boolean
    		Return SegmentTable.SetRef(SegRef, VEH.VehCat, VEH.AxleConf, VEH.MassMax)
    	End Function
    
    
    	''' <summary>
    	''' Init Vehicle for current mission. Must happen before setting loading in CalcInitLoad
    	''' </summary>
    	''' <param name="CycleIndex"></param>
    	''' <returns></returns>
    	''' <remarks></remarks>      
    	Public Function CalcInitCycle(ByVal CycleIndex As Integer) As Boolean
    
    		CurrentMission = Missions(SegRef.Missions(CycleIndex))
    
    		WHTCcorrFactor = CurrentMission.WHTCWF(tWHTCpart.Urban) * ENG.WHTCurban _
    						+ CurrentMission.WHTCWF(tWHTCpart.Rural) * ENG.WHTCrural _
    						+ CurrentMission.WHTCWF(tWHTCpart.Motorway) * ENG.WHTCmw
    
    
    		If Not VEH.DeclInitCycle Then Return False
    
    		Return True
    	End Function
    
    	''' <summary>
    	''' Set Loading. Mission-based initialisation (CalcInitCycle) must already be done before running this.
    	''' </summary>
    	''' <param name="Loading"></param>
    	''' <returns></returns>
    	''' <remarks></remarks>
    	Public Function CalcInitLoad(ByVal Loading As tLoading) As Boolean
    		Dim MsgSrc As String
    		Dim U As Single
    		Dim F As Single
    		Dim B As Single
    		Dim S As Single
    		Dim fU As Single
    		Dim fF As Single
    		Dim fB As Single
    		Dim fS As Single
    		Dim sl As Single()
    		Dim Result As Boolean
    		Dim ESsum As Single
    		Dim EStech As String
    
    		MsgSrc = "DeclInit"
    
    		CurrentLoading = Loading
    
    		If Not VEH.DeclInitLoad(Loading) Then Return False
    
    		'AuxPower
    		AuxPower = New Dictionary(Of String, Single)
    
    		Result = True
    
    		'Fan
    		Try
    			AuxPower.Add(sKey.AUX.Fan, AuxFanPower(VEC.AuxPaths(sKey.AUX.Fan).TechStr)(CurrentMission.MissionID) / 1000)
    		Catch ex As Exception
    			WorkerMsg(tMsgID.Err, "Failed to initialise fan! " & ex.Message, MsgSrc)
    			Result = False
    		End Try
    
    		'Steering pump
    		Try
    			sl = AuxSteerPumpPower(SegRef.HDVclass)(CurrentMission.MissionID)
    			U = sl(0)
    			F = sl(1)
    			B = sl(2)
    			S = sl(3)
    			sl = AuxSteepPumpFactors(VEC.AuxPaths(sKey.AUX.SteerPump).TechStr)
    			fU = sl(0)
    			fF = sl(1)
    			fB = sl(2)
    			fS = sl(3)
    			AuxPower.Add(sKey.AUX.SteerPump, (U * fU + F * fF + B * fB + S * fS) / 1000)
    		Catch ex As Exception
    			WorkerMsg(tMsgID.Err, "Failed to initialise steering pump! " & ex.Message, MsgSrc)
    			Result = False
    		End Try
    
    		'HVAC
    		Try
    			AuxPower.Add(sKey.AUX.HVAC, AuxHVACPower(SegRef.HDVclass)(CurrentMission.MissionID) / 1000)
    		Catch ex As Exception
    			WorkerMsg(tMsgID.Err, "Failed to initialise HVAC! " & ex.Message, MsgSrc)
    			Result = False
    		End Try
    
    		'Electric System
    		Try
    
    			ESsum = AuxESbase(CurrentMission.MissionID)
    
    			For Each EStech In VEC.EStechs
    
    				If Not AuxESpower.ContainsKey(EStech) Then
    					WorkerMsg(tMsgID.Err, "Electric system '" & EStech & "' is not supported! ", MsgSrc)
    					Result = False
    				End If
    
    				ESsum += AuxESpower(EStech)(CurrentMission.MissionID)
    
    			Next
    
    			AuxPower.Add(sKey.AUX.ElecSys, ESsum / (1000 * AuxESeff))
    
    		Catch ex As Exception
    			WorkerMsg(tMsgID.Err, "Failed to initialise electric system! " & ex.Message, MsgSrc)
    			Result = False
    		End Try
    
    
    		'PS
    		Try
    			AuxPower.Add(sKey.AUX.PneumSys, AuxPSpower(SegRef.HDVclass)(CurrentMission.MissionID))
    		Catch ex As Exception
    			WorkerMsg(tMsgID.Err, "Failed to initialise pneumatic system! " & ex.Message, MsgSrc)
    			Result = False
    		End Try
    
    
    		Return Result
    	End Function
    
    	Public Function PT1(ByVal nU As Single) As Single
    		Dim i As Int32
    
    		'Extrapolation for x < x(1)
    		If lPT1nU(0) >= nU Then
    			i = 1
    			GoTo lbInt
    		End If
    
    		i = 0
    		Do While lPT1nU(i) < nU And i < PT1dim
    			i += 1
    		Loop
    
    lbInt:
    		'Interpolation
    		Return (nU - lPT1nU(i - 1)) * (lPT1(i) - lPT1(i - 1)) / (lPT1nU(i) - lPT1nU(i - 1)) + lPT1(i - 1)
    	End Function
    
    	Public Sub ReportInit()
    
    		Report = New cReport
    
    		With Report
    			.Filepath = fFileWoExt(JobFile) & ".pdf"
    			.HDVclassStr = SegRef.HDVclass
    			.VehCat = SegRef.VehCat
    			.AxleConf = SegRef.AxleConf
    			.MassMaxStr = VEH.MassMax & "t"
    			.JobFile = fFILE(JobFile, True)
    			.DateStr = Now.ToString
    			.Creator = Lic.LicString
    			.EngStr = (ENG.Displ / 1000).ToString("0.0") & " l  " & Math.Round(ENG.Pmax, 0).ToString("#") & " kW"
    			.EngModelStr = ENG.ModelName
    			.GbxStr = GBX.GearCount & "-Speed " & GearboxConv(GBX.gs_Type)
    			.GbxModelStr = GBX.ModelName
    		End With
    	End Sub
    
    	Public Sub ReportAddCycle()
    		Dim mr As New cReport.cMissionResults
    
    		mr.MissionRef = CurrentMission
    
    		Report.CurrentMR = mr
    		Report.MissionResults.Add(mr)
    	End Sub
    
    	Public Sub ReportAddResults()
    		Dim lr As New cReport.cLoadingResults
    		Dim t1 As Integer
    		Dim t As Integer
    		Dim Vquer As Single
    		Dim sum As Double
    		Dim d As Double
    
    		t1 = MODdata.tDim
    
    		'Average Speed calculation
    		sum = 0
    		For t = 0 To t1
    			sum += MODdata.Vh.V(t)
    		Next
    		Vquer = 3.6 * sum / (t1 + 1)
    
    		With lr
    
    			.Loading = VEH.Loading / 1000
    			.Speed = Vquer
    			.FCkm = (100 * MODdata.FCavgFinal / Vquer) / (Cfg.FuelDens * 1000)
    			.CO2km = Cfg.CO2perFC * (MODdata.FCavgFinal / Vquer)
    			If VEH.Loading > 0 Then
    				.FCtkm = .FCkm / .Loading
    				.CO2tkm = .CO2km / .Loading
    			End If
    			.FCerror = MODdata.FCerror
    
    			d = 0
    			MODdata.Vh.AltIntp(d, True)
    			For t = 0 To t1
    				.ActualSpeed.Add(MODdata.Vh.V(t) * 3.6)
    				.TargetSpeed.Add(MODdata.Vh.Vsoll(t) * 3.6)
    				d += MODdata.Vh.V(t)
    				.Distance.Add(CSng(d / 1000))
    				.Alt.Add(MODdata.Vh.AltIntp(d, False))
    				.nU.Add(MODdata.nU(t))
    				.Tq.Add(nPeToM(MODdata.nU(t), MODdata.Pe(t)))
    			Next
    
    		End With
    
    		Report.CurrentMR.Results.Add(CurrentLoading, lr)
    	End Sub
    
    	Public Function WriteReport() As Boolean
    
    		Report.CreateCharts()
    
    		Return Report.WritePdfs
    	End Function
    End Class
    
    Public Class cWheel
    	Public Inertia As Single
    	Public Diam As Single
    	Public SizeA As Boolean
    End Class
    
    Public Class cRim
    	Public Fa As Single
    	Public Fb As Single
    End Class
    
    Public Class cMission
    	Public MissionID As tMission
    	Public NameStr As String
    	Public CyclePath As String
    	Public WHTCWF As New Dictionary(Of tWHTCpart, Single)
    End Class
    
    Public Class cSegmentTable
    	Public SegTableEntries As New List(Of cSegmentTableEntry)
    	Public MissionList As New List(Of tMission)
    
    	Public Function SetRef(ByRef SegTableEntryRef As cSegmentTableEntry, ByVal VehCat As tVehCat,
    							ByVal AxleConf As tAxleConf, ByVal MaxMass As Single) As Boolean
    		For Each s0 As cSegmentTableEntry In SegTableEntries
    			If s0.VehCat = VehCat And s0.AxleConf = AxleConf And MaxMass >= s0.MinGVW And MaxMass <= s0.MaxGVW Then
    				SegTableEntryRef = s0
    				Return True
    			End If
    		Next
    
    		SegTableEntryRef = Nothing
    		Return False
    	End Function
    End Class
    
    Public Class cSegmentTableEntry
    	Public VehCat As tVehCat
    	Public AxleConf As tAxleConf
    	Public MinGVW As Single
    	Public MaxGVW As Single
    	Public Missions As New List(Of tMission)
    	Public UseMission As New List(Of Boolean)
    	Public HDVclass As String
    	Public VACCfile As String
    	Public VCDVparam As New Dictionary(Of tMission, List(Of Single))
    	Public BodyTrWeight As New Dictionary(Of tMission, String)
    	Public Loading As New Dictionary(Of tMission, String)
    	Public AxleShares As New Dictionary(Of tMission, List(Of Single))
    	Public AxleSharesTr As New Dictionary(Of tMission, List(Of Single))
    	Public TrailerOnlyInLongHaul As Boolean
    
    	Public Function GetCycles() As List(Of String)
    		Dim l As New List(Of String)
    		Dim m As tMission
    
    		For Each m In Missions
    			l.Add(Declaration.Missions(m).CyclePath)
    		Next
    
    		Return l
    	End Function
    
    	Public Function GetBodyTrWeight(ByVal Mission As tMission) As Single
    
    		'Check if Config is valid
    		If BodyTrWeight.ContainsKey(Mission) AndAlso IsNumeric(BodyTrWeight(Mission)) Then
    			Return CSng(BodyTrWeight(Mission))
    		Else
    			Return -1
    		End If
    	End Function
    
    	Public Function GetLoading(ByVal Mission As tMission, ByVal MassMax As Single) As Single
    
    		'Check if Config is valid
    		If Loading.ContainsKey(Mission) Then
    			If Not (Loading(Mission) = "f" OrElse IsNumeric(Loading(Mission))) Then
    				Return -1
    			End If
    		Else
    			Return -1
    		End If
    
    		'Return Loading
    		If HDVclass < 4 Then
    			If Mission = tMission.LongHaul Then
    				Return 588.2 * MassMax - 2511.8
    			Else
    				Return 394.1 * MassMax - 1705.9
    			End If
    		Else
    			Return CSng(Loading(Mission))
    		End If
    	End Function
    End Class
    
    Public Class cReport
    	Public Filepath As String = ""
    	Public CurrentMR As cMissionResults
    	Public MissionResults As List(Of cMissionResults)
    	Public HDVclassStr As String = ""
    	Public VehCat As tVehCat = tVehCat.Undef
    	Public AxleConf As tAxleConf = tAxleConf.Undef
    	Public MassMaxStr As String = ""
    	Public JobFile As String = ""
    	Public DateStr As String = ""
    	Public Creator As String = ""
    	Public EngStr As String = ""
    	Public EngModelStr As String = ""
    	Public GbxStr As String = ""
    	Public GbxModelStr As String = ""
    
    	Public ChartCO2tkm As Drawing.Image
    	Public ChartCO2speed As Drawing.Image
    
    
    	Public Sub New()
    		MissionResults = New List(Of cMissionResults)
    	End Sub
    
    	Public Sub CreateCharts()
    		Dim mr As cMissionResults
    		Dim lr As KeyValuePair(Of tLoading, cLoadingResults)
    		Dim MyChart As System.Windows.Forms.DataVisualization.Charting.Chart
    		Dim s As System.Windows.Forms.DataVisualization.Charting.Series
    		Dim a As System.Windows.Forms.DataVisualization.Charting.ChartArea
    		Dim i As Int16
    
    		'Torque, rpm
    		For Each mr In MissionResults
    
    			MyChart = New System.Windows.Forms.DataVisualization.Charting.Chart
    			MyChart.Width = 1000
    			MyChart.Height = 427
    
    			a = New System.Windows.Forms.DataVisualization.Charting.ChartArea
    
    			s = New System.Windows.Forms.DataVisualization.Charting.Series
    			s.Points.DataBindXY(ENG.FLD.LnU, ENG.FLD.LTq)
    			s.ChartType = DataVisualization.Charting.SeriesChartType.FastLine
    			s.BorderWidth = 3
    			s.Color = Color.DarkBlue
    			s.Name = "Full load curve"
    			MyChart.Series.Add(s)
    
    			s = New System.Windows.Forms.DataVisualization.Charting.Series
    			s.Points.DataBindXY(ENG.FLD.LnU, ENG.FLD.LTqDrag)
    			s.ChartType = DataVisualization.Charting.SeriesChartType.FastLine
    			s.BorderWidth = 3
    			s.Color = Color.Blue
    			s.Name = "Drag curve"
    			MyChart.Series.Add(s)
    
    			's = New System.Windows.Forms.DataVisualization.Charting.Series
    			's.Points.DataBindXY(GBX.Shiftpolygons(GBX.GearCount).gs_nUdown, GBX.Shiftpolygons(GBX.GearCount).gs_Mdown)
    			's.ChartType = DataVisualization.Charting.SeriesChartType.FastLine
    			's.Color = Color.DarkGray
    			's.BorderWidth = 3
    			's.Name = "Down-Shift threshold"
    			'MyChart.Series.Add(s)
    
    			's = New System.Windows.Forms.DataVisualization.Charting.Series
    			's.Points.DataBindXY(GBX.Shiftpolygons(GBX.GearCount).gs_nUup, GBX.Shiftpolygons(GBX.GearCount).gs_Mup)
    			's.ChartType = DataVisualization.Charting.SeriesChartType.FastLine
    			's.Color = Color.Gray
    			's.BorderWidth = 3
    			's.Name = "Up-Shift threshold"
    			'MyChart.Series.Add(s)
    
    			s = New System.Windows.Forms.DataVisualization.Charting.Series
    			s.Points.DataBindXY(mr.Results(tLoading.RefLoaded).nU, mr.Results(tLoading.RefLoaded).Tq)
    			s.ChartType = DataVisualization.Charting.SeriesChartType.Point
    			s.Color = Color.Red
    			s.Name = "load points (Ref. load.)"
    			MyChart.Series.Add(s)
    
    
    			a.Name = "main"
    
    			a.AxisX.Title = "engine speed [1/min]"
    			a.AxisX.TitleFont = New Drawing.Font("Helvetica", 20)
    			a.AxisX.LabelStyle.Font = New Drawing.Font("Helvetica", 20)
    			a.AxisX.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    
    			a.AxisY.Title = "engine torque [Nm]"
    			a.AxisY.TitleFont = New Drawing.Font("Helvetica", 20)
    			a.AxisY.LabelStyle.Font = New Drawing.Font("Helvetica", 20)
    			a.AxisY.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    
    			a.AxisX.Minimum = 300
    			a.BorderDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
    			a.BorderWidth = 3
    
    
    			MyChart.ChartAreas.Add(a)
    
    			With MyChart.ChartAreas(0)
    				.Position.X = 0
    				.Position.Y = 0
    				.Position.Width = 70
    				.Position.Height = 100
    			End With
    
    			MyChart.Legends.Add("main")
    			MyChart.Legends(0).Font = New Drawing.Font("Helvetica", 14)
    			MyChart.Legends(0).BorderColor = Color.Black
    			MyChart.Legends(0).BorderWidth = 3
    
    
    			'MyChart.Titles.Add("CO2 Results [g/km]")
    			'MyChart.Titles(0).Font = New Font("Helvetica", 30, FontStyle.Bold)
    
    
    			MyChart.Update()
    
    			mr.ChartTqN = New Bitmap(MyChart.Width, MyChart.Height, Imaging.PixelFormat.Format32bppArgb)
    			MyChart.DrawToBitmap(mr.ChartTqN, New Drawing.Rectangle(0, 0, mr.ChartTqN.Size.Width, mr.ChartTqN.Size.Height))
    
    		Next
    
    		'Speed over distance
    		For Each mr In MissionResults
    
    			MyChart = New System.Windows.Forms.DataVisualization.Charting.Chart
    			MyChart.Width = 2000
    			MyChart.Height = 400
    
    			a = New System.Windows.Forms.DataVisualization.Charting.ChartArea
    
    			'Altitude
    			s = New System.Windows.Forms.DataVisualization.Charting.Series
    			s.Points.DataBindXY(mr.Results(tLoading.RefLoaded).Distance, mr.Results(tLoading.RefLoaded).Alt)
    			s.ChartType = DataVisualization.Charting.SeriesChartType.Area
    			s.Color = Color.Lavender
    			s.Name = "Altitude"
    			s.YAxisType = DataVisualization.Charting.AxisType.Secondary
    			MyChart.Series.Add(s)
    
    			'Target speed
    			s = New System.Windows.Forms.DataVisualization.Charting.Series
    			s.Points.DataBindXY(mr.Results(tLoading.RefLoaded).Distance, mr.Results(tLoading.RefLoaded).TargetSpeed)
    			s.ChartType = DataVisualization.Charting.SeriesChartType.FastLine
    			s.BorderWidth = 3
    			s.Name = "Target speed"
    			MyChart.Series.Add(s)
    
    			For Each lr In mr.Results
    
    				s = New System.Windows.Forms.DataVisualization.Charting.Series
    				s.Points.DataBindXY(lr.Value.Distance, lr.Value.ActualSpeed)
    				s.ChartType = DataVisualization.Charting.SeriesChartType.FastLine
    				s.Name = ConvLoading(lr.Key)
    				MyChart.Series.Add(s)
    
    			Next
    
    			a.Name = "main"
    
    			a.AxisX.Title = "distance [km]"
    			a.AxisX.TitleFont = New Drawing.Font("Helvetica", 16)
    			a.AxisX.LabelStyle.Font = New Drawing.Font("Helvetica", 16)
    			a.AxisX.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    			a.AxisX.LabelStyle.Format = "0.0"
    
    			a.AxisY.Title = "vehicle speed [km/h]"
    			a.AxisY.TitleFont = New Drawing.Font("Helvetica", 16)
    			a.AxisY.LabelStyle.Font = New Drawing.Font("Helvetica", 16)
    			a.AxisY.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    
    			a.AxisY2.Title = "altitude [m]"
    			a.AxisY2.TitleFont = New Drawing.Font("Helvetica", 16)
    			a.AxisY2.LabelStyle.Font = New Drawing.Font("Helvetica", 16)
    			a.AxisY2.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    			a.AxisY2.MinorGrid.Enabled = False
    			a.AxisY2.MajorGrid.Enabled = False
    
    			a.AxisX.Minimum = 0
    			a.BorderDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
    			a.BorderWidth = 3
    
    			MyChart.ChartAreas.Add(a)
    
    			With MyChart.ChartAreas(0)
    				.Position.X = 0
    				.Position.Y = 0
    				.Position.Width = 90
    				.Position.Height = 100
    			End With
    
    
    			MyChart.Legends.Add("main")
    			MyChart.Legends(0).Font = New Drawing.Font("Helvetica", 14)
    			MyChart.Legends(0).BorderColor = Color.Black
    			MyChart.Legends(0).BorderWidth = 3
    			'MyChart.Legends(0).Position.Auto = False
    			MyChart.Legends(0).Position.X = 97
    			MyChart.Legends(0).Position.Y = 3
    			MyChart.Legends(0).Position.Width = 10
    			MyChart.Legends(0).Position.Height = 40
    
    
    			'MyChart.Titles.Add("CO2 Results [g/km]")
    			'MyChart.Titles(0).Font = New Font("Helvetica", 30, FontStyle.Bold)
    
    
    			MyChart.Update()
    
    			mr.ChartSpeed = New Bitmap(MyChart.Width, MyChart.Height, Imaging.PixelFormat.Format32bppArgb)
    			MyChart.DrawToBitmap(mr.ChartSpeed, New Drawing.Rectangle(0, 0, mr.ChartSpeed.Size.Width, mr.ChartSpeed.Size.Height))
    
    		Next
    
    		'CO2 Bars
    		MyChart = New System.Windows.Forms.DataVisualization.Charting.Chart
    		a = New System.Windows.Forms.DataVisualization.Charting.ChartArea
    
    		For Each mr In MissionResults
    			s = New System.Windows.Forms.DataVisualization.Charting.Series
    			s.Points.AddXY(mr.MissionRef.NameStr, mr.Results(tLoading.RefLoaded).CO2tkm)
    			's.IsValueShownAsLabel = True
    			s.Points(0).Label = s.Points(0).YValues(0).ToString("0.0") & " [g/tkm]"
    			s.Points(0).Font = New Drawing.Font("Helvetica", 20)
    			s.Points(0).LabelBackColor = Color.White
    			s.Name = mr.MissionRef.NameStr & " (Ref. load.)"
    			MyChart.Series.Add(s)
    		Next
    
    		a.Name = "main"
    
    		a.AxisX.Title = "Missions"
    		a.AxisX.TitleFont = New Drawing.Font("Helvetica", 20)
    		a.AxisX.LabelStyle.Enabled = False
    
    		a.AxisY.Title = "CO2 [g/tkm]"
    		a.AxisY.TitleFont = New Drawing.Font("Helvetica", 20)
    		a.AxisY.LabelStyle.Font = New Drawing.Font("Helvetica", 20)
    		a.AxisY.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    
    		a.BorderDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
    		a.BorderWidth = 3
    
    		MyChart.ChartAreas.Add(a)
    
    		MyChart.Legends.Add("main")
    		MyChart.Legends(0).Font = New Drawing.Font("Helvetica", 20)
    		MyChart.Legends(0).BorderColor = Color.Black
    		MyChart.Legends(0).BorderWidth = 3
    
    		MyChart.Width = 1500
    		MyChart.Height = 700
    
    		MyChart.Update()
    
    		ChartCO2tkm = New Bitmap(MyChart.Width, MyChart.Height, Imaging.PixelFormat.Format32bppArgb)
    		MyChart.DrawToBitmap(ChartCO2tkm, New Drawing.Rectangle(0, 0, ChartCO2tkm.Size.Width, ChartCO2tkm.Size.Height))
    
    
    		'CO2 & Speed
    		MyChart = New System.Windows.Forms.DataVisualization.Charting.Chart
    		a = New System.Windows.Forms.DataVisualization.Charting.ChartArea
    
    		For Each mr In MissionResults
    			s = New System.Windows.Forms.DataVisualization.Charting.Series
    			s.MarkerSize = 15
    			s.MarkerStyle = DataVisualization.Charting.MarkerStyle.Circle
    			s.ChartType = DataVisualization.Charting.SeriesChartType.Point
    			i = -1
    			For Each lr In mr.Results
    				i += 1
    				s.Points.AddXY(lr.Value.Speed, lr.Value.CO2km)
    				s.Points(i).Label = lr.Value.Loading.ToString("0.0") & " t"
    				If lr.Key = tLoading.RefLoaded Then
    					s.Points(i).Font = New Drawing.Font("Helvetica", 16)
    				Else
    					s.Points(i).MarkerSize = 10
    					s.Points(i).Font = New Drawing.Font("Helvetica", 14)
    				End If
    				s.Points(i).LabelBackColor = Color.White
    			Next
    			s.Name = mr.MissionRef.NameStr
    			MyChart.Series.Add(s)
    		Next
    
    		a.Name = "main"
    
    		a.AxisX.Title = "vehicle speed [km/h]"
    		a.AxisX.TitleFont = New Drawing.Font("Helvetica", 20)
    		a.AxisX.LabelStyle.Font = New Drawing.Font("Helvetica", 20)
    		a.AxisX.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    
    		a.AxisY.Title = "CO2 [g/km]"
    		a.AxisY.TitleFont = New Drawing.Font("Helvetica", 20)
    		a.AxisY.LabelStyle.Font = New Drawing.Font("Helvetica", 20)
    		a.AxisY.LabelAutoFitStyle = DataVisualization.Charting.LabelAutoFitStyles.None
    
    		a.AxisX.Minimum = 20
    		a.BorderDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
    		a.BorderWidth = 3
    
    		MyChart.ChartAreas.Add(a)
    
    		MyChart.Legends.Add("main")
    		MyChart.Legends(0).Font = New Drawing.Font("Helvetica", 20)
    		MyChart.Legends(0).BorderColor = Color.Black
    		MyChart.Legends(0).BorderWidth = 3
    
    		'MyChart.Titles.Add("CO2 Results [g/km]")
    		'MyChart.Titles(0).Font = New Font("Helvetica", 30, FontStyle.Bold)
    
    		MyChart.Width = 1500
    		MyChart.Height = 700
    
    		MyChart.Update()
    
    		ChartCO2speed = New Bitmap(MyChart.Width, MyChart.Height, Imaging.PixelFormat.Format32bppArgb)
    		MyChart.DrawToBitmap(ChartCO2speed, New Drawing.Rectangle(0, 0, ChartCO2speed.Size.Width, ChartCO2speed.Size.Height))
    	End Sub
    
    	Public Function WritePdfs() As Boolean
    		Dim pdfReader As PdfReader
    		Dim pdfStamper As PdfStamper
    		Dim PdfTemp As String = ""
    		Dim PdfTempMR As String = ""
    		Dim i As Integer
    		Dim pgMax As Integer
    		Dim imgp As iTextSharp.text.Image
    		Dim pdfContentByte As iTextSharp.text.pdf.PdfContentByte
    		Dim doc As iTextSharp.text.Document
    		Dim pdfpage As PdfImportedPage
    		Dim pdfWriter As PdfWriter
    		Dim mr As cMissionResults
    		Dim lr As KeyValuePair(Of tLoading, cLoadingResults)
    		Dim lstr As String = ""
    		Dim temppdfs As New List(Of String)
    		Dim temppath As String
    		Dim pdfFormFields As AcroFields
    
    		Select Case MissionResults.Count
    			Case 2
    				PdfTemp = MyDeclPath & "Reports\rep2C.pdf"
    				pgMax = 3
    			Case 3
    				PdfTemp = MyDeclPath & "Reports\rep3C.pdf"
    				pgMax = 4
    		End Select
    
    		PdfTempMR = MyDeclPath & "Reports\repMR.pdf"
    
    		Try
    
    			temppath = MyDeclPath & "Reports\temp0.pdf"
    			temppdfs.Add(temppath)
    
    			pdfReader = New PdfReader(PdfTemp)
    			pdfStamper = New PdfStamper(pdfReader, New FileStream(temppath, FileMode.Create))
    
    			pdfFormFields = pdfStamper.AcroFields
    
    			pdfFormFields.SetField("version", VECTOvers)
    			pdfFormFields.SetField("Job", JobFile)
    			pdfFormFields.SetField("Date", DateStr)
    			pdfFormFields.SetField("Created", Creator)
    			pdfFormFields.SetField("Config", MassMaxStr & " " & ConvAxleConf(AxleConf) & " " & ConvVehCat(VehCat, True))
    			pdfFormFields.SetField("HDVclass", "HDV Class " & HDVclassStr)
    			pdfFormFields.SetField("Engine", EngStr)
    			pdfFormFields.SetField("EngM", EngModelStr)
    			pdfFormFields.SetField("Gearbox", GbxStr)
    			pdfFormFields.SetField("GbxM", GbxModelStr)
    			pdfFormFields.SetField("PageNr", "Page 1 of " & pgMax)
    
    			i = 0
    			For Each mr In MissionResults
    				i += 1
    				pdfFormFields.SetField("Mission" & i, mr.MissionRef.NameStr)
    				With mr.Results(tLoading.RefLoaded)
    					pdfFormFields.SetField("Loading" & i, .Loading.ToString("0.0") & " t")
    					pdfFormFields.SetField("Speed" & i, .Speed.ToString("0.0") & " km/h")
    					pdfFormFields.SetField("FC" & i, .FCkm.ToString("0.0"))
    					pdfFormFields.SetField("FCt" & i, .FCtkm.ToString("0.0"))
    					pdfFormFields.SetField("CO2" & i, .CO2km.ToString("0.0"))
    					pdfFormFields.SetField("CO2t" & i, .CO2tkm.ToString("0.0"))
    
    					''AA-TB
    					''Advanced Auxiliary
    
    					'If Not pdfFormFields.GetField("AuxiliaryMode") is Nothing 
    					'  pdfFormFields.SetField("AuxiliaryMode", VEC.AuxiliaryAssembly.ToString())
    					'End if
    
    				End With
    			Next
    
    
    			'Add Images
    			pdfContentByte = pdfStamper.GetOverContent(1)
    
    			imgp = iTextSharp.text.Image.GetInstance(ChartCO2tkm, BaseColor.WHITE)
    			imgp.ScaleAbsolute(440, 195)
    			imgp.SetAbsolutePosition(360, 270)
    			pdfContentByte.AddImage(imgp)
    
    			imgp = iTextSharp.text.Image.GetInstance(ChartCO2speed, BaseColor.WHITE)
    			imgp.ScaleAbsolute(440, 195)
    			imgp.SetAbsolutePosition(360, 75)
    			pdfContentByte.AddImage(imgp)
    
    			imgp = iTextSharp.text.Image.GetInstance(Declaration.ConvPicPath(HDVclassStr, True))
    			imgp.ScaleAbsolute(180, 50)
    			imgp.SetAbsolutePosition(30, 475)
    			pdfContentByte.AddImage(imgp)
    
    			' flatten the form to remove editting options, set it to false  to leave the form open to subsequent manual edits
    			pdfStamper.FormFlattening = True
    
    			' close the pdf
    			pdfStamper.Close()
    
    
    			i = 0
    			For Each mr In MissionResults
    				i += 1
    
    				temppath = MyDeclPath & "Reports\temp" & i & ".pdf"
    				temppdfs.Add(temppath)
    
    				pdfReader = New PdfReader(PdfTempMR)
    				pdfStamper = New PdfStamper(pdfReader, New FileStream(temppath, FileMode.Create))
    
    				pdfFormFields = pdfStamper.AcroFields
    
    				pdfFormFields.SetField("version", VECTOvers)
    				pdfFormFields.SetField("Job", JobFile)
    				pdfFormFields.SetField("Date", DateStr)
    				pdfFormFields.SetField("Created", Creator)
    				pdfFormFields.SetField("Config", MassMaxStr & " " & ConvAxleConf(AxleConf) & " " & ConvVehCat(VehCat, True))
    				pdfFormFields.SetField("HDVclass", "HDV Class " & HDVclassStr)
    				pdfFormFields.SetField("PageNr", "Page " & i + 1 & " of " & pgMax)
    
    				pdfFormFields.SetField("Mission", mr.MissionRef.NameStr)
    
    				For Each lr In mr.Results
    
    					Select Case lr.Key
    						Case tLoading.EmptyLoaded
    							lstr = "E"
    						Case tLoading.RefLoaded
    							lstr = "R"
    						Case tLoading.FullLoaded
    							lstr = "F"
    						Case Else
    							Return False
    					End Select
    
    					With lr.Value
    						pdfFormFields.SetField("Load" & lstr, .Loading.ToString("0.0") & " t")
    						pdfFormFields.SetField("Speed" & lstr, .Speed.ToString("0.0"))
    						pdfFormFields.SetField("FCkm" & lstr, .FCkm.ToString("0.0"))
    						If .Loading = 0 Then
    							pdfFormFields.SetField("FCtkm" & lstr, "-")
    							pdfFormFields.SetField("CO2tkm" & lstr, "-")
    						Else
    							pdfFormFields.SetField("FCtkm" & lstr, .FCtkm.ToString("0.0"))
    							pdfFormFields.SetField("CO2tkm" & lstr, .CO2tkm.ToString("0.0"))
    						End If
    						pdfFormFields.SetField("CO2km" & lstr, .CO2km.ToString("0.0"))
    					End With
    
    				Next
    
    				'Add Images
    				pdfContentByte = pdfStamper.GetOverContent(1)
    
    				imgp = iTextSharp.text.Image.GetInstance(Declaration.ConvPicPath(HDVclassStr,
    																				(mr.MissionRef.MissionID = tMission.LongHaul)))
    				imgp.ScaleAbsolute(180, 50)
    				imgp.SetAbsolutePosition(600, 475)
    				pdfContentByte.AddImage(imgp)
    
    				imgp = iTextSharp.text.Image.GetInstance(mr.ChartSpeed, BaseColor.WHITE)
    				imgp.ScaleAbsolute(780, 156)
    				imgp.SetAbsolutePosition(17, 270)
    				pdfContentByte.AddImage(imgp)
    
    				imgp = iTextSharp.text.Image.GetInstance(mr.ChartTqN, BaseColor.WHITE)
    				imgp.ScaleAbsolute(420, 178)
    				imgp.SetAbsolutePosition(375, 75)
    				pdfContentByte.AddImage(imgp)
    
    				' flatten the form to remove editting options, set it to false  to leave the form open to subsequent manual edits
    				pdfStamper.FormFlattening = True
    
    				' close the pdf
    				pdfStamper.Close()
    				pdfReader.Close()
    			Next
    
    			'Merge files
    			doc = New iTextSharp.text.Document(iTextSharp.text.PageSize.A4.Rotate, 12, 12, 12, 12)
    
    			pdfWriter = pdfWriter.GetInstance(doc, New FileStream(Filepath, FileMode.Create))
    
    			doc.Open()
    
    			For Each temppath In temppdfs
    				pdfReader = New PdfReader(temppath)
    				pdfpage = pdfWriter.GetImportedPage(pdfReader, 1)
    				doc.Add(iTextSharp.text.Image.GetInstance(pdfpage))
    			Next
    
    			If (doc.IsOpen()) Then
    				doc.Close()
    			End If
    
    			'Delete temp files
    			'For Each temppath In temppdfs
    			'	File.Delete(temppath)
    			'Next
    
    		Catch ex As Exception
    
    			Return False
    
    		End Try
    
    
    		Return True
    	End Function
    
    
    	Public Class cMissionResults
    		Public Results As Dictionary(Of tLoading, cLoadingResults)
    
    		Public MissionRef As cMission
    
    		Public ChartSpeed As Drawing.Image
    		Public ChartTqN As Drawing.Image
    
    
    		Public Sub New()
    			Results = New Dictionary(Of tLoading, cLoadingResults)
    		End Sub
    	End Class
    
    	Public Class cLoadingResults
    		Public Loading As Single = 0
    		Public Speed As Single = 0
    		Public FCkm As Single = 0
    		Public FCtkm As Single = 0
    		Public CO2km As Single = 0
    		Public CO2tkm As Single = 0
    		Public FCerror As Boolean = False
    
    		Public TargetSpeed As List(Of Single)
    		Public ActualSpeed As List(Of Single)
    		Public Distance As List(Of Single)
    		Public Alt As List(Of Single)
    		Public Tq As List(Of Single)
    		Public nU As List(Of Single)
    
    
    		Public Sub New()
    			TargetSpeed = New List(Of Single)
    			ActualSpeed = New List(Of Single)
    			Distance = New List(Of Single)
    			Alt = New List(Of Single)
    			Tq = New List(Of Single)
    			nU = New List(Of Single)
    		End Sub
    	End Class
    End Class