def test_subscriber_wait_for_message(self): """Ensures that `WaitForMessage` threading works in a Python workflow that is not threaded.""" # N.B. This will fail with `threading`. See below for using # `multithreading`. lcm = DrakeLcm("memq://") lcm.StartReceiveThread() sub = mut.LcmSubscriberSystem.Make("TEST_LOOP", header_t, lcm) value = AbstractValue.Make(header_t()) for i in range(3): message = header_t() message.utime = i lcm.Publish("TEST_LOOP", message.encode()) sub.WaitForMessage(i, value) self.assertEqual(value.get_value().utime, i)
def test_subscriber_wait_for_message(self): """Checks how `WaitForMessage` works without Python threads.""" lcm = DrakeLcm() sub = mut.LcmSubscriberSystem.Make("TEST_LOOP", header_t, lcm) value = AbstractValue.Make(header_t()) for old_message_count in range(3): message = header_t() message.utime = old_message_count + 1 lcm.Publish("TEST_LOOP", message.encode()) for attempt in range(10): new_count = sub.WaitForMessage( old_message_count, value, timeout=0.02) if new_count > old_message_count: break lcm.HandleSubscriptions(0) self.assertEqual(value.get_value().utime, old_message_count + 1)
def test_utime_to_seconds(self): msg = header_t() msg.utime = int(1e6) with catch_drake_warnings(expected_count=1): dut = mut.PyUtimeMessageToSeconds(header_t) t_sec = dut.GetTimeInSeconds(AbstractValue.Make(msg)) self.assertEqual(t_sec, 1)
def publish_loop(): # Publishes a set of messages for the driven loop. This should be # run from a separate process. # N.B. Because of this, care should be taken not to share C++ # objects between process boundaries. t = t_start while t <= t_end: message = header_t() message.utime = int(1e6 * t) lcm.Publish("TEST_LOOP", message.encode()) time.sleep(0.1) t += 1
def test_utime_to_seconds(self): msg = header_t() msg.utime = int(1e6) dut = mut.PyUtimeMessageToSeconds(header_t) t_sec = dut.GetTimeInSeconds(AbstractValue.Make(msg)) self.assertEqual(t_sec, 1)