summaryrefslogtreecommitdiff
path: root/digital/io-hub/tools/io_hub/mex.py
diff options
context:
space:
mode:
Diffstat (limited to 'digital/io-hub/tools/io_hub/mex.py')
-rw-r--r--digital/io-hub/tools/io_hub/mex.py106
1 files changed, 101 insertions, 5 deletions
diff --git a/digital/io-hub/tools/io_hub/mex.py b/digital/io-hub/tools/io_hub/mex.py
index 7c8c0012..9b72ccde 100644
--- a/digital/io-hub/tools/io_hub/mex.py
+++ b/digital/io-hub/tools/io_hub/mex.py
@@ -31,7 +31,7 @@ ADC_NB = 8
PWM_NB = 6
PWM_VALUE_MAX = 1024
-CONTACT_NB = 4
+CONTACT_NB = 10
CONTACT_INIT = 0xffffffff
class Mex:
@@ -44,9 +44,21 @@ class Mex:
"""
- def __init__ (self):
+ def __init__ (self, node, instance, index):
Observable.__init__ (self)
- self.value = None
+ self.value = 0
+ self.__node = node
+ self.__mtype = node.reserve (instance + ':adc')
+ self.__index = index
+ self.register (self.__notified)
+
+ def __notified (self):
+ m = simu.mex.msg.Msg (self.__mtype)
+ v = int (1024 * self.value / 5)
+ v = min (v, 1023)
+ v = max (0, v)
+ m.push ('BH', self.__index, v)
+ self.__node.send (m)
class PWM (Observable):
"""PWM output.
@@ -109,11 +121,95 @@ class Mex:
m.push ('L', self.contacts)
self.node.send (m)
+ class Codebar (Observable):
+ """Codebar stub.
+
+ - element_type: 'queen', 'king', or anything else.
+
+ """
+
+ def __init__ (self, pack, index):
+ Observable.__init__ (self)
+ self.pack = pack
+ self.index = index
+ self.element_type = None
+ self.register (self.__notified)
+
+ def __notified (self):
+ self.pack.set (self.index, self.element_type)
+
+ class Pack:
+ """Handle emission of several codebar for one message."""
+
+ def __init__ (self, node, instance):
+ self.node = node
+ self.codebars = [0, 0]
+ self.mtype = node.reserve (instance + ':codebar')
+
+ def set (self, index, element_type):
+ if element_type == 'queen':
+ self.codebars[index] = 4
+ elif element_type == 'king':
+ self.codebars[index] = 8
+ else:
+ self.codebars[index] = 0
+ self.__send ()
+
+ def __send (self):
+ m = simu.mex.msg.Msg (self.mtype)
+ for c in self.codebars:
+ m.push ('b', c)
+ self.node.send (m)
+
+ class Path (Observable):
+ """Path finding algorithm report.
+
+ - path: sequence of (x, y) coordinates (millimeters).
+
+ """
+
+ def __init__ (self, node, instance):
+ Observable.__init__ (self)
+ self.path = [ ]
+ node.register (instance + ':path', self.__handle)
+
+ def __handle (self, msg):
+ self.path = [ ]
+ while len (msg) >= 4:
+ self.path.append (msg.pop ('hh'))
+ self.notify ()
+
+ class PosReport (Observable):
+ """General purpose position report.
+
+ - pos: dict of sequence of (x, y) coordinates (millimeters). The dict
+ is indexed by position identifier.
+
+ """
+
+ def __init__ (self, node, instance):
+ Observable.__init__ (self)
+ self.pos = { }
+ node.register (instance + ':pos-report', self.__handle)
+
+ def __handle (self, msg):
+ p = [ ]
+ id, = msg.pop ('b')
+ while len (msg) >= 4:
+ p.append (msg.pop ('hh'))
+ self.pos[id] = p
+ self.notify ()
+
def __init__ (self, node, instance = 'io-hub0'):
- self.adc = tuple (self.ADC () for i in range (0, ADC_NB))
+ self.adc = tuple (self.ADC (node, instance, i) for i in range (0, ADC_NB))
self.pwm = tuple (self.PWM () for i in range (0, PWM_NB))
- self.__adc_pwm = self.PWM.Pack (node, instance, self.pwm)
+ self.__pwm_pack = self.PWM.Pack (node, instance, self.pwm)
self.__contact_pack = self.Contact.Pack (node, instance)
self.contact = tuple (self.Contact (self.__contact_pack, i)
for i in range (CONTACT_NB))
+ self.__codebar_pack = self.Codebar.Pack (node, instance)
+ self.codebar = tuple (self.Codebar (self.__codebar_pack, i)
+ for i in (0, 1))
+ self.path = self.Path (node, instance)
+ self.pos_report = self.PosReport (node, instance)