From 89ff1b61a808b8859ae58daa1d03f904d9983def Mon Sep 17 00:00:00 2001 From: Lotus Li Date: Wed, 7 Oct 2026 01:10:28 +0000 Subject: [PATCH] [merge-to-it] sharpa_avatar: log through isaaccapture::Logger The plugin printed with std::cout/std::cerr, which a launched plugin's fd 1/2 send to the native capture file. It now logs on isaaccapture.plugins.sharpa_avatar (main) and isaaccapture.plugins.sharpa_avatar.AvatarTracker, logs a glove timing out and why the plugin exits, and logs "Waiting for an online glove..." once per stretch without a glove instead of every 10 s. Signed-off-by: Lotus Li --- src/plugins/sharpa_avatar/app/main.cpp | 19 +++++---- .../core/avatar_hand_tracking_plugin.cpp | 41 +++++++++++-------- .../avatar/avatar_hand_tracking_plugin.hpp | 2 +- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/plugins/sharpa_avatar/app/main.cpp b/src/plugins/sharpa_avatar/app/main.cpp index 672595f852..cfd50cb117 100644 --- a/src/plugins/sharpa_avatar/app/main.cpp +++ b/src/plugins/sharpa_avatar/app/main.cpp @@ -15,11 +15,11 @@ #include "cli.hpp" #include +#include #include #include #include -#include #include #include #include @@ -46,6 +46,7 @@ AvatarPluginConfig parse_args(int argc, char** argv) { AvatarPluginConfig config; std::string datasets_arg = "human,raw,robot,haptic"; + auto logger = isaaccapture::Logger::get("isaaccapture.plugins.sharpa_avatar"); for (int i = 1; i < argc; ++i) { @@ -64,7 +65,7 @@ AvatarPluginConfig parse_args(int argc, char** argv) } else { - std::cerr << "AvatarHandPlugin: ignoring unknown argument '" << arg << "'" << std::endl; + logger->warn("ignoring unknown argument '{}'", arg); } } @@ -92,7 +93,7 @@ AvatarPluginConfig parse_args(int argc, char** argv) } else { - std::cerr << "AvatarHandPlugin: ignoring unknown data set '" << ds << "'" << std::endl; + logger->warn("ignoring unknown data set '{}'", ds); } } @@ -109,7 +110,8 @@ AvatarPluginConfig parse_args(int argc, char** argv) int main(int argc, char** argv) try { - std::cout << "Avatar Hand Plugin starting..." << std::endl; + auto logger = isaaccapture::Logger::get("isaaccapture.plugins.sharpa_avatar"); + logger->info("Avatar Hand Plugin starting..."); const AvatarPluginConfig config = parse_args(argc, argv); AvatarTracker tracker(config); @@ -118,7 +120,7 @@ try std::signal(SIGINT, signal_handler); std::signal(SIGTERM, signal_handler); - std::cout << "Plugin running. Press Ctrl+C to stop." << std::endl; + logger->info("Plugin running. Press Ctrl+C to stop."); // Target 90Hz frequency (~11.1ms period). const auto target_frame_duration = std::chrono::nanoseconds(1000000000 / 90); @@ -132,15 +134,18 @@ try std::this_thread::sleep_until(frame_start + target_frame_duration); } + logger->info("Avatar Hand Plugin stopped: received SIGINT or SIGTERM."); return 0; } catch (const std::exception& e) { - std::cerr << argv[0] << ": " << e.what() << std::endl; + auto logger = isaaccapture::Logger::get("isaaccapture.plugins.sharpa_avatar"); + logger->error("Avatar Hand Plugin exiting on error: {}", e.what()); return 1; } catch (...) { - std::cerr << argv[0] << ": Unknown error occurred" << std::endl; + auto logger = isaaccapture::Logger::get("isaaccapture.plugins.sharpa_avatar"); + logger->error("Avatar Hand Plugin exiting on an unknown error."); return 1; } diff --git a/src/plugins/sharpa_avatar/core/avatar_hand_tracking_plugin.cpp b/src/plugins/sharpa_avatar/core/avatar_hand_tracking_plugin.cpp index 34942b2bfe..9987747c9c 100644 --- a/src/plugins/sharpa_avatar/core/avatar_hand_tracking_plugin.cpp +++ b/src/plugins/sharpa_avatar/core/avatar_hand_tracking_plugin.cpp @@ -6,6 +6,7 @@ #include "avatar_glove_collection.hpp" #include +#include #include #include #include @@ -17,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -37,9 +37,14 @@ namespace constexpr size_t kJointFlatbufferSize = 4096; constexpr auto kAvatarDataTimeout = std::chrono::seconds(10); constexpr auto kGloveRetryInterval = std::chrono::seconds(2); -constexpr auto kGloveWaitLogInterval = std::chrono::seconds(10); constexpr auto kHapticCommandTimeout = std::chrono::milliseconds(200); +const std::shared_ptr& logger() +{ + static const auto instance = isaaccapture::Logger::get("isaaccapture.plugins.sharpa_avatar.AvatarTracker"); + return instance; +} + size_t side_index(::avatar::DeviceSide side) { switch (side) @@ -260,10 +265,9 @@ void GloveState::reset() noexcept AvatarTracker::AvatarTracker(AvatarPluginConfig config) : m_config(std::move(config)), m_sdk(m_config.sdk_config_path) { - std::cout << "[Avatar] Avatar SDK initialized." << std::endl; - std::cout << "[Avatar] datasets: human=" << (m_config.human ? "on" : "off") - << " raw=" << (m_config.raw ? "on" : "off") << " robot=" << (m_config.robot ? "on" : "off") - << " haptic=" << (m_config.haptic ? "on" : "off") << std::endl; + logger()->info("Avatar SDK initialized."); + logger()->info("datasets: human={} raw={} robot={} haptic={}", m_config.human ? "on" : "off", + m_config.raw ? "on" : "off", m_config.robot ? "on" : "off", m_config.haptic ? "on" : "off"); try_connect_missing_gloves(); initialize_openxr(); } @@ -366,8 +370,8 @@ void AvatarTracker::start_glove_if_present(GloveState& glove, ::avatar::DeviceSi const auto init_error = glove.device->init("{}"); if (init_error != ::avatar::ErrorCode::SUCCESS) { - std::cerr << "[Avatar] " << to_string(side) << " glove initialization failed: " << error_name(init_error) - << " (" << static_cast(init_error) << ")" << std::endl; + logger()->warn("{} glove initialization failed: {} ({})", to_string(side), error_name(init_error), + static_cast(init_error)); glove.reset(); return; } @@ -376,13 +380,13 @@ void AvatarTracker::start_glove_if_present(GloveState& glove, ::avatar::DeviceSi const auto start_error = glove.device->start(); if (start_error != ::avatar::ErrorCode::SUCCESS) { - std::cerr << "[Avatar] " << to_string(side) << " glove start failed: " << error_name(start_error) << " (" - << static_cast(start_error) << ")" << std::endl; + logger()->warn( + "{} glove start failed: {} ({})", to_string(side), error_name(start_error), static_cast(start_error)); glove.reset(); return; } glove.last_successful_fetch = std::chrono::steady_clock::now(); - std::cout << "[Avatar] " << to_string(side) << " glove connected and streaming." << std::endl; + logger()->info("{} glove connected and streaming.", to_string(side)); } void AvatarTracker::try_connect_missing_gloves() @@ -404,12 +408,13 @@ void AvatarTracker::try_connect_missing_gloves() { start_glove_if_present(glove(side), side); } - if (std::none_of(m_gloves.begin(), m_gloves.end(), has_device) && - (!m_last_glove_wait_log || now - *m_last_glove_wait_log >= kGloveWaitLogInterval)) + // Log once per stretch with no glove; a glove connecting re-arms the message. + const bool waiting = std::none_of(m_gloves.begin(), m_gloves.end(), has_device); + if (waiting && !m_glove_wait_logged) { - m_last_glove_wait_log = now; - std::cout << "[Avatar] Waiting for an online glove..." << std::endl; + logger()->info("Waiting for an online glove..."); } + m_glove_wait_logged = waiting; } void AvatarTracker::refresh_data() @@ -472,6 +477,7 @@ void AvatarTracker::refresh_data() } else if (!state.last_successful_fetch || now - *state.last_successful_fetch >= kAvatarDataTimeout) { + logger()->warn("{} glove disconnected: no data for {} s.", to_string(side), kAvatarDataTimeout.count()); state.reset(); } } @@ -631,9 +637,8 @@ void AvatarTracker::apply_haptic_command(::avatar::DeviceSide side, const std::a if (!m_haptic_error_logged[index]) { m_haptic_error_logged[index] = true; - std::cerr << "[Avatar] set_vibration failed for " << to_string(side) << " glove: " << error_name(error) - << " (" << static_cast(error) << "); further errors for this side will be silenced." - << std::endl; + logger()->warn("set_vibration failed for {} glove: {} ({}); further errors for this side will be silenced.", + to_string(side), error_name(error), static_cast(error)); } } } diff --git a/src/plugins/sharpa_avatar/core/inc/avatar/avatar_hand_tracking_plugin.hpp b/src/plugins/sharpa_avatar/core/inc/avatar/avatar_hand_tracking_plugin.hpp index 5dbd2657c0..3ff3ed88df 100644 --- a/src/plugins/sharpa_avatar/core/inc/avatar/avatar_hand_tracking_plugin.hpp +++ b/src/plugins/sharpa_avatar/core/inc/avatar/avatar_hand_tracking_plugin.hpp @@ -149,7 +149,7 @@ class __attribute__((visibility("default"))) AvatarTracker std::array m_haptic_stopped{ { true, true } }; std::array m_haptic_error_logged{ { false, false } }; std::optional m_last_glove_retry; - std::optional m_last_glove_wait_log; + bool m_glove_wait_logged = false; }; } // namespace avatar