Esempio n. 1
0
        public static ExtendedObservableCollection <IndicatorValue> filterDiagramValues(IEnumerable <IndicatorValue> values)
        {
            var sortedValues = values.OrderBy(x => x.Timestamp);

            ExtendedObservableCollection <IndicatorValue> resultList = new ExtendedObservableCollection <IndicatorValue>();

            // add average values to the diagram list
            int intervalToAverage = values.Count() / NUMBER_OF_VALUES_IN_DIAGRAM;

            if (intervalToAverage > 1)
            {
                for (int i = 0; i < sortedValues.Count(); i += intervalToAverage)
                {
                    if (sortedValues.Count() >= i + intervalToAverage)
                    {
                        try
                        {
                            double sum = 0;
                            for (int j = i; j < i + intervalToAverage; j++)
                            {
                                sum += Convert.ToInt32(sortedValues.ElementAt(j).Value);
                            }
                            IndicatorValue middleElement = sortedValues.ElementAt(i + intervalToAverage / 2);
                            resultList.Add(new IndicatorValue(Convert.ToInt32(sum / intervalToAverage), middleElement.DataType, middleElement.Timestamp, middleElement.MappingState));
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("DiagramHelper.filterDiagramValues: Problem filtering values for diagram. " + e.Message);
                        }
                    }
                }
            }
            else
            {
                foreach (IndicatorValue v in sortedValues)
                {
                    try{
                        resultList.Add(new IndicatorValue(Convert.ToInt32(v.Value), v.DataType, v.Timestamp, v.MappingState));
                    }catch (Exception) {}
                }
            }

            // collect distances and define "normal" time distance between two values
            // lets take the median
            List <TimeSpan> distances = new List <TimeSpan>();

            for (int i = 0; i < resultList.Count; i++)
            {
                if (i < resultList.Count - 1)
                {
                    distances.Add((resultList.ElementAt(i + 1).Timestamp - resultList.ElementAt(i).Timestamp));
                }
            }
            //sort and take middle as reference distance
            distances.Sort();
            double referenceDistanceInSeconds = 0;

            if (distances.Count > 0)
            {
                referenceDistanceInSeconds = distances.ElementAt(distances.Count / 2).TotalSeconds;
            }

            List <IndicatorValue> valuesToAdd = new List <IndicatorValue>();

            for (int i = 0; i < resultList.Count; i++)
            {
                if (i < resultList.Count - 1)
                {
                    if ((resultList.ElementAt(i + 1).Timestamp - resultList.ElementAt(i).Timestamp).TotalSeconds > referenceDistanceInSeconds * 5)
                    {
                        // Add Dummy 0 Values, so the graph shows no ugly lines when system was off
                        valuesToAdd.Add(new IndicatorValue(0, resultList.ElementAt(i).DataType, resultList.ElementAt(i).Timestamp.AddMilliseconds(100), resultList.ElementAt(i).MappingState));
                        valuesToAdd.Add(new IndicatorValue(0, resultList.ElementAt(i + 1).DataType, resultList.ElementAt(i + 1).Timestamp.AddMilliseconds(-100), resultList.ElementAt(i + 1).MappingState));
                    }
                }
            }

            foreach (IndicatorValue v in valuesToAdd)
            {
                resultList.Add(v);
            }
            return(resultList);
        }