private Dictionary<int, bool> pinStates = new Dictionary<int, bool>();
private void Session_OnDigitalStateReceived(object sender, FirmataEventArgs<DigitalPortState> eventArgs)
{
var basePin = eventArgs.Value.Port * 8;
for (var portPin = 0; portPin < 8; portPin++)
{
var fullPin = basePin + portPin;
var isSet = eventArgs.Value.IsSet(portPin);
if (!pinStates.ContainsKey(fullPin))
{
pinStates.Add(fullPin, !isSet);
}
if (isSet == pinStates[fullPin]) continue;
pinStates[fullPin] = isSet;
Console.WriteLine($"Port {eventArgs.Value.Port}, Pin {portPin} (Pin #{fullPin}) changed to {isSet}");
}
}
using Solid.Arduino;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Solid.Arduino.Firmata;
namespace FermataTest
{
public class Class1
{
private readonly ArduinoSession _session;
private readonly Dictionary<int, bool> _pinStates = new Dictionary<int, bool>();
private readonly Dictionary<int, PinMode> _pinModes = new Dictionary<int, PinMode>();
public Class1()
{
var connection = GetConnection();
_session = new ArduinoSession(connection);
SubscribeDigitalPin(2, PinMode.InputPullup);
SubscribeDigitalPin(3, PinMode.InputPullup);
SubscribeDigitalPin(4, PinMode.InputPullup);
SubscribeDigitalPin(5, PinMode.InputPullup);
SubscribeDigitalPin(6, PinMode.InputPullup);
SubscribeDigitalPin(7, PinMode.InputPullup);
SubscribeDigitalPin(8, PinMode.InputPullup);
SubscribeDigitalPin(9, PinMode.InputPullup);
SubscribeDigitalPin(10, PinMode.InputPullup);
SubscribeDigitalPin(11, PinMode.InputPullup);
SubscribeDigitalPin(12, PinMode.InputPullup);
SubscribeDigitalPin(13, PinMode.InputPullup);
_session.DigitalStateReceived += Session_OnDigitalStateReceived;
Console.ReadLine();
_session.Dispose();
connection.Dispose();
}
public void SubscribeDigitalPin(int pin, PinMode mode)
{
_session.SetDigitalPinMode(pin, mode);
_pinModes[pin] = mode;
var port = pin / 8;
_session.SetDigitalReportMode(port, true);
}
private void Session_OnDigitalStateReceived(object sender, FirmataEventArgs<DigitalPortState> eventArgs)
{
var basePin = eventArgs.Value.Port * 8;
for (var portPin = 0; portPin < 8; portPin++)
{
var fullPin = basePin + portPin;
if (!_pinModes.ContainsKey(fullPin))
{
continue;
}
var pinMode = _pinModes[fullPin];
var pressedValue = pinMode != PinMode.InputPullup;
var isSet = eventArgs.Value.IsSet(portPin) == pressedValue;
if (!_pinStates.ContainsKey(fullPin))
{
_pinStates.Add(fullPin, false);
}
if (isSet == _pinStates[fullPin]) continue;
_pinStates[fullPin] = isSet;
Console.WriteLine($"Port {eventArgs.Value.Port}, Pin {portPin} (Pin #{fullPin}) changed to {isSet}");
}
}
private static ISerialConnection GetConnection()
{
Console.WriteLine("Searching Arduino connection...");
var connection = EnhancedSerialConnection.Find();
Console.WriteLine(connection == null
? "No connection found. Make shure your Arduino board is attached to a USB port."
: $"Connected to port {connection.PortName} at {connection.BaudRate} baud.");
return connection;
}
}
}