Go to the documentation of this file.00001
00002
00003
00004
00005 import sys
00006 import os
00007 core_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'core')
00008 sys.path.append(core_path)
00009 import teer as core
00010 import threading
00011 import rospy
00012
00013
00014
00015
00016 class Scheduler(core.Scheduler):
00017 """ A scheduler supporting multi-threading access and ROS time """
00018 def __init__(self):
00019 super(Scheduler, self).__init__()
00020 self.wake_cond = threading.Condition()
00021 self.running = True
00022 self.in_timer_count = 0
00023 def stop_run():
00024 self.wake_cond.acquire()
00025 self.running = False
00026 self.wake_cond.notify()
00027 self.wake_cond.release()
00028 rospy.on_shutdown(stop_run)
00029
00030
00031
00032 def current_time(self):
00033 return rospy.Time.now().to_sec()
00034
00035
00036
00037 def run(self):
00038 self.wake_cond.acquire()
00039 self.step()
00040 while not rospy.is_shutdown() and self.running and ((self.in_timer_count != 0) or self.cond_waiting or self.ready):
00041 self.wake_cond.wait()
00042 self.step()
00043
00044
00045
00046 def _sleep(self, duration):
00047 rospy.sleep(duration)
00048
00049 def _set_timer_callback(self, t, f):
00050 def timer_callback(event):
00051 self.wake_cond.acquire()
00052 self.in_timer_count -= 1
00053 f()
00054 self.wake_cond.notify()
00055 self.wake_cond.release()
00056 self.in_timer_count += 1
00057 rospy.Timer(rospy.Duration(t - self.current_time()), timer_callback, True)
00058
00059
00060
00061
00062 class ConditionVariable(core.ConditionVariable):
00063 """ A conditional variable working with ROS' Scheduler """
00064 def __init__(self, initval=None):
00065 super(ConditionVariable, self).__init__(initval)
00066 def __get__(self, obj, objtype):
00067 return self.val
00068 def __set__(self, obj, val):
00069 obj.wake_cond.acquire()
00070 self.val = val
00071 self._set_name(type(obj))
00072 obj._test_conditions(self.myname)
00073 obj.wake_cond.notify()
00074 obj.wake_cond.release()
00075
00076
00077
00078
00079
00080 Task = core.Task
00081 Rate = core.Rate
00082 Pass = core.Pass
00083 GetScheduler = core.GetScheduler
00084 WaitTask = core.WaitTask
00085 WaitAllTasks = core.WaitAllTasks
00086 WaitAnyTasks = core.WaitAnyTasks
00087 WaitDuration = core.WaitDuration
00088 WaitCondition = core.WaitCondition
00089 Sleep = core.Sleep