Implemented parallel port support for Node.
[blynken.git] / node / node.py
blob3c828483e4320b359821ae0ec6d4313a49125ea5
1 #!/usr/bin/env python
2 import asyncore, socket
4 class Node(asyncore.dispatcher):
5 def __init__(self, host, coords, process=lambda self, val: None):
6 self.coords = coords
7 self.process = process
8 asyncore.dispatcher.__init__(self)
9 self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
10 self.socket.setblocking(1)
11 self.connect(host)
12 self.socket.setblocking(0)
14 def handle_connect(self):
15 self.send("%i:%i\r\n" % self.coords)
16 data = self.recv(4096)
17 if data != "okay\r\n":
18 raise RuntimeError
19 self.writable = lambda : False
21 def handle_read(self):
22 data = self.recv(4096)
23 if data == 'on\r\n':
24 self.process(True)
25 elif data == 'off\r\n':
26 self.process(False)
28 def handle_close(self):
29 pass
32 if __name__ == '__main__':
33 from sys import argv
35 host = ('', 10000)
36 nodes = []
38 try:
39 import parallel
40 from functools import partial
42 class MyParallel(parallel.Parallel):
43 _data = 0
45 def setData(self, data):
46 self._data = data
47 super(MyParallel, self).setData(data)
49 def setPin(self, pin, val):
50 self.setData((bool(val) << pin) | self._data)
52 port = MyParallel()
53 processor = lambda n: partial(port.setPin, n)
55 except ImportError, OSError:
56 import sys
57 print sys.exc_info()[1]
58 def processor(n):
59 def process(val):
60 print n, ': ', val
61 return process
63 if len(argv) > 1:
64 port = MyParallel(self)
65 for i in argv[1:]:
66 pin, _, xy = i.partition('=')
67 x, _, y = xy.partition(':')
68 nodes.append(Node(host, (int(x), int(y)), process=processor(pin)))
69 else:
70 for x in range(8):
71 for y in range(6):
72 nodes.append(Node(host, (x, y), process=processor(x + 8 * y)))
74 asyncore.loop()