以下代码来自 - http://pi4j.com/example/listener.html(收听GPIO)。我想知道是否有办法禁止事件在特定时间范围内被触发。 例如,假设我有一个运动检测器,并且想要对其进行配置,以便一旦检测到运动,它就会打开一个灯。但是,如果在接下来的15分钟内再次检测到动作(灯打开后),则应丢弃这些事件(动作)。
public class ListenGPIO {
public static void main(String args[]) throws InterruptedException {
final GpioController gpio = GpioFactory.getInstance();
final GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02, PinPullResistance.PULL_DOWN);
myButton.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
System.out.println(" --> GPIO PIN STATE CHANGE: " + event.getPin() + " = " + event.getState());
}
});
System.out.println(" ... complete the GPIO #02 circuit and see the listener feedback here in the console.");
for (;;) {
Thread.sleep(500);
}
}
}
我尝试在handleGpioPinDigitalStateChangeEvent中添加Thread.sleep,但这会使事件线程进入休眠状态,但是一旦线程唤醒它就会开始处理之前的事件,即事件存储在某种队列中并处理它们我想避免。
答案 0 :(得分:3)
而不是睡觉,你可以忽略该事件一段时间
long waitUntilTime = -1L;
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
System.out.println(" --> GPIO PIN STATE CHANGE: " + event.getPin() + " = " + event.getState());
long time = System.currentTimeMillis();
if (time >= waitUntilTime) {
waitUntilTime = time + TIME_TO_IGNORE_EVENTS;
processEvent(event);
}
}
答案 1 :(得分:0)
有3种方法可以解决这个问题,2种方法有一个计时器,一种没有,它还取决于你使用的API:
1)在上次触发事件时添加一个变量来存储。如果是新事件,则比较时间。如果15分钟过去了,处理事件,否则忽略它
disabled selected
2)删除听众并在15分钟结束后重新添加 这当然只有在你的API有一个删除监听器的方法
时才有效3)保持监听器但忽略事件,你可以设置一个全局布尔标志来处理它。
header('Content-Type: text/csv');
header('Content-Disposition: attachment;filename="csv_file.csv');
header('Cache-Control: max-age=0');
$file = fopen('php://output', 'w');
foreach ($this->getData() as $data)
{
fputcsv($file, $data);
}
fclose($file);
exit(0);