-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathpressure-calibrator.js
113 lines (97 loc) · 2.98 KB
/
pressure-calibrator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const MEASURE_TIME = 10_000;
const DELAY = 4_000;
export class PressureCalibrator {
#pressureGeneratorFn;
#pressureLevel = 0;
measurement = [];
constructor(pressureGeneratorFn) {
this.#pressureGeneratorFn = pressureGeneratorFn;
}
#computeBestLevels() {
const nominal = { percentage: 0 };
const fair = { percentage: 0 };
const serious = { percentage: 0 };
const critical = { percentage: 0 };
for (let level in this.measurement) {
let percentage = this.measurement[level].nominal;
if (percentage > nominal.percentage) {
nominal.level = +level;
nominal.percentage = percentage;
}
percentage = this.measurement[level].fair;
if (percentage > fair.percentage) {
fair.level = +level;
fair.percentage = percentage;
}
percentage = this.measurement[level].serious;
if (percentage > serious.percentage) {
serious.level = +level;
serious.percentage = percentage;
}
percentage = this.measurement[level].critical;
if (percentage > critical.percentage) {
critical.level = +level;
critical.percentage = percentage;
}
}
console.log("Calculated:")
console.table({ nominal, fair, serious, critical });
return {
zero: 0,
reset: serious.level,
one: critical.level,
delay: DELAY
};
}
async calibrate() {
let timerId = 0;
let measure = [];
let lastState;
let countDown = 2;
let now = performance.now();
const report = state => {
let prevState = lastState;
lastState = state;
if (prevState) {
let lastTime = now;
now = performance.now();
if (!this.measurement[this.#pressureLevel]) {
this.measurement[this.#pressureLevel] = {
"nominal": 0,
"fair": 0,
"serious": 0,
"critical": 0
};
}
this.measurement[this.#pressureLevel][prevState] += ((now - lastTime) / MEASURE_TIME);
}
}
const calibrator = new PressureObserver(changes => report(changes[0].state));
let done = false;
const incrPressure = () => {
if (lastState) {
// Always inherit the latest state as you might see no changes
// with a change to a pressure level
report(lastState);
console.table(this.measurement[this.#pressureLevel]);
done = this.measurement[this.#pressureLevel]["critical"] > 0.99;
this.#pressureLevel += 1;
}
this.#pressureGeneratorFn(this.#pressureLevel);
console.log(`Calibrating for ${MEASURE_TIME/1000} sec at pressure level ${this.#pressureLevel}`);
return done;
}
incrPressure();
return new Promise(resolve => {
timerId = setInterval(() => {
const done = incrPressure();
if (done) {
clearInterval(timerId);
calibrator.disconnect();
resolve(this.#computeBestLevels());
}
}, MEASURE_TIME);
calibrator.observe("cpu");
});
}
};