rowingdata 3.8.1__tar.gz → 3.8.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. {rowingdata-3.8.1/rowingdata.egg-info → rowingdata-3.8.3}/PKG-INFO +45 -21
  2. {rowingdata-3.8.1 → rowingdata-3.8.3}/README.rst +22 -20
  3. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/data/fit_export_spec.json +16 -11
  4. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/fitwrite.py +201 -127
  5. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/fitwrite_spec.py +8 -3
  6. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/otherparsers.py +113 -10
  7. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/rowingdata.py +11 -3
  8. {rowingdata-3.8.1 → rowingdata-3.8.3/rowingdata.egg-info}/PKG-INFO +45 -21
  9. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata.egg-info/requires.txt +3 -1
  10. {rowingdata-3.8.1 → rowingdata-3.8.3}/setup.py +2 -2
  11. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testtcx.tcx +1 -1
  12. {rowingdata-3.8.1 → rowingdata-3.8.3}/tests/test_fit_instroke_export.py +17 -73
  13. {rowingdata-3.8.1 → rowingdata-3.8.3}/tests/test_fit_standard.py +148 -34
  14. {rowingdata-3.8.1 → rowingdata-3.8.3}/tests/test_rowingdata.py +16 -19
  15. {rowingdata-3.8.1 → rowingdata-3.8.3}/LICENSE +0 -0
  16. {rowingdata-3.8.1 → rowingdata-3.8.3}/MANIFEST.in +0 -0
  17. {rowingdata-3.8.1 → rowingdata-3.8.3}/bin/crewnerddata.csv +0 -0
  18. {rowingdata-3.8.1 → rowingdata-3.8.3}/bin/crewnerddata.tcx +0 -0
  19. {rowingdata-3.8.1 → rowingdata-3.8.3}/bin/testdata.csv +0 -0
  20. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/.buildinfo +0 -0
  21. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/2x20min.png +0 -0
  22. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/editrower.JPG +0 -0
  23. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/greghoc.png +0 -0
  24. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/image001.png +0 -0
  25. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/otwlogbook.JPG +0 -0
  26. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/otwscreenshot.JPG +0 -0
  27. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/screenshot.JPG +0 -0
  28. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/screenshotlogbook.JPG +0 -0
  29. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_images/woensdag.png +0 -0
  30. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_sources/index.txt +0 -0
  31. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_sources/modules.txt +0 -0
  32. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_sources/rowingdata.txt +0 -0
  33. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/ajax-loader.gif +0 -0
  34. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/alabaster.css +0 -0
  35. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/basic.css +0 -0
  36. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/comment-bright.png +0 -0
  37. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/comment-close.png +0 -0
  38. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/comment.png +0 -0
  39. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/custom.css +0 -0
  40. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/doctools.js +0 -0
  41. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/down-pressed.png +0 -0
  42. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/down.png +0 -0
  43. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/file.png +0 -0
  44. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/jquery-1.11.1.js +0 -0
  45. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/jquery.js +0 -0
  46. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/minus.png +0 -0
  47. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/plus.png +0 -0
  48. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/pygments.css +0 -0
  49. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/searchtools.js +0 -0
  50. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/underscore-1.3.1.js +0 -0
  51. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/underscore.js +0 -0
  52. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/up-pressed.png +0 -0
  53. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/up.png +0 -0
  54. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/_static/websupport.js +0 -0
  55. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/genindex.html +0 -0
  56. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/index.html +0 -0
  57. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/modules.html +0 -0
  58. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/objects.inv +0 -0
  59. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/py-modindex.html +0 -0
  60. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/rowingdata.html +0 -0
  61. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/search.html +0 -0
  62. {rowingdata-3.8.1 → rowingdata-3.8.3}/docs/_build/html/searchindex.js +0 -0
  63. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/__init__.py +0 -0
  64. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/__main__.py +0 -0
  65. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/boatedit.py +0 -0
  66. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/checkdatafiles.py +0 -0
  67. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/copystats.py +0 -0
  68. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/crewnerdplot.py +0 -0
  69. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/crewnerdplottime.py +0 -0
  70. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/csvparsers.py +0 -0
  71. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/ergdataplot.py +0 -0
  72. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/ergdataplottime.py +0 -0
  73. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/ergdatatotcx.py +0 -0
  74. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/ergstickplot.py +0 -0
  75. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/ergstickplottime.py +0 -0
  76. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/ergsticktotcx.py +0 -0
  77. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/fit_garmin_bridge.py +0 -0
  78. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/fit_transcode.py +0 -0
  79. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/gpxtools.py +0 -0
  80. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/gpxwrite.py +0 -0
  81. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/konkatenaadje.py +0 -0
  82. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/laptesting.py +0 -0
  83. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/obsolete.py +0 -0
  84. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/painsled_desktop_plot.py +0 -0
  85. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/painsled_desktop_plottime.py +0 -0
  86. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/painsled_desktop_toc2.py +0 -0
  87. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/painsledplot.py +0 -0
  88. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/painsledplottime.py +0 -0
  89. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/painsledtoc2.py +0 -0
  90. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/roweredit.py +0 -0
  91. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/rowproplot.py +0 -0
  92. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/rowproplottime.py +0 -0
  93. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/speedcoachplot.py +0 -0
  94. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/speedcoachplottime.py +0 -0
  95. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/speedcoachtoc2.py +0 -0
  96. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/tcxplot.py +0 -0
  97. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/tcxplot_nogeo.py +0 -0
  98. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/tcxplottime.py +0 -0
  99. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/tcxplottime_nogeo.py +0 -0
  100. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/tcxtoc2.py +0 -0
  101. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/tcxtools.py +0 -0
  102. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/trainingparser.py +0 -0
  103. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/utils.py +0 -0
  104. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/windcorrected.py +0 -0
  105. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata/writetcx.py +0 -0
  106. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata.egg-info/SOURCES.txt +0 -0
  107. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata.egg-info/dependency_links.txt +0 -0
  108. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata.egg-info/not-zip-safe +0 -0
  109. {rowingdata-3.8.1 → rowingdata-3.8.3}/rowingdata.egg-info/top_level.txt +0 -0
  110. {rowingdata-3.8.1 → rowingdata-3.8.3}/setup.cfg +0 -0
  111. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/2016-03-25-0758.CSV +0 -0
  112. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/2016-03-25-0758_data.CSV +0 -0
  113. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/2x20min_o.csv +0 -0
  114. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/2x2km.tcx +0 -0
  115. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/3km_cd_o.csv +0 -0
  116. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/3x250m.tcx +0 -0
  117. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/EUBoatCoach.csv +0 -0
  118. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/EmpowerSpeedCoachForce.csv +0 -0
  119. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/NKEmporfromgreg.csv +0 -0
  120. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/NKLiNKv130.csv +0 -0
  121. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/NoHR.tcx +0 -0
  122. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/PainsledForce.csv +0 -0
  123. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/RP_interval.csv +0 -0
  124. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/RP_interval.csv_o.CSV +0 -0
  125. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/RP_testdata.csv +0 -0
  126. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/SpdCoach2_imp_inconsistent.csv +0 -0
  127. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/SpdCoachAmbiguous.csv +0 -0
  128. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/SpeedCoach GPS Workout.csv +0 -0
  129. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/SpeedCoach2Link_interval.csv +0 -0
  130. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/SpeedCoach2Linkv1.27.csv +0 -0
  131. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/SpeedCoach2v2.12.csv +0 -0
  132. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/Speedcoach2example.csv +0 -0
  133. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/aritmo.csv +0 -0
  134. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/bc1.csv +0 -0
  135. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/bc2.csv +0 -0
  136. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/bc3.csv +0 -0
  137. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/boatcoach.csv +0 -0
  138. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/boatcoach_fixed_distance.csv +0 -0
  139. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/boatcoach_otw.csv +0 -0
  140. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/correctedpainsled.csv +0 -0
  141. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/cottwich.csv +0 -0
  142. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/coxmate.csv +0 -0
  143. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/crewnerd_interval.csv +0 -0
  144. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/crewnerddata.CSV +0 -0
  145. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/crewnerddata.tcx +0 -0
  146. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/crewnerddata_o.CSV +0 -0
  147. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/cumvalues.csv +0 -0
  148. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/ergdata_example.csv +0 -0
  149. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/ergdata_example.csv_o.CSV +0 -0
  150. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/ergstick.csv +0 -0
  151. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/ergstick.csv_o.CSV +0 -0
  152. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/ergstick2.csv +0 -0
  153. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/ergstick_o.csv +0 -0
  154. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/example.csv +0 -0
  155. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/example_data.csv +0 -0
  156. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/faketcx.tcx +0 -0
  157. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/float.csv +0 -0
  158. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/herodata.csv +0 -0
  159. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/humon.csv +0 -0
  160. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/impeller_empower.csv +0 -0
  161. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/invalidchar.tcx +0 -0
  162. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/kinomap.csv +0 -0
  163. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/mystery.csv +0 -0
  164. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/nk_logbook.csv +0 -0
  165. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/painsled.tcx +0 -0
  166. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/painsled_desktop_example.csv +0 -0
  167. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/painsled_out_data.csv +0 -0
  168. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/painsled_to_csv_20160221-105218_erg-400150318_760465m.csv +0 -0
  169. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/quiske_per_stroke_left.csv +0 -0
  170. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/quiske_per_stroke_new.csv +0 -0
  171. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/quiske_per_stroke_right.csv +0 -0
  172. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/quiske_per_stroke_seat.csv +0 -0
  173. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/recover.tcx +0 -0
  174. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/ritmointervals.csv +0 -0
  175. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rowingdata_eth.csv +0 -0
  176. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rowinginmotionexample.TCX +0 -0
  177. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rowinginmotionexample.TCX_o.CSV +0 -0
  178. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rowperfect.csv +0 -0
  179. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rowpro5.csv +0 -0
  180. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rowpro_carrick.csv +0 -0
  181. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rp3_curve.csv +0 -0
  182. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rp3intervals.csv +0 -0
  183. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rp3intervals2.csv +0 -0
  184. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/rp_out.csv +0 -0
  185. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/smartrow.csv +0 -0
  186. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/smartrow_intervals.csv +0 -0
  187. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/spdcoach2noheader.csv +0 -0
  188. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/speedcoach2test2.csv +0 -0
  189. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/speedcoach3test3.csv +0 -0
  190. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/speedcoachexample.csv +0 -0
  191. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/speedcoachexample.csv_o.CSV +0 -0
  192. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/strava_export.tcx +0 -0
  193. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/summarytest.csv +0 -0
  194. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testdata.csv +0 -0
  195. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testdata_part1.csv +0 -0
  196. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testdata_part2.csv +0 -0
  197. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testdatasummary.csv +0 -0
  198. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testlapidx.csv +0 -0
  199. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testtcs_210614.tcx +0 -0
  200. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/testtcx_210614.tcx +0 -0
  201. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata/tim.csv +0 -0
  202. {rowingdata-3.8.1 → rowingdata-3.8.3}/testdata//345/210/222/350/210/271.csv" +0 -0
  203. {rowingdata-3.8.1 → rowingdata-3.8.3}/tests/test_fit_transcode.py +0 -0
  204. {rowingdata-3.8.1 → rowingdata-3.8.3}/tests/testparser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: rowingdata
