// -*- C++ -*- // EDM strip data // // kasemir@lanl.gov #include #include"strip_data.h" StripData::StripData(size_t _channel_count, size_t _bucket_count, double _seconds, time_t now, unsigned long nano) { pthread_mutex_init(&mutex, 0); channel_count = _channel_count; bucket_count = _bucket_count; seconds = _seconds; end_secs = (double)now + nano/1e9; sec2bucket.setSource(-seconds, 0); sec2bucket.setDestination(0, bucket_count); buckets = new Bucket *[channel_count]; last_added = new size_t[channel_count]; last_entry = new size_t[channel_count]; for (size_t i=0; i= (size_t)scroll) last_added[channel] -= scroll; else last_added[channel] = bucket_count; } } unlock(); } void StripData::addSample(size_t channel, time_t t, unsigned long nano, double value) { size_t i; lock(); // t -> -seconds .. 0 double seconds_back = (double)t + nano/1e9 - end_secs; int b = (size_t)(sec2bucket.transform(seconds_back)+0.5); if (b < 0) // too old { unlock(); return; } if ((size_t)b >= bucket_count) // future -> now b = bucket_count-1; // b = 0... bucket_count-1, bucket index for new value // Repeat last known entry up to time t if (last_added[channel] < (size_t)b) { double v = buckets[channel][ringindex(last_added[channel])].last; for (i=last_added[channel]+1; i<(size_t)b; ++i) buckets[channel][ringindex(i)].sample(v); } // add new entry buckets[channel][ringindex(b)].sample(value); last_entry[channel] = last_added[channel] = b; // remove entries from here until "last_added" // which might be a result of scrolling for (i=b+1; i