UAVTopologyComponent.java 7.25 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
 * 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 <http://www.gnu.org/licenses/>.
 *
 */

21
package de.tud.kom.p2psim.impl.topology.component;
22

23
import java.util.LinkedList;
24
25
26
import java.util.Set;

import de.tud.kom.p2psim.api.common.SimHost;
27
28
import de.tud.kom.p2psim.api.energy.ComponentType;
import de.tud.kom.p2psim.api.energy.EnergyModel;
29
import de.tud.kom.p2psim.api.network.SimNetInterface;
30
31
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.api.topology.movement.MovementModel;
32
import de.tud.kom.p2psim.api.topology.movement.SimUAVLocationActuator;
33
34
import de.tud.kom.p2psim.api.topology.movement.UAVMovementModel;
import de.tud.kom.p2psim.api.topology.placement.PlacementModel;
35
import de.tud.kom.p2psim.impl.energy.RechargeableBattery;
36
import de.tud.kom.p2psim.impl.energy.components.ActuatorEnergyComponent;
37
38
import de.tud.kom.p2psim.impl.energy.models.AbstractEnergyModel;
import de.tud.kom.p2psim.impl.topology.placement.UAVBasePlacement;
39
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
40
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
Julian Zobel's avatar
Julian Zobel committed
41
import de.tudarmstadt.maki.simonstrator.api.component.overlay.OverlayComponent;
42
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
43
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
44
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.ReachedLocationCallback;
45

Julian Zobel's avatar
Julian Zobel committed
46
47
48
49
50
51
/**
 * Topology component used for UAVs.
 * 
 * @author Julian Zobel
 * @version 1.0, 06.09.2018
 */
52
public class UAVTopologyComponent extends AbstractTopologyComponent implements SimUAVLocationActuator {
53
	
54
55
	public enum UAVstate {OFFLINE, ACTION, RETURN, CRASHED}
	
56
	private UAVMovementModel movement;
57
	
58
59
60
	private OverlayComponent uavOverlayComponent;
	
	private ActuatorEnergyComponent actuator;
61
62
63
64
	private RechargeableBattery battery;
	
	private UAVstate state = UAVstate.OFFLINE;
	private PositionVector baseLocation;
Julian Zobel's avatar
Julian Zobel committed
65
	
66
67
68
69
70
71
72
73
74
	/**
	 * Create a TopologyComponent for the current host.
	 *
	 * @param host
	 * @param topology
	 * @param movementModel
	 */
	public UAVTopologyComponent(SimHost host, Topology topology,
			MovementModel movementModel, PlacementModel placementModel, boolean registerAsInformationProviderInSiS) {
75
		super(host, topology, movementModel, placementModel, registerAsInformationProviderInSiS);		
76
77
	}

78
79
80
81
82
83
	@Override
	public void initialize() {		
		super.initialize();
		
		try {
			actuator = getHost().getComponent(EnergyModel.class)
84
					.getComponent(ComponentType.ACTUATOR, ActuatorEnergyComponent.class);			
85
86
87
88
89
		} catch (ComponentNotAvailableException e) {
			System.err.println("No Acutator Energy Component was found!");
		}
		
		try {
90
			battery = (RechargeableBattery) getHost().getComponent(AbstractEnergyModel.class).getBattery();
91
92
93
94
				
		} catch (ComponentNotAvailableException e) {
			System.err.println("No Battery Component was found!");
		}
95
96
97
98
99
100
		
		baseLocation = position.clone();
	}
	
	public void setState(UAVstate newState) {
		this.state = newState;
101
	}
102
			
103
104
105
	public void setUAVComponent(OverlayComponent uavOverlayComponent) {
		this.uavOverlayComponent = uavOverlayComponent;
	}
106
	
107
108
109
110
	public OverlayComponent getUAVComponent() {
		return uavOverlayComponent;
	}

111
112
	@Override
	public double getMinMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
113
		return movement.getMinCruiseSpeed();
114
115
116
117
	}

	@Override
	public double getMaxMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
118
		return movement.getMaxCruiseSpeed();
119
120
121
122
	}

	@Override
	public double getMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
123
		return movement.getCurrentSpeed();
