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 16:32:59 -0400 Message-ID: <87bq04r2f8.fsf__25224.4350187995$1218142125$gmane$org@stupidchicken.com> References: <87bq04dbqc.fsf@stupidchicken.com> <87ej50g0ib.fsf@gmx.de> <87bq048z7t.fsf@stupidchicken.com> <878wv8fxmr.fsf@gmx.de> <87abfo4obc.fsf@stupidchicken.com> <873algfw2d.fsf@gmx.de> 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 1218142068 10717 80.91.229.12 (7 Aug 2008 20:47:48 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 7 Aug 2008 20:47:48 +0000 (UTC) Cc: 643@emacsbugs.donarmstrong.com, Emre Sahin , emacs-devel@gnu.org To: Sven Joachim Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Aug 07 22:48:39 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 1KRCPT-00020r-Mi for geb-bug-gnu-emacs@m.gmane.org; Thu, 07 Aug 2008 22:48:36 +0200 Original-Received: from localhost ([127.0.0.1]:57244 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KRCOY-0007H0-3n for geb-bug-gnu-emacs@m.gmane.org; Thu, 07 Aug 2008 16:47:38 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KRCOQ-0007ED-1b for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 16:47:30 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KRCON-0007Bq-BN for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 16:47:29 -0400 Original-Received: from [199.232.76.173] (port=53737 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KRCON-0007Ba-3r for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 16:47:27 -0400 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:34818) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KRCOM-0006nT-90 for bug-gnu-emacs@gnu.org; Thu, 07 Aug 2008 16:47:26 -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 m77KlNgh018183; Thu, 7 Aug 2008 13:47:23 -0700 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.13.8/8.13.8/Submit) id m77Ke48E015529; Thu, 7 Aug 2008 13:40:04 -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 20:40:04 +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.121814118013776 (code B ref 643); Thu, 07 Aug 2008 20:40:04 +0000 Original-Received: (at 643) by emacsbugs.donarmstrong.com; 7 Aug 2008 20:33:00 +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 m77KWuRk013770 for <643@emacsbugs.donarmstrong.com>; Thu, 7 Aug 2008 13:32:58 -0700 Original-Received: by cyd (Postfix, from userid 1000) id 8E2E357E17D; Thu, 7 Aug 2008 16:33:00 -0400 (EDT) In-Reply-To: <873algfw2d.fsf@gmx.de> (Sven Joachim's message of "Thu, 07 Aug 2008 21:45:46 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux) X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 3) Resent-Date: Thu, 07 Aug 2008 16:47:29 -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:19116 Archived-At: Sven Joachim writes: >> What about (from the shell) >> >> cat /sys/class/power_supply/BAT0/uevent > > POWER_SUPPLY_VOLTAGE_NOW=12444000 > POWER_SUPPLY_CURRENT_NOW=0 > POWER_SUPPLY_CHARGE_FULL_DESIGN=4000000 > POWER_SUPPLY_CHARGE_FULL=3985000 > POWER_SUPPLY_CHARGE_NOW=3985000 > POWER_SUPPLY_MODEL_NAME=GC86503SY90 > POWER_SUPPLY_MANUFACTURER=SONY > POWER_SUPPLY_SERIAL_NUMBER= Maybe it's a Lisp integer overflow (I'm guessing you're on a 32-bit machine). Does the following patch give better results? *** trunk/lisp/battery.el.~1.46.~ 2008-05-06 03:57:26.000000000 -0400 --- trunk/lisp/battery.el 2008-08-07 16:31:34.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.0) + (charge-now 0.0) + (energy-full 0.0) + (energy-now 0.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) + ;; Sysfs may list either charge (mAh) or energy (mWh) + (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) charge-full))) + ((> energy-full 0) + (format "%.1f" + (/ (* 100 energy-now) 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 ()