Skip to content
Draft
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
22 changes: 11 additions & 11 deletions src/Baballonia.Tests/FirmwareTests/FirmwareIntegrationTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,21 @@ public void Initialize()
[TestMethod]
public void TestBoard()
{
var session = new FirmwareSession(new SerialCommandSender(PORT), _logger);
var session = new FirmwareSessionV1(new SerialCommandSender(PORT), _logger);
Assert.IsNotNull(session.WaitForHeartbeat());
}

[TestMethod]
public void FindAndConnectWifiSuccess()
{
var session = new FirmwareSession(new SerialCommandSender(PORT), _logger);
var session = new FirmwareSessionV1(new SerialCommandSender(PORT), _logger);

session.WaitForHeartbeat();
session.SendCommand(new FirmwareRequests.SetPausedRequest(true), TimeSpan.FromSeconds(30));
var networks = session.SendCommand(new FirmwareRequests.ScanWifiRequest(), TimeSpan.FromSeconds(30));
Assert.IsNotNull(networks);
Assert.IsTrue(networks.IsSuccess);

var find = networks.Networks.Find(network => network.Ssid == WIFI_SSID);
var find = networks.Value!.Networks.Find(network => network.Ssid == WIFI_SSID);
Assert.IsNotNull(find);

session.SendCommand(new FirmwareRequests.SetWifiRequest(WIFI_SSID, WIFI_PWD), TimeSpan.FromSeconds(30));
Expand All @@ -57,8 +57,8 @@ public void FindAndConnectWifiSuccess()
Assert.IsNotNull(connectionres);

var wifistatus = session.SendCommand(new FirmwareRequests.GetWifiStatusRequest(), TimeSpan.FromSeconds(30));
Assert.IsNotNull(wifistatus);
Assert.AreEqual("connected", wifistatus.Status);
Assert.IsTrue(wifistatus.IsSuccess);
Assert.AreEqual("connected", wifistatus.Value!.Status);

session.SendCommand(new FirmwareRequests.SetPausedRequest(false), TimeSpan.FromSeconds(30));

Expand All @@ -68,14 +68,14 @@ public void FindAndConnectWifiSuccess()
[TestMethod]
public void FindAndConnectWifiFail()
{
var session = new FirmwareSession(new SerialCommandSender(PORT), _logger);
var session = new FirmwareSessionV1(new SerialCommandSender(PORT), _logger);

session.WaitForHeartbeat();
session.SendCommand(new FirmwareRequests.SetPausedRequest(true), TimeSpan.FromSeconds(30));
var networks = session.SendCommand(new FirmwareRequests.ScanWifiRequest(), TimeSpan.FromSeconds(30));
Assert.IsNotNull(networks);
Assert.IsTrue(networks.IsSuccess);

var find = networks.Networks.Find(network => network.Ssid == WIFI_SSID);
var find = networks.Value!.Networks.Find(network => network.Ssid == WIFI_SSID);
Assert.IsNotNull(find);

session.SendCommand(new FirmwareRequests.SetWifiRequest("", WIFI_PWD), TimeSpan.FromSeconds(30));
Expand All @@ -84,8 +84,8 @@ public void FindAndConnectWifiFail()
Assert.IsNotNull(connectionres);

var wifistatus = session.SendCommand(new FirmwareRequests.GetWifiStatusRequest(), TimeSpan.FromSeconds(30));
Assert.IsNotNull(wifistatus);
Assert.AreEqual("error", wifistatus.Status);
Assert.IsTrue(wifistatus.IsSuccess);
Assert.AreEqual("error", wifistatus.Value!.Status);

session.SendCommand(new FirmwareRequests.SetPausedRequest(false), TimeSpan.FromSeconds(30));

Expand Down
4 changes: 2 additions & 2 deletions src/Baballonia.Tests/FirmwareTests/FirmwareServiceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public void TestSendCommand()
session.WaitForHeartbeat();

var results = session.SendCommand(new FirmwareRequests.GetWifiStatusRequest(), TimeSpan.FromSeconds(10));
Assert.AreEqual("192.168.0.246", results.IpAddress);
Assert.AreEqual("192.168.0.246", results.Value!.IpAddress);
}


Expand Down Expand Up @@ -133,7 +133,7 @@ public void TestSendGeneric()
var commandResult = session.SendCommand(new FirmwareRequests.SetPausedRequest(true), TimeSpan.FromSeconds(10));
Assert.AreEqual("""
{"command_name":"pause", "status":"SUCCESS"}
""", commandResult);
""", commandResult.Value!.ToString());
}


Expand Down
28 changes: 28 additions & 0 deletions src/Baballonia.Tests/Models/FirmwareSessionFactoryTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System.Linq;
using Baballonia.Factories;
using Baballonia.Models;
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Baballonia.Tests.Models;

[TestClass]
[TestSubject(typeof(FirmwareSessionFactory))]
public class FirmwareSessionFactoryTest
{

[TestMethod]
public void BoardIntegrationTest()
{
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole(); // Or AddDebug()
builder.SetMinimumLevel(LogLevel.Debug);
});
FirmwareSessionFactory factory = new FirmwareSessionFactory(loggerFactory, new CommandSenderFactory());

var sessions = factory.TryOpenAllSessions();
Assert.IsTrue(sessions.Any());
}
}
137 changes: 137 additions & 0 deletions src/Baballonia.Tests/Models/FirmwareSessionV2Test.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
using System;
using System.IO.Ports;
using System.Linq;
using System.Threading;
using Baballonia.Contracts;
using Baballonia.Helpers;
using Baballonia.Models;
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Baballonia.Tests.Models;

[TestClass]
[TestSubject(typeof(FirmwareSessionV2))]
public class FirmwareSessionV2Test
{
public string[] FindAvailableSerialPorts()
{
// GetPortNames() may return single port multiple times
// https://stackoverflow.com/questions/33401217/serialport-getportnames-returns-same-port-multiple-times
return SerialPort.GetPortNames().Distinct().ToArray();
}

FirmwareSessionV2? FindAnyCreateSession()
{
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole(); // Or AddDebug()
builder.SetMinimumLevel(LogLevel.Debug);
});
var logger = loggerFactory.CreateLogger("Balls");
var ports = FindAvailableSerialPorts();
foreach (var port in ports)
{
try
{
ICommandSender command = new SerialCommandSender(port);
FirmwareSessionV2 firmwareSession =
new FirmwareSessionV2(command, loggerFactory.CreateLogger<FirmwareSessionV2>());

var res = firmwareSession.SendCommand(new FirmwareRequests.GetWhoAmIRequest(), TimeSpan.FromSeconds(5));
if (res.IsSuccess)
return firmwareSession;

firmwareSession.Dispose();
}
catch (Exception any)
{
logger.LogError(any.Message);
}
}

return null;
}

public static void AssertAreEqualIgnoreCase(string expected, string actual)
{
if (!string.Equals(expected, actual, StringComparison.OrdinalIgnoreCase))
{
Assert.Fail($"Expected '{expected}' but got '{actual}' (case-insensitive compare)");
}
}

[TestMethod]
public void GetModeTest()
{

var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole(); // Or AddDebug()
builder.SetMinimumLevel(LogLevel.Debug);
});
ICommandSender commandSender = new SerialCommandSender("COM3");
FirmwareSessionV2 sessionV2 = new FirmwareSessionV2(commandSender, loggerFactory.CreateLogger<FirmwareSessionV2>());

var res = sessionV2.SendCommand(new FirmwareRequests.GetDeviceModeRequestV2(), TimeSpan.MaxValue);

Assert.IsTrue(res.IsSuccess);
Assert.IsTrue(res.Value!.mode == "UVC");
}
[TestMethod]
public void AllCommandsIntegrationTest()
{
var sessionV2 = FindAnyCreateSession();
Assert.IsNotNull(sessionV2);

var res0 = sessionV2.SendCommand(new FirmwareRequests.SetModeRequest(FirmwareRequests.Mode.Wifi), TimeSpan.FromSeconds(5));
Assert.IsTrue(res0.IsSuccess);
var resRestart = sessionV2.SendCommand(new FirmwareRequests.RestartDeviceRequest(), TimeSpan.FromSeconds(5));
Assert.IsTrue(resRestart.IsSuccess);
sessionV2.Dispose();
Thread.Sleep(5000); // give it some reload time

sessionV2 = FindAnyCreateSession();
Assert.IsNotNull(sessionV2);


var res1 = sessionV2.SendCommand(new FirmwareRequests.GetDeviceModeRequestV2(), TimeSpan.FromSeconds(5));
Assert.IsTrue(res1.IsSuccess);
AssertAreEqualIgnoreCase(FirmwareRequests.Mode.Wifi.Value, res1.Value!.mode);

var res2 = sessionV2.SendCommand(new FirmwareRequests.GetWifiStatusRequest(), TimeSpan.FromSeconds(5));
Assert.IsTrue(res2.IsSuccess);

var res3 = sessionV2.SendCommand(new FirmwareRequests.GetWhoAmIRequest(), TimeSpan.FromSeconds(5));
Assert.IsTrue(res3.IsSuccess);

var res4 = sessionV2.SendCommand(new FirmwareRequests.GetSerialRequest(), TimeSpan.FromSeconds(5));
Assert.IsTrue(res4.IsSuccess);

var res5 = sessionV2.SendCommand(new FirmwareRequests.ScanWifiRequest(), TimeSpan.FromSeconds(40));
Assert.IsTrue(res5.IsSuccess);

var res6 = sessionV2.SendCommand(new FirmwareRequests.SetWifiRequest("ballz", "balls"), TimeSpan.FromSeconds(5));
Assert.IsTrue(res6.IsSuccess);


var res7 = sessionV2.SendCommand(new FirmwareRequests.SetModeRequest(FirmwareRequests.Mode.UVC),
TimeSpan.FromSeconds(5));
Assert.IsTrue(res7.IsSuccess);
resRestart = sessionV2.SendCommand(new FirmwareRequests.RestartDeviceRequest(), TimeSpan.FromSeconds(5));
Assert.IsTrue(resRestart.IsSuccess);

sessionV2.Dispose();
Thread.Sleep(5000); // give it some reload time

sessionV2 = FindAnyCreateSession();
Assert.IsNotNull(sessionV2);

var res8 = sessionV2.SendCommand(new FirmwareRequests.GetDeviceModeRequestV2(), TimeSpan.FromSeconds(5));
Assert.IsTrue(res8.IsSuccess);
AssertAreEqualIgnoreCase(FirmwareRequests.Mode.UVC.Value, res8.Value!.mode);

sessionV2.Dispose();
}
}
1 change: 1 addition & 0 deletions src/Baballonia/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ public override void OnFrameworkInitializationCompleted()
services.AddSingleton<EyePipelineManager>();
services.AddSingleton<IEyePipelineEventBus, EyePipelineEventBus>();
services.AddSingleton<SingleCameraSourceFactory>();
services.AddSingleton<FirmwareSessionFactory>();

// Core Services
services.AddTransient<IIdentityService, IdentityService>();
Expand Down
29 changes: 29 additions & 0 deletions src/Baballonia/Attributes/ApiVersionRangeAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System;

namespace Baballonia.Attributes;


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, Inherited = false, AllowMultiple = false)]
public sealed class ApiVersionRangeAttribute : Attribute
{
public Version MinVersion { get; }
public Version? MaxVersion { get; }

public ApiVersionRangeAttribute(string minVersion)
{
MinVersion = new Version(minVersion);
}

public ApiVersionRangeAttribute(string minVersion, string maxVersion)
{
MinVersion = new Version(minVersion);
MaxVersion = new Version(maxVersion);
}

public bool IsAllowed(Version version)
{
if (version < MinVersion) return false;
if (MaxVersion != null && version > MaxVersion) return false;
return true;
}
}
21 changes: 21 additions & 0 deletions src/Baballonia/Contracts/IFirmwareSession.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;
using System.Text.Json;
using System.Threading.Tasks;
using Baballonia.Models;

namespace Baballonia.Contracts;

public interface IFirmwareSession : IDisposable
{
Version Version { get; }
FirmwareResponse<JsonDocument> SendCommand(IFirmwareRequest request, TimeSpan timeout);
FirmwareResponse<T> SendCommand<T>(IFirmwareRequest<T> request, TimeSpan timeout);
Task<FirmwareResponse<T>> SendCommandAsync<T>(IFirmwareRequest<T> request, TimeSpan timeSpan);
Task<FirmwareResponse<JsonDocument>> SendCommandAsync(IFirmwareRequest request, TimeSpan timeSpan);
}

// for factory usage, so it can set the version
public interface IVersionedFirmwareSession : IFirmwareSession
{
Version Version { get; set; }
}
2 changes: 1 addition & 1 deletion src/Baballonia/Helpers/JsonExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public JsonDocument ReadUntilValidJson(Func<string> readLineFunction, TimeSpan t
if (!string.IsNullOrWhiteSpace(line))
{
_buffer.Append(line);
_lastScannedIndex = Math.Max(0, _buffer.Length - line.Length);
_lastScannedIndex = 0;
}
}
}
Expand Down
1 change: 0 additions & 1 deletion src/Baballonia/Helpers/SerialCommandSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ public void WriteLine(string payload)
_serialPort.Write(payloadBytes, i, length);
Thread.Sleep(50); // Small pause between chunks
}

}
}
}
Loading