124
125
126
127
	}

	@Override
	public void setMovementSpeed(double speed) {
Julian Zobel's avatar
Julian Zobel committed
128
		movement.setPreferredCruiseSpeed(speed);
129
130
131
	}

	@Override
132
133
134
135
136
	public boolean isActive() {
		return actuator.isOn();
	}

	@Override
137
138
139
140
141
142
143
144
	public boolean activate() {		
		if(actuator.turnOn()) {
			state = UAVstate.ACTION;
			return true;
		}
		else {
			return false;
		}
145
146
147
148
	}

	@Override
	public boolean deactivate() {
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
		actuator.turnOff();
	
		if(this.position.getAltitude() != 0) {			
			state = UAVstate.CRASHED;
			System.err.println("UAV was destroyed due to actuator deactivation during flight");
			
			uavOverlayComponent.shutdown();
				
			for (SimNetInterface net : getHost().getNetworkComponent()
					.getSimNetworkInterfaces()) {
				net.goOffline();
			}
		}
		else {
			state = UAVstate.OFFLINE;
		}
		
		return true;
167
168
169
	}

	@Override
170
171
	public PositionVector getCurrentLocation() {
		return position.clone();
172
173
174
	}

	@Override
175
	public double getCurrentBatteryLevel() {
176
		return battery.getCurrentPercentage();
177
	}
178

179
	
180
181
182
183
184
	@Override
	public UAVMovementModel getUAVMovement() {
		return movement;
	}

Julian Zobel's avatar
Julian Zobel committed
185
186
	@Override
	public void setUAVMovement(UAVMovementModel uavMovement) {
187
		this.movement = uavMovement;		
Julian Zobel's avatar
Julian Zobel committed
188
	}
189
190
191
192

	@Override
	public ActuatorEnergyComponent getActuatorEnergyComponent() {
		return actuator;
Julian Zobel's avatar
Julian Zobel committed
193
	}
194
195
196
197
198


	public void updateCurrentLocation(Location location, double actuatorLoad) {
		super.updateCurrentLocation(location);
		actuator.useActuator(actuatorLoad);
Julian Zobel's avatar
Julian Zobel committed
199
	}
200

201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
	@Override
	public Set<AttractionPoint> getAllAttractionPoints() {
		throw new UnsupportedOperationException();
	}

	@Override
	public void setTargetLocation(PositionVector targetLocation,
			ReachedLocationCallback cb) {
		movement.setTargetLocation(new PositionVector(targetLocation), cb);		
	}

	@Override
	public void addTargetLocation(PositionVector targetLocation,
			ReachedLocationCallback cb) {
		movement.addTargetLocation(new PositionVector(targetLocation), cb);
	}

	@Override
	public void setTargetLocationRoute(LinkedList<PositionVector> route,
			ReachedLocationCallback cb) {
		LinkedList<PositionVector> positionvectorlist = new LinkedList<>();
		for (Location loc : route) {
			positionvectorlist.add(new PositionVector(loc));
		}
		movement.setTargetLocationRoute(positionvectorlist, cb);
	}

	@Override
	public void removeAllTargetLocations() {
		movement.removeTargetLocations();
	}

	@Override
	public void setTargetAttractionPoint(AttractionPoint targetAttractionPoint) {
		throw new UnsupportedOperationException();		
	}

	@Override
	public AttractionPoint getCurrentTargetAttractionPoint() {
		throw new UnsupportedOperationException();
	}

	@Override
	public LinkedList<PositionVector> getTargetLocations() {
		return movement.getTargetLocations();
	}

248
249
250
	public UAVstate getUAVState() {
		return state;
	}
251
	
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
	@Override
	public void returnToBase(ReachedLocationCallback cb) {
		this.state = UAVstate.RETURN;
		
		ReachedLocationCallback returnCallback = new ReachedLocationCallback() {
			
			@Override
			public void reachedLocation() {
				cb.reachedLocation();
				deactivate();
				connectToBaseCharger();
			}
		};
		
		movement.setTargetLocation(baseLocation, returnCallback);	
	}
		
269
	
270
271
272
273
274
	private void connectToBaseCharger() {
		BaseTopologyComponent base = UAVBasePlacement.base;
		
		
	}
275
276
277


}