package com.dronecontrol.droneapi;
import com.google.common.collect.Sets;
import com.google.inject.Inject;
import com.dronecontrol.droneapi.components.AddressComponent;
import com.dronecontrol.droneapi.components.ErrorListenerComponent;
import com.dronecontrol.droneapi.components.ReadyStateListenerComponent;
import com.dronecontrol.droneapi.components.ThreadComponent;
import com.dronecontrol.droneapi.listeners.ReadyStateChangeListener;
import com.dronecontrol.droneapi.listeners.VideoDataListener;
import org.apache.log4j.Logger;
import java.net.InetAddress;
import java.util.Set;
public abstract class VideoRetrieverAbstract implements Runnable
{
private final Logger logger = Logger.getLogger(VideoRetrieverAbstract.class);
private final ThreadComponent threadComponent;
private final AddressComponent addressComponent;
private final ReadyStateListenerComponent readyStateListenerComponent;
private final ErrorListenerComponent errorListenerComponent;
private final Set<VideoDataListener> videoDataListeners;
private InetAddress droneAddress;
private int videoDataPort;
@Inject
public VideoRetrieverAbstract(ThreadComponent threadComponent, AddressComponent addressComponent,
ReadyStateListenerComponent readyStateListenerComponent, ErrorListenerComponent errorListenerComponent)
{
super();
this.threadComponent = threadComponent;
this.addressComponent = addressComponent;
this.readyStateListenerComponent = readyStateListenerComponent;
this.errorListenerComponent = errorListenerComponent;
videoDataListeners = Sets.newLinkedHashSet();
}
public void start(String droneIpAddress, int videoDataPort)
{
droneAddress = addressComponent.getInetAddress(droneIpAddress);
this.videoDataPort = videoDataPort;
logger.info("Starting video thread");
threadComponent.start(this);
}
public void stop()
{
logger.info("Stopping video thread");
threadComponent.stopAndWait();
}
public void addReadyStateChangeListener(ReadyStateChangeListener readyStateChangeListener)
{
readyStateListenerComponent.addReadyStateChangeListener(readyStateChangeListener);
}
public void removeReadyStateChangeListener(ReadyStateChangeListener readyStateChangeListener)
{
readyStateListenerComponent.addReadyStateChangeListener(readyStateChangeListener);
}
public void addVideoDataListener(VideoDataListener videoDataListener)
{
if (!videoDataListeners.contains(videoDataListener))
{
videoDataListeners.add(videoDataListener);
}
}
public void removeVideoDataListener(VideoDataListener videoDataListener)
{
if (videoDataListeners.contains(videoDataListener))
{
videoDataListeners.remove(videoDataListener);
}
}
protected Set<VideoDataListener> getVideoDataListeners()
{
return videoDataListeners;
}
protected InetAddress getDroneAddress()
{
return droneAddress;
}
protected boolean isStopped()
{
return threadComponent.isStopped();
}
protected void setReady()
{
readyStateListenerComponent.emitReadyStateChange(ReadyStateChangeListener.ReadyState.READY);
}
public int getVideoDataPort()
{
return videoDataPort;
}
@Override
public void run()
{
try
{
doRun();
} catch (Throwable e)
{
errorListenerComponent.emitError(e);
}
}
protected abstract void doRun();
}