Skip to content

Commit bf1e8e0

Browse files
committed
SCPI fixes
1 parent f2ee0ac commit bf1e8e0

4 files changed

Lines changed: 30 additions & 109 deletions

File tree

source/TS.NET.Engine/DTOs/ProcessingRequestDto.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ public record HardwareSetResolution(AdcResolution Resolution) : ProcessingReques
2727
public record HardwareSetChannelEnabled(int ChannelIndex, bool Enabled) : ProcessingRequestDto, INotificationDto;
2828

2929
public abstract record HardwareSetChannelFrontendRequest(int ChannelIndex) : ProcessingRequestDto;
30-
public record HardwareSetVoltOffset(int ChannelIndex, double VoltOffset) : HardwareSetChannelFrontendRequest(ChannelIndex);
31-
public record HardwareSetVoltFullScale(int ChannelIndex, double VoltFullScale) : HardwareSetChannelFrontendRequest(ChannelIndex);
30+
public record HardwareSetVoltOffset(int ChannelIndex, float VoltOffset) : HardwareSetChannelFrontendRequest(ChannelIndex);
31+
public record HardwareSetVoltFullScale(int ChannelIndex, float VoltFullScale) : HardwareSetChannelFrontendRequest(ChannelIndex);
3232
public record HardwareSetBandwidth(int ChannelIndex, ThunderscopeBandwidth Bandwidth) : HardwareSetChannelFrontendRequest(ChannelIndex);
3333
public record HardwareSetCoupling(int ChannelIndex, ThunderscopeCoupling Coupling) : HardwareSetChannelFrontendRequest(ChannelIndex);
3434
public record HardwareSetTermination(int ChannelIndex, ThunderscopeTermination Termination) : HardwareSetChannelFrontendRequest(ChannelIndex);

source/TS.NET.Engine/EngineManager.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,9 @@ public bool TryStart(string configurationFile, string calibrationFile, string de
112112
logger?.LogInformation(sb.ToString());
113113
}
114114

