15 # The message queues live outside of python space, and must be formally cleaned!
18 print("Cleaning up message queues", queues)
19 print("Cleaning up processes", procs)
24 atexit.register(final)
27 def __init__(self, pin, maxlen=2, idle_state=False):
30 self._idle_state = idle_state
31 self._queue_key = random.randint(1, 9999)
33 self._mq = sysv_ipc.MessageQueue(None, flags=sysv_ipc.IPC_CREX)
35 print("Message Queue Key: ", self._mq.key)
36 queues.append(self._mq)
37 except sysv_ipc.ExistentialError:
38 raise RuntimeError("Message queue creation failed")
40 cmd = ["/home/pi/libgpiod_pulsein/src/libgpiod_pulsein",
41 "--pulses", str(maxlen),
42 "--queue", str(self._mq.key)]
45 cmd.append("gpiochip0")
50 self._process = subprocess.Popen(cmd)
51 procs.append(self._process)
53 # wait for it to start up
55 print("Waiting for startup success message from subprocess")
56 message = self._mq.receive(type=2)
57 if message[0] != b'!':
58 raise RuntimeError("Could not establish message queue with subprocess")
62 # Clean up after ourselves
63 self._process.terminate()
64 procs.remove(self._process)
66 queues.remove(self._mq)
71 def __exit__(self, exc_type, exc_value, tb):
74 def resume(self, trigger_duration=0):
75 if trigger_duration != 0:
76 self._mq.send("t%d" % trigger_duration, True, type=1)
78 self._mq.send("r", True, type=1)
81 self._mq.send("p", True, type=1)
84 self._mq.send("c", True, type=1)
87 self._mq.send("^", True, type=1)
88 message = self._mq.receive(type=2)
89 reply = int(message[0].decode('utf-8'))
95 self._mq.send("l", True, type=1)
96 message = self._mq.receive(type=2)
97 return int(message[0].decode('utf-8'))