UAVTopologyComponent.java 8.55 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;
Julian Zobel's avatar
Julian Zobel committed
44
45
46
import de.tudarmstadt.maki.simonstrator.api.uavsupport.UAVToBaseInterface;
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;
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
64
	private OverlayComponent uavOverlayComponent;
	
	private ActuatorEnergyComponent actuator;
65
66
	private RechargeableBattery battery;
	
Julian Zobel's avatar
Julian Zobel committed
67
	private UAVstate state;
68
	private PositionVector baseLocation;
Julian Zobel's avatar
Julian Zobel committed
69
	
Julian Zobel's avatar
Julian Zobel committed
70
71
	private UAVToBaseInterface controllerInterface;
	
72
73
74
75
76
77
78
79
80
	/**
	 * 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) {
81
		super(host, topology, movementModel, placementModel, registerAsInformationProviderInSiS);		
82
83
	}

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

118
119
	@Override
	public double getMinMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
120
		return movement.getMinCruiseSpeed();
121
122
123
124
	}

	@Override
	public double getMaxMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
125
		return movement.getMaxCruiseSpeed();
126
127
128
129
	}

	@Override
	public double getMovementSpeed() {
Julian Zobel's avatar
Julian Zobel committed
130
		return movement.getCurrentSpeed();
131
132
133
134
	}

	@Override
	public void setMovementSpeed(double speed) {
Julian Zobel's avatar
Julian Zobel committed
135
		movement.setPreferredCruiseSpeed(speed);
136
137
138
	}

	@Override
139
	public boolean isActive() {
140
141
142
143
144
145
146
147
		if(actuator.isOn())
			return true;
		else {
			if(state == UAVstate.ACTION || state == UAVstate.RETURN) {
				this.deactivate();
			}
			return false;
		}
148
149
150
	}

	@Override
151
152
153
154
155
156
157
158
	public boolean activate() {		
		if(actuator.turnOn()) {
			state = UAVstate.ACTION;
			return true;
		}
		else {
			return false;
		}
159
160
161
162
	}

	@Override
	public boolean deactivate() {
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
		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;
181
182
183
	}

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

	@Override
189
	public double getCurrentBatteryLevel() {
190
		return battery.getCurrentPercentage();
191
	}
192

193
194
195
	public RechargeableBattery getBattery() {
		return battery;
	}
196
	
197
198
199
200
201
	@Override
	public UAVMovementModel getUAVMovement() {
		return movement;
	}

Julian Zobel's avatar
Julian Zobel committed
202
203
	@Override
	public void setUAVMovement(UAVMovementModel uavMovement) {
204
		this.movement = uavMovement;		
Julian Zobel's avatar
Julian Zobel committed
205
	}
206
207
208
209

	@Override
	public ActuatorEnergyComponent getActuatorEnergyComponent() {
		return actuator;
Julian Zobel's avatar
Julian Zobel committed
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
248
249
250
251
252
253
254
255
256
257
258
	@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();
	}

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

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

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

	@Override
	public void disconnectFromBase(BaseDisconnectedCallback cb) {
		BaseTopologyComponent base = UAVBasePlacement.base;
		base.disconnectUAVFromBase(controllerInterface);
		
		if(cb != null)
			cb.successfulDisconnection();
310
311
		
		this.state = UAVstate.OFFLINE;
Julian Zobel's avatar
Julian Zobel committed
312
313
314
315
	}

	

316
317

}