Skip to content

Commit

Permalink
Properly calculate analog pin indices
Browse files Browse the repository at this point in the history
  • Loading branch information
pgrawehr committed Apr 27, 2020
1 parent 64d9543 commit 698d2ca
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/devices/Arduino/ArduinoAnalogDriver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ internal class ArduinoAnalogDriver : AnalogControllerDriver
private readonly List<SupportedPinConfiguration> _supportedPinConfigurations;
private readonly Dictionary<int, ValueChangeEventHandler> _callbacks;
private int _autoReportingReferenceCount;
private int _firstAnalogPin;

/// <summary>
/// List of analog pins. The index is the analog number, the value the digital pin number.
/// I.e for an Arduino Uno, pin A0 has entry 0 as 14
/// </summary>
private List<int> _analogPins;

public ArduinoAnalogDriver(ArduinoBoard board,
List<SupportedPinConfiguration> supportedPinConfigurations)
Expand All @@ -23,18 +28,20 @@ public ArduinoAnalogDriver(ArduinoBoard board,
_supportedPinConfigurations = supportedPinConfigurations ?? throw new ArgumentNullException(nameof(supportedPinConfigurations));
_callbacks = new Dictionary<int, ValueChangeEventHandler>();
_autoReportingReferenceCount = 0;
_analogPins = new List<int>();
PinCount = _supportedPinConfigurations.Count;
VoltageReference = 5.0;
// Number of the first analog pin. Serves for converting between logical A0-based pin numbers and digital pin numbers.
// The value of this is 14 for most arduinos.
var firstPin = _supportedPinConfigurations.FirstOrDefault(x => x.PinModes.Contains(SupportedMode.ANALOG_INPUT));
if (firstPin != null)
var collection = _supportedPinConfigurations.Where(x => x.PinModes.Contains(SupportedMode.ANALOG_INPUT));
if (!collection.Any())
{
_firstAnalogPin = firstPin.Pin;
throw new NotSupportedException("No analog pins found or Firmata firmware has no analog pin support");
}
else

foreach (var pin in collection)
{
throw new NotSupportedException("No analog pins found or Firmata firmware has no analog pin support");
_analogPins.Add(pin.Pin);
}
}

Expand All @@ -45,12 +52,12 @@ public override int PinCount

protected override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber)
{
return pinNumber - _firstAnalogPin;
return pinNumber - _analogPins[pinNumber];
}

protected override int ConvertLogicalNumberingSchemeToPinNumber(int logicalPinNumber)
{
return logicalPinNumber + _firstAnalogPin;
return logicalPinNumber + _analogPins[logicalPinNumber];
}

public override bool SupportsAnalogInput(int pinNumber)
Expand Down

0 comments on commit 698d2ca

Please sign in to comment.