Commit Graph

225 Commits

Author SHA1 Message Date
Jaap van Ekris 88259a61e0
Fix of testing errors 2023-12-03 22:48:48 +01:00
Jaap van Ekris f6c898f702
Fix testing errors
Fixed testing errors
2023-12-03 21:40:58 +01:00
Jaap van Ekris 8999539616
Modification to reflect better FullTSQ algorithm
Modification to reflect better FullTSQ algorithm
2023-12-03 21:13:55 +01:00
Jaap van Ekris d8b547f040
Update to handle increased FullTS accuracy
Update to handle the increased FullTS accuracy: the FullTSQuadratic functions have increased accuracy and react quicker to changes, thus stroke detection has to be improved.
2023-12-03 21:12:56 +01:00
Jaap van Ekris 8769a19090
Update to accomodate FullTS improvements
Update to accomodate FullTS improvements
2023-12-03 20:48:22 +01:00
Jaap van Ekris a557bef4bc
Update Flywheel.js 2023-12-03 20:47:02 +01:00
Jaap van Ekris 6eab88b62a
Update to adapt to improvements of FullTSQuadraticSeries
Update to accomodate efficiency and accuracy improvements of FullTSQuadraticSeries
2023-12-03 20:41:44 +01:00
Jaap van Ekris feac8c946b
Addition of MinimumX, MinimumY, MaximumX and MaximumY functions
Addition of MinimumX, MinimumY, MaximumX and MaximumY functions
2023-12-03 20:37:40 +01:00
Jaap van Ekris 9dc6f37564
Addition of minimum and maximum functions
Addition of minimum and maximum functions
2023-12-03 20:35:47 +01:00
Jaap van Ekris c1d365ac4b
Adaptation to performance and accuracy improvements
Improvement of the FullTS performance and accuracy
2023-12-03 20:34:03 +01:00
Jaap van Ekris 57cde02953
Improvement of the FullTS performance
Improvement of the Full Theil-Sen performance by using a Binary Search Tree for the Median Calculation, which is much more efficient for larger values of maxSeriesLength
2023-12-03 20:32:29 +01:00
Jaap van Ekris f6573cb0d6
Improvement of the FullTS performance
Improvement of the Full Theil-Sen performance by using a Binary Search Tree for the Median Calculation, which is much more efficient for larger values of maxSeriesLength
2023-12-03 20:30:27 +01:00
Jaap van Ekris 6681cfcc5e
Create BinarySearchTree.test.js
Added Binary Search Tree to improve the perfomance of the Median calculation
2023-12-03 20:26:05 +01:00
Jaap van Ekris f342e6691e
Create BinarySearchTree.js
Added the Binary Search Tree to greatly improve the performance of the Median calculation
2023-12-03 20:24:28 +01:00
Jaap van Ekris 26d41b8dd5
Removed unneeded command 2023-07-05 00:06:51 +02:00
Jaap van Ekris 43f337c6ce
Fix a reset bug
Fixes a reset bug
2023-07-04 23:57:50 +02:00
Jaap van Ekris 31fdb87eab
Fixes reset bug
Fixes a bug where a reset will not clear the timer
2023-07-04 23:56:31 +02:00
Jaap van Ekris 43d7e45aee
Fix a state machine bug
Fixed a bug where allowMovement() would be called at the start of the first drive, which would force it back to a paused state, causing all kind of weird metrics.
2023-04-28 20:22:14 +02:00
Jaap van Ekris e1701f8038
Fixes a timer bug, improves function naming
Fixes a bug in the timer visual that made it go from 0:59 to 0:00 to 1:00, which is extremely confusing, especially for the total time and the pace.
Fixes the name, as it used to be secondsToPace, and was used for totalTime as well.
2023-04-27 17:54:20 +02:00
Jaap van Ekris f896a91af6
Fixes a timer bug, improves function naming
Fixes a bug in the timer visual that made it go from 0:59 to 0:00 to 1:00, which is extremely confusing, especially for the total time and the pace.
Fixes the name, as it used to be secondsToPace, and was used for totalTime as well.
2023-04-27 17:49:52 +02:00
Jaap van Ekris 6baf81b6f1
Improved consistency
Improved the consistency of the PM5 serial number
2023-04-24 15:12:48 +02:00
Jaap van Ekris a72fe3f017
Added interval number to RowingData
Added the interval number to the RowingData, allowing RowingData to recognize the intervals.
2023-04-24 13:26:02 +02:00
Jaap van Ekris 52d491b5f2
Added handling of the HRRecoveryUpdate
Added handling of the HRRecoveryUpdate, which will add Recovery HeartRate to the tcx notes
2023-04-24 13:20:47 +02:00
Jaap van Ekris b5e439cd50
Fixed typo's 2023-04-24 10:26:39 +02:00
Jaap van Ekris 41cee87b6b
Fix for HRR data
Fixed the wrong definition of HRR data
2023-04-23 22:12:56 +02:00
Jaap van Ekris 597ec7c765
Adoption to RowsAndAll timestamp spec change
Adoption to RowsAndAll timestamp spec change for the ElapsedTime
2023-04-22 20:34:43 +02:00
Jaap van Ekris 87a22795e4
Adoption to RowsAndAll timestamp spec change
RowsAndAll changed the specification of the timestamp, which caused the total rowing time to be inaccurate.
2023-04-21 19:27:32 +02:00
Jaap van Ekris d852ef8439
Changed the trim of the distance
Changed the trimming (switching between meters and kilometers) of the distance from 10K to 100K, similar to the PM5 and convention of other rowing machines.
2023-04-19 23:42:51 +02:00
Abász 9d8ffabab0 Hotfix for tests not running
Due to the decorators used in the GUI code with lit which is not
supported natively by node the tests under helper.test.js return module
error. This commit fixes by refactoring the `simpleMetricFactory` method
to remove dependency on code using experimental decorators.
2023-04-19 22:20:07 +02:00
Abász dfc2881f36 Make changes to GUI to better support intervals
Change distance, timer and calories tile to change behaviour when
current workout is an interval session (i.e. not JustRow).
Expose data necessary for this in RowingStatistics. Remove miles option
from formatter.
2023-04-18 23:19:53 +02:00
Abász b494be4b9d Fix bug re. ignoring app mode
Refactor appMode setting so it becomes internal to the DashboardAction
component as it is not used anywhere else. This prevents exposing
unnecessary - essentially internal - state to the global appState.
2023-03-25 21:59:21 +01:00
Abász 918c9b53fa Remove formatting logic from RowingStatistics
Remove logic of formatting metrics in RowingStatistics and move these to
the consuming end (e.g. client).
2023-03-25 21:00:33 +01:00
Abász a1068cf77f Fix type conversion in the curveMetrics
Fix the string conversion of the curveMetrics and push the formatting
logic to the consumer that require this (eg. WorkoutRecorder). This
enables other consumers of curveMetrics to use non-rounded, "raw" data
instead of preformatted as well as avoid potential future bugs from the
type conversion.
2023-03-25 21:00:33 +01:00
Abász e7c40873cd Fix HR battery level not showing (fixes: #132)
Fix the HR battery level not showing on the HR metric tile (ANT and BLE)
For ANT handle case when BatteryLevel is not present only BatteryStatus.
BLE devices do not necessarily send battery level with all HR broadcast so
read the battery level on connect.
2023-03-25 21:00:33 +01:00
Abász ee667d727a Prevent BLE HR monitor process crash (fixes: #135)
In case of an uncaught exception in the BLE HR child process the process
would crash and not restart. Add code to catch these uncaught exceptions
to prevent such crash and enable code to continue.
2023-03-25 21:00:33 +01:00
Abász c5bec08ea9 Fix styling when text is used for metric tile 2023-03-25 21:00:33 +01:00
Abász 74a73c571a Add experimental 12 cell grid mode
Implement 12 cell grid mode to show allow showing more metrics.
Experimental means that this layout will not render properly on every
screen size (though should work on bigger screens well).
That would require more media queries and css logic to tweak the styling
This may be implemented at a later stage.
2023-03-25 21:00:33 +01:00
Abász bf55638e82 Add new metric tiles
- Add drag factor (int)
- Add distance per stroke (meters with 1 decimal place)
- Add drive length (meters with 2 decimal places)
- Add drive duration (seconds with 2 decimal places)
- Add recovery duration (seconds with 2 decimal places)
2023-03-25 21:00:33 +01:00
Abász 594f8099c3 Change settings styling and fix a formatter bug 2023-03-25 21:00:33 +01:00
Abász 11db116f5e Remove global appState property
Remove appState property from the base class to avoid property drilling.
Expose full appState to those components only that really need it in
order to decouple dependency on global objects to prevent potential
future issues when refactoring and making changes.
2023-03-24 22:02:12 +01:00
Abász 5b44b88c39 Change `changeGuiSetting` event API
Restrict the event payload to data this component is responsible for and
handle immutable object construction at the main event handler side.
2023-03-24 22:02:12 +01:00
Abász 89432fef99 Expose app configs to the metric tile factory
Make all settings available to the metric creator factory in order for
subcomponents (e.g DashboardAction) to use it without depending directly
on the global appState.
2023-03-24 22:02:03 +01:00
Abász a4ef6d86b0 Show peak value in the force curve
Add the capability of showing the peak value for the handle force curve
2023-03-23 23:20:00 +01:00
Abász fe5a7e7ed1 Remove dependency on server formatted values
Remove dependency on metric formatting logic at the server. Implement
the formatting of the raw data on the client side. Make adding
new metric tiles more modular and extensible via simplified creation API
2023-03-23 19:03:27 +01:00
Abász 6834e3a558 Code refactoring and improve code consistency 2023-03-23 19:03:01 +01:00
Abász 457c96fe3c Fix webSocket address bug 2023-03-22 20:21:28 +01:00
Abász 28d223c109 Add the ability to hide icons
Implement GUI setting to hide icons in exchange for increased font size
(implements: #131)
2023-03-22 15:02:16 +01:00
Abász cac178f06d Add settable metric tiles and settings persistence
Make the metric tiles settable via the settings dialog and implement
persistence of these settings to the browser localStorage (partially
fix #131)
2023-03-22 13:44:34 +01:00
Abász 00d9c824d0 Create settings dialog and improve AppDialog
Update AppDialog to be able to handle invalid forms, and implement the
settings dialog that communicates via appState
2023-03-22 13:34:27 +01:00
Abász 6aa5c696c6 Add force curve component
Add a component that shows the force curve of the last drive in a chart.
2023-03-22 12:54:33 +01:00
Jaap van Ekris bd97723f8b
Cut/copy/paste error in log message 2023-03-09 10:55:45 +01:00
Jaap van Ekris 97c1da96d6
Dealt with an edge case
Dealt with an edge case where there are no strokes detected, but a number of impulses is recorded (Typically during first calibration).
2023-03-02 11:25:20 +01:00
Jaap van Ekris c029a42d37
Update to accommodate the new peripheral settings
Update to respect new peripheral settings introduced with the new peripheralmanager
2023-02-15 16:53:54 +01:00
Jaap van Ekris 3e3cd7b838
Added ANT+ functionality and BLE improvements
Extend ANT+ peripherals and redesign inner structure of the peripheral management
2023-02-15 14:28:39 +01:00
Abász aa3b39f86a Change PM5 serial to comply with C2 standards
The PM5 serial number should start with "43" (in line with consistent HW
and SW revision)
2023-02-12 22:55:26 +01:00
Abász 3f129ceec2 Add peripheral shutdown for app termination
In order to avoid errors with peripheral processes on the next startup
(e.g. ANT Stick getting stuck) graceful explicit shutdown of these is
necessary on app termination.
2023-02-12 22:52:02 +01:00
Abász 35303547e2 Fix error on simultaneous ANT peripheral startup
Move the peripheral startup sequence to an async function to ensure
proper startup order and to avoid multiple simultaneous calls to the
ANT stick causing app crash.
2023-02-12 22:40:16 +01:00
Abász 405bcab55a Code cleanup
Change logging level for the broadcast data of the ANT+ FE peripheral.
Fix callback signature mismatch in bleno `stopAdvertising()` method
2023-02-12 22:40:16 +01:00
Abász a0686150a2 Update button layout styling for the GUI
Restyle the button layout to be responsive and fix potential overflows
2023-02-12 22:40:16 +01:00
Abász cd1ff3d001 Fix crash when peripheral mode changed too quickly
Add boolean guard flag to fix potential crash when user clicks the
peripheral change buttons without waiting for the first request to
complete in the GUI (i.e. clicks too quickly).
2023-02-12 22:40:16 +01:00
Abász 4f62b2322e Add ANT+ profile manager
- Implement an ANT+ profile manager similar to BLE
- Implement ANT+ Fitness Equipment profile to be able to broadcast data
- Add button to the UI to scroll through the ANT+ profiles
2023-02-12 22:40:16 +01:00
Abász e938f5d8a0 Fix app crash when bleMode is set to OFF initially
Add guard clauses to notifyMetric call if bleMode is off.
Set blePeripheral and hrmPeripheral to undefined to avoid repeated call
to destroy() (i.e. calling destroy() on an already destroyed peripheral)
2023-02-12 22:40:16 +01:00
Abász 3bb0229d3a Move to new ant-plus library
Move to a new, still maintained, ant-plus library that solves the
connection dropout issue experienced with the original when using HRM as
well as that provides a cleaner interface to manage the ANT device.
2023-02-12 22:40:16 +01:00
Abász 17d6a74332 Enable rotation of the heart rate monitor modes
Add button to the GUI so the user can switch between heart rate monitor
modes (BLE, ANT, OFF). Update peripheralManager to handle switching and
implement necessary changes to the structure of the peripheralManager.
2023-02-12 22:40:16 +01:00
Abász a3cd6e6f39 Add OFF mode to BLE peripheral and refactoring
Add OFF mode to be able to turn BLE advertisement off. Rename
switchPeripheralMode function to include BLE in order to be more
descriptive.
2023-02-12 22:40:16 +01:00
Abász 7ef338d856 Refactor heart rate peripherals
Refactor ANT manager to be a central class managing the ANT stick state.
This state could be used for future implementation of other ANT profiles
and the peripheralManager should be responsible for creating once needed
2023-02-12 22:40:16 +01:00
Abász 3edfe22434 Refactor and restructure peripheral related code
- Create a new main folder to include ANT and BLE
- Move peripheralManager with other files with shared information
- Refactor static notify characteristics
- Refactor code to be more uniform across the different peripherals
2023-02-12 22:40:16 +01:00
Jaap van Ekris 6eed136caf
Move functionality to the Finite State Machine
On hindsight, the approach of letting the FSM handle all state transitions explicitly is much clearer
2023-01-16 12:18:46 +01:00
Jaap van Ekris 7251a8144d
Douncheck with 0.8.4 settings
Checked that the sanity check would fix all mew variables, allowing a 0.8.4 config file to be used with V1Beta without any crashes or issues.
2023-01-15 21:52:55 +01:00
Jaap van Ekris f628a6e791
Updates to fix review comments
Updates to fix review comments
2023-01-15 21:18:43 +01:00
Jaap van Ekris e5696378b0
Fixed a Lint error 2023-01-15 17:34:25 +01:00
Jaap van Ekris 1405b80bc7
Removal of surplus logging line 2023-01-15 17:31:28 +01:00
Jaap van Ekris 37edd0290b
Update to facilitate more complex workouts
Update to facilitate more complex workouts. RowingStatistics will now manage the intervals completely independently and alert server.js only when the session has ended.
2023-01-15 17:29:58 +01:00
Jaap van Ekris 94a2aad840
Added logic for more complex workouts
Added logic for more complex workouts: RowingStatistics will handle this completely independently
2023-01-15 17:07:48 +01:00
Jaap van Ekris fcb3944848
Removed some artificial limits 2023-01-12 12:28:27 +01:00
Jaap van Ekris fb64547e30
Allowed the config check to repair settings
Added the ability to automatically fix forgotten or implausible settings when possible.
2023-01-12 12:25:06 +01:00
Jaap van Ekris 3364ef38a8
Centralising parameter check
Removed sanity checks in RowingStatistics, as the configmanager centralises the parameter check
2023-01-11 23:30:11 +01:00
Jaap van Ekris ce9294dfb8
Centralising parameter check
Removed sanity checks in RowingStatistics, as the configmanager centralises the parameter check
2023-01-11 23:29:52 +01:00
Jaap van Ekris 0378f27655
Fixed Lint errors
Fixed Lint errors
2023-01-11 23:19:48 +01:00
Jaap van Ekris dc43c38e16
Improvement of code quality
Improvement of code quality
2023-01-11 23:17:56 +01:00
Jaap van Ekris e29d723776
Added sanity checks to the config manager
Added a lot of sanity checks to the loading of the config.
2023-01-11 23:06:34 +01:00
Jaap van Ekris 11ff22eca1
Fixed a missing bracket 2023-01-11 10:15:48 +01:00
Jaap van Ekris b4e8f16b3c
Improvement of code quality
Replaced the horrible ested If...then....else with a much more readable case statement to implement the Concept 2 table
2023-01-11 10:12:54 +01:00
Jaap van Ekris 733720fa44
Expansion of the Interval type
Addittion of the interval type, as a preperation of the more complex workout schedules
2023-01-10 11:56:37 +01:00
Jaap van Ekris 35ff3489a5
Fixed a typo in function name
To add insult to injury: by a typo in the error logging function, the app would crash if there was a recoverable error
2023-01-10 11:44:37 +01:00
Jaap van Ekris 062faa0190
A bit more defensive programming
A bit more defensive programming as one bad (NaN) measurement of CurrentDt will kill all metrics for the entire session.
2023-01-10 11:34:00 +01:00
Jaap van Ekris 6623aa2f86
Several bugfixes and improvements
Bugfix: Fixed a bug where a new year or month would crash the workoutrecorder due to a missing data directory

Several improvements:
* Added possibility of only creating RowingData file
* Improved HRR data when restarting a workout
2023-01-10 11:27:13 +01:00
Jaap van Ekris 51400f2c02
Fixed a bug in tick rollover
Fixed a bug in the tick rollover (which seems to happen every 60 minutes of processtime).
2023-01-10 11:14:37 +01:00
Jaap van Ekris 9422716dca
Redesign of the rowing engine (#84)
* Looks like dead code

Dead code?????

* Improvement of the MovingAverager startup

Improvement of the MovingAverager's startup-behaviour, to allow use for the dragcalculation. In this approach, the defaultValue is only used when the array isn't sufficiently filled (less then two pushed values), but after that it is directly released and the average only depends on pushed values. This is especially important for the drag calculation, as the drag calcuation is sufficiently robust in handling errornous values, and drag factors might make big jumps in the beginning (i.e. from the middle setting to a maximum value).

* Allow the settings to set a specific priority

The nice-level of -20 is arbitrary and very counterproductive, as it dwarfs OS processes including the internal timer. This results in a more noisy measurement, even on a high-speced Pi 4. As the priority is dependent on the hardware/software configuration of the Pi anyway, I made the configuration setting more granular.

* Added Concept2 PM5 wiring diagram

Added wiring diagram for the PM5 (with 18V generator)

* Update server.js

* Delete app/engine/averager directory

* Creation of the series.js

Creation of a series of values, as an abstraction away from the array, with added standard functionality. This is the basis for the more complex functions like the regression series.

* Update the server.js to adapt to new architecture

Server.js has been adapted to fit the new architecture. It is now in control of the session, directing others how to proceed.

* Deleted Timer.js as it has become obselete

Deleted Timer.js as it has become obselete

* Updated to more abstract Flywheel.js

Renamed and rewritten to Flywheel.js. It provides an abstraction from the individual currentDt's and provides a more abstract view of the flywheel and its current state, which can be interrogated by Rower.js

* Created an initial testset for Flywheel.js

An initial set of tests to check whether Flywheel.js works as expected.

* Renaming variables and added new functionality

Renamed variables to fit the naming scheme of Rower.js. Added the option to create a RowingData file, hich can be read by RowingData, RowsAndAll and Excel. Also added new fields in the notes of a TCX, including HRR.

* Update Pm5Constants.js

* Update to the constants

Update to the constants, to make them closer to the actual firmware options. Also I added the Row to the name, as Concept2 also seems to do this on their current firmware.

* Added additional defensive programming

Added additional defensive programming

* updated variable names

Updated variable names to keep them in sync with RowingStatistics

* Added metrics and updated variable names

Added new metrics, like projected time and distance, stroke calories
Updated variable names to keep them in sync with RowingStatistics

* Added metric, states and variable rename

Added the dragfactor metric, aded the state for the workoutType, workoutDurationType, workoutState, RowingState and strokeState
Renamed most variable to allign them with RowingStatistics

* Added metrics, rename variables

Added several metrics (driveLength, driveTime, strokeRecoveryTime, strokeDistance, peakDriveForce, averageDriveForce and workPerStroke)
Alignment of variable names with RowingStatistics.js

* Renamed variables

Renamed variables to align them with the RowingStatistics naming convention

* Update variable definitions and naming

Update to the variable definition of speed: as almost all consumers use the m/s unit, we now use this internally, and only convert to km/h for the bike
Alignment with the naming scheme of RowingStatistics

* Update based on PM5 spec

workoutDurationType was a more complex enum

* Complete redesign

Complete redesign:
* Switched to a Finite State machine to maintain session state
* To reduce complexity, it directly inspects Rower.js, instead of awaiting messages to be processed
* Small snippets process all data, where updates are grouped based on their update moment
* Renaming all variables to clearly identify when they are updated (as determined by the state machine)
* Introduced a first version of interval management, as a preperation for future solutions with more complex training scheme's
This should help in reducing the code base while making the code easier to understand.

* Rename and adoptation to the new architecture

Split RowingEngine into two blocks:
* Rower (which represents the key metrics from the rower) and
* flywheel (which represents the key metrics of the flywheel, formally known as MovingFlankDetector). 
This should simplify the reading of the code, as Flywheel reports key metrics without the need to many specific configuration parameters.

Also added many metrics (including force curve, power curve and handle speed).

* Update and rename RowingEngine.test.js to Rower.test.js

Update to fit Rower.js better, includes testing with known rowers

* Introduction of VO2Max (Beta)

Introduction of a Beta-version of VO2-Max, which will be calculated each time a tcx-file is created.
It introduces two versions of VO2-Max calculation:
* extrapolation-based VO2Max: it extrapolates the power to maxpower based on MaxHR and the relation between HR and power in the session
* interpolation based VO2Max: it projects the session onto a 2K, and then calculates the VO2Max based on Concept2's research

* Beta version

Beta version of the BucketLinearSeries to accomodate VO2Max

* Create CurveAligner.js

CurveAligner for cleaning up the (power, force and handle velocity) curves

* Create Series.test.js

Added test-class to series.js, as it is so fundamental to OpenRowingMonitor

* Create StreamFilter.js

Streamfilter implements a running streamfilter. It is designed to be robust to outliers, and replaces all averaging functions.

* Create StreamFilter.test.js

Tests the steamfilter

* Create OLSLinearSeries.js

Creation of the OLSLinearSeries, to allow for drag calculation, VO2Max calculation and projecting calories, distance and time.

* Create OLSLinearSeries.test.js

Test of the Simple Linear Regression method

* Create FullTSQuadraticSeries.js

FullTSQuadraticSeries delivers Full Theil-Senn Quadratic regression, which is essential to determine Angular Velocity and Angular Acceleration in a noise-resistant way. These metrics are essential for force curve, power curve, handle velocity curve and stroke detection (as it is triggered by the force on the handle).

* Create FullTSQuadraticSeries.test.js

Test of the FullTSQuadraticSeries

* Create curveMetrics.js

Object to manage the specifics of curves

* Delete curveMetrics.js

* Create curveMetrics.js

Object to create curves and the associated curve metrics

* Update rowerProfiles.js

Update to accomodate the new RowingEngine, and its parameters

* Renaming variables

Renaming variables to align with the variable renaming in RowingStatistics.js

* Rename variables

Update variables to align with RowingStatistics naming conventions

* Update GpioTimerService.js

* Added example CurrentDt curve

Added example CurrentDt curve for explanation of good and bad noise.

* Testfile for Concept2 RowErg

Testfile for Concept2 RowErg, 2000 meters, for validation purposes

* Increasing consistency in logging

Increased consistency in logging specific messages

* Improved logging to facilitate configuration

Improved the logging of specific data to facilitate an easier setup for new rowers.

* Update backlog.md

* Update rower_settings.md

* Adaptation to the newly developed physics model

Adaptation of the text to the newly developed physics model.

* Removed the settings analysis as it isn't needed

Removed this tool, as it isn't up-to-date with the current physics model, and logging does a better job in helping the analysis.

* Updated to reflect the new approach

Updated the setup procedure to:

* Adapt it to the new physics model

* Adapt it to the new logging-based setup procedure.

* Added the Concept2 RowErg

Added the Concept2 RowErg configuration

* Added the Concept2 as test-object

Added the Concept2 as test-object

* Added the Concept2 as test-object

Added the Concept2 as test-object

* Update Rower.test.js

* Adaptation to C2 Flywheel Inertia change

Adaptation to C2 Flywheel Inertia change

* Created to explain the current architecture

Created an architecture document to explain the current architecture, as well as the major components in Open Rowing Monitor to maintainers and reviewers of the code.

* Create hardware_setup_Concept2_RowErg.md

* Added Concept 2 manual

Added concept 2 RowErg manual, as some minor updates

* Added performance improvement guide

Added a guide for improving the performance (Latency) of the Raspberry Pi.

* Fixed typos, filled in some blanks

Fixed some typos, improved some text for clarity and added some text to complete this description.

* Update to reflect new capabilities

Update to reflect new capabilities of OpenRowingMonitor and make the text easier to parse for novice users (make it less technical).

* Updated with new settings

Updated with the new settings available

* Update default.config.js

* Update to allow for the 64Bit PREEMPT kernel

Update of the install script to allow for the 64Bit PREEMPT kernel of Raspberry Pi, which handles low latency much better.

* Fixed a typo in a file reference

Thanks to @Abasz , dound a typo which i now fixed.

* Fixed typo

Fixed typo

Co-authored-by: Lars Berning <151194+laberning@users.noreply.github.com>

* Fixed a typo

Fixed a typo

Co-authored-by: Lars Berning <151194+laberning@users.noreply.github.com>

* Fixed a cut-copy-paste error

Fixed a cut-copy-paste error in the infinity symbol

* Fixed error in repo-name

Fixed an error in the repo-name when moving for the experimental branch to the PR branch

* Fixed a copy error in the Repo-name

Missed updating the repo-name when moving the code from private experimental branch to a production PR repo

* Updated ToDo descriptions

Updated ToDo descriptions

* Added more detailed ToDo's

Added more detailed ToDo's

* Better explanation of design issue

A much better (and English) and updated explanation of the open design issues in Flywheel.js

* Fixed a bug in the strokecount reinitialization

Fixed a bug in the stroke count reinitialization (great find by @Abasz), which was inconsistent with the normal init.

* Graphic showing systematic error

File showing systematic (periodic) deviations in the magnet placement

* Added an image of misaligned magnets

* Removed non-working code

Removed the trimmedMedian function, as its design contains fundamental mathematical errors. The initially proposed way is the only good way of doing it.

* Added observation about noise overfitting

Added a note about Noise overfitting, based on the Concept2 and the observation of Gordon_Shumway (see https://github.com/laberning/openrowingmonitor/discussions/87)

* Added the pigpio library

Added the pigpio library

* Added an explanation into the GPIO settings

Added an explanation of the GPIO settings

* Added the settings for the new GPIO library

Added the settings to configure the new GPIO library

* Replaced onoff with pigpio, added debounce param.

Replaced the onoff library (goodbye my old loyal friend) with pigpio, to facilitate much more accurate timing calculations and add more flexibility to the flank detection (including debounce)

* Replaced onoff with pigpio

Replaced onoff with pigpio library

* Replaced onoff with pigpio

Replaced onoff with pigpio

* Install and config pigpio dependency

Added the installation of the pigpio C-library and setting the key parameters.

* Added a bit clarification about the setup guide

Added a bit better description about the setup guides.

* Removed and added spaces....

* Remove an unnecessary space....

* Resolved open design issue in noise filter

In the previous design, we were uncertain that the noise filter would handle all cases. With pigpio, we are quite certain it will handle all cases internally, and here we detect any deviations. Please note, startup-behaviour after a cold or warm (re)start still has to be handled as time since the privious pulse tends to be in the minutes, throwing off all timekeeping functions.

* Removed obsolete variables

Removed two obsolete variables: lastKnownGoodDatapoint and numberOfErrorsAllowed

* Removed obsolete variable

Removed the now defunct variable numberOfErrorsAllowed

* Changes in startup and config

Due to changes in the gpio library, the startup behaviour of flywheel.js has changes, as have the Concept2 configuration settings. These changes modify the results of the testcase accordingly.

* Updated testcases after update pigpio

Due to changes in the gpio library, the startup behaviour of flywheel.js has changed, as have the Concept2 configuration settings. These changes modify the results of the testcase accordingly.

* Update testcase to accomodate lib change

Update testcase to accomodate lib change

* Update due to lib modification

Update due to lib modification

* Update Rower.test.js

* Update Rower.test.js

* Update Rower.test.js

* Update Rower.test.js

* Update due to gpio library change

* Update due to removal obsolete parameter

Update due to the removal of numberOfErrorsAllowed

* Removed obsolute parameter

Removed the numberOfErrorsAllowed parameter

* Performance improvement

A small performance improvement: by moving the evaluation of the flywheel.isPowered(), flywheel.isUnpowered() and flywheel.isDwelling() backwards, we move these potentially expensive operations further in the evaluation. As Javascript is using lazy evaluation, it won't be called unless all other conditions are true. Especially flywheel.isDwelling() checks if the entire flank is above maximumTimeBetweenImpulses, which is expensive (flywheel.isPowered() and flywheel.isUnpowered() are actually quite simple, but are moved along to maintain symmetry).

* Fixed a missing bracket

Fixed a missing bracket

* Allignment with main branch (64Bit support)

Alignment with the improvement of the install script of the main branch to support the 64 bit version of the Lite kernel.

* removes some obsolete variables

* adds a missing async statement

Signed-off-by: Lars Berning <151194+laberning@users.noreply.github.com>

* pin dependency

Signed-off-by: Lars Berning <151194+laberning@users.noreply.github.com>

* default setting should not fiddle with nice levels of os, otherwise we require root permissions by default

Signed-off-by: Lars Berning <151194+laberning@users.noreply.github.com>

* prettyfies a log message

Signed-off-by: Lars Berning <151194+laberning@users.noreply.github.com>

* unifies VO2max namings

Signed-off-by: Lars Berning <151194+laberning@users.noreply.github.com>

* Introduced appPriority as setting

Added the appPriority setting, to allow a clear entry to set the priority for the main process.

* Removed some obscure priority behaviour

Removed the obscure approach of using the gpio-priority to set the main app priority.

* Added a distinction between stop and pause

Based on a bugreport by @Carlito1979 about the pause behaviour, added a distinction between the stopMoving() and pauseMoving() command, as a pause would lead to an undesired stop state.

* Added a distinction between stop and pause

Based on a bugreport by @Carlito1979 about the pause behaviour, added a distinction between the stopMoving() and pauseMoving() command, as a pause would lead to an undesired stop state.

* Improved description of the various states

Based on bugs reported, and some internal soul searching, improved the description of states.

* Removed a trailing space

* Added profiles, put them in alphabetic order

Added the Force USA R3 Air Rower, and put the rowers in alphabetic order

* Removal of surplus comma

* Improvement of pause-behaviour

Improvement of the pause behaviour based on feedback from @Carlito1979

* Improved RestingHR behaviour, clarifications

Improvement of the resting HR functionality, it will now also trigger when rowing is paused
Clarification of "Stopped" sessionState behavior: this is a less than obvious but deliberate approach.

* Change to const postExerciseHR

Due to Lint error, changed postExerciseHR from "let" to "const"

* Create and advertising data builder

Since Bleno library does not provide a way to set/tweak appearance data
implement a builder that enables to add name and appearance information
to the advertisement data.

* Expose time of last completed stroke

For the CPS and CSC BLE Services the time stamp of the last stoke event
is necessary. This is available in the Rower as `drivePhaseStartTime` so
expose it

* Add 32bit capability to BufferBuilder

Since the wheel revolution count in the CSC and CPS measurement service
is a 32bin UINT extend the BufferBuilder to be able to handle it.

* Add static data and functions used in CSCS and CPS

Implement device information service (necessary for garmin to recognise
the device as sensor) a wrapper around static read characteristics to
ease creation.

* Add cycling speed and cadence profile

Add necessary services and related characteristics.
Implement CscPeripheral interface to be able to properly communicate to
the PeripheralManager.

* Add cycling power profile

Add necessary services and related characteristics.
Implement CpsPeripheral interface to be able to properly communicate to
the PeripheralManager.

* Wire up PeripheralManager with the new profiles

Add the new CSCP and CPP profiles to the PeripheralManager.
Update comments in settings and front end web view with the new profiles

* Add new Rower Profile Zoco Body Fit

Add a rowing profile for a Concept2 clone air rower

* Update FTMS profile with new services

Add device information service to the FTMS peripheral and move to the
new advertising data builder.

* Improvement of startup behaviour

Modification of the startup behaviour: now unrealistic values (i.e. above maximumTimeBetweenImpulses) are ignored. The rower will only start when all values in the flank are above the minmumSpeed (i.e. all currentDt's are below maximumTimeBetweenImpulses).

* Improvement of startup behaviour

Modification of the startup behaviour: now unrealistic values (i.e. above maximumTimeBetweenImpulses) are ignored. The rower will only start when all values in the flank are above the minmumSpeed (i.e. all currentDt's are below maximumTimeBetweenImpulses).

* Improvement of startup behaviour

Modification of the startup behaviour: now unrealistic values (i.e. above maximumTimeBetweenImpulses) are ignored. The rower will only start when all values in the flank are above the minmumSpeed (i.e. all currentDt's are below maximumTimeBetweenImpulses).

* Improvement of startup behaviour

Modification of the startup behaviour: now unrealistic values (i.e. above maximumTimeBetweenImpulses) are ignored. The rower will only start when all values in the flank are above the minmumSpeed (i.e. all currentDt's are below maximumTimeBetweenImpulses).

* Finalize Generic Air Rower profile

* Change name of displayed name of new profiles

* Rename lastStrokeTime to driveLastStartTime

* Fixed some small bugs

Fixed
* the missing pause command
* a small typo in the totalmovingtime

* Fixed a small bug

Fixed a small bug

* Improvement of browser performence

Improved some startup settings to increase browser performance (disables some security settings as they are not needed at a local system). Please note these settings are NOT RECOMENDED for general purpose browsers, but as we run on a localhost machine only, showing our GUI, this is quite acceptable.

* Update due to increased BLE profiles

Thanks to @Abasz, we can now use BLE Cycling Power Profile and the Cycling Speed and Cadence Profile.

* Added Abasz to the list of great contributors

* More expanded explanation of BLE profiles

* Update of the testfile to align with new GPIO conf

Update of the testfile to reflect the new GPIO-module

* Introduction of supporting Linear TS

Introduction of the Linear Theil-Senn algorithm to improve the Quadratic Theil-Senn algorithm

* Improvement of the Quad. Theil-Senn Algorithm

Improvement of the accuracy and robustness of the Quadratic Theil-Senn algorithm, as well as improving (reducing) the CPU load. It employs the Linear Theil-Senn Algorithm to calculate the optimal B and C for the selected A (instead of a marginally related B and C in the older algoithm).

* Update of the stroke detection algorithm

Update of the stroke detection algorithm: as the Qudratic Theil-Senn algorithm is more robust, we can rely on the sole combination of dragslope being gone and seeing torque.

* Updated to reflect more accurate algorithm

Updated the testscript to reflect the much more accurate and robust algorithm.

* Updated to reflect more improved algorithms

Updated test scripts to reflect the improvements in the Quadratic Theil-Senn algorithm and the Flywheel stroke detection algorithm.

* Updated to reflect more improved algorithms

Updated test scripts to reflect the improvements in the Quadratic Theil-Senn algorithm and the Flywheel stroke detection algorithm.

* Removed dead code

Removal of dead code

* Improvement of Code quality

* Improvement of code quality

Improvement of code quality

* Added space to survive Lint

Added space to survive Lint

* Addition of the isAboveMinimumSpeed function

Addition of the isAboveMinimumSpeed function

* Removed unused variable

* Add modification for new startup behaviour

Add modification for new startup behaviour

* Update to fix regression issues

Update to fix regression issues

* Update Rower.test.js

* Update of the C2 testcase

Update of the C2 testcase due to GPIO update

* Update of the C2 testcase due to GPIO changes

Update of the C2 testcase due to changing the testdata due to GPIO changes

* fixes some review findings

Signed-off-by: Lars Berning <151194+laberning@users.noreply.github.com>
Co-authored-by: Lars Berning <151194+laberning@users.noreply.github.com>
Co-authored-by: Abász <>
Co-authored-by: Abasz <32517724+Abasz@users.noreply.github.com>
2022-12-15 21:33:42 +01:00
Lars Berning 8dc8146abf
fixes #69 error in angularDisplacement calculation 2022-03-08 20:09:42 +01:00
Lars Berning dec19fdd1f
adds feature to shutdown device, adds some minor UI improvements 2022-02-12 11:32:31 +00:00
Lars Berning 943518b986
implements confirmation dialogs, improvements to strava upload 2022-02-11 22:37:36 +00:00
Lars Berning dfc17c09b2
wires strava authorization to the web ui 2022-02-05 21:54:15 +01:00
Lars Berning 15cdf2e22f
adds initial strava integration to upload activities 2022-02-05 13:15:43 +01:00
Lars Berning a4a7a1b0a0
adds features to store recordings with gzip compression, fixes a bug with the recording config 2022-02-01 20:20:32 +01:00
Lars Berning 2ccd54a65d
adds a constant metric stream for BLE devices to fix some connectivity issues 2022-02-01 19:25:51 +01:00
Lars Berning 2210c46162
improves metrics of first stroke by setting reasonable initial values 2022-01-31 19:55:27 +01:00
Lars Berning 6792ca77c1
fixes #57 where diagram would show spikes 2022-01-31 19:47:18 +01:00
Lars Berning b1aebef900
updates linter ignore pattern since linter now can support more recent syntax 2022-01-31 19:43:40 +01:00
Lars Berning fc00c01e61
fixes a problem that prevented session recording from working 2022-01-30 13:52:17 +01:00