Skip to content

Commit 01896c8

Browse files
committed
bug: topic negotiation
1 parent 36be8d4 commit 01896c8

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

src/uros/core.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)