]> code.delx.au - gnu-emacs/commitdiff
Handle battery capacity on Lemote Yeeloong.
authorRichard M. Stallman <rms@gnu.org>
Mon, 2 Jan 2012 23:18:48 +0000 (18:18 -0500)
committerRichard M. Stallman <rms@gnu.org>
Mon, 2 Jan 2012 23:18:48 +0000 (18:18 -0500)
lisp/ChangeLog
lisp/battery.el

index d5c10373546121a6875915e4f7942b13bf680242..459eea2a3eca1b4fb6ebb5a01cdaa8aefed9420e 100644 (file)
@@ -1,3 +1,11 @@
+2012-01-02  Richard Stallman  <rms@gnu.org>
+
+       * battery.el (battery-status-function):
+       Detect when to use battery-yeeloong-sysfs.
+       (battery-echo-area-format): Add string for Yeeloong.
+       (battery-linux-proc-apm, battery-linux-proc-acpi): Doc fixes.
+       (battery-yeeloong-sysfs): New function.
+
 2012-01-02  Chong Yidong  <cyd@gnu.org>
 
        * dirtrack.el (dirtrack-list): Eliminate unused third element.
index bb899f2beae425030c1d4a8ffaa603ee0b93d060..396423d9deadde790d22da0d129dfd54797f8c50 100644 (file)
              (file-directory-p "/sys/class/power_supply/")
              (directory-files "/sys/class/power_supply/" nil "BAT[0-9]$"))
         'battery-linux-sysfs)
+       ((and (eq system-type 'gnu/linux)
+             (file-directory-p "/sys/class/power_supply/yeeloong-bat/")
+             (directory-files "/sys/class/power_supply/yeeloong-bat/" nil "charge_"))
+        'battery-yeeloong-sysfs)
        ((and (eq system-type 'darwin)
              (condition-case nil
                  (with-temp-buffer
@@ -77,6 +81,8 @@ introduced by a `%' character in a control string."
         "Power %L, battery %B (%p%% load)")
        ((eq battery-status-function 'battery-pmset)
         "%L power, battery %B (%p%% load, remaining time %t)")
+       ((eq battery-status-function 'battery-yeeloong-sysfs)
+        "%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.
@@ -226,7 +232,7 @@ seconds."
   "Regular expression matching contents of `/proc/apm'.")
 
 (defun battery-linux-proc-apm ()
-  "Get APM status information from Linux kernel.
+  "Get APM status information from Linux (the kernel).
 This function works only with the new `/proc/apm' format introduced
 in Linux version 1.3.58.
 
@@ -297,7 +303,7 @@ The following %-sequences are provided:
 ;;; `/proc/acpi/' interface for Linux.
 
 (defun battery-linux-proc-acpi ()
-  "Get ACPI status information from Linux kernel.
+  "Get ACPI status information from Linux (the kernel).
 This function works only with the `/proc/acpi/' format introduced
 in Linux version 2.4.20 and 2.6.0.
 
@@ -518,7 +524,90 @@ The following %-sequences are provided:
                         "BAT")
                     "N/A")))))
 
+(defun battery-yeeloong-sysfs ()
+  "Get ACPI status information from Linux (the kernel).
+This function works only on the Lemote Yeeloong.
+
+The following %-sequences are provided:
+%c Current capacity (mAh)
+%r Current rate
+%B Battery status (verbose)
+%b Battery status, empty means high, `-' means low,
+   `!' means critical, and `+' means charging
+%L AC line status (verbose)
+%p Battery load percentage
+%m Remaining time (to charge or discharge) in minutes
+%h Remaining time (to charge or discharge) in hours
+%t Remaining time (to charge or discharge) in the form `h:min'"
+
+  (let (capacity
+       capacity-level
+       status
+       ac-online
+       hours
+       current-now
+       charge-full
+       charge-now)
 
+    (with-temp-buffer
+      (ignore-errors
+       (insert-file-contents "/sys/class/power_supply/yeeloong-bat/uevent")
+       (goto-char 1)
+       (search-forward "POWER_SUPPLY_CHARGE_NOW=")
+       (setq charge-now (read (current-buffer)))
+       (goto-char 1)
+       (search-forward "POWER_SUPPLY_CHARGE_FULL=")
+       (setq charge-full (read (current-buffer)))
+       (goto-char 1)
+       (search-forward "POWER_SUPPLY_CURRENT_NOW=")
+       (setq current-now (read (current-buffer)))
+       (goto-char 1)
+       (search-forward "POWER_SUPPLY_CAPACITY_LEVEL=")
+       (setq capacity-level (buffer-substring (point) (line-end-position)))
+       (goto-char 1)
+       (search-forward "POWER_SUPPLY_STATUS=")
+       (setq status (buffer-substring (point) (line-end-position))))
+       
+      (erase-buffer)
+      (ignore-errors
+       (insert-file-contents
+        "/sys/class/power_supply/yeeloong-ac/online")
+       (goto-char 1)
+       (setq ac-online (read (current-buffer)))
+       (erase-buffer)))
+
+
+    (setq capacity (round (/ (* charge-now 100.0) charge-full)))
+    (when (and current-now (not (= current-now 0)))
+      (if (< current-now 0)
+         ;; Charging
+         (setq hours (/ (- charge-now charge-full) (+ 0.0 current-now)))
+       ;; Discharging
+       (setq hours (/ charge-now (+ 0.0 current-now)))))
+
+    (list (cons ?c (if charge-now
+                      (number-to-string charge-now)
+                    "N/A"))
+         (cons ?r current-now)
+         (cons ?B (cond ((equal capacity-level "Full") "full")
+                        ((equal status "Charging") "charging")
+                        ((equal capacity-level "Low") "low")
+                        ((equal capacity-level "Critical") "critical")
+                        (t "high")))
+         (cons ?b (cond ((equal capacity-level "Full") " ")
+                        ((equal status "Charging") "+")
+                        ((equal capacity-level "Low") "-")
+                        ((equal capacity-level "Critical") "!")
+                        (t " ")))
+         (cons ?h (if hours (number-to-string hours) "N/A"))
+         (cons ?m (if hours (number-to-string (* 60 hours)) "N/A"))
+         (cons ?t (if hours
+                      (format "%d:%d"
+                              (/ (round (* 60 hours)) 60)
+                              (% (round (* 60 hours)) 60))
+                    "N/A"))
+         (cons ?p (if capacity (number-to-string capacity) "N/A"))
+         (cons ?L (if (eq ac-online 1) "AC" "BAT")))))
 \f
 ;;; `pmset' interface for Darwin (OS X).