Skip to content

Commit 280f9a9

Browse files
authored
Create replacement for now lacking physical-to-logical pin mapping (#2435)
* Move class (but not namespace) to prevent circular dependency later * A first draft. Looks neater than with ChatGPT. Obviously. * Design looks ok, now need to test this * Add tests for new class * Remove remains of ConvertPinNumberToLogicalNumberingScheme * Remove obsolete method from bindings as well * Some minor findings * Review findings (improve name)
1 parent 457553a commit 280f9a9

39 files changed

+263
-369
lines changed

src/System.Device.Gpio.Tests/MockableGpioDriver.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,6 @@ public void FireEventHandler(int forPin, PinEventTypes eventTypes)
2727
_event?.Invoke(this, new PinValueChangedEventArgs(eventTypes, forPin));
2828
}
2929

30-
public abstract int ConvertPinNumberToLogicalNumberingSchemeEx(int pinNumber);
31-
32-
protected override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber)
33-
{
34-
return ConvertPinNumberToLogicalNumberingSchemeEx(pinNumber);
35-
}
36-
3730
public abstract void OpenPinEx(int pinNumber);
3831

3932
protected override void OpenPin(int pinNumber)

src/System.Device.Gpio/CompatibilitySuppressions.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,18 @@
2929
<Right>lib/net8.0/System.Device.Gpio.dll</Right>
3030
<IsBaselineSuppression>true</IsBaselineSuppression>
3131
</Suppression>
32+
<Suppression>
33+
<DiagnosticId>CP0002</DiagnosticId>
34+
<Target>M:System.Device.Gpio.GpioController.GetLogicalPinNumber(System.Int32)</Target>
35+
<Left>lib/net8.0/System.Device.Gpio.dll</Left>
36+
<Right>lib/net8.0/System.Device.Gpio.dll</Right>
37+
<IsBaselineSuppression>true</IsBaselineSuppression>
38+
</Suppression>
39+
<Suppression>
40+
<DiagnosticId>CP0002</DiagnosticId>
41+
<Target>M:System.Device.Gpio.GpioDriver.ConvertPinNumberToLogicalNumberingScheme(System.Int32)</Target>
42+
<Left>lib/net8.0/System.Device.Gpio.dll</Left>
43+
<Right>lib/net8.0/System.Device.Gpio.dll</Right>
44+
<IsBaselineSuppression>true</IsBaselineSuppression>
45+
</Suppression>
3246
</Suppressions>

src/System.Device.Gpio/System/Device/Gpio/Drivers/LibGpiodDriver.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,6 @@ private bool IsListeningEvent(int pinNumber)
218218
return _pinNumberToEventHandler.ContainsKey(pinNumber);
219219
}
220220

221-
/// <inheritdoc/>
222-
protected internal override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber) =>
223-
throw ExceptionHelper.GetPlatformNotSupportedException(ExceptionResource.ConvertPinNumberingSchemaError);
224-
225221
/// <inheritdoc/>
226222
protected internal override PinMode GetPinMode(int pinNumber)
227223
{

src/System.Device.Gpio/System/Device/Gpio/Drivers/LibGpiodV2Driver.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,6 @@ public static IList<GpioChipInfo> GetAvailableChips()
8787
return ret;
8888
}
8989

90-
/// <inheritdoc/>
91-
protected internal override int ConvertPinNumberToLogicalNumberingScheme(int lineOffset)
92-
{
93-
throw new NotSupportedException($"{nameof(LibGpiodV2Driver)} uses GPIO line numbering. For more information please refer to " +
94-
$"https://docs.kernel.org/driver-api/gpio/using-gpio.html or consider using the gpioinfo cmd line tool provided by libgpiod to " +
95-
$"find out more about present GPIO lines on the system");
96-
}
97-
9890
/// <inheritdoc/>
9991
/// <remarks>This only requests the line for it to be reserved and the consumer to be set.</remarks>
10092
protected internal override void OpenPin(int lineOffset)

src/System.Device.Gpio/System/Device/Gpio/Drivers/RaspberryPi3Driver.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,7 @@ private GpioDriver InternalDriver
176176
/// <inheritdoc/>
177177
protected internal override void ClosePin(int pinNumber) => InternalDriver.ClosePin(pinNumber);
178178

179-
/// <inheritdoc/>
180-
protected internal override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber)
181-
{
182-
return InternalDriver.ConvertPinNumberToLogicalNumberingScheme(pinNumber);
183-
}
184-
185-
/// <inheritdoc/>
179+
/// <inheritdoc />
186180
protected internal override PinMode GetPinMode(int pinNumber) => InternalDriver.GetPinMode(pinNumber);
187181

188182
/// <inheritdoc/>

src/System.Device.Gpio/System/Device/Gpio/Drivers/RaspberryPi3LinuxDriver.cs

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -65,47 +65,6 @@ private void ValidatePinNumber(int pinNumber)
6565
}
6666
}
6767

