Buttons are hard. To help you really need to read up on this:
http://www.ganssle.com/debouncing.htm
…and if you open up the driver for the GHI button, you will find the handler.
public Button(int socketNumber)
{
Socket socket = Socket.GetSocket(socketNumber, true, this, null);
socket.EnsureTypeIsSupported(new char[] { 'X', 'Y' }, this);
// These calls will throw GT.Socket.InvalidSocketException if a pin conflict or error is encountered
this.input = new GTI.InterruptInput(socket, GT.Socket.Pin.Three, GTI.GlitchFilterMode.On, GTI.ResistorMode.PullUp, GTI.InterruptMode.RisingAndFallingEdge, this);
this.input.Interrupt += new GTI.InterruptInput.InterruptEventHandler(this._input_Interrupt);
this.led = new GTI.DigitalOutput(socket, GT.Socket.Pin.Four, false, this);
LEDMode = LEDModes.Off;
}
private void _input_Interrupt(GTI.InterruptInput input, bool value)
{
ButtonState buttonState = input.Read() ? ButtonState.Released : ButtonState.Pressed;
switch (buttonState)
{
case ButtonState.Released:
if (LEDMode == LEDModes.OnWhilePressed)
TurnLEDOff();
else if (LEDMode == LEDModes.OnWhileReleased)
TurnLEDOn();
else if (LEDMode == LEDModes.ToggleWhenReleased)
ToggleLED();
break;
case ButtonState.Pressed:
if (LEDMode == LEDModes.OnWhilePressed)
TurnLEDOn();
else if (LEDMode == LEDModes.OnWhileReleased)
TurnLEDOff();
else if (LEDMode == LEDModes.ToggleWhenPressed)
ToggleLED();
break;
}
this.OnButtonEvent(this, buttonState);
}