;;; 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 (monitor-battery 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) (monitor-battery current-level))) ;; Entry point of the program. (monitor-battery 100)