#pragma once #include "Receiver.h" enum class MeasureState : uint8_t { IDLE, SETTLING, RUNNING, PASS, FAIL }; class Measurement { public: explicit Measurement(PulseReceiver &receiver) : receiver_(receiver) {} bool start(float expectedHz, float expectedDuty, float tolerancePct, uint32_t testTimeMs, uint8_t repeats, uint8_t settleCycles); MeasureState update(); void abort(); MeasureState state() const { return state_; } FailReason reason() const { return stats_.reason; } const StageStats &stats() const { return stats_; } private: void fail(FailReason reason); PulseReceiver &receiver_; MeasureState state_ = MeasureState::IDLE; StageStats stats_ = {}; float expectedHz_ = 0, expectedDuty_ = 0, tolerance_ = 0; uint32_t timeMs_ = 0; uint8_t repeats_ = 0, settleLeft_ = 0; uint64_t measurementStartTick_ = 0, deadlineTick_ = 0, repeatTicks_ = 0; uint32_t startedMs_ = 0, measurementStartMs_ = 0, lastPeriodMs_ = 0; uint32_t repeatPeriods_[10] = {}; };