github.com/wtfutil/wtf@v0.43.0/modules/power/battery_freebsd.go (about) 1 //go:build freebsd 2 3 package power 4 5 import ( 6 "fmt" 7 "os/exec" 8 "strconv" 9 "strings" 10 11 "github.com/wtfutil/wtf/utils" 12 ) 13 14 var batteryState string 15 16 type Battery struct { 17 args []string 18 cmd string 19 result string 20 21 Charge string 22 Remaining string 23 } 24 25 func NewBattery() *Battery { 26 return &Battery{} 27 } 28 29 /* -------------------- Exported Functions -------------------- */ 30 31 func (battery *Battery) Refresh() { 32 data := battery.execute() 33 battery.result = battery.parse(data) 34 } 35 36 func (battery *Battery) String() string { 37 return battery.result 38 } 39 40 /* -------------------- Unexported Functions -------------------- */ 41 42 // returns 3 numbers 43 // 44 // 1/0 = AC/battery 45 // c = battery charge percentage 46 // -1/s = charging / seconds to empty 47 func (battery *Battery) execute() string { 48 cmd := exec.Command("apm", "-alt") 49 return utils.ExecuteCommand(cmd) 50 } 51 52 func (battery *Battery) parse(data string) string { 53 lines := strings.Split(data, "\n") 54 if len(lines) < 3 { 55 return "unknown" 56 } 57 batteryState = strings.TrimSpace(lines[0]) 58 charge := strings.TrimSpace(lines[1]) 59 timeToEmpty := "∞" 60 seconds, err := strconv.Atoi(strings.TrimSpace(lines[2])) 61 if err == nil && seconds >= 0 { 62 h := seconds / 3600 63 m := seconds % 3600 / 60 64 s := seconds % 60 65 timeToEmpty = fmt.Sprintf("%2d:%02d:%02d", h, m, s) 66 } 67 68 str := fmt.Sprintf(" %14s: %s%%\n", "Charge", battery.formatCharge(charge)) 69 str += fmt.Sprintf(" %14s: %s\n", "Remaining", timeToEmpty) 70 str += fmt.Sprintf(" %14s: %s\n", "State", battery.formatState(batteryState)) 71 72 return str 73 } 74 75 func (battery *Battery) formatCharge(data string) string { 76 percent, _ := strconv.ParseFloat(strings.Replace(data, "%", "", -1), 32) 77 return utils.ColorizePercent(percent) 78 } 79 80 func (battery *Battery) formatState(data string) string { 81 color := "" 82 83 switch data { 84 case "1": 85 color = "[green]charging" 86 case "0": 87 color = "[yellow]discharging" 88 default: 89 color = "[white]unknown" 90 } 91 92 return color + "[white]" 93 }