-
Notifications
You must be signed in to change notification settings - Fork 1
/
lircradio.py
68 lines (56 loc) · 2.08 KB
/
lircradio.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
"""
LIRC interface to receive signals from a infrared remote control.
"""
import threading
import time
import queue
import lirc
class LircInterface(threading.Thread):
"""
This interfaces with the lirc daemon to read IR commands.
When using lirc in blocking mode, sometimes repeated commands get produced
in the next read of a command so we use a thread here to just wait
around until a non-empty response is obtained from lirc.
"""
def __init__(self, the_queue):
threading.Thread.__init__(self)
print("LircInterface init")
self.daemon = True
self.stopped = threading.Event()
self.the_queue = the_queue
lirc.init('pyqtradio', blocking=False)
def run(self):
"""Main loop of LIRC interface thread."""
print("LIRC interface thread started")
while not self.stopped.isSet():
try:
code = lirc.nextcode() # list; empty if no buttons pressed
except lirc.NextCodeError:
print("Error reading next code from LIRC")
code = None
# interpret result from python-lirc
if code:
code = code[0]
self.the_queue.put(code)
else:
time.sleep(0.2)
lirc.deinit()
print('LIRC interface thread stopped')
class LircHandler(object):
def __init__(self, the_queue):
print("LircHander started")
self.the_queue = the_queue
self.callbacks = []
def timerCall(self):
try:
receivedCommand = self.the_queue.get(block=False)
print("Lirc command from queue: " + receivedCommand)
for item in self.callbacks:
if item.get("command") == receivedCommand:
callback = item.get("callback")
callback()
except:
pass # nothng in queue
def addCallback(self, command, callback):
self.callbacks.append({"command":command,"callback":callback})
print("Added callback for command: " + command)