UAVTopologyComponent.java 9.73 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
import java.util.Set;
import de.tud.kom.p2psim.api.common.SimHost;
26
27
import de.tud.kom.p2psim.api.energy.ComponentType;
import de.tud.kom.p2psim.api.energy.EnergyModel;
28
import de.tud.kom.p2psim.api.network.SimNetInterface;
29
30
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.api.topology.movement.MovementModel;
31
import de.tud.kom.p2psim.api.topology.movement.SimUAVLocationActuator;
32
33
import de.tud.kom.p2psim.api.topology.movement.UAVMovementModel;
import de.tud.kom.p2psim.api.topology.placement.PlacementModel;
34
import de.tud.kom.p2psim.impl.energy.RechargeableBattery;
35
36
import de.tud.kom.p2psim.impl.energy.components.ActuatorComponent;
import de.tud.kom.p2psim.impl.energy.components.StatelessActuatorComponent;
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.Monitor;
41
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
Julian Zobel's avatar
Julian Zobel committed
42
import de.tudarmstadt.maki.simonstrator.api.component.overlay.OverlayComponent;
43
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
44
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
Julian Zobel's avatar
Julian Zobel committed
45
46
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BaseConnectedCallback;
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BaseDisconnectedCallback;
47
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BatteryReplacementCallback;
48
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.ReachedLocationCallback;
Julian Zobel's avatar
Julian Zobel committed
49
import de.tudarmstadt.maki.simonstrator.api.uavsupport.communication.UAVToBaseInterface;
50

Julian Zobel's avatar
Julian Zobel committed
51
52
53
54
55
56
/**
 * Topology component used for UAVs.
 * 
 * @author Julian Zobel
 * @version 1.0, 06.09.2018
 */
