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  }