summaryrefslogtreecommitdiff
path: root/host/mex
diff options
context:
space:
mode:
Diffstat (limited to 'host/mex')
-rw-r--r--host/mex/node.py28
-rw-r--r--host/mex/test/test.py7
2 files changed, 33 insertions, 2 deletions
diff --git a/host/mex/node.py b/host/mex/node.py
index 97ec0128..8fcf9ae0 100644
--- a/host/mex/node.py
+++ b/host/mex/node.py
@@ -26,6 +26,7 @@ import mex
from msg import Msg
import socket
from struct import pack, unpack, calcsize
+import bisect
class Node:
@@ -42,6 +43,7 @@ class Node:
self.__seq = 0
self.__req = None
self.__handlers = { }
+ self.__schedule_queue = [ ]
self.register (mex.DATE, lambda msg: self.__handle_DATE (msg))
self.register (mex.REQ, lambda msg: self.__handle_REQ (msg))
# Synchronise.
@@ -70,8 +72,12 @@ class Node:
return True
else:
idle = Msg (mex.IDLE)
- if self.__date_waited != None:
- idle.push ('L', self.__date_waited)
+ date_waited = self.__date_waited
+ if self.__schedule_queue and (date_waited is None
+ or self.__schedule_queue[0][0] < date_waited):
+ date_waited = self.__schedule_queue[0][0]
+ if date_waited != None:
+ idle.push ('L', date_waited)
self.send (idle)
def read (self):
@@ -116,6 +122,18 @@ class Node:
assert mtype not in self.__handlers
self.__handlers[mtype] = handler
+ def schedule (self, date, action):
+ """Schedule an action for the given date, return the event identifier."""
+ assert date > self.date
+ assert callable (action)
+ event = date, action
+ bisect.insort (self.__schedule_queue, event)
+ return event
+
+ def cancel (self, event):
+ """Cancel a scheduled event."""
+ self.__schedule_queue.remove (event)
+
def close (self):
"""Close connection with the Hub."""
self.__socket.close ()
@@ -143,6 +161,12 @@ class Node:
def __handle_DATE (self, msg):
"""Handle an incoming DATE."""
self.date, = msg.pop ('L')
+ # Run scheduled events.
+ while self.__schedule_queue \
+ and self.__schedule_queue[0][0] == self.date:
+ action = self.__schedule_queue[0][1]
+ del self.__schedule_queue[0]
+ action ()
def __handle_REQ (self, msg):
"""Handle an incoming REQ."""
diff --git a/host/mex/test/test.py b/host/mex/test/test.py
index 239d07b9..6332ecb8 100644
--- a/host/mex/test/test.py
+++ b/host/mex/test/test.py
@@ -43,6 +43,13 @@ def c1 ():
m.push ('B', nb)
n.response (m)
n.register (0x82, a)
+ def b ():
+ assert False
+ eb = n.schedule (31, b)
+ def c ():
+ print 'hello'
+ n.cancel (eb)
+ n.schedule (28, c)
m = Msg (0x81)
n.send (m)
n.wait ()