* gnutls.c: Remove unused macros.
[bpt/emacs.git] / lisp / battery.el
index 2123feb..9afe9de 100644 (file)
@@ -1,17 +1,16 @@
 ;;; battery.el --- display battery status information  -*- coding: iso-8859-1 -*-
 
 ;;; battery.el --- display battery status information  -*- coding: iso-8859-1 -*-
 
-;; Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1997-1998, 2000-2011 Free Software Foundation, Inc.
 
 ;; Author: Ralph Schleicher <rs@nunatak.allgaeu.org>
 ;; Keywords: hardware
 
 ;; This file is part of GNU Emacs.
 
 
 ;; Author: Ralph Schleicher <rs@nunatak.allgaeu.org>
 ;; Keywords: hardware
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,9 +18,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 
 ;;; Commentary:
 
        ((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 "/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
        ((and (eq system-type 'darwin)
              (condition-case nil
                  (with-temp-buffer
@@ -58,7 +59,7 @@
         'battery-pmset)
        ((eq system-type 'windows-nt)
         'w32-battery-status))
         'battery-pmset)
        ((eq system-type 'windows-nt)
         'w32-battery-status))
-  "*Function for getting battery status information.
+  "Function for getting battery status information.
 The function has to return an alist of conversion definitions.
 Its cons cells are of the form
 
 The function has to return an alist of conversion definitions.
 Its cons cells are of the form
 
@@ -72,11 +73,13 @@ introduced by a `%' character in a control string."
 (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)")
 (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
         "Power %L, battery %B (%p%% load, remaining time %t)"))
        ((eq battery-status-function 'battery-pmset)
         "%L power, battery %B (%p%% load, remaining time %t)")
        (battery-status-function
         "Power %L, battery %B (%p%% load, remaining time %t)"))
-  "*Control string formatting the string to display in the echo area.
+  "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
 string are substituted as defined by the current value of the variable
 Ordinary characters in the control string are printed as-is, while
 conversion specifications introduced by a `%' character in the control
 string are substituted as defined by the current value of the variable
@@ -104,7 +107,7 @@ string are substituted as defined by the current value of the variable
         "[%b%p%%,%d°C]")
        (battery-status-function
         "[%b%p%%]"))
         "[%b%p%%,%d°C]")
        (battery-status-function
         "[%b%p%%]"))
-  "*Control string formatting the string to display in the mode line.
+  "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
 string are substituted as defined by the current value of the variable
 Ordinary characters in the control string are printed as-is, while
 conversion specifications introduced by a `%' character in the control
 string are substituted as defined by the current value of the variable
@@ -124,18 +127,18 @@ string are substituted as defined by the current value of the variable
   :group 'battery)
 
 (defcustom battery-update-interval 60
   :group 'battery)
 
 (defcustom battery-update-interval 60
-  "*Seconds after which the battery status will be updated."
+  "Seconds after which the battery status will be updated."
   :type 'integer
   :group 'battery)
 
 (defcustom battery-load-low 25
   :type 'integer
   :group 'battery)
 
 (defcustom battery-load-low 25
-  "*Upper bound of low battery load percentage.
+  "Upper bound of low battery load percentage.
 A battery load percentage below this number is considered low."
   :type 'integer
   :group 'battery)
 
 (defcustom battery-load-critical 10
 A battery load percentage below this number is considered low."
   :type 'integer
   :group 'battery)
 
 (defcustom battery-load-critical 10
-  "*Upper bound of critical battery load percentage.
+  "Upper bound of critical battery load percentage.
 A battery load percentage below this number is considered critical."
   :type 'integer
   :group 'battery)
 A battery load percentage below this number is considered critical."
   :type 'integer
   :group 'battery)
@@ -278,7 +281,7 @@ The following %-sequences are provided:
 
 (defun battery-linux-proc-acpi ()
   "Get ACPI status information from Linux kernel.
 
 (defun battery-linux-proc-acpi ()
   "Get ACPI status information from Linux kernel.
-This function works only with the new `/proc/acpi/' format introduced
+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:
 in Linux version 2.4.20 and 2.6.0.
 
 The following %-sequences are provided:
@@ -392,6 +395,85 @@ The following %-sequences are provided:
                       "N/A")))))
 
 \f
                       "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/'
+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)
+              (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).
+           ;; Keep track of both, and choose which to report later.
+           (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
+                           (list "/sys/class/power_supply/AC/online"
+                                 "/sys/class/power_supply/ACAD/online")
+                           "1" 0)
+                          "AC"
+                        "BAT")
+                    "N/A")))))
+
+
+\f
 ;;; `pmset' interface for Darwin (OS X).
 
 (defun battery-pmset ()
 ;;; `pmset' interface for Darwin (OS X).
 
 (defun battery-pmset ()
@@ -470,5 +552,4 @@ MATCH-NUM in the match.  Otherwise, return nil."
 \f
 (provide 'battery)
 
 \f
 (provide 'battery)
 
-;; arch-tag: 65916f50-4754-4b6b-ac21-0b510f545a37
 ;;; battery.el ends here
 ;;; battery.el ends here