// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// This command exists to support integrating Zedmon power readings into
// trace data. The problem to be solved is mapping Zedmon to Fuchsia time domains
// so that trace data from Zedmon can be merged with trace data from the Fuchsia
// device. Data is captured on the devhost, so what we need to do is map devhost
// times to Fuchsia times. This command provides an interactive tool to obtain
// this mapping.

#include "src/performance/trace/commands/time.h"

#include <lib/syslog/cpp/macros.h>
#include <zircon/syscalls.h>

#include <iomanip>
#include <iostream>

namespace tracing {

Command::Info TimeCommand::Describe() {
  return Command::Info{[]() { return std::make_unique<TimeCommand>(); },
                       "time",
                       "interactively print timestamps",
                       {}};
}

TimeCommand::TimeCommand() = default;

void TimeCommand::Start(const fxl::CommandLine& command_line) {
  if (!(command_line.options().empty() && command_line.positional_args().empty())) {
    FX_LOGS(ERROR) << "We encountered unknown options, please check your " << "command invocation";
    Done(EXIT_FAILURE);
    return;
  }

  out() << "Time sync tool: Input \"t\" to get a tracing timestamp in "
        << "microseconds. Input \"q\" to quit.\n";

  double tick_scale = 1'000'000.0 / static_cast<double>(zx_ticks_per_second());
  char c;
  while (true) {
    in().get(c);
    switch (c) {
      case 'q':
        Done(EXIT_SUCCESS);
        return;
      case 't': {
        double timestamp = static_cast<double>(zx_ticks_get()) * tick_scale;
        out() << std::fixed << std::setprecision(3) << timestamp << '\n';
        break;
      }
      default:
        break;
    }
  }
}

}  // namespace tracing
