all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Battery update
@ 2008-08-07 16:35 Chong Yidong
  2008-08-07 18:09 ` Sven Joachim
                   ` (5 more replies)
  0 siblings, 6 replies; 42+ messages in thread
From: Chong Yidong @ 2008-08-07 16:35 UTC (permalink / raw)
  To: emacs-devel; +Cc: 643, Emre Sahin

The Linux kernel developers have deprecated the longstanding /proc/acpi
interface, which breaks battery.el on recent kernels (bug#643 and
bug#660).  Now, the battery information is supposed to come through
sysfs.

Even though it's the feature freeze, I think it's necessary to ensure
that battery.el works at least at a basic level.  So, here's a patch
that adds primitive sysfs support for battery.el.  It doesn't do as much
as before, because AFAICT the new sysfs interface provides less
information than the old acpi interface (go figure).

It's lightly tested.  Could someone try this out and see if it does the
right thing?

*** trunk/lisp/battery.el.~1.46.~	2008-05-06 03:57:26.000000000 -0400
--- trunk/lisp/battery.el	2008-08-07 12:34:45.000000000 -0400
***************
*** 47,52 ****
--- 47,56 ----
  	((and (eq system-type 'gnu/linux)
  	      (file-directory-p "/proc/acpi/battery"))
  	 'battery-linux-proc-acpi)
+ 	((and (eq system-type 'gnu/linux)
+ 	      (file-directory-p "/sys/class/power_supply/")
+ 	      (directory-files "/sys/class/power_supply/" nil "BAT[0-9]$"))
+ 	 'battery-linux-sysfs)
  	((and (eq system-type 'darwin)
  	      (condition-case nil
  		  (with-temp-buffer
***************
*** 70,75 ****
--- 74,81 ----
  (defcustom battery-echo-area-format
    (cond ((eq battery-status-function 'battery-linux-proc-acpi)
  	 "Power %L, battery %B at %r (%p%% load, remaining time %t)")
+ 	((eq battery-status-function 'battery-linux-sysfs)
+ 	 "Power %L, battery %B (%p%% load)")
  	((eq battery-status-function 'battery-pmset)
  	 "%L power, battery %B (%p%% load, remaining time %t)")
  	(battery-status-function
***************
*** 276,282 ****
  
  (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:
--- 282,288 ----
  
  (defun battery-linux-proc-acpi ()
    "Get ACPI status information from Linux kernel.
! This function works only with the `/proc/acpi/' format introduced
  in Linux version 2.4.20 and 2.6.0.
  
  The following %-sequences are provided:
***************
*** 390,395 ****
--- 396,480 ----
  		       "N/A")))))
  
  \f
+ ;;; `/sys/class/power_supply/BATN' interface for Linux.
+ 
+ (defun battery-linux-sysfs ()
+   "Get ACPI status information from Linux kernel.
+ This function works only with the new `/sys/class/power_supply/BAT'
+ format introduced in Linux version 2.4.25.
+ 
+ The following %-sequences are provided:
+ %c Current capacity (mAh or mWh)
+ %B Battery status (verbose)
+ %p Battery load percentage
+ %L AC line status (verbose)"
+   (let (charging-state
+ 	(charge-full 0)
+ 	(charge-now 0)
+ 	(energy-full 0)
+ 	(energy-now 0))
+     ;; SysFS provides information about each battery present in the
+     ;; system in a separate subdirectory.  We are going to merge the
+     ;; available information together.
+     (with-temp-buffer
+       (dolist (dir (ignore-errors
+ 		    (directory-files
+ 		     "/sys/class/power_supply/" t "BAT[0-9]$")))
+ 	(erase-buffer)
+ 	(ignore-errors (insert-file-contents
+ 			(expand-file-name "uevent" dir)))
+ 	(when (re-search-forward "POWER_SUPPLY_PRESENT=1$" nil t)
+ 	  (goto-char (point-min))
+ 	  (and (re-search-forward "POWER_SUPPLY_STATUS=\\(.*\\)$" nil t)
+ 	       ;; On most multi-battery systems, most of the time only
+ 	       ;; one battery is "charging"/"discharging", the others
+ 	       ;; are "unknown".
+ 	       (member charging-state '("Unknown" "Full" nil))
+ 	       (setq charging-state (match-string 1)))
+ 	  (let (full-string now-string)
+ 	    ;; Energy or charge
+ 	    (cond ((and (re-search-forward
+ 			 "POWER_SUPPLY_CHARGE_FULL=\\([0-9]*\\)$" nil t)
+ 			(setq full-string (match-string 1))
+ 			(re-search-forward
+ 			 "POWER_SUPPLY_CHARGE_NOW=\\([0-9]*\\)$" nil t)
+ 			(setq now-string (match-string 1)))
+ 		   (setq charge-full (+ charge-full
+ 					(string-to-number full-string))
+ 			 charge-now  (+ charge-now
+ 					(string-to-number now-string))))
+ 		  ((and (re-search-forward
+ 			 "POWER_SUPPLY_ENERGY_FULL=\\([0-9]*\\)$" nil t)
+ 			(setq full-string (match-string 1))
+ 			(re-search-forward
+ 			 "POWER_SUPPLY_ENERGY_NOW=\\([0-9]*\\)$" nil t)
+ 			(setq now-string (match-string 1)))
+ 		   (setq energy-full (+ energy-full
+ 					(string-to-number full-string))
+ 			 energy-now  (+ energy-now
+ 					(string-to-number now-string)))))))))
+     (list (cons ?c (cond ((or (> charge-full  0) (> charge-now  0))
+ 			  (number-to-string charge-now))
+ 			 ((or (> energy-full  0) (> energy-now  0))
+ 			  (number-to-string energy-now))
+ 			 (t "N/A")))
+ 	  (cons ?B (or charging-state "N/A"))
+ 	  (cons ?p (cond ((> charge-full 0)
+ 			  (format "%.1f"
+ 				  (/ (* 100 charge-now) (float charge-full))))
+ 			 ((> energy-full 0)
+ 			  (format "%.1f"
+ 				  (/ (* 100 energy-now) (float energy-full))))
+ 			 (t "N/A")))
+ 	  (cons ?L (if (file-readable-p "/sys/class/power_supply/AC/online")
+ 		       (if (battery-search-for-one-match-in-files
+ 			    "/sys/class/power_supply/AC/online" "1" 0)
+ 			   "AC"
+ 			 "BAT")
+ 		     "N/A")))))
+ 
+ 
+ \f
  ;;; `pmset' interface for Darwin (OS X).
  
  (defun battery-pmset ()




^ permalink raw reply	[flat|nested] 42+ messages in thread
* bug#643: Battery update
@ 2008-08-07 16:35 Chong Yidong
  0 siblings, 0 replies; 42+ messages in thread
From: Chong Yidong @ 2008-08-07 16:35 UTC (permalink / raw)
  To: emacs-devel; +Cc: 643, Emre Sahin

The Linux kernel developers have deprecated the longstanding /proc/acpi
interface, which breaks battery.el on recent kernels (bug#643 and
bug#660).  Now, the battery information is supposed to come through
sysfs.

Even though it's the feature freeze, I think it's necessary to ensure
that battery.el works at least at a basic level.  So, here's a patch
that adds primitive sysfs support for battery.el.  It doesn't do as much
as before, because AFAICT the new sysfs interface provides less
information than the old acpi interface (go figure).

It's lightly tested.  Could someone try this out and see if it does the
right thing?

*** trunk/lisp/battery.el.~1.46.~	2008-05-06 03:57:26.000000000 -0400
--- trunk/lisp/battery.el	2008-08-07 12:34:45.000000000 -0400
***************
*** 47,52 ****
--- 47,56 ----
  	((and (eq system-type 'gnu/linux)
  	      (file-directory-p "/proc/acpi/battery"))
  	 'battery-linux-proc-acpi)
+ 	((and (eq system-type 'gnu/linux)
+ 	      (file-directory-p "/sys/class/power_supply/")
+ 	      (directory-files "/sys/class/power_supply/" nil "BAT[0-9]$"))
+ 	 'battery-linux-sysfs)
  	((and (eq system-type 'darwin)
  	      (condition-case nil
  		  (with-temp-buffer
***************
*** 70,75 ****
--- 74,81 ----
  (defcustom battery-echo-area-format
    (cond ((eq battery-status-function 'battery-linux-proc-acpi)
  	 "Power %L, battery %B at %r (%p%% load, remaining time %t)")
+ 	((eq battery-status-function 'battery-linux-sysfs)
+ 	 "Power %L, battery %B (%p%% load)")
  	((eq battery-status-function 'battery-pmset)
  	 "%L power, battery %B (%p%% load, remaining time %t)")
  	(battery-status-function
***************
*** 276,282 ****
  
  (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:
--- 282,288 ----
  
  (defun battery-linux-proc-acpi ()
    "Get ACPI status information from Linux kernel.
! This function works only with the `/proc/acpi/' format introduced
  in Linux version 2.4.20 and 2.6.0.
  
  The following %-sequences are provided:
***************
*** 390,395 ****
--- 396,480 ----
  		       "N/A")))))
  
  \f
+ ;;; `/sys/class/power_supply/BATN' interface for Linux.
+ 
+ (defun battery-linux-sysfs ()
+   "Get ACPI status information from Linux kernel.
+ This function works only with the new `/sys/class/power_supply/BAT'
+ format introduced in Linux version 2.4.25.
+ 
+ The following %-sequences are provided:
+ %c Current capacity (mAh or mWh)
+ %B Battery status (verbose)
+ %p Battery load percentage
+ %L AC line status (verbose)"
+   (let (charging-state
+ 	(charge-full 0)
+ 	(charge-now 0)
+ 	(energy-full 0)
+ 	(energy-now 0))
+     ;; SysFS provides information about each battery present in the
+     ;; system in a separate subdirectory.  We are going to merge the
+     ;; available information together.
+     (with-temp-buffer
+       (dolist (dir (ignore-errors
+ 		    (directory-files
+ 		     "/sys/class/power_supply/" t "BAT[0-9]$")))
+ 	(erase-buffer)
+ 	(ignore-errors (insert-file-contents
+ 			(expand-file-name "uevent" dir)))
+ 	(when (re-search-forward "POWER_SUPPLY_PRESENT=1$" nil t)
+ 	  (goto-char (point-min))
+ 	  (and (re-search-forward "POWER_SUPPLY_STATUS=\\(.*\\)$" nil t)
+ 	       ;; On most multi-battery systems, most of the time only
+ 	       ;; one battery is "charging"/"discharging", the others
+ 	       ;; are "unknown".
+ 	       (member charging-state '("Unknown" "Full" nil))
+ 	       (setq charging-state (match-string 1)))
+ 	  (let (full-string now-string)
+ 	    ;; Energy or charge
+ 	    (cond ((and (re-search-forward
+ 			 "POWER_SUPPLY_CHARGE_FULL=\\([0-9]*\\)$" nil t)
+ 			(setq full-string (match-string 1))
+ 			(re-search-forward
+ 			 "POWER_SUPPLY_CHARGE_NOW=\\([0-9]*\\)$" nil t)
+ 			(setq now-string (match-string 1)))
+ 		   (setq charge-full (+ charge-full
+ 					(string-to-number full-string))
+ 			 charge-now  (+ charge-now
+ 					(string-to-number now-string))))
+ 		  ((and (re-search-forward
+ 			 "POWER_SUPPLY_ENERGY_FULL=\\([0-9]*\\)$" nil t)
+ 			(setq full-string (match-string 1))
+ 			(re-search-forward
+ 			 "POWER_SUPPLY_ENERGY_NOW=\\([0-9]*\\)$" nil t)
+ 			(setq now-string (match-string 1)))
+ 		   (setq energy-full (+ energy-full
+ 					(string-to-number full-string))
+ 			 energy-now  (+ energy-now
+ 					(string-to-number now-string)))))))))
+     (list (cons ?c (cond ((or (> charge-full  0) (> charge-now  0))
+ 			  (number-to-string charge-now))
+ 			 ((or (> energy-full  0) (> energy-now  0))
+ 			  (number-to-string energy-now))
+ 			 (t "N/A")))
+ 	  (cons ?B (or charging-state "N/A"))
+ 	  (cons ?p (cond ((> charge-full 0)
+ 			  (format "%.1f"
+ 				  (/ (* 100 charge-now) (float charge-full))))
+ 			 ((> energy-full 0)
+ 			  (format "%.1f"
+ 				  (/ (* 100 energy-now) (float energy-full))))
+ 			 (t "N/A")))
+ 	  (cons ?L (if (file-readable-p "/sys/class/power_supply/AC/online")
+ 		       (if (battery-search-for-one-match-in-files
+ 			    "/sys/class/power_supply/AC/online" "1" 0)
+ 			   "AC"
+ 			 "BAT")
+ 		     "N/A")))))
+ 
+ 
+ \f
  ;;; `pmset' interface for Darwin (OS X).
  
  (defun battery-pmset ()






^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2008-08-11  0:10 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-07 16:35 Battery update Chong Yidong
2008-08-07 18:09 ` Sven Joachim
2008-08-07 18:19   ` bug#643: " Chong Yidong
2008-08-07 18:19   ` Chong Yidong
2008-08-07 19:11     ` Sven Joachim
2008-08-07 19:28       ` bug#643: " Chong Yidong
2008-08-07 19:28       ` Chong Yidong
2008-08-07 19:45         ` bug#643: " Sven Joachim
2008-08-07 19:45         ` Sven Joachim
2008-08-07 20:32           ` bug#643: " Chong Yidong
2008-08-07 20:32           ` Chong Yidong
2008-08-07 22:24             ` Emre Sahin
2008-08-08  0:10               ` Chong Yidong
2008-08-08  5:56                 ` Sven Joachim
2008-08-08  8:19                   ` Eli Zaretskii
2008-08-08 10:52                     ` Johannes Weiner
2008-08-08  5:56                 ` bug#643: " Sven Joachim
2008-08-08 13:26                 ` Emre Sahin
2008-08-09  1:02                   ` bug#643: " OFFICE ZERO
2008-08-09  1:07                   ` OFFICE ZERO
2008-08-08 13:26                 ` Emre Sahin
2008-08-08  0:10               ` Chong Yidong
2008-08-07 22:24             ` Emre Sahin
2008-08-08  5:50             ` Sven Joachim
2008-08-08  5:50             ` bug#643: " Sven Joachim
2008-08-07 19:11     ` Sven Joachim
2008-08-07 18:09 ` Sven Joachim
2008-08-07 18:18 ` Lennart Borgman (gmail)
2008-08-07 18:36   ` Óscar Fuentes
2008-08-07 18:54   ` David De La Harpe Golden
2008-08-07 18:54   ` David De La Harpe Golden
2008-08-07 21:54     ` Emre Sahin
2008-08-07 21:54     ` Emre Sahin
2008-08-10 10:14   ` Yoni Rabkin
2008-08-11  0:10   ` T. V. Raman
2008-08-11  0:10   ` T. V. Raman
2008-08-07 18:18 ` Lennart Borgman (gmail)
2008-08-08 17:56 ` Stefan Monnier
2008-08-09  1:00   ` bug#643: " OFFICE ZERO
2008-08-09 14:13   ` OFFICE ZERO
2008-08-08 17:56 ` Stefan Monnier
  -- strict thread matches above, loose matches on Subject: below --
2008-08-07 16:35 Chong Yidong

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.