'use strict' /* Open Rowing Monitor, https://github.com/laberning/openrowingmonitor This Averager can calculate the moving average of a continuous flow of data points Please note: The array contains flankLength + 1 measured currentDt's, thus flankLength number of flanks between them. They are arranged that dataPoints[0] is the youngest, and dataPoints[flankLength] the oldest */ function createMovingAverager (length, initValue) { let dataPoints reset() function pushValue (dataPoint) { // add the new dataPoint to the array, we have to move data points starting at the oldest ones let i = length - 1 while (i > 0) { // older data points are moved towards the higher numbers dataPoints[i] = dataPoints[i - 1] i = i - 1 } dataPoints[0] = dataPoint } function replaceLastPushedValue (dataPoint) { // replace the newest dataPoint in the array, as it was faulty dataPoints[0] = dataPoint } function getAverage () { let i = length - 1 let arrayTotal = 0.0 while (i >= 0) { // summarize the value of the moving average arrayTotal = arrayTotal + dataPoints[i] i = i - 1 } const arrayAverage = arrayTotal / length return arrayAverage } function reset () { dataPoints = new Array(length) dataPoints.fill(initValue) } return { pushValue, replaceLastPushedValue, getAverage, reset } } export { createMovingAverager }