Exemple #1
0
        /// <summary>
        /// Добавить элемент в буфер
        /// </summary>
        /// <param name="Element">Добавляемый элемент</param>
        public void Append(Slice Element)
        {
            if (slim.TryEnterWriteLock(555))
            {
                try
                {
                    if (Element.slice != null)
                    {
                        CalculateIndexes();

                        array[last] = Element;
                        array[last].index = last;
                    }
                }
                finally
                {
                    slim.ExitWriteLock();
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// получить среднее значение параметра на этапе
        /// </summary>
        /// <param name="slice"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private float GetMiddle(Slice[] slice, int index)
        {
            try
            {
                if (slice != null && index > -1)
                {
                    double mean = 0.0f;
                    for (int i = 1; i < slice.Length; i++)
                    {
                        if (slice[i].slice != null && slice[i - 1].slice != null)
                        {
                            if (index <= slice[i].slice.Length && index <= slice[i - 1].slice.Length)
                            {
                                double p = (slice[i].slice[index] + slice[i - 1].slice[index]) / 2.0f;
                                double t = (double)(slice[i]._date.Ticks - slice[i - 1]._date.Ticks);

                                if (double.IsNaN(p) == false && double.IsNaN(t) == false)
                                {
                                    mean += p * t;
                                }
                            }
                        }
                    }

                    double startTime = slice[0]._date.Ticks;
                    double finishTime = slice[slice.Length - 1]._date.Ticks;

                    double result = mean / (finishTime - startTime);
                    return (float)result;
                }
            }
            catch { }
            return float.NaN;
        }
Exemple #3
0
        /// <summary>
        /// максимальное значение
        /// </summary>
        /// <param name="slices"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private float FindMin(Slice[] slices, int index)
        {
            try
            {
                float min = float.MaxValue;
                foreach (Slice slice in slices)
                {
                    if (slice.slice != null)
                    {
                        if (index > -1 && index <= slice.slice.Length)
                        {
                            if (slice.slice[index] < min)
                            {
                                min = slice.slice[index];
                            }
                        }
                    }
                }

                return min;
            }
            catch { }
            return float.NaN;
        }
Exemple #4
0
        /// <summary>
        /// Минимальное значение
        /// </summary>
        /// <param name="slices"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private float FindMax(Slice[] slices, int index)
        {
            try
            {
                float max = float.MinValue;
                foreach (Slice slice in slices)
                {
                    if (slice.slice != null)
                    {
                        if (index > -1 && index <= slice.slice.Length)
                        {
                            if (slice.slice[index] > max)
                            {
                                max = slice.slice[index];
                            }
                        }
                    }
                }

                return max;
            }
            catch { }
            return float.NaN;
        }
Exemple #5
0
        /// <summary>
        /// Получить параметры за указанный период времени с конца массива
        /// </summary>
        /// <param name="start">Время начало выборки данных</param>
        /// <param name="finish">Время конца выборки данных</param>
        /// <param name="p1, p2, p3, p4, p5">Номера параметров от 0 до №-1</param>
        /// <returns>Список данных из указанного диапазона</returns>
        public Slice[] FindFromEnd(DateTime start, DateTime finish, int p1, int p2, int p3, int p4, int p5)
        {
            if (slim.TryEnterReadLock(300))
            {
                try
                {
                    int[] Prms = { p1, p2, p3, p4, p5 };
                    if (last >= 0)
                    {
                        if (array[last]._date < start) return null;
                        if (array[first]._date > finish) return null;

                        int ind1 = -1;
                        {
                            int ind = last;
                            for (int j = 0; j < c_size; j++)
                            {
                                if (array[ind]._date > finish)
                                {
                                    if (ind == first) break;
                                    ind = ind - 1;

                                    if (ind < 0) ind = size - 1;
                                }
                                else
                                {
                                    ind1 = ind;
                                    break;
                                }
                            }
                        }

                        if (ind1 != -1)
                        {
                            List<Slice> result = new List<Slice>(5);
                            if (result != null)
                            {
                                int ind = ind1;
                                for (int j = 0; j < c_size; j++)
                                {
                                    if (array[ind]._date < start)
                                    {
                                        break;
                                    }

                                    // добавить элемент к result
                                    if (array[ind].slice != null)
                                    {
                                        Slice buff = new Slice(5);
                                        buff._date = array[ind]._date;
                                        for (int jPrms = 0; jPrms < Prms.Length; jPrms++)
                                        {
                                            if (Prms[jPrms] >= 0)
                                            {
                                                buff.slice[jPrms] = array[ind].slice[Prms[jPrms]];
                                            }
                                            else
                                            {
                                                buff.slice[jPrms] = float.NaN;
                                            }
                                        }
                                        result.Add(buff);
                                        // result.Add(array[ind]);
                                    }

                                    if (ind == first) break;

                                    ind = ind - 1;
                                    if (ind < 0) ind = size - 1;
                                }
                            }

                            result.Reverse();
                            return result.ToArray();
                        }
                    }
                }
                finally
                {
                    slim.ExitReadLock();
                }
            }
            return null;
        }