#pragma once #include #include #include "track_core/model.hpp" #include "track_core/render.hpp" #include "track_core/scheme_decoder.hpp" namespace track_core { struct SchemeTrackState { bool is_running{}; std::size_t primary_segment_index{}; std::size_t sub_segment_index{}; float mileage_m{}; float loop_mileage_m{}; float speed_m_s{}; float elapsed_s{}; }; struct SchemeTrackRuntime { DecodedScheme scheme; SchemeTrackState state; }; [[nodiscard]] DecodedScheme make_speed_mileage_scheme( std::uint8_t id, Color color, AccelerationProfile acceleration_profile, std::vector segments); [[nodiscard]] DecodedScheme make_mileage_time_scheme( std::uint8_t id, Color color, AccelerationProfile acceleration_profile, std::vector segments); [[nodiscard]] DecodedScheme make_speed_time_scheme( std::uint8_t id, Color color, AccelerationProfile acceleration_profile, std::vector segments); [[nodiscard]] DecodedScheme make_repeated_speed_mileage_time_scheme( std::uint8_t id, Color color, AccelerationProfile acceleration_profile, std::vector segments); [[nodiscard]] expected make_scheme_track_runtime(DecodedScheme scheme); [[nodiscard]] SchemeTrackRuntime start_scheme_track(SchemeTrackRuntime runtime); [[nodiscard]] SchemeTrackRuntime stop_scheme_track(SchemeTrackRuntime runtime); [[nodiscard]] SchemeTrackRuntime tick_scheme_track( const TrackConfig &config, SchemeTrackRuntime runtime, float delta_s); [[nodiscard]] TrackInfo scheme_track_info(const SchemeTrackRuntime &runtime); [[nodiscard]] TrackReport scheme_track_report(const SchemeTrackRuntime &runtime); class SchemeTrainingRuntime { public: [[nodiscard]] bool has_program() const noexcept; [[nodiscard]] bool all_stopped() const noexcept; [[nodiscard]] expected add_scheme(DecodedScheme scheme); void clear(); void start(); void stop(); void tick(const TrackConfig &config, float delta_s); [[nodiscard]] TrackStateReportCollection state_collection() const; [[nodiscard]] TrackSchemeMgrRead scheme_status() const; [[nodiscard]] expected render_to(const TrackConfig &config, TrackRenderSink sink) const; [[nodiscard]] expected, TrackError> render_pixels(const TrackConfig &config) const; private: std::vector tracks_; }; } // namespace track_core