Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,6 @@ public void DisableStorageSd_ReturnsCorrectCommand()
AssertMessageFormat(message);
}

[Fact]
public void GetSdLoggingState_ReturnsCorrectCommand()
{
var message = ScpiMessageProducer.GetSdLoggingState;
Assert.Equal("SYSTem:STORage:SD:LOGging?", message.Data);
AssertMessageFormat(message);
}

[Fact]
public void GetSdFileList_ReturnsCorrectCommand()
{
Expand All @@ -104,23 +96,23 @@ public void GetSdFile_ReturnsCorrectCommand()
public void SetSdLoggingFileName_ReturnsCorrectCommand()
{
var message = ScpiMessageProducer.SetSdLoggingFileName("log.bin");
Assert.Equal("SYSTem:STORage:SD:LOGging \"log.bin\"", message.Data);
Assert.Equal("SYSTem:STORage:SD:FILE \"log.bin\"", message.Data);
AssertMessageFormat(message);
}

[Fact]
public void StartStreaming_ReturnsCorrectCommand()
{
var message = ScpiMessageProducer.StartStreaming(100);
Assert.Equal("SYSTem:StartStreamData 100", message.Data);
Assert.Equal("SYSTem:STReam:START 100", message.Data);
AssertMessageFormat(message);
}

[Fact]
public void StopStreaming_ReturnsCorrectCommand()
{
var message = ScpiMessageProducer.StopStreaming;
Assert.Equal("SYSTem:StopStreamData", message.Data);
Assert.Equal("SYSTem:STReam:STOP", message.Data);
AssertMessageFormat(message);
}

Expand Down Expand Up @@ -280,7 +272,7 @@ public void SetLanFirmwareUpdateMode_ReturnsCorrectCommand()
public void SetUsbTransparencyMode_ReturnsCorrectCommand()
{
var message = ScpiMessageProducer.SetUsbTransparencyMode(1);
Assert.Equal("SYSTem:USB:SetTransparentMode 1", message.Data);
Assert.Equal("SYSTem:USB:TRANSparent:MODE 1", message.Data);
AssertMessageFormat(message);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public async Task InitializeAsync_SendsAllConfigCommands()
var sentData = device.DirectSentMessages.Select(m => m.Data).ToList();

Assert.Contains(sentData, d => d.Contains("SYSTem:ECHO -1"));
Assert.Contains(sentData, d => d.Contains("SYSTem:StopStreamData"));
Assert.Contains(sentData, d => d.Contains("SYSTem:STReam:STOP"));
Assert.Contains(sentData, d => d.Contains("SYSTem:POWer:STATe 1"));
Assert.Contains(sentData, d => d.Contains("SYSTem:STReam:FORmat 0"));
Assert.Contains(sentData, d => d.Contains("SYSTem:SYSInfoPB?"));
Expand Down
40 changes: 20 additions & 20 deletions src/Daqifi.Core.Tests/Device/SdCard/SdCardOperationsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ public async Task StartSdCardLoggingAsync_SendsCorrectCommandSequence()
Assert.Equal("SYSTem:COMMunicate:LAN:ENAbled 0", sentCommands[0]);
Assert.Equal("SYSTem:STORage:SD:ENAble 1", sentCommands[1]);
Assert.Equal("SYSTem:STReam:INTerface 2", sentCommands[2]);
Assert.Equal("SYSTem:STORage:SD:LOGging \"mylog.bin\"", sentCommands[3]);
Assert.Equal("SYSTem:STORage:SD:FILE \"mylog.bin\"", sentCommands[3]);
Assert.Equal("SYSTem:STReam:FORmat 0", sentCommands[4]);
Assert.Equal("SYSTem:StartStreamData 100", sentCommands[5]);
Assert.Equal("SYSTem:STReam:START 100", sentCommands[5]);
}

[Fact]
Expand Down Expand Up @@ -147,7 +147,7 @@ public async Task StartSdCardLoggingAsync_WithCustomFileName_UsesProvidedName()

// Assert
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Contains("SYSTem:STORage:SD:LOGging \"custom_data.bin\"", sentCommands);
Assert.Contains("SYSTem:STORage:SD:FILE \"custom_data.bin\"", sentCommands);
}

