diff --git a/Changes.md b/Changes.md index 4ae50c2..4873286 100644 --- a/Changes.md +++ b/Changes.md @@ -21,6 +21,7 @@ Fixed: * wifi_linux, wifiiw_linux, hwmontemp_linux, hddtemp_linux * bat_freebsd, mem_freebsd, net_freebsd, thermal_freebsd, uptime_freebsd, cpu_freebsd, cpufreq_freebsd, fanspeed_freebsd + * bat_openbsd * volume, gmail, mdir, mpd, fs - [mpd] Lua 5.3 compatibility (for real this time); also correct a typo - [pkg,weather,contrib/btc] Allow function call without Awesome @@ -28,10 +29,10 @@ Fixed: - [os] Splitted os_all into os_linux and os_bsd (and refactored to async) Removed: + - `helpers.sysctl` and `helpers.sysctl_table` were removed in favour of `helpers.sysctl_async`. - # Changes in 2.3.3 Feature: Add battery widget type for OpenBSD diff --git a/README.md b/README.md index fe8b1e2..a0d553a 100644 --- a/README.md +++ b/README.md @@ -542,7 +542,6 @@ Supported platforms: GNU/Linux. `${rate}` (Mb/s), `${freq}` (MHz), `${linp}` (link quality in percent), `${txpw}` (transmission power, in dBm) and `${sign}` (signal level, in dBm) - ## Custom widget types Use any of the existing widget types as a starting point for your diff --git a/widgets/bat_openbsd.lua b/widgets/bat_openbsd.lua index 752a666..ced83d8 100644 --- a/widgets/bat_openbsd.lua +++ b/widgets/bat_openbsd.lua @@ -1,67 +1,85 @@ +-- bat_openbsd.lua - provide battery information on OpenBSD +-- Copyright (C) 2019 Enric Morales +-- Copyright (C) 2019 Nguyễn Gia Phong +-- +-- This file is part of Vicious. +-- +-- Vicious is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as +-- published by the Free Software Foundation, either version 2 of the +-- License, or (at your option) any later version. +-- +-- Vicious is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Affero General Public License for more details. +-- +-- You should have received a copy of the GNU Affero General Public License +-- along with Vicious. If not, see . + -- {{{ Grab environment -local setmetatable = setmetatable local tonumber = tonumber -local string = { format = string.format, gmatch = string.gmatch } -local io = { popen = io.popen } local math = { floor = math.floor, modf = math.modf } + +local helpers = require"vicious.helpers" +local spawn = require"vicious.spawn" -- }}} -local bat_openbsd = {} +local STATES = { [0] = "↯", -- not charging + [1] = "-", -- discharging + [2] = "!", -- critical + [3] = "+", -- charging + [4] = "N/A", -- unknown status + [255] = "N/A" } -- unimplemented by the driver -local function worker(format, warg) - local battery = warg or "bat0" - local filter = string.format("hw.sensors.acpi%s", battery) - local cmd = string.format("sysctl -a | grep '^%s'", filter) - local proc = io.popen(cmd) +return helpers.setasyncall{ + async = function (format, warg, callback) + local filter = "hw.sensors.acpi" .. (warg or "bat0") + local pattern = filter .. ".(%S+)=(%S+)" + local bat_info = {} - local bat_info = {} - for line in proc:lines("*l") do - for key, value in string.gmatch(line, "(%S+)=(%S+)") do - key = key:gsub(filter .. ".", "") - bat_info[key] = value - end - end + spawn.with_line_callback_with_shell( + ("sysctl -a | grep '^%s'"):format(filter), + { stdout = function (line) + for key, value in line:gmatch(pattern) do + bat_info[key] = value + end + end, + output_done = function () + -- current state + local state = STATES[tonumber(bat_info.raw0)] - -- current state - local states = {[0] = "↯", -- not charging - [1] = "-", -- discharging - [2] = "!", -- critical - [3] = "+", -- charging - [4] = "N/A", -- unknown status - [255] = "N/A"} -- unimplemented by the driver - local state = states[tonumber(bat_info.raw0)] + -- battery capacity in percent + local percent = tonumber( + bat_info.watthour3 / bat_info.watthour0 * 100) - -- battery capacity in percent - local percent = tonumber(bat_info.watthour3 / bat_info.watthour0 * 100) + local time + if tonumber(bat_info.power0) < 1 then + time = "∞" + else + local raw_time = bat_info.watthour3 / bat_info.power0 + local hours, hour_fraction = math.modf(raw_time) + local minutes = math.floor(60 * hour_fraction) + time = ("%d:%0.2d"):format(hours, minutes) + end - local time - if tonumber(bat_info.power0) < 1 then - time = "∞" - else - local raw_time = bat_info.watthour3 / bat_info.power0 - local hours, hour_fraction = math.modf(raw_time) - local minutes = math.floor(60 * hour_fraction) - time = string.format("%d:%0.2d", hours, minutes) - end + -- calculate wear level from (last full / design) capacity + local wear = "N/A" + if bat_info.watthour0 and bat_info.watthour4 then + local l_full = tonumber(bat_info.watthour0) + local design = tonumber(bat_info.watthour4) + wear = math.floor(l_full / design * 100) + end - -- calculate wear level from (last full / design) capacity - local wear = "N/A" - if bat_info.watthour0 and bat_info.watthour4 then - local l_full = tonumber(bat_info.watthour0) - local design = tonumber(bat_info.watthour4) - wear = math.floor(l_full / design * 100) - end + -- dis-/charging rate as presented by battery + local rate = bat_info.power0 - -- dis-/charging rate as presented by battery - local rate = bat_info.power0 - - -- returns - -- * state (high "↯", discharging "-", charging "+", N/A "⌁" } - -- * remaining_capacity (percent) - -- * remaining_time, by battery - -- * wear level (percent) - -- * present_rate (W) - return {state, percent, time, wear, rate} -end - -return setmetatable(bat_openbsd, { __call = function(_, ...) return worker(...) end }) + -- Pass the following arguments to callback function: + -- * battery state symbol (↯, -, !, + or N/A) + -- * remaining_capacity (in percent) + -- * remaining_time, by battery + -- * wear level (in percent) + -- * present_rate (in Watts) + callback{state, percent, time, wear, rate} + end }) + end }