Compare commits
No commits in common. "e7eef31b7e77d7affb51fd156275b07df261831a" and "0d715cf823b52c82474c83cb92139645fdf3c166" have entirely different histories.
e7eef31b7e
...
0d715cf823
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
14
Proculite.GpioRest/Models/PinValueModel.cs
Normal file
14
Proculite.GpioRest/Models/PinValueModel.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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" />
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue