Android Things onTouch не выпускает GPIO - PullRequest
0 голосов
/ 22 мая 2018

Я использую Android Things v1 и пытаюсь использовать на экране Button для включения двигателя, пока нажата button ( касание и длительное нажатие ).

У меня проблема при нажатии button, двигатель не останавливается.Я хотел бы, чтобы он прекратился, как только button будет выпущен.

Вот код button:

    mtrbtnGD.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            try {
                mtrGpio = manager.openGpio("BCM24");
                mtrGpio.setEdgeTriggerType(Gpio.EDGE_NONE);
                mtrGpio.setActiveType(Gpio.ACTIVE_HIGH);
                mtrGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
                mtrGpio.setValue(true);
                Log.i(TAG, "Motor started");

            }
            catch (IOException e) {
                Log.w(TAG, "Unable to access GPIO", e);
            }
           return true;
        }
    });

РЕДАКТИРОВАТЬ:

Вот новый кодиз ответа Сэма:

public class MainActivity extends Activity {

private Gpio mtrGpio;
private GestureDetector mtrbtnGD;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button mtrbtnGD = (Button) findViewById(R.id.mtrbtn);
    Button closebtn = (Button) findViewById(R.id.closebtn);
    Button stopmtrbtn = (Button) findViewById(R.id.stopmtrbtn);

    final PeripheralManager manager = PeripheralManager.getInstance();
    List<String> portList = manager.getGpioList();
    if (portList.isEmpty()) {
        Log.i(TAG, "No GPIO port available on this device.");
    } else {
        Log.i(TAG, "List of available ports: " + portList);
    }

    mtrbtnGD.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            try {

                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        // PRESSED
                        mtrGpio = manager.openGpio("BCM24");
                        mtrGpio.setEdgeTriggerType(Gpio.EDGE_NONE);
                        mtrGpio.setActiveType(Gpio.ACTIVE_HIGH);
                        mtrGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
                        mtrGpio.setValue(true);
                        Log.i(TAG, "Motor started");
                        return true; // if you want to handle the touch event
                    case MotionEvent.ACTION_UP:
                        // RELEASED
                        mtrGpio.close();

                        return true; // if you want to handle the touch event
                }



            }
            catch (IOException e) {
                Log.w(TAG, "Unable to access GPIO", e);
            }
           return true;
        }
    });

Двигатель все еще не останавливается, когда я отпускаю экранную кнопку.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

close() закрывает ваше соединение с периферийным устройством GPIO, оно не меняет значение этого соединения перед закрытием.Вам нужно использовать setValue(false); следующим образом:

               switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        // PRESSED
                        mtrGpio = manager.openGpio("BCM24");
                        mtrGpio.setEdgeTriggerType(Gpio.EDGE_NONE);
                        mtrGpio.setActiveType(Gpio.ACTIVE_HIGH);
                        mtrGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
                        mtrGpio.setValue(true);
                        Log.i(TAG, "Motor started");
                        return true; // if you want to handle the touch event
                    case MotionEvent.ACTION_UP:
                        // RELEASED
                        mtrGpio.setValue(false); // ADD THIS
                        mtrGpio.close();

                        return true; // if you want to handle the touch event
                }

В идеале, если вы ожидаете многократного включения и выключения двигателя, вы должны держать соединение открытым.

public class MainActivity extends Activity {

private Gpio mtrGpio;
private GestureDetector mtrbtnGD;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button mtrbtnGD = (Button) findViewById(R.id.mtrbtn);
    try {
      PeripheralManager manager = PeripheralManager.getInstance();
      mtrGpio = manager.openGpio("BCM24");
      mtrGpio.setEdgeTriggerType(Gpio.EDGE_NONE);
      mtrGpio.setActiveType(Gpio.ACTIVE_HIGH);
      mtrGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
    } catch (IOException e) {
      throw new IllegalStateException("cannot open gpio", e);
    }

    mtrbtnGD.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            try {
               switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        // PRESSED
                        mtrGpio.setValue(true);
                        Log.i(TAG, "Motor started");
                        return true; 
                    case MotionEvent.ACTION_UP:
                        // RELEASED
                        mtrGpio.setValue(false);
                        return true; 
                }
            } catch (IOException e) {
                Log.w(TAG, "Unable to access GPIO", e);
            }
           return true;
        }
    });
}

@Override
protected void onDestroy() {
   try {
      mtrGpio.close();
   } catch (IOException ignore) {
      Log.w(TAG, "Unable to close GPIO", ignore);
   }
   super.onDestroy();
}
0 голосов
/ 22 мая 2018

Вы можете использовать этот код внутри onTouch метода и Проверить event.getAction():

switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // PRESSED
                return true; // if you want to handle the touch event
            case MotionEvent.ACTION_UP:
                // RELEASED
                return true; // if you want to handle the touch event
        }
...