4 # Copyright 2016,2020 Ian Jackson
5 # SPDX-License-Identifier: GPL-3.0-or-later
6 # There is NO WARRANTY.
10 # [WISH-OPTIONS... [-- TRAY-EMBED-OPTIONS... [-- XBATMON-SIMPLE-OPTIONS...]]]
14 source $lib/subproc.tcl
18 proc cmdline {id orientation} {
20 return [concat [list xacpi-simple -into $id] $argv]
23 #----- tooltip generation -----
25 proc tt-invisible {} {
27 applet::tooltip-set {}
32 catch { after cancel $ttafter }
33 catch { unset ttafter }
39 set ttafter [after 500 tt-show]
40 applet::tooltip-set [tt-string]
43 proc append-energies {av energy power eunit punit fmt} {
46 append o [format " ${fmt}%s / ${fmt}%s / ${fmt}%s ${fmt}%s" \
47 [expr { $a(${energy}_NOW) * 1e-6 }] $eunit \
48 [expr { $a(${energy}_FULL) * 1e-6 }] $eunit \
49 [expr { $a(${energy}_FULL_DESIGN) * 1e-6 }] $eunit \
50 [expr { $a(${power}_NOW) * 1e-6 }] $punit]
53 proc append-percents {qv} {
56 append o [format " %.0f%% (%.0f%%/%.0f%%)" \
57 [expr { $q(energy_NOW) * 100.0 / $q(energy_FULL_DESIGN) }] \
58 [expr { $q(energy_NOW) * 100.0 / $q(energy_FULL) }] \
59 [expr { $q(energy_FULL) * 100.0 / $q(energy_FULL_DESIGN) }]]
60 if {$q(power_NOW) < -1} {
62 } elseif {$q(power_NOW) > -1} {
63 set endpoint $q(energy_FULL)
65 if {[info exists endpoint]} {
66 set until [expr {($endpoint - $q(energy_NOW)) * 60.0/ $q(power_NOW)}]
68 append o [format " %.fmins" $until]
77 set dir /sys/class/power_supply
78 foreach f [glob -nocomplain -tails -directory $dir *] {
79 debug::debug "TT-INFO $f"
81 set chan [open $dir/$f/uevent]
84 set info "error: $info"
85 debug::debug "$f $errorInfo"
87 lappend lines "$f: $info"
92 lappend lines "error scanning: $emsg"
93 debug::debug "scanning $errorInfo"
96 set o "Total: $nbatts present "
97 append o [join [lsort [array names states]] /]
98 append-energies tot energy power Wh W %.1f
102 if {![llength $lines]} {
103 lappend lines "no power information"
105 return [join $lines "\n"]
108 proc compute {power energy factor punit eunit sign fmt} {
113 debug::debug "COMPUTE $power $energy $factor"
116 set entl {{energy NOW} {energy FULL} {energy FULL_DESIGN} {power NOW}}
120 set kv "[set $pe]_$k"
121 if {![info exists a($kv)]} { return 0 }
122 set a($kv) [expr {$a($kv) * [set "${pe}_sign"]}]
123 set q($kq) [expr {$a($kv) * $factor}]
125 debug::debug "COMPUTE OK [array names q]"
129 if {![info exists tot($kq)]} { set tot($kq) 0 }
130 set tot($kq) [expr {$tot($kq) + $q($kq)}]
132 append-energies a $energy $power $eunit $punit $fmt
137 proc tt-info {chan} {
139 upvar 1 nbatts nbatts
140 upvar 1 states states
141 while {[gets $chan l] >= 0} {
142 if {[regexp {^POWER_SUPPLY_([A-Z0-9_]+)=(.*)$} $l dummy k v]} {
143 debug::debug " uevent ok $l"
146 debug::debug " uevent unk $l"
149 debug::debug "GOT [array names a]"
150 if {![info exists a(TYPE)]} {
152 foreach k {ONLINE PRESENT} { append op [info exists a($k)] }
154 10 { set a(TYPE) Mains }
155 01 { set a(TYPE) Battery }
156 default { error "no type and bad op $op" }
158 debug::debug " guessed type $a(TYPE) from ONLINE PRESENT $op"
163 switch -exact -- $a(TYPE) {
165 switch -exact -- $a(ONLINE) {
166 0 { append o " Offline" }
167 1 { append o " Online" }
168 default { append o " ?$o" }
172 switch -exact -- $a(PRESENT) {
173 0 { append o " Absent"; return $o }
174 1 { append o " Present" }
175 default { apend o " ?$o" }
179 switch -exact -- $a(STATUS) {
181 Discharging { set sign -1 }
182 default { append o "Status=" }
184 set states($a(STATUS)) 1
186 foreach power {POWER CURRENT} energy {ENERGY CHARGE} \
187 punit {W A} eunit {Wh Ah} fmt {%.1f %.2f} {
188 switch -exact $power {
189 POWER { set factor 1.0 }
190 CURRENT { set factor [expr {$a(VOLTAGE_NOW) * 1e-6}] }
192 if {![compute $power $energy $factor \
193 $punit $eunit $sign $fmt]} continue
203 proc mode/normal {} {
204 uplevel #0 { source $lib/applet.tcl }
205 applet::setup-subproc cmdline
206 applet::setup-tooltip tt-show tt-invisible
209 proc mode/-tooltip-string {} {
214 #----- command line parsing -----
218 while {[args::next_special arg]} {
219 switch -exact -- $arg {
221 -tooltip-string { set mode $arg }
222 default { args::badoption }