57
public class UAVTopologyComponent extends AbstractTopologyComponent implements SimUAVLocationActuator {
58
	
59
	public enum UAVstate {OFFLINE, BASE_CONNECTION, ACTION, RETURN, CRASHED}
60
	
61
	private UAVMovementModel movement;
62
	
63
64
	private OverlayComponent uavOverlayComponent;
	
Julian Zobel's avatar
Julian Zobel committed
65
66
	protected PositionVector direction;
	
67
	private ActuatorComponent actuator;
68
69
	private RechargeableBattery battery;
	
70
	private UAVstate state = UAVstate.OFFLINE;
71
	private PositionVector baseLocation;
Julian Zobel's avatar
Julian Zobel committed
72
	
Julian Zobel's avatar
Julian Zobel committed
73
74
	private UAVToBaseInterface controllerInterface;
	
75
76
77
78
79
80
81
82
83
	/**
	 * 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) {
84
		super(host, topology, movementModel, placementModel, registerAsInformationProviderInSiS);		
Julian Zobel's avatar
Julian Zobel committed
85
		direction = new PositionVector(0,-1,0);
86
87
	}

88
89
90
91
92
93
	@Override
	public void initialize() {		
		super.initialize();
		
		try {
			actuator = getHost().getComponent(EnergyModel.class)
94
					.getComponent(ComponentType.ACTUATOR, ActuatorComponent.class);	
95
			movement.setMotorControl(actuator);
96
97
98
99
100
		} catch (ComponentNotAvailableException e) {
			System.err.println("No Acutator Energy Component was found!");
		}
		
		try {
101
			battery = (RechargeableBattery) getHost().getComponent(AbstractEnergyModel.class).getBattery();
102
103
104
105
				
		} catch (ComponentNotAvailableException e) {
			System.err.println("No Battery Component was found!");
		}
106
		
Julian Zobel's avatar
Julian Zobel committed
107
108
		// retrieve base location
		baseLocation = UAVBasePlacement.base.position.clone();		
109
110
111
112
	}
	
	public void setState(UAVstate newState) {
		this.state = newState;
113
114
		
		// TODO analyzer
115
116
117
		if(Monitor.hasAnalyzer(UAVStatisticAnalyzer.class)) {
			Monitor.getOrNull(UAVStatisticAnalyzer.class).uavSwitchedStates(this, newState);
		}
118
	}
119
			
120
121
122
	public void setUAVComponent(OverlayComponent uavOverlayComponent) {
		this.uavOverlayComponent = uavOverlayComponent;
	}
123
	
124
125
126
127
	public OverlayComponent getUAVComponent() {
		return uavOverlayComponent;
	}

128
129
	@Override
	public double getMinMovementSpeed() {
130
		return movement.horizontalMinVelocity();
131
132
133
134
	}

	@Override
	public double getMaxMovementSpeed() {
Julian Zobel's avatar
WIP    
Julian Zobel committed
135
		return movement.horizontalMaxVelocity();
136
137
138
139
	}

	@Override
	public double getMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
140
		return movement.getCurrentSpeed();
141
142
143
144
	}

	@Override
	public void setMovementSpeed(double speed) {
Julian Zobel's avatar
Julian Zobel committed
145
		movement.setPreferredSpeed(speed);
146
147
148
	}

	@Override
149
	public boolean isActive() {
150
		if(actuator.isOn()) {
151
			return true;
152
		} else {
153
154
155
156
157
			if(state == UAVstate.ACTION || state == UAVstate.RETURN) {
				this.deactivate();
			}
			return false;
		}
158
159
160
	}

	@Override
161
162
	public boolean activate() {		
		if(actuator.turnOn()) {
163
			this.setState(UAVstate.ACTION);			
164
165
166
167
168
			return true;
		}
		else {
			return false;
		}
169
170
171
172
	}

	@Override
	public boolean deactivate() {
173
		actuator.turnOff();
174
				
175
176
177
		if(this.position.getAltitude() != 0) {
			this.setState(UAVstate.CRASHED);		
						
178
179
			uavOverlayComponent.shutdown();	
			shutdownCommunication();
180
181
182
183
			
		} else {
			this.setState(UAVstate.OFFLINE);				
		}				
184
		
185
		return true;
186
187
188
	}

	@Override
189
190
	public PositionVector getCurrentLocation() {
		return position.clone();
191
192
193
	}

	@Override
194
	public double getCurrentBatteryLevel() {
195
		return battery.getCurrentPercentage();
196
	}
197
198
199
200
201
	
	@Override
	public double getCurrentBatteryEnergy() {
		return battery.getCurrentEnergyLevel();
	}
202

203
204
205
	public RechargeableBattery getBattery() {
		return battery;
	}
206
	
207
208
209
210
211
	@Override
	public UAVMovementModel getUAVMovement() {
		return movement;
	}

Julian Zobel's avatar
Julian Zobel committed
212
213
	@Override
	public void setUAVMovement(UAVMovementModel uavMovement) {
214
		this.movement = uavMovement;		
Julian Zobel's avatar
Julian Zobel committed
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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
	@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();
	}

264
265
266
	public UAVstate getUAVState() {
		return state;
	}
267
	
268
	@Override
269
270
	public void returnToBase(ReachedLocationCallback cb) {		
		this.setState(UAVstate.RETURN);		
271
272
273
274
275
		
		ReachedLocationCallback returnCallback = new ReachedLocationCallback() {
			
			@Override
			public void reachedLocation() {
Julian Zobel's avatar
Julian Zobel committed
276
				deactivate();				
277
				cb.reachedLocation();				
278
279
280
			}
		};
		
281
		movement.setPreferredSpeed(movement.horizontalMaxVelocity());
282
283
284
		movement.setTargetLocation(baseLocation, returnCallback);	
	}
		
285
286
	public void batteryReplacement(BatteryReplacementCallback cb) {
		
287
		if(state != UAVstate.BASE_CONNECTION) {
288
			throw new UnsupportedOperationException("Cannot recharge if not connected to base!");
289
		}
290
		
291
		BaseTopologyComponent base = UAVBasePlacement.base;
292
		base.getCharger().charge(this, cb);
293
	}
294

Julian Zobel's avatar
Julian Zobel committed
295
	public void setControllerInterface(UAVToBaseInterface controllerInterface) {
296
		this.controllerInterface = controllerInterface;				
Julian Zobel's avatar
Julian Zobel committed
297
298
299
300
301
302
303
304
305
	}

	@Override
	public void connectToBase(BaseConnectedCallback cb) {
		BaseTopologyComponent base = UAVBasePlacement.base;
		base.connectUAVToBase(controllerInterface);	
		
		if(cb != null)
			cb.successfulConnection();
306
		
307
		this.setState(UAVstate.BASE_CONNECTION);		
308
		shutdownCommunication();
Julian Zobel's avatar
Julian Zobel committed
309
310
311
312
	}

	@Override
	public void disconnectFromBase(BaseDisconnectedCallback cb) {
313
314
		startCommunication();
		
Julian Zobel's avatar
Julian Zobel committed
315
316
317
318
319
		BaseTopologyComponent base = UAVBasePlacement.base;
		base.disconnectUAVFromBase(controllerInterface);
		
		if(cb != null)
			cb.successfulDisconnection();
320
		
Julian Zobel's avatar
Julian Zobel committed
321
322
	}

323
324
325
326
	private void shutdownCommunication() {
		for (SimNetInterface net : getHost().getNetworkComponent().getSimNetworkInterfaces()) 
			net.goOffline();
	}
Julian Zobel's avatar
Julian Zobel committed
327

328
329
330
331
	private void startCommunication() {
		for (SimNetInterface net : getHost().getNetworkComponent().getSimNetworkInterfaces()) 
			net.goOnline();
	}
332

Julian Zobel's avatar
Julian Zobel committed
333
334
335
336
337
338
339
340
341
342
	@Override
	public PositionVector getCurrentDirection() {
		return direction;
	}

	@Override
	public void updateCurrentDirection(PositionVector direction) {
		this.direction.set(direction);
	}

343
344
345
346
347
348
349
350
351
352
	@Override
	public double getMaximumBatteryCapacity() {
		return battery.getMaximumEnergyLevel();
	}

	@Override
	public double estimatePowerConsumption(double velocity) {
		return movement.estimatePowerConsumption(velocity);
	}

353
354
355
356
357
	@Override
	public PositionVector getBaseLocation() {
		return baseLocation.clone();
	}

358
359
	

360
}