} = true;                                                  //space out sample requests so they don't all fall on the same 'tick'


        public void Add(ISampleSubject subject, int interval, int sampleSize, SamplingOptions samplingOptions = SamplingOptions.MEAN_COUNT, int intervalDeviation = -1)
        {
            if (!_subjects2data.ContainsKey(subject))
            {
                SubjectData sd = new SubjectData(subject, interval, sampleSize, samplingOptions, intervalDeviation);
                _subjects2data[subject] = sd;
            }
        }
 public SubjectData(ISampleSubject subject, int interval, int sampleSize, SamplingOptions samplingOptions, int intervalDeviation)
 {
     Subject           = subject;
     Interval          = interval;
     SampleSize        = sampleSize;
     Options           = samplingOptions;
     IntervalDeviation = intervalDeviation;
 }
 public void Remove(ISampleSubject subject)
 {
     if (_subjects2data.ContainsKey(subject))
     {
         lock (_subjects2data)
         {
             _subjects2data.Remove(subject);
         }
     }
 }
        public SubjectData GetSubjectData(ISampleSubject subject)
        {
            if (!_subjects2data.ContainsKey(subject))
            {
                return(null);
            }

            SubjectData sd = _subjects2data[subject];

            return(sd);
        }
        public List <double> GetSubjectSamples(ISampleSubject subject)
        {
            if (!_subjects2data.ContainsKey(subject))
            {
                return(null);
            }

            SubjectData sd = _subjects2data[subject];

            return(sd.Samples);
        }
        public double ProvideSample(ISampleSubject subject, double sample, long interval = -1)
        {
            if (!_subjects2data.ContainsKey(subject))
            {
                return(0);
            }

            SubjectData sd = _subjects2data[subject];

            sd.AddSample(sample, interval);

            SampleProvided?.Invoke(this, subject);

            return(sd.Average);
        }
        private void HandleSampleError(ISampleSubject subject, Exception e)
        {
            String desc = String.Format("Error when sampling subject {0}: {1} {2}", subject.GetType(), e.GetType(), e.Message);
            String source;

            if (subject is ArduinoDevice)
            {
                source = ((ArduinoDevice)subject).ID;
            }
            else
            {
                source = subject.GetType().ToString();
            }
            _erdb.LogEvent(EngineRoomServiceDB.LogEventType.ERROR, source, desc);
        }
 public long GetDurationTotal(ISampleSubject subject)
 {
     return(_subjects2data.ContainsKey(subject) ? _subjects2data[subject].DurationTotal : 0);
 }
 public double GetSampleCount(ISampleSubject subject)
 {
     return(_subjects2data.ContainsKey(subject) ? _subjects2data[subject].SampleCount : 0);
 }
 public double GetAverage(ISampleSubject subject)
 {
     return(_subjects2data.ContainsKey(subject) ? _subjects2data[subject].Average : 0);
 }
 private void HandleSampleProvided(Sampler sampler, ISampleSubject subject)
 {
     Sampler.SubjectData sd = sampler.GetSubjectData(subject);
     //outputSampleData(sd);
 }