fixes some code duplications in the engine initialization routine

This commit is contained in:
Lars Berning 2022-01-28 20:23:50 +01:00
parent 335083c37d
commit 9471ff758b
No known key found for this signature in database
GPG Key ID: 028E73C9E1D8A0B3
1 changed files with 29 additions and 35 deletions

View File

@ -19,39 +19,38 @@ const log = loglevel.getLogger('RowingEngine')
function createRowingEngine (rowerSettings) { function createRowingEngine (rowerSettings) {
let workoutHandler let workoutHandler
const flankDetector = createMovingFlankDetector(rowerSettings) const flankDetector = createMovingFlankDetector(rowerSettings)
let cyclePhase = 'Recovery'
let totalTime = 0.0
let totalNumberOfImpulses = 0.0
let strokeNumber = 0.0
const angularDisplacementPerImpulse = (2.0 * Math.PI) / rowerSettings.numOfImpulsesPerRevolution const angularDisplacementPerImpulse = (2.0 * Math.PI) / rowerSettings.numOfImpulsesPerRevolution
let drivePhaseStartTime = 0.0 const movingDragAverage = createMovingAverager(rowerSettings.dampingConstantSmoothing, rowerSettings.dragFactor / 1000000)
let drivePhaseStartAngularDisplacement = 0.0
let drivePhaseLength = 2.0 * rowerSettings.minimumDriveTime
let drivePhaseAngularDisplacement = rowerSettings.numOfImpulsesPerRevolution
// let driveStartAngularVelocity = 0
// let driveEndAngularVelocity = angularDisplacementPerImpulse / rowerSettings.minimumTimeBetweenImpulses
let driveLinearDistance = 0.0
// let drivePhaseEnergyProduced = 0.0
let recoveryPhaseStartTime = -2 * rowerSettings.minimumRecoveryTime // Make sure that the first CurrentDt will trigger a detected stroke by faking a recovery phase that is long enough
let recoveryPhaseStartAngularDisplacement = -1.0 * rowerSettings.numOfImpulsesPerRevolution
let recoveryPhaseAngularDisplacement = rowerSettings.numOfImpulsesPerRevolution
let recoveryPhaseLength = 2.0 * rowerSettings.minimumRecoveryTime
let recoveryStartAngularVelocity = angularDisplacementPerImpulse / rowerSettings.minimumTimeBetweenImpulses
let recoveryEndAngularVelocity = angularDisplacementPerImpulse / rowerSettings.maximumTimeBetweenImpulses
let recoveryLinearDistance = 0.0
let currentDragFactor = rowerSettings.dragFactor / 1000000
const movingDragAverage = createMovingAverager(rowerSettings.dampingConstantSmoothing, currentDragFactor)
let dragFactor = movingDragAverage.getAverage()
const dragFactorMaxUpwardChange = 1 + rowerSettings.dampingConstantMaxChange const dragFactorMaxUpwardChange = 1 + rowerSettings.dampingConstantMaxChange
const dragFactorMaxDownwardChange = 1 - rowerSettings.dampingConstantMaxChange const dragFactorMaxDownwardChange = 1 - rowerSettings.dampingConstantMaxChange
const minimumCycleLength = rowerSettings.minimumDriveTime + rowerSettings.minimumRecoveryTime const minimumCycleLength = rowerSettings.minimumDriveTime + rowerSettings.minimumRecoveryTime
let cycleLength = minimumCycleLength let cyclePhase
let linearCycleVelocity = 0.0 let totalTime
let totalLinearDistance = 0.0 let totalNumberOfImpulses
let averagedCyclePower = 0.0 let strokeNumber
let currentTorque = 0.0 let drivePhaseStartTime
let previousAngularVelocity = 0.0 let drivePhaseStartAngularDisplacement
let currentAngularVelocity = 0.0 let drivePhaseLength
let drivePhaseAngularDisplacement
let driveLinearDistance
let recoveryPhaseStartTime
let recoveryPhaseStartAngularDisplacement
let recoveryPhaseAngularDisplacement
let recoveryPhaseLength
let recoveryStartAngularVelocity
let recoveryEndAngularVelocity
let recoveryLinearDistance
let currentDragFactor
let dragFactor
let cycleLength
let linearCycleVelocity
let totalLinearDistance
let averagedCyclePower
let currentTorque
let previousAngularVelocity
let currentAngularVelocity
// we use the reset function to initialize the variables above
reset()
// called if the sensor detected an impulse, currentDt is an interval in seconds // called if the sensor detected an impulse, currentDt is an interval in seconds
function handleRotationImpulse (currentDt) { function handleRotationImpulse (currentDt) {
@ -169,13 +168,11 @@ function createRowingEngine (rowerSettings) {
strokeNumber++ strokeNumber++
drivePhaseStartTime = totalTime - flankDetector.timeToBeginOfFlank() drivePhaseStartTime = totalTime - flankDetector.timeToBeginOfFlank()
drivePhaseStartAngularDisplacement = totalNumberOfImpulses - flankDetector.noImpulsesToBeginFlank() drivePhaseStartAngularDisplacement = totalNumberOfImpulses - flankDetector.noImpulsesToBeginFlank()
// driveStartAngularVelocity = angularDisplacementPerImpulse / flankDetector.impulseLengthAtBeginFlank()
// Update the metrics // Update the metrics
if (workoutHandler) { if (workoutHandler) {
workoutHandler.handleRecoveryEnd({ workoutHandler.handleRecoveryEnd({
timeSinceStart: totalTime, timeSinceStart: totalTime,
// currDragFactor : currentDragFactor,
power: averagedCyclePower, power: averagedCyclePower,
duration: cycleLength, duration: cycleLength,
strokeDistance: driveLinearDistance + recoveryLinearDistance, strokeDistance: driveLinearDistance + recoveryLinearDistance,
@ -296,6 +293,7 @@ function createRowingEngine (rowerSettings) {
} }
function reset () { function reset () {
movingDragAverage.reset()
cyclePhase = 'Recovery' cyclePhase = 'Recovery'
totalTime = 0.0 totalTime = 0.0
totalNumberOfImpulses = 0.0 totalNumberOfImpulses = 0.0
@ -304,10 +302,7 @@ function createRowingEngine (rowerSettings) {
drivePhaseStartAngularDisplacement = 0.0 drivePhaseStartAngularDisplacement = 0.0
drivePhaseLength = 2.0 * rowerSettings.minimumDriveTime drivePhaseLength = 2.0 * rowerSettings.minimumDriveTime
drivePhaseAngularDisplacement = rowerSettings.numOfImpulsesPerRevolution drivePhaseAngularDisplacement = rowerSettings.numOfImpulsesPerRevolution
// driveStartAngularVelocity = 0
// driveEndAngularVelocity = angularDisplacementPerImpulse / rowerSettings.minimumTimeBetweenImpulses
driveLinearDistance = 0.0 driveLinearDistance = 0.0
// drivePhaseEnergyProduced = 0.0
recoveryPhaseStartTime = -2 * rowerSettings.minimumRecoveryTime // Make sure that the first CurrentDt will trigger a detected stroke by faking a recovery phase that is long enough recoveryPhaseStartTime = -2 * rowerSettings.minimumRecoveryTime // Make sure that the first CurrentDt will trigger a detected stroke by faking a recovery phase that is long enough
recoveryPhaseStartAngularDisplacement = -1.0 * rowerSettings.numOfImpulsesPerRevolution recoveryPhaseStartAngularDisplacement = -1.0 * rowerSettings.numOfImpulsesPerRevolution
recoveryPhaseAngularDisplacement = rowerSettings.numOfImpulsesPerRevolution recoveryPhaseAngularDisplacement = rowerSettings.numOfImpulsesPerRevolution
@ -316,7 +311,6 @@ function createRowingEngine (rowerSettings) {
recoveryEndAngularVelocity = angularDisplacementPerImpulse / rowerSettings.maximumTimeBetweenImpulses recoveryEndAngularVelocity = angularDisplacementPerImpulse / rowerSettings.maximumTimeBetweenImpulses
recoveryLinearDistance = 0.0 recoveryLinearDistance = 0.0
currentDragFactor = rowerSettings.dragFactor / 1000000 currentDragFactor = rowerSettings.dragFactor / 1000000
movingDragAverage.reset()
dragFactor = movingDragAverage.getAverage() dragFactor = movingDragAverage.getAverage()
cycleLength = minimumCycleLength cycleLength = minimumCycleLength
linearCycleVelocity = 0.0 linearCycleVelocity = 0.0