1*61c4878aSAndroid Build Coastguard Worker// Copyright 2022 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker// 3*61c4878aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker// use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker// the License at 6*61c4878aSAndroid Build Coastguard Worker// 7*61c4878aSAndroid Build Coastguard Worker// https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker// 9*61c4878aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker// License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker// the License. 14*61c4878aSAndroid Build Coastguard Worker 15*61c4878aSAndroid Build Coastguard Workersyntax = "proto3"; 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard Workerpackage pw.chrono; 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard Workeroption java_outer_classname = "Chrono"; 20*61c4878aSAndroid Build Coastguard Worker 21*61c4878aSAndroid Build Coastguard Workermessage EpochType { 22*61c4878aSAndroid Build Coastguard Worker enum Enum { 23*61c4878aSAndroid Build Coastguard Worker UNKNOWN = 0; 24*61c4878aSAndroid Build Coastguard Worker 25*61c4878aSAndroid Build Coastguard Worker TIME_SINCE_BOOT = 1; 26*61c4878aSAndroid Build Coastguard Worker 27*61c4878aSAndroid Build Coastguard Worker // Time since 00:00:00 UTC, Thursday, 1 January 1970, including leap 28*61c4878aSAndroid Build Coastguard Worker // seconds. 29*61c4878aSAndroid Build Coastguard Worker UTC_WALL_CLOCK = 2; 30*61c4878aSAndroid Build Coastguard Worker 31*61c4878aSAndroid Build Coastguard Worker // Time since 00:00:00, 6 January 1980 UTC. Leap seconds are not inserted 32*61c4878aSAndroid Build Coastguard Worker // into GPS. Thus, every time a leap second is inserted into UTC, UTC 33*61c4878aSAndroid Build Coastguard Worker // falls another second behind GPS. 34*61c4878aSAndroid Build Coastguard Worker GPS_WALL_CLOCK = 3; 35*61c4878aSAndroid Build Coastguard Worker 36*61c4878aSAndroid Build Coastguard Worker // Time since 00:00:00, 1 January 1958, and is offset 10 seconds ahead of 37*61c4878aSAndroid Build Coastguard Worker // UTC at that date (i.e., its epoch, 1958-01-01 00:00:00 TAI, is 38*61c4878aSAndroid Build Coastguard Worker // 1957-12-31 23:59:50 UTC). Leap seconds are not inserted into TAI. Thus, 39*61c4878aSAndroid Build Coastguard Worker // every time a leap second is inserted into UTC, UTC falls another second 40*61c4878aSAndroid Build Coastguard Worker // behind TAI. 41*61c4878aSAndroid Build Coastguard Worker TAI_WALL_CLOCK = 4; 42*61c4878aSAndroid Build Coastguard Worker }; 43*61c4878aSAndroid Build Coastguard Worker} 44*61c4878aSAndroid Build Coastguard Worker 45*61c4878aSAndroid Build Coastguard Worker// A representation of a clock's parameters. 46*61c4878aSAndroid Build Coastguard Worker// 47*61c4878aSAndroid Build Coastguard Worker// There are two major components to representing a steady, monotonic clock: 48*61c4878aSAndroid Build Coastguard Worker// 49*61c4878aSAndroid Build Coastguard Worker// 1. A representation of the clock's period. 50*61c4878aSAndroid Build Coastguard Worker// 2. A representation of the clock's epoch. 51*61c4878aSAndroid Build Coastguard Worker// 52*61c4878aSAndroid Build Coastguard Worker// To support a wide range of clock configurations, ClockParameters represents 53*61c4878aSAndroid Build Coastguard Worker// a clock's period as fractions of a second. Concretely: 54*61c4878aSAndroid Build Coastguard Worker// 55*61c4878aSAndroid Build Coastguard Worker// Clock period (seconds) = 56*61c4878aSAndroid Build Coastguard Worker// tick_period_seconds_numerator / tick_period_seconds_denominator 57*61c4878aSAndroid Build Coastguard Worker// 58*61c4878aSAndroid Build Coastguard Worker// So a simple 1KHz clock can be represented as: 59*61c4878aSAndroid Build Coastguard Worker// 60*61c4878aSAndroid Build Coastguard Worker// tick_period_seconds_numerator = 1 61*61c4878aSAndroid Build Coastguard Worker// tick_period_seconds_denominator = 1000 62*61c4878aSAndroid Build Coastguard Worker// Clock period = 1 / 1000 = 0.001 seconds 63*61c4878aSAndroid Build Coastguard Worker// Clock frequency = 1 / 0.001 = 1,000 Hz 64*61c4878aSAndroid Build Coastguard Worker// 65*61c4878aSAndroid Build Coastguard Worker// Failing to specify one or both of the period members of a ClockParameters 66*61c4878aSAndroid Build Coastguard Worker// message leaves the configuration specification incomplete and invalid. 67*61c4878aSAndroid Build Coastguard Worker// 68*61c4878aSAndroid Build Coastguard Worker// While clock period alone is enough to represent a duration if given a number 69*61c4878aSAndroid Build Coastguard Worker// of ticks, an epoch is required to make a clock represent a time point. 70*61c4878aSAndroid Build Coastguard Worker// EpochType optionally provides this information. Specifying an EpochType 71*61c4878aSAndroid Build Coastguard Worker// defines what a tick count of `0` represents. Some epoch types (e.g. UTC, GPS, 72*61c4878aSAndroid Build Coastguard Worker// TAI) allow the clock to resolve to real-world time points. If the EpochType 73*61c4878aSAndroid Build Coastguard Worker// is relative to boot or unknown, however, the clock is only sufficiently 74*61c4878aSAndroid Build Coastguard Worker// specified for relative time measurement without additional external 75*61c4878aSAndroid Build Coastguard Worker// information. 76*61c4878aSAndroid Build Coastguard Workermessage ClockParameters { 77*61c4878aSAndroid Build Coastguard Worker int32 tick_period_seconds_numerator = 1; // Required 78*61c4878aSAndroid Build Coastguard Worker int32 tick_period_seconds_denominator = 2; // Required 79*61c4878aSAndroid Build Coastguard Worker optional EpochType.Enum epoch_type = 3; 80*61c4878aSAndroid Build Coastguard Worker} 81*61c4878aSAndroid Build Coastguard Worker 82*61c4878aSAndroid Build Coastguard Worker// A point in time relative to a clock's epoch. 83*61c4878aSAndroid Build Coastguard Workermessage TimePoint { 84*61c4878aSAndroid Build Coastguard Worker // The duration that has elapsed (number of clock ticks) since the epoch, 85*61c4878aSAndroid Build Coastguard Worker // where the tick period and epoch are specified by the clock parameters. 86*61c4878aSAndroid Build Coastguard Worker // 87*61c4878aSAndroid Build Coastguard Worker // The meaning of `timestamp` is unspecified without an associated 88*61c4878aSAndroid Build Coastguard Worker // ClockParameters. 89*61c4878aSAndroid Build Coastguard Worker int64 timestamp = 1; // Required 90*61c4878aSAndroid Build Coastguard Worker ClockParameters clock_parameters = 2; // Required 91*61c4878aSAndroid Build Coastguard Worker} 92*61c4878aSAndroid Build Coastguard Worker 93*61c4878aSAndroid Build Coastguard Worker// The time of a snapshot capture. Supports multiple timestamps to 94*61c4878aSAndroid Build Coastguard Worker// cover multiple time bases or clocks (e.g. time since boot, time 95*61c4878aSAndroid Build Coastguard Worker// from epoch, etc). 96*61c4878aSAndroid Build Coastguard Worker// 97*61c4878aSAndroid Build Coastguard Worker// This is an overlay proto for Snapshot, see more details here: 98*61c4878aSAndroid Build Coastguard Worker// https://pigweed.dev/pw_snapshot/proto_format.html#module-specific-data 99*61c4878aSAndroid Build Coastguard Workermessage SnapshotTimestamps { 100*61c4878aSAndroid Build Coastguard Worker repeated TimePoint timestamps = 22; 101*61c4878aSAndroid Build Coastguard Worker} 102