7cc15d6cf0ce5c98f44ca356ff0ca00398005624
[saartuer.git] / tuerd
1 #!/usr/bin/python3
2 import time, socket, os, stat
3 from datetime import datetime
4 import RPi.GPIO as GPIO
5 GPIO.setmode(GPIO.BOARD)
6
7 def log (what):
8         print (datetime.now(),what)
9
10 def waynesend (conn, what):
11         try:
12                 conn.send(what)
13         except:
14                 log("Couldn't send %s" % str(what))
15
16 class Pinoutput:
17         # actionsanddelays is a list of pairs: (bool to send, delay in seconds to wait afterwards)
18         def __init__ (self, name, pinnumber, actionsanddelays):
19                 self.name = name
20                 self.pin = pinnumber
21                 self.todo = actionsanddelays
22                 GPIO.setup(pinnumber, GPIO.OUT)
23                 log ("Pin %d set to be an output pin for %s." % (pinnumber,name))
24         
25         def __call__ (self, conn):
26                 for (value,delay) in self.todo:
27                         GPIO.output(self.pin, value)
28                         log ("%s: Pin %d set to %s." % (self.name,self.pin,str(value)))
29                         time.sleep(delay)
30                 waynesend(conn,b"1")
31
32 tuergroupid = 1005
33
34 pinlist = [Pinoutput("open", 12, [(True, 0.3), (False, 5.0)]),
35         Pinoutput("close", 16, [(True, 0.3), (False, 5.0)]),
36         Pinoutput("buzz", 22, [(True, 2.0), (False, 5.0)])]
37
38 socketname = "/run/tuer.sock"
39
40
41 def doNothing (conn):
42         log ("doing nothing")
43         waynesend(conn,b"0")
44         pass
45
46 sock = socket.socket (socket.AF_UNIX, socket.SOCK_STREAM)
47
48 try:
49         os.unlink (socketname)
50 except OSError:
51         pass
52
53 sock.bind (socketname)
54
55 os.chown (socketname, 0, tuergroupid)
56 os.chmod (socketname, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP)
57
58 sock.listen(1)
59
60 pindict = {}
61 for pin in pinlist:
62         pindict[pin.name.encode()] = pin
63
64 while True:
65         conn, addr = sock.accept()
66         data = conn.recv (128)
67         log("received command: %s" % str(data))
68         pindict.get(data,doNothing)(conn)
69         conn.close()
70
71 GPIO.cleanup()
72
73