3
- Version: 3.8.1
3
+ Version: 3.8.3
4
4
  Summary: The rowingdata library to create colorful plots from CrewNerd, Painsled and other rowing data tools
5
5
  Home-page: https://github.com/sanderroosendaal/rowingdata
6
6
  Author: Sander Roosendaal
@@ -9,6 +9,28 @@ License: MIT
9
9
  Keywords: rowing ergometer concept2
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  License-File: LICENSE
12
+ Requires-Dist: Cython
13
+ Requires-Dist: numpy
14
+ Requires-Dist: scipy
15
+ Requires-Dist: matplotlib
16
+ Requires-Dist: pandas
17
+ Requires-Dist: fitparse
18
+ Requires-Dist: fit-tool>=0.9.14
19
+ Requires-Dist: arrow>=1.0.2
20
+ Requires-Dist: python-dateutil
21
+ Requires-Dist: docopt
22
+ Requires-Dist: tqdm
23
+ Requires-Dist: rowingphysics>=0.2.3
24
+ Requires-Dist: iso8601
25
+ Requires-Dist: lxml>=6.1.0
26
+ Requires-Dist: xmltodict
27
+ Requires-Dist: nose_parameterized
28
+ Requires-Dist: timezonefinder
29
+ Requires-Dist: pycairo
30
+ Requires-Dist: tk
31
+ Requires-Dist: requests
32
+ Requires-Dist: polars
33
+ Requires-Dist: pytz
12
34
 
