@@ -67,22 +67,17 @@ def __init__(self, serial_id=2, baudrate=115200, **kwargs):
67
67
68
68
# method to manage and advertise topic
69
69
# before publishing or subscribing
70
- def _advertise_topic (self , topic_name , msg , endpoint , buffer_size ):
70
+ def _advertise_topic (self , topic_name , _id , msg , endpoint , buffer_size ):
71
71
"""
72
72
topic_name: eg. (Greet)
73
73
msg: message object
74
74
endpoint: corresponds to TopicInfo.msg typical topic id values
75
75
"""
76
76
register = TopicInfo ()
77
- register .topic_id = self . _id
77
+ register .topic_id = _id
78
78
register .topic_name = topic_name
79
79
register .message_type = msg ._type
80
80
register .md5sum = msg ._md5sum
81
-
82
- self .advertised_topics [topic_name ] = self ._id
83
-
84
- # id are summed by one
85
- self ._id += 1
86
81
register .buffer_size = buffer_size
87
82
88
83
# serialization
@@ -101,8 +96,12 @@ def _advertise_topic(self, topic_name, msg, endpoint, buffer_size):
101
96
fpacket = header + _le (length ) + crclen + _le (endpoint ) + packet + crcpack
102
97
self .uart .write (bytearray (fpacket ))
103
98
99
+ def _advertise_all_topics (self ):
100
+ for key , value in self .advertised_topics :
101
+ self ._advertise_topic (key , value [0 ], value [1 ], value [2 ], value [3 ])
102
+
104
103
def publish (self , topic_name , msg , buffer_size = 1024 ):
105
- """[summary]
104
+ """publishes messages to topics
106
105
107
106
Args:
108
107
topic_name (string): name of destination topic in ROS network.
@@ -111,7 +110,10 @@ def publish(self, topic_name, msg, buffer_size=1024):
111
110
"""
112
111
113
112
if topic_name not in self .advertised_topics :
114
- self ._advertise_topic (topic_name , msg , 0 , buffer_size )
113
+ self .advertised_topics [topic_name ] = [self ._id , msg , 0 , buffer_size ]
114
+ # id are summed by one
115
+ self ._advertise_topic (topic_name , self ._id , msg , 0 , buffer_size )
116
+ self ._id += 1
115
117
116
118
# same as advertise
117
119
packet = uio .StringIO ()
@@ -120,31 +122,33 @@ def publish(self, topic_name, msg, buffer_size=1024):
120
122
packet = list (packet .getvalue ().encode ("utf-8" ))
121
123
length = len (packet )
122
124
123
- topic_id = _le (self .advertised_topics .get (topic_name ))
125
+ topic_id = _le (self .advertised_topics .get (topic_name )[ 0 ] )
124
126
crclen = [checksum (_le (length ))]
125
127
crcpack = [checksum (topic_id + packet )]
126
128
127
129
fpacket = header + _le (length ) + crclen + topic_id + packet + crcpack
128
130
self .uart .write (bytearray (fpacket ))
129
131
130
- def subscribe (self , topic_name , msgobj , _cb , buffer_size = 1024 ):
132
+ def subscribe (self , topic_name , msg , _cb , buffer_size = 1024 ):
131
133
"""subscribes to a topic receiving messages and processing them by a callback function
132
134
133
135
Args:
134
136
topic_name (string): name of destiny topic to send messages.
135
- msgobj (ROS message): custom message object generated by ugenpy.
137
+ msg (ROS message): custom message object generated by ugenpy.
136
138
cb (function): callback function to process incoming messages.
137
139
buffer_size (int, optional): maximum size of buffer for message. Defaults to 1024.
138
140
"""
139
141
assert _cb is not None , "Subscribe callback is not set"
140
142
141
143
# subscribing topic attributes are added
142
- self .subscribing_topics [self ._id ] = [msgobj , _cb ]
144
+ self .subscribing_topics [self ._id ] = [msg , _cb ]
143
145
144
146
# advertised if not already subscribed
145
147
if topic_name not in self .advertised_topics :
146
- msg = msgobj ()
147
- self ._advertise_topic (topic_name , msg , 1 , buffer_size )
148
+ self .advertised_topics [topic_name ] = [self ._id , msg , 1 , buffer_size ]
149
+ # id are summed by one
150
+ self ._advertise_topic (topic_name , self ._id , msg , 1 , buffer_size )
151
+ self ._id += 1
148
152
149
153
def _listen (self ):
150
154
while True :
@@ -186,6 +190,8 @@ def _listen(self):
186
190
callback (fdata )
187
191
else :
188
192
raise ValueError ("Message plus Topic ID Checksum is wrong!" )
193
+ else :
194
+ self ._advertise_all_topics ()
189
195
190
196
except (OSError , TypeError , ValueError ):
191
197
logging .info ("No incoming data could be read for subscribes." )
0 commit comments