package org.fog.entities; import org.cloudbus.cloudsim.core.CloudSim; import org.cloudbus.cloudsim.core.SimEntity; import org.cloudbus.cloudsim.core.SimEvent; import org.fog.application.AppLoop; import org.fog.application.MyApplication; import org.fog.utils.FogEvents; import org.fog.utils.GeoLocation; import org.fog.utils.Logger; import org.fog.utils.TimeKeeper; public class MyActuator extends SimEntity{ private int gatewayDeviceId; private double latency; private GeoLocation geoLocation; private String appId; private int userId; private String actuatorType; private MyApplication app; public MyActuator(String name, int userId, String appId, int gatewayDeviceId, double latency, GeoLocation geoLocation, String actuatorType, String srcModuleName) { super(name); this.setAppId(appId); this.gatewayDeviceId = gatewayDeviceId; this.geoLocation = geoLocation; setUserId(userId); setMyActuatorType(actuatorType); setLatency(latency); } public MyActuator(String name, int userId, String appId, String actuatorType) { super(name); this.setAppId(appId); setUserId(userId); setMyActuatorType(actuatorType); } @Override public void startEntity() { sendNow(gatewayDeviceId, FogEvents.ACTUATOR_JOINED, getLatency()); } @Override public void processEvent(SimEvent ev) { switch(ev.getTag()){ case FogEvents.TUPLE_ARRIVAL: processTupleArrival(ev); break; } } private void processTupleArrival(SimEvent ev) { Tuple tuple = (Tuple)ev.getData(); Logger.debug(getName(), "Received tuple "+tuple.getCloudletId()+"on "+tuple.getDestModuleName()); String srcModule = tuple.getSrcModuleName(); String destModule = tuple.getDestModuleName(); MyApplication app = getApp(); for(AppLoop loop : app.getLoops()){ if(loop.hasEdge(srcModule, destModule) && loop.isEndModule(destModule)){ Double startTime = TimeKeeper.getInstance().getEmitTimes().get(tuple.getActualTupleId()); if(startTime==null) break; if(!TimeKeeper.getInstance().getLoopIdToCurrentAverage().containsKey(loop.getLoopId())){ TimeKeeper.getInstance().getLoopIdToCurrentAverage().put(loop.getLoopId(), 0.0); TimeKeeper.getInstance().getLoopIdToCurrentNum().put(loop.getLoopId(), 0); } double currentAverage = TimeKeeper.getInstance().getLoopIdToCurrentAverage().get(loop.getLoopId()); int currentCount = TimeKeeper.getInstance().getLoopIdToCurrentNum().get(loop.getLoopId()); double delay = CloudSim.clock()- TimeKeeper.getInstance().getEmitTimes().get(tuple.getActualTupleId()); TimeKeeper.getInstance().getEmitTimes().remove(tuple.getActualTupleId()); double newAverage = (currentAverage*currentCount + delay)/(currentCount+1); TimeKeeper.getInstance().getLoopIdToCurrentAverage().put(loop.getLoopId(), newAverage); TimeKeeper.getInstance().getLoopIdToCurrentNum().put(loop.getLoopId(), currentCount+1); break; } } } @Override public void shutdownEntity() { } public int getGatewayDeviceId() { return gatewayDeviceId; } public void setGatewayDeviceId(int gatewayDeviceId) { this.gatewayDeviceId = gatewayDeviceId; } public GeoLocation getGeoLocation() { return geoLocation; } public void setGeoLocation(GeoLocation geoLocation) { this.geoLocation = geoLocation; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getMyActuatorType() { return actuatorType; } public void setMyActuatorType(String actuatorType) { this.actuatorType = actuatorType; } public MyApplication getApp() { return app; } public void setApp(MyApplication app) { this.app = app; } public double getLatency() { return latency; } public void setLatency(double latency) { this.latency = latency; } }