UAVTopologyComponent.java 9.03 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;

26
27
import org.apache.batik.bridge.AbstractSVGGradientElementBridge.Stop;

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

Julian Zobel's avatar
Julian Zobel committed
48
49
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BaseConnectedCallback;
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BaseDisconnectedCallback;
50
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.BatteryReplacementCallback;
51
import de.tudarmstadt.maki.simonstrator.api.uavsupport.callbacks.ReachedLocationCallback;
Julian Zobel's avatar
Julian Zobel committed
52
import de.tudarmstadt.maki.simonstrator.api.uavsupport.communication.UAVToBaseInterface;
53

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

88
89
90
91
92
93
	@Override
	public void initialize() {		
		super.initialize();
		
		try {
			actuator = getHost().getComponent(EnergyModel.class)
94
95
					.getComponent(ComponentType.ACTUATOR, StatelessMotorComponent.class);	
			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
			
115
116
117
	public void setUAVComponent(OverlayComponent uavOverlayComponent) {
		this.uavOverlayComponent = uavOverlayComponent;
	}
118
	
119
120
121
122
	public OverlayComponent getUAVComponent() {
		return uavOverlayComponent;
	}

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

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

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

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

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

	@Override
156
157
158
159
160
161
162
163
	public boolean activate() {		
		if(actuator.turnOn()) {
			state = UAVstate.ACTION;
			return true;
		}
		else {
			return false;
		}
164
165
166
167
	}

	@Override
	public boolean deactivate() {
168
		actuator.turnOff();
169
				
170
171
172
173
		if(this.position.getAltitude() != 0) {			
			state = UAVstate.CRASHED;
			System.err.println("UAV was destroyed due to actuator deactivation during flight");
			
174
175
			uavOverlayComponent.shutdown();	
			shutdownCommunication();
176
177
178
179
180
		}
		else {
			state = UAVstate.OFFLINE;
		}
		
181
182
					
		
183
		return true;
184
185
186
	}

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

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

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

Julian Zobel's avatar
Julian Zobel committed
210
211
	@Override
	public void setUAVMovement(UAVMovementModel uavMovement) {
212
		this.movement = uavMovement;		
Julian Zobel's avatar
Julian Zobel committed
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
261
	@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();
	}

262
263
264
	public UAVstate getUAVState() {
		return state;
	}
265
	
266
267
268
269
270
271
272
273
	@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
274
				deactivate();				
275
				cb.reachedLocation();				
276
277
278
279
280
281
			}
		};
		
		movement.setTargetLocation(baseLocation, returnCallback);	
	}
		
282
283
284
285
286
	public void batteryReplacement(BatteryReplacementCallback cb) {
		
		if(state != UAVstate.BASE_CONNECTION)
			throw new UnsupportedOperationException("Cannot recharge if not connected to base!");
		
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.state = UAVstate.BASE_CONNECTION;
304
305
		
		shutdownCommunication();
Julian Zobel's avatar
Julian Zobel committed
306
307
308
309
	}

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

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

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

331
332
	

333
}