diff --git a/secop/params.py b/secop/params.py index cd620fd..10ddf4d 100644 --- a/secop/params.py +++ b/secop/params.py @@ -139,9 +139,8 @@ class Parameter(Accessible): datatype.setProperty('unit', unit) super(Parameter, self).__init__(**kwds) - # note: auto-converts True/False to 1/0 which yield the expected - # behaviour... - self.properties['poll'] = int(self.poll) + if self.handler and not self.poll: + self.properties['poll'] = True if self.constant is not None: self.properties['readonly'] = True diff --git a/secop/poller.py b/secop/poller.py index 05f3a54..e1f49da 100644 --- a/secop/poller.py +++ b/secop/poller.py @@ -132,10 +132,11 @@ class Poller(PollerBase): self.startup_timeout = max(self.startup_timeout, module.startup_timeout) except AttributeError: pass + handlers = set() # at the beginning, queues are simple lists # later, they will be converted to heaps for pname, pobj in module.parameters.items(): - polltype = int(pobj.poll) + polltype = pobj.poll rfunc = getattr(module, 'read_' + pname, None) if not polltype or not rfunc: continue @@ -149,6 +150,13 @@ class Poller(PollerBase): polltype = REGULAR else: polltype = SLOW + if not polltype in factors: + raise ProgrammingError("unknown poll type %r for parameter '%s'" + % (polltype, pname)) + if pobj.handler: + if pobj.handler in handlers: + continue # only one poller per handler + handlers.add(pobj.handler) # placeholders 0 are used for due, lastdue and idx self.queues[polltype].append((0, 0, (0, module, pobj, rfunc, factors[polltype]))) diff --git a/test/test_poller.py b/test/test_poller.py index 07b0b5f..430e87b 100644 --- a/test/test_poller.py +++ b/test/test_poller.py @@ -87,6 +87,7 @@ class Parameter: self.readonly = readonly self.interval = interval self.timestamp = 0 + self.handler = None self.reset() def reset(self):