Prepare the new score::time API#18
Conversation
License Check Results🚀 The license check job ran with the Bazel command: bazel run //:license-checkStatus: Click to expand output |
|
The created documentation from the pull request is available at: docu-html |
efabbd2 to
def162d
Compare
def162d to
64adae9
Compare
64adae9 to
ea3b132
Compare
There was a problem hiding this comment.
Pull request overview
This PR introduces the new score::time unified, tag-based clock framework (Clock<Tag>) and migrates TimeDaemon and related components away from the legacy SynchronizedVehicleTime / HighPrecisionLocalSteadyClock APIs toward the new vehicle_time and hpls_time domains. It also adds steady_time and system_time domains, PTP structural types, examples, and extensive PlantUML/Sphinx documentation updates.
Changes:
- Migrate TimeDaemon SVT verification/ptp stub code to use
score::time::HplsClock(newClock<Tag>API) instead of the legacy HPLSC factory/unique_ptr model. - Add new clock domains and core framework pieces (
score/time/clock/*,vehicle_time,steady_time,system_time,ptp), including mocks/stubs and unit tests. - Remove legacy
SynchronizedVehicleTimeandHighPrecisionLocalSteadyClockimplementation files and update documentation structure/diagrams.
Reviewed changes
Copilot reviewed 185 out of 215 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| score/TimeDaemon/code/verification_machine/svt/validators/timeout_validator.h | Switch validator to value-type ReferenceClock and new snapshot API. |
| score/TimeDaemon/code/verification_machine/svt/validators/timeout_validator.cpp | Use ClockSnapshot accessors (TimeSinceEpoch) instead of time_since_epoch(). |
| score/TimeDaemon/code/verification_machine/svt/validators/timeout_validator_test.cpp | Update tests to use HplsClockMock and ClockTestFactory. |
| score/TimeDaemon/code/verification_machine/svt/validators/time_jumps_validator.h | Switch validator to value-type ReferenceClock. |
| score/TimeDaemon/code/verification_machine/svt/validators/time_jumps_validator.cpp | Update time reads to new snapshot API. |
| score/TimeDaemon/code/verification_machine/svt/validators/time_jumps_validator_test.cpp | Update tests to new HPLS clock mock/snapshot types. |
| score/TimeDaemon/code/verification_machine/svt/validators/BUILD | Replace legacy HPLSC deps with hpls_time interface/mock targets. |
| score/TimeDaemon/code/verification_machine/svt/factory.cpp | Construct validators using HplsClock::GetInstance() instead of legacy factory. |
| score/TimeDaemon/code/verification_machine/svt/BUILD | Add hpls_time_mock to SVT test deps. |
| score/TimeDaemon/code/ptp_machine/stub/gptp_stub_machine_integration_test.cpp | Migrate integration test timing to HplsClock. |
| score/TimeDaemon/code/ptp_machine/stub/factory.cpp | Build stub machine with HplsClock::GetInstance(). |
| score/TimeDaemon/code/ptp_machine/stub/details/stub_ptp_engine.h | Switch engine clock member from unique_ptr to ReferenceClock value. |
| score/TimeDaemon/code/ptp_machine/stub/details/stub_ptp_engine.cpp | Use ClockSnapshot accessors to fill PtpTimeInfo. |
| score/TimeDaemon/code/ptp_machine/stub/details/BUILD | Replace legacy HPLSC interface dep with hpls_time:interface. |
| score/TimeDaemon/code/ptp_machine/stub/BUILD | Swap legacy HPLSC targets for hpls_time prod/mock targets. |
| score/TimeDaemon/code/ptp_machine/core/BUILD | Replace legacy HPLSC dep with hpls_time:interface. |
| score/TimeDaemon/code/ipc/svt/svt_time_info.h | Drop now-unneeded legacy HPLSC include from IPC snapshot types. |
| score/TimeDaemon/code/ipc/BUILD | Adjust visibility from legacy SVT packages to new vehicle_time td_impl pkg. |
| score/TimeDaemon/code/common/data_types/ptp_time_info.h | Redefine ReferenceClock as score::time::HplsClock. |
| score/TimeDaemon/code/common/data_types/BUILD | Update deps to hpls_time:interface. |
| score/time/vehicle_time/vehicle_clock.cpp | Implement VehicleTime hooks/traits wiring into backend iface. |
| score/time/vehicle_time/vehicle_clock_iface.h | Add internal backend interface for VehicleTime domain. |
| score/time/vehicle_time/details/td_impl/BUILD | Add TimeDaemon-backed production impl build targets and tests. |
| score/time/vehicle_time/details/stub_impl/vehicle_clock_impl.h | Add stub backend returning safe defaults. |
| score/time/vehicle_time/details/stub_impl/vehicle_clock_impl.cpp | Provide CreateBackend<VehicleTime>() stub specialization. |
| score/time/vehicle_time/details/stub_impl/BUILD | Build target for VehicleTime stub backend. |
| score/time/vehicle_time/details/logging_contexts.h | Introduce VehicleTime log context header (and add include guards). |
| score/time/vehicle_time/details/BUILD | Aggregate VehicleTime detail test suites. |
| score/time/system_time/system_clock.h | Add SystemClock domain (Clock<std::chrono::system_clock>). |
| score/time/system_time/system_clock.cpp | Implement ClockTraits<std::chrono::system_clock>::CallNow. |
| score/time/system_time/system_clock_mock.h | Add gmock backend for SystemClock. |
| score/time/system_time/system_clock_iface.h | Add backend iface contract for SystemClock. |
| score/time/system_time/details/system_time_impl/system_clock_impl.h | Add production backend calling std::chrono::system_clock::now(). |
| score/time/system_time/details/system_time_impl/system_clock_impl.cpp | Provide CreateBackend<std::chrono::system_clock>() specialization. |
| score/time/system_time/details/system_time_impl/system_clock_impl_test.cpp | Unit tests for SystemClock production backend. |
| score/time/system_time/details/system_time_impl/BUILD | Build rules for system_time production backend + tests. |
| score/time/system_time/details/stub_impl/system_clock_impl.h | Add stub backend for tests (epoch-zero snapshots). |
| score/time/system_time/details/stub_impl/system_clock_impl.cpp | Provide stub CreateBackend<std::chrono::system_clock>(). |
| score/time/system_time/details/stub_impl/BUILD | Build rules for system_time stub backend. |
| score/time/system_time/details/BUILD | Aggregate system_time detail test suites. |
| score/time/SynchronizedVehicleTime/synchronized_vehicle_time.cpp | Remove legacy SVT implementation source. |
| score/time/SynchronizedVehicleTime/synchronized_vehicle_time_mock.h | Remove legacy SVT mock header. |
| score/time/SynchronizedVehicleTime/slave_timebase_notification_types.cpp | Remove legacy SVT notification types TU. |
| score/time/SynchronizedVehicleTime/factory.h | Remove legacy SVT factory interface. |
| score/time/SynchronizedVehicleTime/factory_mock.h | Remove legacy SVT factory mock. |
| score/time/SynchronizedVehicleTime/details/tdr/factory_impl_test.cpp | Remove legacy SVT factory impl tests. |
| score/time/SynchronizedVehicleTime/details/logging_contexts.h | Remove legacy SVT logging contexts header. |
| score/time/SynchronizedVehicleTime/details/factory_shm_impl.h | Remove legacy SVT shm factory impl. |
| score/time/SynchronizedVehicleTime/details/factory_mock_helper.h | Remove legacy static factory mock helper. |
| score/time/SynchronizedVehicleTime/details/factory_impl.h | Remove legacy SVT factory impl header. |
| score/time/SynchronizedVehicleTime/details/clock_realtime/factory_impl.cpp | Remove legacy realtime SVT factory impl TU. |
| score/time/SynchronizedVehicleTime/details/clock_realtime/factory_impl_test.cpp | Remove legacy realtime SVT factory impl tests. |
| score/time/SynchronizedVehicleTime/details/clock_realtime/clock_provider.cpp | Remove legacy realtime SVT clock provider TU. |
| score/time/steady_time/steady_clock.h | Add SteadyClock domain (Clock<std::chrono::steady_clock>). |
| score/time/steady_time/steady_clock.cpp | Implement ClockTraits<std::chrono::steady_clock>::CallNow. |
| score/time/steady_time/steady_clock_mock.h | Add gmock backend for SteadyClock. |
| score/time/steady_time/steady_clock_iface.h | Add backend iface contract for SteadyClock. |
| score/time/steady_time/details/stub_impl/steady_clock_impl.h | Add stub backend for SteadyClock tests. |
| score/time/steady_time/details/stub_impl/steady_clock_impl.cpp | Provide stub CreateBackend<std::chrono::steady_clock>(). |
| score/time/steady_time/details/stub_impl/BUILD | Build rules for steady_time stub backend. |
| score/time/steady_time/details/steady_time_impl/steady_clock_impl.h | Add production backend calling std::chrono::steady_clock::now(). |
| score/time/steady_time/details/steady_time_impl/steady_clock_impl.cpp | Provide CreateBackend<std::chrono::steady_clock>() specialization. |
| score/time/steady_time/details/steady_time_impl/steady_clock_impl_test.cpp | Unit tests for steady_time production backend. |
| score/time/steady_time/details/steady_time_impl/BUILD | Build rules for steady_time production backend + tests. |
| score/time/steady_time/details/BUILD | Aggregate steady_time detail test suites. |
| score/time/ptp/time_slave_sync_data_test.cpp | Add unit test for TimeSlaveSyncData streaming/PrintTo. |
| score/time/ptp/port_identity.h | Add PortIdentity type with stream formatting helpers. |
| score/time/ptp/pdelay_measurement_data_test.cpp | Add unit test for PDelayMeasurementData streaming/PrintTo. |
| score/time/ptp/master_ptp_device_timer.h | Define master device timer tag + time_point alias. |
| score/time/ptp/local_ptp_device_timer.h | Define local device timer tag + time_point alias. |
| score/time/ptp/BUILD | Add ptp_types library and unit tests + suite. |
| score/time/hpls_time/test/benchmark/BUILD | Rename benchmark target and swap deps to new hpls_time target. |
| score/time/hpls_time/test/benchmark/benchmark.cpp | Update benchmark to call HplsClock::Now() via new API. |
| score/time/hpls_time/hpls_time.h | Define HplsTime tag (duration/timepoint). |
| score/time/hpls_time/hpls_clock.h | Add HplsClock domain (Clock<HplsTime>) traits. |
| score/time/hpls_time/hpls_clock.cpp | Implement ClockTraits<HplsTime>::CallNow. |
| score/time/hpls_time/hpls_clock_mock.h | Add gmock backend for HplsClock + test utilities integration. |
| score/time/hpls_time/hpls_clock_iface.h | Add backend iface contract for HplsClock. |
| score/time/hpls_time/details/system_clock/hpls_time_impl.h | Add non-QNX production backend for HplsTime. |
| score/time/hpls_time/details/system_clock/hpls_time_impl.cpp | Provide CreateBackend<HplsTime>() specialization for non-QNX backend. |
| score/time/hpls_time/details/system_clock/hpls_time_impl_test.cpp | Update/rename tests for new HplsTimeImpl backend. |
| score/time/hpls_time/details/system_clock/BUILD | Build rules for non-QNX backend and unit tests. |
| score/time/hpls_time/details/stub_impl/hpls_clock_impl.h | Add test-only stub backend for HplsTime. |
| score/time/hpls_time/details/stub_impl/hpls_clock_impl.cpp | Provide stub CreateBackend<HplsTime>(). |
| score/time/hpls_time/details/stub_impl/BUILD | Replace prior content with stub backend build rules. |
| score/time/hpls_time/details/qtime/tick_provider.h | Rename/move QNX tick provider API under new namespace/guards. |
| score/time/hpls_time/details/qtime/tick_provider.cpp | Update tick provider implementation include/namespace. |
| score/time/hpls_time/details/qtime/tick_provider_test.cpp | Update tick provider test namespaces and assertions. |
| score/time/hpls_time/details/qtime/tick_provider_mock.h | Add singleton mock wrapper for QNX tick provider. |
| score/time/hpls_time/details/qtime/tick_provider_mock.cpp | Provide mock-routed GetClockCyclesPerSec() and static storage. |
| score/time/hpls_time/details/qtime/hpls_qclock.h | Add QNX production backend for HplsTime. |
| score/time/hpls_time/details/qtime/hpls_qclock.cpp | Implement QNX backend and CreateBackend<HplsTime>(). |
| score/time/hpls_time/details/qtime/factory_test.cpp | Add factory test for QNX backend creation. |
| score/time/hpls_time/details/BUILD | Add hpls_time details test suite aggregation and QNX test suites. |
| score/time/HighPrecisionLocalSteadyClock/high_precision_local_steady_clock.h | Remove legacy HPLSC interface header. |
| score/time/HighPrecisionLocalSteadyClock/high_precision_local_steady_clock_mock.h | Remove legacy HPLSC mock header. |
| score/time/HighPrecisionLocalSteadyClock/high_precision_local_steady_clock_mock.cpp | Remove legacy HPLSC mock implementation TU. |
| score/time/HighPrecisionLocalSteadyClock/factory.h | Remove legacy HPLSC factory interface header. |
| score/time/HighPrecisionLocalSteadyClock/factory_mock.h | Remove legacy HPLSC factory mock header. |
| score/time/HighPrecisionLocalSteadyClock/details/system_clock/system_clock.h | Remove legacy system_clock backend header. |
| score/time/HighPrecisionLocalSteadyClock/details/qtime/tick_provider_mock.h | Remove legacy tick provider mock header. |
| score/time/HighPrecisionLocalSteadyClock/details/qtime/qclock.h | Remove legacy QNX qclock header. |
| score/time/HighPrecisionLocalSteadyClock/details/qtime/qclock.cpp | Remove legacy QNX qclock implementation TU. |
| score/time/HighPrecisionLocalSteadyClock/details/factory_impl.h | Remove legacy factory implementation header. |
| score/time/HighPrecisionLocalSteadyClock/details/factory_impl_stub.cpp | Remove legacy utest factory stub TU. |
| score/time/HighPrecisionLocalSteadyClock/details/BUILD | Remove legacy HPLSC details build definitions. |
| score/time/HighPrecisionLocalSteadyClock/BUILD | Remove legacy HPLSC package build definitions. |
| score/time/clock/subscription_hook.h | Add subscription SFINAE hook for event subscription. |
| score/time/clock/no_status.h | Define NoStatus placeholder status type. |
| score/time/clock/clock_traits.h | Add ClockTraits<Tag> primary template. |
| score/time/clock/clock_test_factory.h | Add test-only factory for constructor-injected clocks. |
| score/time/clock/clock_snapshot.h | Add immutable snapshot type with helper accessors. |
| score/time/clock/BUILD | Add clock core + test utilities build targets and unit tests. |
| score/time/clock/availability_hook.h | Add availability SFINAE hook + HasAvailability trait. |
| score/time/BUILD | Add umbrella unit test suite aggregation for all new time packages. |
| examples/time/system_time/system_time_handler.h | Add system_time example handler demonstrating SystemClock. |
| examples/time/system_time/BUILD | Add system_time example binary and handler unit test target. |
| examples/time/steady_time/steady_time_handler.h | Add steady_time example handler demonstrating SteadyClock. |
| examples/time/steady_time/steady_time_handler_test.cpp | Add steady_time handler unit test using clock override. |
| examples/time/steady_time/BUILD | Add steady_time example binary and tests. |
| examples/time/hpls_time/hpls_time_handler.h | Add hpls_time example handler demonstrating HplsClock. |
| examples/time/hpls_time/hpls_time_handler_test.cpp | Add hpls_time handler unit test using clock override. |
| examples/time/hpls_time/BUILD | Add hpls_time example binary and tests. |
| examples/time/BUILD | Add examples/time unit test suite aggregation. |
| docs/TimeDaemon/_assets/ver_machine/ver_verification_seq.puml | Add VerificationMachine workflow diagram. |
| docs/TimeDaemon/_assets/ver_machine/ver_init_seq.puml | Add VerificationMachine init sequence diagram. |
| docs/TimeDaemon/_assets/ver_machine/ver_class.puml | Add VerificationMachine class diagram. |
| docs/TimeDaemon/_assets/sad_deployment.puml | Add deployment view diagram. |
| docs/TimeDaemon/_assets/ptp_machine/ptp_machine_init_seq.puml | Add PTP machine init sequence diagram. |
| docs/TimeDaemon/_assets/ptp_machine/ptp_machine_get_new_data_seq.puml | Add PTP periodic publish workflow diagram. |
| docs/TimeDaemon/_assets/ptp_machine/ptp_machine_class.puml | Add PTP machine class diagram. |
| docs/TimeDaemon/_assets/mw/mw_time_receive_simple_seq.puml | Add simplified middleware receive diagram. |
| docs/TimeDaemon/_assets/mw/mw_time_receive_seq.puml | Add middleware receive flow diagram. |
| docs/TimeDaemon/_assets/mw/mw_class.puml | Add middleware class diagram. |
| docs/TimeDaemon/_assets/msg_broker/msg_broker_workflow_seq.puml | Add message broker workflow sequence diagram. |
| docs/TimeDaemon/_assets/msg_broker/msg_broker_init_seq.puml | Add message broker init sequence diagram. |
| docs/TimeDaemon/_assets/msg_broker/msg_broker_class.puml | Add message broker class diagram. |
| docs/TimeDaemon/_assets/ipc/ipc_receive_seq.puml | Add IPC receive sequence diagram. |
| docs/TimeDaemon/_assets/ipc/ipc_publish_seq.puml | Add IPC publish sequence diagram. |
| docs/TimeDaemon/_assets/ipc/ipc_init_seq.puml | Add IPC init sequence diagram. |
| docs/TimeDaemon/_assets/ipc/ipc_class.puml | Add IPC class diagram. |
| docs/TimeDaemon/_assets/examples/qvt/qvt_deployment.puml | Add example deployment diagram for QVT. |
| docs/TimeDaemon/_assets/examples/abs_time/abs_time_deployment.puml | Add example deployment diagram for absolute time. |
| docs/TimeDaemon/_assets/examples/abs_time/abs_time_data_control_flow.puml | Add absolute time multi-pipeline flow diagram. |
| docs/TimeDaemon/_assets/dd_deployment.puml | Add baseline deployment diagram. |
| docs/TimeDaemon/_assets/ctrlflow/ctrlflow_workflow_seq.puml | Add control flow divider workflow diagram. |
| docs/TimeDaemon/_assets/ctrlflow/ctrlflow_init_seq.puml | Add control flow divider init diagram. |
| docs/TimeDaemon/_assets/ctrlflow/ctrlflow_class.puml | Add control flow divider class diagram. |
| docs/TimeDaemon/_assets/app/app_workflow_seq.puml | Add app workflow sequence diagram. |
| docs/TimeDaemon/_assets/app/app_init_seq.puml | Add app init sequence diagram. |
| docs/TimeDaemon/_assets/app/app_class.puml | Add app class diagram. |
| docs/time/_assets/uc_testing.puml | Add UC diagram for scope-bound clock override in tests. |
| docs/time/_assets/uc_subscription.puml | Add UC diagram for async PTP event subscription. |
| docs/time/_assets/uc_polling.puml | Add UC diagram for polling with status check. |
| docs/time/_assets/uc_availability.puml | Add UC diagram for availability waiting. |
| docs/index.rst | Update docs index to include new TimeDaemon/ docs path. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| deactivate clock | ||
|
|
||
| note over of app | ||
| Only Clock<Tag> domains that require | ||
| async init expose IsAvailable(). |
| */ | ||
| class TimeoutValidator : public VerificationStage<PtpTimeInfo> | ||
| { | ||
| public: | ||
| explicit TimeoutValidator(std::unique_ptr<PtpTimeInfo::ReferenceClock> timeout_clock, | ||
| explicit TimeoutValidator(PtpTimeInfo::ReferenceClock timeout_clock, |
| EXPECT_TRUE(VehicleClock::GetInstance().WaitUntilAvailable(source.get_token(), until)); | ||
| } | ||
|
|
||
| // ── UC3: Subscribe / Unsubscribe — callback is captured and invocable ───────── |
There was a problem hiding this comment.
Subscribe<E>() appears compile-time-safe for unsupported events. Still, I only see clear test coverage for TimeSlaveSyncData<VehicleTime>—please point to equivalent coverage for PDelayMeasurementData<VehicleTime> as well.
There was a problem hiding this comment.
VehicleTime, HplsClock, SteadyClock, and SystemClock currently look like peers under one unified API, but in automotive use, they serve very different purposes. SteadyClock is typically just a local monotonic source for timeout/debounce/duration logic and often does not need daemon/service involvement at all(often stdlib is enough); SystemClock is even less equivalent, since absolute time usually comes from RTC/GNSS/NTP/backend sync and cannot guarantee monotonic/no-leap behavior. From the likely automotive use cases, do we really need these wrappers inside the TimeDaemon?
BjoernAtBosch
left a comment
There was a problem hiding this comment.
Basically, I like this "unified API" approach.
Unfortunately, I'm not fully through all this. Some general questions I still have in my mind:
- Would we need further time bases besides the ones predefined here? And should they be runtime configurable?
- How do we assume that syncing the system_clock is done? Via NTP?
More to come maybe - need to step out for today ...
| +===========================+==============================================================+ | ||
| | ``kSynchronized`` | Synchronized at least once to the PTP Grand Master | | ||
| +---------------------------+--------------------------------------------------------------+ | ||
| | ``kSynchToGateway`` | Currently in sync with the PTP gateway | |
There was a problem hiding this comment.
Why is this state required (in comparison to kSynchronized)?
| +---------------------------+--------------------------------------------------------------+ | ||
| | ``kTimeLeapPast`` | A large backward adjustment was applied | | ||
| +---------------------------+--------------------------------------------------------------+ | ||
| | ``kUnknown`` | Status cannot be determined | |
There was a problem hiding this comment.
Shouldn't we have a state kNotSynchonizedDueToStartup like it's defined in AUTOSAR?
| UC5 — HPLSC as reference steady clock | ||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|
|
||
| .. raw:: html | ||
|
|
||
| <div style="overflow-x: auto; max-width: 100%;"> | ||
|
|
||
| .. uml:: _assets/examples/qvt/qvt_deployment.puml | ||
| :alt: Deployment view | ||
|
|
||
| .. raw:: html | ||
| ``HplsClock`` (High-Precision Local Steady Clock) is a monotonic clock that provides | ||
| nanosecond-resolution time without any PTP dependency. It has **no status** — it is always | ||
| ready. |
There was a problem hiding this comment.
I would prefer resolution over precision because the term precision is already occupied (like in "precision time protocol") for how precise the frequency (and deviation) of a clock is in sync with a certain/ideal clock. Which is different of how fine-granular the time can be measured. Also, this is the term used in the C++ stdlib (std::high_resolution_clock).
I'd also prefer another ordering - especially the term local should be moved:
- local steady high-precision clock
- high-precison steady local clock
- local high-precision steady clock
| The design separates three concerns: | ||
|
|
||
| More precisely we can specify the following use cases for the time daemon: | ||
| 1. **What kind of time** — expressed as a *tag struct* (``VehicleTime``, ``HplsTime``, |
There was a problem hiding this comment.
"What kind of time": Initially, I was thinking that a clock would be defined by aspects like epoch, resolution, precision and so on, e.g. VehicleTime's epoch is start of vehicle's current power cycle and SystemTime's epoch is Unix epoch.
But I think, it's more the purpose or use cases, that define a certain type of clock. For example, in theory the epochs of VehicleTime and SystemTime could be the same (if someone could guarantee reliable sync with UTC/TAI). The difference between both are the requirements/use cases:
VehicleTime must be highly (and fast) available and shall be steady and precise. It's epoch and validity to the outside world of the vehicle is irrelevant.
SystemTime/"WorldTime" is a bit opposite: It's used for syncing events with things outside the vehicle. Its availability cannot be guaranteed.
This is not necessarily a finding, but more "wrapping up" some thinking. (Still learning ;-))
There was a problem hiding this comment.
I've some findings regarding the naming and meanings:
- Imho HplsTime should be changed (see finding below), but besides I have some doubts about its meaning: I think you defined it as an alternative to C++'s
std::high_resolution_clockbecause you're unhappy (as me also) with it's unclear definition (is it steady or not?). The potential difficulty of our own definition will be its mapping: If you just map it tostd::high_resolution_clockyou'll have the same issue again. If you'd map it tostd::steady_clockyou can't guarantee the high resolution". (My observation under WSL Linux is that the high resolution clock is mapped tostd::system_clock.) - system_clock: Is basically fine - it represents the local clock of the S-CORE underlying OS. But with that it will most probably represent unix time, which has the issue of ignoring possible leap seconds; ignoring means that in case of a leap second the same second will "show up" twice in unix time, i.e. it has the same representation as the second before the leap second. Whereas in UTC or TAI each second in time is clearly separable. I'm not sure if this could lead to issues in cases "worldwide" ordering of events.
- Question is if we need something like "GlobalTime" or explicitly TAI or UTC? This is also about the naming -
system_timeis somehow unspecific: Is it the time of the local S-CORE based system? Or the of the "vehicle system"? I mean, because of thestd::system_clockit should be quite clear. But how does s.o. know that it is sync (or not) with a global time master?
| ``{kTimeOut, kTimeLeapFuture, kTimeLeapPast}`` is set. | ||
|
|
||
| </div> | ||
| UC2 — Availability waiting at startup |
There was a problem hiding this comment.
Not sure if we need the separated availability handling or if that could be solved via sync state kNotSynchonizedDueToStartup
score::time — Unified Clock API (new
Clock<Tag>framework)Ref: #9
Summary
Introduces
score::time— a unified, tag-based clock API that replaces theSynchronizedVehicleTimeandHighPrecisionLocalSteadyClockclass hierarchies with asingle, scalable template wrapper
Clock<Tag>. All four clock domains (vehicle time,HPLS, steady, system) are accessible through the same call pattern. Legacy packages are
marked deprecated and will be removed once
TimeDaemonconsumers have migrated.Motivation
The existing API had several pain points across
safe-posix-platformandddadconsumers:SynchronizedVehicleTime::FactoryImplandHighPrecisionLocalSteadyClock::FactoryImplhad completely different construction patterns.requiring test-specific constructor signatures.
TimeStatussnapshot — public data members, raw-uint64_tconstructors, andnon-const accessors triggered Coverity
M11-0-1suppressions.Set*/Unset*for each PTP event type; no genericsubscription pattern.
steady_clock/system_clockunification — callers mixedstd::chronoclocks andBMW-specific clocks with incompatible APIs.
Changes
New framework —
score/time/clock/clock.hClock<Tag>value wrapper —Now(),Subscribe<E>(),IsAvailable(),GetInstance()clock_traits.hClockTraits<Tag>primary template +std::chronospecialisationsclock_override_guard.hClockOverrideGuard<Tag>RAII guard for test mock injectionclock_snapshot.hClockSnapshot<TimepointT, StatusT>immutable two-field snapshotclock_status.hClockStatus<FlagEnumT>bit-flag status utilityno_status.hNoStatusempty placeholder for always-ready clockssubscription_hook.hSubscriptionHook<Tag, E>extension point for PTP callbacksavailability_hook.hAvailabilityHook<Tag>extension point for async readinessNew clock domains
score/time/vehicle_time/:vehicle_time/:vehicle_time_mock/:interfacescore/time/hpls_time/:hpls_time/:hpls_time_mock/:interfacescore/time/steady_time/:steady_time/:steady_time_mock/:interfacestd::chrono::steady_clockwrapperscore/time/system_time/:system_time/:system_time_mock/:interfacestd::chrono::system_clockwrapperscore/time/ptp/:ptp_typesTimeSlaveSyncData<Tag>,PDelayMeasurementData<Tag>Visibility hardening
*_clock,*_clock_iface,*_clock_impl,*_clock_mock,clock_core) restricted to//score/time:__subpackages__.:vehicle_time(prod),:vehicle_time_mock(test),
:interface(header-only).examples/time/aggregation moved to its own//examples/time:unit_test_suite; no longerreferenced from
//score/time:unit_test_suite.Examples —
examples/time/Four self-contained examples (one per domain) demonstrating polling, status checks, and
callback registration. Handler filenames match class names
(
vehicle_time_handler.h/VehicleTimeHandler, etc.).Legacy deprecation
score/time/SynchronizedVehicleTime/BUILDandscore/time/HighPrecisionLocalSteadyClock/BUILDretain a
DEPRECATEDcomment block and carrydeprecation = "..."on their alias targetsso any target that still depends on them receives a Bazel analysis-time warning. Both packages
are kept until
score/TimeDaemon/consumers complete migration.Documentation —
docs/time/New Sphinx RST documentation for the
score::timeAPI, with six use-case sections and fivePlantUML sequence/class diagrams. The former
docs/time/(TimeDaemon architecture) isrenamed to
docs/TimeDaemon/.API example