UAVTopologyComponent.java 8.45 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
140
141
142
143
	public boolean isActive() {
		return actuator.isOn();
	}

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

	@Override
	public boolean deactivate() {
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
		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;
174
175
176
	}

	@Override
177
178
	public PositionVector getCurrentLocation() {
		return position.clone();
179
180
181
	}

	@Override
182
	public double getCurrentBatteryLevel() {
183
		return battery.getCurrentPercentage();
184
	}
185

186
187
188
	public RechargeableBattery getBattery() {
		return battery;
	}
189
	
190
191
192
193
194
	@Override
	public UAVMovementModel getUAVMovement() {
		return movement;
	}

Julian Zobel's avatar
Julian Zobel committed
195
196
	@Override
	public void setUAVMovement(UAVMovementModel uavMovement) {
197
		this.movement = uavMovement;		
Julian Zobel's avatar
Julian Zobel committed
198
	}
199
200
201
202

	@Override
	public ActuatorEnergyComponent getActuatorEnergyComponent() {
		return actuator;
Julian Zobel's avatar
Julian Zobel committed
203
	}
204

205
206
207
208
209
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
	@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();
	}

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

Julian Zobel's avatar
Julian Zobel committed
281
282
	public void setControllerInterface(UAVToBaseInterface controllerInterface) {
		this.controllerInterface = controllerInterface;
283
284
		this.connectToBase(null);
		
Julian Zobel's avatar
Julian Zobel committed
285
286
287
288
289
290
291
292
293
	}

	@Override
	public void connectToBase(BaseConnectedCallback cb) {
		BaseTopologyComponent base = UAVBasePlacement.base;
		base.connectUAVToBase(controllerInterface);	
		
		if(cb != null)
			cb.successfulConnection();
294
295
		
		this.state = UAVstate.BASE_CONNECTION;
Julian Zobel's avatar
Julian Zobel committed
296
297
298
299
300
301
302
303
304
	}

	@Override
	public void disconnectFromBase(BaseDisconnectedCallback cb) {
		BaseTopologyComponent base = UAVBasePlacement.base;
		base.disconnectUAVFromBase(controllerInterface);
		
		if(cb != null)
			cb.successfulDisconnection();
305
306
		
		this.state = UAVstate.OFFLINE;
Julian Zobel's avatar
Julian Zobel committed
307
308
309
310
	}

	

311
312

}