fix(battery): Poll until real inotify event occurs
Fixes jaagr/lemonbuddy#140
This commit is contained in:
parent
e7cb345cec
commit
af2289e397
@ -21,6 +21,7 @@ namespace modules {
|
|||||||
void setup();
|
void setup();
|
||||||
void start();
|
void start();
|
||||||
void teardown();
|
void teardown();
|
||||||
|
void idle();
|
||||||
bool on_event(inotify_event* event);
|
bool on_event(inotify_event* event);
|
||||||
string get_format() const;
|
string get_format() const;
|
||||||
bool build(builder* builder, string tag) const;
|
bool build(builder* builder, string tag) const;
|
||||||
@ -57,6 +58,9 @@ namespace modules {
|
|||||||
battery_state m_state = battery_state::UNKNOWN;
|
battery_state m_state = battery_state::UNKNOWN;
|
||||||
std::atomic_int m_percentage{0};
|
std::atomic_int m_percentage{0};
|
||||||
|
|
||||||
|
interval_t m_interval;
|
||||||
|
chrono::system_clock::time_point m_lastpoll;
|
||||||
|
|
||||||
stateflag m_notified{false};
|
stateflag m_notified{false};
|
||||||
|
|
||||||
int m_fullat = 100;
|
int m_fullat = 100;
|
||||||
|
@ -10,6 +10,8 @@ namespace modules {
|
|||||||
m_battery = m_conf.get<string>(name(), "battery", "BAT0");
|
m_battery = m_conf.get<string>(name(), "battery", "BAT0");
|
||||||
m_adapter = m_conf.get<string>(name(), "adapter", "ADP1");
|
m_adapter = m_conf.get<string>(name(), "adapter", "ADP1");
|
||||||
m_fullat = m_conf.get<int>(name(), "full-at", 100);
|
m_fullat = m_conf.get<int>(name(), "full-at", 100);
|
||||||
|
m_interval = interval_t{m_conf.get<float>(name(), "poll-interval", 3.0f)};
|
||||||
|
m_lastpoll = chrono::system_clock::now();
|
||||||
|
|
||||||
m_path_capacity = string_util::replace(PATH_BATTERY_CAPACITY, "%battery%", m_battery);
|
m_path_capacity = string_util::replace(PATH_BATTERY_CAPACITY, "%battery%", m_battery);
|
||||||
m_path_adapter = string_util::replace(PATH_ADAPTER_STATUS, "%adapter%", m_adapter);
|
m_path_adapter = string_util::replace(PATH_ADAPTER_STATUS, "%adapter%", m_adapter);
|
||||||
@ -73,10 +75,30 @@ namespace modules {
|
|||||||
wakeup();
|
wakeup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void battery_module::idle() {
|
||||||
|
// Manually poll for events as a fallback for systems that
|
||||||
|
// doesn't report inotify events for files on sysfs
|
||||||
|
if (m_interval.count() > 0 && !m_notified.load(std::memory_order_relaxed)) {
|
||||||
|
auto now = chrono::system_clock::now();
|
||||||
|
if (now - m_lastpoll > m_interval) {
|
||||||
|
m_log.info("%s: Polling values (inotify fallback)", name());
|
||||||
|
m_lastpoll = now;
|
||||||
|
on_event(nullptr);
|
||||||
|
broadcast();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inotify_module::idle();
|
||||||
|
}
|
||||||
|
|
||||||
bool battery_module::on_event(inotify_event* event) {
|
bool battery_module::on_event(inotify_event* event) {
|
||||||
if (event != nullptr) {
|
if (event != nullptr) {
|
||||||
m_log.trace("%s: %s", name(), event->filename);
|
m_log.trace("%s: %s", name(), event->filename);
|
||||||
m_notified.store(true, std::memory_order_relaxed);
|
|
||||||
|
if (!m_notified.load(std::memory_order_relaxed)) {
|
||||||
|
m_log.info("%s: Inotify event reported, disable polling fallback...", name());
|
||||||
|
m_notified.store(true, std::memory_order_relaxed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto state = current_state();
|
auto state = current_state();
|
||||||
@ -170,9 +192,6 @@ namespace modules {
|
|||||||
/**
|
/**
|
||||||
* Subthread runner that emit update events
|
* Subthread runner that emit update events
|
||||||
* to refresh <animation-charging> in case it is used.
|
* to refresh <animation-charging> in case it is used.
|
||||||
*
|
|
||||||
* Will also poll for events as fallback for systems that
|
|
||||||
* doesn't report inotify events for files on sysfs
|
|
||||||
*/
|
*/
|
||||||
void battery_module::subthread() {
|
void battery_module::subthread() {
|
||||||
chrono::duration<double> dur = 1s;
|
chrono::duration<double> dur = 1s;
|
||||||
@ -181,23 +200,14 @@ namespace modules {
|
|||||||
dur = chrono::duration<double>(float(m_animation_charging->framerate()) / 1000.0f);
|
dur = chrono::duration<double>(float(m_animation_charging->framerate()) / 1000.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
const int interval = m_conf.get<float>(name(), "poll-interval", 3.0f) / dur.count();
|
|
||||||
|
|
||||||
while (running()) {
|
while (running()) {
|
||||||
for (int i = 0; running() && i < interval; ++i) {
|
for (int i = 0; running() && i < dur.count(); ++i) {
|
||||||
if (m_state == battery_state::CHARGING) {
|
if (m_state == battery_state::CHARGING) {
|
||||||
broadcast();
|
broadcast();
|
||||||
}
|
}
|
||||||
|
|
||||||
sleep(dur);
|
sleep(dur);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!running() || m_state == battery_state::CHARGING) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_notified.load(std::memory_order_relaxed)) {
|
|
||||||
file_util::get_contents(m_path_capacity);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.trace("%s: End of subthread", name());
|
m_log.trace("%s: End of subthread", name());
|
||||||
|
Loading…
Reference in New Issue
Block a user