From 19b748ad448c37d08ae1df1212aec22ee1d55956 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timo=20Myyr=C3=A4?= Date: Sun, 16 Dec 2012 11:17:50 +0800 Subject: [PATCH] * battery.el (battery-bsd-apm): New function. --- etc/NEWS | 4 +++ lisp/ChangeLog | 4 +++ lisp/battery.el | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 9b847b5ee70..0063aedb0db 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -41,6 +41,10 @@ bound to and S-, respectively. * Changes in Specialized Modes and Packages in Emacs 24.4 +** Battery + +*** Battery information via the BSD `apm' utility is now supported. + ** cl-lib *** New macro cl-tagbody. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 24718e1af02..e56b44ba525 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2012-12-16 Timo Myyrä + + * battery.el (battery-bsd-apm): New function. + 2012-12-16 Jay Belanger * calc/calc.el (calc-standard-date-formats): Adjust one of the diff --git a/lisp/battery.el b/lisp/battery.el index 69d25643bb9..79d86c11ac2 100644 --- a/lisp/battery.el +++ b/lisp/battery.el @@ -53,6 +53,9 @@ (directory-files "/sys/class/power_supply/" nil battery--linux-sysfs-regexp)) 'battery-linux-sysfs) + ((and (eq system-type 'berkeley-unix) + (file-executable-p "/usr/sbin/apm")) + 'battery-bsd-apm) ((and (eq system-type 'darwin) (condition-case nil (with-temp-buffer @@ -523,6 +526,75 @@ The following %-sequences are provided: "AC" "BAT") "N/A"))))) + + +;;; `apm' interface for BSD. +(defun battery-bsd-apm () + "Get APM status information from BSD apm binary. +The following %-sequences are provided: +%L AC line status (verbose) +%B Battery status (verbose) +%b Battery status, empty means high, `-' means low, + `!' means critical, and `+' means charging +%P Advanced power saving mode state (verbose) +%p Battery charge percentage +%s Remaining battery charge time in seconds +%m Remaining battery charge time in minutes +%h Remaining battery charge time in hours +%t Remaining battery charge time in the form `h:min'" + (let* ((os-name (car (split-string + (shell-command-to-string "/usr/bin/uname")))) + (apm-flag (if (equal os-name "OpenBSD") "P" "s")) + (apm-cmd (concat "/usr/sbin/apm -ablm" apm-flag)) + (apm-output (split-string (shell-command-to-string apm-cmd))) + ;; Battery status + (battery-status + (let ((stat (string-to-number (nth 0 apm-output)))) + (cond ((eq stat 0) '("high" . "")) + ((eq stat 1) '("low" . "-")) + ((eq stat 2) '("critical" . "!")) + ((eq stat 3) '("charging" . "+")) + ((eq stat 4) '("absent" . nil))))) + ;; Battery percentage + (battery-percentage (nth 1 apm-output)) + ;; Battery life + (battery-life (nth 2 apm-output)) + ;; AC status + (line-status + (let ((ac (string-to-number (nth 3 apm-output)))) + (cond ((eq ac 0) "disconnected") + ((eq ac 1) "connected") + ((eq ac 2) "backup power")))) + ;; Advanced power savings mode + (apm-mode + (let ((apm (string-to-number (nth 4 apm-output)))) + (if (string= os-name "OpenBSD") + (cond ((eq apm 0) "manual") + ((eq apm 1) "automatic") + ((eq apm 2) "cool running")) + (if (eq apm 1) "on" "off")))) + seconds minutes hours remaining-time) + (unless (member battery-life '("unknown" "-1")) + (if (member os-name '("OpenBSD" "NetBSD")) + (setq minutes (string-to-number battery-life) + seconds (* 60 minutes)) + (setq seconds (string-to-number battery-life) + minutes (truncate (/ seconds 60)))) + (setq hours (truncate (/ minutes 60)) + remaining-time (format "%d:%02d" hours + (- minutes (* 60 hours))))) + (list (cons ?L (or line-status "N/A")) + (cons ?B (or (car battery-status) "N/A")) + (cons ?b (or (cdr battery-status) "N/A")) + (cons ?p (if (string= battery-percentage "255") + "N/A" + battery-percentage)) + (cons ?P (or apm-mode "N/A")) + (cons ?s (or (and seconds (number-to-string seconds)) "N/A")) + (cons ?m (or (and minutes (number-to-string minutes)) "N/A")) + (cons ?h (or (and hours (number-to-string hours)) "N/A")) + (cons ?t (or remaining-time "N/A"))))) + ;;; `pmset' interface for Darwin (OS X). -- 2.39.5