Commit 042766bf authored by Tobias Meuser's avatar Tobias Meuser
Browse files

Merge changes of Björn Büschke

parent 1053046d
/*
* Copyright (c) 2005-2010 KOM Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.pubsub;
import de.tudarmstadt.maki.simonstrator.api.component.overlay.OverlayContact;
public interface SubscriptionListener {
void onSubscribeAtBroker(OverlayContact pSubscriber, Subscription[] subscriptions);
}
/*
* Copyright (c) 2005-2018 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
/**
* @author Bjoern Bueschke
* @version 1.0 at 26.03.2018
*
*/
public class BumpProperty implements RoadProperty {
private final Location _location;
private final RoadNetworkEdge _edge;
private final boolean _bump;
private long _detectionDate;
public BumpProperty(Location pLocation, RoadNetworkEdge pEdge, boolean pBump) {
_location = pLocation;
_edge = pEdge;
_bump = pBump;
_detectionDate = Time.getCurrentTime();
}
@Override
public long getDetectionDate() {
return _detectionDate;
}
@Override
public Location getLocation() {
return _location;
}
@Override
public RoadNetworkEdge getEdge() {
return _edge;
}
public boolean hasBump() {
return _bump;
}
@Override
public EnvironmentProperty getDefaultProperty() {
return new BumpProperty(_location, _edge, false);
}
@Override
public int hashCode() {
return getEdge().getEdgeID().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof BumpProperty) {
BumpProperty bumpProperty = (BumpProperty) obj;
return bumpProperty.getEdge().equals(getEdge()) && (bumpProperty.hasBump() == hasBump());
}
return super.equals(obj);
}
}
/*
* Copyright (c) 2005-2018 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
/**
* @author Bjoern Bueschke
* @version 1.0 at 27.03.2018
*
*/
public class FogProperty implements RoadProperty {
private final Location _location;
private final RoadNetworkEdge _edge;
private final boolean _fog;
private long _detectionDate;
public FogProperty(Location pLocation, RoadNetworkEdge pEdge, boolean pFog) {
_location = pLocation;
_edge = pEdge;
_fog = pFog;
_detectionDate = Time.getCurrentTime();
}
@Override
public long getDetectionDate() {
return _detectionDate;
}
@Override
public Location getLocation() {
return _location;
}
@Override
public RoadNetworkEdge getEdge() {
return _edge;
}
public boolean hasFog() {
return _fog;
}
@Override
public EnvironmentProperty getDefaultProperty() {
return new FogProperty(_location, _edge, false);
}
@Override
public int hashCode() {
return getEdge().getEdgeID().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof FogProperty) {
FogProperty fogProperty = (FogProperty) obj;
return fogProperty.getEdge().equals(getEdge()) && (fogProperty.hasFog() == hasFog());
}
return super.equals(obj);
}
}
/*
* Copyright (c) 2005-2018 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
/**
* @author Bjoern Bueschke
* @version 1.0 at 26.03.2018
*
*/
public class HazardProperty implements RoadProperty {
private final Location _location;
private final RoadNetworkEdge _edge;
private final boolean _hazard;
private long _detectionDate;
public HazardProperty(Location pLocation, RoadNetworkEdge pEdge, boolean pHazard) {
_location = pLocation;
_edge = pEdge;
_hazard = pHazard;
_detectionDate = Time.getCurrentTime();
}
@Override
public long getDetectionDate() {
return _detectionDate;
}
@Override
public Location getLocation() {
return _location;
}
@Override
public RoadNetworkEdge getEdge() {
return _edge;
}
public boolean hasHazard() {
return _hazard;
}
@Override
public EnvironmentProperty getDefaultProperty() {
return new HazardProperty(_location, _edge, false);
}
@Override
public int hashCode() {
return getEdge().getEdgeID().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof HazardProperty) {
HazardProperty hazardProperty = (HazardProperty) obj;
return hazardProperty.getEdge().equals(getEdge()) && (hazardProperty.hasHazard() == hasHazard());
}
return super.equals(obj);
}
}
/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
/**
* @author Bjoern Bueschke
* @version 1.0 at 27.03.2018
*
*/
public class RainProperty implements RoadProperty {
private final Location _location;
private final RoadNetworkEdge _edge;
private final boolean _rain;
private long _detectionDate;
public RainProperty(Location pLocation, RoadNetworkEdge pEdge, boolean pRain) {
_location = pLocation;
_edge = pEdge;
_rain = pRain;
_detectionDate = Time.getCurrentTime();
}
@Override
public long getDetectionDate() {
return _detectionDate;
}
@Override
public Location getLocation() {
return _location;
}
@Override
public RoadNetworkEdge getEdge() {
return _edge;
}
public boolean hasRain() {
return _rain;
}
@Override
public EnvironmentProperty getDefaultProperty() {
return new RainProperty(_location, _edge, false);
}
@Override
public int hashCode() {
return getEdge().getEdgeID().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof RainProperty) {
RainProperty rainProperty = (RainProperty) obj;
return rainProperty.getEdge().equals(getEdge()) && (rainProperty.hasRain() == hasRain());
}
return super.equals(obj);
}
}
/*
* Copyright (c) 2005-2018 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
/**
* @author Bjoern Bueschke
* @version 1.0 at 26.03.2018
*
*/
public class TrafficSignProperty implements RoadProperty {
private final Location _location;
private final RoadNetworkEdge _edge;
private final boolean _sign;
private long _detectionDate;
public TrafficSignProperty(Location pLocation, RoadNetworkEdge pEdge, boolean pSign) {
_location = pLocation;
_edge = pEdge;
_sign = pSign;
_detectionDate = Time.getCurrentTime();
}
@Override
public long getDetectionDate() {
return _detectionDate;
}
@Override
public Location getLocation() {
return _location;
}
@Override
public RoadNetworkEdge getEdge() {
return _edge;
}
public boolean hasSign() {
return _sign;
}
@Override
public EnvironmentProperty getDefaultProperty() {
return new TrafficSignProperty(_location, _edge, false);
}
@Override
public int hashCode() {
return getEdge().getEdgeID().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof TrafficSignProperty) {
TrafficSignProperty signProperty = (TrafficSignProperty) obj;
return signProperty.getEdge().equals(getEdge()) && (signProperty.hasSign() == hasSign());
}
return super.equals(obj);
}
}
/*
* Copyright (c) 2005-2018 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import de.tudarmstadt.maki.simonstrator.api.Host;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.BumpProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.EnvironmentProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.RoadProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSComponent;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSRequest;
import de.tudarmstadt.maki.simonstrator.api.component.sis.exception.InformationNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sis.type.SiSTypes;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* @author Bjoern Bueschke
* @version 1.0 at 26.03.2018
*
*/
public class BumpEnvironmentSensorPlugin implements EnvironmentSensorPlugin {
private Host _host;
private SiSComponent _sis;
private double _accuracy;
private static Random _random = Randoms.getRandom(BumpEnvironmentSensorPlugin.class);
@XMLConfigurableConstructor({ "accuracy" })
public BumpEnvironmentSensorPlugin(double pAccuracy) {
setAccuracy(pAccuracy);
}
@Override
public void setHost(Host pHost) {
_host = pHost;
}
@Override
public List<EnvironmentProperty> getEnvironmentProperties() {
if (_sis == null) {
try {
_sis = _host.getComponent(SiSComponent.class);
} catch (ComponentNotAvailableException e) {
throw new AssertionError("SiS requried!", e);
}
}
try {
RoadNetworkEdge edge = _sis.get().localState(SiSTypes.ROAD_EDGE, SiSRequest.NONE);
Location location = _sis.get().localState(SiSTypes.PHY_LOCATION, SiSRequest.NONE);
boolean bump = false;
for (RoadProperty roadProperty : edge.getActiveProperties()) {
if (roadProperty instanceof BumpProperty) {
if (((BumpProperty) roadProperty).hasBump()) {
bump = true;
}
}
}
if (_random.nextDouble() >= _accuracy) {
bump = !bump;
}
List<EnvironmentProperty> properties = new ArrayList<>();
EnvironmentProperty property = new BumpProperty(location, edge, bump);
properties.add(property);
return properties;
} catch (InformationNotAvailableException e) {
throw new AssertionError(SiSTypes.ROAD_EDGE + " and " + SiSTypes.PHY_LOCATION + " are required!");
}
}
@Override
public BumpEnvironmentSensorPlugin clone() throws CloneNotSupportedException {
return new BumpEnvironmentSensorPlugin(_accuracy);
}
public void setAccuracy(double pAccuracy) {
_accuracy = pAccuracy;
}
}
/*
* Copyright (c) 2005-2018 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import de.tudarmstadt.maki.simonstrator.api.Host;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.EnvironmentProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.FogProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.RoadProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSComponent;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSRequest;
import de.tudarmstadt.maki.simonstrator.api.component.sis.exception.InformationNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sis.type.SiSTypes;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* @author Bjoern Bueschke
* @version 1.0 at 27.03.2018
*
*/
public class FogEnvironmentSensorPlugin implements EnvironmentSensorPlugin {
private Host _host;
private SiSComponent _sis;
private double _accuracy;
private static Random _random = Randoms.getRandom(FogEnvironmentSensorPlugin.class);
@XMLConfigurableConstructor({ "accuracy" })
public FogEnvironmentSensorPlugin(double pAccuracy) {
setAccuracy(pAccuracy);
}
@Override
public void setHost(Host pHost) {
_host = pHost;
}
@Override
public List<EnvironmentProperty> getEnvironmentProperties() {
if (_sis == null) {
try {
_sis = _host.getComponent(SiSComponent.class);
} catch (ComponentNotAvailableException e) {
throw new AssertionError("SiS requried!", e);
}
}
try {
RoadNetworkEdge edge = _sis.get().localState(SiSTypes.ROAD_EDGE, SiSRequest.NONE);
Location location = _sis.get().localState(SiSTypes.PHY_LOCATION, SiSRequest.NONE);
boolean fog = false;
for (RoadProperty roadProperty : edge.getActiveProperties()) {
if (roadProperty instanceof FogProperty) {
if (((FogProperty) roadProperty).hasFog()) {
fog = true;
}
}
}
if (_random.nextDouble() >= _accuracy) {
fog = !fog;
}
List<EnvironmentProperty> properties = new ArrayList<>();
EnvironmentProperty property = new FogProperty(location, edge, fog);
properties.add(property);
return properties;
} catch (InformationNotAvailableException e) {
throw new AssertionError(SiSTypes.ROAD_EDGE + " and " + SiSTypes.PHY_LOCATION + " are required!");
}
}
@Override
public FogEnvironmentSensorPlugin clone() throws CloneNotSupportedException {
return new FogEnvironmentSensorPlugin(_accuracy);
}
public void setAccuracy(double pAccuracy) {
_accuracy = pAccuracy;
}
}
/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import de.tudarmstadt.maki.simonstrator.api.Host;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.EnvironmentProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.HazardProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.RoadProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSComponent;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSRequest;
import de.tudarmstadt.maki.simonstrator.api.component.sis.exception.InformationNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sis.type.SiSTypes;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* @author Bjoern Bueschke
* @version 1.0 at 27.03.2018
*
*/
public class HazardEnvironmentSensorPlugin implements EnvironmentSensorPlugin {
private Host _host;
private SiSComponent _sis;
private double _accuracy;
private static Random _random = Randoms.getRandom(HazardEnvironmentSensorPlugin.class);
@XMLConfigurableConstructor({ "accuracy" })
public HazardEnvironmentSensorPlugin(double pAccuracy) {
setAccuracy(pAccuracy);
}
@Override
public void setHost(Host pHost) {
_host = pHost;
}
@Override
public List<EnvironmentProperty> getEnvironmentProperties() {
if (_sis == null) {
try {
_sis = _host.getComponent(SiSComponent.class);
} catch (ComponentNotAvailableException e) {
throw new AssertionError("SiS requried!", e);
}
}
try {
RoadNetworkEdge edge = _sis.get().localState(SiSTypes.ROAD_EDGE, SiSRequest.NONE);
Location location = _sis.get().localState(SiSTypes.PHY_LOCATION, SiSRequest.NONE);
boolean hazard = false;
for (RoadProperty roadProperty : edge.getActiveProperties()) {
if (roadProperty instanceof HazardProperty) {
if (((HazardProperty) roadProperty).hasHazard()) {
hazard = true;
}
}
}
if (_random.nextDouble() >= _accuracy) {
hazard = !hazard;
}
List<EnvironmentProperty> properties = new ArrayList<>();
EnvironmentProperty property = new HazardProperty(location, edge, hazard);
properties.add(property);
return properties;
} catch (InformationNotAvailableException e) {
throw new AssertionError(SiSTypes.ROAD_EDGE + " and " + SiSTypes.PHY_LOCATION + " are required!");
}
}
@Override
public HazardEnvironmentSensorPlugin clone() throws CloneNotSupportedException {
return new HazardEnvironmentSensorPlugin(_accuracy);
}
public void setAccuracy(double pAccuracy) {
_accuracy = pAccuracy;
}
}
/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import de.tudarmstadt.maki.simonstrator.api.Host;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.EnvironmentProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.RainProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.RoadProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSComponent;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSRequest;
import de.tudarmstadt.maki.simonstrator.api.component.sis.exception.InformationNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sis.type.SiSTypes;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* @author Bjoern Bueschke
* @version 1.0 at 27.03.2018
*
*/
public class RainEnvironmentSensorPlugin implements EnvironmentSensorPlugin {
private Host _host;
private SiSComponent _sis;
private double _accuracy;
private static Random _random = Randoms.getRandom(RainEnvironmentSensorPlugin.class);
@XMLConfigurableConstructor({ "accuracy" })
public RainEnvironmentSensorPlugin(double pAccuracy) {
setAccuracy(pAccuracy);
}
@Override
public void setHost(Host pHost) {
_host = pHost;
}
@Override
public List<EnvironmentProperty> getEnvironmentProperties() {
if (_sis == null) {
try {
_sis = _host.getComponent(SiSComponent.class);
} catch (ComponentNotAvailableException e) {
throw new AssertionError("SiS requried!", e);
}
}
try {
RoadNetworkEdge edge = _sis.get().localState(SiSTypes.ROAD_EDGE, SiSRequest.NONE);
Location location = _sis.get().localState(SiSTypes.PHY_LOCATION, SiSRequest.NONE);
boolean rain = false;
for (RoadProperty roadProperty : edge.getActiveProperties()) {
if (roadProperty instanceof RainProperty) {
if (((RainProperty) roadProperty).hasRain()) {
rain = true;
}
}
}
if (_random.nextDouble() >= _accuracy) {
rain = !rain;
}
List<EnvironmentProperty> properties = new ArrayList<>();
EnvironmentProperty property = new RainProperty(location, edge, rain);
properties.add(property);
return properties;
} catch (InformationNotAvailableException e) {
throw new AssertionError(SiSTypes.ROAD_EDGE + " and " + SiSTypes.PHY_LOCATION + " are required!");
}
}
@Override
public RainEnvironmentSensorPlugin clone() throws CloneNotSupportedException {
return new RainEnvironmentSensorPlugin(_accuracy);
}
public void setAccuracy(double pAccuracy) {
_accuracy = pAccuracy;
}
}
/*
* Copyright (c) 2005-2018 KOM – Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
* Simonstrator.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.plugin;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import de.tudarmstadt.maki.simonstrator.api.Host;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.EnvironmentProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.RoadProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.environment.data.TrafficSignProperty;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSComponent;
import de.tudarmstadt.maki.simonstrator.api.component.sis.SiSRequest;
import de.tudarmstadt.maki.simonstrator.api.component.sis.exception.InformationNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.component.sis.type.SiSTypes;
import de.tudarmstadt.maki.simonstrator.api.component.vehicular.roadnetwork.RoadNetworkEdge;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* @author Bjoern Bueschke
* @version 1.0 at 26.03.2018
*
*/
public class TrafficSignEnvironmentSensorPlugin implements EnvironmentSensorPlugin {
private Host _host;
private SiSComponent _sis;
private double _accuracy;
private static Random _random = Randoms.getRandom(TrafficSignEnvironmentSensorPlugin.class);
@XMLConfigurableConstructor({ "accuracy" })
public TrafficSignEnvironmentSensorPlugin(double pAccuracy) {
setAccuracy(pAccuracy);
}
@Override
public void setHost(Host pHost) {
_host = pHost;
}
@Override
public List<EnvironmentProperty> getEnvironmentProperties() {
if (_sis == null) {
try {
_sis = _host.getComponent(SiSComponent.class);
} catch (ComponentNotAvailableException e) {
throw new AssertionError("SiS requried!", e);
}
}
try {
RoadNetworkEdge edge = _sis.get().localState(SiSTypes.ROAD_EDGE, SiSRequest.NONE);
Location location = _sis.get().localState(SiSTypes.PHY_LOCATION, SiSRequest.NONE);
boolean sign = false;
for (RoadProperty roadProperty : edge.getActiveProperties()) {
if (roadProperty instanceof TrafficSignProperty) {
if (((TrafficSignProperty) roadProperty).hasSign()) {
sign = true;
}
}
}
if (_random.nextDouble() >= _accuracy) {
sign = !sign;
}
List<EnvironmentProperty> properties = new ArrayList<>();
EnvironmentProperty property = new TrafficSignProperty(location, edge, sign);
properties.add(property);
return properties;
} catch (InformationNotAvailableException e) {
throw new AssertionError(SiSTypes.ROAD_EDGE + " and " + SiSTypes.PHY_LOCATION + " are required!");
}
}
@Override
public TrafficSignEnvironmentSensorPlugin clone() throws CloneNotSupportedException {
return new TrafficSignEnvironmentSensorPlugin(_accuracy);
}
public void setAccuracy(double pAccuracy) {
_accuracy = pAccuracy;
}
}
......@@ -55,4 +55,12 @@ public class RoadInformation extends EnvironmentInformation<RoadProperty>
}
}
@Override
public <T> boolean hasAttribute(AvailableInformationAttributes pKey) {
if (pKey.equals(AvailableInformationAttributes.EDGE)) {
return true;
}
return super.hasAttribute(pKey);
}
}
package de.tudarmstadt.maki.simonstrator.api.util;
/*
* Copyright (c) 2005-2010 KOM Multimedia Communications Lab
* Copyright (c) 2005-2010 KOM Multimedia Communications Lab
*
* This file is part of Simonstrator.KOM.
*
......@@ -22,6 +22,9 @@ package de.tudarmstadt.maki.simonstrator.api.util;
import java.util.ArrayList;
import java.util.List;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
......@@ -88,6 +91,10 @@ public class Geohash {
* @return
*/
public static String getAdjacentGeohash(String pGeohash, int pX, int pY) {
/*
* (1,0) right/eastern GeoHash (-1,0) left/western GeoHash (0,1)
* lower/southernGeoHash (0,-1) upper/northern GeoHash
*/
byte[] decode = decode(pGeohash);
if (pX != 0) {
......@@ -137,6 +144,53 @@ public class Geohash {
return encode(decode);
}
/**
* Get the adjacent regions depending if vehicle drives in N, E, S, W direction
*
* @param geohash
* center geohash
* @param heading
* angle of driving direction
* @return adjacent geohash regions depending on driving direction
*/
public static List<String> getSubscriptionHorizon(String geohash, double heading) {
List<String> adjacentAreas = new ArrayList<>();
int direction = (int) heading;
if (0 <= direction && direction < 45 || 315 <= direction && direction <= 360) {// N
adjacentAreas.add(getAdjacentGeohash(geohash, 0, -1));// top
adjacentAreas.add(getAdjacentGeohash(geohash, 1, 0));// right
adjacentAreas.add(getAdjacentGeohash(geohash, -1, 0));// left
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, 0, -1), 1, 0));// top,right
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, 0, -1), -1, 0));// top,left
}
if (45 <= direction && direction < 135) {// E
adjacentAreas.add(getAdjacentGeohash(geohash, 1, 0));// right
adjacentAreas.add(getAdjacentGeohash(geohash, 0, -1));// top
adjacentAreas.add(getAdjacentGeohash(geohash, 0, 1));// bottom
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, 1, 0), 0, -1));// right, top
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, 1, 0), 0, 1));// right, bottom
}
if (135 <= direction && direction < 225) {// S
adjacentAreas.add(getAdjacentGeohash(geohash, 0, 1));// bottom
adjacentAreas.add(getAdjacentGeohash(geohash, 1, 0));// right
adjacentAreas.add(getAdjacentGeohash(geohash, -1, 0));// left
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, 0, 1), 1, 0));// bottom, right
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, 0, 1), -1, 0));// bottom, left
}
if (225 <= direction && direction < 315) {// W
adjacentAreas.add(getAdjacentGeohash(geohash, -1, 0));// left
adjacentAreas.add(getAdjacentGeohash(geohash, 0, 1));// bottom
adjacentAreas.add(getAdjacentGeohash(geohash, 0, -1));// top
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, -1, 0), 0, -1));// left, top
adjacentAreas.add(getAdjacentGeohash(getAdjacentGeohash(geohash, -1, 0), 0, 1));// left, bottom
}
return adjacentAreas;
}
private static boolean isBitSet(byte b, int offset) {
return getBit(b, offset) == 1;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment