New GPIO for DHT11.
[hqdisplay.git] / wood7seg.py
1 #!/usr/bin/env python2
2
3 from RPi import GPIO
4 import time
5 import threading
6
7 class Wood7Seg(object):
8   digit = [['A', 'B', 'C', 'D', 'E', 'F'],
9            ['B', 'C'],
10            ['A', 'B', 'G', 'E', 'D'],
11            ['A', 'B', 'G', 'C', 'D'],
12            ['F', 'G', 'B', 'C'],
13            ['A', 'F', 'G', 'C', 'D'],
14            ['A', 'F', 'E', 'D', 'C', 'G'],
15            ['A', 'B', 'C'],
16            ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
17            ['G', 'F', 'A', 'B', 'C', 'D']
18           ]
19
20   pins = [7, 15, 11, 13]
21
22   seg_hour = {'D': 8,
23               'E': 10,
24               'F': 12,
25               'A': 16,
26               'B': 18,
27               'C': 22,
28               'G': 24,
29               'dot': 26
30              }
31
32   seg_min = {'A': 8,
33              'B': 10,
34              'C': 12,
35              'D': 16,
36              'E': 18,
37              'F': 22,
38              'G': 24,
39              'dot': 26
40             }
41
42   def __init__(self, pin):
43     self.pin = self.pins[pin]
44     self.seg = self.seg_min
45     self._value = None
46     self._dot = False
47     self._seg = None
48     if pin <= 1:
49       self.seg = self.seg_hour
50
51   def setup(self):
52     GPIO.setup(self.pin, GPIO.OUT)
53     GPIO.output(self.pin, GPIO.LOW)
54     for pin in self.seg.values():
55       GPIO.setup(pin, GPIO.OUT)
56       GPIO.output(pin, GPIO.HIGH)
57
58   def show(self):
59     for pin in self.pins:
60       GPIO.output(pin, GPIO.LOW)
61     GPIO.output(self.pin, GPIO.HIGH)
62     if self._value or self._value == 0:
63       for pin in self.digit[self._value]:
64         GPIO.output(self.seg[pin], GPIO.LOW)
65     if self._dot:
66       GPIO.output(self.seg['dot'], GPIO.LOW)
67     if self._seg:
68       GPIO.output(self.seg[self._seg], GPIO.LOW)
69
70   def reset(self):
71     for pin in self.seg.values():
72       GPIO.output(pin, GPIO.HIGH)
73
74   def setDigit(self, value):
75     self._value = value
76
77   def setSeg(self, value):
78     self._seg = value
79
80   def dot(self):
81     self._dot = not self._dot
82
83
84 class Woodi(threading.Thread):
85   def __init__(self, wait=0.003):
86     super(Woodi, self).__init__()
87     self._run = True
88     self.wait = wait
89     self.digit = []
90     GPIO.setmode(GPIO.BOARD)
91     for i in range(4):
92       self.digit.append(Wood7Seg(i))
93       self.digit[i].setup()
94
95   def set(self, value):
96     lead_zero = True
97     for i in range(4):
98       nvalue = int((value / (10 ** (3-i))) % 10)
99       if lead_zero:
100         if nvalue != 0:
101           lead_zero = False
102         elif i != 3:
103           nvalue = None
104       self.digit[i].setDigit(nvalue)
105
106   def run(self):
107     while self._run:
108       for element in self.digit:
109         element.reset()
110         element.show()
111         time.sleep(self.wait)
112
113   def dot(self):
114     self.digit[1].dot()
115     self.digit[2].dot()
116
117   def cleanup(self):
118     GPIO.cleanup()
119
120
121 if __name__ == '__main__':
122   import argparse
123   parser = argparse.ArgumentParser()
124   parser.add_argument('action')
125   args = parser.parse_args()
126   woodi = Woodi()
127   woodi.set(8888)
128   woodi.start()
129   try:
130     if args.action == 'clock':
131       from datetime import datetime
132       while True:
133         clock = datetime.utcnow()
134         showclock = int('%02d%02d' % (clock.hour, clock.minute))
135         woodi.set(showclock)
136         woodi.dot()
137         time.sleep(1)
138     elif args.action == 'cpu':
139       import psutil
140       while True:
141         woodi.set(psutil.cpu_percent(interval=1))
142     elif args.action == 'power':
143       while True:
144         with open('/dev/shm/power.log', 'r') as fh:
145           try:
146             woodi.set(int(fh.read().split('.')[0]))
147           except:
148             pass
149         time.sleep(1)
150     elif args.action == 'null':
151       while True:
152         woodi.set(000)
153         time.sleep(1)
154     else:
155       while True:
156         woodi.set(int(args.action))
157         time.sleep(1)
158   except KeyboardInterrupt:
159     print('aus')
160   except Exception as exc:
161     print(exc)
162   finally:
163     woodi._run = False
164     woodi.join()
165     woodi.cleanup()