2014-02-08 1 views
2

Я создаю систему запирания двери для малины Pi. Когда пользователь пойла своей карты дверь отпирает, используя следующий код:Five Second Pause

piface.getRelay(PiFaceRelay.K0).open(); 

Я пытаюсь создать 5-секундную задержку перед дверью запирает, используя следующую строку:

piface.getRelay(PiFaceRelay.K0).close(); 

Это код, который я использовал, чтобы попытаться выполнить 5 секунд задержки, но в настоящее время он разблокирует затем сразу же снова запирает, который не дает достаточно времени для человека, чтобы физически толкать дверь открытой:

piface.getRelay(PiFaceRelay.K0).open(); 

Timer autoLockTimer = new Timer(5000, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     piface.getRelay(PiFaceRelay.K0).close(); 
    } 
}); 

autoLockTimer.setInitialDelay(5000); 
autoLockTimer.setRepeats(false); 
autoLockTimer.start(); 

Я предполагаю, что я просто не использую таймер правильно. Любые советы будут очень признательны.

+0

Какой тип 'Timer' вы используете? Основываясь на том, как он строится, он не похож на ['java.util.Timer'] (http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html) – Krease

+0

Это таймер качания: импорт javax.swing.Timer; – Suipaste

+0

Похоже, что он должен работать с точки зрения «Таймер» - я мало знаю о малине-пи, - попытались ли вы прокомментировать содержимое вашего «actionPerformed» (или добавить некоторые записи), чтобы убедиться, действительно ли это конкретный вызов 'close', который запускается преждевременно? – Krease

ответ

0

Как выясняется, блок кода, отправленный в исходном вопросе, работал нормально!

Однако я также наблюдал за базой данных, которая автоматически запускала бы команду блокировки, если бы заблокированное состояние в БД было истинным (каким оно было), и немедленно выполнило бы после того, как дверь была разблокирована путем прокрутки карты. Это также выполнялось по таймеру.

Решение заключалось в том, чтобы остановить команду мониторинга, когда пользователь провел свою карту, а затем возобновил мониторинг после того, как 5 секунд разблокирована дверь.

Спасибо за ваши предложения всем!

1

Почему не просто (с нуля):

new Thread(new Runnable() { 
    public void run() { 
      piface.getRelay(PiFaceRelay.K0).open(); 
      Thread.sleep(5000); 
      piface.getRelay(PiFaceRelay.K0).close(); 
    } 
}).start(); 
+0

Несмотря на то, что он полезен как другой способ сделать это, все равно будут иметь те же результаты, что и исходный код ... – Krease

+0

Да, я поставил эту попытку, такую ​​же проблему. Я буду намного глубже прорыть свой код и посмотреть, есть ли что-то в другом месте, потому что это происходит. – Suipaste

1

Вы уверены, что вы получили право реле API? PiFacExample,java использует 'close' для включения реле на.

+0

Да, этот бит в порядке, замок подключен к «нормальному открытому» (вы можете отменить команду, подключив его к «нормальному закрытому»), и он физически разблокирует, затем заблокирует, просто нет паузы в 5 секунд. – Suipaste

+0

Вы пробовали 'pulse (5000)'? –