禁用特定时间段的活动

时间:2016-04-06 18:00:50

标签: java event-handling raspberry-pi

以下代码来自 - 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,但这会使事件线程进入休眠状态,但是一旦线程唤醒它就会开始处理之前的事件,即事件存储在某种队列中并处理它们我想避免。

2 个答案:

答案 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);