13
35
  **************
14
36
  Rowingdata
@@ -533,7 +555,7 @@ The available data fields are
533
555
  * 'cum_dist'
534
556
 
535
557
  Oarlock parsers (NK Logbook) may add: ``catch``, ``finish``,
536
- ``slip``, ``wash``, ``peakforceangle``, ``effectiveLength``.
558
+ ``slip``, ``wash``, ``peakforceangle``, ``effectiveArc``.
537
559
 
538
560
  If imported from TCX, Rowpro, or other tools, some data fields may not contain
539
561
  useful information.
@@ -545,7 +567,7 @@ rowingdata CSV Columns
545
567
  This section describes the dataframe schema used by the ``rowingdata`` class.
546
568
  It is this package's own column layout, not a vendor-neutral standard. For a
547
569
  cross-vendor interchange format, see the Rowing Data Standard at
548
- https://github.com/MoveLab-Studio/rowing-data-standard, which rowingdata
570
+ https://github.com/Rowing-Industry-Trade-Association/rowing-data-standard, which rowingdata
549
571
  targets when exporting FIT.
550
572
 
551
573
  Any parser implementation feeding the ``rowingdata`` class should produce at
@@ -578,12 +600,12 @@ The standard field names are:
578
600
  * ' ElapsedTime (sec)'
