1
1
# All time related types and functions
2
2
3
- import Base: convert, isless, sleep, + , - , ==
3
+ import Base: convert, isless, sleep, + , - , * , ==
4
4
export Time, Duration, Rate, to_sec, to_nsec, get_rostime, rossleep
5
5
6
6
# Time type definitions
7
7
abstract TVal
8
8
9
- type Time <: TVal
9
+ immutable Time <: TVal
10
10
secs:: Int32
11
11
nsecs:: Int32
12
12
function Time (s:: Real ,n:: Real )
17
17
Time () = Time (0 ,0 )
18
18
Time (t:: Real ) = Time (t,0 )
19
19
20
- type Duration <: TVal
20
+ immutable Duration <: TVal
21
21
secs:: Int32
22
22
nsecs:: Int32
23
23
function Duration (s:: Real ,n:: Real )
50
50
- (t1:: Time , t2:: Duration ) = Time ( t1. secs- t2. secs, t1. nsecs- t2. nsecs)
51
51
- (t1:: Duration , t2:: Duration ) = Duration (t1. secs- t2. secs, t1. nsecs- t2. nsecs)
52
52
- (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)
53
55
54
56
# PyObject conversions
55
57
convert (:: Type{Time} , o:: PyObject ) = Time ( o[:secs ],o[:nsecs ])
@@ -66,28 +68,6 @@ convert{T<:TVal}(::Type{Float64}, t::T) = to_sec(t)
66
68
== {T<: TVal }(t1:: T , t2:: T ) = (t1. secs == t2. secs) && (t1. nsecs == t2. nsecs)
67
69
isless {T<:TVal} (t1:: T , t2:: T ) = to_nsec (t1) < to_nsec (t2)
68
70
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
-
91
71
function get_rostime ()
92
72
t = try
93
73
__rospy__[:get_rostime ]()
@@ -98,8 +78,36 @@ function get_rostime()
98
78
end
99
79
now () = get_rostime ()
100
80
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
+
104
91
sleep (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
105
113
sleep (t:: Rate ) = rossleep (t)
0 commit comments