From 82830e359a1df896f79ae1ed743e70af357f736a Mon Sep 17 00:00:00 2001 From: SChernykh <sergey.v.chernykh@gmail.com> Date: Sun, 14 Feb 2021 15:32:18 +0100 Subject: [PATCH] Added `pause-on-active` option Windows only for now. When set to true, pauses mining when user touches mouse or keyboard. --- src/base/kernel/Platform.h | 1 + src/base/kernel/Platform_unix.cpp | 7 +++++++ src/base/kernel/Platform_win.cpp | 13 +++++++++++++ src/base/kernel/config/BaseConfig.cpp | 2 ++ src/base/kernel/config/BaseConfig.h | 3 +++ src/base/kernel/config/BaseTransform.cpp | 4 ++++ src/base/kernel/interfaces/IConfig.h | 1 + src/config.json | 3 ++- src/core/Miner.cpp | 23 +++++++++++++++++++---- src/core/config/Config.cpp | 1 + src/core/config/Config_default.h | 3 ++- src/core/config/Config_platform.h | 1 + src/core/config/usage.h | 1 + 13 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/base/kernel/Platform.h b/src/base/kernel/Platform.h index 293cedc7f..f38804896 100644 --- a/src/base/kernel/Platform.h +++ b/src/base/kernel/Platform.h @@ -49,6 +49,7 @@ public: static inline const String &userAgent() { return m_userAgent; } static bool isOnBatteryPower(); + static bool isUserActive(); private: static char *createUserAgent(); diff --git a/src/base/kernel/Platform_unix.cpp b/src/base/kernel/Platform_unix.cpp index bbded9f65..cf7d37ca3 100644 --- a/src/base/kernel/Platform_unix.cpp +++ b/src/base/kernel/Platform_unix.cpp @@ -158,3 +158,10 @@ bool xmrig::Platform::isOnBatteryPower() } return false; } + + +bool xmrig::Platform::isUserActive() +{ + // TODO + return false; +} diff --git a/src/base/kernel/Platform_win.cpp b/src/base/kernel/Platform_win.cpp index a487e17b9..7667691b0 100644 --- a/src/base/kernel/Platform_win.cpp +++ b/src/base/kernel/Platform_win.cpp @@ -161,3 +161,16 @@ bool xmrig::Platform::isOnBatteryPower() } return false; } + + +bool xmrig::Platform::isUserActive() +{ + LASTINPUTINFO info; + info.cbSize = sizeof(LASTINPUTINFO); + + if (!GetLastInputInfo(&info)) { + return false; + } + + return static_cast<int>(GetTickCount() - info.dwTime) < 60 * 1000; +} diff --git a/src/base/kernel/config/BaseConfig.cpp b/src/base/kernel/config/BaseConfig.cpp index 27aa2ce90..c2f4196e3 100644 --- a/src/base/kernel/config/BaseConfig.cpp +++ b/src/base/kernel/config/BaseConfig.cpp @@ -62,6 +62,7 @@ const char *BaseConfig::kDryRun = "dry-run"; const char *BaseConfig::kHttp = "http"; const char *BaseConfig::kLogFile = "log-file"; const char *BaseConfig::kPauseOnBattery = "pause-on-battery"; +const char *BaseConfig::kPauseOnActive = "pause-on-active"; const char *BaseConfig::kPrintTime = "print-time"; const char *BaseConfig::kSyslog = "syslog"; const char *BaseConfig::kTitle = "title"; @@ -92,6 +93,7 @@ bool xmrig::BaseConfig::read(const IJsonReader &reader, const char *fileName) m_syslog = reader.getBool(kSyslog, m_syslog); m_watch = reader.getBool(kWatch, m_watch); m_pauseOnBattery = reader.getBool(kPauseOnBattery, m_pauseOnBattery); + m_pauseOnActive = reader.getBool(kPauseOnActive, m_pauseOnActive); m_logFile = reader.getString(kLogFile); m_userAgent = reader.getString(kUserAgent); m_printTime = std::min(reader.getUint(kPrintTime, m_printTime), 3600U); diff --git a/src/base/kernel/config/BaseConfig.h b/src/base/kernel/config/BaseConfig.h index f97a711bb..4f28cadf6 100644 --- a/src/base/kernel/config/BaseConfig.h +++ b/src/base/kernel/config/BaseConfig.h @@ -56,6 +56,7 @@ public: static const char *kHttp; static const char *kLogFile; static const char *kPauseOnBattery; + static const char *kPauseOnActive; static const char *kPrintTime; static const char *kSyslog; static const char *kTitle; @@ -73,6 +74,7 @@ public: inline bool isBackground() const { return m_background; } inline bool isDryRun() const { return m_dryRun; } inline bool isPauseOnBattery() const { return m_pauseOnBattery; } + inline bool isPauseOnActive() const { return m_pauseOnActive; } inline bool isSyslog() const { return m_syslog; } inline const char *logFile() const { return m_logFile.data(); } inline const char *userAgent() const { return m_userAgent.data(); } @@ -101,6 +103,7 @@ protected: bool m_background = false; bool m_dryRun = false; bool m_pauseOnBattery = false; + bool m_pauseOnActive = false; bool m_syslog = false; bool m_upgrade = false; bool m_watch = true; diff --git a/src/base/kernel/config/BaseTransform.cpp b/src/base/kernel/config/BaseTransform.cpp index 119fa679c..7df0a7952 100644 --- a/src/base/kernel/config/BaseTransform.cpp +++ b/src/base/kernel/config/BaseTransform.cpp @@ -262,6 +262,7 @@ void xmrig::BaseTransform::transform(rapidjson::Document &doc, int key, const ch case IConfig::DaemonKey: /* --daemon */ case IConfig::VerboseKey: /* --verbose */ case IConfig::PauseOnBatteryKey: /* --pause-on-battery */ + case IConfig::PauseOnActiveKey: /* --pause-on-active */ return transformBoolean(doc, key, true); case IConfig::ColorKey: /* --no-color */ @@ -323,6 +324,9 @@ void xmrig::BaseTransform::transformBoolean(rapidjson::Document &doc, int key, b case IConfig::PauseOnBatteryKey: /* --pause-on-battery */ return set(doc, BaseConfig::kPauseOnBattery, enable); + case IConfig::PauseOnActiveKey: /* --pause-on-active */ + return set(doc, BaseConfig::kPauseOnActive, enable); + default: break; } diff --git a/src/base/kernel/interfaces/IConfig.h b/src/base/kernel/interfaces/IConfig.h index ba022fa3c..d5fdb5c92 100644 --- a/src/base/kernel/interfaces/IConfig.h +++ b/src/base/kernel/interfaces/IConfig.h @@ -86,6 +86,7 @@ public: BenchTokenKey = 1048, DmiKey = 1049, HugePageSizeKey = 1050, + PauseOnActiveKey = 1051, // xmrig common CPUPriorityKey = 1021, diff --git a/src/config.json b/src/config.json index 8b5532d5e..7722d19b3 100644 --- a/src/config.json +++ b/src/config.json @@ -96,5 +96,6 @@ "user-agent": null, "verbose": 0, "watch": true, - "pause-on-battery": false + "pause-on-battery": false, + "pause-on-active": false } diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 8d0263e22..6b3a74ba8 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -352,6 +352,7 @@ public: Algorithms algorithms; bool active = false; bool battery_power = false; + bool user_active = false; bool enabled = true; bool reset = true; Controller *controller; @@ -629,18 +630,32 @@ void xmrig::Miner::onTimer(const Timer *) if (d_ptr->controller->config()->isPauseOnBattery()) { const bool battery_power = Platform::isOnBatteryPower(); - if (battery_power && d_ptr->enabled) { + if (battery_power && !d_ptr->battery_power) { LOG_INFO("%s " YELLOW_BOLD("on battery power"), Tags::miner()); d_ptr->battery_power = true; - setEnabled(false); } - else if (!battery_power && !d_ptr->enabled && d_ptr->battery_power) { + else if (!battery_power && d_ptr->battery_power) { LOG_INFO("%s " GREEN_BOLD("on AC power"), Tags::miner()); d_ptr->battery_power = false; - setEnabled(true); } } + if (d_ptr->controller->config()->isPauseOnActive()) { + const bool user_active = Platform::isUserActive(); + if (user_active && !d_ptr->user_active) { + LOG_INFO("%s " YELLOW_BOLD("user active"), Tags::miner()); + d_ptr->user_active = true; + } + else if (!user_active && d_ptr->user_active) { + LOG_INFO("%s " GREEN_BOLD("user inactive"), Tags::miner()); + d_ptr->user_active = false; + } + } + + const bool batteryEnabled = !(d_ptr->controller->config()->isPauseOnBattery() && d_ptr->battery_power); + const bool userActiveEnabled = !(d_ptr->controller->config()->isPauseOnActive() && d_ptr->user_active); + setEnabled(batteryEnabled && userActiveEnabled); + if (stopMiner) { stop(); } diff --git a/src/core/config/Config.cpp b/src/core/config/Config.cpp index f8b7bb858..f2a0c4a93 100644 --- a/src/core/config/Config.cpp +++ b/src/core/config/Config.cpp @@ -270,4 +270,5 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const doc.AddMember(StringRef(kVerbose), Log::verbose(), allocator); doc.AddMember(StringRef(kWatch), m_watch, allocator); doc.AddMember(StringRef(kPauseOnBattery), isPauseOnBattery(), allocator); + doc.AddMember(StringRef(kPauseOnActive), isPauseOnActive(), allocator); } diff --git a/src/core/config/Config_default.h b/src/core/config/Config_default.h index dd7a20832..c16d421ee 100644 --- a/src/core/config/Config_default.h +++ b/src/core/config/Config_default.h @@ -126,7 +126,8 @@ R"===( "user-agent": null, "verbose": 0, "watch": true, - "pause-on-battery": false + "pause-on-battery": false, + "pause-on-active": false } )==="; #endif diff --git a/src/core/config/Config_platform.h b/src/core/config/Config_platform.h index 28b1e2bda..d1b17345f 100644 --- a/src/core/config/Config_platform.h +++ b/src/core/config/Config_platform.h @@ -98,6 +98,7 @@ static const option options[] = { { "title", 1, nullptr, IConfig::TitleKey }, { "no-title", 0, nullptr, IConfig::NoTitleKey }, { "pause-on-battery", 0, nullptr, IConfig::PauseOnBatteryKey }, + { "pause-on-active", 0, nullptr, IConfig::PauseOnActiveKey }, # ifdef XMRIG_FEATURE_BENCHMARK { "stress", 0, nullptr, IConfig::StressKey }, { "bench", 1, nullptr, IConfig::BenchKey }, diff --git a/src/core/config/usage.h b/src/core/config/usage.h index a30ea1331..bf9088481 100644 --- a/src/core/config/usage.h +++ b/src/core/config/usage.h @@ -181,6 +181,7 @@ static inline const std::string &usage() u += " --no-title disable setting console window title\n"; # endif u += " --pause-on-battery pause mine on battery power\n"; + u += " --pause-on-active pause mine when mouse or keyboard is touched\n"; # ifdef XMRIG_FEATURE_BENCHMARK u += " --stress run continuous stress test to check system stability\n";