/* * 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.movement; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import de.tud.kom.p2psim.api.network.SimNetInterface; import de.tud.kom.p2psim.api.topology.movement.MovementModel; import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator; import de.tud.kom.p2psim.impl.network.routed.RoutedNetLayer; 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.Time; import de.tudarmstadt.maki.simonstrator.api.common.graph.INodeID; import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException; 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 RSUMovementModel implements MovementModel { private final List components; 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 final long timestepConversion = Time.SECOND; private boolean initialized = false; private SimulationSetupExtractor _controller; private List _intersections; private int _currentIndex = 0; private final Map hostIntersectionMatching = new HashMap<>(); @XMLConfigurableConstructor({ "sumoExe", "sumoConfigFile", "offsetX", "offsetY", "width", "height" }) public RSUMovementModel(String sumoExe, String sumoConfigFile, String offsetX, String offsetY, String width, String height) { this.components = new LinkedList<>(); 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); } @XMLConfigurableConstructor({ "sumoIntersections", "offsetX", "offsetY", "width", "height" }) public RSUMovementModel(String sumoIntersections, String offsetX, String offsetY, String width, String height) { this.components = new LinkedList<>(); 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); } @Override public final void addComponent(SimLocationActuator comp) { components.add(comp); } @Override public void setTimeBetweenMoveOperations(long time) { //Do nothing, only used for placement of RSU } @Override public synchronized void placeComponent(SimLocationActuator actuator) { if (!initialized) { initializeModel(); initialized = true; } if (_currentIndex < _intersections.size()) { // Initial placement Location intersection = _intersections.get(_currentIndex); actuator.updateCurrentLocation(new PositionVector(intersection.getLongitudeOrX(), intersection.getLatitudeOrY())); hostIntersectionMatching.put(actuator.getHost().getId(), _currentIndex); _currentIndex++; //Put interfaces online try { RoutedNetLayer routedNetLayer = actuator.getHost().getComponent(RoutedNetLayer.class); for (SimNetInterface netInterface : routedNetLayer.getSimNetworkInterfaces()) { if (netInterface.isOffline()) { netInterface.goOnline(); } } } catch (ComponentNotAvailableException e) { e.printStackTrace(); } } else { actuator.updateCurrentLocation(new PositionVector(Double.NaN, Double.NaN)); } } /** * 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); } // System.out.println("Require " + _intersections.size() + " RSUs"); } }