UAVTopologyComponent.java 8.56 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

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
65
	private OverlayComponent uavOverlayComponent;
	
	private ActuatorEnergyComponent actuator;
66
67
	private RechargeableBattery battery;
	
Julian Zobel's avatar
Julian Zobel committed
68
	private UAVstate state;
69
	private PositionVector baseLocation;
Julian Zobel's avatar
Julian Zobel committed
70
	
Julian Zobel's avatar
Julian Zobel committed
71
72
	private UAVToBaseInterface controllerInterface;
	
73
74
75
76
77
78
79
80
81
	/**
	 * 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) {
82
		super(host, topology, movementModel, placementModel, registerAsInformationProviderInSiS);		
83
84
	}

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

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

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

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

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

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

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

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

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

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

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

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

	@Override
	public ActuatorEnergyComponent getActuatorEnergyComponent() {
		return actuator;
Julian Zobel's avatar
Julian Zobel committed
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
259
	@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();
	}

260
261
262
	public UAVstate getUAVState() {
		return state;
	}
263
	
264
265
266
267
268
269
270
271
	@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
272
				deactivate();				
273
				cb.reachedLocation();				
274
275
276
277
278
279
			}
		};
		
		movement.setTargetLocation(baseLocation, returnCallback);	
	}
		
280
281
282
283
284
	public void batteryReplacement(BatteryReplacementCallback cb) {
		
		if(state != UAVstate.BASE_CONNECTION)
			throw new UnsupportedOperationException("Cannot recharge if not connected to base!");
		
285
		BaseTopologyComponent base = UAVBasePlacement.base;
286
		base.getCharger().charge(this, cb);
287
	}
288

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

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

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

	

317
318

}