Commit 4e61020c authored by Lukas Wehrstein's avatar Lukas Wehrstein
Browse files

Update MultiStateEnergyComponent.java

parent 0739cb38
......@@ -20,7 +20,6 @@
package de.tud.kom.p2psim.impl.energy.components;
import java.util.LinkedList;
import java.util.List;
import de.tud.kom.p2psim.api.energy.ComponentType;
......@@ -28,12 +27,10 @@ import de.tud.kom.p2psim.api.energy.EnergyComponent;
import de.tud.kom.p2psim.api.energy.EnergyState;
import de.tud.kom.p2psim.impl.energy.DefaultEnergyState;
import de.tud.kom.p2psim.api.energy.EnergyEventListener;
import de.tud.kom.p2psim.api.energy.EnergyModel;
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.component.HostComponent;
/**
* Multistate Energy Components enable components to support several energy states with different power consumptions.
......@@ -47,6 +44,7 @@ public class MultiStateEnergyComponent implements EnergyComponent{
private boolean on;
private EnergyEventListener energyEventListener;
private ComponentType type;
private long lastConsumption;
/**
* Creates a multistateenergyComponent
......@@ -57,24 +55,51 @@ public class MultiStateEnergyComponent implements EnergyComponent{
this.states = states;
this.on = true;
this.type = type;
if(states.size() > 0) {
this.currentState = states.get(0);
}else {
this.currentState = new DefaultEnergyState("default", 0);
}
// take first state as the current state, create a state with consumption 0, if no states are defined.
// if(states.size() > 0) {
// this.currentState = states.get(0);
// }else {
// this.currentState = new DefaultEnergyState("default", 0);
// }
this.currentState = new DefaultEnergyState("init", 0);
this.lastConsumption = Time.getCurrentTime();
Event.scheduleWithDelay(Time.SECOND, this, this, 0);
}
@Override
public void eventOccurred(Object content, int type) {
public void eventOccurred(Object content, int id) { // id = -1 means this was an stateChange triggered consumption
// Just for debugging purpose
// if (energyEventListener instanceof AbstractEnergyModel) {
// AbstractEnergyModel em = (AbstractEnergyModel) energyEventListener;
// Monitor.log(getClass(), Level.DEBUG, "Host %s: %s Event Occured - energy consumption", em.getHost().getId(), Time.getCurrentTime());
// }
if(isOn()) {
// action to perform, if event occured
double consumedEnergy = currentState.getEnergyConsumption();
Monitor.log(getClass(), Level.INFO, "%s consumed %s uJ", type, consumedEnergy);
// calculate elapsed time since last energy consumption
long interval = Time.getCurrentTime() - this.lastConsumption;
double intervalS = ((double) interval) / Time.SECOND;
// calculate the "real" energy consumption
double consumedEnergy = currentState.getEnergyConsumption() * intervalS;
// action to perform, if event occurred
Monitor.log(getClass(), Level.INFO, "%s consumed %s uJ in %s s.", this.type, consumedEnergy, intervalS);
// consume the energy
energyEventListener.componentConsumedEnergy(this, consumedEnergy);
// set the last consumption time to now
this.lastConsumption = Time.getCurrentTime();
if (energyEventListener.componentCanBeActivated(this)) {
Event.scheduleWithDelay(Time.SECOND, this, null, 0);
if(id == -1) {
// event occured due to state change - this means do not schedule another event
Monitor.log(getClass(), Level.DEBUG, "This was an state changed based energy consumption.");
}else {
// schedule next static query interval
Event.scheduleWithDelay(Time.SECOND, this, null, 0);
}
} else {
this.turnOff();
}
......@@ -102,24 +127,32 @@ public class MultiStateEnergyComponent implements EnergyComponent{
}
/**
*
* Goes to another state, adds the state to the states list, if not already known
* @param nextState state to go into
* @return true, if state was already in states list, false, if this was a new state
*/
public boolean changeState(EnergyState nextState) {
// search for this state in the states list and make this active.
Monitor.log(getClass(), Level.DEBUG, "change state into %s", nextState.getName());
boolean wasNewState = true;
for(EnergyState es : states) {
if(es.equals(nextState)) {
currentState = es;
return true;
wasNewState = false;
}
}
// if not available in list, add this state to list and make it active
states.add(nextState);
currentState = nextState;
return false;
if(wasNewState) {
// if not available in list, add this state to list and make it active
states.add(nextState);
currentState = nextState;
}
// consume energy
Event.scheduleImmediately(this, null, -1); // -1 means, that this is a stateChangePush
return wasNewState;
}
/**
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment