11# All time related types and functions
22
3- import Base: convert, isless, sleep, + , - , ==
3+ import Base: convert, isless, sleep, + , - , * , ==
44export Time, Duration, Rate, to_sec, to_nsec, get_rostime, rossleep
55
66# Time type definitions
77abstract TVal
88
9- type Time <: TVal
9+ immutable Time <: TVal
1010 secs:: Int32
1111 nsecs:: Int32
1212 function Time (s:: Real ,n:: Real )
1717Time () = Time (0 ,0 )
1818Time (t:: Real ) = Time (t,0 )
1919
20- type Duration <: TVal
20+ immutable Duration <: TVal
2121 secs:: Int32
2222 nsecs:: Int32
2323 function Duration (s:: Real ,n:: Real )
5050- (t1:: Time , t2:: Duration ) = Time ( t1. secs- t2. secs, t1. nsecs- t2. nsecs)
5151- (t1:: Duration , t2:: Duration ) = Duration (t1. secs- t2. secs, t1. nsecs- t2. nsecs)
5252- (t1:: Time , t2:: Time ) = Duration (t1. secs- t2. secs, t1. nsecs- t2. nsecs)
53+ * (td:: Duration , tf:: Real ) = Duration (tf* td. secs , tf* td. nsecs)
54+ * (tf:: Real , td:: Duration ) = Duration (tf* td. secs , tf* td. nsecs)
5355
5456# PyObject conversions
5557convert (:: Type{Time} , o:: PyObject ) = Time ( o[:secs ],o[:nsecs ])
@@ -66,28 +68,6 @@ convert{T<:TVal}(::Type{Float64}, t::T) = to_sec(t)
6668== {T<: TVal }(t1:: T , t2:: T ) = (t1. secs == t2. secs) && (t1. nsecs == t2. nsecs)
6769isless {T<:TVal} (t1:: T , t2:: T ) = to_nsec (t1) < to_nsec (t2)
6870
69- # ----------------------------
70- # Extra time-related utilities
71- # ----------------------------
72-
73- type Rate
74- o:: PyObject
75- end
76- Rate (hz:: Real ) = Rate (__rospy__[:Rate ](hz))
77- Rate (d:: Duration ) = Rate (1.0 / to_sec (d))
78-
79- type Timer
80- t:: PyObject
81- end
82-
83- type TimerEvent
84- last_expected:: Time
85- last_real:: Time
86- current_expected:: Time
87- current_real:: Time
88- last_duration:: Duration
89- end
90-
9171function get_rostime ()
9272 t = try
9373 __rospy__[:get_rostime ]()
@@ -98,8 +78,36 @@ function get_rostime()
9878end
9979now () = get_rostime ()
10080
101- rossleep (t:: Real ) = __rospy__[:sleep ](t)
102- rossleep (t:: Duration ) = __rospy__[:sleep ](convert (PyObject, t))
103- rossleep (r:: Rate ) = pycall (r. o[" sleep" ], PyAny)
81+ function rossleep (td:: Duration )
82+ tnsecs = to_nsec (td)
83+ t0 = time_ns ()
84+ while time_ns ()- t0 < tnsecs
85+ yield ()
86+ __rospy__[:sleep ](0.001 )
87+ end
88+ end
89+ rossleep (t:: Real ) = rossleep (Duration (t))
90+
10491sleep (t:: Duration ) = rossleep (t)
92+
93+ type Rate
94+ duration:: Duration
95+ last_time:: Time
96+ end
97+ Rate (d:: Duration ) = Rate (d, get_rostime ())
98+ Rate (hz:: Real ) = Rate (Duration (1.0 / hz), get_rostime ())
99+
100+ function rossleep (r:: Rate )
101+ ctime = get_rostime ()
102+ if r. last_time > ctime
103+ r. last_time = ctime
104+ end
105+ elapsed = ctime - r. last_time
106+ rossleep (r. duration - elapsed)
107+ r. last_time += r. duration
108+
109+ if ctime - r. last_time > r. duration* 2
110+ r. last_time = ctime
111+ end
112+ end
105113sleep (t:: Rate ) = rossleep (t)
0 commit comments