blob: fabfd924356d5db29993aced1f782011e1e40d6c [file] [log] [blame]
James Kuszmaule4853542023-05-15 20:35:48 -07001#include "aos/util/simulation_logger.h"
Philipp Schrader790cb542023-07-05 21:06:52 -07002
Stephan Pleinesb1177672024-05-27 17:48:32 -07003#include <algorithm>
4#include <chrono>
5#include <utility>
6
7#include "absl/strings/str_cat.h"
8
9#include "aos/configuration.h"
James Kuszmaul827bd212023-05-15 23:57:39 -070010#include "aos/events/logging/logfile_utils.h"
Stephan Pleinesb1177672024-05-27 17:48:32 -070011#include "aos/time/time.h"
James Kuszmaule4853542023-05-15 20:35:48 -070012
13namespace aos::util {
14LoggerState::LoggerState(aos::SimulatedEventLoopFactory *factory,
Pallavi Madhukar3076d5c2023-09-09 10:23:26 -070015 const aos::Node *node, std::string_view output_folder,
16 bool do_skip_timing_report)
James Kuszmaule4853542023-05-15 20:35:48 -070017 : event_loop_(factory->MakeEventLoop("logger", node)),
18 namer_(std::make_unique<aos::logger::MultiNodeFilesLogNamer>(
James Kuszmaul827bd212023-05-15 23:57:39 -070019 absl::StrCat(output_folder, "/", logger::MaybeNodeName(node), "/"),
James Kuszmaule4853542023-05-15 20:35:48 -070020 event_loop_.get())),
21 logger_(std::make_unique<aos::logger::Logger>(event_loop_.get())) {
Pallavi Madhukar3076d5c2023-09-09 10:23:26 -070022 if (do_skip_timing_report) {
23 event_loop_->SkipTimingReport();
24 }
James Kuszmaule4853542023-05-15 20:35:48 -070025 event_loop_->SkipAosLog();
Maxwell Gumley29620b32023-12-14 11:48:16 -070026
27 // TODO (James, Maxwell) This shouldn't be necessary to have a delay here.
28 // We'd like to have the logger start as soon as the event loop starts. The
29 // logger must be started after (not on) `factory->send_delay()` amount of
30 // time. Keep this simple, use two of those delays.
31 TimerHandler *status_timer = event_loop_->AddTimer(
32 [this]() { logger_->StartLogging(std::move(namer_)); });
33 status_timer->Schedule(
34 monotonic_clock::time_point(factory->send_delay() * 2));
James Kuszmaule4853542023-05-15 20:35:48 -070035}
36
37std::vector<std::unique_ptr<LoggerState>> MakeLoggersForNodes(
38 aos::SimulatedEventLoopFactory *factory,
39 const std::vector<std::string> &nodes_to_log,
Pallavi Madhukar3076d5c2023-09-09 10:23:26 -070040 std::string_view output_folder, bool do_skip_timing_report) {
James Kuszmaule4853542023-05-15 20:35:48 -070041 std::vector<std::unique_ptr<LoggerState>> loggers;
42 for (const std::string &node : nodes_to_log) {
43 loggers.emplace_back(std::make_unique<LoggerState>(
44 factory, aos::configuration::GetNode(factory->configuration(), node),
Pallavi Madhukar3076d5c2023-09-09 10:23:26 -070045 output_folder, do_skip_timing_report));
James Kuszmaule4853542023-05-15 20:35:48 -070046 }
47 return loggers;
48}
49
50std::vector<std::unique_ptr<LoggerState>> MakeLoggersForAllNodes(
Pallavi Madhukar3076d5c2023-09-09 10:23:26 -070051 aos::SimulatedEventLoopFactory *factory, std::string_view output_folder,
52 bool do_skip_timing_report) {
James Kuszmaule4853542023-05-15 20:35:48 -070053 std::vector<std::unique_ptr<LoggerState>> loggers;
Philipp Schrader790cb542023-07-05 21:06:52 -070054 for (const aos::Node *node :
55 configuration::GetNodes(factory->configuration())) {
Pallavi Madhukar3076d5c2023-09-09 10:23:26 -070056 loggers.emplace_back(std::make_unique<LoggerState>(
57 factory, node, output_folder, do_skip_timing_report));
James Kuszmaule4853542023-05-15 20:35:48 -070058 }
59 return loggers;
60}
61
62} // namespace aos::util