Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Simonstrator
PeerfactSim.KOM
Commits
4e61020c
Commit
4e61020c
authored
Mar 30, 2022
by
Lukas Wehrstein
Browse files
Update MultiStateEnergyComponent.java
parent
0739cb38
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/de/tud/kom/p2psim/impl/energy/components/MultiStateEnergyComponent.java
View file @
4e61020c
...
...
@@ -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
tru
e
;
wasNewState
=
fals
e
;
}
}
// 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
;
}
/**
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment