From bb94754e8d2e22382c62a3f77f301fb2b4b57874 Mon Sep 17 00:00:00 2001 From: Thomas Lienbacher Date: Sun, 3 Aug 2025 17:17:11 +0200 Subject: [PATCH] Added different prefixes for transfer speeds Instead of only using KiB/s we also use B/s, MiB/s and GiB/s --- include/usbtop/console_output.h | 1 + src/console_output.cpp | 46 +++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/include/usbtop/console_output.h b/include/usbtop/console_output.h index 2f20f69..2430fa3 100644 --- a/include/usbtop/console_output.h +++ b/include/usbtop/console_output.h @@ -43,6 +43,7 @@ class ConsoleOutput private: static void clear_screen(); static void print_stats(); + static std::string format_speed(double bytes_per_second); static void print_stats_bus(UsbBus const& bus); }; diff --git a/src/console_output.cpp b/src/console_output.cpp index ac6b5a1..a5b1cac 100644 --- a/src/console_output.cpp +++ b/src/console_output.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2012 Adrien Guinet + * 2025 Thomas Lienbacher * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,6 +38,7 @@ #include #include +#include #include @@ -65,18 +67,52 @@ void usbtop::ConsoleOutput::print_stats() { print_stats_bus(*bus); }); } +std::string usbtop::ConsoleOutput::format_speed(double bytes_per_second) +{ + std::stringstream ss; + ss << std::fixed << std::setprecision(2) << std::setw(3); + + // usb probably won't reach TiB/s in the next couple of years ;) + if (bytes_per_second > 1024.0 * 1024.0 * 1024.0) + { + // format as GiB/s + ss << bytes_per_second / 1024.0 / 1024.0 / 1024.0; + ss << " GiB/s"; + } + else if (bytes_per_second > 1024.0 * 1024.0) + { + // format as NiB/s + ss << bytes_per_second / 1024.0 / 1024.0; + ss << " MiB/s"; + } + else if (bytes_per_second > 1024.0) + { + // format as KiB/s + ss << bytes_per_second / 1024.0; + ss << " KiB/s"; + } + else + { + // format as B/s + ss << bytes_per_second; + ss << " B/s"; + } + + return ss.str(); +} + void usbtop::ConsoleOutput::print_stats_bus(UsbBus const& bus) { - std::cout << "Bus ID " << bus.id() << " (" << bus.desc() << ")"; + std::cout << "Bus ID " << bus.id() << " (" << bus.desc() << ")"; std::cout << "\tTo device\tFrom device" << std::endl; UsbBus::list_devices_t const& devs = bus.devices(); UsbBus::list_devices_t::const_iterator it; - for (it = devs.begin(); it != devs.end(); it++) { + for (it = devs.begin(); it != devs.end(); ++it) { UsbDevice const& dev(*it->second); UsbStats const& stats(dev.stats()); std::cout << " Device ID " << std::setw(3) << it->first << " :\t"; - double stats_to = stats.stats_to_device().bw_instant()/1024.0; - double stats_from = stats.stats_from_device().bw_instant()/1024.0; - std::cout << "\t\t\t" << stats_to << " KiB/s\t" << stats_from << " KiB/s" << std::endl; + double stats_to = stats.stats_to_device().bw_instant(); + double stats_from = stats.stats_from_device().bw_instant(); + std::cout << "\t\t\t" << format_speed(stats_to) << "\t" << format_speed(stats_from) << std::endl; } }