115-
116-
117115
// Later this will switch to using device serial.
118116
uint deviceIndex = uint.Parse(deviceSerial);
119-
if(deviceIndex >= devices.Count)
117+
if (deviceIndex >= devices.Count)
120118
{
121119
logger?.LogCritical($"Device index {deviceIndex} out of range, {devices.Count} devices available");
122120
return false;
@@ -186,6 +184,21 @@ public bool TryStart(string configurationFile, string calibrationFile, string de
186184
// Start threads
187185
SemaphoreSlim startSemaphore = new(1);
188186

187+
DataServer? dataServer = null;
188+
switch (thunderscopeSettings.WaveformBufferReader)
189+
{
190+
case "DataServer":
191+
dataServer = new DataServer(loggerFactory.CreateLogger(nameof(DataServer)), thunderscopeSettings, System.Net.IPAddress.Any, 5026, captureBuffer, seq => scpiServer?.OnUpdateSequence(seq));
192+
waveformBufferReader = dataServer;
193+
break;
194+
case "None":
195+
waveformBufferReader = new EmptyWaveformBufferReader();
196+
break;
197+
default:
198+
logger?.LogCritical($"{thunderscopeSettings.WaveformBufferReader} waveform buffer reader not supported");
199+
return false;
200+
}
201+
189202
startSemaphore.Wait();
190203
processingThread = new ProcessingThread(
191204
logger: loggerFactory.CreateLogger(nameof(ProcessingThread)),
@@ -207,19 +220,6 @@ public bool TryStart(string configurationFile, string calibrationFile, string de
207220
scpiServer.Start(startSemaphore);
208221

209222
startSemaphore.Wait();
210-
switch (thunderscopeSettings.WaveformBufferReader)
211-
{
212-
case "DataServer":
213-
DataServer dataServer = new(loggerFactory.CreateLogger(nameof(DataServer)), thunderscopeSettings, System.Net.IPAddress.Any, 5026, captureBuffer, scpiServer);
214-
waveformBufferReader = dataServer;
215-
break;
216-
case "None":
217-
waveformBufferReader = new EmptyWaveformBufferReader();
218-
break;
219-
default:
220-
logger?.LogCritical($"{thunderscopeSettings.WaveformBufferReader} waveform buffer reader not supported");
221-
return false;
222-
}
223223
waveformBufferReader.Start(startSemaphore);
224224

225225
//catch (IOException)

source/TS.NET.Engine/Threads/ScpiServer.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,6 @@ public void OnUpdateSequence(uint seq)
268268
{
269269
switch (command)
270270
{
271-
case "START": //Obsolete
272271
case "RUN":
273272
processingControl.Request.Writer.Write(new ProcessingRun());
274273
logger.LogDebug($"{nameof(ProcessingRun)} sent");
@@ -430,7 +429,7 @@ public void OnUpdateSequence(uint seq)
430429
{
431430
// TRIGger:EDGE:LEVel <arg>
432431
// TRIG:EDGE:LEV <arg>
433-
float level = (float)Convert.ToDouble(argument);
432+
float level = Convert.ToSingle(argument);
434433
logger.LogDebug($"Set trigger level to {level}V");
435434
processingControl.Request.Writer.Write(new ProcessingSetEdgeTriggerLevel(level));
436435
return null;
@@ -507,14 +506,14 @@ public void OnUpdateSequence(uint seq)
507506
{
508507
// CHANnel1:OFFSet <arg>
509508
// CHAN1:OFFS <arg>
510-
double offset = Convert.ToDouble(argument);
509+
float offset = Convert.ToSingle(argument);
511510
offset = Math.Clamp(offset, -50, 50); // Change to final values later
512511
processingControl.Request.Writer.Write(new HardwareSetVoltOffset(channelIndex, offset));
513512
return null;
514513
}
515514
case var _ when command.StartsWith("RANG") && argument != null:
516515
{
517-
double range = Convert.ToDouble(argument);
516+
float range = Convert.ToSingle(argument);
518517
range = Math.Clamp(range, -50, 50); // Change to final values later
519518
processingControl.Request.Writer.Write(new HardwareSetVoltFullScale(channelIndex, range));
520519
return null;
@@ -760,6 +759,8 @@ public void OnUpdateSequence(uint seq)
760759
switch (response)
761760
{
762761
case ProcessingGetTriggerSourceResponse triggerSourceResponse:
762+
if(triggerSourceResponse.Channel == TriggerChannel.None)
763+
return "NONE\n";
763764
return $"CHAN{(int)triggerSourceResponse.Channel}\n";
764765
default:
765766
logger.LogError($"TRIG:SOU? - Invalid response from {nameof(processingControl.Response.Reader)}");
@@ -840,7 +841,7 @@ public void OnUpdateSequence(uint seq)
840841
switch (response)
841842
{
842843
case ProcessingGetTriggerInterpolationResponse triggerInterpolationResponse:
843-
return $"{(triggerInterpolationResponse.Enabled ? "1" : "0")}\n";
844+
return $"{(triggerInterpolationResponse.Enabled ? "true" : "false")}\n";
844845
default:
845846
logger.LogError($"TRIG:INTER? - Invalid response from {nameof(processingControl.Response.Reader)}");
846847
break;
@@ -1059,7 +1060,7 @@ string GetRates()
10591060
switch (response)
10601061
{
10611062
case ProcessingGetRatesResponse processingGetRatesResponse:
1062-
return $"{string.Join(",", processingGetRatesResponse.SampleRatesHz)},\n";
1063+
return $"{string.Join(",", processingGetRatesResponse.SampleRatesHz)}\n";
10631064
default:
10641065
logger.LogError($"RATES? - Invalid response from {nameof(processingControl.Response.Reader)}");
10651066
break;
@@ -1105,7 +1106,7 @@ string GetDepths()
11051106
break;
11061107
}
11071108
// Perhaps take into account the sample rate to get 1ms/2ms/5ms/10ms/etc windows instead?
1108-
return $"{string.Join(",", depths)},\n";
1109+
return $"{string.Join(",", depths)}\n";
11091110
}
11101111

11111112
string GetDepth()

source/TS.NET.Engine/Waveform Buffer Readers/DataServer.cs

Lines changed: 4 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal class DataServer : IThread
1212
private readonly IPAddress address;
1313
private readonly int port;
1414
private readonly ICaptureBufferManagerReader captureBufferManager;
15-
private readonly ScpiServer scpi;
15+
private readonly Action<uint> onSequenceUpdate;
1616

1717
private CancellationTokenSource? listenerCancelTokenSource;
1818
private Task? taskListener;
@@ -28,14 +28,14 @@ public DataServer(
2828
IPAddress address,
2929
int port,
3030
ICaptureBufferManagerReader captureBuffer,
31-
ScpiServer scpi)
31+
Action<uint> onSequenceUpdate)
3232
{
3333
this.logger = logger;
3434
this.settings = settings;
3535
this.address = address;
3636
this.port = port;
3737
this.captureBufferManager = captureBuffer;
38-
this.scpi = scpi;
38+
this.onSequenceUpdate = onSequenceUpdate;
3939
}
4040

4141
public void Start(SemaphoreSlim startSemaphore)
@@ -169,7 +169,7 @@ private void LoopSession(ILogger logger, Socket socket, CancellationToken cancel
169169
{
170170
SendScopehal(socket, cancelToken);
171171
//logger.LogInformation($"Sending waveform (seq={sequenceNumber})");
172-
scpi.OnUpdateSequence(sequenceNumber);
172+
onSequenceUpdate(sequenceNumber);
173173
}
174174
}
175175

@@ -184,9 +184,6 @@ private void LoopSession(ILogger logger, Socket socket, CancellationToken cancel
184184
byte cmd = cmdBuf[0];
185185
switch (cmd)
186186
{
187-
case (byte)'K':
188-
SendScopehalOld(socket, cancelToken);
189-
break;
190187
case (byte)'S':
191188
SendScopehal(socket, cancelToken);
192189
break;
@@ -216,83 +213,6 @@ private void LoopSession(ILogger logger, Socket socket, CancellationToken cancel
216213
}
217214

218215
private uint sequenceNumber = 0;
219-
private void SendScopehalOld(Socket socket, CancellationToken cancelToken)
220-
{
221-
while (true)
222-
{
223-
cancelToken.ThrowIfCancellationRequested();
224-
bool noCapturesAvailable = false;
225-
226-
if (captureBufferManager.TryStartRead(out var buffer))
227-
{
228-
ulong femtosecondsPerSample = 1000000000000000 / buffer!.Metadata.HardwareConfig.Acquisition.SampleRateHz;
229-
WaveformHeaderOld header = new()
230-
{
231-
seqnum = sequenceNumber,
232-
numChannels = (ushort)BitOperations.PopCount(buffer.Metadata.HardwareConfig.Acquisition.EnabledChannels),
233-
fsPerSample = femtosecondsPerSample,
234-
triggerFs = (long)buffer.Metadata.ProcessingConfig.TriggerDelayFs,
235-
hwWaveformsPerSec = 0
236-
};
237-
ChannelHeaderOld chHeader = new()
238-
{
239-
depth = (ulong)buffer.Metadata.ProcessingConfig.ChannelDataLength,
240-
clipping = 0
241-
};
242-
if (buffer.Metadata.Triggered && buffer.Metadata.ProcessingConfig.TriggerInterpolation)
243-
{
244-
ReadOnlySpan<sbyte> triggerChannelBuffer = buffer.GetChannelReadBuffer<sbyte>(buffer.Metadata.TriggerChannelCaptureIndex);
245-
int triggerIndex = (int)(buffer.Metadata.ProcessingConfig.TriggerDelayFs / femtosecondsPerSample);
246-
if (triggerIndex > 0 && triggerIndex < triggerChannelBuffer.Length)
247-
{
248-
int channelIndex = buffer.Metadata.HardwareConfig.Acquisition.GetChannelIndexByCaptureBufferIndex(buffer.Metadata.TriggerChannelCaptureIndex);
249-
ThunderscopeChannelFrontend triggerChannelFrontend = buffer.Metadata.HardwareConfig.Frontend[channelIndex];
250-
var channelScale = (float)(triggerChannelFrontend.ActualVoltFullScale / 256.0);
251-
var channelOffset = (float)triggerChannelFrontend.ActualVoltOffset;
252-
float fa = channelScale * triggerChannelBuffer[triggerIndex - 1] - channelOffset;
253-
float fb = channelScale * triggerChannelBuffer[triggerIndex] - channelOffset;
254-
float triggerLevel = buffer.Metadata.ProcessingConfig.EdgeTriggerParameters.LevelV + channelOffset;
255-
float slope = fb - fa;
256-
float delta = triggerLevel - fa;
257-
float trigphase = delta / slope;
258-
chHeader.trigphase = femtosecondsPerSample * (1 - trigphase);
259-
if (!double.IsFinite(chHeader.trigphase))
260-
chHeader.trigphase = 0;
261-
var delay = buffer.Metadata.ProcessingConfig.TriggerDelayFs - (ulong)triggerIndex * femtosecondsPerSample;
262-
chHeader.trigphase += delay;
263-
}
264-
}
265-
unsafe
266-
{
267-
socket.Send(new ReadOnlySpan<byte>(&header, sizeof(WaveformHeaderOld)));
268-
for (byte captureBufferIndex = 0; captureBufferIndex < buffer.ChannelCount; captureBufferIndex++)
269-
{
270-
int channelIndex = buffer.Metadata.HardwareConfig.Acquisition.GetChannelIndexByCaptureBufferIndex(captureBufferIndex);
271-
ThunderscopeChannelFrontend thunderscopeChannel = buffer.Metadata.HardwareConfig.Frontend[channelIndex];
272-
chHeader.channelIndex = (byte)channelIndex;
273-
chHeader.scale = (float)(thunderscopeChannel.ActualVoltFullScale / 256.0);
274-
chHeader.offset = (float)thunderscopeChannel.ActualVoltOffset;
275-
socket.Send(new ReadOnlySpan<byte>(&chHeader, sizeof(ChannelHeaderOld)));
276-
var channelBuffer = buffer.GetChannelReadByteBuffer(captureBufferIndex);
277-
socket.Send(channelBuffer);
278-
}
279-
}
280-
sequenceNumber++;
281-
captureBufferManager.FinishRead();
282-
break;
283-
}
284-
else
285-
{
286-
noCapturesAvailable = true;
287-
}
288-
289-
if (noCapturesAvailable)
290-
{
291-
Thread.Sleep(10);
292-
}
293-
}
294-
}
295-
296216
private void SendScopehal(Socket socket, CancellationToken cancelToken)
297217
{
298218
bool noCapturesAvailable = false;

0 commit comments

Comments
 (0)