(defparameter *battery-file* "/proc/acpi/battery/BAT0/state")
(defun split-string (string delim)
(let ((pos (position delim string)))
(if (null pos)
(cons string nil)
(cons (subseq string 0 pos)
(split-string (subseq string pos))))))
(defun get-battery-status ()
(let ((remaining-charge
(get-value-from-file *battery-file* "remaining capacity"))
(present-rate (get-value-from-file *battery-file* "present rate")))
(format t "Remaining battery time: ~a hrs" (/ (float present-rate)
(float remaining-charge)))))
(defun get-value-from-file (file str)
(with-open-file (stream file)
(let ((parts (do ((line (read-line stream nil)
(read-line stream nil)))
((or (null line)
(not (null (search str line)))) line))))
(if (null parts)
nil
(parse-integer (string-trim " " (cadr (split-string parts #\:)))
:junk-allowed t)))))
(get-battery-status)
KGRlZnBhcmFtZXRlciAqYmF0dGVyeS1maWxlKiAiL3Byb2MvYWNwaS9iYXR0ZXJ5L0JBVDAvc3RhdGUiKQoKKGRlZnVuIHNwbGl0LXN0cmluZyAoc3RyaW5nIGRlbGltKQogIChsZXQgKChwb3MgKHBvc2l0aW9uIGRlbGltIHN0cmluZykpKQogICAgKGlmIChudWxsIHBvcykKICAgICAgICAoY29ucyBzdHJpbmcgbmlsKQogICAgICAgIChjb25zIChzdWJzZXEgc3RyaW5nIDAgcG9zKQogICAgICAgICAgICAgIChzcGxpdC1zdHJpbmcgKHN1YnNlcSBzdHJpbmcgcG9zKSkpKSkpCgooZGVmdW4gZ2V0LWJhdHRlcnktc3RhdHVzICgpCiAgKGxldCAoKHJlbWFpbmluZy1jaGFyZ2UKICAgICAgICAgKGdldC12YWx1ZS1mcm9tLWZpbGUgKmJhdHRlcnktZmlsZSogInJlbWFpbmluZyBjYXBhY2l0eSIpKQogICAgICAgIChwcmVzZW50LXJhdGUgKGdldC12YWx1ZS1mcm9tLWZpbGUgKmJhdHRlcnktZmlsZSogInByZXNlbnQgcmF0ZSIpKSkKICAgIChmb3JtYXQgdCAiUmVtYWluaW5nIGJhdHRlcnkgdGltZTogfmEgaHJzIiAoLyAoZmxvYXQgcHJlc2VudC1yYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCByZW1haW5pbmctY2hhcmdlKSkpKSkKCihkZWZ1biBnZXQtdmFsdWUtZnJvbS1maWxlIChmaWxlIHN0cikKICAod2l0aC1vcGVuLWZpbGUgKHN0cmVhbSBmaWxlKQogICAgKGxldCAoKHBhcnRzIChkbyAoKGxpbmUgKHJlYWQtbGluZSBzdHJlYW0gbmlsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWQtbGluZSBzdHJlYW0gbmlsKSkpCiAgICAgICAgICAgICAgICAgICAgICgob3IgKG51bGwgbGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IChudWxsIChzZWFyY2ggc3RyIGxpbmUpKSkpIGxpbmUpKSkpCiAgICAgIChpZiAobnVsbCBwYXJ0cykKICAgICAgICAgIG5pbAogICAgICAgICAgKHBhcnNlLWludGVnZXIgKHN0cmluZy10cmltICIgIiAoY2FkciAoc3BsaXQtc3RyaW5nIHBhcnRzICNcOikpKQogICAgICAgICAgICAgICAgICAgICAgICAgOmp1bmstYWxsb3dlZCB0KSkpKSkKCihnZXQtYmF0dGVyeS1zdGF0dXMp