Scripts/battery.scm
2022-03-30 23:20:58 +02:00

54 lines
1.4 KiB
Scheme

;;; 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)