File: battery-acpi-support.diff

package info (click to toggle)
emacs21 21.4a%2B1-3etch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 59,104 kB
  • ctags: 58,909
  • sloc: lisp: 493,229; ansic: 237,175; xml: 4,262; sh: 4,109; makefile: 2,479; perl: 1,069; cs: 776; asm: 254; csh: 9; sed: 4
file content (167 lines) | stat: -rw-r--r-- 6,830 bytes parent folder | download | duplicates (3)
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.