From b6536fdc15a4ef9c83d25eda403b0e56a4d62cf5 Mon Sep 17 00:00:00 2001
From: Jonas Franz-Hermann Gesenhues <j.gesenhues@irt.rwth-aachen.de>
Date: Thu, 3 Sep 2020 19:48:16 +0200
Subject: [PATCH] -Fixed bug of creating export data table -changed channel
 valueRef and value collections from IEnumerable to IList to ensure same
 corresponding orders

---
 Basics/Classes/BufferedSamplesTable.cs |  2 +-
 Basics/Classes/DataRepository.cs       |  2 +-
 Basics/Classes/FileSamplesTable.cs     | 15 +++++++++++----
 Basics/Classes/NewValuesEventArgs.cs   |  4 ++--
 Basics/Interfaces/IDataRepositorry.cs  |  2 +-
 Basics/Interfaces/ISamplesStorage.cs   |  2 +-
 FmuTools/FmuTools.csproj               |  2 +-
 LocalMode/FmuInstance.cs               |  8 ++++----
 8 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/Basics/Classes/BufferedSamplesTable.cs b/Basics/Classes/BufferedSamplesTable.cs
index 920a3c5..694f829 100644
--- a/Basics/Classes/BufferedSamplesTable.cs
+++ b/Basics/Classes/BufferedSamplesTable.cs
@@ -22,7 +22,7 @@ namespace ModeliChart.Basics
             fileStorage = new FileSamplesTable(valueRefs);
         }
 
-        public void AddSamples(double time, IEnumerable<uint> valueRefs, IEnumerable<double> values)
+        public void AddSamples(double time, IList<uint> valueRefs, IList<double> values)
         {
             buffer.AddSamples(time, valueRefs, values);
             fileStorage.AddSamples(time, valueRefs, values);
diff --git a/Basics/Classes/DataRepository.cs b/Basics/Classes/DataRepository.cs
index 55e7987..74e852a 100644
--- a/Basics/Classes/DataRepository.cs
+++ b/Basics/Classes/DataRepository.cs
@@ -21,7 +21,7 @@ namespace ModeliChart.Basics
             this.createStorage = createStorage;
         }
 
