UAVTopologyComponent.java 9.32 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
import de.tud.kom.p2psim.impl.energy.components.StatelessMotorComponent;
36
37
import de.tud.kom.p2psim.impl.energy.models.AbstractEnergyModel;
import de.tud.kom.p2psim.impl.topology.placement.UAVBasePlacement;
38
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
39
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
Julian Zobel's avatar
Julian Zobel committed
40
import de.tudarmstadt.maki.simonstrator.api.component.overlay.OverlayComponent;
41
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
42
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
Julian Zobel's avatar
Julian Zobel committed
43

Julian Zobel's avatar
Julian Zobel committed
44
45
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BaseConnectedCallback;
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BaseDisconnectedCallback;
46
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BatteryReplacementCallback;
47
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.ReachedLocationCallback;
Julian Zobel's avatar
Julian Zobel committed
48
import de.tudarmstadt.maki.simonstrator.api.uavsupport.communication.UAVToBaseInterface;
49

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

87
88
89
90
91
92
	@Override
	public void initialize() {		
		super.initialize();
		
		try {
			actuator = getHost().getComponent(EnergyModel.class)
93
94
					.getComponent(ComponentType.ACTUATOR, StatelessMotorComponent.class);	
			movement.setMotorControl(actuator);
95
96
97
98
99
		} catch (ComponentNotAvailableException e) {
			System.err.println("No Acutator Energy Component was found!");
		}
		
		try {
100
			battery = (RechargeableBattery) getHost().getComponent(AbstractEnergyModel.class).getBattery();
101
102
103
104
				
		} catch (ComponentNotAvailableException e) {
			System.err.println("No Battery Component was found!");
		}
105
		
Julian Zobel's avatar
Julian Zobel committed
106
107
		// retrieve base location
		baseLocation = UAVBasePlacement.base.position.clone();		
108
109
110
111
	}
	
	public void setState(UAVstate newState) {
		this.state = newState;
112
113
114
		

		// TODO analyzer
115
	}
116
			
117
118
119
	public void setUAVComponent(OverlayComponent uavOverlayComponent) {
		this.uavOverlayComponent = uavOverlayComponent;
	}
120
	
121
122
123
124
	public OverlayComponent getUAVComponent() {
		return uavOverlayComponent;
	}

125
126
	@Override
	public double getMinMovementSpeed() {
Julian Zobel's avatar
WIP    
Julian Zobel committed
127
		return movement.minimumVelocity();
128
129
130
131
	}

	@Override
	public double getMaxMovementSpeed() {
Julian Zobel's avatar
WIP    
Julian Zobel committed
132
		return movement.horizontalMaxVelocity();
133
134
135
136
	}

	@Override
	public double getMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
137
		return movement.getCurrentSpeed();
138
139
140
141
	}

	@Override
	public void setMovementSpeed(double speed) {
Julian Zobel's avatar
Julian Zobel committed
142
		movement.setPreferredSpeed(speed);
143
144
145
	}

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

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

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

	@Override
186
187
	public PositionVector getCurrentLocation() {
		return position.clone();
188
189
190
	}

	@Override
191
	public double getCurrentBatteryLevel() {
192
		return battery.getCurrentPercentage();
193
	}
194
195
196
197
198
	
	@Override
	public double getCurrentBatteryEnergy() {
		return battery.getCurrentEnergyLevel();
	}
199

200
201
202
	public RechargeableBattery getBattery() {
		return battery;
	}
203
	
204
205
206
207
208
	@Override
	public UAVMovementModel getUAVMovement() {
		return movement;
	}

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

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

Julian Zobel's avatar
Julian Zobel committed
291
	public void setControllerInterface(UAVToBaseInterface controllerInterface) {
292
		this.controllerInterface = controllerInterface;				
Julian Zobel's avatar
Julian Zobel committed
293
294
295
296
297
298
299
300
301
	}

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

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

319
320
321
322
	private void shutdownCommunication() {
		for (SimNetInterface net : getHost().getNetworkComponent().getSimNetworkInterfaces()) 
			net.goOffline();
	}
Julian Zobel's avatar
Julian Zobel committed
323

324
325
326
327
	private void startCommunication() {
		for (SimNetInterface net : getHost().getNetworkComponent().getSimNetworkInterfaces()) 
			net.goOnline();
	}
328

Julian Zobel's avatar
Julian Zobel committed
329
330
331
332
333
334
335
336
337
338
	@Override
	public PositionVector getCurrentDirection() {
		return direction;
	}

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

339
340
341
342
343
344
345
346
347
348
	@Override
	public double getMaximumBatteryCapacity() {
		return battery.getMaximumEnergyLevel();
	}

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

349
350
	

351
}