доработки всякие
This commit is contained in:
@@ -3,17 +3,17 @@
|
||||
#include <string.h>
|
||||
|
||||
bool Measurement::start(float hz, float duty, float tolerance, uint32_t timeMs,
|
||||
uint8_t settleCycles) {
|
||||
uint16_t averagingPeriods, uint8_t settleCycles) {
|
||||
if (!task_ && xTaskCreate(taskEntry, "optical-rx", 4096, this, 4, &task_) != pdPASS) return false;
|
||||
expectedHz_ = static_cast<uint32_t>(hz + 0.5f);
|
||||
expectedDutyPct_ = duty;
|
||||
tolerance = effectiveTolerancePct(tolerance);
|
||||
if (!expectedHz_ || !timeMs ||
|
||||
if (!expectedHz_ || !timeMs || !averagingPeriods ||
|
||||
!receiver_.start(expectedHz_, expectedDutyPct_)) return false;
|
||||
if (!makePeriodLimits(expectedHz_, duty, tolerance, receiver_.tickHz(), limits_)) {
|
||||
receiver_.stop(); return false;
|
||||
}
|
||||
settleCycles_ = settleCycles; settleLeft_ = settleCycles;
|
||||
tolerancePct_ = tolerance;
|
||||
averagingPeriods_ = averagingPeriods;
|
||||
resetAveragingWindow();
|
||||
stepTimeMs_ = (timeMs + MEASUREMENT_PROGRESS_STEPS - 1U) / MEASUREMENT_PROGRESS_STEPS;
|
||||
stepTicks_ = static_cast<uint64_t>(receiver_.tickHz()) * timeMs /
|
||||
(1000ULL * MEASUREMENT_PROGRESS_STEPS);
|
||||
@@ -30,6 +30,13 @@ bool Measurement::start(float hz, float duty, float tolerance, uint32_t timeMs,
|
||||
return true;
|
||||
}
|
||||
|
||||
void Measurement::resetAveragingWindow() {
|
||||
windowPeriodCount_ = 0;
|
||||
windowPeriodSum_ = windowActiveSum_ = 0;
|
||||
windowMinPeriod_ = UINT32_MAX;
|
||||
windowMaxPeriod_ = 0;
|
||||
}
|
||||
|
||||
void Measurement::taskEntry(void *context) {
|
||||
static_cast<Measurement *>(context)->taskLoop();
|
||||
}
|
||||
@@ -51,6 +58,14 @@ void Measurement::completeMeasurement() {
|
||||
receiver_.stop();
|
||||
stats_.droppedItems += receiver_.takeDroppedItems();
|
||||
if (receiver_.overflowed()) { fail(FailReason::GLITCH); return; }
|
||||
if (windowPeriodCount_) {
|
||||
const FailReason result = evaluatePeriodWindow(
|
||||
windowPeriodSum_, windowActiveSum_, windowPeriodCount_, receiver_.tickHz(),
|
||||
expectedHz_, expectedDutyPct_, tolerancePct_,
|
||||
windowMinPeriod_, windowMaxPeriod_,
|
||||
currentStep_ + 1U, stats_);
|
||||
if (result != FailReason::NONE) { fail(result); return; }
|
||||
}
|
||||
publishStats();
|
||||
if (++currentStep_ < MEASUREMENT_PROGRESS_STEPS) {
|
||||
state_ = MeasureState::STEP_READY;
|
||||
@@ -99,8 +114,32 @@ MeasureState Measurement::processOnce() {
|
||||
const uint64_t endTick = period.startTick + period.periodTicks;
|
||||
if (period.startTick < measurementStartTick_) continue; // leading incomplete period
|
||||
if (endTick > deadlineTick_) { completeMeasurement(); return state_; } // trailing incomplete period
|
||||
const FailReason r = evaluatePeriodFast(period, receiver_.tickHz(), limits_, 1, stats_);
|
||||
if (r != FailReason::NONE) { fail(r); return state_; }
|
||||
if (!period.periodTicks || period.activeTicks >= period.periodTicks) {
|
||||
fail(FailReason::EXTRA_EDGE); return state_;
|
||||
}
|
||||
|
||||
++stats_.periods;
|
||||
stats_.periodSum += period.periodTicks;
|
||||
stats_.activeSum += period.activeTicks;
|
||||
if (period.periodTicks < stats_.minPeriod) stats_.minPeriod = period.periodTicks;
|
||||
if (period.periodTicks > stats_.maxPeriod) stats_.maxPeriod = period.periodTicks;
|
||||
if (period.activeTicks < stats_.minActive) stats_.minActive = period.activeTicks;
|
||||
if (period.activeTicks > stats_.maxActive) stats_.maxActive = period.activeTicks;
|
||||
|
||||
if (period.periodTicks < windowMinPeriod_) windowMinPeriod_ = period.periodTicks;
|
||||
if (period.periodTicks > windowMaxPeriod_) windowMaxPeriod_ = period.periodTicks;
|
||||
++windowPeriodCount_;
|
||||
windowPeriodSum_ += period.periodTicks;
|
||||
windowActiveSum_ += period.activeTicks;
|
||||
if (windowPeriodCount_ >= averagingPeriods_) {
|
||||
const FailReason result = evaluatePeriodWindow(
|
||||
windowPeriodSum_, windowActiveSum_, windowPeriodCount_, receiver_.tickHz(),
|
||||
expectedHz_, expectedDutyPct_, tolerancePct_,
|
||||
windowMinPeriod_, windowMaxPeriod_,
|
||||
currentStep_ + 1U, stats_);
|
||||
resetAveragingWindow();
|
||||
if (result != FailReason::NONE) { fail(result); return state_; }
|
||||
}
|
||||
}
|
||||
}
|
||||
if (receivedPeriod && state_ == MeasureState::RUNNING) lastPeriodMs_ = millis();
|
||||
@@ -136,6 +175,9 @@ bool Measurement::continueAfterDisplay() {
|
||||
fail(FailReason::UNSUPPORTED);
|
||||
return false;
|
||||
}
|
||||
// receiver_.start() starts a new RMT timebase and therefore a new sampling
|
||||
// phase. Start a fresh averaging window for the new continuous capture.
|
||||
resetAveragingWindow();
|
||||
settleLeft_ = settleCycles_;
|
||||
measurementStartTick_ = deadlineTick_ = 0;
|
||||
startedMs_ = millis(); measurementStartMs_ = lastPeriodMs_ = 0;
|
||||
|
||||
Reference in New Issue
Block a user