-        public void AddValues(string modelInstanceName, double time, IEnumerable<uint> valueRefs, IEnumerable<double> values)
+        public void AddValues(string modelInstanceName, double time, IList<uint> valueRefs, IList<double> values)
         {
             // Create new storage if needed
             if (!storages.ContainsKey(modelInstanceName))
diff --git a/Basics/Classes/FileSamplesTable.cs b/Basics/Classes/FileSamplesTable.cs
index f24b28d..18292d9 100644
--- a/Basics/Classes/FileSamplesTable.cs
+++ b/Basics/Classes/FileSamplesTable.cs
@@ -25,6 +25,7 @@ namespace ModeliChart.Basics
         // Efficient access via dictionaries
         private readonly Dictionary<uint, int> posByValueRef;
         private readonly int bufferSize;
+        double time_lastWrite;
 
         /// <summary>
         /// The valueRefs must be known in advance, since calculations depend on a fixed number of channels.
@@ -130,18 +131,19 @@ namespace ModeliChart.Basics
         /// <param name="time"></param>
         /// <param name="valueRefs"></param>
         /// <param name="values"></param>
-        public void AddSamples(double time, IEnumerable<uint> valueRefs, IEnumerable<double> values)
+        public void AddSamples(double time, IList<uint> valueRefs, IList<double> values)
         {
             // Buffer = Timestamp + values
             var buffer = new double[bufferSize];
             var zipped = from valueRef in valueRefs
-                         where posByValueRef.ContainsKey(valueRef)
-                         from value in values
+                         join value in values on valueRefs.IndexOf(valueRef) equals values.IndexOf(value)
                          select (valueRef, value);
+           
             foreach (var (valueRef, value) in zipped)
             {
                 SetBufferValue(buffer, valueRef, value);
             }
+            time_lastWrite = time;
             SetBufferTIme(buffer, time);
             // Append to the writer buffer
             writeCache.Add(buffer);
@@ -184,6 +186,10 @@ namespace ModeliChart.Basics
                 Buffer.BlockCopy(buffer, 0, doubleBuffer, 0, buffer.Length);
                 var time = GetBufferTime(doubleBuffer);
                 // Only add data that is requested
+                if (endTime==0)
+                {
+                    endTime = time_lastWrite;
+                }
                 if (time >= startTime && time <= endTime)
                 {
                     // Add new row to table
@@ -191,7 +197,8 @@ namespace ModeliChart.Basics
                     row[timeColumn] = time;
                     foreach (var channel in channels)
                     {
-                        row[channel.Name] = GetBufferValue(doubleBuffer, channel.ValueRef);
+                        double val =  GetBufferValue(doubleBuffer, channel.ValueRef);
+                        row[channel.Name] = val;
                     }
                     table.Rows.Add(row);
                 }
diff --git a/Basics/Classes/NewValuesEventArgs.cs b/Basics/Classes/NewValuesEventArgs.cs
index 3291f7c..bb9ce52 100644
--- a/Basics/Classes/NewValuesEventArgs.cs
+++ b/Basics/Classes/NewValuesEventArgs.cs
@@ -7,7 +7,7 @@ namespace ModeliChart.Basics
     {
         public string ModelInstanceName { get; set; }
         public double Time { get; set; }
-        public IEnumerable<uint> ValueRefs { get; set; }
-        public IEnumerable<double> Values { get; set; }
+        public IList<uint> ValueRefs { get; set; }
+        public IList<double> Values { get; set; }
     }
 }
diff --git a/Basics/Interfaces/IDataRepositorry.cs b/Basics/Interfaces/IDataRepositorry.cs
index b82485c..da6095f 100644
--- a/Basics/Interfaces/IDataRepositorry.cs
+++ b/Basics/Interfaces/IDataRepositorry.cs
@@ -19,7 +19,7 @@ namespace ModeliChart.Basics
         /// <param name="time"></param>
         /// <param name="valueRefs"></param>
         /// <param name="values"></param>
-        void AddValues(string modelInstanceName, double time, IEnumerable<uint> valueRefs, IEnumerable<double> values);
+        void AddValues(string modelInstanceName, double time, IList<uint> valueRefs, IList<double> values);
 
         /// <summary>
         /// Retrieves the values of one channel which are stored in memory.
diff --git a/Basics/Interfaces/ISamplesStorage.cs b/Basics/Interfaces/ISamplesStorage.cs
index ce6d82c..c3515a5 100644
--- a/Basics/Interfaces/ISamplesStorage.cs
+++ b/Basics/Interfaces/ISamplesStorage.cs
@@ -16,7 +16,7 @@ namespace ModeliChart.Basics
         /// <param name="time"></param>
         /// <param name="valueRefs">Ordered IEnumerable of the channels value-references.</param>
         /// <param name="values">Ordered IEnumerable of the values that belong to the valueRefs.</param>
-        void AddSamples(double time, IEnumerable<uint> valueRefs, IEnumerable<double> values);
+        void AddSamples(double time, IList<uint> valueRefs, IList<double> values);
 
         /// <summary>
         /// Get the buffered samples or one specific channel.
diff --git a/FmuTools/FmuTools.csproj b/FmuTools/FmuTools.csproj
index 4ac7a25..2297564 100644
--- a/FmuTools/FmuTools.csproj
+++ b/FmuTools/FmuTools.csproj
@@ -9,7 +9,7 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>ModeliChart.FmuTools</RootNamespace>
     <AssemblyName>FmuTools</AssemblyName>
-    <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkProfile />
   </PropertyGroup>
diff --git a/LocalMode/FmuInstance.cs b/LocalMode/FmuInstance.cs
index ec0c084..3f3ebb0 100644
--- a/LocalMode/FmuInstance.cs
+++ b/LocalMode/FmuInstance.cs
@@ -31,7 +31,7 @@ namespace ModeliChart.LocalMode
         private readonly Dictionary<uint, int> realVrPos = new Dictionary<uint, int>();
         private readonly Dictionary<uint, int> boolVrPos = new Dictionary<uint, int>();
         // Order: Int-Real-Bool !!!
-        private readonly IEnumerable<uint> concatenatedVrs;
+        private readonly IList<uint> concatenatedVrs;
 
         public string Name { get; private set; }
 
@@ -51,7 +51,7 @@ namespace ModeliChart.LocalMode
             intVrs = FmuChannels.GetIntVrs(model.Channels).Distinct().ToArray();
             realVrs = FmuChannels.GetRealVrs(model.Channels).Distinct().ToArray();
             boolVrs = FmuChannels.GetBoolVrs(model.Channels).Distinct().ToArray();
-            concatenatedVrs = intVrs.Concat(realVrs).Concat(boolVrs);
+            concatenatedVrs = intVrs.Concat(realVrs).Concat(boolVrs).ToList();
             intValues = new int[intVrs.Length];
             realValues = new double[realVrs.Length];
             boolValues = new bool[boolVrs.Length];
@@ -203,7 +203,7 @@ namespace ModeliChart.LocalMode
             }
         }
 
-        internal (IEnumerable<uint> ValueRefs, IEnumerable<double> Values) GetCurrentValues()
+        internal (IList<uint> ValueRefs, IList<double> Values) GetCurrentValues()
         {
             // Update local values from fmu
             fmu.GetInteger(intVrs, intValues);
@@ -214,7 +214,7 @@ namespace ModeliChart.LocalMode
                    .Select(i => Convert.ToDouble(i))
                    .Concat(realValues)
                    .Concat(boolValues.Select(b => Convert.ToDouble(b)));
-            return (concatenatedVrs, values);
+            return (concatenatedVrs, values.ToList());
         } 
 
         public void Dispose()
-- 
GitLab