Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3
Characteristic Locus
Inheritance object WiiExtensionControllerBase WiiClassicControllerBase > SnesClassicController
Implements II2cPeripheral
Inherited Members WiiClassicControllerBase.LeftJoystickX WiiClassicControllerBase.LeftJoystickY WiiClassicControllerBase.RightJoystickX WiiClassicControllerBase.RightJoystickY WiiClassicControllerBase.LeftTriggerPosition WiiClassicControllerBase.RightTriggerPosition WiiClassicControllerBase.PlusButtonPressed WiiClassicControllerBase.MinusButtonPressed WiiClassicControllerBase.HomeButtonPressed WiiClassicControllerBase.LButtonPressed WiiClassicControllerBase.RButtonPressed WiiClassicControllerBase.ZLButtonPressed WiiClassicControllerBase.ZRButtonPressed WiiClassicControllerBase.XButtonPressed WiiClassicControllerBase.YButtonPressed WiiClassicControllerBase.AButtonPressed WiiClassicControllerBase.BButtonPressed WiiClassicControllerBase.DPadLeftPressed WiiClassicControllerBase.DPadRightPressed WiiClassicControllerBase.DPadUpPressed WiiClassicControllerBase.DPadDownPressed WiiClassicControllerBase.useHighResolutionMode WiiClassicControllerBase.Initialize() WiiExtensionControllerBase.DefaultI2cAddress WiiExtensionControllerBase.DefaultI2cSpeed WiiExtensionControllerBase.i2cComms WiiExtensionControllerBase.ReadBuffer WiiExtensionControllerBase.samplingLock WiiExtensionControllerBase.SamplingTokenSource WiiExtensionControllerBase.IsSampling WiiExtensionControllerBase.GetIdentification() WiiExtensionControllerBase.StartUpdating(TimeSpan) WiiExtensionControllerBase.StopUpdating() object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString()
Namespace Meadow.Foundation.Sensors.Hid
Assembly WiiExtensionControllers.dll

Syntax

public class SnesClassicController : WiiClassicControllerBase, II2cPeripheral

Constructors

SnesClassicController(II2cBus)

Creates a SNES Classic Mini Controller object

Declaration
public SnesClassicController(II2cBus i2cBus)

Parameters

Type Name Description
II2cBus i2cBus

the I2C bus connected to controller

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

Properties

AButton

A Button

Declaration
public IButton AButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

BButton

B Button

Declaration
public IButton BButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

DPad

D-pad

Declaration
public IDigitalJoystick DPad { get; }

Property Value

Type Description
IDigitalJoystick

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

LButton

L Button

Declaration
public IButton LButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

RButton

R Button

Declaration
public IButton RButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

SelectButton

  • Button
Declaration
public IButton SelectButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

StartButton

  • Button
Declaration
public IButton StartButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

XButton

X Button

Declaration
public IButton XButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

YButton

Y Button

Declaration
public IButton YButton { get; }

Property Value

Type Description
IButton

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3

Methods

Update()

Get the latest sensor data from the device

Declaration
public override void Update()

Overrides

Remarks

SnesClassicController
Status Status badge: working
Source code GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Hid.WiiExtensionControllers

Code Example

SnesClassicController snesController;

public override Task Initialize()
{
    Resolver.Log.Info("Initialize...");

    var i2cBus = Device.CreateI2cBus(SnesClassicController.DefaultI2cSpeed);

    snesController = new SnesClassicController(i2cBus: i2cBus);

    //onetime update - could be used in a game loop
    snesController.Update();

    //check the state of a button
    Resolver.Log.Info("X Button is " + (snesController.XButton.State == true ? "pressed" : "not pressed"));

    //.NET events
    snesController.AButton.Clicked += (s, e) => Resolver.Log.Info("A button clicked");
    snesController.BButton.Clicked += (s, e) => Resolver.Log.Info("B button clicked");
    snesController.XButton.Clicked += (s, e) => Resolver.Log.Info("X button clicked");
    snesController.YButton.Clicked += (s, e) => Resolver.Log.Info("Y button clicked");

    snesController.LButton.Clicked += (s, e) => Resolver.Log.Info("L button clicked");
    snesController.RButton.Clicked += (s, e) => Resolver.Log.Info("R button clicked");

    snesController.StartButton.Clicked += (s, e) => Resolver.Log.Info("+ button clicked");
    snesController.SelectButton.Clicked += (s, e) => Resolver.Log.Info("- button clicked");

    snesController.DPad.Updated += (s, e) => Resolver.Log.Info($"DPad {e.New}");

    return Task.CompletedTask;
}

public override Task Run()
{
    snesController.StartUpdating(TimeSpan.FromMilliseconds(200));
    return Task.CompletedTask;
}

Sample project(s) available on GitHub

Wiring Example

To wire a SnesClassicController to your Meadow board, connect the following:

SnesClassicController Meadow Pin
GND GND
SCL D08 (SCL)
SDA D07 (SDA)
VCC 3V3