From 5d0f1389b35b5d440cc67e43d9e7911dad7f219a Mon Sep 17 00:00:00 2001 From: Bdale Garbee Date: Thu, 24 Jul 2025 16:54:49 -0600 Subject: [PATCH] add power button watcher as a systemd service to trigger shutdown when pressed --- debian/powerbutton.service | 9 ++++++++ debian/quantimotor.install | 1 + power-button,py | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 debian/powerbutton.service create mode 100755 power-button,py diff --git a/debian/powerbutton.service b/debian/powerbutton.service new file mode 100644 index 0000000..cbfeb9d --- /dev/null +++ b/debian/powerbutton.service @@ -0,0 +1,9 @@ +[Unit] +Description=Power Button Watcher + +[Service] +Type=simple +ExecStart=/usr/share/quantimotor/power-button.py + +[Install] +WantedBy=multi-user.target diff --git a/debian/quantimotor.install b/debian/quantimotor.install index 2fc4fd1..969e9fb 100644 --- a/debian/quantimotor.install +++ b/debian/quantimotor.install @@ -1,6 +1,7 @@ ui/* usr/share/quantimotor/ui bcm2837-rpi-zero-2-w.dtb usr/share/quantimotor enable_ads.py usr/share/quantimotor +power-button,py usr/share/quantimotor power-off.py usr/lib/systemd/system-shutdown quantimotor.conf etc/modules-load.d raspi-extra-cmdline etc/default diff --git a/power-button,py b/power-button,py new file mode 100755 index 0000000..584e0ac --- /dev/null +++ b/power-button,py @@ -0,0 +1,43 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# +# Power button watcher to initiate system shutdown +# Copyright (C) 2025 Bdale Garbee +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import gpiod +import os + +from gpiod.line import Edge + +def watch_line_falling(chip_path, line_offset): + with gpiod.request_lines( + chip_path, + consumer="watch-line-falling", + config={line_offset: gpiod.LineSettings(edge_detection=Edge.FALLING)}, + ) as request: + while True: + # Blocks until at least one event is available + for event in request.read_edge_events(): + print( + "line: {} type: Rising event #{}".format( + event.line_offset, event.line_seqno + ) + ) + os.system("shutdown -h now") + +if __name__ == "__main__": + watch_line_falling("/dev/gpiochip0", 4) -- 2.47.2