| // Copyright 2022 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| syntax = "proto3"; |
| |
| package pw.chrono; |
| |
| option java_outer_classname = "Chrono"; |
| |
| message EpochType { |
| enum Enum { |
| UNKNOWN = 0; |
| |
| TIME_SINCE_BOOT = 1; |
| |
| // Time since 00:00:00 UTC, Thursday, 1 January 1970, including leap |
| // seconds. |
| UTC_WALL_CLOCK = 2; |
| |
| // Time since 00:00:00, 6 January 1980 UTC. Leap seconds are not inserted |
| // into GPS. Thus, every time a leap second is inserted into UTC, UTC |
| // falls another second behind GPS. |
| GPS_WALL_CLOCK = 3; |
| |
| // Time since 00:00:00, 1 January 1958, and is offset 10 seconds ahead of |
| // UTC at that date (i.e., its epoch, 1958-01-01 00:00:00 TAI, is |
| // 1957-12-31 23:59:50 UTC). Leap seconds are not inserted into TAI. Thus, |
| // every time a leap second is inserted into UTC, UTC falls another second |
| // behind TAI. |
| TAI_WALL_CLOCK = 4; |
| }; |
| } |
| |
| // A representation of a clock's parameters. |
| // |
| // There are two major components to representing a steady, monotonic clock: |
| // |
| // 1. A representation of the clock's period. |
| // 2. A representation of the clock's epoch. |
| // |
| // To support a wide range of clock configurations, ClockParameters represents |
| // a clock's period as fractions of a second. Concretely: |
| // |
| // Clock period (seconds) = |
| // tick_period_seconds_numerator / tick_period_seconds_denominator |
| // |
| // So a simple 1KHz clock can be represented as: |
| // |
| // tick_period_seconds_numerator = 1 |
| // tick_period_seconds_denominator = 1000 |
| // Clock period = 1 / 1000 = 0.001 seconds |
| // Clock frequency = 1 / 0.001 = 1,000 Hz |
| // |
| // Failing to specify one or both of the period members of a ClockParameters |
| // message leaves the configuration specification incomplete and invalid. |
| // |
| // While clock period alone is enough to represent a duration if given a number |
| // of ticks, an epoch is required to make a clock represent a time point. |
| // EpochType optionally provides this information. Specifying an EpochType |
| // defines what a tick count of `0` represents. Some epoch types (e.g. UTC, GPS, |
| // TAI) allow the clock to resolve to real-world time points. If the EpochType |
| // is relative to boot or unknown, however, the clock is only sufficiently |
| // specified for relative time measurement without additional external |
| // information. |
| message ClockParameters { |
| int32 tick_period_seconds_numerator = 1; // Required |
| int32 tick_period_seconds_denominator = 2; // Required |
| optional EpochType.Enum epoch_type = 3; |
| } |
| |
| // A point in time relative to a clock's epoch. |
| message TimePoint { |
| // The duration that has elapsed (number of clock ticks) since the epoch, |
| // where the tick period and epoch are specified by the clock parameters. |
| // |
| // The meaning of `timestamp` is unspecified without an associated |
| // ClockParameters. |
| int64 timestamp = 1; // Required |
| ClockParameters clock_parameters = 2; // Required |
| } |
| |
| // The time of a snapshot capture. Supports multiple timestamps to |
| // cover multiple time bases or clocks (e.g. time since boot, time |
| // from epoch, etc). |
| // |
| // This is an overlay proto for Snapshot, see more details here: |
| // https://pigweed.dev/pw_snapshot/proto_format.html#module-specific-data |
| message SnapshotTimestamps { |
| repeated TimePoint timestamps = 22; |
| } |