owned this note
owned this note
Published
Linked with GitHub
Incomplete untested version
```
import board
import digitalio
import dbus
# current button state
buttonPressed = False
# Init Button and LED
led = digitalio.DigitalInOut(board.C0)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.C1)
button.direction = digitalio.Direction.INPUT
# Init systemd
# https://www.freedesktop.org/software/systemd/man/org.freedesktop.systemd1.html
# https://stackoverflow.com/questions/33646374/starting-a-systemd-service-via-python
sysbus = dbus.SystemBus()
systemd1 = sysbus.get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1')
manager = dbus.Interface(systemd1, 'org.freedesktop.systemd1.Manager')
def startService(serviceName):
job = manager.StartUnit(serviceName, 'fail')
print(checkState(serviceName))
# Set LED state
def stopService(serviceName):
job = manager.StopUnit(serviceName, 'fail')
# Set LED state
# https://stackoverflow.com/questions/43499880/how-to-extract-service-state-via-systemd-dbus-api
def checkState(serviceName):
interface = dbus.Interface(sysbus.get_object('org.freedesktop.systemd1', serviceName), 'org.freedesktop.systemd1.Unit')
return interface.Get('org.freedesktop.systemd1.Unit', 'ActiveState')
while True:
if button.value == True: # if pressed the push_button
if buttonPressed == False:
startService("serviceName")
else:
stopService("serviceName")
```
Working with polling of current systemd status
```
mport dbus
import subprocess
import time
import board
import digitalio
from queue import Queue
from threading import Thread
RECORDER_SERVICE = "recorder.service"
# Init systemd
# https://www.freedesktop.org/software/systemd/man/org.freedesktop.systemd1.html
# https://stackoverflow.com/questions/33646374/starting-a-systemd-service-via-python
sysbus = dbus.SystemBus()
systemd1 = sysbus.get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1')
manager = dbus.Interface(systemd1, 'org.freedesktop.systemd1.Manager')
# Init LED
led = digitalio.DigitalInOut(board.C0)
led.direction = digitalio.Direction.OUTPUT
def startService(serviceName):
manager.StartUnit(serviceName, 'fail')
def stopService(serviceName):
manager.StopUnit(serviceName, 'fail')
def checkState(serviceName):
while True:
stat = subprocess.call(["systemctl", "is-active", "--quiet", serviceName])
if stat == 0:
print("Recording")
led.value = True
else:
print("Recording Stopped")
led.value = False
time.sleep(2)
# Init Thread
t1 = Thread(target = checkState, args =(RECORDER_SERVICE, ))
t1.start()
# Testing
startService(RECORDER_SERVICE)
time.sleep(5)
stopService(RECORDER_SERVICE)
```
Added button case
```
mport dbus
import subprocess
import time
import board
import digitalio
from queue import Queue
from threading import Thread
RECORDER_SERVICE = "recorder.service"
# Init systemd
# https://www.freedesktop.org/software/systemd/man/org.freedesktop.systemd1.html
# https://stackoverflow.com/questions/33646374/starting-a-systemd-service-via-python
sysbus = dbus.SystemBus()
systemd1 = sysbus.get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1')
manager = dbus.Interface(systemd1, 'org.freedesktop.systemd1.Manager')
# Init LED and Button
led = digitalio.DigitalInOut(board.C0)
led.direction = digitalio.Direction.OUTPUT
button = digitalio.DigitalInOut(board.C1)
button.direction = digitalio.Direction.INPUT
def startService(serviceName):
manager.StartUnit(serviceName, 'fail')
def stopService(serviceName):
manager.StopUnit(serviceName, 'fail')
def checkState(out_q, serviceName):
while True:
stat = subprocess.call(["systemctl", "is-active", "--quiet", serviceName])
out_q.put(stat)
if stat == 0:
print("Recording")
led.value = True
else:
print("Recording Stopped")
led.value = False
time.sleep(2)
# Init Thread
q = Queue()
t1 = Thread(target = checkState, args =(q, RECORDER_SERVICE, ))
t1.start()
# Testing
#startService(RECORDER_SERVICE)
#time.sleep(5)
#stopService(RECORDER_SERVICE)
while True:
if button.value == 5:
if q.get() == 0:
#Stopping Service
stopService(RECORDER_SERVICE)
else:
# Starting Service
```