From d1fb2c0887fd2b84a6ef2a8681330c4880c4f6a2 Mon Sep 17 00:00:00 2001 From: php Date: Tue, 22 Oct 2024 16:11:05 -0500 Subject: [PATCH] Ensure the PTT state is set to on when sending USRP; Add a timeout to send a end of transmission to USRP when DVM is done transmitting --- dvmusrp/Network.DVM.cs | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/dvmusrp/Network.DVM.cs b/dvmusrp/Network.DVM.cs index c9a2444..d8ea8ee 100644 --- a/dvmusrp/Network.DVM.cs +++ b/dvmusrp/Network.DVM.cs @@ -22,6 +22,9 @@ namespace dvmusrp public class NetworkDVM : Network { private NetworkUSRP usrpNetwork; + private DateTime lastPacketReceivedTime; + private TimeSpan callTimeout = TimeSpan.FromSeconds(1); + private bool eotSent = false; /// /// Creates an instance of @@ -30,7 +33,10 @@ namespace dvmusrp /// /// /// - public NetworkDVM(int receivePort, int sendPort, string receiveAddress, string sendAddress) : base(receivePort, sendPort, receiveAddress, sendAddress) { } + public NetworkDVM(int receivePort, int sendPort, string receiveAddress, string sendAddress) : base(receivePort, sendPort, receiveAddress, sendAddress) + { + lastPacketReceivedTime = DateTime.Now; + } /// /// Helper to set the instance of @@ -54,9 +60,26 @@ namespace dvmusrp { try { - var receivedResult = await udpClient.ReceiveAsync(); + Task receivedTask = udpClient.ReceiveAsync(); + Task timeoutTask = Task.Delay(callTimeout); + + Task completedTask = await Task.WhenAny(receivedTask, timeoutTask); + + if (completedTask == timeoutTask) + { + if (!eotSent) + { + SendUsrpEOT(); + eotSent = true; + } + continue; + } - ForwardToUSRP(receivedResult.Buffer); + eotSent = false; + + lastPacketReceivedTime = DateTime.Now; + + ForwardToUSRP(receivedTask.Result.Buffer); } catch (Exception ex) { @@ -91,6 +114,8 @@ namespace dvmusrp Array.Copy(packet, 4, audio, 0, audio.Length); // No meta data, just skip PCM length } + usrpHeader[15] = 1; // Set PTT state to on + Array.Copy(Encoding.ASCII.GetBytes("USRP"), usrpHeader, 4); Array.Copy(usrpHeader, usrpData, usrpHeader.Length); Array.Copy(audio, 0, usrpData, 32, audio.Length); @@ -100,6 +125,17 @@ namespace dvmusrp usrpNetwork.SendData(usrpData); } + /// + /// Helper to send a EOT to USRP + /// + public void SendUsrpEOT() + { + byte[] usrpHeader = new byte[32]; + Array.Copy(Encoding.ASCII.GetBytes("USRP"), usrpHeader, 4); + + usrpNetwork.SendData(usrpHeader); + } + /// /// Helper to send data to DVM ///