not 100% this rate calculation is right, but might be better than before?

This commit is contained in:
2025-11-05 09:57:05 +01:00
parent e5cb019143
commit 617dd3153b

View File

@@ -477,10 +477,13 @@ void asynStreamGeneratorDriver::processEvents() {
// uint32. It does support int64 though.. so we start with that
epicsInt32 *counts = new epicsInt32[this->num_channels];
const uint64_t minRateSamplePeriod = 100'000'000ll;
const size_t rateAverageWindow = 20;
size_t countDiffsPtr = 0;
epicsInt32 *rates = new epicsInt32[this->num_channels];
epicsInt32 *countDiff = new epicsInt32[this->num_channels];
epicsInt32 *countDiffs = new epicsInt32[this->num_channels * 10];
epicsInt32 *countDiffs = new epicsInt32[this->num_channels * rateAverageWindow];
uint64_t *timeSpans = new uint64_t[this->num_channels];
epicsTimeStamp lastRateUpdate = epicsTime::getCurrent();
asynStatus status = asynSuccess;
@@ -613,23 +616,30 @@ void asynStreamGeneratorDriver::processEvents() {
// Careful changing any of these magic numbers until I clean this up
// as you might end up calculating the wrong rate
epicsTimeStamp currentTime = epicsTime::getCurrent();
if (epicsTimeDiffInNS(&currentTime, &lastRateUpdate) > 100'000'000ll) {
if (epicsTimeDiffInNS(&currentTime, &lastRateUpdate) > minRateSamplePeriod) {
timeSpans[countDiffsPtr] = epicsTimeDiffInNS(&currentTime, &lastRateUpdate);
uint64_t totalTime = 0;
for (size_t i = 0; i <= rateAverageWindow; ++i) {
totalTime += timeSpans[i];
}
lastRateUpdate = currentTime;
for (size_t i = 0; i <= this->num_channels; ++i) {
countDiffs[i * 10 + countDiffsPtr] = countDiff[i];
countDiffs[i * rateAverageWindow + countDiffsPtr] = countDiff[i];
uint64_t cnt = 0;
for (size_t j = 0; j <= 10; ++j) {
cnt += countDiffs[i * 10 + j];
for (size_t j = 0; j <= rateAverageWindow; ++j) {
cnt += countDiffs[i * rateAverageWindow + j];
}
rates[i] =
cnt; // would / 10 to average than * 10 as want per second
cnt / (totalTime * 1e-9);
countDiff[i] = 0;
}
countDiffsPtr = (countDiffsPtr + 1) % 10;
countDiffsPtr = (countDiffsPtr + 1) % rateAverageWindow;
if (countDiffsPtr % 5 == 0) {
lock();