[Fact]
Expand All @@ -162,7 +162,7 @@ public async Task StartSdCardLoggingAsync_WithNullFileName_GeneratesTimestampedN

// Assert
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:LOGging"));
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:FILE"));
Assert.NotNull(loggingCommand);
Assert.Contains("log_", loggingCommand);
Assert.Contains(".bin", loggingCommand);
Expand Down Expand Up @@ -198,7 +198,7 @@ public async Task StopSdCardLoggingAsync_SendsCorrectCommands()
// Assert
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Equal(4, sentCommands.Count);
Assert.Equal("SYSTem:StopStreamData", sentCommands[0]);
Assert.Equal("SYSTem:STReam:STOP", sentCommands[0]);
Assert.Equal("SYSTem:STORage:SD:ENAble 0", sentCommands[1]);
Assert.Equal("SYSTem:STReam:INTerface 0", sentCommands[2]); // Restore USB
Assert.Equal("SYSTem:COMMunicate:LAN:ENAbled 1", sentCommands[3]); // Re-enable LAN
Expand All @@ -219,7 +219,7 @@ public async Task StopSdCardLoggingAsync_SendsStopCommandEvenWhenIsStreamingIsFa

// Assert - stop command should still be sent defensively
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Contains("SYSTem:StopStreamData", sentCommands);
Assert.Contains("SYSTem:STReam:STOP", sentCommands);
}

[Fact]
Expand Down Expand Up @@ -270,7 +270,7 @@ public async Task StartSdCardLoggingAsync_WithEmptyFileName_GeneratesTimestamped

// Assert
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:LOGging"));
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:FILE"));
Assert.NotNull(loggingCommand);
Assert.Contains("log_", loggingCommand);
}
Expand All @@ -287,7 +287,7 @@ public async Task StartSdCardLoggingAsync_WithWhitespaceFileName_GeneratesTimest

// Assert
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:LOGging"));
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:FILE"));
Assert.NotNull(loggingCommand);
Assert.Contains("log_", loggingCommand);
}
Expand Down Expand Up @@ -324,9 +324,9 @@ public async Task StartSdCardLoggingAsync_WithJsonFormat_SendsJsonFormatCommand(
Assert.Equal("SYSTem:COMMunicate:LAN:ENAbled 0", sentCommands[0]);
Assert.Equal("SYSTem:STORage:SD:ENAble 1", sentCommands[1]);
Assert.Equal("SYSTem:STReam:INTerface 2", sentCommands[2]);
Assert.Equal("SYSTem:STORage:SD:LOGging \"mylog.json\"", sentCommands[3]);
Assert.Equal("SYSTem:STORage:SD:FILE \"mylog.json\"", sentCommands[3]);
Assert.Equal("SYSTem:STReam:FORmat 1", sentCommands[4]);
Assert.Equal("SYSTem:StartStreamData 100", sentCommands[5]);
Assert.Equal("SYSTem:STReam:START 100", sentCommands[5]);
}

[Fact]
Expand All @@ -345,9 +345,9 @@ public async Task StartSdCardLoggingAsync_WithCsvFormat_SendsCsvFormatCommand()
Assert.Equal("SYSTem:COMMunicate:LAN:ENAbled 0", sentCommands[0]);
Assert.Equal("SYSTem:STORage:SD:ENAble 1", sentCommands[1]);
Assert.Equal("SYSTem:STReam:INTerface 2", sentCommands[2]);
Assert.Equal("SYSTem:STORage:SD:LOGging \"mylog.csv\"", sentCommands[3]);
Assert.Equal("SYSTem:STORage:SD:FILE \"mylog.csv\"", sentCommands[3]);
Assert.Equal("SYSTem:STReam:FORmat 2", sentCommands[4]);
Assert.Equal("SYSTem:StartStreamData 100", sentCommands[5]);
Assert.Equal("SYSTem:STReam:START 100", sentCommands[5]);
}

[Fact]
Expand All @@ -362,7 +362,7 @@ public async Task StartSdCardLoggingAsync_WithNullFileName_JsonFormat_GeneratesJ

