Skip to content

Instantly share code, notes, and snippets.

@Lifelovinglight
Last active February 13, 2020 16:36
Show Gist options
  • Save Lifelovinglight/8b45b5c056aaca4711abf3a46c6bb77f to your computer and use it in GitHub Desktop.
Save Lifelovinglight/8b45b5c056aaca4711abf3a46c6bb77f to your computer and use it in GitHub Desktop.
Battery monitoring script.
;;; Battery monitoring daemon script.
(require-extension shell)
(require-extension 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment