Глобальная переделка. тест сделан по длине импульса и заданной частоте шим, а не меандру

This commit is contained in:
2026-08-12 18:10:05 +03:00
parent 1db89fca79
commit a17e8962b4
19 changed files with 958 additions and 642 deletions

View File

@@ -1,7 +1,7 @@
#pragma once
#include "Receiver.h"
enum class MeasureState : uint8_t { IDLE, SETTLING, RUNNING, STEP_READY, PASS, FAIL };
enum class MeasureState : uint8_t { IDLE, SETTLING, RUNNING, PASS, FAIL };
class Measurement {
public:
@@ -10,8 +10,9 @@ class Measurement {
uint32_t testTimeMs, uint16_t averagingPeriods,
uint8_t settleCycles);
MeasureState update();
bool continueAfterDisplay();
bool takeProgressUpdate();
void abort();
void forceFail(FailReason reason);
MeasureState state() const { return state_; }
FailReason reason() const { return stats_.reason; }
const StageStats &stats() const { return stats_; }
@@ -24,7 +25,6 @@ class Measurement {
void fail(FailReason reason);
void completeMeasurement();
void publishStats();
void resetAveragingWindow();
PulseReceiver &receiver_;
volatile MeasureState state_ = MeasureState::IDLE;
TaskHandle_t task_ = nullptr;
@@ -33,14 +33,11 @@ class Measurement {
mutable portMUX_TYPE statsMux_ = portMUX_INITIALIZER_UNLOCKED;
uint32_t expectedHz_ = 0;
float expectedDutyPct_ = 0.0f, tolerancePct_ = 0.0f;
uint16_t averagingPeriods_ = 1;
uint32_t windowPeriodCount_ = 0;
uint64_t windowPeriodSum_ = 0, windowActiveSum_ = 0;
uint32_t windowMinPeriod_ = UINT32_MAX, windowMaxPeriod_ = 0;
uint8_t settleCycles_ = 0, settleLeft_ = 0;
uint64_t measurementStartTick_ = 0, deadlineTick_ = 0, stepTicks_ = 0;
uint32_t startedMs_ = 0, measurementStartMs_ = 0, lastPeriodMs_ = 0;
uint32_t stepTimeMs_ = 1, expectedPeriodMs_ = 1;
volatile uint8_t currentStep_ = 0;
volatile bool progressUpdatePending_ = false;
PulsePeriod periodBatch_[PERIOD_BATCH_SIZE] = {};
};