grovepi/Software/CSharp/GrovePi/Sensors/ChainableRgbLed.cs
2025-03-21 16:04:17 +01:00

75 lines
No EOL
2.6 KiB
C#

using System;
namespace GrovePi.Sensors
{
public interface IChainableRgbLed
{
IChainableRgbLed Initialise(byte numberOfLeds);
IChainableRgbLed StoreColor(byte red, byte green, byte blue);
IChainableRgbLed Test(byte numberOfLeds, byte testColor);
IChainableRgbLed SetPattern(byte pattern, byte led);
IChainableRgbLed Mudulo(byte offset, byte divisor);
IChainableRgbLed SetLevel(byte level, bool reverse);
}
internal class ChainableRgbLed : IChainableRgbLed
{
public const byte StoreColorCommandAddress = 90;
public const byte InitialiseCommandAddress = 91;
public const byte TestCommandAddress = 92;
public const byte SetPatternCommandAddress = 93;
public const byte SetModuloCommandAddress = 94;
public const byte SetLevelCommmandAddress = 95;
private readonly GrovePi _device;
private readonly Pin _pin;
internal ChainableRgbLed(GrovePi device, Pin pin)
{
if (device == null) throw new ArgumentNullException(nameof(device));
_device = device;
_pin = pin;
}
public IChainableRgbLed SetLevel(byte level, bool reverse)
{
var buffer = new[] {level, (byte) _pin, level, reverse ? (byte) 1 : (byte) 0};
_device.DirectAccess.Write(buffer);
return this;
}
public IChainableRgbLed Initialise(byte numberOfLeds)
{
var buffer = new[] {InitialiseCommandAddress, (byte) _pin, numberOfLeds, Constants.Unused};
_device.DirectAccess.Write(buffer);
return this;
}
public IChainableRgbLed StoreColor(byte red, byte green, byte blue)
{
var buffer = new[] {StoreColorCommandAddress, red, green, blue};
_device.DirectAccess.Write(buffer);
return this;
}
public IChainableRgbLed Test(byte numberOfLeds, byte testColor)
{
var buffer = new[] {TestCommandAddress, (byte) _pin, numberOfLeds, testColor};
_device.DirectAccess.Write(buffer);
return this;
}
public IChainableRgbLed SetPattern(byte pattern, byte led)
{
var buffer = new[] {SetPatternCommandAddress, (byte) _pin, pattern, led};
_device.DirectAccess.Write(buffer);
return this;
}
public IChainableRgbLed Mudulo(byte offset, byte divisor)
{
var buffer = new[] {SetModuloCommandAddress, (byte) _pin, offset, divisor};
_device.DirectAccess.Write(buffer);
return this;
}
}
}