From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Chong Yidong Newsgroups: gmane.emacs.bugs Subject: bug#643: Battery update Date: Thu, 07 Aug 2008 12:35:39 -0400 Message-ID: <87bq04dbqc.fsf__38669.5370231338$1218127717$gmane$org@stupidchicken.com> Reply-To: Chong Yidong , 643@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1218127660 23585 80.91.229.12 (7 Aug 2008 16:47:40 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 7 Aug 2008 16:47:40 +0000 (UTC) Cc: 643@emacsbugs.donarmstrong.com, Emre Sahin To: emacs-devel@gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Aug 07 18:48:31 2008 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KR8f8-0007hT-Ld for geb-bug-gnu-emacs@m.gmane.org; Thu, 07 Aug 2008 18:48:31 +0200 Original-Received: from localhost ([127.0.0.1]:40391 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KR8eD-0004gg-32 for geb-bug-gnu-emacs@m.gmane.org; Thu, 07 Aug 2008 12:47:33 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KR8e8-0004gb-BY for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 12:47:28 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KR8e5-0004gP-TJ for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 12:47:27 -0400 Original-Received: from [199.232.76.173] (port=49046 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KR8e5-0004gM-Mu for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 12:47:25 -0400 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:60003) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KR8e5-0002Lo-4K for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 12:47:25 -0400 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id m77GlNHa009137; Thu, 7 Aug 2008 09:47:23 -0700 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.13.8/8.13.8/Submit) id m77Gj3M9007879; Thu, 7 Aug 2008 09:45:03 -0700 X-Loop: don@donarmstrong.com Resent-From: Chong Yidong Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs Resent-Date: Thu, 07 Aug 2008 16:45:03 +0000 Resent-Message-ID: Resent-Sender: don@donarmstrong.com X-Emacs-PR-Message: report 643 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: Original-Received: via spool by 643-submit@emacsbugs.donarmstrong.com id=B643.12181269396033 (code B ref 643); Thu, 07 Aug 2008 16:45:03 +0000 Original-Received: (at 643) by emacsbugs.donarmstrong.com; 7 Aug 2008 16:35:39 +0000 Original-Received: from cyd (CYD.MIT.EDU [18.115.2.24]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id m77GZabZ006027 for <643@emacsbugs.donarmstrong.com>; Thu, 7 Aug 2008 09:35:37 -0700 Original-Received: by cyd (Postfix, from userid 1000) id 11B6257E17C; Thu, 7 Aug 2008 12:35:39 -0400 (EDT) X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 3) Resent-Date: Thu, 07 Aug 2008 12:47:27 -0400 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:19095 Archived-At: 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"))))) + ;;; `/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"))))) + + + ;;; `pmset' interface for Darwin (OS X). (defun battery-pmset ()