separate types for commands
Some checks failed
Rust / build (pull_request) Failing after 16s

This commit is contained in:
Vinzenz Schroeter 2025-06-16 16:41:46 +02:00
parent 13a34e83d7
commit 178ab1eb74
12 changed files with 2967 additions and 562 deletions

View file

@ -1,12 +1,13 @@
using System.Threading; using System.Threading;
using ServicePoint; using ServicePoint;
var connection = new Connection("127.0.0.1:2342"); //var connection = new Connection("127.0.0.1:2342");
connection.Send(Command.Clear()); var connection = new FakeConnection();
connection.Send(new ClearCommand());
connection.Send(Command.Brightness(5)); connection.Send(new GlobalBrightnessCommand(5));
connection.Send(Command.Utf8Data(0,0, CharGrid.Load("This is a test"))); connection.Send(new CharGridCommand(0, 0, CharGrid.Load("This is a test")));
var pixels = Bitmap.NewMaxSized(); var pixels = Bitmap.NewMaxSized();
for (ulong offset = 0; offset < pixels.Width(); offset++) for (ulong offset = 0; offset < pixels.Width(); offset++)
@ -16,6 +17,6 @@ for (ulong offset = 0; offset < pixels.Width(); offset++)
for (ulong y = 0; y < pixels.Height(); y++) for (ulong y = 0; y < pixels.Height(); y++)
pixels.Set((y + offset) % pixels.Width(), y, true); pixels.Set((y + offset) % pixels.Width(), y, true);
connection.Send(Command.BitmapLinearWin(0, 0, pixels, CompressionCode.Lzma)); connection.Send(new BitmapCommand(0, 0, pixels, CompressionCode.Lzma));
Thread.Sleep(14); Thread.Sleep(14);
} }

View file

@ -12,4 +12,8 @@
<ProjectReference Include="../ServicePoint/ServicePoint.csproj"/> <ProjectReference Include="../ServicePoint/ServicePoint.csproj"/>
</ItemGroup> </ItemGroup>
<PropertyGroup>
<InvariantGlobalization>true</InvariantGlobalization>
<PublishAot>true</PublishAot>
</PropertyGroup>
</Project> </Project>

View file

@ -12,7 +12,7 @@ public class CharGridTests
Assert.Equal(" ", grid.Get(1, 1)); Assert.Equal(" ", grid.Get(1, 1));
grid.Set(1, 1, "-"); grid.Set(1, 1, "-");
Assert.Equal("-", grid.Get(1, 1)); Assert.Equal("-", grid.Get(1, 1));
Assert.Throws<PanicException>(() => grid.Get(8, 2)); Assert.Throws<ServicePointException.OutOfBounds>(() => grid.Get(8, 2));
} }
[Fact] [Fact]
@ -22,8 +22,8 @@ public class CharGridTests
Assert.Equal("\0\0\0", grid.GetRow(0)); Assert.Equal("\0\0\0", grid.GetRow(0));
grid.Fill(" "); grid.Fill(" ");
Assert.Equal(" ", grid.GetCol(1)); Assert.Equal(" ", grid.GetCol(1));
Assert.Throws<CharGridException.OutOfBounds>(() => grid.GetCol(3)); Assert.Throws<ServicePointException.OutOfBounds>(() => grid.GetCol(3));
Assert.Throws<CharGridException.InvalidSeriesLength>(() => grid.SetRow(1, "Text")); Assert.Throws<ServicePointException.InvalidSeriesLength>(() => grid.SetRow(1, "Text"));
grid.SetRow(1, "Foo"); grid.SetRow(1, "Foo");
Assert.Equal("Foo", grid.GetRow(1)); Assert.Equal("Foo", grid.GetRow(1));
Assert.Equal(" o", grid.GetCol(2)); Assert.Equal(" o", grid.GetCol(2));

View file

