2016-11-30 66 views
0

我目前正在使用Windows 10 IoT的Raspberry PI 3,並試圖在Visual Studio 2015中製作遊戲'Simon Says'。檢查是否有多個按鈕被推送Windows物聯網與Raspberry PI 3B

一切都插入如下: Fritzing image

我得到的LED工作,但我真的不知道如何檢測當按鈕被按下。

零件的源代碼:

變量

private const int BTNRED = 5; 
    private const int BTNBLUE = 6; 
    private const int BTNYELLOW = 13; 
    private const int BTNGREEN = 19; 

    private GpioPin _btnRed; 
    private GpioPin _btnBlue; 
    private GpioPin _btnYellow; 
    private GpioPin _btnGreen; 

    private Random rnd; 
    private static GpioController _gpioController; 

方法被按下的按鈕時被識別。

public static IList<Step> PressedButtons 
    { 
     get 
     { 
      List<Step> returnVal = new List<Step>(); 

      if (GetMap._btnBlue.Read() == GpioPinValue.High) 
      { returnVal.Add(Step.Blue); } 
      if (GetMap._btnGreen.Read() == GpioPinValue.High) 
      { returnVal.Add(Step.Green); } 
      if (GetMap._btnRed.Read() == GpioPinValue.High) 
      { returnVal.Add(Step.Red); } 
      if (GetMap._btnYellow.Read() == GpioPinValue.High) 
      { returnVal.Add(Step.Yellow); } 

      return returnVal; 
     } 
    } 

    /// <summary> 
    /// Checks if any of the 4 buttons is pressed. 
    /// </summary> 
    /// <returns>Returns false if no button is pressed.</returns> 
    public static bool isButtonPressed 
    { 
     get 
     { 
      if (GetMap._btnBlue.Read() == GpioPinValue.Low) 
      { return true; } 
      if (GetMap._btnGreen.Read() == GpioPinValue.Low) 
      { return true; } 
      if (GetMap._btnRed.Read() == GpioPinValue.Low) 
      { return true; } 
      if (GetMap._btnYellow.Read() == GpioPinValue.Low) 
      { return true; ; } 

      return false; 
     } 
    } 

分配的GPIO權引腳連接到相應的變量

private GPIOMap() 
    { 
     rnd = new Random(); 
     _gpioController = GpioController.GetDefault(); 
     if (_gpioController == null) { return; } 

     _ledRed = _gpioController.OpenPin(LEDRED); 
     _ledRed.SetDriveMode(GpioPinDriveMode.Output); 
     _ledYellow = _gpioController.OpenPin(LEDYELLOW); 
     _ledYellow.SetDriveMode(GpioPinDriveMode.Output); 
     _ledGreen = _gpioController.OpenPin(LEDGREEN); 
     _ledGreen.SetDriveMode(GpioPinDriveMode.Output); 
     _ledBlue = _gpioController.OpenPin(LEDBLUE); 
     _ledBlue.SetDriveMode(GpioPinDriveMode.Output); 

     _btnBlue = _gpioController.OpenPin(BTNBLUE); 
     _btnGreen = _gpioController.OpenPin(BTNGREEN); 
     _btnRed = _gpioController.OpenPin(BTNRED); 
     _btnYellow = _gpioController.OpenPin(BTNYELLOW); 

    } 
    private static GPIOMap GPIOMapInstance; 
    public static GPIOMap GetMap 
    { 
     get 
     { 
      if (GPIOMapInstance == null || _gpioController == null) 
      { GPIOMapInstance = new GPIOMap(); } 
      return GPIOMapInstance; 
     } 
    } 

運行遊戲,在這裏你可以看到它應該讓我的狀態2,每當按下一個按鈕。然而,隨着空閒動畫的不斷髮展,情況並非如此。

private void RunGame() 
    { 
     while (_isRunning) 
     { 
      switch (_state) 
      { 
       //Idle state 
       case (0x01): 
        //If any button is pressed, start the game. 
        if (GPIOMap.isButtonPressed) 
        { 
         _state = 0x02; 
         Task.Delay(500).Wait(); 
         GPIOMap.PlayStartAnimation(); 
         Task.Delay(1000).Wait(); 
         break; 
        } 

        //If nothing happens, continue playing the idle animation. 
        GPIOMap.PlayIdleAnimationOnce(); 

        break; 

       //Playback state 
       case (0x02): 
        //Play all the currently existing steps. 
        for (int i = 0; i <= _gameInstance.TotalSteps; i++) 
        { GPIOMap.BlinkLight(_gameInstance.GetNextStep(), 500); } 

        //Generate and play a new step. 
        GPIOMap.BlinkLight(_gameInstance.GetNextStep(), 500); 

        //Switch to the input state. 
        _state = 0x03; 
        //Set the start time for the input. 
        _answerPending = DateTime.UtcNow; 
        break; 

       //Input state 
       case (0x03): 

        if(_gameInstance.CurrentStep > MAXSTEPS) 
        { 
         //Win Game 
         ResetGame(); 
         break; 
        } 

        //If the player waits too long before answering, lose the game. 
        if ((DateTime.UtcNow - _answerPending) > _timeout) 
        { 
         GPIOMap.ConfirmWrongAnswer(); 
         ResetGame(); 
         break; 
        } 

        //If there are no more steps to re-trace, go back to playback state. 
        if (_gameInstance.CurrentStep > _gameInstance.TotalSteps) 
        { _gameInstance.ResetSteps(); _state = 0x02; break; } 

        //If no buttons are pressed, keep polling. 
        if (!GPIOMap.isButtonPressed) { break; } 

        IList<Step> pressedButtons = GPIOMap.PressedButtons; 
        //If anything but one button is pressed, lose the game. 
        if (pressedButtons.Count != 1) 
        { 
         GPIOMap.ConfirmWrongAnswer(); 
         ResetGame(); 
         break; 
        } 

        if (_gameInstance.VerifyStep(pressedButtons[0])) 
        { 
         GPIOMap.BlinkLight(pressedButtons[0], 500); 
        } 
        else//Wrong step, end game 
        { 
         GPIOMap.ConfirmWrongAnswer(); 
         ResetGame(); 
         break; 
        } 
        break; 
      } 
     } 
    } 

我怎樣才能當按下一個按鈕,這樣我就可以去涉及越來越上的按鈕用戶輸入的下一個狀態我的源代碼來識別。

回答

0

您可以使用GPIO ValueChanged趕上這樣的按鈕按下事件:

_btnBlue = _gpioController.OpenPin(BTNBLUE); 
    _btnBlue.ValueChanged += btnValueChanged; 

    public void btnValueChanged(GpioPin pin, GpioPinValueChangedEventArgs e) 
    { 
     if (_btnBlue.Read() == GpioPinValue.Low) 
     { 
      isBlueButtonPressed = true; 
     } 
    } 
相關問題