2 * Copyright (c) 2010-2022 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.leapmotion.internal.discovery;
15 import java.util.Collections;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.binding.leapmotion.internal.LeapMotionBindingConstants;
21 import org.openhab.core.config.discovery.AbstractDiscoveryService;
22 import org.openhab.core.config.discovery.DiscoveryResult;
23 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
24 import org.openhab.core.config.discovery.DiscoveryService;
25 import org.openhab.core.thing.ThingUID;
26 import org.osgi.service.component.annotations.Component;
28 import com.leapmotion.leap.Controller;
29 import com.leapmotion.leap.Listener;
32 * This is a discovery service, which finds locally attached LeapMotion controllers and adds them to the Inbox
34 * @author Kai Kreuzer - Initial contribution
38 @Component(service = DiscoveryService.class, configurationPid = "discovery.leapmotion")
39 public class LeapMotionDiscoveryService extends AbstractDiscoveryService {
41 private @NonNullByDefault({}) Controller leapController;
42 private @NonNullByDefault({}) Listener listener;
44 public LeapMotionDiscoveryService() throws IllegalArgumentException {
45 super(Collections.singleton(LeapMotionBindingConstants.THING_TYPE_CONTROLLER), 10, true);
49 protected void activate(@Nullable Map<String, Object> configProperties) {
50 leapController = new Controller();
51 listener = new Listener() {
53 public void onConnect(@Nullable Controller c) {
54 createDiscoveryResult();
58 public void onDisconnect(@Nullable Controller c) {
59 removeDiscoveryResult();
62 super.activate(configProperties);
66 protected void deactivate() {
67 leapController.removeListener(listener);
69 leapController.delete();
70 leapController = null;
75 protected void startScan() {
76 if (leapController.isConnected()) {
77 createDiscoveryResult();
82 protected void startBackgroundDiscovery() {
83 super.startBackgroundDiscovery();
84 leapController.addListener(listener);
87 private void createDiscoveryResult() {
88 DiscoveryResult result = DiscoveryResultBuilder
89 .create(new ThingUID(LeapMotionBindingConstants.THING_TYPE_CONTROLLER, "local"))
90 .withLabel("Leap Motion Controller").build();
91 thingDiscovered(result);
94 private void removeDiscoveryResult() {
95 removeOlderResults(System.currentTimeMillis());