From cadfb47e3c346e74b1d2c270b0a350dfe28456e6 Mon Sep 17 00:00:00 2001 From: Eric Gallimore <egallimore@whoi.edu> Date: Mon, 1 Mar 2021 16:28:21 -0500 Subject: [PATCH 1/3] Set default ping timeout in ping_modem service. --- src/acomms_driver_node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/acomms_driver_node.py b/src/acomms_driver_node.py index ee53041c..2d324e7d 100755 --- a/src/acomms_driver_node.py +++ b/src/acomms_driver_node.py @@ -83,7 +83,7 @@ class AcommsDriverNode(object): def handle_ping_modem(self, request): self.um.send_fdp_ping(request.dest) if request.reply_timeout <= 0: - request.reply_timeout = None + request.reply_timeout = 5 travel_time, snr_in, snr_out = self.um.wait_for_fdp_ping_reply(request.dest, include_cst=True, timeout=request.reply_timeout) if not travel_time: travel_time = -1 -- GitLab From 6dfd0adf6c517c621ea7bf26456c30983189e975 Mon Sep 17 00:00:00 2001 From: Eric Gallimore <egallimore@whoi.edu> Date: Sat, 13 Mar 2021 19:07:52 -0500 Subject: [PATCH 2/3] Updated Packet message to match FDP definition. May break other packages that use Packet message. Updated TDMA node to use new definition. Publishes ReceivedPackets on FDP RX now (not legacy). --- msg/Packet.msg | 8 ++++---- src/acomms_driver_node.py | 36 ++++++++++++++++++++++++++++++++---- src/tdma_node.py | 6 +++--- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/msg/Packet.msg b/msg/Packet.msg index 035b590f..1914ffa3 100644 --- a/msg/Packet.msg +++ b/msg/Packet.msg @@ -1,6 +1,6 @@ int16 src int16 dest -int8 minipacket_rate -int8 packet_rate -KeyInt64Value[] header_data -uint8[] payload_data \ No newline at end of file +int8 miniframe_rate +int8 dataframe_rate +uint8[] miniframe_bytes +uint8[] dataframe_bytes \ No newline at end of file diff --git a/src/acomms_driver_node.py b/src/acomms_driver_node.py index 2d324e7d..bc74db9b 100755 --- a/src/acomms_driver_node.py +++ b/src/acomms_driver_node.py @@ -1,14 +1,18 @@ #!/usr/bin/env python3 from __future__ import unicode_literals +from queue import Queue +from threading import Thread + from acomms.unifiedlog import UnifiedLog from acomms.micromodem import Micromodem from acomms.modem_connections import UdpConnection from acomms.flexibledataprotocol import FDPacket import logging import rospy +from std_msgs.msg import Header from dynamic_reconfigure.server import Server as DynamicReconfigureServer -from ros_acomms.msg import CST +from ros_acomms.msg import CST, ReceivedPacket, Packet from ros_acomms.srv import PingModem, PingModemResponse from ros_acomms.srv import QueueTxPacket, QueueTxPacketResponse from ros_acomms.srv import TxInhibit, TxInhibitResponse @@ -29,6 +33,7 @@ def convert_datetime_to_rospy(time_stamp): class AcommsDriverNode(object): def __init__(self): self.cst_publisher = rospy.Publisher('cst', CST, queue_size=10) + self.packet_rx_publisher = rospy.Publisher('packet_rx', ReceivedPacket, queue_size=10) rospy.init_node('acomms_driver') modem_connection_type = rospy.get_param('~modem_connection_type', 'serial') @@ -61,7 +66,6 @@ class AcommsDriverNode(object): # Wait here until we can talk to the modem - if set_modem_time: self.um.set_time() @@ -72,6 +76,8 @@ class AcommsDriverNode(object): self.um.get_config_param("TOP") # self.um.rxframe_listeners.append(self.on_modem_rxframe) + self.modem_rx_thread = Thread(target=self.modem_rx_handler, daemon=True) + self.modem_rx_thread.start() self.ping_modem_service = rospy.Service('ping_modem', PingModem, self.handle_ping_modem) self.queue_tx_packet_service = rospy.Service('queue_tx_packet', QueueTxPacket, self.handle_queue_tx_packet) @@ -80,6 +86,28 @@ class AcommsDriverNode(object): self.reconfigure_server = DynamicReconfigureServer(acomms_driverConfig, self.reconfigure) + def modem_rx_handler(self): + incoming_fd_packet_queue = Queue() + self.um.incoming_fdp_queues.append(incoming_fd_packet_queue) + while True: + try: + incoming_packet: FDPacket = incoming_fd_packet_queue.get(block=True) + # publish it + packet_msg = Packet(src=incoming_packet.src, dest=incoming_packet.dest, + miniframe_rate=incoming_packet.miniframe_rate, + dataframe_rate=incoming_packet.dataframe_rate, + miniframe_bytes=incoming_packet.minibytes, + dataframe_bytes=incoming_packet.databytes) + cst_values = incoming_packet.cyclestats + cst_msg = CST(**cst_values) + + hdr = Header(stamp=rospy.get_rostime()) + rx_packet_msg = ReceivedPacket(header=hdr, packet=packet_msg, cst=cst_msg) + self.packet_rx_publisher.publish(rx_packet_msg) + + except Exception as e: + rospy.logerr_throttle(1, "Error in packet RX handler: {}".format(e)) + def handle_ping_modem(self, request): self.um.send_fdp_ping(request.dest) if request.reply_timeout <= 0: @@ -150,14 +178,14 @@ class AcommsDriverNode(object): rospy.loginfo('Sending message via acomms') if self.use_legacy_packets: - self.um.send_packet_data(packet.dest, packet.payload_data, rate_num=packet.packet_rate, ack=False) + self.um.send_packet_data(packet.dest, packet.frame_data, rate_num=packet.packet_rate, ack=False) else: ack = 0 header_data = 0 self.um.send_fdpacket(FDPacket(packet.src, packet.dest, miniframerate=1, dataframerate=packet.packet_rate, ack=ack, - minibytes=None, databytes=packet.payload_data)) + minibytes=packet.miniframe_data, databytes=packet.frame_data)) def process_outgoing_queue(self): try: diff --git a/src/tdma_node.py b/src/tdma_node.py index 074ffbef..06abcd45 100755 --- a/src/tdma_node.py +++ b/src/tdma_node.py @@ -134,10 +134,10 @@ class TdmaMacNode(object): rospy.loginfo("Queuing Packet for TX") queue_packet = Packet() - queue_packet.packet_rate = 1 - queue_packet.minipacket_rate = 1 + queue_packet.dataframe_rate = 1 + queue_packet.miniframe_rate = 1 queue_packet.dest = bytes_response.dest - queue_packet.payload_data = bytes_response.payload_bytes + queue_packet.dataframe_bytes = bytes_response.payload_bytes req = QueueTxPacketRequest(insert_at_head=False, packet=queue_packet) -- GitLab From bf4141a1ab9a4e723e77c985860e6b981838b82c Mon Sep 17 00:00:00 2001 From: Eric Gallimore <egallimore@whoi.edu> Date: Sat, 13 Mar 2021 19:08:57 -0500 Subject: [PATCH 3/3] Pause in the acomms driver node init until we can talk to the modem (get a response to a $CCCFQ,SRC). --- src/acomms_driver_node.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/acomms_driver_node.py b/src/acomms_driver_node.py index bc74db9b..9e89adad 100755 --- a/src/acomms_driver_node.py +++ b/src/acomms_driver_node.py @@ -65,6 +65,10 @@ class AcommsDriverNode(object): remote_port=modem_remote_port, local_port=modem_local_port) # Wait here until we can talk to the modem + while True: + # This returns None if we time out. Repeat until we get a reply. + if self.um.get_config("SRC", response_timeout=1): + break if set_modem_time: self.um.set_time() -- GitLab