579
601
 
580
602
  Optional (Oarlock/NK Logbook): ``catch``/``catchAngle``, ``finish``/``finishAngle``,
581
- ``slip``, ``wash``, ``peakforceangle``, ``effectiveLength``.
603
+ ``slip``, ``wash``, ``peakforceangle``, ``effectiveArc``.
582
604
 
583
605
  Planned for dual oarlock (port/starboard symmetry): ``catch_port``, ``catch_starboard``,
584
606
  ``finish_port``, ``finish_starboard``, ``slip_port``, ``slip_starboard``, ``wash_port``,
585
607
  ``wash_starboard``, ``peakforceangle_port``, ``peakforceangle_starboard``,
586
- ``effectiveLength_port``, ``effectiveLength_starboard``. See *Dual oarlock
608
+ ``effectiveArc_port``, ``effectiveArc_starboard``. See *Dual oarlock
587
609
  (port/starboard)* below. **Note:** rowingdata does not yet implement parsing or
588
610
  export for these per-side columns.
589
611
 
@@ -826,10 +848,9 @@ Oarlock scalars (OTW rigging)
826
848
  -----------------------------
827
849
 
828
850
  Field names: 'catch' / 'catchAngle', 'finish' / 'finishAngle', 'slip',
829
- 'wash', 'peakforceangle', 'effectiveLength'
851
+ 'wash', 'peakforceangle', 'effectiveArc'
830
852
 
831
- Units: degrees for angles; meter for effectiveLength (scale may vary by
832
- source: NK Logbook uses these columns).
853
+ Units: degrees for angles and for effectiveArc.
833
854
 
834
855
  These fields come from NK Logbook (Oarlock) and similar OTW
835
856
  measurement systems. They describe rigging geometry and blade angles:
@@ -842,12 +863,11 @@ measurement systems. They describe rigging geometry and blade angles:
842
863
  * **slip** – blade slip angle.
843
864
  * **wash** – wash/backwash angle.
844
865
  * **peakforceangle** – oar angle at peak force (same 0° = perpendicular convention).
845
- * **effectiveLength** – effective lever length (rigging geometry). *Not*
846
- the same as Drive Length: Effective Length is the horizontal component
847
- from pin to handle (a rigging/setup measure, often in cm), whereas
848
- Drive Length is the *actual distance the handle traveled* during the
849
- stroke (typically 1.2–1.5 m). Both may appear in the same dataset;
850
- they serve different purposes.
866
+ * **effectiveArc** – the part of the stroke arc that is effective: catch to
867
+ finish, less slip and wash (degrees). The Rowing Data Standard replaced the
868
+ earlier effective *length* (a lever length in mm) with this arc. Files written
869
+ against earlier drafts carry ``EffectiveLength``; it is read into the
870
+ ``effectiveLength`` column (metres) and is not converted into an arc.
851
871
 
852
872
  Dual oarlock (port/starboard)
853
873
  ..............................
@@ -951,12 +971,16 @@ Unreleased
951
971
  ----------
952
972
 
953
973
  - **Breaking change to exported FIT file contents.** FIT export now follows the
954
- Rowing Data Standard (https://github.com/MoveLab-Studio/rowing-data-standard,
955
- Draft v0.1). The ``exporttofit`` API is unchanged, but the bytes it writes are
956
- not: the developer application ID is now the standard UUID, ``DriveLength``
957
- and ``EffectiveLength`` are encoded in millimetres rather than metres,
958
- ``AverageBoatSpeed`` uses scale 255, stroke rate moves to field ID 93, and
959
- stroke work to field ID 19. Consumers that hardcoded the previous rowingdata
974
+ Rowing Data Standard (https://github.com/Rowing-Industry-Trade-Association/rowing-data-standard,
975
+ current ``main``). The ``exporttofit`` API is unchanged, but the bytes it
976
+ writes are not: the developer application ID is now the standard UUID,
977
+ ``DriveLength`` is encoded in millimetres rather than metres,
978
+ ``AverageBoatSpeed`` uses scale 100, ``EffectiveLength`` is replaced by
979
+ ``EffectiveArc`` in degrees (IDs 16, 210, 211; the ``effectiveLength*``
980
+ columns are no longer exported, use ``effectiveArc*``), the force fields are
981
+ named ``AverageDriveForce`` and ``PeakDriveForce``, stroke rate is written as
982
+ native ``cadence256``, stroke work uses field ID 19, and no value is written
983
+ as the FIT invalid value (255 / 65535 / 32767): measurements clip one below it. Consumers that hardcoded the previous rowingdata
960
984
  application ID or the old metre-based scales must be updated. ``FITParser``