@ -2,41 +2,48 @@ namespace ServicePoint.Tests;
public class CommandTests public class CommandTests
{ {
private Connection _connection = Connection.NewFake(); private IConnection _connection = new FakeConnection();
[Fact] [Fact]
public void ClearSendable() public void ClearSendable()
{ {
_connection.Send(Command.Clear()); _connection.Send(new ClearCommand());
}
[Fact]
public void GenericAsPacket()
{
var command = new ClearCommand();
Assert.Equal(command.AsPacket(), command.AsGeneric().AsPacket());
} }
[Fact] [Fact]
public void BrightnessSendable() public void BrightnessSendable()
{ {
_connection.Send(Command.Brightness(5)); _connection.Send(new GlobalBrightnessCommand(5));
} }
[Fact] [Fact]
public void InvalidBrightnessThrows() public void InvalidBrightnessThrows()
{ {
Assert.Throws<ServicePointException.InvalidBrightness>(() => Command.Brightness(42)); Assert.Throws<ServicePointException.InvalidBrightness>(() => new GlobalBrightnessCommand(42));
} }
[Fact] [Fact]
public void FadeOutSendable() public void FadeOutSendable()
{ {
_connection.Send(Command.FadeOut()); _connection.Send(new FadeOutCommand());
} }
[Fact] [Fact]
public void HardResetSendable() public void HardResetSendable()
{ {
_connection.Send(Command.HardReset()); _connection.Send(new HardResetCommand());
} }
[Fact] [Fact]
public void BitmapLinearWinSendable() public void BitmapLinearWinSendable()
{ {
_connection.Send(Command.BitmapLinearWin(0, 0, Bitmap.NewMaxSized(), CompressionCode.Uncompressed)); _connection.Send(new BitmapCommand(0, 0, Bitmap.NewMaxSized(), CompressionCode.Uncompressed));
} }
} }

View file

@ -1,2 +1,3 @@
global using Xunit; global using Xunit;
global using ServicePoint; global using ServicePoint;
global using System;

View file

@ -0,0 +1,15 @@
namespace ServicePoint;
public static class ConnectionExtensions
{
public static void Send(this IConnection connection, Packet packet) => connection.SendPacket(packet);
public static void Send(this IConnection connection, Command command) => connection.SendCommand(command);
public static void Send(this IConnection connection, IClearCommand command) => connection.SendPacket(command.AsPacket());
public static void Send(this IConnection connection, IFadeOutCommand command) => connection.SendPacket(command.AsPacket());
public static void Send(this IConnection connection, IBitmapCommand command) => connection.SendPacket(command.AsPacket());
public static void Send(this IConnection connection, IBitVecCommand command) => connection.SendPacket(command.AsPacket());
public static void Send(this IConnection connection, IBrightnessGridCommand command) => connection.SendPacket(command.AsPacket());
public static void Send(this IConnection connection, IHardResetCommand command) => connection.SendPacket(command.AsPacket());
public static void Send(this IConnection connection, ICharGridCommand command) => connection.SendPacket(command.AsPacket());
public static void Send(this IConnection connection, IGlobalBrightnessCommand command) => connection.SendPacket(command.AsPacket());
}

View file

@ -0,0 +1,14 @@
namespace ServicePoint;
public sealed class FakeConnection() : IConnection
{
public void SendCommand(Command command)
{
SendPacket(command.AsPacket());
}
public void SendPacket(Packet packet)
{
_ = packet.AsBytes();
}
}

View file

