blob: d9d934bc2682d21809e16688871656e3626d6fca [file] [log] [blame]
# 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.
"""Library to analyze timestamp."""
from typing import List
import datetime
from pw_chrono_protos import chrono_pb2
_UTC_EPOCH = datetime.datetime(1970, 1, 1, 00, 00, 00)
_UNKNOWN = chrono_pb2.EpochType.Enum.UNKNOWN
_TIME_SINCE_BOOT = chrono_pb2.EpochType.Enum.TIME_SINCE_BOOT
_UTC_WALL_CLOCK = chrono_pb2.EpochType.Enum.UTC_WALL_CLOCK
def process_snapshot(serialized_snapshot: bytes):
captured_timestamps = chrono_pb2.SnapshotTimestamps()
captured_timestamps.ParseFromString(serialized_snapshot)
return timestamp_output(captured_timestamps)
def timestamp_output(timestamps: chrono_pb2.SnapshotTimestamps):
output: List[str] = []
if not timestamps.timestamps:
return ''
plural = '' if len(timestamps.timestamps) == 1 else 's'
output.append(f'Snapshot capture timestamp{plural}')
for timepoint in timestamps.timestamps:
time = timestamp_snapshot_analyzer(timepoint)
clock_epoch_type = timepoint.clock_parameters.epoch_type
if clock_epoch_type == _TIME_SINCE_BOOT:
output.append(f' Time since boot: {time}')
elif clock_epoch_type == _UTC_WALL_CLOCK:
utc_time = time + _UTC_EPOCH
output.append(f' UTC time: {utc_time}')
else:
output.append(f' Time since unknown epoch {_UNKNOWN}: unknown')
return '\n'.join(output)
def timestamp_snapshot_analyzer(
captured_timepoint: chrono_pb2.TimePoint) -> datetime.timedelta:
ticks = captured_timepoint.timestamp
clock_period = (
captured_timepoint.clock_parameters.tick_period_seconds_numerator /
captured_timepoint.clock_parameters.tick_period_seconds_denominator)
elapsed_seconds = ticks * clock_period
time_delta = datetime.timedelta(seconds=elapsed_seconds)
return time_delta