To port my Windows 10 IoT Core nRF24L01, SX123X. and SX127X LoRa libraries to .Net Core 5 I wanted to see if there were any differences in the way interrupts were handled by the dotnet/iot libraries. The initial versions of the code will being running on a Raspberry PI but I will also look at other supported Single Board Computers(SBCs).
My test-rig was a RaspberryPI 3B with a Grove Base Hat for Raspberry PI (left over from a proof of concept project), a couple of Grove Universal 4 pin 5CM cables, a Grove LED pack, and a Grove Button.
There were some syntax differences but nothing to major
using System;
using System.Device.Gpio;
using System.Diagnostics;
using System.Threading;
namespace devMobile.NetCore.GPIOInterrupts
{
class Program
{
private const int ButtonPinNumber = 5;
private const int LedPinNumber = 16;
private static GpioController gpiocontroller;
static void Main(string[] args)
{
try
{
gpiocontroller = new GpioController(PinNumberingScheme.Logical);
gpiocontroller.OpenPin(ButtonPinNumber, PinMode.InputPullDown);
gpiocontroller.OpenPin(LedPinNumber, PinMode.Output);
gpiocontroller.RegisterCallbackForPinValueChangedEvent(ButtonPinNumber, PinEventTypes.Rising, PinChangeEventHandler);
Console.WriteLine($"Main thread:{Thread.CurrentThread.ManagedThreadId}");
while (true)
{
Console.WriteLine($"Doing stuff");
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private static void PinChangeEventHandler(object sender, PinValueChangedEventArgs pinValueChangedEventArgs)
{
Debug.Write($"Interrupt Thread:{Thread.CurrentThread.ManagedThreadId}");
if (pinValueChangedEventArgs.ChangeType == PinEventTypes.Rising)
{
if (gpiocontroller.Read(LedPinNumber) == PinValue.Low)
{
gpiocontroller.Write(LedPinNumber, PinValue.High);
}
else
{
gpiocontroller.Write(LedPinNumber, PinValue.Low);
}
}
}
}
}
I included code to display the Thread.CurrentThread.ManagedThreadId to see if the callback was running on a different thread.
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
...
Loaded '/usr/lib/dotnet/shared/Microsoft.NETCore.App/5.0.4/Microsoft.Win32.Primitives.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Main thread:1
Doing stuff
Doing stuff
Doing stuff
Doing stuff
Doing stuff
Interrupt Thread:6Doing stuff
Doing stuff
Doing stuff
Interrupt Thread:6Doing stuff
Doing stuff
Interrupt Thread:6Doing stuff
Doing stuff
Doing stuff
Doing stuff
Doing stuff
Doing stuff
The program 'dotnet' has exited with code 0 (0x0).
The ManagedThreadId for the main loop(1) was different to the callback(6) which needs some further investigation.
