Files
NightAlert/NightScout/RaspberryPIButtonSource.cs

106 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NightScout.Interfaces;
using Raspberry.IO.GeneralPurpose;
using Raspberry.IO.GeneralPurpose.Behaviors;
namespace NightScout
{
public class RaspberryPIButtonSource : IRaspberryPiButtonSource, IAlerter
{
public event Action<bool> ButtonStateChange;
protected IGpioConnectionDriver PinDriver;
protected GpioOutputBinaryPin ButtonLEDPin;
private static readonly object ledLock = new object();
public RaspberryPIButtonSource(Int32 pinNumber)
: this(pinNumber, new FileGpioConnectionDriver())
{ }
public RaspberryPIButtonSource(Int32 pinNumber, IGpioConnectionDriver driver)
{
//Attempt to monitor the pin
//pinConfiguration = ConnectorPin.P1Pin11.Input().Name("Switch");
//pinConfiguration.Reversed = true;
//pinConfiguration.OnStatusChanged(PinChangeHandler);
//if(pinConfiguration == null)
// Console.WriteLine("null");
//PinDriver = new FileGpioConnectionDriver();
PinDriver = driver;
//var settings = new GpioConnectionSettings { Driver = pinConnectionDriver };
Console.WriteLine("Making new GPIO connection");
//pinConnection = new GpioConnection(settings,pinConfiguration);
//pinConnectionDriver.Allocate(ProcessorPin.Pin17, PinDirection.Input);
//var pinDriver = pinConnectionDriver.In(ConnectorPin.P1Pin11);
var buttonPin = PinDriver.In(ConnectorPin.P1Pin16);
ButtonLEDPin = PinDriver.Out(ConnectorPin.P1Pin22);
Task.Factory.StartNew(() =>
{
Boolean savedState = false;
while (true)
{
//Pin 11 is inverse (always high unless button is pressed)
Boolean state = !(buttonPin.Read());
if (savedState != state)
{
PinChangeHandler(state);
savedState = state;
}
Thread.Sleep(100);
}
});
//Console.WriteLine("Made");
//pinConnection.PinStatusChanged += pinConnection_PinStatusChanged;
}
private void PinChangeHandler(Boolean state)
{
if (ButtonStateChange != null)
ButtonStateChange(state);
}
public void StartAlert()
{
lock (ledLock)
{
ButtonLEDPin.Write(true);
}
}
public void StartUrgentAlert()
{
lock (ledLock)
{
ButtonLEDPin.Write(true);
}
}
public void StartStaleDataAlert()
{
lock (ledLock)
{
ButtonLEDPin.Write(true);
}
}
public void StopAlerts()
{
lock (ledLock)
{
ButtonLEDPin.Write(false);
}
}
}
}