68-
/// <summary>
69-
/// Converts a board pin number to the driver's logical numbering scheme.
70-
/// </summary>
71-
/// <param name="pinNumber">The board pin number to convert.</param>
72-
/// <returns>The pin number in the driver's logical numbering scheme.</returns>
73-
protected internal override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber)
74-
{
75-
return pinNumber switch
76-
{
77-
3 => 2,
78-
5 => 3,
79-
7 => 4,
80-
8 => 14,
81-
10 => 15,
82-
11 => 17,
83-
12 => 18,
84-
13 => 27,
85-
15 => 22,
86-
16 => 23,
87-
18 => 24,
88-
19 => 10,
89-
21 => 9,
90-
22 => 25,
91-
23 => 11,
92-
24 => 8,
93-
26 => 7,
94-
27 => 0,
95-
28 => 1,
96-
29 => 5,
97-
31 => 6,
98-
32 => 12,
99-
33 => 13,
100-
35 => 19,
101-
36 => 16,
102-
37 => 26,
103-
38 => 20,
104-
40 => 21,
105-
_ => throw new ArgumentException($"Board (header) pin {pinNumber} is not a GPIO pin on the {GetType().Name} device.", nameof(pinNumber))
106-
};
107-
}
108-
10968
/// <summary>
11069
/// Adds a handler for a pin value changed event.
11170
/// </summary>

src/System.Device.Gpio/System/Device/Gpio/Drivers/RaspberryPiCM3Driver.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,4 @@ internal class RaspberryPiCm3Driver : RaspberryPi3LinuxDriver
1212
/// Raspberry CM3 has 48 GPIO pins.
1313
/// </summary>
1414
protected internal override int PinCount => 48;
15-
16-
/// <summary>
17-
/// Converts a board pin number to the driver's logical numbering scheme.
18-
/// </summary>
19-
/// <param name="pinNumber">The board pin number to convert.</param>
20-
/// <returns>The pin number in the driver's logical numbering scheme.</returns>
21-
protected internal override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber)
22-
{
23-
// CM3 has no physical numbering scheme
24-
return pinNumber;
25-
}
2615
}

src/System.Device.Gpio/System/Device/Gpio/Drivers/SysFsDriver.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,6 @@ private static GpioChipInfo GetChipInfoForName(string name)
198198
/// </summary>
199199
protected internal override int PinCount => throw new PlatformNotSupportedException("This driver is generic so it can not enumerate how many pins are available.");
200200

201-
/// <summary>
202-
/// Converts a board pin number to the driver's logical numbering scheme.
203-
/// </summary>
204-
/// <param name="pinNumber">The board pin number to convert.</param>
205-
/// <returns>The pin number in the driver's logical numbering scheme.</returns>
206-
protected internal override int ConvertPinNumberToLogicalNumberingScheme(int pinNumber) => throw new PlatformNotSupportedException("This driver is generic so it can not perform conversions between pin numbering schemes.");
207-
208201
/// <summary>
209202
/// Opens a pin in order for it to be ready to use.
210203
/// This retains the pin direction, but if it is output, the value will always be low after open.

src/System.Device.Gpio/System/Device/Gpio/GpioController.cs

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,6 @@ private IEnumerable<GpioPin> OpenPins
7676
}
7777
}
7878

79-
/// <summary>
80-
/// Gets the logical pin number in the controller's numbering scheme.
81-
/// </summary>
82-
/// <param name="pinNumber">The pin number</param>
83-
/// <returns>The logical pin number in the controller's numbering scheme.</returns>
84-
protected virtual int GetLogicalPinNumber(int pinNumber)
85-
{
86-
return pinNumber;
87-
}
88-
8979
/// <summary>
9080
/// Opens a pin in order for it to be ready to use.
9181
/// The driver attempts to open the pin without changing its mode or value.
@@ -110,8 +100,7 @@ public GpioPin OpenPin(int pinNumber)
110100
/// <param name="pinNumber">The pin number in the controller's numbering scheme.</param>
111101
protected virtual void OpenPinCore(int pinNumber)
112102
{
113-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
114-
_driver.OpenPin(logicalPinNumber);
103+
_driver.OpenPin(pinNumber);
115104
}
116105

117106
/// <summary>
@@ -165,8 +154,7 @@ public void ClosePin(int pinNumber)
165154
/// <param name="pinNumber">The pin number in the controller's numbering scheme.</param>
166155
protected virtual void ClosePinCore(int pinNumber)
167156
{
168-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
169-
_driver.ClosePin(logicalPinNumber);
157+
_driver.ClosePin(pinNumber);
170158
_gpioPins.TryRemove(pinNumber, out _);
171159
}
172160

@@ -182,19 +170,18 @@ public virtual void SetPinMode(int pinNumber, PinMode mode)
182170
throw new InvalidOperationException($"Can not set a mode to pin {pinNumber} because it is not open.");
183171
}
184172

185-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
186173
if (!IsPinModeSupported(pinNumber, mode))
187174
{
188175
throw new InvalidOperationException($"Pin {pinNumber} does not support mode {mode}.");
189176
}
190177

