1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
* Support for ACPI has been added to battery.el.
Patch: battery-acpi-support.diff
Provided-by: Mario Lang <mlang@debian.org>
Date: Fri, 26 Sep 2003 15:30:43 +0200
Added-by: Jerome Marant <jerome@debian.org>
Status: appears to be incorporated upstream
diff -urNad /home/jerome/pkg/emacs21/svn/emacs/lisp/battery.el emacs/lisp/battery.el
--- /home/jerome/pkg/emacs21/svn/emacs/lisp/battery.el 2003-09-26 19:57:43.000000000 +0200
+++ emacs/lisp/battery.el 2003-09-28 17:19:22.000000000 +0200
@@ -42,7 +42,10 @@
(defcustom battery-status-function
(cond ((and (eq system-type 'gnu/linux)
(file-readable-p "/proc/apm"))
- 'battery-linux-proc-apm))
+ 'battery-linux-proc-apm)
+ ((and (eq system-type 'gnu/linux)
+ (file-directory-p "/proc/acpi/battery"))
+ 'battery-linux-proc-acpi))
"*Function for getting battery status information.
The function has to return an alist of conversion definitions.
Its cons cells are of the form
@@ -56,7 +59,9 @@
(defcustom battery-echo-area-format
(cond ((eq battery-status-function 'battery-linux-proc-apm)
- "Power %L, battery %B (%p%% load, remaining time %t)"))
+ "Power %L, battery %B (%p%% load, remaining time %t)")
+ ((eq battery-status-function 'battery-linux-proc-acpi)
+ "Power %L, battery %B at %r (%p%% load, remaining time %t)"))
"*Control string formatting the string to display in the echo area.
Ordinary characters in the control string are printed as-is, while
conversion specifications introduced by a `%' character in the control
@@ -70,7 +75,9 @@
(defcustom battery-mode-line-format
(cond ((eq battery-status-function 'battery-linux-proc-apm)
- " [%b%p%%]"))
+ " [%b%p%%]")
+ ((eq battery-status-function 'battery-linux-proc-acpi)
+ " [%b%p%%,%dC]"))
"*Control string formatting the string to display in the mode line.
Ordinary characters in the control string are printed as-is, while
conversion specifications introduced by a `%' character in the control
@@ -217,6 +224,122 @@
(cons ?h (or (and hours (number-to-string hours)) "N/A"))
(cons ?t (or remaining-time "N/A")))))
+
+;;; `/proc/acpi/' interface for Linux.
+
+(defun battery-linux-proc-acpi ()
+ "Get ACPI status information from Linux kernel.
+This function works only with the new `/proc/acpi/' format introduced
+in Linux version 2.4.20 and 2.6.0.
+
+The following %-sequences are provided:
+%c Current capacity (mAh)
+%B Battery status (verbose)
+%b Battery status, empty means high, `-' means low,
+ `!' means critical, and `+' means charging
+%d Temperature (in degrees Celsius)
+%L AC line status (verbose)
+%p battery load percentage
+%m Remaining time in minutes
+%h Remaining time in hours
+%t Remaining time in the form `h:min'"
+ (let (capacity design-capacity rate rate-type charging-state warn low
+ minutes hours)
+ ;; ACPI provides information about each battery present in the system in
+ ;; a separate subdirectory. We are going to merge the available
+ ;; information together since displaying for a variable amount of
+ ;; batteries seems overkill for format-strings.
+ (mapc
+ (lambda (dir)
+ (with-temp-buffer
+ (battery-insert-file-contents (expand-file-name "state" dir))
+ (when (re-search-forward "present: +yes$" nil t)
+ (and (re-search-forward "charging state: +\\(.*\\)$" nil t)
+ (or (null charging-state) (string= charging-state
+ "unknown"))
+ ;; On most multi-battery systems, most of the time only one
+ ;; battery is "charging"/"discharging", the others are
+ ;; "unknown".
+ (setq charging-state (match-string 1)))
+ (when (re-search-forward "present rate: +\\([0-9]+\\) \\(m[AW]\\)$"
+ nil t)
+ (setq rate (+ (or rate 0) (string-to-int (match-string 1)))
+ rate-type (or (and rate-type
+ (if (string= rate-type (match-string 2))
+ rate-type
+ (error
+ "Inconsistent rate types (%s vs. %s)"
+ rate-type (match-string 2))))
+ (match-string 2))))
+ (when (re-search-forward "remaining capacity: +\\([0-9]+\\) m[AW]h$"
+ nil t)
+ (setq capacity
+ (+ (or capacity 0) (string-to-int (match-string 1))))))
+ (goto-char (point-max))
+ (battery-insert-file-contents (expand-file-name "info" dir))
+ (when (re-search-forward "present: +yes$" nil t)
+ (when (re-search-forward "design capacity: +\\([0-9]+\\) m[AW]h$"
+ nil t)
+ (setq design-capacity (+ (or design-capacity 0)
+ (string-to-int (match-string 1)))))
+ (when (re-search-forward "design capacity warning: +\\([0-9]+\\) m[AW]h$"
+ nil t)
+ (setq warn (+ (or warn 0) (string-to-int (match-string 1)))))
+ (when (re-search-forward "design capacity low: +\\([0-9]+\\) m[AW]h$"
+ nil t)
+ (setq low (+ (or low 0)
+ (string-to-int (match-string 1))))))))
+ (directory-files "/proc/acpi/battery/" t "BAT"))
+ (and capacity rate
+ (setq minutes (if (zerop rate) 0
+ (floor (* (/ (float (if (string= charging-state
+ "charging")
+ (- design-capacity capacity)
+ capacity)) rate) 60)))
+ hours (/ minutes 60)))
+ (list (cons ?c (or (and capacity (number-to-string capacity)) "N/A"))
+ (cons ?L (or (when (file-exists-p "/proc/acpi/ac_adapter/AC/state")
+ (with-temp-buffer
+ (battery-insert-file-contents
+ "/proc/acpi/ac_adapter/AC/state")
+ (when (re-search-forward "state: +\\(.*\\)$" nil t)
+ (match-string 1))))
+ "N/A"))
+ (cons ?d (or (when (file-exists-p
+ "/proc/acpi/thermal_zone/THRM/temperature")
+ (with-temp-buffer
+ (battery-insert-file-contents
+ "/proc/acpi/thermal_zone/THRM/temperature")
+ (when (re-search-forward
+ "temperature: +\\([0-9]+\\) C$" nil t)
+ (match-string 1))))
+ (when (file-exists-p
+ "/proc/acpi/thermal_zone/THM/temperature")
+ (with-temp-buffer
+ (battery-insert-file-contents
+ "/proc/acpi/thermal_zone/THM/temperature")
+ (when (re-search-forward
+ "temperature: +\\([0-9]+\\) C$" nil t)
+ (match-string 1))))
+ "N/A"))
+ (cons ?r (or (and rate (concat (number-to-string rate) " "
+ rate-type)) "N/A"))
+ (cons ?B (or charging-state "N/A"))
+ (cons ?b (or (and (string= charging-state "charging") "+")
+ (and low (< capacity low) "!")
+ (and warn (< capacity warn) "-")
+ ""))
+ (cons ?h (or (and hours (number-to-string hours)) "N/A"))
+ (cons ?m (or (and minutes (number-to-string minutes)) "N/A"))
+ (cons ?t (or (and minutes
+ (format "%d:%02d" hours (- minutes (* 60 hours))))
+ "N/A"))
+ (cons ?p (or (and design-capacity capacity
+ (number-to-string
+ (floor (/ capacity
+ (/ (float design-capacity) 100)))))
+ "N/A")))))
+
;;; Private functions.
|