Files
track-core/include/track_core/pid_runtime.hpp
T
crosstyan 1005e50be0 feat(track-core): add portable training runtimes
Move scheme and PID training runtime behavior into the pure track_core layer and expose render sinks for injected strip application.

Add ESP compatibility adapters, Python bindings/test scaffolding, and in-memory render support so app_track_bt can consume core render and runtime logic without duplicating it.

Cover circular/linear rendering boundaries, all scheme runtime types, scheme render_to parity, PID sample de-duplication, speed suppression, and live tuning in track-core tests.
2026-05-18 16:15:45 +08:00

74 lines
1.9 KiB
C++

#pragma once
#include <cstdint>
#include <memory>
#include <optional>
#include "track_core/model.hpp"
#include "track_core/pid_program.hpp"
namespace track_core {
struct TrackPidBandSnapshot {
std::uint8_t band_id{};
std::uint8_t heart_rate{};
std::uint32_t heart_rate_sample_seq{};
bool has_heart_rate{};
bool hr_is_fresh{};
std::uint16_t step_count{};
bool has_step_count{};
bool band_is_active{};
};
class PidHrRuntime {
public:
using time_point = clock::time_point;
PidHrRuntime();
explicit PidHrRuntime(TrackPidConfig config);
void set_pid_config(TrackPidConfig config);
void update_target_hr_bpm(std::uint8_t target_hr_bpm);
[[nodiscard]]
expected<unit, TrackError> apply_pid_runtime_command(
const TrackPidRuntimeCommand &command,
const TrackConfig *track_config);
[[nodiscard]]
const TrackPidConfig &pid_config() const;
void start(time_point now);
void stop();
void tick(const TrackConfig *track_config, const TrackPidBandSnapshot &band, time_point now);
[[nodiscard]]
TrackReport state_report(time_point now) const;
[[nodiscard]]
TrackInfo info() const;
[[nodiscard]]
TrackPidStatus pid_status(const TrackPidBandSnapshot &band, time_point now) const;
private:
static constexpr std::uint8_t magic_pid_track_id = 0;
[[nodiscard]]
float effective_speed_m_s(float base_speed_m_s, const TrackConfig *track_config) const;
TrackPidConfig config_{TrackPidConfig::default_config()};
bool running_{false};
Color color_{Color::white()};
time_point start_timestamp_{};
time_point last_tick_timestamp_{};
std::optional<std::uint32_t> last_consumed_hr_sample_seq_;
time_point last_consumed_hr_sample_time_{};
float mileage_m_{0.0F};
float base_speed_m_s_{0.0F};
float effective_speed_m_s_{0.0F};
std::unique_ptr<TrackPidProgramState> program_state_;
};
} // namespace track_core