191178
if (_openPins.TryGetValue(pinNumber, out var desired) && desired.HasValue)
192179
{
193-
_driver.SetPinMode(logicalPinNumber, mode, desired.Value);
180+
_driver.SetPinMode(pinNumber, mode, desired.Value);
194181
}
195182
else
196183
{
197-
_driver.SetPinMode(logicalPinNumber, mode);
184+
_driver.SetPinMode(pinNumber, mode);
198185
}
199186
}
200187

@@ -210,8 +197,7 @@ public virtual PinMode GetPinMode(int pinNumber)
210197
throw new InvalidOperationException($"Can not get the mode of pin {pinNumber} because it is not open.");
211198
}
212199

213-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
214-
return _driver.GetPinMode(logicalPinNumber);
200+
return _driver.GetPinMode(pinNumber);
215201
}
216202

217203
/// <summary>
@@ -242,8 +228,7 @@ private void CheckDriverValid()
242228
public virtual bool IsPinModeSupported(int pinNumber, PinMode mode)
243229
{
244230
CheckDriverValid();
245-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
246-
return _driver.IsPinModeSupported(logicalPinNumber, mode);
231+
return _driver.IsPinModeSupported(pinNumber, mode);
247232
}
248233

249234
/// <summary>
@@ -258,8 +243,7 @@ public virtual PinValue Read(int pinNumber)
258243
throw new InvalidOperationException($"Can not read from pin {pinNumber} because it is not open.");
259244
}
260245

261-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
262-
return _driver.Read(logicalPinNumber);
246+
return _driver.Read(pinNumber);
263247
}
264248

265249
/// <summary>
@@ -288,16 +272,14 @@ public virtual void Write(int pinNumber, PinValue value)
288272
throw new InvalidOperationException($"Can not write to pin {pinNumber} because it is not open.");
289273
}
290274

291-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
292-
293275
_openPins[pinNumber] = value;
294276

295-
if (_driver.GetPinMode(logicalPinNumber) != PinMode.Output)
277+
if (_driver.GetPinMode(pinNumber) != PinMode.Output)
296278
{
297279
return;
298280
}
299281

300-
_driver.Write(logicalPinNumber, value);
282+
_driver.Write(pinNumber, value);
301283
}
302284

303285
/// <summary>
@@ -327,8 +309,7 @@ public virtual WaitForEventResult WaitForEvent(int pinNumber, PinEventTypes even
327309
throw new InvalidOperationException($"Can not wait for events from pin {pinNumber} because it is not open.");
328310
}
329311

330-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
331-
return _driver.WaitForEvent(logicalPinNumber, eventTypes, cancellationToken);
312+
return _driver.WaitForEvent(pinNumber, eventTypes, cancellationToken);
332313
}
333314

334315
/// <summary>
@@ -358,8 +339,7 @@ public virtual ValueTask<WaitForEventResult> WaitForEventAsync(int pinNumber, Pi
358339
throw new InvalidOperationException($"Can not wait for events from pin {pinNumber} because it is not open.");
359340
}
360341

361-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
362-
return _driver.WaitForEventAsync(logicalPinNumber, eventTypes, token);
342+
return _driver.WaitForEventAsync(pinNumber, eventTypes, token);
363343
}
364344

365345
/// <summary>
@@ -375,8 +355,7 @@ public virtual void RegisterCallbackForPinValueChangedEvent(int pinNumber, PinEv
375355
throw new InvalidOperationException($"Can not add callback for pin {pinNumber} because it is not open.");
376356
}
377357

378-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
379-
_driver.AddCallbackForPinValueChangedEvent(logicalPinNumber, eventTypes, callback);
358+
_driver.AddCallbackForPinValueChangedEvent(pinNumber, eventTypes, callback);
380359
}
381360

382361
/// <summary>
@@ -391,8 +370,7 @@ public virtual void UnregisterCallbackForPinValueChangedEvent(int pinNumber, Pin
391370
throw new InvalidOperationException($"Can not remove callback for pin {pinNumber} because it is not open.");
392371
}
393372

394-
int logicalPinNumber = GetLogicalPinNumber(pinNumber);
395-
_driver.RemoveCallbackForPinValueChangedEvent(logicalPinNumber, callback);
373+
_driver.RemoveCallbackForPinValueChangedEvent(pinNumber, callback);
396374
}
397375

398376
/// <summary>

src/System.Device.Gpio/System/Device/Gpio/GpioDriver.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@ public abstract class GpioDriver : IDisposable
2626
/// </summary>
2727
protected internal abstract int PinCount { get; }
2828

29-
/// <summary>
30-
/// Converts a board pin number to the driver's logical numbering scheme.
31-
/// </summary>
32-
/// <param name="pinNumber">The board pin number to convert.</param>
33-
/// <returns>The pin number in the driver's logical numbering scheme.</returns>
34-
protected internal abstract int ConvertPinNumberToLogicalNumberingScheme(int pinNumber);
35-
3629
/// <summary>
3730
/// Opens a pin in order for it to be ready to use.
3831
/// The driver attempts to open the pin without changing its mode or value.

0 commit comments

Comments
 (0)