/* * Copyright (c) 2005-2010 KOM – Multimedia Communications Lab * * This file is part of PeerfactSim.KOM. * * PeerfactSim.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 . * */ package de.tud.kom.p2psim.impl.topology.placement; import java.util.List; import de.tud.kom.p2psim.api.topology.TopologyComponent; import de.tud.kom.p2psim.api.topology.placement.PlacementModel; import de.tud.kom.p2psim.impl.topology.PositionVector; import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.traci.TraciSimulationController; import de.tud.kom.p2psim.impl.topology.movement.vehicular.sumo.simulation.controller.xml.XMLSimulationController; import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location; import de.tudarmstadt.maki.simonstrator.api.component.vehicular.api.SimulationSetupExtractor; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; /** */ public class RSUPlacement implements PlacementModel { private final String sumoExe; private final String sumoConfigFile; private final String sumoIntersections; private final int offsetX; private final int offsetY; private final int width; private final int height; private SimulationSetupExtractor _controller; private List _intersections; private int _currentIndex = 0; @XMLConfigurableConstructor({ "sumoExe", "sumoConfigFile", "offsetX", "offsetY", "width", "height" }) public RSUPlacement(String sumoExe, String sumoConfigFile, String offsetX, String offsetY, String width, String height) { this.sumoExe = sumoExe; this.sumoConfigFile = sumoConfigFile; this.sumoIntersections = null; this.offsetX = Integer.parseInt(offsetX); this.offsetY = Integer.parseInt(offsetY); this.width = Integer.parseInt(width); this.height = Integer.parseInt(height); initializeModel(); } @XMLConfigurableConstructor({ "sumoIntersections", "offsetX", "offsetY", "width", "height" }) public RSUPlacement(String sumoIntersections, String offsetX, String offsetY, String width, String height) { this.sumoIntersections = sumoIntersections; this.sumoExe = null; this.sumoConfigFile = null; this.offsetX = Integer.parseInt(offsetX); this.offsetY = Integer.parseInt(offsetY); this.width = Integer.parseInt(width); this.height = Integer.parseInt(height); initializeModel(); } /** * Initializes the movement model by executing BonnMotion and parsing the * resulting movement trace. */ protected void initializeModel() { if (this.sumoExe != null) { _controller = TraciSimulationController.createSimulationController(sumoExe, sumoConfigFile); _controller.init(); _controller.setObservedArea(offsetX, offsetY, offsetX + width, offsetY + height); _intersections = _controller.getAllIntersections(true); } else { _controller = new XMLSimulationController(null, sumoIntersections); _controller.init(); _controller.setObservedArea(offsetX, offsetY, offsetX + width, offsetY + height); _intersections = _controller.getAllIntersections(true); } } @Override public void addComponent(TopologyComponent comp) { // } @Override public PositionVector place(TopologyComponent comp) { if (_currentIndex < _intersections.size()) { Location intersection = _intersections.get(_currentIndex); _currentIndex++; return new PositionVector(intersection.getLongitudeOrX(), intersection.getLatitudeOrY()); } else { return new PositionVector(Double.NaN, Double.NaN); } } }