961
985
  still reads files written by rowingdata 3.7.3 and earlier.
962
986
  - In-stroke curve fields are emitted under a separate, private application ID,
@@ -964,7 +988,7 @@ Unreleased
964
988
  carry no interoperable meaning.
965
989
  - Removed ``docs/FIT_STANDARD.md`` and ``docs/FIT_STANDARD.pdf``. The standard is
966
990
  maintained by a committee at
967
- https://github.com/MoveLab-Studio/rowing-data-standard, which is the single
991
+ https://github.com/Rowing-Industry-Trade-Association/rowing-data-standard, which is the single
968
992
  source of truth; this repository no longer ships a copy.
969
993
 
970
994
  0.97.x
@@ -521,7 +521,7 @@ The available data fields are
521
521
  * 'cum_dist'
522
522
 
523
523
  Oarlock parsers (NK Logbook) may add: ``catch``, ``finish``,
524
- ``slip``, ``wash``, ``peakforceangle``, ``effectiveLength``.
524
+ ``slip``, ``wash``, ``peakforceangle``, ``effectiveArc``.
525
525
 
526
526
  If imported from TCX, Rowpro, or other tools, some data fields may not contain
527
527
  useful information.
@@ -533,7 +533,7 @@ rowingdata CSV Columns
533
533
  This section describes the dataframe schema used by the ``rowingdata`` class.
534
534
  It is this package's own column layout, not a vendor-neutral standard. For a
535
535
  cross-vendor interchange format, see the Rowing Data Standard at
536
- https://github.com/MoveLab-Studio/rowing-data-standard, which rowingdata
536
+ https://github.com/Rowing-Industry-Trade-Association/rowing-data-standard, which rowingdata
537
537
  targets when exporting FIT.
538
538
 
539
539
  Any parser implementation feeding the ``rowingdata`` class should produce at
@@ -566,12 +566,12 @@ The standard field names are:
566
566
  * ' ElapsedTime (sec)'
567
567
 
568
568
  Optional (Oarlock/NK Logbook): ``catch``/``catchAngle``, ``finish``/``finishAngle``,
569
- ``slip``, ``wash``, ``peakforceangle``, ``effectiveLength``.
569
+ ``slip``, ``wash``, ``peakforceangle``, ``effectiveArc``.
570
570
 
571
571
  Planned for dual oarlock (port/starboard symmetry): ``catch_port``, ``catch_starboard``,
572
572
  ``finish_port``, ``finish_starboard``, ``slip_port``, ``slip_starboard``, ``wash_port``,
573
573
  ``wash_starboard``, ``peakforceangle_port``, ``peakforceangle_starboard``,
574
- ``effectiveLength_port``, ``effectiveLength_starboard``. See *Dual oarlock
574
+ ``effectiveArc_port``, ``effectiveArc_starboard``. See *Dual oarlock
575
575
  (port/starboard)* below. **Note:** rowingdata does not yet implement parsing or
576
576
  export for these per-side columns.
577
577
 
@@ -814,10 +814,9 @@ Oarlock scalars (OTW rigging)
814
814
  -----------------------------
815
815
 
816
816
  Field names: 'catch' / 'catchAngle', 'finish' / 'finishAngle', 'slip',
817
- 'wash', 'peakforceangle', 'effectiveLength'
817
+ 'wash', 'peakforceangle', 'effectiveArc'
818
818
 
819
- Units: degrees for angles; meter for effectiveLength (scale may vary by
820
- source: NK Logbook uses these columns).
819
+ Units: degrees for angles and for effectiveArc.
821
820
 
822
821
  These fields come from NK Logbook (Oarlock) and similar OTW
823
822
  measurement systems. They describe rigging geometry and blade angles:
@@ -830,12 +829,11 @@ measurement systems. They describe rigging geometry and blade angles:
830
829
  * **slip** – blade slip angle.
831
830
  * **wash** – wash/backwash angle.
832
831
  * **peakforceangle** – oar angle at peak force (same 0° = perpendicular convention).
833
- * **effectiveLength** – effective lever length (rigging geometry). *Not*
834
- the same as Drive Length: Effective Length is the horizontal component
835
- from pin to handle (a rigging/setup measure, often in cm), whereas
836
- Drive Length is the *actual distance the handle traveled* during the
837
- stroke (typically 1.2–1.5 m). Both may appear in the same dataset;
838
- they serve different purposes.
832
+ * **effectiveArc** – the part of the stroke arc that is effective: catch to
833
+ finish, less slip and wash (degrees). The Rowing Data Standard replaced the
834
+ earlier effective *length* (a lever length in mm) with this arc. Files written
835
+ against earlier drafts carry ``EffectiveLength``; it is read into the
836
+ ``effectiveLength`` column (metres) and is not converted into an arc.
839
837
 
840
838
  Dual oarlock (port/starboard)
841
839
  ..............................
@@ -939,12 +937,16 @@ Unreleased
939
937
  ----------
940
938
 
941
939
  - **Breaking change to exported FIT file contents.** FIT export now follows the
942
- Rowing Data Standard (https://github.com/MoveLab-Studio/rowing-data-standard,
943
- Draft v0.1). The ``exporttofit`` API is unchanged, but the bytes it writes are
944
- not: the developer application ID is now the standard UUID, ``DriveLength``
945
- and ``EffectiveLength`` are encoded in millimetres rather than metres,
946
- ``AverageBoatSpeed`` uses scale 255, stroke rate moves to field ID 93, and
947
- stroke work to field ID 19. Consumers that hardcoded the previous rowingdata
940
+ Rowing Data Standard (https://github.com/Rowing-Industry-Trade-Association/rowing-data-standard,
941
+ current ``main``). The ``exporttofit`` API is unchanged, but the bytes it
942
+ writes are not: the developer application ID is now the standard UUID,
943
+ ``DriveLength`` is encoded in millimetres rather than metres,
944
+ ``AverageBoatSpeed`` uses scale 100, ``EffectiveLength`` is replaced by
945
+ ``EffectiveArc`` in degrees (IDs 16, 210, 211; the ``effectiveLength*``
946
+ columns are no longer exported, use ``effectiveArc*``), the force fields are
947
+ named ``AverageDriveForce`` and ``PeakDriveForce``, stroke rate is written as
948
+ native ``cadence256``, stroke work uses field ID 19, and no value is written
949
+ as the FIT invalid value (255 / 65535 / 32767): measurements clip one below it. Consumers that hardcoded the previous rowingdata
948
950
  application ID or the old metre-based scales must be updated. ``FITParser``
949
951
  still reads files written by rowingdata 3.7.3 and earlier.
950
952
  - In-stroke curve fields are emitted under a separate, private application ID,
@@ -952,7 +954,7 @@ Unreleased
952
954
  carry no interoperable meaning.
953
955
  - Removed ``docs/FIT_STANDARD.md`` and ``docs/FIT_STANDARD.pdf``. The standard is
954
956
  maintained by a committee at
955
- https://github.com/MoveLab-Studio/rowing-data-standard, which is the single
957
+ https://github.com/Rowing-Industry-Trade-Association/rowing-data-standard, which is the single
956
958
  source of truth; this repository no longer ships a copy.
957
959
 
958
960
  0.97.x
@@ -1,6 +1,8 @@
1
1
  {
2
- "version": 2,
3
- "_comment": "Authoritative FIT developer field definitions for rowingdata fitwrite. Field IDs, scales and units must match the Rowing Data Standard registry at https://github.com/MoveLab-Studio/rowing-data-standard (registry/field-ids.md); that repository is the source of truth, this file is only rowingdata's machine-readable copy of the subset it emits. v2: mm precision for DriveLength/PeakForcePositionAbs (scale 1000); StrokeRate dev field (93); instroke curve Y-scale registry.",
2
+ "version": 4,
3
+ "protocol_version": 1,
4
+ "handle_force_curve_field_id": 60,
5
+ "_comment": "Authoritative FIT developer field definitions for rowingdata fitwrite. Field IDs, scales and units must match the Rowing Data Standard registry at https://github.com/Rowing-Industry-Trade-Association/rowing-data-standard (registry/field-ids.md); that repository is the source of truth, this file is only rowingdata's machine-readable copy of the subset it emits. v2: mm precision for DriveLength/PeakForcePositionAbs (scale 1000); StrokeRate dev field (93); instroke curve Y-scale registry. v4: main of 2026-10-31: AverageBoatSpeed scale 100; EffectiveLength -> EffectiveArc (deg, scale 10; 16, 210, 211); force fields named without the N suffix. v3: standard draft 0.1: WorkoutState holds FIT intensity values; StrokeState (96); SlipThreshold/WashThreshold (94/95); HandleForceCurve fixed at 60; fields 4, 5 and 93 are not in the standard and are read-only (group legacy).",
4
6
  "instroke_dynamic": {
5
7
  "summary_start": 20,
6
8
  "summary_id_padding": "ceil_to_10",
@@ -48,22 +50,25 @@
48
50
  {"field_id": 1, "group": "rowing", "fit_name": "StrokeDriveTime", "base_type": "UINT16", "size": 2, "scale": 1, "units": "ms", "df_columns": [" DriveTime (ms)"]},
49
51
  {"field_id": 2, "group": "rowing", "fit_name": "DragFactor", "base_type": "UINT16", "size": 2, "scale": 1, "units": "", "df_columns": [" DragFactor"]},
50
52
  {"field_id": 3, "group": "rowing", "fit_name": "StrokeRecoveryTime", "base_type": "UINT16", "size": 2, "scale": 1, "units": "ms", "df_columns": [" StrokeRecoveryTime (ms)"]},
51
- {"field_id": 4, "group": "rowing", "fit_name": "AverageDriveForceLbs", "base_type": "UINT16", "size": 2, "scale": 10, "units": "lbs", "df_columns": [" AverageDriveForce (lbs)"]},
52
- {"field_id": 5, "group": "rowing", "fit_name": "PeakDriveForceLbs", "base_type": "UINT16", "size": 2, "scale": 10, "units": "lbs", "df_columns": [" PeakDriveForce (lbs)"]},
53
- {"field_id": 6, "group": "rowing", "fit_name": "AverageDriveForceN", "base_type": "UINT16", "size": 2, "scale": 10, "units": "N", "df_columns": [" AverageDriveForce (N)"]},
54
- {"field_id": 7, "group": "rowing", "fit_name": "PeakDriveForceN", "base_type": "UINT16", "size": 2, "scale": 10, "units": "N", "df_columns": [" PeakDriveForce (N)"]},
55
- {"field_id": 8, "group": "rowing", "fit_name": "AverageBoatSpeed", "base_type": "UINT16", "size": 2, "scale": 255, "units": "m/s", "df_columns": [" AverageBoatSpeed (m/s)"]},
53
+ {"field_id": 4, "group": "legacy", "fit_name": "AverageDriveForceLbs", "base_type": "UINT16", "size": 2, "scale": 10, "units": "lbs", "df_columns": [" AverageDriveForce (lbs)"]},
54
+ {"field_id": 5, "group": "legacy", "fit_name": "PeakDriveForceLbs", "base_type": "UINT16", "size": 2, "scale": 10, "units": "lbs", "df_columns": [" PeakDriveForce (lbs)"]},
55
+ {"field_id": 6, "group": "rowing", "fit_name": "AverageDriveForce", "base_type": "UINT16", "size": 2, "scale": 10, "units": "N", "df_columns": [" AverageDriveForce (N)"]},
56
+ {"field_id": 7, "group": "rowing", "fit_name": "PeakDriveForce", "base_type": "UINT16", "size": 2, "scale": 10, "units": "N", "df_columns": [" PeakDriveForce (N)"]},
57
+ {"field_id": 8, "group": "rowing", "fit_name": "AverageBoatSpeed", "base_type": "UINT16", "size": 2, "scale": 100, "units": "m/s", "df_columns": [" AverageBoatSpeed (m/s)"]},
56
58
  {"field_id": 9, "group": "rowing", "fit_name": "WorkoutState", "base_type": "UINT8", "size": 1, "scale": 1, "units": "", "df_columns": [" WorkoutState"]},
57
59
  {"field_id": 10, "group": "metadata", "fit_name": "RecordingStrategy", "base_type": "UINT8", "size": 1, "scale": 1, "units": "", "df_columns": [], "message_type": "session"},
60
+ {"field_id": 94, "group": "metadata", "fit_name": "SlipThreshold", "base_type": "UINT16", "size": 2, "scale": 1, "units": "N", "df_columns": [], "message_type": "session"},
61
+ {"field_id": 95, "group": "metadata", "fit_name": "WashThreshold", "base_type": "UINT16", "size": 2, "scale": 1, "units": "N", "df_columns": [], "message_type": "session"},
58
62
  {"field_id": 19, "group": "rowing", "fit_name": "StrokeWork", "base_type": "UINT16", "size": 2, "scale": 1, "units": "J", "df_columns": [" WorkPerStroke (joules)", "driveenergy"]},
59
- {"field_id": 93, "group": "rowing", "fit_name": "StrokeRate", "base_type": "UINT16", "size": 2, "scale": 100, "units": "spm", "df_columns": [" Cadence (stokes/min)"]},
63
+ {"field_id": 96, "group": "rowing", "fit_name": "StrokeState", "base_type": "UINT8", "size": 1, "scale": 1, "units": "", "df_columns": [" StrokeState"]},
64
+ {"field_id": 93, "group": "legacy", "fit_name": "StrokeRate", "base_type": "UINT16", "size": 2, "scale": 100, "units": "spm", "df_columns": [" Cadence (stokes/min)"]},
60
65
 
61
66
  {"field_id": 11, "group": "oarlock", "fit_name": "Catch", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["catch", " catch", "catchAngle"]},
62
67
  {"field_id": 12, "group": "oarlock", "fit_name": "Finish", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["finish", " finish", "finishAngle"]},
63
68
  {"field_id": 13, "group": "oarlock", "fit_name": "Slip", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["slip", " slip"]},
64
69
  {"field_id": 14, "group": "oarlock", "fit_name": "Wash", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["wash", " wash"]},
65
70
  {"field_id": 15, "group": "oarlock", "fit_name": "PeakForceAngle", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["peakforceangle", " peakforceangle"]},
66
- {"field_id": 16, "group": "oarlock", "fit_name": "EffectiveLength", "base_type": "UINT16", "size": 2, "scale": 1, "units": "mm", "df_columns": ["effectiveLength", " effectiveLength", "effective length"]},
71
+ {"field_id": 16, "group": "oarlock", "fit_name": "EffectiveArc", "base_type": "UINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["effectiveArc", " effectiveArc", "effective arc"]},
67
72
 
68
73
  {"field_id": 200, "group": "oarlock_dual", "dual_pair": "catch", "side": "port", "fit_name": "CatchPort", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["catch_port", "catchAngle_port"]},
69
74
  {"field_id": 201, "group": "oarlock_dual", "dual_pair": "catch", "side": "starboard", "fit_name": "CatchStarboard", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["catch_starboard", "catchAngle_starboard"]},
@@ -75,8 +80,8 @@
75
80
  {"field_id": 207, "group": "oarlock_dual", "dual_pair": "wash", "side": "starboard", "fit_name": "WashStarboard", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["wash_starboard"]},
76
81
  {"field_id": 208, "group": "oarlock_dual", "dual_pair": "peakforceangle", "side": "port", "fit_name": "PeakForceAnglePort", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["peakforceangle_port"]},
77
82
  {"field_id": 209, "group": "oarlock_dual", "dual_pair": "peakforceangle", "side": "starboard", "fit_name": "PeakForceAngleStarboard", "base_type": "SINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["peakforceangle_starboard"]},
78
- {"field_id": 210, "group": "oarlock_dual", "dual_pair": "effectiveLength", "side": "port", "fit_name": "EffectiveLengthPort", "base_type": "UINT16", "size": 2, "scale": 1, "units": "mm", "df_columns": ["effectiveLength_port"]},
79
- {"field_id": 211, "group": "oarlock_dual", "dual_pair": "effectiveLength", "side": "starboard", "fit_name": "EffectiveLengthStarboard", "base_type": "UINT16", "size": 2, "scale": 1, "units": "mm", "df_columns": ["effectiveLength_starboard"]},
83
+ {"field_id": 210, "group": "oarlock_dual", "dual_pair": "effectiveArc", "side": "port", "fit_name": "EffectiveArcPort", "base_type": "UINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["effectiveArc_port"]},
84
+ {"field_id": 211, "group": "oarlock_dual", "dual_pair": "effectiveArc", "side": "starboard", "fit_name": "EffectiveArcStarboard", "base_type": "UINT16", "size": 2, "scale": 10, "units": "deg", "df_columns": ["effectiveArc_starboard"]},
80
85
 
81
86
  {"field_id": 17, "group": "peak_position", "fit_name": "PeakForcePositionNorm", "base_type": "UINT16", "size": 2, "scale": 1, "units": "", "df_columns": ["rel_peak_force_pos", "PeakForcePositionNorm", "% of Stroke Complete When Peak Force Is Reached"], "transformer": "peak_norm", "clip_uint16_max": 10000},
82
87
  {"field_id": 18, "group": "peak_position", "fit_name": "PeakForcePositionAbs", "base_type": "UINT16", "size": 2, "scale": 1, "units": "mm", "df_columns": ["peak_force_pos", "PeakForcePositionAbs"], "transformer": "peak_abs"},