Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: chrome/browser/ui/webui/chromeos/power_ui.cc

Issue 149973002: [chromeos/about:power] Collect cpuidle and cpufreq stats (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: read sysfs on blocking pool via a non-member function Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/resources/chromeos/power.js ('k') | chrome/chrome_browser_chromeos.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/chromeos/power_ui.h" 5 #include "chrome/browser/ui/webui/chromeos/power_ui.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
11 #include "base/time/time.h" 11 #include "base/time/time.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "chrome/browser/chromeos/power/power_data_collector.h" 13 #include "chrome/browser/chromeos/power/power_data_collector.h"
14 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/common/url_constants.h" 15 #include "chrome/common/url_constants.h"
16 #include "content/public/browser/web_ui.h" 16 #include "content/public/browser/web_ui.h"
17 #include "content/public/browser/web_ui_data_source.h" 17 #include "content/public/browser/web_ui_data_source.h"
18 #include "content/public/browser/web_ui_message_handler.h" 18 #include "content/public/browser/web_ui_message_handler.h"
19 #include "grit/browser_resources.h" 19 #include "grit/browser_resources.h"
20 #include "grit/generated_resources.h" 20 #include "grit/generated_resources.h"
21 21
22 namespace chromeos { 22 namespace chromeos {
23 23
24 namespace { 24 namespace {
25 25
26 const char kStringsJsFile[] = "strings.js"; 26 const char kStringsJsFile[] = "strings.js";
27
27 const char kRequestBatteryChargeDataCallback[] = "requestBatteryChargeData"; 28 const char kRequestBatteryChargeDataCallback[] = "requestBatteryChargeData";
28 const char kOnRequestBatteryChargeDataFunction[] = 29 const char kOnRequestBatteryChargeDataFunction[] =
29 "powerUI.showBatteryChargeData"; 30 "powerUI.showBatteryChargeData";
30 31
32 const char kRequestCpuIdleDataCallback[] = "requestCpuIdleData";
33 const char kOnRequestCpuIdleDataFunction[] =
34 "powerUI.showCpuIdleData";
35
36 const char kRequestCpuFreqDataCallback[] = "requestCpuFreqData";
37 const char kOnRequestCpuFreqDataFunction[] =
38 "powerUI.showCpuFreqData";
39
31 class PowerMessageHandler : public content::WebUIMessageHandler { 40 class PowerMessageHandler : public content::WebUIMessageHandler {
32 public: 41 public:
33 PowerMessageHandler(); 42 PowerMessageHandler();
34 virtual ~PowerMessageHandler(); 43 virtual ~PowerMessageHandler();
35 44
36 // WebUIMessageHandler implementation. 45 // WebUIMessageHandler implementation.
37 virtual void RegisterMessages() OVERRIDE; 46 virtual void RegisterMessages() OVERRIDE;
38 47
39 private: 48 private:
40 void OnGetBatteryChargeData(const base::ListValue* value); 49 void OnGetBatteryChargeData(const base::ListValue* value);
50 void OnGetCpuIdleData(const base::ListValue* value);
51 void OnGetCpuFreqData(const base::ListValue* value);
52 void GetJsStateOccupancyData(
53 const std::vector<CpuDataCollector::StateOccupancySampleDeque>& data,
54 const std::vector<std::string>& state_names,
55 base::ListValue* js_data);
56 void GetJsSystemResumedData(base::ListValue* value);
41 }; 57 };
42 58
43 PowerMessageHandler::PowerMessageHandler() { 59 PowerMessageHandler::PowerMessageHandler() {
44 } 60 }
45 61
46 PowerMessageHandler::~PowerMessageHandler() { 62 PowerMessageHandler::~PowerMessageHandler() {
47 } 63 }
48 64
49 void PowerMessageHandler::RegisterMessages() { 65 void PowerMessageHandler::RegisterMessages() {
50 web_ui()->RegisterMessageCallback( 66 web_ui()->RegisterMessageCallback(
51 kRequestBatteryChargeDataCallback, 67 kRequestBatteryChargeDataCallback,
52 base::Bind(&PowerMessageHandler::OnGetBatteryChargeData, 68 base::Bind(&PowerMessageHandler::OnGetBatteryChargeData,
53 base::Unretained(this))); 69 base::Unretained(this)));
70 web_ui()->RegisterMessageCallback(
71 kRequestCpuIdleDataCallback,
72 base::Bind(&PowerMessageHandler::OnGetCpuIdleData,
73 base::Unretained(this)));
74 web_ui()->RegisterMessageCallback(
75 kRequestCpuFreqDataCallback,
76 base::Bind(&PowerMessageHandler::OnGetCpuFreqData,
77 base::Unretained(this)));
54 } 78 }
55 79
56 void PowerMessageHandler::OnGetBatteryChargeData(const base::ListValue* value) { 80 void PowerMessageHandler::OnGetBatteryChargeData(const base::ListValue* value) {
57 const std::deque<PowerDataCollector::PowerSupplySample>& power_supply = 81 const std::deque<PowerDataCollector::PowerSupplySample>& power_supply =
58 PowerDataCollector::Get()->power_supply_data(); 82 PowerDataCollector::Get()->power_supply_data();
59 base::ListValue js_power_supply_data; 83 base::ListValue js_power_supply_data;
60 for (size_t i = 0; i < power_supply.size(); ++i) { 84 for (size_t i = 0; i < power_supply.size(); ++i) {
61 const PowerDataCollector::PowerSupplySample& sample = power_supply[i]; 85 const PowerDataCollector::PowerSupplySample& sample = power_supply[i];
62 scoped_ptr<base::DictionaryValue> element(new base::DictionaryValue); 86 scoped_ptr<base::DictionaryValue> element(new base::DictionaryValue);
63 element->SetDouble("batteryPercent", sample.battery_percent); 87 element->SetDouble("batteryPercent", sample.battery_percent);
64 element->SetDouble("batteryDischargeRate", sample.battery_discharge_rate); 88 element->SetDouble("batteryDischargeRate", sample.battery_discharge_rate);
65 element->SetBoolean("externalPower", sample.external_power); 89 element->SetBoolean("externalPower", sample.external_power);
66 element->SetDouble("time", sample.time.ToJsTime()); 90 element->SetDouble("time", sample.time.ToJsTime());
67 91
68 js_power_supply_data.Append(element.release()); 92 js_power_supply_data.Append(element.release());
69 } 93 }
70 94
95 base::ListValue js_system_resumed_data;
96 GetJsSystemResumedData(&js_system_resumed_data);
97
98 web_ui()->CallJavascriptFunction(kOnRequestBatteryChargeDataFunction,
99 js_power_supply_data,
100 js_system_resumed_data);
101 }
102
103 void PowerMessageHandler::OnGetCpuIdleData(const base::ListValue* value) {
104 const CpuDataCollector& cpu_data_collector =
105 PowerDataCollector::Get()->cpu_data_collector();
106
107 const std::vector<CpuDataCollector::StateOccupancySampleDeque>& idle_data =
108 cpu_data_collector.cpu_idle_state_data();
109 const std::vector<std::string>& idle_state_names =
110 cpu_data_collector.cpu_idle_state_names();
111 base::ListValue js_idle_data;
112 GetJsStateOccupancyData(idle_data, idle_state_names, &js_idle_data);
113
114 base::ListValue js_system_resumed_data;
115 GetJsSystemResumedData(&js_system_resumed_data);
116
117 web_ui()->CallJavascriptFunction(kOnRequestCpuIdleDataFunction,
118 js_idle_data,
119 js_system_resumed_data);
120 }
121
122 void PowerMessageHandler::OnGetCpuFreqData(const base::ListValue* value) {
123 const CpuDataCollector& cpu_data_collector =
124 PowerDataCollector::Get()->cpu_data_collector();
125
126 const std::vector<CpuDataCollector::StateOccupancySampleDeque>& freq_data =
127 cpu_data_collector.cpu_freq_state_data();
128 const std::vector<std::string>& freq_state_names =
129 cpu_data_collector.cpu_freq_state_names();
130 base::ListValue js_freq_data;
131 GetJsStateOccupancyData(freq_data, freq_state_names, &js_freq_data);
132
133 base::ListValue js_system_resumed_data;
134 GetJsSystemResumedData(&js_system_resumed_data);
135
136 web_ui()->CallJavascriptFunction(kOnRequestCpuFreqDataFunction,
137 js_freq_data,
138 js_system_resumed_data);
139 }
140
141 void PowerMessageHandler::GetJsSystemResumedData(base::ListValue *data) {
142 DCHECK(data);
143
71 const std::deque<PowerDataCollector::SystemResumedSample>& system_resumed = 144 const std::deque<PowerDataCollector::SystemResumedSample>& system_resumed =
72 PowerDataCollector::Get()->system_resumed_data(); 145 PowerDataCollector::Get()->system_resumed_data();
73 base::ListValue js_system_resumed_data;
74 for (size_t i = 0; i < system_resumed.size(); ++i) { 146 for (size_t i = 0; i < system_resumed.size(); ++i) {
75 const PowerDataCollector::SystemResumedSample& sample = system_resumed[i]; 147 const PowerDataCollector::SystemResumedSample& sample = system_resumed[i];
76 scoped_ptr<base::DictionaryValue> element(new base::DictionaryValue); 148 scoped_ptr<base::DictionaryValue> element(new base::DictionaryValue);
77 element->SetDouble("sleepDuration", 149 element->SetDouble("sleepDuration",
78 sample.sleep_duration.InMillisecondsF()); 150 sample.sleep_duration.InMillisecondsF());
79 element->SetDouble("time", sample.time.ToJsTime()); 151 element->SetDouble("time", sample.time.ToJsTime());
80 152
81 js_system_resumed_data.Append(element.release()); 153 data->Append(element.release());
82 } 154 }
155 }
83 156
84 web_ui()->CallJavascriptFunction(kOnRequestBatteryChargeDataFunction, 157 void PowerMessageHandler::GetJsStateOccupancyData(
85 js_power_supply_data, 158 const std::vector<CpuDataCollector::StateOccupancySampleDeque>& data,
86 js_system_resumed_data); 159 const std::vector<std::string>& state_names,
160 base::ListValue *js_data) {
161 for (unsigned int cpu = 0; cpu < data.size(); ++cpu) {
162 const CpuDataCollector::StateOccupancySampleDeque& sample_deque = data[cpu];
163 scoped_ptr<base::ListValue> js_sample_list(new base::ListValue);
164 for (unsigned int i = 0; i < sample_deque.size(); ++i) {
165 const CpuDataCollector::StateOccupancySample& sample = sample_deque[i];
166 scoped_ptr<base::DictionaryValue> js_sample(new base::DictionaryValue);
167 js_sample->SetDouble("time", sample.time.ToJsTime());
168 js_sample->SetBoolean("cpuOnline", sample.cpu_online);
169
170 scoped_ptr<base::DictionaryValue> state_dict(new base::DictionaryValue);
171 for (size_t index = 0; index < sample.time_in_state.size(); ++index) {
172 state_dict->SetDouble(state_names[index],
173 static_cast<double>(sample.time_in_state[index]));
174 }
175 js_sample->Set("timeInState", state_dict.release());
176
177 js_sample_list->Append(js_sample.release());
178 }
179 js_data->Append(js_sample_list.release());
180 }
87 } 181 }
88 182
89 } // namespace 183 } // namespace
90 184
91 PowerUI::PowerUI(content::WebUI* web_ui) : content::WebUIController(web_ui) { 185 PowerUI::PowerUI(content::WebUI* web_ui) : content::WebUIController(web_ui) {
92 web_ui->AddMessageHandler(new PowerMessageHandler()); 186 web_ui->AddMessageHandler(new PowerMessageHandler());
93 187
94 content::WebUIDataSource* html = 188 content::WebUIDataSource* html =
95 content::WebUIDataSource::Create(chrome::kChromeUIPowerHost); 189 content::WebUIDataSource::Create(chrome::kChromeUIPowerHost);
96 html->SetUseJsonJSFormatV2(); 190 html->SetUseJsonJSFormatV2();
97 191
98 html->AddLocalizedString("titleText", IDS_ABOUT_POWER_TITLE); 192 html->AddLocalizedString("titleText", IDS_ABOUT_POWER_TITLE);
193 html->AddLocalizedString("showButton", IDS_ABOUT_POWER_SHOW_BUTTON);
194 html->AddLocalizedString("hideButton", IDS_ABOUT_POWER_HIDE_BUTTON);
99 html->AddLocalizedString("reloadButton", IDS_ABOUT_POWER_RELOAD_BUTTON); 195 html->AddLocalizedString("reloadButton", IDS_ABOUT_POWER_RELOAD_BUTTON);
196 html->AddLocalizedString("notEnoughDataAvailableYet",
197 IDS_ABOUT_POWER_NOT_ENOUGH_DATA);
198 html->AddLocalizedString("systemSuspended",
199 IDS_ABOUT_POWER_SYSTEM_SUSPENDED);
200 html->AddLocalizedString("invalidData", IDS_ABOUT_POWER_INVALID);
201 html->AddLocalizedString("offlineText", IDS_ABOUT_POWER_OFFLINE);
202
203 html->AddLocalizedString("batteryChargeSectionTitle",
204 IDS_ABOUT_POWER_BATTERY_CHARGE_SECTION_TITLE);
100 html->AddLocalizedString("batteryChargePercentageHeader", 205 html->AddLocalizedString("batteryChargePercentageHeader",
101 IDS_ABOUT_POWER_BATTERY_CHARGE_PERCENTAGE_HEADER); 206 IDS_ABOUT_POWER_BATTERY_CHARGE_PERCENTAGE_HEADER);
102 html->AddLocalizedString("batteryDischargeRateHeader", 207 html->AddLocalizedString("batteryDischargeRateHeader",
103 IDS_ABOUT_POWER_BATTERY_DISCHARGE_RATE_HEADER); 208 IDS_ABOUT_POWER_BATTERY_DISCHARGE_RATE_HEADER);
104 html->AddLocalizedString("negativeDischargeRateInfo", 209 html->AddLocalizedString("dischargeRateLegendText",
105 IDS_ABOUT_POWER_NEGATIVE_DISCHARGE_RATE_INFO); 210 IDS_ABOUT_POWER_DISCHARGE_RATE_LEGEND_TEXT);
106 html->AddLocalizedString("notEnoughDataAvailableYet", 211
107 IDS_ABOUT_POWER_NOT_ENOUGH_DATA); 212 html->AddLocalizedString("cpuIdleSectionTitle",
108 html->AddLocalizedString("systemSuspended", 213 IDS_ABOUT_POWER_CPU_IDLE_SECTION_TITLE);
109 IDS_ABOUT_POWER_SYSTEM_SUSPENDED); 214 html->AddLocalizedString("idleStateOccupancyPercentageHeader",
215 IDS_ABOUT_POWER_CPU_IDLE_STATE_OCCUPANCY_PERCENTAGE);
216
217 html->AddLocalizedString("cpuFreqSectionTitle",
218 IDS_ABOUT_POWER_CPU_FREQ_SECTION_TITLE);
219 html->AddLocalizedString("frequencyStateOccupancyPercentageHeader",
220 IDS_ABOUT_POWER_CPU_FREQ_STATE_OCCUPANCY_PERCENTAGE);
221
110 html->SetJsonPath(kStringsJsFile); 222 html->SetJsonPath(kStringsJsFile);
111 223
112 html->AddResourcePath("power.css", IDR_ABOUT_POWER_CSS); 224 html->AddResourcePath("power.css", IDR_ABOUT_POWER_CSS);
113 html->AddResourcePath("power.js", IDR_ABOUT_POWER_JS); 225 html->AddResourcePath("power.js", IDR_ABOUT_POWER_JS);
114 html->SetDefaultResource(IDR_ABOUT_POWER_HTML); 226 html->SetDefaultResource(IDR_ABOUT_POWER_HTML);
115 227
116 Profile* profile = Profile::FromWebUI(web_ui); 228 Profile* profile = Profile::FromWebUI(web_ui);
117 content::WebUIDataSource::Add(profile, html); 229 content::WebUIDataSource::Add(profile, html);
118 } 230 }
119 231
120 PowerUI::~PowerUI() { 232 PowerUI::~PowerUI() {
121 } 233 }
122 234
123 } // namespace chromeos 235 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/resources/chromeos/power.js ('k') | chrome/chrome_browser_chromeos.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698