|
|
@@ -0,0 +1,56 @@ |
|
|
|
;;; Battery monitoring daemon script. |
|
|
|
|
|
|
|
(import shell) |
|
|
|
|
|
|
|
(import srfi-1) |
|
|
|
|
|
|
|
;;; Constant values. |
|
|
|
|
|
|
|
;;; Battery level control interval, in seconds. |
|
|
|
|
|
|
|
(define +check-interval+ 5) |
|
|
|
|
|
|
|
;;; Path to the virtual file containing the battery percentage number. |
|
|
|
|
|
|
|
(define +capacity-path+ "/sys/class/power_supply/BAT1/capacity") |
|
|
|
|
|
|
|
;;; Association list of threshold levels and formatting functions. |
|
|
|
|
|
|
|
(define +thresholds+ |
|
|
|
`((20 . ,(lambda (battery-level) |
|
|
|
(string-append "Battery level low: " (number->string battery-level) "%."))) |
|
|
|
(5 . ,(lambda (battery-level) |
|
|
|
(string-append "Battery level critical: " (number->string battery-level) "%."))))) |
|
|
|
|
|
|
|
;;; Utility functions. |
|
|
|
|
|
|
|
;;; Get the battery level, return it as a number. |
|
|
|
|
|
|
|
(define (get-battery-level) |
|
|
|
(with-input-from-file +capacity-path+ read)) |
|
|
|
|
|
|
|
;;; Method to display a notification dialog. |
|
|
|
|
|
|
|
(define (user-notify message) |
|
|
|
(run ("notify-send '" ,message "'"))) |
|
|
|
|
|
|
|
;;; Core daemon loop. |
|
|
|
|
|
|
|
(define (core previous-level) |
|
|
|
(let ((current-level (get-battery-level))) |
|
|
|
(let ((crossed-thresholds |
|
|
|
(filter (lambda (n) |
|
|
|
(and (>= n current-level) |
|
|
|
(< n previous-level))) |
|
|
|
(map car +thresholds+)))) |
|
|
|
(if (not (null? crossed-thresholds)) |
|
|
|
(user-notify ((cdr (assoc (last crossed-thresholds) +thresholds+)) current-level)))) |
|
|
|
(sleep +check-interval+) |
|
|
|
(core current-level))) |
|
|
|
|
|
|
|
;;; Entry point of the program. |
|
|
|
|
|
|
|
(define (main) |
|
|
|
(core 100)) |
|
|
|
|
|
|
|
(main) |