// Assert
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:LOGging"));
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:FILE"));
Assert.NotNull(loggingCommand);
Assert.Contains("log_", loggingCommand);
Assert.Contains(".json", loggingCommand);
Expand All @@ -381,7 +381,7 @@ public async Task StartSdCardLoggingAsync_WithNullFileName_CsvFormat_GeneratesCs

// Assert
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:LOGging"));
var loggingCommand = sentCommands.FirstOrDefault(c => c.StartsWith("SYSTem:STORage:SD:FILE"));
Assert.NotNull(loggingCommand);
Assert.Contains("log_", loggingCommand);
Assert.Contains(".csv", loggingCommand);
Expand Down Expand Up @@ -615,7 +615,7 @@ public async Task FormatSdCardAsync_WhenConnected_SendsCorrectCommands()
// Assert — defensive stop is always sent first (issue #118)
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Equal(3, sentCommands.Count);
Assert.Equal("SYSTem:StopStreamData", sentCommands[0]);
Assert.Equal("SYSTem:STReam:STOP", sentCommands[0]);
Assert.Equal("SYSTem:STORage:SD:ENAble 1", sentCommands[1]);
Assert.Equal("SYSTem:STORage:SD:FORmat", sentCommands[2]);
}
Expand Down Expand Up @@ -660,7 +660,7 @@ public async Task GetSdCardFilesAsync_WhenNotStreaming_StillSendsStopCommand()

// Assert — stop command should still be sent defensively
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Contains("SYSTem:StopStreamData", sentCommands);
Assert.Contains("SYSTem:STReam:STOP", sentCommands);
}

[Fact]
Expand All @@ -677,7 +677,7 @@ public async Task DeleteSdCardFileAsync_WhenNotStreaming_StillSendsStopCommand()

// Assert — stop command should still be sent defensively
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Contains("SYSTem:StopStreamData", sentCommands);
Assert.Contains("SYSTem:STReam:STOP", sentCommands);
}

[Fact]
Expand All @@ -696,7 +696,7 @@ public async Task DownloadSdCardFileAsync_WhenNotStreaming_StillSendsStopCommand

// Assert — stop command should still be sent defensively
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Contains("SYSTem:StopStreamData", sentCommands);
Assert.Contains("SYSTem:STReam:STOP", sentCommands);
}

[Fact]
Expand All @@ -712,7 +712,7 @@ public async Task FormatSdCardAsync_WhenNotStreaming_StillSendsStopCommand()

// Assert — stop command should still be sent defensively
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Contains("SYSTem:StopStreamData", sentCommands);
Assert.Contains("SYSTem:STReam:STOP", sentCommands);
}

#endregion
Expand Down Expand Up @@ -890,7 +890,7 @@ public async Task DownloadSdCardFileAsync_StopsStreamingBeforeDownload()

// Assert — stop streaming command should be sent before the download commands
var sentCommands = device.SentMessages.Select(m => m.Data).ToList();
Assert.Equal("SYSTem:StopStreamData", sentCommands[0]);
Assert.Equal("SYSTem:STReam:STOP", sentCommands[0]);
}

#endregion
Expand Down
4 changes: 2 additions & 2 deletions src/Daqifi.Core.Tests/Integration/EndToEndTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ public void EndToEnd_MockTransport_ShouldDeliverSCPICommands()
var transportContent = mockTransport.GetWrittenContent();
Assert.Contains("SYSTem:SYSInfoPB?", transportContent);
Assert.Contains("SYSTem:REboot", transportContent);
Assert.Contains("SYSTem:StartStreamData 1000", transportContent);
Assert.Contains("SYSTem:StopStreamData", transportContent);
Assert.Contains("SYSTem:STReam:START 1000", transportContent);
Assert.Contains("SYSTem:STReam:STOP", transportContent);
}

[Fact]
Expand Down
25 changes: 8 additions & 17 deletions src/Daqifi.Core/Communication/Producers/ScpiMessageProducer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,15 +95,6 @@ public class ScpiMessageProducer
/// </remarks>
public static IOutboundMessage<string> DisableStorageSd => new ScpiMessage("SYSTem:STORage:SD:ENAble 0");

/// <summary>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Sd logging state query removed 🐞 Bug ≡ Correctness

