Merge branch 'master' of ssh://git.swordlost.top:222/SikongJueluo/FPGA_WebLab

This commit is contained in:
alivender 2025-05-20 20:09:42 +08:00
commit 2eabb79d0f
10 changed files with 91 additions and 78 deletions

View File

@ -1,3 +1,5 @@
using System.Net;
using System.Net.Sockets;
using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders;
using Newtonsoft.Json; using Newtonsoft.Json;

View File

@ -106,15 +106,15 @@ public class UDPController : ControllerBase
} }
/// <summary> /// <summary>
/// 获取指定IP地址接的数据列表 /// 获取指定IP地址接的数据列表
/// </summary> /// </summary>
/// <param name="address">IP地址</param> /// <param name="address">IP地址</param>
[HttpGet("GetRecvDataArray")] [HttpGet("GetRecvDataArray")]
[ProducesResponseType(typeof(List<UDPData>), StatusCodes.Status200OK)] [ProducesResponseType(typeof(List<UDPData>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async ValueTask<IResult> GetRecvDataArray(string address) public async ValueTask<IResult> GetRecvDataArray(string address, int taskID)
{ {
var ret = await MsgBus.UDPServer.GetDataArrayAsync(address); var ret = await MsgBus.UDPServer.GetDataArrayAsync(address, taskID);
if (ret.HasValue) if (ret.HasValue)
{ {

View File

@ -441,7 +441,7 @@ public class Jtag
(UInt32 devAddr, UInt32 data, UInt32 result, UInt32 resultMask = 0xFF_FF_FF_FF, UInt32 delayMilliseconds = 0) (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.IsSuccessful) return new(ret.Error);
if (!ret.Value) return new(new Exception("Write FIFO failed")); if (!ret.Value) return new(new Exception("Write FIFO failed"));
} }
@ -450,7 +450,7 @@ public class Jtag
await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds)); 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); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; 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) (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.IsSuccessful) return new(ret.Error);
if (!ret.Value) return new(new Exception("Write FIFO failed")); if (!ret.Value) return new(new Exception("Write FIFO failed"));
} }
@ -469,7 +469,7 @@ public class Jtag
await Task.Delay(TimeSpan.FromMilliseconds(delayMilliseconds)); 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); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; return ret.Value;
} }
@ -627,9 +627,9 @@ public class Jtag
public async ValueTask<Result<uint>> ReadIDCode() public async ValueTask<Result<uint>> ReadIDCode()
{ {
// Clear Data // 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<bool> ret; Result<bool> ret;
@ -665,9 +665,9 @@ public class Jtag
public async ValueTask<Result<uint>> ReadStatusReg() public async ValueTask<Result<uint>> ReadStatusReg()
{ {
// Clear Data // 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<bool> ret; Result<bool> ret;
@ -702,9 +702,9 @@ public class Jtag
public async ValueTask<Result<bool>> DownloadBitstream(byte[] bitstream) public async ValueTask<Result<bool>> DownloadBitstream(byte[] bitstream)
{ {
// Clear Data // 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<bool> ret; Result<bool> ret;
@ -786,9 +786,9 @@ public class Jtag
logger.Debug($"Get boundar scan registers number: {portNum}"); logger.Debug($"Get boundar scan registers number: {portNum}");
// Clear Data // 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<bool> ret; Result<bool> ret;
@ -853,9 +853,9 @@ public class Jtag
public async ValueTask<Result<bool>> SetSpeed(UInt32 speed) public async ValueTask<Result<bool>> SetSpeed(UInt32 speed)
{ {
// Clear Data // 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( var ret = await WriteFIFO(
JtagAddr.SPEED_CTRL, (speed << 16) | speed, JtagAddr.SPEED_CTRL, (speed << 16) | speed,

View File

@ -108,11 +108,11 @@ public class DDS
if (waveNum < 0 || waveNum > 3) return new(new ArgumentException( if (waveNum < 0 || waveNum > 3) return new(new ArgumentException(
$"Wave number should be 0 ~ 3 instead of {waveNum}", nameof(waveNum))); $"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"); logger.Trace("Clear udp data finished");
var ret = await UDPClientPool.WriteAddr( 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) if (!ret.IsSuccessful)
return new(ret.Error); return new(ret.Error);
return ret.Value; return ret.Value;
@ -132,11 +132,11 @@ public class DDS
if (waveNum < 0 || waveNum > 3) return new(new ArgumentException( if (waveNum < 0 || waveNum > 3) return new(new ArgumentException(
$"Wave number should be 0 ~ 3 instead of {waveNum}", nameof(waveNum))); $"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"); logger.Trace("Clear udp data finished");
var ret = await UDPClientPool.WriteAddr( 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) if (!ret.IsSuccessful)
return new(ret.Error); return new(ret.Error);
return ret.Value; return ret.Value;
@ -158,11 +158,11 @@ public class DDS
if (phase < 0 || phase > 4096) return new(new ArgumentException( if (phase < 0 || phase > 4096) return new(new ArgumentException(
$"Phase should be 0 ~ 4096 instead of {phase}", nameof(phase))); $"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"); logger.Trace("Clear udp data finished");
var ret = await UDPClientPool.WriteAddr( 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) if (!ret.IsSuccessful)
return new(ret.Error); return new(ret.Error);
return ret.Value; return ret.Value;

View File

@ -44,10 +44,10 @@ public class MatrixKey
public async ValueTask<Result<bool>> EnableControl() public async ValueTask<Result<bool>> EnableControl()
{ {
if (MsgBus.IsRunning) 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!")); 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); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; return ret.Value;
} }
@ -59,10 +59,10 @@ public class MatrixKey
public async ValueTask<Result<bool>> DisableControl() public async ValueTask<Result<bool>> DisableControl()
{ {
if (MsgBus.IsRunning) 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!")); 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); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; return ret.Value;
} }
@ -75,14 +75,14 @@ public class MatrixKey
public async ValueTask<Result<bool>> ControlKey(BitArray keyStates) public async ValueTask<Result<bool>> ControlKey(BitArray keyStates)
{ {
if (MsgBus.IsRunning) 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!")); else return new(new Exception("Message Bus not work!"));
if (keyStates.Length != 16) return new(new ArgumentException( if (keyStates.Length != 16) return new(new ArgumentException(
$"The number of key should be 16 instead of {keyStates.Length}", nameof(keyStates))); $"The number of key should be 16 instead of {keyStates.Length}", nameof(keyStates)));
var ret = await UDPClientPool.WriteAddr( 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); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; return ret.Value;
} }

View File

@ -45,10 +45,10 @@ public class Power
public async ValueTask<Result<bool>> SetPowerOnOff(bool enable) public async ValueTask<Result<bool>> SetPowerOnOff(bool enable)
{ {
if (MsgBus.IsRunning) 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!")); 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); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; return ret.Value;
} }

View File

@ -142,7 +142,7 @@ public class RemoteUpdater
{ {
var ret = await UDPClientPool.WriteAddr( 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); Convert.ToUInt32((writeSectorNum << 16) | (1 << 15) | Convert.ToInt32(flashAddr / 4096)), this.timeout);
if (!ret.IsSuccessful) return new(ret.Error); if (!ret.IsSuccessful) return new(ret.Error);
if (!ret.Value) return new(new Exception("Enable write flash failed")); if (!ret.Value) return new(new Exception("Enable write flash failed"));
@ -150,7 +150,7 @@ public class RemoteUpdater
{ {
var ret = await UDPClientPool.ReadAddrWithWait( var ret = await UDPClientPool.ReadAddrWithWait(
this.ep, RemoteUpdaterAddr.WriteSign, this.ep, 0, RemoteUpdaterAddr.WriteSign,
0x00_00_00_01, 0x00_00_00_01, this.timeoutForWait); 0x00_00_00_01, 0x00_00_00_01, this.timeoutForWait);
if (!ret.IsSuccessful) return new(ret.Error); if (!ret.IsSuccessful) return new(ret.Error);
if (!ret.Value) return new(new Exception( 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.IsSuccessful) return new(ret.Error);
if (!ret.Value) return new(new Exception("Send data to flash failed")); if (!ret.Value) return new(new Exception("Send data to flash failed"));
} }
{ {
var ret = await UDPClientPool.ReadAddrWithWait( var ret = await UDPClientPool.ReadAddrWithWait(
this.ep, RemoteUpdaterAddr.WriteSign, this.ep, 0, RemoteUpdaterAddr.WriteSign,
0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait); 0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait);
if (!ret.IsSuccessful) return new(ret.Error); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; return ret.Value;
@ -314,14 +314,14 @@ public class RemoteUpdater
private async ValueTask<Result<bool>> CheckBitstreamCRC(int bitstreamNum, int bitstreamLen, UInt32 checkSum) private async ValueTask<Result<bool>> 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.IsSuccessful) return new(ret.Error);
if (!ret.Value) return new(new Exception("Write read control 2 failed")); if (!ret.Value) return new(new Exception("Write read control 2 failed"));
} }
{ {
var ret = await UDPClientPool.WriteAddr( 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)), Convert.ToUInt32((bitstreamLen << 16) | (1 << 15) | Convert.ToInt32(FlashAddr.Bitstream[bitstreamNum] / 4096)),
this.timeout); this.timeout);
if (!ret.IsSuccessful) return new(ret.Error); if (!ret.IsSuccessful) return new(ret.Error);
@ -330,7 +330,7 @@ public class RemoteUpdater
{ {
var ret = await UDPClientPool.ReadAddrWithWait( var ret = await UDPClientPool.ReadAddrWithWait(
this.ep, RemoteUpdaterAddr.ReadSign, this.ep, 0, RemoteUpdaterAddr.ReadSign,
0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait); 0x00_00_01_00, 0x00_00_01_00, this.timeoutForWait);
if (!ret.IsSuccessful) return new(ret.Error); if (!ret.IsSuccessful) return new(ret.Error);
if (!ret.Value) return new(new Exception( 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); if (!ret.IsSuccessful) return new(ret.Error);
var bytes = ret.Value.Options.Data; 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))); $"Bitsteam num should be 0 ~ 3 for HotRest, but given {bitstreamNum}", nameof(bitstreamNum)));
var ret = await UDPClientPool.WriteAddr( var ret = await UDPClientPool.WriteAddr(
this.ep, RemoteUpdaterAddr.HotResetCtrl, this.ep, 0, RemoteUpdaterAddr.HotResetCtrl,
((FlashAddr.Bitstream[bitstreamNum] << 8) | 1), this.timeout); ((FlashAddr.Bitstream[bitstreamNum] << 8) | 1), this.timeout);
if (!ret.IsSuccessful) return new(ret.Error); if (!ret.IsSuccessful) return new(ret.Error);
return ret.Value; return ret.Value;
@ -381,7 +381,7 @@ public class RemoteUpdater
/// <returns>[TODO:return]</returns> /// <returns>[TODO:return]</returns>
public async ValueTask<Result<bool>> HotResetBitstream(int bitstreamNum) public async ValueTask<Result<bool>> HotResetBitstream(int bitstreamNum)
{ {
await MsgBus.UDPServer.ClearUDPData(this.address); await MsgBus.UDPServer.ClearUDPData(this.address, 0);
logger.Trace("Clear udp data finished"); logger.Trace("Clear udp data finished");
{ {
@ -411,7 +411,7 @@ public class RemoteUpdater
byte[]? bitstream2, byte[]? bitstream2,
byte[]? bitstream3) byte[]? bitstream3)
{ {
await MsgBus.UDPServer.ClearUDPData(this.address); await MsgBus.UDPServer.ClearUDPData(this.address, 0);
logger.Trace("Clear udp data finished"); logger.Trace("Clear udp data finished");
for (int bitstreamNum = 0; bitstreamNum < 4; bitstreamNum++) 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))); $"The length of data should be divided by 4096, bug given {bytesData.Length}", nameof(bytesData)));
var bitstreamBlockNum = bytesData.Length / (4 * 1024); 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"); logger.Trace("Clear udp data finished");
{ {
@ -538,11 +538,11 @@ public class RemoteUpdater
/// <returns>[TODO:return]</returns> /// <returns>[TODO:return]</returns>
public async ValueTask<Result<UInt32>> GetVersion() public async ValueTask<Result<UInt32>> GetVersion()
{ {
await MsgBus.UDPServer.ClearUDPData(this.address); await MsgBus.UDPServer.ClearUDPData(this.address, 0);
logger.Trace("Clear udp data finished"); 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); if (!ret.IsSuccessful) return new(ret.Error);
var retData = ret.Value.Options.Data; var retData = ret.Value.Options.Data;

View File

@ -184,14 +184,14 @@ public class UDPClientPool
/// <param name="timeout">[TODO:parameter]</param> /// <param name="timeout">[TODO:parameter]</param>
/// <returns>[TODO:return]</returns> /// <returns>[TODO:return]</returns>
public static async ValueTask<Result<RecvDataPackage>> ReadAddr( public static async ValueTask<Result<RecvDataPackage>> ReadAddr(
IPEndPoint endPoint, uint devAddr, int timeout = 1000) IPEndPoint endPoint, int taskID, uint devAddr, int timeout = 1000)
{ {
var ret = false; var ret = false;
var opts = new SendAddrPackOptions(); var opts = new SendAddrPackOptions();
opts.BurstType = BurstType.FixedBurst; opts.BurstType = BurstType.FixedBurst;
opts.BurstLength = 0; opts.BurstLength = 0;
opts.CommandID = 0; opts.CommandID = Convert.ToByte(taskID);
opts.Address = devAddr; opts.Address = devAddr;
// Read Jtag State Register // Read Jtag State Register
@ -204,7 +204,7 @@ public class UDPClientPool
return new(new Exception("Message Bus not Working!")); return new(new Exception("Message Bus not Working!"));
var retPack = await MsgBus.UDPServer.WaitForDataAsync( 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); if (!retPack.IsSuccessful) return new(retPack.Error);
else if (!retPack.Value.IsSuccessful) else if (!retPack.Value.IsSuccessful)
return new(new Exception("Send address package failed")); return new(new Exception("Send address package failed"));
@ -226,11 +226,11 @@ public class UDPClientPool
/// <param name="timeout">[TODO:parameter]</param> /// <param name="timeout">[TODO:parameter]</param>
/// <returns>[TODO:return]</returns> /// <returns>[TODO:return]</returns>
public static async ValueTask<Result<bool>> ReadAddr( public static async ValueTask<Result<bool>> 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 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.IsSuccessful) return new(ret.Error);
if (!ret.Value.IsSuccessful) if (!ret.Value.IsSuccessful)
return new(new Exception($"Read device {address} address {devAddr} failed")); return new(new Exception($"Read device {address} address {devAddr} failed"));
@ -264,7 +264,7 @@ public class UDPClientPool
/// <param name="timeout">[TODO:parameter]</param> /// <param name="timeout">[TODO:parameter]</param>
/// <returns>[TODO:return]</returns> /// <returns>[TODO:return]</returns>
public static async ValueTask<Result<bool>> ReadAddrWithWait( public static async ValueTask<Result<bool>> 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(); var address = endPoint.Address.ToString();
@ -277,7 +277,7 @@ public class UDPClientPool
try 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.IsSuccessful) return new(ret.Error);
if (!ret.Value.IsSuccessful) if (!ret.Value.IsSuccessful)
return new(new Exception($"Read device {address} address {devAddr} failed")); return new(new Exception($"Read device {address} address {devAddr} failed"));
@ -312,14 +312,14 @@ public class UDPClientPool
/// <param name="timeout">[TODO:parameter]</param> /// <param name="timeout">[TODO:parameter]</param>
/// <returns>[TODO:return]</returns> /// <returns>[TODO:return]</returns>
public static async ValueTask<Result<bool>> WriteAddr( public static async ValueTask<Result<bool>> 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 ret = false;
var opts = new SendAddrPackOptions(); var opts = new SendAddrPackOptions();
opts.BurstType = BurstType.FixedBurst; opts.BurstType = BurstType.FixedBurst;
opts.BurstLength = 0; opts.BurstLength = 0;
opts.CommandID = 0; opts.CommandID = Convert.ToByte(taskID);
opts.Address = devAddr; opts.Address = devAddr;
// Write Jtag State Register // Write Jtag State Register
@ -337,7 +337,7 @@ public class UDPClientPool
// Wait for Write Ack // Wait for Write Ack
var udpWriteAck = await MsgBus.UDPServer.WaitForAckAsync( 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); if (!udpWriteAck.IsSuccessful) return new(udpWriteAck.Error);
return udpWriteAck.Value.IsSuccessful; return udpWriteAck.Value.IsSuccessful;
@ -351,14 +351,15 @@ public class UDPClientPool
/// <param name="dataArray">[TODO:parameter]</param> /// <param name="dataArray">[TODO:parameter]</param>
/// <param name="timeout">[TODO:parameter]</param> /// <param name="timeout">[TODO:parameter]</param>
/// <returns>[TODO:return]</returns> /// <returns>[TODO:return]</returns>
public static async ValueTask<Result<bool>> WriteAddr(IPEndPoint endPoint, UInt32 devAddr, byte[] dataArray, int timeout = 1000) public static async ValueTask<Result<bool>> WriteAddr(
IPEndPoint endPoint, int taskID, UInt32 devAddr, byte[] dataArray, int timeout = 1000)
{ {
var ret = false; var ret = false;
var opts = new SendAddrPackOptions(); var opts = new SendAddrPackOptions();
opts.BurstType = BurstType.FixedBurst; opts.BurstType = BurstType.FixedBurst;
opts.CommandID = 0; opts.CommandID = Convert.ToByte(taskID);
opts.Address = devAddr; opts.Address = devAddr;
// Check Msg Bus // Check Msg Bus
@ -389,7 +390,7 @@ public class UDPClientPool
if (!ret) return new(new Exception("Send data package failed!")); if (!ret) return new(new Exception("Send data package failed!"));
// Wait for Write Ack // 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.IsSuccessful) return new(udpWriteAck.Error);
if (!udpWriteAck.Value.IsSuccessful) if (!udpWriteAck.Value.IsSuccessful)

View File

@ -22,6 +22,11 @@ public class UDPData
/// 发送来源的端口号 /// 发送来源的端口号
/// </summary> /// </summary>
public required int Port { get; set; } public required int Port { get; set; }
/// <summary>
/// 任务ID
/// </summary>
public required int TaskID { get; set; }
/// <summary> /// <summary>
/// 接受到的数据 /// 接受到的数据
/// </summary> /// </summary>
@ -44,6 +49,7 @@ public class UDPData
DateTime = this.DateTime, DateTime = this.DateTime,
Address = new string(this.Address), Address = new string(this.Address),
Port = this.Port, Port = this.Port,
TaskID = this.TaskID,
Data = cloneData, Data = cloneData,
HasRead = this.HasRead HasRead = this.HasRead
}; };
@ -119,6 +125,7 @@ public class UDPServer
/// 异步寻找目标发送的内容 /// 异步寻找目标发送的内容
/// </summary> /// </summary>
/// <param name="ipAddr"> 目标IP地址 </param> /// <param name="ipAddr"> 目标IP地址 </param>
/// <param name="taskID">[TODO:parameter]</param>
/// <param name="timeout">超时时间</param> /// <param name="timeout">超时时间</param>
/// <param name="cycle">延迟时间</param> /// <param name="cycle">延迟时间</param>
/// <param name="callerName">调用函数名称</param> /// <param name="callerName">调用函数名称</param>
@ -129,13 +136,14 @@ public class UDPServer
/// Optional 存在时,为最先收到的数据 /// Optional 存在时,为最先收到的数据
/// </returns> /// </returns>
public async ValueTask<Optional<UDPData>> FindDataAsync( public async ValueTask<Optional<UDPData>> FindDataAsync(
string ipAddr, int timeout = 1000, int cycle = 0, string ipAddr, int taskID, int timeout = 1000, int cycle = 0,
[CallerMemberName] string callerName = "", [CallerMemberName] string callerName = "",
[CallerLineNumber] int callerLineNum = 0) [CallerLineNumber] int callerLineNum = 0
)
{ {
UDPData? data = null; 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 startTime = DateTime.Now;
var isTimeout = false; var isTimeout = false;
@ -149,8 +157,8 @@ public class UDPServer
timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed; timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed;
using (await udpData.AcquireWriteLockAsync(timeleft)) using (await udpData.AcquireWriteLockAsync(timeleft))
{ {
if (udpData.ContainsKey(ipAddr) && if (udpData.ContainsKey($"{ipAddr}-{taskID}") &&
udpData.TryGetValue(ipAddr, out var dataQueue) && udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) &&
dataQueue.Count > 0) dataQueue.Count > 0)
{ {
data = dataQueue.Dequeue(); data = dataQueue.Dequeue();
@ -177,10 +185,11 @@ public class UDPServer
/// 获取还未被读取的数据列表 /// 获取还未被读取的数据列表
/// </summary> /// </summary>
/// <param name="ipAddr">IP地址</param> /// <param name="ipAddr">IP地址</param>
/// <param name="taskID">[TODO:parameter]</param>
/// <param name="timeout">超时时间</param> /// <param name="timeout">超时时间</param>
/// <param name="cycle">延迟时间</param> /// <param name="cycle">延迟时间</param>
/// <returns>数据列表</returns> /// <returns>数据列表</returns>
public async ValueTask<Optional<List<UDPData>>> GetDataArrayAsync(string ipAddr, int timeout = 1000, int cycle = 0) public async ValueTask<Optional<List<UDPData>>> GetDataArrayAsync(string ipAddr, int taskID, int timeout = 1000, int cycle = 0)
{ {
List<UDPData>? data = null; List<UDPData>? data = null;
@ -196,8 +205,8 @@ public class UDPServer
timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed; timeleft = TimeSpan.FromMilliseconds(timeout) - elapsed;
using (await udpData.AcquireReadLockAsync(timeleft)) using (await udpData.AcquireReadLockAsync(timeleft))
{ {
if (udpData.ContainsKey(ipAddr) && if (udpData.ContainsKey($"{ipAddr}-{taskID}") &&
udpData.TryGetValue(ipAddr, out var dataQueue) && udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) &&
dataQueue.Count > 0) dataQueue.Count > 0)
{ {
data = dataQueue.ToList(); data = dataQueue.ToList();
@ -226,9 +235,9 @@ public class UDPServer
/// <param name="timeout">超时时间范围</param> /// <param name="timeout">超时时间范围</param>
/// <returns>接收响应包</returns> /// <returns>接收响应包</returns>
public async ValueTask<Result<WebProtocol.RecvRespPackage>> WaitForAckAsync public async ValueTask<Result<WebProtocol.RecvRespPackage>> 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) if (!data.HasValue)
return new(new Exception("Get None even after time out!")); return new(new Exception("Get None even after time out!"));
@ -251,9 +260,9 @@ public class UDPServer
/// <param name="timeout">超时时间范围</param> /// <param name="timeout">超时时间范围</param>
/// <returns>接收数据包</returns> /// <returns>接收数据包</returns>
public async ValueTask<Result<RecvDataPackage>> WaitForDataAsync public async ValueTask<Result<RecvDataPackage>> 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) if (!data.HasValue)
return new(new Exception("Get None even after time out!")); return new(new Exception("Get None even after time out!"));
@ -284,7 +293,7 @@ public class UDPServer
// Handle Package // Handle Package
var udpData = RecordUDPData(bytes, remoteEP); var udpData = RecordUDPData(bytes, remoteEP, Convert.ToInt32(bytes[1]));
PrintData(udpData); PrintData(udpData);
BEGIN_RECEIVE: BEGIN_RECEIVE:
@ -308,7 +317,7 @@ public class UDPServer
else { return false; } 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 remoteAddress = remoteEP.Address.ToString();
var remotePort = remoteEP.Port; var remotePort = remoteEP.Port;
@ -316,6 +325,7 @@ public class UDPServer
{ {
Address = remoteAddress, Address = remoteAddress,
Port = remotePort, Port = remotePort,
TaskID = taskID,
Data = bytes, Data = bytes,
DateTime = DateTime.Now, DateTime = DateTime.Now,
HasRead = false, HasRead = false,
@ -324,7 +334,7 @@ public class UDPServer
using (udpData.AcquireWriteLock()) using (udpData.AcquireWriteLock())
{ {
// Record UDP Receive Data // 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); dataQueue.Enqueue(data);
logger.Trace("Receive data from old client"); logger.Trace("Receive data from old client");
@ -333,7 +343,7 @@ public class UDPServer
{ {
var queue = new Queue<UDPData>(); var queue = new Queue<UDPData>();
queue.Enqueue(data); queue.Enqueue(data);
udpData.Add(remoteAddress, queue); udpData.Add($"{remoteAddress}-{taskID}", queue);
logger.Trace("Receive data from new client"); logger.Trace("Receive data from new client");
} }
} }
@ -410,12 +420,12 @@ public class UDPServer
/// </summary> /// </summary>
/// <param name="ipAddr">IP地址</param> /// <param name="ipAddr">IP地址</param>
/// <returns>无</returns> /// <returns>无</returns>
public async Task ClearUDPData(string ipAddr) public async Task ClearUDPData(string ipAddr, int taskID)
{ {
using (await udpData.AcquireWriteLockAsync()) using (await udpData.AcquireWriteLockAsync())
{ {
if (udpData.ContainsKey(ipAddr) && if (udpData.ContainsKey($"{ipAddr}-{taskID}") &&
udpData.TryGetValue(ipAddr, out var dataQueue) && udpData.TryGetValue($"{ipAddr}-{taskID}", out var dataQueue) &&
dataQueue.Count > 0) dataQueue.Count > 0)
{ {
dataQueue.Clear(); dataQueue.Clear();

View File

@ -409,7 +409,7 @@ async function applyOutputWave() {
eqps.boardPort, eqps.boardPort,
0, 0,
currentWaveformIndex.value, currentWaveformIndex.value,
toInteger(frequency.value * Math.pow(2, 32 - 20)), toInteger((frequency.value * Math.pow(2, 32 - 20)) / 10),
); );
if (!ret) { if (!ret) {
dialog.error("应用失败"); dialog.error("应用失败");