@@ -67,22 +67,17 @@ def __init__(self, serial_id=2, baudrate=115200, **kwargs):
6767
6868 # method to manage and advertise topic
6969 # 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 ):
7171 """
7272 topic_name: eg. (Greet)
7373 msg: message object
7474 endpoint: corresponds to TopicInfo.msg typical topic id values
7575 """
7676 register = TopicInfo ()
77- register .topic_id = self . _id
77+ register .topic_id = _id
7878 register .topic_name = topic_name
7979 register .message_type = msg ._type
8080 register .md5sum = msg ._md5sum
81-
82- self .advertised_topics [topic_name ] = self ._id
83-
84- # id are summed by one
85- self ._id += 1
8681 register .buffer_size = buffer_size
8782
8883 # serialization
@@ -101,8 +96,12 @@ def _advertise_topic(self, topic_name, msg, endpoint, buffer_size):
10196 fpacket = header + _le (length ) + crclen + _le (endpoint ) + packet + crcpack
10297 self .uart .write (bytearray (fpacket ))
10398
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+
104103 def publish (self , topic_name , msg , buffer_size = 1024 ):
105- """[summary]
104+ """publishes messages to topics
106105
107106 Args:
108107 topic_name (string): name of destination topic in ROS network.
@@ -111,7 +110,10 @@ def publish(self, topic_name, msg, buffer_size=1024):
111110 """
112111
113112 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
115117
116118 # same as advertise
117119 packet = uio .StringIO ()
@@ -120,31 +122,33 @@ def publish(self, topic_name, msg, buffer_size=1024):
120122 packet = list (packet .getvalue ().encode ("utf-8" ))
121123 length = len (packet )
122124
123- topic_id = _le (self .advertised_topics .get (topic_name ))
125+ topic_id = _le (self .advertised_topics .get (topic_name )[ 0 ] )
124126 crclen = [checksum (_le (length ))]
125127 crcpack = [checksum (topic_id + packet )]
126128
127129 fpacket = header + _le (length ) + crclen + topic_id + packet + crcpack
128130 self .uart .write (bytearray (fpacket ))
129131
130- def subscribe (self , topic_name , msgobj , _cb , buffer_size = 1024 ):
132+ def subscribe (self , topic_name , msg , _cb , buffer_size = 1024 ):
131133 """subscribes to a topic receiving messages and processing them by a callback function
132134
133135 Args:
134136 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.
136138 cb (function): callback function to process incoming messages.
137139 buffer_size (int, optional): maximum size of buffer for message. Defaults to 1024.
138140 """
139141 assert _cb is not None , "Subscribe callback is not set"
140142
141143 # subscribing topic attributes are added
142- self .subscribing_topics [self ._id ] = [msgobj , _cb ]
144+ self .subscribing_topics [self ._id ] = [msg , _cb ]
143145
144146 # advertised if not already subscribed
145147 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
148152
149153 def _listen (self ):
150154 while True :
@@ -186,6 +190,8 @@ def _listen(self):
186190 callback (fdata )
187191 else :
188192 raise ValueError ("Message plus Topic ID Checksum is wrong!" )
193+ else :
194+ self ._advertise_all_topics ()
189195
190196 except (OSError , TypeError , ValueError ):
191197 logging .info ("No incoming data could be read for subscribes." )
0 commit comments