@ -23,7 +23,17 @@
<PublishRepositoryUrl>true</PublishRepositoryUrl> <PublishRepositoryUrl>true</PublishRepositoryUrl>
</PropertyGroup> </PropertyGroup>
<!-- generate C# bindings --> <PropertyGroup>
<InvariantGlobalization>true</InvariantGlobalization>
<IsAotCompatible>true</IsAotCompatible>
</PropertyGroup>
<ItemGroup>
<DirectPInvoke Include="servicepoint_binding_uniffi" />
<NativeLibrary Include="libservicepoint_binding_uniffi.so" />
</ItemGroup>
<!-- generate library to link against -->
<Target Name="BuildBindings" Condition="'$(Configuration)'=='Release'" BeforeTargets="PrepareForBuild"> <Target Name="BuildBindings" Condition="'$(Configuration)'=='Release'" BeforeTargets="PrepareForBuild">
<Exec Command="cargo build--manifest-path ../servicepoint-binding-uniffi/Cargo.toml --release"/> <Exec Command="cargo build--manifest-path ../servicepoint-binding-uniffi/Cargo.toml --release"/>
</Target> </Target>
@ -33,14 +43,18 @@
<!-- include native binary in output --> <!-- include native binary in output -->
<ItemGroup Condition="'$(Configuration)'=='Debug'"> <ItemGroup Condition="'$(Configuration)'=='Debug'">
<Content Include="../target/debug/libservicepoint_binding_uniffi.so" CopyToOutputDirectory="Always"> <Content Include="../servicepoint-binding-uniffi/target/debug/libservicepoint_binding_uniffi.so" CopyToOutputDirectory="Always">
<Link>libservicepoint_binding_uniffi.so</Link> <Link>libservicepoint_binding_uniffi.so</Link>
</Content> </Content>
<!-- Specify the path to search for libraries for AOT -->
<LinkerArg Include="-L../servicepoint-binding-uniffi/target/debug/libservicepoint_binding_uniffi.so" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(Configuration)'=='Release'"> <ItemGroup Condition="'$(Configuration)'=='Release'">
<Content Include="../target/release/libservicepoint_binding_uniffi.so" CopyToOutputDirectory="Always"> <Content Include="../servicepoint-binding-uniffi/target/release/libservicepoint_binding_uniffi.so" CopyToOutputDirectory="Always">
<Link>libservicepoint_binding_uniffi.so</Link> <Link>libservicepoint_binding_uniffi.so</Link>
</Content> </Content>
<!-- Specify the path to search for libraries for AOT -->
<LinkerArg Include="-L../servicepoint-binding-uniffi/target/release/libservicepoint_binding_uniffi.so" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

File diff suppressed because it is too large Load diff

View file

@ -2,11 +2,11 @@
"nodes": { "nodes": {
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1749494155, "lastModified": 1749857119,
"narHash": "sha256-FG4DEYBpROupu758beabUk9lhrblSf5hnv84v1TLqMc=", "narHash": "sha256-tG5xUn3hFaPpAHYIvr2F88b+ovcIO5k1HqajFy7ZFPM=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "88331c17ba434359491e8d5889cce872464052c2", "rev": "5f4f306bea96741f1588ea4f450b2a2e29f42b98",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -1,12 +1,12 @@
{ {
description = "Flake for the servicepoint library."; description = "C# bindings for the servicepoint library.";
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
}; };
outputs = outputs =
inputs@{ {
self, self,
nixpkgs, nixpkgs,
}: }:
@ -32,12 +32,11 @@
devShells = forAllSystems ( devShells = forAllSystems (
{ pkgs, system }: { pkgs, system }:
{ {
default = pkgs.mkShell rec { default = pkgs.mkShell {
packages = with pkgs; [ packages = with pkgs; [
(pkgs.symlinkJoin (pkgs.symlinkJoin {
{
name = "rust-toolchain"; name = "rust-toolchain";
paths = with pkgs; [ paths = [
rustc rustc
cargo cargo
rustPlatform.rustcSrc rustPlatform.rustcSrc
@ -53,8 +52,11 @@
xe xe
xz xz
pkg-config pkg-config
gdb
zlib
]; ];
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}"; RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1;
}; };
} }
); );

@ -1 +1 @@
Subproject commit 635fef024437d29b922999fe1d8bd7e6e30524a9 Subproject commit ecb4f51997d4f2c3f5bd66033ef13992d88c139c