1 | package test.article2.recs.utils; |
---|
2 | |
---|
3 | import java.util.Map; |
---|
4 | |
---|
5 | import schedframe.resources.ResourceStatus; |
---|
6 | import schedframe.resources.computing.ComputingResource; |
---|
7 | import schedframe.resources.computing.profiles.energy.EnergyEvent; |
---|
8 | import schedframe.resources.computing.profiles.energy.EnergyEventType; |
---|
9 | import schedframe.resources.computing.profiles.energy.power.PState; |
---|
10 | import schedframe.resources.computing.profiles.energy.power.PowerProfile; |
---|
11 | import schedframe.resources.computing.profiles.energy.power.PowerStateName; |
---|
12 | import schedframe.resources.computing.profiles.energy.power.StandardPowerStateName; |
---|
13 | import schedframe.resources.computing.profiles.energy.power.ui.ProcessorPowerInterface; |
---|
14 | |
---|
15 | public class RecsProcessorPowerInterface extends ProcessorPowerInterface { |
---|
16 | |
---|
17 | protected PState currentPState; |
---|
18 | |
---|
19 | public RecsProcessorPowerInterface(ComputingResource resource, PowerProfile pp){ |
---|
20 | super(resource, pp); |
---|
21 | currentPowerState = StandardPowerStateName.ON; |
---|
22 | currentPState = getLowestPState(); |
---|
23 | if(currentPState == null) |
---|
24 | currentPState = getSupportedPStates().get("P0"); |
---|
25 | } |
---|
26 | |
---|
27 | public boolean setPowerState(PowerStateName powerState){ |
---|
28 | if(!supportPowerState(powerState)) |
---|
29 | return false; |
---|
30 | if(powerState != currentPowerState){ |
---|
31 | currentPowerState = powerState; |
---|
32 | if(powerState == StandardPowerStateName.OFF){ |
---|
33 | resource.setStatus(ResourceStatus.UNAVAILABLE); |
---|
34 | } else if(powerState == StandardPowerStateName.ON){ |
---|
35 | resource.setStatus(ResourceStatus.FREE); |
---|
36 | } |
---|
37 | resource.handleEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, resource.getName())); |
---|
38 | } |
---|
39 | |
---|
40 | return true; |
---|
41 | } |
---|
42 | |
---|
43 | public PState getPState(){ |
---|
44 | return currentPState; |
---|
45 | } |
---|
46 | |
---|
47 | public Map<String, PState> getSupportedPStates() { |
---|
48 | return powerProfile.getSupportedPStates(); |
---|
49 | } |
---|
50 | |
---|
51 | public boolean supportPState(PState pState) { |
---|
52 | |
---|
53 | for(String pStateName: getSupportedPStates().keySet()){ |
---|
54 | if(pState.getName().equals(pStateName)){ |
---|
55 | return true; |
---|
56 | } |
---|
57 | } |
---|
58 | return false; |
---|
59 | } |
---|
60 | |
---|
61 | public boolean setPState(String pStateName){ |
---|
62 | PState newPState = getSupportedPStates().get(pStateName); |
---|
63 | |
---|
64 | |
---|
65 | if(newPState != null && newPState != currentPState){ |
---|
66 | //double factor = newPState.getFrequency()/currentPState.getFrequency(); |
---|
67 | currentPState = newPState; |
---|
68 | //CpuSpeed speed = (CpuSpeed)resource.getResourceCharacteristic().getResourceUnits().get(StandardResourceUnitName.CPUSPEED).get(0); |
---|
69 | //speed.setAmount(Double.valueOf(currentPState.getFrequency()).intValue()); |
---|
70 | //new ResourceEventCommand(resource).execute(EnergyEventType.FREQUENCY_CHANGED); |
---|
71 | resource.handleEvent(new EnergyEvent(EnergyEventType.FREQUENCY_CHANGED, resource.getName())); |
---|
72 | //resource.getScheduler().sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE, resource.getName()); |
---|
73 | return true; |
---|
74 | } |
---|
75 | |
---|
76 | return false; |
---|
77 | } |
---|
78 | |
---|
79 | public double getFrequency() { |
---|
80 | return currentPState.getFrequency(); |
---|
81 | } |
---|
82 | |
---|
83 | public boolean setFrequency(double freq) { |
---|
84 | |
---|
85 | for(String pStateName: getSupportedPStates().keySet()){ |
---|
86 | if(getSupportedPStates().get(pStateName).getFrequency() == freq){ |
---|
87 | setPState(pStateName); |
---|
88 | return true; |
---|
89 | } |
---|
90 | } |
---|
91 | return false; |
---|
92 | } |
---|
93 | |
---|
94 | public double getPowerConsumption(PState state) throws NoSuchFieldException{ |
---|
95 | double powerConsumption = 0; |
---|
96 | if(supportPState(state)){ |
---|
97 | for(String pStateName: getSupportedPStates().keySet()){ |
---|
98 | if(pStateName.equals(state.getName())){ |
---|
99 | powerConsumption = getSupportedPStates().get(pStateName).getPower(); |
---|
100 | break; |
---|
101 | } |
---|
102 | } |
---|
103 | } |
---|
104 | else throw new NoSuchFieldException(); |
---|
105 | return powerConsumption; |
---|
106 | } |
---|
107 | |
---|
108 | public PState getLowestPState(){ |
---|
109 | PState lowPState = null; |
---|
110 | double highestFreq = Double.MIN_VALUE; |
---|
111 | for(String key: getSupportedPStates() .keySet()){ |
---|
112 | PState pState = getSupportedPStates().get(key); |
---|
113 | if(pState.getFrequency() > highestFreq){ |
---|
114 | highestFreq = pState.getFrequency(); |
---|
115 | lowPState = pState; |
---|
116 | } |
---|
117 | } |
---|
118 | return lowPState; |
---|
119 | } |
---|
120 | |
---|
121 | public PState getHighestPState(){ |
---|
122 | PState highPState = null; |
---|
123 | double lowestFreq = Double.MAX_VALUE; |
---|
124 | for(String key: getSupportedPStates() .keySet()){ |
---|
125 | PState pState = getSupportedPStates().get(key); |
---|
126 | if(pState.getFrequency() < lowestFreq){ |
---|
127 | lowestFreq = pState.getFrequency(); |
---|
128 | highPState = pState; |
---|
129 | } |
---|
130 | } |
---|
131 | return highPState; |
---|
132 | } |
---|
133 | |
---|
134 | } |
---|
135 | |
---|