From 299b180b28d0ad724fc3f89e6e01b470435ac913 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Wed, 22 Jul 2020 20:12:16 +0200 Subject: [PATCH] Added mining on battery setting --- src/base/kernel/Platform.h | 2 ++ src/base/kernel/Platform_mac.cpp | 16 ++++++++++++++++ src/base/kernel/Platform_unix.cpp | 17 +++++++++++++++++ src/base/kernel/Platform_win.cpp | 9 +++++++++ src/base/kernel/config/BaseConfig.cpp | 20 +++++++++++--------- src/base/kernel/config/BaseConfig.h | 15 +++++++++------ src/config.json | 3 ++- src/core/Miner.cpp | 27 ++++++++++++++++++++++++++- src/core/config/Config.cpp | 1 + src/core/config/Config_default.h | 3 ++- 10 files changed, 95 insertions(+), 18 deletions(-) diff --git a/src/base/kernel/Platform.h b/src/base/kernel/Platform.h index 3fcf666b..b56c214d 100644 --- a/src/base/kernel/Platform.h +++ b/src/base/kernel/Platform.h @@ -54,6 +54,8 @@ public: static inline const char *userAgent() { return m_userAgent; } + static bool isOnBatteryPower(); + private: static char *createUserAgent(); diff --git a/src/base/kernel/Platform_mac.cpp b/src/base/kernel/Platform_mac.cpp index 5a5520eb..9dd4f15e 100644 --- a/src/base/kernel/Platform_mac.cpp +++ b/src/base/kernel/Platform_mac.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "base/kernel/Platform.h" @@ -107,3 +108,18 @@ void xmrig::Platform::setThreadPriority(int priority) setpriority(PRIO_PROCESS, 0, prio); } + +bool xmrig::Platform::isOnBatteryPower() +{ + for (int i = 0; i <= 1; ++i) { + char buf[64]; + snprintf(buf, 64, "/sys/class/power_supply/BAT%d/status", i); + std::ifstream f(buf); + if (f.is_open()) { + std::string status; + f >> status; + return (status == "Discharging"); + } + } + return false; +} diff --git a/src/base/kernel/Platform_unix.cpp b/src/base/kernel/Platform_unix.cpp index 6d957636..f0b382c0 100644 --- a/src/base/kernel/Platform_unix.cpp +++ b/src/base/kernel/Platform_unix.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include "base/kernel/Platform.h" @@ -146,3 +147,19 @@ void xmrig::Platform::setThreadPriority(int priority) } # endif } + + +bool xmrig::Platform::isOnBatteryPower() +{ + for (int i = 0; i <= 1; ++i) { + char buf[64]; + snprintf(buf, 64, "/sys/class/power_supply/BAT%d/status", i); + std::ifstream f(buf); + if (f.is_open()) { + std::string status; + f >> status; + return (status == "Discharging"); + } + } + return false; +} diff --git a/src/base/kernel/Platform_win.cpp b/src/base/kernel/Platform_win.cpp index 00497453..89f26a07 100644 --- a/src/base/kernel/Platform_win.cpp +++ b/src/base/kernel/Platform_win.cpp @@ -157,3 +157,12 @@ void xmrig::Platform::setThreadPriority(int priority) SetThreadPriority(GetCurrentThread(), prio); } + +bool xmrig::Platform::isOnBatteryPower() +{ + SYSTEM_POWER_STATUS st; + if (GetSystemPowerStatus(&st)) { + return (st.ACLineStatus == 0); + } + return false; +} diff --git a/src/base/kernel/config/BaseConfig.cpp b/src/base/kernel/config/BaseConfig.cpp index 459055d7..e59940ea 100644 --- a/src/base/kernel/config/BaseConfig.cpp +++ b/src/base/kernel/config/BaseConfig.cpp @@ -67,6 +67,7 @@ const char *BaseConfig::kTitle = "title"; const char *BaseConfig::kUserAgent = "user-agent"; const char *BaseConfig::kVerbose = "verbose"; const char *BaseConfig::kWatch = "watch"; +const char *BaseConfig::kMineOnBattery = "mine-on-battery"; #ifdef XMRIG_FEATURE_TLS @@ -85,15 +86,16 @@ bool xmrig::BaseConfig::read(const IJsonReader &reader, const char *fileName) return false; } - m_autoSave = reader.getBool(kAutosave, m_autoSave); - m_background = reader.getBool(kBackground, m_background); - m_dryRun = reader.getBool(kDryRun, m_dryRun); - m_syslog = reader.getBool(kSyslog, m_syslog); - m_watch = reader.getBool(kWatch, m_watch); - m_logFile = reader.getString(kLogFile); - m_userAgent = reader.getString(kUserAgent); - m_printTime = std::min(reader.getUint(kPrintTime, m_printTime), 3600U); - m_title = reader.getValue(kTitle); + m_autoSave = reader.getBool(kAutosave, m_autoSave); + m_background = reader.getBool(kBackground, m_background); + m_dryRun = reader.getBool(kDryRun, m_dryRun); + m_syslog = reader.getBool(kSyslog, m_syslog); + m_watch = reader.getBool(kWatch, m_watch); + m_mineOnBattery = reader.getBool(kMineOnBattery, m_mineOnBattery); + m_logFile = reader.getString(kLogFile); + m_userAgent = reader.getString(kUserAgent); + m_printTime = std::min(reader.getUint(kPrintTime, m_printTime), 3600U); + m_title = reader.getValue(kTitle); # ifdef XMRIG_FEATURE_TLS m_tls = reader.getValue(kTls); diff --git a/src/base/kernel/config/BaseConfig.h b/src/base/kernel/config/BaseConfig.h index 2367aa79..995340d8 100644 --- a/src/base/kernel/config/BaseConfig.h +++ b/src/base/kernel/config/BaseConfig.h @@ -61,6 +61,7 @@ public: static const char *kUserAgent; static const char *kVerbose; static const char *kWatch; + static const char* kMineOnBattery; # ifdef XMRIG_FEATURE_TLS static const char *kTls; @@ -80,6 +81,7 @@ public: inline const String &apiWorkerId() const { return m_apiWorkerId; } inline const Title &title() const { return m_title; } inline uint32_t printTime() const { return m_printTime; } + inline bool mineOnBattery() const { return m_mineOnBattery; } # ifdef XMRIG_FEATURE_TLS inline const TlsConfig &tls() const { return m_tls; } @@ -95,12 +97,13 @@ public: void printVersions(); protected: - bool m_autoSave = true; - bool m_background = false; - bool m_dryRun = false; - bool m_syslog = false; - bool m_upgrade = false; - bool m_watch = true; + bool m_autoSave = true; + bool m_background = false; + bool m_dryRun = false; + bool m_syslog = false; + bool m_upgrade = false; + bool m_watch = true; + bool m_mineOnBattery = true; Http m_http; Pools m_pools; String m_apiId; diff --git a/src/config.json b/src/config.json index 2df01a5b..06b618d9 100644 --- a/src/config.json +++ b/src/config.json @@ -91,5 +91,6 @@ }, "user-agent": null, "verbose": 0, - "watch": true + "watch": true, + "mine-on-battery": true } diff --git a/src/core/Miner.cpp b/src/core/Miner.cpp index 7d74d96a..969c1f2b 100644 --- a/src/core/Miner.cpp +++ b/src/core/Miner.cpp @@ -287,6 +287,7 @@ public: bool active = false; bool enabled = true; bool reset = true; + bool battery_power = false; Controller *controller; Job job; mutable std::map maxHashrate; @@ -429,13 +430,23 @@ void xmrig::Miner::setEnabled(bool enabled) return; } + if (d_ptr->battery_power && enabled) { + LOG_INFO(YELLOW_BOLD("Can't resume while on battery power")); + return; + } + d_ptr->enabled = enabled; if (enabled) { LOG_INFO(GREEN_BOLD("resumed")); } else { - LOG_INFO(YELLOW_BOLD("paused") ", press " MAGENTA_BG_BOLD(" r ") " to resume"); + if (d_ptr->battery_power) { + LOG_INFO(YELLOW_BOLD("paused")); + } + else { + LOG_INFO(YELLOW_BOLD("paused") ", press " MAGENTA_BG_BOLD(" r ") " to resume"); + } } if (!d_ptr->active) { @@ -538,6 +549,20 @@ void xmrig::Miner::onTimer(const Timer *) } d_ptr->ticks++; + + if (!d_ptr->controller->config()->mineOnBattery()) { + const bool battery_power = xmrig::Platform::isOnBatteryPower(); + if (battery_power && d_ptr->enabled) { + LOG_INFO(YELLOW_BOLD("On battery power")); + d_ptr->battery_power = true; + setEnabled(false); + } + else if (!battery_power && !d_ptr->enabled && d_ptr->battery_power) { + LOG_INFO(GREEN_BOLD("On AC power")); + d_ptr->battery_power = false; + setEnabled(true); + } + } } diff --git a/src/core/config/Config.cpp b/src/core/config/Config.cpp index 81eac42b..c8c5ae71 100644 --- a/src/core/config/Config.cpp +++ b/src/core/config/Config.cpp @@ -252,4 +252,5 @@ void xmrig::Config::getJSON(rapidjson::Document &doc) const doc.AddMember(StringRef(kUserAgent), m_userAgent.toJSON(), allocator); doc.AddMember(StringRef(kVerbose), Log::verbose(), allocator); doc.AddMember(StringRef(kWatch), m_watch, allocator); + doc.AddMember(StringRef(kMineOnBattery), m_mineOnBattery, allocator); } diff --git a/src/core/config/Config_default.h b/src/core/config/Config_default.h index e56cd7d9..e90a4f68 100644 --- a/src/core/config/Config_default.h +++ b/src/core/config/Config_default.h @@ -109,7 +109,8 @@ R"===( "retry-pause": 5, "syslog": false, "user-agent": null, - "watch": true + "watch": true, + "mine-on-battery": true } )==="; #endif