Add overshoot tracking to UI
Will Haldean Brown
9 years ago
33 | 33 |
Gpio GpioParams
|
34 | 34 |
DataLock sync.Mutex
|
35 | 35 |
AccError float64
|
|
36 |
MaxError float64
|
36 | 37 |
lastPOutput float64
|
37 | 38 |
lastIOutput float64
|
38 | 39 |
lastDOutput float64
|
|
47 | 48 |
Target float64
|
48 | 49 |
AbsError float64
|
49 | 50 |
AccError float64
|
|
51 |
MaxError float64
|
50 | 52 |
Pid PidParams
|
51 | 53 |
POutput float64
|
52 | 54 |
IOutput float64
|
|
84 | 86 |
Target: float64(s.Target),
|
85 | 87 |
AbsError: float64(s.Error()),
|
86 | 88 |
AccError: s.AccError,
|
|
89 |
MaxError: s.MaxError,
|
87 | 90 |
Pid: s.Pid,
|
88 | 91 |
POutput: s.lastPOutput,
|
89 | 92 |
IOutput: s.lastIOutput,
|
|
103 | 106 |
}
|
104 | 107 |
|
105 | 108 |
s.AccError = 0
|
|
109 |
s.MaxError = 0
|
106 | 110 |
N := len(s.History)
|
107 | 111 |
l := float64(0)
|
108 | 112 |
for i := N - 1; i >= N-AccErrorWindow-1 && i >= 0; i-- {
|
109 | |
s.AccError += math.Abs(s.History[i].AbsError)
|
|
113 |
ae := s.History[i].AbsError
|
|
114 |
s.AccError += math.Abs(ae)
|
|
115 |
if ae < s.MaxError {
|
|
116 |
// find the most negative error
|
|
117 |
s.MaxError = ae
|
|
118 |
}
|
110 | 119 |
l++
|
111 | 120 |
}
|
|
121 |
s.MaxError *= -1
|
112 | 122 |
s.AccError /= l
|
113 | 123 |
}
|
114 | 124 |
|
110 | 110 |
</td>
|
111 | 111 |
<td class="val">±<span id="acc_err"></span> °C/sample</td>
|
112 | 112 |
</tr>
|
|
113 |
<tr>
|
|
114 |
<td class="label">
|
|
115 |
Max overshoot:
|
|
116 |
<span class="subtext">
|
|
117 |
Taken over 32-sample sliding window
|
|
118 |
</span>
|
|
119 |
</td>
|
|
120 |
<td class="val"><span id="max_err"></span> °C</td>
|
|
121 |
</tr>
|
113 | 122 |
</table>
|
114 | 123 |
<img src="/plot" id="plot">
|
115 | 124 |
</section>
|
0 | 0 |
var tempElem, absErrElem, targetElem, heatingElem, plotElem, accErrElem
|
1 | 1 |
var targetDisplayElem, targetChangeElem, targetInputElem
|
2 | 2 |
var pInputElem, iInputElem, dInputElem
|
3 | |
var enabledElem
|
|
3 |
var enabledElem, maxErrElem
|
4 | 4 |
|
5 | 5 |
function getApiData() {
|
6 | 6 |
$.ajax({
|
|
25 | 25 |
$(targetElem).text(target.toFixed(2));
|
26 | 26 |
$(absErrElem).text((err >= 0 ? '+' : '') + err.toFixed(2));
|
27 | 27 |
$(accErrElem).text(data.AccError.toFixed(2))
|
|
28 |
$(maxErrElem).text(data.MaxError.toFixed(2))
|
28 | 29 |
$(enabledElem).text(data.Enabled ? "ENABLED" : "DISABLED")
|
29 | 30 |
|
30 | 31 |
pInputElem.setAttribute('value', data.Pid.P)
|
|
49 | 50 |
heatingElem = document.getElementById('heating')
|
50 | 51 |
plotElem = document.getElementById('plot')
|
51 | 52 |
accErrElem = document.getElementById('acc_err')
|
|
53 |
maxErrElem = document.getElementById('max_err')
|
52 | 54 |
enabledElem = document.getElementById('enabled')
|
53 | 55 |
|
54 | 56 |
targetChangeElem = document.getElementById('target_change')
|