From 51b4d42e8dde0d08e13b17c78b994f79afea6093 Mon Sep 17 00:00:00 2001 From: Christopher Hall Date: Thu, 29 Aug 2019 15:19:55 +0800 Subject: [PATCH] add FreeBSD support to power module uses the FreeBSD apm command to get charge status and battery percentage Signed-off-by: Christopher Hall --- modules/power/battery.go | 1 + modules/power/battery_freebsd.go | 106 +++++++++++++++++++++++++++++++ modules/power/source.go | 1 + modules/power/source_freebsd.go | 15 +++++ 4 files changed, 123 insertions(+) create mode 100644 modules/power/battery_freebsd.go create mode 100644 modules/power/source_freebsd.go diff --git a/modules/power/battery.go b/modules/power/battery.go index 5df33242..8e014c99 100644 --- a/modules/power/battery.go +++ b/modules/power/battery.go @@ -1,4 +1,5 @@ // +build !linux +// +build !freebsd package power diff --git a/modules/power/battery_freebsd.go b/modules/power/battery_freebsd.go new file mode 100644 index 00000000..6df04e30 --- /dev/null +++ b/modules/power/battery_freebsd.go @@ -0,0 +1,106 @@ +// +build freebsd + +package power + +import ( + "fmt" + "os/exec" + "strconv" + "strings" + + "github.com/wtfutil/wtf/utils" +) + +var batteryState string + +type Battery struct { + args []string + cmd string + result string + + Charge string + Remaining string +} + +func NewBattery() *Battery { + return &Battery{} +} + +/* -------------------- Exported Functions -------------------- */ + +func (battery *Battery) Refresh() { + data := battery.execute() + battery.result = battery.parse(data) +} + +func (battery *Battery) String() string { + return battery.result +} + +/* -------------------- Unexported Functions -------------------- */ + +// returns 3 numbers +// 1/0 = AC/battery +// c = battery charge percentage +// -1/s = charging / seconds to empty +func (battery *Battery) execute() string { + cmd := exec.Command("apm", "-alt") + return utils.ExecuteCommand(cmd) +} + +func (battery *Battery) parse(data string) string { + lines := strings.Split(data, "\n") + if len(lines) < 3 { + return "unknown" + } + batteryState = strings.TrimSpace(lines[0]) + charge := strings.TrimSpace(lines[1]) + timeToEmpty := "∞" + seconds, err := strconv.Atoi(strings.TrimSpace(lines[2])) + if err == nil && seconds >= 0 { + h := seconds / 3600 + m := seconds % 3600 / 60 + s := seconds % 60 + timeToEmpty = fmt.Sprintf("%2d:%02d:%02d", h, m, s) + } + + str := fmt.Sprintf(" %10s: %s%%\n", "Charge", battery.formatCharge(charge)) + str += fmt.Sprintf(" %10s: %s\n", "Remaining", timeToEmpty) + str += fmt.Sprintf(" %10s: %s\n", "State", battery.formatState(batteryState)) + // if s := table["time to full"]; s != "" { + // str += fmt.Sprintf(" %10s: %s\n", "TimeToFull", table["time to full"]) + // } + + return str +} + +func (battery *Battery) formatCharge(data string) string { + percent, _ := strconv.ParseFloat(strings.Replace(data, "%", "", -1), 32) + color := "" + + switch { + case percent >= 70: + color = "[green]" + case percent >= 35: + color = "[yellow]" + default: + color = "[red]" + } + + return color + data + "[white]" +} + +func (battery *Battery) formatState(data string) string { + color := "" + + switch data { + case "1": + color = "[green]charging" + case "0": + color = "[yellow]discharging" + default: + color = "[white]unknown" + } + + return color + "[white]" +} diff --git a/modules/power/source.go b/modules/power/source.go index 623922cf..3304d76b 100644 --- a/modules/power/source.go +++ b/modules/power/source.go @@ -1,4 +1,5 @@ // +build !linux +// +build !freebsd package power diff --git a/modules/power/source_freebsd.go b/modules/power/source_freebsd.go new file mode 100644 index 00000000..089e8ee2 --- /dev/null +++ b/modules/power/source_freebsd.go @@ -0,0 +1,15 @@ +// +build freebsd + +package power + +// powerSource returns the name of the current power source, probably one of +// "AC Power" or "Battery Power" +func powerSource() string { + switch batteryState { + case "1": + return "AC Power" + case "0": + return "Battery Power" + } + return batteryState +}