private void AddUniformMom(IReadMean fromList, MomList toList, int i, DateTime t) { if (i < fromList.Count && fromList.TimeI(i) == t) { return; } toList.AddMom(fromList.ToMomI(i == 0 ? 0 : i - 1, t)); }
//Добавка мгновенного значения в список или клон //Возвращает количество реально добавленных значений internal override int AddMom(DateTime time, MomErr err) { if (!CheckMomTime(time, err)) { return(0); } MomList.AddMom(BufMom); return(1); }
//Агрегация по равномерным сегментам //На входе функция с параметрами: текущий результат, список и обрабатываемый номер private void Agregate(Action <EditMom, MomList, int, DateTime> fun) { double seglen = _pars[0].Real, segshift = _pars.Length < 2 ? 0 : _pars[1].Real * seglen; var moms = _initialSignal.OutValue; if (moms.Count == 0) { return; } var mlist = MFactory.NewList(DataType); //Добавляем в список границы сегментов var t = Connect.PeriodBegin; int i = 0; while (t < Connect.PeriodEnd.AddMilliseconds(1)) { while (i < moms.Count && moms.TimeI(i) < t) { if (moms.TimeI(i) >= Connect.PeriodBegin && moms.TimeI(i) <= Connect.PeriodEnd) { mlist.AddMom(moms.ToMomI(i)); } i++; } AddUniformMom(moms, mlist, i, t); t = t.AddSeconds(seglen); } if (i < moms.Count && moms.TimeI(i) == Connect.PeriodEnd) { mlist.AddMom(moms.ToMomI(i)); } t = Connect.PeriodBegin; i = 0; while (t < Connect.PeriodEnd.AddMilliseconds(-1)) { var me = new EditMom(DataType, t.AddSeconds(segshift)); if (fun.Method.Name == "AverageScalar") { me.Real = 0; } else { me.CopyValueFrom(mlist, i); } t = t.AddSeconds(seglen); while (i < mlist.Count && mlist.TimeI(i) <= t) { fun(me, mlist, i++, t); } if (i > 0 && mlist.TimeI(i - 1) == t) { i--; } MomList.AddMom(me); } }
//Добавляет значение среза на начало периода в список, возвращает 1, если срез был получен, иначе 0 internal override int MakeBegin() { if (!HasBegin) { return(0); } MomList.AddMom(_beginMom); return(1); }
//Взятие бита, pars[0] - номер бита public void Bit() { int bit = _pars[0].Integer; var moms = _initialSignal.OutValue; for (int i = 0; i < moms.Count; i++) { MomList.AddMom(moms.TimeI(i), moms.IntegerI(i).GetBit(bit), moms.ErrorI(i)); } }
//Взятие битов и сложение по Or, pars - номера битов public void BitOr() { var moms = _initialSignal.OutValue; for (int i = 0; i < moms.Count; i++) { var v = moms.IntegerI(i); bool res = false; foreach (var par in _pars) { res |= v.GetBit(par.Integer); } MomList.AddMom(moms.TimeI(i), res, moms.ErrorI(i)); } }
//Добавка мгновенного значения в список или клон //Возвращает количество реально добавленных значений internal override int AddMom(DateTime time, MomErr err) { BufMom.Time = time; BufMom.Error = err; if (time <= Connect.PeriodBegin) { if (_beginMom.Time <= time) { _beginMom.CopyAllFrom(BufMom); } } else if (time <= Connect.PeriodEnd) { if (_endMom.Time <= time) { _endMom.CopyAllFrom(BufMom); } MomList.AddMom(BufMom); return(1); } return(0); }