diff --git a/server/Program.cs b/server/Program.cs index c40d13f..c101ece 100644 --- a/server/Program.cs +++ b/server/Program.cs @@ -1,3 +1,5 @@ +using System.Net; +using System.Net.Sockets; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.FileProviders; using Newtonsoft.Json; diff --git a/server/src/Controllers/UDPController.cs b/server/src/Controllers/UDPController.cs index 804ad5c..ac090a0 100644 --- a/server/src/Controllers/UDPController.cs +++ b/server/src/Controllers/UDPController.cs @@ -106,15 +106,15 @@ public class UDPController : ControllerBase } /// - /// 获取指定IP地址接受的数据列表 + /// 获取指定IP地址接收的数据列表 /// /// IP地址 [HttpGet("GetRecvDataArray")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] - public async ValueTask GetRecvDataArray(string address) + public async ValueTask GetRecvDataArray(string address, int taskID) { - var ret = await MsgBus.UDPServer.GetDataArrayAsync(address); + var ret = await MsgBus.UDPServer.GetDataArrayAsync(address, taskID); if (ret.HasValue) { diff --git a/server/src/JtagClient.cs b/server/src/JtagClient.cs index 9f39369..6773532 100644 --- a/server/src/JtagClient.cs +++ b/server/src/JtagClient.cs @@ -441,7 +441,7 @@ public class Jtag (UInt32 devAddr, UInt32 data, UInt32 result, UInt32 resultMask = 0xFF_FF_FF_FF, UInt32 delayMilliseconds = 0) { { - var ret = await UDPClientPool.WriteAddr(this.ep, devAddr, data, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, 0, devAddr, data, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Write FIFO failed")); } @@ -450,7 +450,7 @@ public class Jtag await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds)); { - var ret = await UDPClientPool.ReadAddrWithWait(this.ep, JtagAddr.STATE, result, resultMask, this.timeout); + var ret = await UDPClientPool.ReadAddrWithWait(this.ep, 0, JtagAddr.STATE, result, resultMask, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; } @@ -460,7 +460,7 @@ public class Jtag (UInt32 devAddr, byte[] data, UInt32 result, UInt32 resultMask = 0xFF_FF_FF_FF, UInt32 delayMilliseconds = 0) { { - var ret = await UDPClientPool.WriteAddr(this.ep, devAddr, data, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, 0, devAddr, data, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Write FIFO failed")); } @@ -469,7 +469,7 @@ public class Jtag await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds)); { - var ret = await UDPClientPool.ReadAddrWithWait(this.ep, JtagAddr.STATE, result, resultMask, this.timeout); + var ret = await UDPClientPool.ReadAddrWithWait(this.ep, 0, JtagAddr.STATE, result, resultMask, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; } @@ -627,9 +627,9 @@ public class Jtag public async ValueTask> ReadIDCode() { // Clear Data - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); - logger.Trace($"Clear up udp server {this.address} receive data"); + logger.Trace($"Clear up udp server {this.address,0} receive data"); Result ret; @@ -665,9 +665,9 @@ public class Jtag public async ValueTask> ReadStatusReg() { // Clear Data - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); - logger.Trace($"Clear up udp server {this.address} receive data"); + logger.Trace($"Clear up udp server {this.address,0} receive data"); Result ret; @@ -702,9 +702,9 @@ public class Jtag public async ValueTask> DownloadBitstream(byte[] bitstream) { // Clear Data - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); - logger.Trace($"Clear up udp server {this.address} receive data"); + logger.Trace($"Clear up udp server {this.address,0} receive data"); Result ret; @@ -786,9 +786,9 @@ public class Jtag logger.Debug($"Get boundar scan registers number: {portNum}"); // Clear Data - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); - logger.Trace($"Clear up udp server {this.address} receive data"); + logger.Trace($"Clear up udp server {this.address,0} receive data"); Result ret; @@ -853,9 +853,9 @@ public class Jtag public async ValueTask> SetSpeed(UInt32 speed) { // Clear Data - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); - logger.Trace($"Clear up udp server {this.address} receive data"); + logger.Trace($"Clear up udp server {this.address,0} receive data"); var ret = await WriteFIFO( JtagAddr.SPEED_CTRL, (speed << 16) | speed, diff --git a/server/src/Peripherals/DDSClient.cs b/server/src/Peripherals/DDSClient.cs index 55a9ebe..1dc4d68 100644 --- a/server/src/Peripherals/DDSClient.cs +++ b/server/src/Peripherals/DDSClient.cs @@ -108,11 +108,11 @@ public class DDS if (waveNum < 0 || waveNum > 3) return new(new ArgumentException( $"Wave number should be 0 ~ 3 instead of {waveNum}", nameof(waveNum))); - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 1); logger.Trace("Clear udp data finished"); var ret = await UDPClientPool.WriteAddr( - this.ep, DDSAddr.Channel[channelNum].WaveSelect, (UInt32)waveNum, this.timeout); + this.ep, 1, DDSAddr.Channel[channelNum].WaveSelect, (UInt32)waveNum, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; @@ -132,11 +132,11 @@ public class DDS if (waveNum < 0 || waveNum > 3) return new(new ArgumentException( $"Wave number should be 0 ~ 3 instead of {waveNum}", nameof(waveNum))); - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 1); logger.Trace("Clear udp data finished"); var ret = await UDPClientPool.WriteAddr( - this.ep, DDSAddr.Channel[channelNum].FreqCtrl[waveNum], step, this.timeout); + this.ep, 1, DDSAddr.Channel[channelNum].FreqCtrl[waveNum], step, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; @@ -158,11 +158,11 @@ public class DDS if (phase < 0 || phase > 4096) return new(new ArgumentException( $"Phase should be 0 ~ 4096 instead of {phase}", nameof(phase))); - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 1); logger.Trace("Clear udp data finished"); var ret = await UDPClientPool.WriteAddr( - this.ep, DDSAddr.Channel[channelNum].PhaseCtrl[waveNum], (UInt32)phase, this.timeout); + this.ep, 1, DDSAddr.Channel[channelNum].PhaseCtrl[waveNum], (UInt32)phase, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; diff --git a/server/src/Peripherals/MatrixKeyClient.cs b/server/src/Peripherals/MatrixKeyClient.cs index abd830f..99a035f 100644 --- a/server/src/Peripherals/MatrixKeyClient.cs +++ b/server/src/Peripherals/MatrixKeyClient.cs @@ -44,10 +44,10 @@ public class MatrixKey public async ValueTask> EnableControl() { if (MsgBus.IsRunning) - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 1); else return new(new Exception("Message Bus not work!")); - var ret = await UDPClientPool.WriteAddr(this.ep, MatrixKeyAddr.KEY_ENABLE, 1, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, 1, MatrixKeyAddr.KEY_ENABLE, 1, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; } @@ -59,10 +59,10 @@ public class MatrixKey public async ValueTask> DisableControl() { if (MsgBus.IsRunning) - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 1); else return new(new Exception("Message Bus not work!")); - var ret = await UDPClientPool.WriteAddr(this.ep, MatrixKeyAddr.KEY_ENABLE, 0, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, 1, MatrixKeyAddr.KEY_ENABLE, 0, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; } @@ -75,14 +75,14 @@ public class MatrixKey public async ValueTask> ControlKey(BitArray keyStates) { if (MsgBus.IsRunning) - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 1); else return new(new Exception("Message Bus not work!")); if (keyStates.Length != 16) return new(new ArgumentException( $"The number of key should be 16 instead of {keyStates.Length}", nameof(keyStates))); var ret = await UDPClientPool.WriteAddr( - this.ep, MatrixKeyAddr.KEY_CTRL, Common.Number.BitsToNumber(keyStates).Value, this.timeout); + this.ep, 1, MatrixKeyAddr.KEY_CTRL, Common.Number.BitsToNumber(keyStates).Value, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; } diff --git a/server/src/Peripherals/PowerClient.cs b/server/src/Peripherals/PowerClient.cs index 95b9ca1..d7d6aea 100644 --- a/server/src/Peripherals/PowerClient.cs +++ b/server/src/Peripherals/PowerClient.cs @@ -45,10 +45,10 @@ public class Power public async ValueTask> SetPowerOnOff(bool enable) { if (MsgBus.IsRunning) - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 1); else return new(new Exception("Message Bus not work!")); - var ret = await UDPClientPool.WriteAddr(this.ep, PowerAddr.PowerCtrl, Convert.ToUInt32(enable), this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, 1, PowerAddr.PowerCtrl, Convert.ToUInt32(enable), this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; } diff --git a/server/src/RemoteUpdateClient.cs b/server/src/RemoteUpdateClient.cs index df30246..88bbb9d 100644 --- a/server/src/RemoteUpdateClient.cs +++ b/server/src/RemoteUpdateClient.cs @@ -142,7 +142,7 @@ public class RemoteUpdater { var ret = await UDPClientPool.WriteAddr( - this.ep, RemoteUpdaterAddr.WriteCtrl, + this.ep, 0, RemoteUpdaterAddr.WriteCtrl, Convert.ToUInt32((writeSectorNum << 16) | (1 << 15) | Convert.ToInt32(flashAddr / 4096)), this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Enable write flash failed")); @@ -150,7 +150,7 @@ public class RemoteUpdater { var ret = await UDPClientPool.ReadAddrWithWait( - this.ep, RemoteUpdaterAddr.WriteSign, + this.ep, 0, RemoteUpdaterAddr.WriteSign, 0x00_00_00_01, 0x00_00_00_01, this.timeoutForWait); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception( @@ -158,14 +158,14 @@ public class RemoteUpdater } { - var ret = await UDPClientPool.WriteAddr(this.ep, RemoteUpdaterAddr.WriteFIFO, bytesData, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, 0, RemoteUpdaterAddr.WriteFIFO, bytesData, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Send data to flash failed")); } { var ret = await UDPClientPool.ReadAddrWithWait( - this.ep, RemoteUpdaterAddr.WriteSign, + this.ep, 0, RemoteUpdaterAddr.WriteSign, 0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; @@ -314,14 +314,14 @@ public class RemoteUpdater private async ValueTask> CheckBitstreamCRC(int bitstreamNum, int bitstreamLen, UInt32 checkSum) { { - var ret = await UDPClientPool.WriteAddr(this.ep, RemoteUpdaterAddr.ReadCtrl2, 0x00_00_00_00, this.timeout); + var ret = await UDPClientPool.WriteAddr(this.ep, 0, RemoteUpdaterAddr.ReadCtrl2, 0x00_00_00_00, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception("Write read control 2 failed")); } { var ret = await UDPClientPool.WriteAddr( - this.ep, RemoteUpdaterAddr.ReadCtrl1, + this.ep, 0, RemoteUpdaterAddr.ReadCtrl1, Convert.ToUInt32((bitstreamLen << 16) | (1 << 15) | Convert.ToInt32(FlashAddr.Bitstream[bitstreamNum] / 4096)), this.timeout); if (!ret.IsSuccessful) return new(ret.Error); @@ -330,7 +330,7 @@ public class RemoteUpdater { var ret = await UDPClientPool.ReadAddrWithWait( - this.ep, RemoteUpdaterAddr.ReadSign, + this.ep, 0, RemoteUpdaterAddr.ReadSign, 0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value) return new(new Exception( @@ -338,7 +338,7 @@ public class RemoteUpdater } { - var ret = await UDPClientPool.ReadAddr(this.ep, RemoteUpdaterAddr.ReadCRC, this.timeout); + var ret = await UDPClientPool.ReadAddr(this.ep, 0, RemoteUpdaterAddr.ReadCRC, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); var bytes = ret.Value.Options.Data; @@ -368,7 +368,7 @@ public class RemoteUpdater $"Bitsteam num should be 0 ~ 3 for HotRest, but given {bitstreamNum}", nameof(bitstreamNum))); var ret = await UDPClientPool.WriteAddr( - this.ep, RemoteUpdaterAddr.HotResetCtrl, + this.ep, 0, RemoteUpdaterAddr.HotResetCtrl, ((FlashAddr.Bitstream[bitstreamNum] << 8) | 1), this.timeout); if (!ret.IsSuccessful) return new(ret.Error); return ret.Value; @@ -381,7 +381,7 @@ public class RemoteUpdater /// [TODO:return] public async ValueTask> HotResetBitstream(int bitstreamNum) { - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); logger.Trace("Clear udp data finished"); { @@ -411,7 +411,7 @@ public class RemoteUpdater byte[]? bitstream2, byte[]? bitstream3) { - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); logger.Trace("Clear udp data finished"); for (int bitstreamNum = 0; bitstreamNum < 4; bitstreamNum++) @@ -462,7 +462,7 @@ public class RemoteUpdater $"The length of data should be divided by 4096, bug given {bytesData.Length}", nameof(bytesData))); var bitstreamBlockNum = bytesData.Length / (4 * 1024); - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); logger.Trace("Clear udp data finished"); { @@ -538,11 +538,11 @@ public class RemoteUpdater /// [TODO:return] public async ValueTask> GetVersion() { - await MsgBus.UDPServer.ClearUDPData(this.address); + await MsgBus.UDPServer.ClearUDPData(this.address, 0); logger.Trace("Clear udp data finished"); { - var ret = await UDPClientPool.ReadAddr(this.ep, RemoteUpdaterAddr.Version, this.timeout); + var ret = await UDPClientPool.ReadAddr(this.ep, 0, RemoteUpdaterAddr.Version, this.timeout); if (!ret.IsSuccessful) return new(ret.Error); var retData = ret.Value.Options.Data; diff --git a/server/src/UdpClientPool.cs b/server/src/UdpClientPool.cs index 3e129fa..d04f221 100644 --- a/server/src/UdpClientPool.cs +++ b/server/src/UdpClientPool.cs @@ -184,14 +184,14 @@ public class UDPClientPool /// [TODO:parameter] /// [TODO:return] public static async ValueTask> ReadAddr( - IPEndPoint endPoint, uint devAddr, int timeout = 1000) + IPEndPoint endPoint, int taskID, uint devAddr, int timeout = 1000) { var ret = false; var opts = new SendAddrPackOptions(); opts.BurstType = BurstType.FixedBurst; opts.BurstLength = 0; - opts.CommandID = 0; + opts.CommandID = Convert.ToByte(taskID); opts.Address = devAddr; // Read Jtag State Register @@ -204,7 +204,7 @@ public class UDPClientPool return new(new Exception("Message Bus not Working!")); var retPack = await MsgBus.UDPServer.WaitForDataAsync( - endPoint.Address.ToString(), endPoint.Port, timeout); + endPoint.Address.ToString(), taskID, endPoint.Port, timeout); if (!retPack.IsSuccessful) return new(retPack.Error); else if (!retPack.Value.IsSuccessful) return new(new Exception("Send address package failed")); @@ -226,11 +226,11 @@ public class UDPClientPool /// [TODO:parameter] /// [TODO:return] public static async ValueTask> ReadAddr( - IPEndPoint endPoint, uint devAddr, UInt32 result, UInt32 resultMask, int timeout = 1000) + IPEndPoint endPoint, int taskID, uint devAddr, UInt32 result, UInt32 resultMask, int timeout = 1000) { var address = endPoint.Address.ToString(); - var ret = await ReadAddr(endPoint, devAddr, timeout); + var ret = await ReadAddr(endPoint, taskID, devAddr, timeout); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value.IsSuccessful) return new(new Exception($"Read device {address} address {devAddr} failed")); @@ -264,7 +264,7 @@ public class UDPClientPool /// [TODO:parameter] /// [TODO:return] public static async ValueTask> ReadAddrWithWait( - IPEndPoint endPoint, uint devAddr, UInt32 result, UInt32 resultMask, int timeout = 1000) + IPEndPoint endPoint, int taskID, uint devAddr, UInt32 result, UInt32 resultMask, int timeout = 1000) { var address = endPoint.Address.ToString(); @@ -277,7 +277,7 @@ public class UDPClientPool try { - var ret = await ReadAddr(endPoint, devAddr, Convert.ToInt32(timeleft.TotalMilliseconds)); + var ret = await ReadAddr(endPoint, taskID, devAddr, Convert.ToInt32(timeleft.TotalMilliseconds)); if (!ret.IsSuccessful) return new(ret.Error); if (!ret.Value.IsSuccessful) return new(new Exception($"Read device {address} address {devAddr} failed")); @@ -312,14 +312,14 @@ public class UDPClientPool /// [TODO:parameter] /// [TODO:return] public static async ValueTask> WriteAddr( - IPEndPoint endPoint, UInt32 devAddr, UInt32 data, int timeout = 1000) + IPEndPoint endPoint, int taskID, UInt32 devAddr, UInt32 data, int timeout = 1000) { var ret = false; var opts = new SendAddrPackOptions(); opts.BurstType = BurstType.FixedBurst; opts.BurstLength = 0; - opts.CommandID = 0; + opts.CommandID = Convert.ToByte(taskID); opts.Address = devAddr; // Write Jtag State Register @@ -337,7 +337,7 @@ public class UDPClientPool // Wait for Write Ack var udpWriteAck = await MsgBus.UDPServer.WaitForAckAsync( - endPoint.Address.ToString(), endPoint.Port, timeout); + endPoint.Address.ToString(), taskID, endPoint.Port, timeout); if (!udpWriteAck.IsSuccessful) return new(udpWriteAck.Error); return udpWriteAck.Value.IsSuccessful; @@ -351,14 +351,15 @@ public class UDPClientPool /// [TODO:parameter] /// [TODO:parameter] /// [TODO:return] - public static async ValueTask> WriteAddr(IPEndPoint endPoint, UInt32 devAddr, byte[] dataArray, int timeout = 1000) + public static async ValueTask> WriteAddr( + IPEndPoint endPoint, int taskID, UInt32 devAddr, byte[] dataArray, int timeout = 1000) { var ret = false; var opts = new SendAddrPackOptions(); opts.BurstType = BurstType.FixedBurst; - opts.CommandID = 0; + opts.CommandID = Convert.ToByte(taskID); opts.Address = devAddr; // Check Msg Bus @@ -389,7 +390,7 @@ public class UDPClientPool if (!ret) return new(new Exception("Send data package failed!")); // Wait for Write Ack - var udpWriteAck = await MsgBus.UDPServer.WaitForAckAsync(endPoint.Address.ToString(), endPoint.Port, timeout); + var udpWriteAck = await MsgBus.UDPServer.WaitForAckAsync(endPoint.Address.ToString(), taskID, endPoint.Port, timeout); if (!udpWriteAck.IsSuccessful) return new(udpWriteAck.Error); if (!udpWriteAck.Value.IsSuccessful) diff --git a/server/src/UdpServer.cs b/server/src/UdpServer.cs index b9e933c..2de2feb 100644 --- a/server/src/UdpServer.cs +++ b/server/src/UdpServer.cs @@ -22,6 +22,11 @@ public class UDPData /// 发送来源的端口号 /// public required int Port { get; set; } + + /// + /// 任务ID + /// + public required int TaskID { get; set; } /// /// 接受到的数据 /// @@ -44,6 +49,7 @@ public class UDPData DateTime = this.DateTime, Address = new string(this.Address), Port = this.Port, + TaskID = this.TaskID, Data = cloneData, HasRead = this.HasRead }; @@ -119,6 +125,7 @@ public class UDPServer /// 异步寻找目标发送的内容 /// /// 目标IP地址 + /// [TODO:parameter] /// 超时时间 /// 延迟时间 /// 调用函数名称 @@ -129,13 +136,14 @@ public class UDPServer /// Optional 存在时,为最先收到的数据 /// public async ValueTask> FindDataAsync( - string ipAddr, int timeout = 1000, int cycle = 0, + string ipAddr, int taskID, int timeout = 1000, int cycle = 0, [CallerMemberName] string callerName = "", - [CallerLineNumber] int callerLineNum = 0) + [CallerLineNumber] int callerLineNum = 0 + ) { UDPData? data = null; - logger.Debug($"Caller \"{callerName}|{callerLineNum}\": Try to find {ipAddr} UDP Data"); + logger.Debug($"Caller \"{callerName}|{callerLineNum}\": Try to find {ipAddr}-{taskID} UDP Data"); var startTime = DateTime.Now; var isTimeout = false; @@ -149,8 +157,8 @@ public class UDPServer timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed; using (await udpData.AcquireWriteLockAsync(timeleft)) { - if (udpData.ContainsKey(ipAddr) && - udpData.TryGetValue(ipAddr, out var dataQueue) && + if (udpData.ContainsKey($"{ipAddr}-{taskID}") && + udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) && dataQueue.Count > 0) { data = dataQueue.Dequeue(); @@ -177,10 +185,11 @@ public class UDPServer /// 获取还未被读取的数据列表 /// /// IP地址 + /// [TODO:parameter] /// 超时时间 /// 延迟时间 /// 数据列表 - public async ValueTask>> GetDataArrayAsync(string ipAddr, int timeout = 1000, int cycle = 0) + public async ValueTask>> GetDataArrayAsync(string ipAddr, int taskID, int timeout = 1000, int cycle = 0) { List? data = null; @@ -196,8 +205,8 @@ public class UDPServer timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed; using (await udpData.AcquireReadLockAsync(timeleft)) { - if (udpData.ContainsKey(ipAddr) && - udpData.TryGetValue(ipAddr, out var dataQueue) && + if (udpData.ContainsKey($"{ipAddr}-{taskID}") && + udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) && dataQueue.Count > 0) { data = dataQueue.ToList(); @@ -226,9 +235,9 @@ public class UDPServer /// 超时时间范围 /// 接收响应包 public async ValueTask> WaitForAckAsync - (string address, int port = -1, int timeout = 1000) + (string address, int taskID, int port = -1, int timeout = 1000) { - var data = await FindDataAsync(address, timeout); + var data = await FindDataAsync(address, taskID, timeout); if (!data.HasValue) return new(new Exception("Get None even after time out!")); @@ -251,9 +260,9 @@ public class UDPServer /// 超时时间范围 /// 接收数据包 public async ValueTask> WaitForDataAsync - (string address, int port = -1, int timeout = 1000) + (string address, int taskID, int port = -1, int timeout = 1000) { - var data = await FindDataAsync(address, timeout); + var data = await FindDataAsync(address, taskID, timeout); if (!data.HasValue) return new(new Exception("Get None even after time out!")); @@ -284,7 +293,7 @@ public class UDPServer // Handle Package - var udpData = RecordUDPData(bytes, remoteEP); + var udpData = RecordUDPData(bytes, remoteEP, Convert.ToInt32(bytes[1])); PrintData(udpData); BEGIN_RECEIVE: @@ -308,7 +317,7 @@ public class UDPServer else { return false; } } - private UDPData RecordUDPData(byte[] bytes, IPEndPoint remoteEP) + private UDPData RecordUDPData(byte[] bytes, IPEndPoint remoteEP, int taskID) { var remoteAddress = remoteEP.Address.ToString(); var remotePort = remoteEP.Port; @@ -316,6 +325,7 @@ public class UDPServer { Address = remoteAddress, Port = remotePort, + TaskID = taskID, Data = bytes, DateTime = DateTime.Now, HasRead = false, @@ -324,7 +334,7 @@ public class UDPServer using (udpData.AcquireWriteLock()) { // Record UDP Receive Data - if (udpData.ContainsKey(remoteAddress) && udpData.TryGetValue(remoteAddress, out var dataQueue)) + if (udpData.ContainsKey($"{remoteAddress}-{taskID}") && udpData.TryGetValue(remoteAddress, out var dataQueue)) { dataQueue.Enqueue(data); logger.Trace("Receive data from old client"); @@ -333,7 +343,7 @@ public class UDPServer { var queue = new Queue(); queue.Enqueue(data); - udpData.Add(remoteAddress, queue); + udpData.Add($"{remoteAddress}-{taskID}", queue); logger.Trace("Receive data from new client"); } } @@ -410,12 +420,12 @@ public class UDPServer /// /// IP地址 /// - public async Task ClearUDPData(string ipAddr) + public async Task ClearUDPData(string ipAddr, int taskID) { using (await udpData.AcquireWriteLockAsync()) { - if (udpData.ContainsKey(ipAddr) && - udpData.TryGetValue(ipAddr, out var dataQueue) && + if (udpData.ContainsKey($"{ipAddr}-{taskID}") && + udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) && dataQueue.Count > 0) { dataQueue.Clear(); diff --git a/src/components/equipments/DDSPropertyEditor.vue b/src/components/equipments/DDSPropertyEditor.vue index d53923c..f173e9b 100644 --- a/src/components/equipments/DDSPropertyEditor.vue +++ b/src/components/equipments/DDSPropertyEditor.vue @@ -408,7 +408,7 @@ async function applyOutputWave() { eqps.boardPort, 0, currentWaveformIndex.value, - toInteger(frequency.value * Math.pow(2, 32 - 20)), + toInteger((frequency.value * Math.pow(2, 32 - 20)) / 10), ); if (!ret) { dialog.error("应用失败");