Compare commits

..

No commits in common. "e7eef31b7e77d7affb51fd156275b07df261831a" and "0d715cf823b52c82474c83cb92139645fdf3c166" have entirely different histories.

6 changed files with 50 additions and 143 deletions

View file

@ -19,7 +19,7 @@ namespace Proculite.GpioRest.Controllers
if (!ModelState.IsValid) if (!ModelState.IsValid)
return BadRequest(); return BadRequest();
return Ok(_gpioService.PinModelOfPin(pinNumber)); return Ok(_gpioService.PinValueModelOfPin(pinNumber));
} }
[HttpGet("pin-value")] [HttpGet("pin-value")]
@ -46,24 +46,6 @@ namespace Proculite.GpioRest.Controllers
return Ok(_gpioService.SetPinLowReturning(pinNumber)); return Ok(_gpioService.SetPinLowReturning(pinNumber));
} }
[HttpPut("pin-value/{pinNumber}/{pinValue}")]
public IActionResult SetPinValue(int pinNumber, double pinValue)
{
if (!ModelState.IsValid)
return BadRequest();
return Ok(_gpioService.SetPinReturning(pinNumber, pinValue));
}
[HttpPut("pin-frequency/{pinNumber}/{pinFrequency}")]
public IActionResult SetPinFrequency(int pinNumber, int pinFrequency)
{
if (!ModelState.IsValid)
return BadRequest();
return Ok(_gpioService.SetPinFrequencyReturning(pinNumber, pinFrequency));
}
[HttpPost("pin-value/toggle/{pinNumber}")] [HttpPost("pin-value/toggle/{pinNumber}")]
public IActionResult TogglePin(int pinNumber) public IActionResult TogglePin(int pinNumber)
{ {

View file

@ -1,13 +0,0 @@
using System.Device.Gpio;
using System.Text.Json.Serialization;
namespace Proculite.GpioRest.Models
{
public class PinModel(int number, double value, int frequency)
{
public int Number { get; set; } = number;
public double Value { get; set; } = value;
public int Frequency { get; set; } = frequency;
}
}

View file

@ -0,0 +1,14 @@
using System.Device.Gpio;
using System.Text.Json.Serialization;
namespace Proculite.GpioRest.Models
{
public class PinValueModel(int pinNumber, PinValue pinValue)
{
public int PinNumber { get; set; } = pinNumber;
[JsonIgnore]
public PinValue PinValue { get; set; } = pinValue;
public int Value => PinValue == PinValue.High ? 1 : 0;
}
}

View file

@ -7,7 +7,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Iot.Device.Bindings" Version="3.2.0" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.7" /> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.7" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
<PackageReference Include="System.Device.Gpio" Version="3.2.0" /> <PackageReference Include="System.Device.Gpio" Version="3.2.0" />

View file

@ -1,6 +1,5 @@
using System.Device.Gpio; using System.Device.Gpio;
using Proculite.GpioRest.Models; using Proculite.GpioRest.Models;
using Proculite.GpioRest.Wrappers;
namespace Proculite.GpioRest.Services namespace Proculite.GpioRest.Services
{ {
@ -8,7 +7,7 @@ namespace Proculite.GpioRest.Services
{ {
public readonly ILogger<GpioService> _logger; public readonly ILogger<GpioService> _logger;
private readonly int[] _pins; private readonly int[] _pins;
private readonly Dictionary<int, PwmWrapper> _pwmPins = new(); private readonly GpioController _gpioController;
public GpioService(ILogger<GpioService> logger, IConfiguration configuration) public GpioService(ILogger<GpioService> logger, IConfiguration configuration)
{ {
@ -19,84 +18,80 @@ namespace Proculite.GpioRest.Services
.Select(pin => pin.Get<int>()) .Select(pin => pin.Get<int>())
.ToArray(); .ToArray();
_gpioController = new GpioController();
SetupPins(); SetupPins();
} }
private void SetupPins() private void SetupPins()
{ {
_logger.LogInformation("Setting up {PinCount} pins.", _pins.Length); _logger.LogInformation("Setting up {PinCount} pins.", _pins.Length);
PinMode pinMode = PinMode.Output;
foreach (var pin in _pins) foreach (var pin in _pins)
{ {
_pwmPins[pin] = new PwmWrapper(pin); if (_gpioController.IsPinOpen(pin))
{
_logger.LogWarning("Pin number {Pin} is already open.", pin);
continue;
}
if (!_gpioController.IsPinModeSupported(pin, pinMode))
{
_logger.LogWarning("Pin number {Pin} does not support {PinMode}", pin, pinMode);
}
_gpioController.OpenPin(pin, pinMode, PinValue.Low);
} }
} }
public PinModel PinModelOfPin(int pinNumber) public PinValue CurrentPinValue(int pinNumber)
{ {
PwmWrapper pwmWrapper = _pwmPins[pinNumber]; return _gpioController.Read(pinNumber);
return new PinModel(pinNumber, pwmWrapper.Value, pwmWrapper.Frequency);
} }
public PinModel[] StateOfAllPins() public PinValueModel PinValueModelOfPin(int pinNumber)
{ {
return _pins.Select(PinModelOfPin).ToArray(); return new PinValueModel(pinNumber, _gpioController.Read(pinNumber));
}
public PinValueModel[] StateOfAllPins()
{
return _pins.Select(PinValueModelOfPin).ToArray();
} }
public void SetPinHigh(int pinNumber) public void SetPinHigh(int pinNumber)
{ {
_pwmPins[pinNumber].SetHigh(); _gpioController.Write(pinNumber, PinValue.High);
} }
public void SetPinLow(int pinNumber) public void SetPinLow(int pinNumber)
{ {
_pwmPins[pinNumber].SetLow(); _gpioController.Write(pinNumber, PinValue.Low);
} }
public void TogglePin(int pinNumber) public void TogglePin(int pinNumber)
{ {
double currentValue = _pwmPins[pinNumber].Value; PinValue currentValue = CurrentPinValue(pinNumber);
_pwmPins[pinNumber].Value = currentValue > 0 ? 0 : 1; PinValue newValue = currentValue == PinValue.High ? PinValue.Low : PinValue.High;
_gpioController.Write(pinNumber, newValue);
} }
public void SetPin(int pinNumber, double pinValue) public PinValueModel SetPinHighReturning(int pinNumber)
{
_pwmPins[pinNumber].Value = pinValue;
}
public void SetPinFrequency(int pinNumber, int pinFrequency)
{
_pwmPins[pinNumber].Frequency = pinFrequency;
}
public PinModel SetPinHighReturning(int pinNumber)
{ {
SetPinHigh(pinNumber); SetPinHigh(pinNumber);
return PinModelOfPin(pinNumber); return PinValueModelOfPin(pinNumber);
} }
public PinModel SetPinLowReturning(int pinNumber) public PinValueModel SetPinLowReturning(int pinNumber)
{ {
SetPinLow(pinNumber); SetPinLow(pinNumber);
return PinModelOfPin(pinNumber); return PinValueModelOfPin(pinNumber);
} }
public PinModel TogglePinReturning(int pinNumber) public PinValueModel TogglePinReturning(int pinNumber)
{ {
TogglePin(pinNumber); TogglePin(pinNumber);
return PinModelOfPin(pinNumber); return PinValueModelOfPin(pinNumber);
}
public PinModel SetPinReturning(int pinNumber, double pinValue)
{
SetPin(pinNumber, pinValue);
return PinModelOfPin(pinNumber);
}
public PinModel SetPinFrequencyReturning(int pinNumber, int pinFrequency)
{
_pwmPins[pinNumber].Frequency = pinFrequency;
return PinModelOfPin(pinNumber);
} }
} }
} }

View file

@ -1,70 +0,0 @@
using System.Device.Pwm.Drivers;
namespace Proculite.GpioRest.Wrappers
{
public class PwmWrapper
{
private readonly SoftwarePwmChannel _softwarePwmChannel;
private readonly ILogger? _logger;
public int PinNumber { get; }
public double Value
{
get => _softwarePwmChannel.DutyCycle;
set { _softwarePwmChannel.DutyCycle = value; }
}
public int Frequency
{
get => _softwarePwmChannel.Frequency;
set => _softwarePwmChannel.Frequency = value;
}
public PwmWrapper(int pinNumber, ILogger? logger = null)
{
PinNumber = pinNumber;
_softwarePwmChannel = new SoftwarePwmChannel(pinNumber, usePrecisionTimer: true);
_logger = logger;
_softwarePwmChannel.DutyCycle = 0;
_softwarePwmChannel.Start();
}
public void SetValue(double value)
{
LogValue(value);
if (value < 0 || value > 1)
{
LogValueOutOfBounds();
return;
}
_softwarePwmChannel.DutyCycle = value;
}
public void SetHigh()
{
SetValue(1);
}
public void SetLow()
{
SetValue(0);
}
private void LogValue(double value)
{
if (_logger is null)
return;
_logger.LogDebug("New value for pin {PinNumber}: {Value}", PinNumber, value);
}
private void LogValueOutOfBounds()
{
if (_logger is null)
return;
_logger.LogWarning(
"Attempting to set value of pin {PinNumber}, but it's not between 0 and 1.",
PinNumber
);
}
}
}