| # 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 |