Commit 9744c317 authored by Kim Meiser's avatar Kim Meiser

AnimationTemplate implementiert nun IAnimation. Erster Versuch der Definition der gitlab-ci.yml.

parent 620534ab
Pipeline #437 failed
stages:
- build
- test
restore_job:
stage: build
script:
- 'dotnet restore MarmeLED.sln'
tags: dotnetcore
build_job:
stage: build
script:
- 'dotnet build MarmeLED.sln'
dependencies:
- restore_job
tags: dotnetcore
test_job:
stage: test
script:
- 'dotnet test test\MarmeLED.xUnit\MarmeLED.xUnit.csproj'
dependencies:
- build_job
tags: dotnetcore
\ No newline at end of file
......@@ -16,7 +16,10 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{BD8E744B-FE19-405A-A02D-80794E875B1F}"
ProjectSection(SolutionItems) = preProject
.gitignore = .gitignore
.gitlab-ci.yml = .gitlab-ci.yml
build.cmd = build.cmd
readme.md = readme.md
test.cmd = test.cmd
EndProjectSection
EndProject
Global
......
dotnet restore MarmeLED.sln
dotnet build MarmeLED.sln
\ No newline at end of file
......@@ -11,7 +11,7 @@ M
Mchtest du stattdessen lieber hbsche Animationen bauen und die Netzwerk-Aspekte vorerst nicht im Detail erkunden? Dann bist du hier genau richtig,
denn dann brauchst du MarmeLED.NET.
## Getting Started mit MarmeLED.NET in Visual Studio
## MarmeLED.NET in Visual Studio verwenden
* ffne Visual Studio
* `File` | `New` | `Project`
......
using System;
using System.Collections.Generic;
using MarmeLED.Protocol;
namespace MarmeLED.Animation
{
......@@ -11,7 +13,7 @@ namespace MarmeLED.Animation
/// die kein Bedarf an <seealso cref="IAnimation.BeforeAnimation"/> oder <seealso cref="IAnimation.AfterAnimation"/>
/// haben, sondern nur <seealso cref="IAnimation.GetNextLedStates"/> implementieren möchten.
/// </summary>
public class AnimationTemplate
public abstract class AnimationTemplate : IAnimation
{
/// <summary>
/// Die maximale Anzahl der LEDs im MarmeLED-Strip.
......@@ -30,6 +32,9 @@ namespace MarmeLED.Animation
LedCount = ledCount;
}
/// <inheritdoc />
public abstract IEnumerable<LedState> GetNextLedStates();
/// <summary>
/// Leere Implementierung. Kann bei Bedarf überschrieben werden.
/// </summary>
......
......@@ -7,13 +7,13 @@ namespace MarmeLED.Animation
/// Setzt alle LEDs auf RGB 0,0,0 (schwarz/aus) und kann z.B. zum Zurücksetzen
/// des LED-Strips bzw. zum Löschen vorangegangener Animationen genutzt werden.
/// </summary>
public class ClearAnimation : AnimationTemplate, IAnimation
public class ClearAnimation : AnimationTemplate
{
/// <summary>
/// Setzt alle LEDs auf RGB 0,0,0.
/// </summary>
/// <returns></returns>
public IEnumerable<LedState> GetNextLedStates()
public override IEnumerable<LedState> GetNextLedStates()
{
for (int i = 0; i < LedCount; i++)
{
......
......@@ -2,6 +2,9 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Authors>KimCM</Authors>
<AssemblyVersion>0.9.0.0</AssemblyVersion>
<Version>0.9.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
......
......@@ -2,6 +2,10 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyVersion>0.9.0.0</AssemblyVersion>
<FileVersion>1.9.0.0</FileVersion>
<Version>0.9.0</Version>
<Authors>KimCM</Authors>
</PropertyGroup>
<ItemGroup>
......
......@@ -8,17 +8,17 @@ namespace MarmeLED.Example
/// <summary>
/// Beispiel zur Implementierung einer Animation: Dimmen ändert die Helligkeit der LEDs in kleinen Schritten über die Zeit.
/// </summary>
public class DimmingAnimation : AnimationTemplate, IAnimation
public class DimmingAnimation : AnimationTemplate
{
// Werte unter 20 sind im Strip nicht mehr sichtbar.
// Damit die Animation gefühlt nicht zu lange "dunkel" bleibt, wird minValue auf 20 gesetzt.
private readonly IGenerator dimmer = new LinearUpDownGenerator(minValue: 20, maxValue: 255, stepSize: 0.1m);
private readonly IGenerator dimmer = new LinearUpDownGenerator(minValue: 20, maxValue: 255, stepSize: 0.05m);
/// <summary>
/// Methode zur Ermittlung des nächsten LED-Zustands.
/// </summary>
/// <returns>Gibt den LED-Farbwert in mehr oder weniger intensivem Rot zurück</returns>
public IEnumerable<LedState> GetNextLedStates()
public override IEnumerable<LedState> GetNextLedStates()
{
for (var ledIndex = 0; ledIndex < LedCount; ledIndex++)
{
......
using System;
using System.Collections.Generic;
using System.Text;
namespace MarmeLED.Example.Generator
{
/// <summary>
/// Dieser Generator erzeugt eine Folge von Zahlen die auf einer Bezière-Kurve liegen.
/// </summary>
public class BezierGenerator : IGenerator
{
/// <inheritdoc />
public int Value()
{
// TODO not implemented yet
return 255;
}
}
}
......@@ -5,6 +5,9 @@
<ApplicationIcon />
<OutputType>Library</OutputType>
<StartupObject></StartupObject>
<Version>0.9.0</Version>
<Authors>KimCM</Authors>
<Company>KimCM</Company>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
......
......@@ -7,13 +7,13 @@ namespace MarmeLED.Example
/// <summary>
/// Beispiel zur Implementierung einer Animation: Ein Regenbogen, der über den LED-Strip läuft.
/// </summary>
public class RainbowAnimation : AnimationTemplate, IAnimation
public class RainbowAnimation : AnimationTemplate
{
/// <summary>
/// Gibt nacheinander die Farben des Regenbogens in RGB zurück.
/// </summary>
/// <returns></returns>
public IEnumerable<LedState> GetNextLedStates()
public override IEnumerable<LedState> GetNextLedStates()
{
// TODO KimCM: not implemented yet
for (int i = 0; i < LedCount; i++)
......
......@@ -8,13 +8,13 @@ namespace MarmeLED.Example
/// <summary>
/// Beispiel zur Implementierung einer Animation: Zufällige Farben. Hässliches Ergebnis, aber einfacher Code.
/// </summary>
public class RandomAnimation : AnimationTemplate, IAnimation
public class RandomAnimation : AnimationTemplate
{
/// <summary>
/// Erzeugt eine Animation aus zufälligen Farben.
/// </summary>
/// <returns>Alle LEDs des Strips werden mit zufälligen Farben.</returns>
public IEnumerable<LedState> GetNextLedStates()
public override IEnumerable<LedState> GetNextLedStates()
{
var random = new RandomGenerator();
......
using System.Collections.Generic;
using System.Drawing;
using MarmeLED.Animation;
using MarmeLED.Example.Generator;
using MarmeLED.Protocol;
namespace MarmeLED.Example
{
/// <summary>
/// Beispiel zur Implementierung einer Animation: Farben der Revision 2018
/// </summary>
public class Revision2018Animation : AnimationTemplate
{
private readonly Color green = Color.FromArgb(255, 34, 139, 34);
private readonly Color violet = Color.FromArgb(255, 148, 0, 211);
private readonly IGenerator dimmerViolet = new LinearUpDownGenerator(30, 220, 0.05m);
private readonly IGenerator dimmerGreen = new LinearUpDownGenerator(50, 200, 0.05m);
/// <inheritdoc />
public override IEnumerable<LedState> GetNextLedStates()
{
var line = new List<LedState>();
for (var ledIndex = 0; ledIndex < LedCount; ledIndex++)
{
var color = ledIndex % 12 < 6 ? violet : green;
var state = new LedState(ledIndex, color);
state.SetBrightness(ledIndex % 12 < 6 ? dimmerViolet.Value() : dimmerGreen.Value());
line.Add(state);
}
return line;
}
}
}
\ No newline at end of file
......@@ -15,7 +15,7 @@ namespace MarmeLED.Example
/// Eine gleiche Animation wird auch beim Start des Arduino Uno verwendet,
/// um die Funktionsfähigkeit jeder LED anzuzeigen.
/// </summary>
public class StartupAnimation : AnimationTemplate, IAnimation
public class StartupAnimation : AnimationTemplate
{
/// <summary>
/// Gibt nacheinander die Farben der LEDs in Rot, Gelb und Grün zurück.
......@@ -23,7 +23,7 @@ namespace MarmeLED.Example
/// auf der nächsten LED erscheint, und somit die leuchtende LED auf dem Strip "wandert".
/// </summary>
/// <returns></returns>
public IEnumerable<LedState> GetNextLedStates()
public override IEnumerable<LedState> GetNextLedStates()
{
for (int i = 0; i < LedCount; i++)
for (int j = 0; j < LedCount; j++)
......
using System.Diagnostics;
using System;
using System.Diagnostics;
using System.Drawing;
namespace MarmeLED.Protocol
......@@ -100,6 +101,17 @@ namespace MarmeLED.Protocol
Blue = color.B;
}
/// <summary>
/// Setzt die Helligkeit der aktuellen Farbe, z.B. 0 für dunkel oder 255 für hell.
/// </summary>
/// <param name="brightness">Die Helligkeit von 0..255.</param>
public void SetBrightness(int brightness)
{
Red = Multiply(Red, brightness);
Green = Multiply(Green, brightness);
Blue = Multiply(Blue, brightness);
}
public bool Equals(LedState other)
{
return Position == other.Position
......@@ -108,6 +120,11 @@ namespace MarmeLED.Protocol
&& Blue == other.Blue;
}
private byte Multiply(byte b, int brightness)
{
return (byte)(b * brightness / 255);
}
/// <inheritdoc />
public override bool Equals(object obj)
{
......
......@@ -2,6 +2,9 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Version>0.9.0</Version>
<Authors>KimCM</Authors>
<Company>KimCM</Company>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
......
dotnet test test\MarmelED.xUnit\MarmeLED.xUnit.csproj
\ No newline at end of file
......@@ -56,5 +56,22 @@ namespace MarmeLED.xUnit
}
}
[Fact]
public void Revision2018Animation()
{
try
{
using (var marmeLeds = new MarmeLedController(localUdpPort: 11000, controllerHostnameOrIp: "marmeled", controllerUdpPort: 8888, ledCount: 78))
{
marmeLeds.Connect();
marmeLeds.Animate(new Revision2018Animation(), repeat: 1);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}
\ No newline at end of file
......@@ -23,7 +23,7 @@ namespace MarmeLED.xUnit.MarmeLED.Examples
Assert.Equal(0, state.Green);
Assert.Equal(0, state.Blue);
if (i % 10 == 0)
if (i % 50 == 0)
{
Assert.NotEqual(previousRed, state.Red);
previousRed = state.Red;
......
......@@ -32,7 +32,7 @@ namespace MarmeLED.xUnit.MarmeLED.Protocol
[Fact]
public void ConstructorByteTest()
{
var uut = new LedState((byte)1, (byte)2, (byte)3, (byte)4);
var uut = new LedState((byte) 1, (byte) 2, (byte) 3, (byte) 4);
Assert.Equal(1, uut.Position);
Assert.Equal(2, uut.Red);
......@@ -51,7 +51,7 @@ namespace MarmeLED.xUnit.MarmeLED.Protocol
Assert.Equal(3, uut.Green);
Assert.Equal(4, uut.Blue);
}
[Fact]
public void FromTest()
{
......@@ -64,6 +64,22 @@ namespace MarmeLED.xUnit.MarmeLED.Protocol
Assert.Equal(4, uut.Blue);
}
[Fact]
public void SetBrightnessTest()
{
var uut = new LedState(0, 254, 128, 64);
uut.SetBrightness(255);
Assert.Equal(254, uut.Red);
Assert.Equal(128, uut.Green);
Assert.Equal(64, uut.Blue);
uut.SetBrightness(128);
Assert.Equal(127, uut.Red);
Assert.Equal(64, uut.Green);
Assert.Equal(32, uut.Blue);
}
[Fact]
public void EqualsTest()
{
......@@ -81,10 +97,10 @@ namespace MarmeLED.xUnit.MarmeLED.Protocol
{
var template1 = new LedState(1, 2, 3, 4);
var template2 = new LedState(1, 2, 3, 4);
Assert.Equal(template1.GetHashCode(), template1.GetHashCode());
Assert.Equal(template2.GetHashCode(), template2.GetHashCode());
Assert.NotEqual(template1.GetHashCode(), template2.GetHashCode());
}
}
}
}
\ No newline at end of file
......@@ -6,8 +6,9 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.6.2" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.console" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
</ItemGroup>
......@@ -22,4 +23,10 @@
<ProjectReference Include="..\..\src\MarmeLED.Example\MarmeLED.Example.csproj" />
<ProjectReference Include="..\..\src\MarmeLED.Protocol\MarmeLED.Protocol.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Web.RegularExpressions">
<HintPath>..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7\System.Web.RegularExpressions.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment