remove power-monitor server side to fix windows battery levels #6143
Signed-off-by: si458 <simonsmith5521@gmail.com>
si458 committed
Jun 1, 2024 at 23:17 UTC
b1c3e2a8e7657a1d748906fef4de2b8e3d89eb83
1 file changed
-298
agents/modules_meshcore/power-monitor.js
deleted
-298
@@ -1,298 +0,0 @@
1
-/*
2
-Copyright 2018-2020 Intel Corporation
3
-
4
-Licensed under the Apache License, Version 2.0 (the "License");
5
-you may not use this file except in compliance with the License.
6
-You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
-Unless required by applicable law or agreed to in writing, software
11
-distributed under the License is distributed on an "AS IS" BASIS,
12
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
-See the License for the specific language governing permissions and
14
-limitations under the License.
15
-*/
16
-
17
-var WM_SYSCOMMAND = 0x0112;
18
-var SC_MONITORPOWER = 0xF170;
19
-var HWND_BROADCAST = 0xffff;
20
-var ES_DISPLAY_REQUIRED = 0x00000002;
21
-
22
-function powerMonitor()
23
-{
24
- this._ObjectID = 'power-monitor';
25
- require('events').EventEmitter.call(this, true)
26
- .createEvent('changed')
27
- .createEvent('sx')
28
- .createEvent('batteryLevel')
29
- .createEvent('acdc')
30
- .createEvent('display');
31
-
32
- this._ACState = 1;
33
- this._BatteryLevel = -1;
34
-
35
- if (process.platform == 'win32')
36
- {
37
- // These must be registered BEFORE newListener is hooked up
38
- this.on('batteryLevel', function (level) { this._BatteryLevel = level; });
39
- this.on('acdc', function (m) { this._ACState = (m == 'AC' ? 1 : 0); });
40
- }
41
-
42
- this.on('newListener', function (name, callback)
43
- {
44
- if (name == 'acdc') { callback.call(this, this._ACState == 1 ? 'AC' : 'BATTERY'); }
45
- if (name == 'batteryLevel') { if (this._BatteryLevel >= 0) { callback.call(this, this._BatteryLevel); } }
46
- });
47
-
48
- this._i = setImmediate(function (self)
49
- {
50
- require('user-sessions'); // This is needed because this is where the Windows Messages are processed for these events
51
- delete self._i;
52
- }, this);
53
-
54
- if (process.platform == 'linux')
55
- {
56
- this._ACPath = null;
57
- this._BatteryPath = [];
58
-
59
- var devices = require('fs').readdirSync('/sys/class/power_supply');
60
- for (var i in devices)
61
- {
62
- if (require('fs').readFileSync('/sys/class/power_supply/' + devices[i] + '/type').toString().trim() == 'Mains')
63
- {
64
- this._ACPath = '/sys/class/power_supply/' + devices[i] + '/';
65
- break;
66
- }
67
- }
68
- for (var i in devices)
69
- {
70
- if (require('fs').readFileSync('/sys/class/power_supply/' + devices[i] + '/type').toString().trim() == 'Battery')
71
- {
72
- this._BatteryPath.push('/sys/class/power_supply/' + devices[i] + '/');
73
- }
74
- }
75
- if (this._ACPath != null)
76
- {
77
- this._ACState = parseInt(require('fs').readFileSync(this._ACPath + 'online').toString().trim());
78
- }
79
- if (this._BatteryPath.length > 0)
80
- {
81
- this._getBatteryLevel = function _getBatteryLevel()
82
- {
83
- var sum = 0;
84
- var i;
85
- for (i in this._BatteryPath)
86
- {
87
- sum += parseInt(require('fs').readFileSync(this._BatteryPath[i] + 'capacity').toString().trim());
88
- }
89
- sum = Math.floor(sum / this._BatteryPath.length);
90
- return (sum);
91
- }
92
- this._BatteryLevel = this._getBatteryLevel();
93
-
94
- // Since Battery Levels are not propagated with ACPI, we need to periodically check the battery level
95
- this._BatteryLevelCheck = function _BatteryLevelCheck()
96
- {
97
- var val = this._getBatteryLevel();
98
- if (val != this._BatteryLevel)
99
- {
100
- this._BatteryLevel = val;
101
- this.emit('batteryLevel', val);
102
- }
103
- };
104
- this._BattCheckInterval = setInterval(function (self)
105
- {
106
- self._BatteryLevelCheck.call(self);
107
- }, 300000, this);
108
- }
109
- this._acpiSink = function _acpiSink(acpiEvent)
110
- {
111
- if (acpiEvent.name == 'ac_adapter')
112
- {
113
- _acpiSink.self._ACState = acpiEvent.value;
114
- _acpiSink.self.emit('acdc', acpiEvent.value == 1 ? 'AC' : 'BATTERY');
115
- _acpiSink.self._BatteryLevelCheck();
116
- }
117
- };
118
- this._acpiSink.self = this;
119
- require('linux-acpi').on('acpi', this._acpiSink);
120
- }
121
- if (process.platform == 'darwin')
122
- {
123
- Object.defineProperty(this, "_caffeinate", {
124
- value: (function ()
125
- {
126
- var child = require('child_process').execFile('/bin/sh', ['sh']);
127
- child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
128
- child.stdin.write('whereis caffeinate\nexit\n');
129
- child.waitExit();
130
- return (child.stdout.str.trim());
131
- })()
132
- });
133
- this._getBatteryLevel = function _getBatteryLevel()
134
- {
135
- var child = require('child_process').execFile('/bin/sh', ['sh']);
136
- child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); });
137
- child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
138
- child.stdin.write("pmset -g batt | tr '\\n' '`' | awk -F'`' '");
139
- child.stdin.write('{');
140
- child.stdin.write(' power=split($1,pwr,"AC")>1?"1":"0";');
141
- child.stdin.write(' split($2, batt, " ");');
142
- child.stdin.write(' split(batt[2],chg,"%");');
143
- child.stdin.write(' printf "{\\"ac\\": %s,\\"level\\": %s}",power, chg[1]; ');
144
- child.stdin.write("}'\nexit\n");
145
- child.waitExit();
146
- try {
147
- var info = JSON.parse(child.stdout.str.trim());
148
- return (info);
149
- } catch (e) {
150
- child = require('child_process').execFile('/bin/sh', ['sh']);
151
- child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); });
152
- child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); });
153
- child.stdin.write("pmset -g batt | tr '\\n' '`' | awk -F'`' '");
154
- child.stdin.write('{');
155
- child.stdin.write(' power=split($1,pwr,"AC")>1?"1":"0";');
156
- child.stdin.write(' split($2, batt, " ");');
157
- child.stdin.write(' split(batt[3],chg,"%");');
158
- child.stdin.write(' printf "{\\"ac\\": %s,\\"level\\": %s}",power, chg[1]; ');
159
- child.stdin.write("}'\nexit\n");
160
- child.waitExit();
161
- try {
162
- var info = JSON.parse(child.stdout.str.trim());
163
- return (info);
164
- } catch (e) {
165
- return ({ ac: 1, level: -1 });
166
- }
167
- }
168
- };
169
- this._batteryLevelCheck = function _batteryLevelCheck()
170
- {
171
- var newLevel = this._getBatteryLevel();
172
- if (newLevel.ac != this._ACState)
173
- {
174
- this._ACState = newLevel.ac;
175
- this.emit('acdc', this._ACState == 1 ? 'AC' : 'BATTERY');
176
- }
177
- if (newLevel.level != this._BatteryLevel)
178
- {
179
- this._BatteryLevel = newLevel.level;
180
- this.emit('batteryLevel', this._BatteryLevel);
181
- }
182
- };
183
- var tmp = this._getBatteryLevel();
184
- this._ACState = tmp.ac;
185
- this._BatteryLevel = tmp.level;
186
-
187
- if (this._BatteryLevel >= 0)
188
- {
189
- this._BattCheckInterval = setInterval(function (self)
190
- {
191
- self._batteryLevelCheck.call(self);
192
- }, 300000, this);
193
- }
194
- }
195
- this.sleepDisplay = function sleepDispay(force)
196
- {
197
- var promise = require('promise');
198
- p = new promise(function (res, rej) { this._res = res; this._rej = rej; });
199
-
200
- switch (process.platform)
201
- {
202
- case 'win32':
203
- if (require('user-sessions').getProcessOwnerName(process.pid).tsid == 0)
204
- {
205
- // We are running as LocalSystem, so we have to find a user session for this to work
206
- var options = { launch: { module: 'power-monitor', method: 'sleepDisplay', args: [] } };
207
- try
208
- {
209
- options.user = require('user-sessions').getUsername(require('user-sessions').consoleUid());
210
- }
211
- catch (ee)
212
- {
213
- p._rej('No users logged in');
214
- return (p);
215
- }
216
- p.child = require('child-container').create(options);
217
- p.child.promise = p;
218
- p.child.on('exit', function () { this.promise._res(); });
219
- }
220
- else
221
- {
222
- if (require('child-container').child) { require('win-console').hide(); }
223
- var GM = require('_GenericMarshal');
224
- var user32 = GM.CreateNativeProxy('User32.dll');
225
- user32.CreateMethod('SendMessageA');
226
- user32.SendMessageA(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
227
- p._res();
228
- if (require('child-container').child) { process._exit(); }
229
- }
230
- break;
231
- case 'darwin':
232
- p.child = require('child_process').execFile('/bin/sh', ['sh']);
233
- p.child.promise = p;
234
- p.child.stderr.on('data', function () { });
235
- p.child.stdout.on('data', function () { });
236
- p.child.on('exit', function () { this.promise._res(); });
237
- p.child.stdin.write('pmset displaysleepnow\nexit\n');
238
- break;
239
- default:
240
- p._rej('Not Supported');
241
- break;
242
- }
243
- return (p);
244
- };
245
- this.wakeDisplay = function wakeDisplay()
246
- {
247
- var promise = require('promise');
248
- p = new promise(function (res, rej) { this._res = res; this._rej = rej; });
249
- switch(process.platform)
250
- {
251
- case 'darwin':
252
- if (this._caffeinate)
253
- {
254
- p.child = require('child_process').execFile(this._caffeinate, ['caffeinate', '-u', '-t 2']);
255
- p.child.stdout.on('data', function () { });
256
- p.child.stderr.on('data', function () { });
257
- p.child.on('exit', function (code) { this.promise._res(); });
258
- p.child.promise = p;
259
- }
260
- break;
261
- case 'win32':
262
- if (require('user-sessions').getProcessOwnerName(process.pid).tsid == 0)
263
- {
264
- // We are running as LocalSystem, so we have to find a user session for this to work
265
- var options = { launch: { module: 'power-monitor', method: 'wakeDisplay', args: [] } };
266
- try
267
- {
268
- options.user = require('user-sessions').getUsername(require('user-sessions').consoleUid());
269
- }
270
- catch (ee)
271
- {
272
- p._rej('No users logged in');
273
- return (p);
274
- }
275
- p.child = require('child-container').create(options);
276
- p.child.promise = p;
277
- p.child.on('exit', function () { this.promise._res(); });
278
- }
279
- else
280
- {
281
- if (require('child-container').child) { require('win-console').hide(); }
282
- var GM = require('_GenericMarshal');
283
- var kernel32 = GM.CreateNativeProxy('Kernel32.dll');
284
- kernel32.CreateMethod('SetThreadExecutionState');
285
- kernel32.SetThreadExecutionState(ES_DISPLAY_REQUIRED);
286
- p._res();
287
- if (require('child-container').child) { process._exit(); }
288
- }
289
- break;
290
- default:
291
- p._res();
292
- break;
293
- }
294
- return (p);
295
- };
296
-}
297
-
298
-module.exports = new powerMonitor();