ScpiMessageProducer.GetSdLoggingState was removed (not renamed), breaking any consumers that
compile against it and eliminating a SD logging-state query from the public producer surface. This
is a functional/API removal beyond the four SCPI renames described in the PR.
Agent Prompt
### Issue description
The public producer member for querying SD logging state was removed. This creates a breaking API change and removes functionality (ability to query SD logging state) rather than performing a rename.

### Issue Context
PR intent is described as "4 SCPI renames"; removal is a larger change and should either be replaced with the renamed query or explicitly preserved as an alias for compatibility.

### Fix Focus Areas
- src/Daqifi.Core/Communication/Producers/ScpiMessageProducer.cs[79-106]
- src/Daqifi.Core.Tests/Communication/Producers/ScpiMessageProducerTests.cs[61-93]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

/// Creates a query message to get the current SD card logging state.
/// </summary>
/// <remarks>
/// Command: SYSTem:STORage:SD:LOGging?
/// Example: messageProducer.Send(ScpiMessageProducer.GetSdLoggingState);
/// </remarks>
public static IOutboundMessage<string> GetSdLoggingState => new ScpiMessage("SYSTem:STORage:SD:LOGging?");

/// <summary>
/// Creates a query message to get the list of files on the SD card.
/// </summary>
Expand Down Expand Up @@ -132,12 +123,12 @@ public static IOutboundMessage<string> GetSdFile(string fileName)
/// <param name="fileName">The name of the file to create or append to. Must be enclosed in quotes.</param>
/// <remarks>
/// The specified file will be created if it doesn't exist, or appended to if it already exists.
/// Command: SYSTem:STORage:SD:LOGging "filename.bin"
/// Command: SYSTem:STORage:SD:FILE "filename.bin"
/// Example: messageProducer.Send(ScpiMessageProducer.SetSdLoggingFileName("data.bin"));
/// </remarks>
public static IOutboundMessage<string> SetSdLoggingFileName(string fileName)
{
return new ScpiMessage($"SYSTem:STORage:SD:LOGging \"{fileName}\"");
return new ScpiMessage($"SYSTem:STORage:SD:FILE \"{fileName}\"");
}

/// <summary>
Expand Down Expand Up @@ -255,22 +246,22 @@ public static IOutboundMessage<string> SetStreamInterface(StreamInterface stream
/// <param name="frequency">The streaming frequency in Hz (1-1000).</param>
/// <remarks>
/// Starts streaming data from enabled channels at the specified frequency.
/// Command: SYSTem:StartStreamData frequency
/// Command: SYSTem:STReam:START frequency
/// Example: messageProducer.Send(ScpiMessageProducer.StartStreaming(100)); // Stream at 100Hz
/// </remarks>
public static IOutboundMessage<string> StartStreaming(int frequency)
{
return new ScpiMessage($"SYSTem:StartStreamData {frequency}");
return new ScpiMessage($"SYSTem:STReam:START {frequency}");
}

/// <summary>
/// Creates a command message to stop data streaming.
/// </summary>
/// <remarks>
/// Command: SYSTem:StopStreamData
/// Command: SYSTem:STReam:STOP
/// Example: messageProducer.Send(ScpiMessageProducer.StopStreaming);
/// </remarks>
public static IOutboundMessage<string> StopStreaming => new ScpiMessage("SYSTem:StopStreamData");
public static IOutboundMessage<string> StopStreaming => new ScpiMessage("SYSTem:STReam:STOP");

/// <summary>
/// Creates a command message to set the stream format to Protocol Buffer.
Expand Down Expand Up @@ -494,11 +485,11 @@ public static IOutboundMessage<string> SetNetworkWifiPassword(string password)
/// </summary>
/// <param name="mode">The transparency mode (0 = disabled, 1 = enabled).</param>
/// <remarks>
/// Command: SYSTem:USB:SetTransparentMode mode
/// Command: SYSTem:USB:TRANSparent:MODE mode
/// </remarks>
public static IOutboundMessage<string> SetUsbTransparencyMode(int mode)
{
return new ScpiMessage($"SYSTem:USB:SetTransparentMode {mode}");
return new ScpiMessage($"SYSTem:USB:TRANSparent:MODE {mode}");
}

/// <summary>
Expand Down