-
Notifications
You must be signed in to change notification settings - Fork 0
/
CBrickPorts.py
105 lines (87 loc) · 3.21 KB
/
CBrickPorts.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Standard library import.
import time
from threading import Thread
# Third-part library import.
import ev3dev.ev3 as ev3ev3
import ev3dev.core as ev3core
import ev3dev.brickpi as ev3bp
import ev3dev.helper as ev3h
# Project library import.
class CBrickPorts(Thread):
"""
Class for ports interface.
Public attributes:
ports = dictionnary of tupples of devices plugged in corresponding port, type of device.
quit = notify the thread to stop.
"""
# Private attributes.
# Public methods.
def __init__(self):
"""
Constructor.
@parameter : none.
@return : none.
"""
Thread.__init__(self)
self.ports = {"in1" : (None, None),
"in2" : (None, None),
"in3" : (None, None),
"in4" : (None, None),
"outA" : (None, None),
"outB" : (None, None),
"outC" : (None, None),
"outD" : (None, None),
}
self.quit = False
self.scan()
def __str__(self):
"""
When use print() on this class
@parameters : none.
@return : the string to print.
"""
ret = "Ports :\n"
ports = [p for p in self.ports.keys()]
ports.sort()
for port in ports:
if self.ports[port] :
ret += "\t{} => {} - Port : {} - driver name : {}\n".format(port,\
repr(self.ports[port]),\
self.ports[port].address,\
self.ports[port].driver_name)
else:
ret += "\t{} => None\n".format(port)
return ret
def run(self):
"""
Run the thread.
@parameter : none.
@return : none.
"""
while not self.quit:
self.scan()
time.sleep(0.5) # %CPU and running time are less than other methodes (e.g timer).
def scan(self):
"""
Scan for the divices plugged in the brick.
Discovered devices are registered in self.ports public attribute.
Have to be called before using any others cBrickMotors || cBrickSensors methodes.
@parameter : none.
@return : none.
"""
# The other way (reset self.ports, for d in devices: self.ports[d.address] = d) isn't faster.
# TODO : !!!! VOIR POUR OPTIMISATION PLUS PROFONDE !!!!
try:
# Never mind for this long line. Herad to read human ? Faster to process in the brick !
portsEnabledDevices = {device.address:device\
for device in\
[device for device in ev3core.list_motors()] +\
[device for device in ev3core.list_sensors()]}
for p in self.ports.keys():
self.ports[p] = (portsEnabledDevices[p], portsEnabledDevices[p].driver_name)\
if p in portsEnabledDevices.keys()\
else None
except:
pass
if __name__ == "__main__":
help(CBrickPorts)