incyclist-devices 1.3.0 → 1.4.1

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 (71) hide show
  1. package/lib/CyclingMode.d.ts +72 -0
  2. package/lib/CyclingMode.js +66 -0
  3. package/lib/Device.d.ts +48 -10
  4. package/lib/Device.js +9 -8
  5. package/lib/DeviceProtocol.d.ts +40 -12
  6. package/lib/DeviceProtocol.js +16 -16
  7. package/lib/DeviceRegistry.d.ts +4 -4
  8. package/lib/DeviceRegistry.js +10 -10
  9. package/lib/DeviceSupport.d.ts +4 -3
  10. package/lib/DeviceSupport.js +32 -8
  11. package/lib/ant/AntAdapter.d.ts +7 -3
  12. package/lib/ant/AntAdapter.js +23 -3
  13. package/lib/ant/AntScanner.d.ts +15 -6
  14. package/lib/ant/AntScanner.js +372 -128
  15. package/lib/ant/antfe/AntFEAdapter.d.ts +1 -1
  16. package/lib/ant/antfe/AntFEAdapter.js +191 -92
  17. package/lib/ant/anthrm/AntHrmAdapter.d.ts +3 -1
  18. package/lib/ant/anthrm/AntHrmAdapter.js +70 -19
  19. package/lib/ant/utils.js +2 -1
  20. package/lib/calculations.d.ts +12 -13
  21. package/lib/calculations.js +88 -125
  22. package/lib/daum/DaumAdapter.d.ts +29 -6
  23. package/lib/daum/DaumAdapter.js +219 -96
  24. package/lib/daum/ERGCyclingMode.d.ts +28 -0
  25. package/lib/daum/ERGCyclingMode.js +207 -0
  26. package/lib/daum/PowerMeterCyclingMode.d.ts +18 -0
  27. package/lib/daum/PowerMeterCyclingMode.js +79 -0
  28. package/lib/daum/SmartTrainerCyclingMode.d.ts +41 -0
  29. package/lib/daum/SmartTrainerCyclingMode.js +344 -0
  30. package/lib/daum/classic/DaumClassicAdapter.d.ts +3 -1
  31. package/lib/daum/classic/DaumClassicAdapter.js +46 -32
  32. package/lib/daum/classic/DaumClassicCyclingMode.d.ts +13 -0
  33. package/lib/daum/classic/DaumClassicCyclingMode.js +98 -0
  34. package/lib/daum/classic/DaumClassicProtocol.d.ts +5 -3
  35. package/lib/daum/classic/DaumClassicProtocol.js +47 -8
  36. package/lib/daum/classic/ERGCyclingMode.d.ts +23 -0
  37. package/lib/daum/classic/ERGCyclingMode.js +171 -0
  38. package/lib/daum/classic/bike.d.ts +41 -37
  39. package/lib/daum/classic/bike.js +86 -53
  40. package/lib/daum/classic/utils.d.ts +3 -3
  41. package/lib/daum/classic/utils.js +18 -10
  42. package/lib/daum/indoorbike.d.ts +2 -1
  43. package/lib/daum/indoorbike.js +23 -21
  44. package/lib/daum/premium/DaumPremiumAdapter.d.ts +2 -2
  45. package/lib/daum/premium/DaumPremiumAdapter.js +30 -20
  46. package/lib/daum/premium/DaumPremiumProtocol.d.ts +11 -2
  47. package/lib/daum/premium/DaumPremiumProtocol.js +57 -10
  48. package/lib/daum/premium/bike.d.ts +63 -52
  49. package/lib/daum/premium/bike.js +254 -207
  50. package/lib/daum/premium/tcpserial.d.ts +18 -14
  51. package/lib/daum/premium/tcpserial.js +44 -20
  52. package/lib/daum/premium/utils.d.ts +2 -2
  53. package/lib/simulator/Simulator.d.ts +13 -7
  54. package/lib/simulator/Simulator.js +62 -21
  55. package/lib/utils.d.ts +3 -1
  56. package/lib/utils.js +39 -18
  57. package/package.json +12 -11
  58. package/lib/ant/AntScanner.unit.tests.d.ts +0 -1
  59. package/lib/ant/AntScanner.unit.tests.js +0 -25
  60. package/lib/ant/antfe/AntFEProcessor.d.ts +0 -40
  61. package/lib/ant/antfe/AntFEProcessor.js +0 -238
  62. package/lib/ant/antfe/AntHrmProtocol.d.ts +0 -9
  63. package/lib/ant/antfe/AntHrmProtocol.js +0 -30
  64. package/lib/ant/antfe/FEDevice.d.ts +0 -1
  65. package/lib/ant/antfe/FEDevice.js +0 -7
  66. package/lib/ant/antfe/bike.d.ts +0 -47
  67. package/lib/ant/antfe/bike.js +0 -602
  68. package/lib/ant/anthrm/anthrm.d.ts +0 -33
  69. package/lib/ant/anthrm/anthrm.js +0 -523
  70. package/lib/simulator/Simulator.unit.tests.d.ts +0 -1
  71. package/lib/simulator/Simulator.unit.tests.js +0 -79
@@ -1,14 +1,13 @@
1
- export default class Calculations {
2
- static calculateSpeed(m: any, power: any, slope: any): any;
3
- static calculateAccelSpeed(m: any, power: any, slope: any, speedPrev: any, t: any): number;
4
- static calculateSpeedUncachedOld(m: any, power: any, slope: any): number;
5
- static calculateSpeedUncached(m: any, power: any, slope: any): number;
6
- static calculatePower(m: any, v: any, slope: any): number;
7
- static calculateForce(m: any, v: any, slope: any): number;
8
- static calculatePowerAccelaration(m: any, a: any, v: any): number;
9
- static calculatePowerResistance(m: any, v: any, slope: any): number;
10
- static crankPower(rpm: any, torque: any): number;
11
- static crankTorque(rpm: any, power: any): number;
12
- static crankRPM(power: any, torque: any): number;
13
- static calculateSpeedDaum(gear: any, rpm: any, bikeType: any): number;
1
+ export declare class IllegalArgumentException extends Error {
2
+ constructor(message: any);
14
3
  }
4
+ export default class C {
5
+ static calculateSpeed(m: number, power: number, slope: number, props?: any): number;
6
+ static calculatePower(m: number, v: number, slope: number, props?: any): number;
7
+ static calculateSpeedDaum(gear: number, rpm: number, bikeType?: string | number): number;
8
+ static calculateSpeedBike(gear: number, rpm: number, chain: number[], cassette: number[], props?: {
9
+ numGears?: number;
10
+ wheelCirc?: number;
11
+ }): number;
12
+ }
13
+ export declare function solveCubic(p: any, q: any): any[];
@@ -1,121 +1,81 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const POS_BREMSGRIFF = 1;
4
- const POS_TRIATHLON = 3;
5
- let crX = 0.0033;
6
- let g = 9.80665;
7
- let clOL = 0.4594;
8
- let cOL = 0.05;
9
- let clUL = 0.3218;
10
- let cUL = 0.05;
11
- let clTri = 0.325;
12
- let cTri = 0.017;
13
- let airDensity = 1.2041;
14
- let rho = airDensity;
15
- let cWAs = [0.45, 0.35, 0.30, 0.25];
16
- let k = 0.01090;
17
- let cRR = 0.0036;
18
- var _speedCache = {};
19
- class Calculations {
20
- static calculateSpeed(m, power, slope) {
21
- var speed = undefined;
22
- let key = Math.round(m) * 1000000 + Math.round(power) * 1000 + Math.round(slope * 10);
23
- speed = _speedCache[key];
24
- if (speed !== undefined)
25
- return speed;
26
- speed = this.calculateSpeedUncached(m, power, slope);
27
- _speedCache[key] = speed;
28
- return speed;
3
+ exports.solveCubic = exports.IllegalArgumentException = void 0;
4
+ const g = 9.80665;
5
+ const rho = 1.2041;
6
+ const cwABike = {
7
+ race: 0.35,
8
+ triathlon: 0.29,
9
+ mountain: 0.57
10
+ };
11
+ const k = 0.01090;
12
+ const cRR = 0.0036;
13
+ class IllegalArgumentException extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = "IllegalArgumentException";
29
17
  }
30
- static calculateAccelSpeed(m, power, slope, speedPrev, t) {
31
- let vPrev = speedPrev / 3.6;
32
- let Pres = Calculations.calculatePower(m, vPrev, slope);
33
- var P = power - Pres;
34
- if (P > 0) {
35
- let a = Math.sqrt(P / (m * t));
36
- let v = vPrev + a * t;
37
- return v * 3.6;
38
- }
39
- else {
40
- P = P * -1;
41
- let a = Math.sqrt(P / (m * t));
42
- let v = vPrev - a * t;
43
- return v * 3.6;
44
- }
45
- }
46
- static calculateSpeedUncachedOld(m, power, slope) {
47
- let c = cTri;
48
- let cl = clTri;
49
- let cr = crX;
50
- let sl = Math.atan(slope / 100);
51
- if (slope < 0) {
52
- let crDyn = 0.1 * Math.cos(sl);
53
- cl = clUL;
54
- c = cUL;
55
- cr = (1 + crDyn) * cr;
56
- }
57
- if (slope < -2) {
58
- let crDyn = 0.1 * Math.cos(sl);
59
- cl = clOL;
60
- c = cOL;
61
- cr = (1 + crDyn) * cr;
62
- }
63
- let c1 = 1.0 / (1.0 - c);
64
- let a = m * g * (sl + cr) * c1;
65
- let b = cl / 2.0 * c1;
66
- let p = a / b;
67
- let q = -1.0 * power / b;
68
- var z = solveCubic(p, q);
69
- if (z.length > 0) {
70
- for (var i = 0; i < z.length; i++)
71
- if (z[i] > 0)
72
- return z[i] * 3.6;
73
- }
74
- return 0;
75
- }
76
- static calculateSpeedUncached(m, power, slope) {
18
+ }
19
+ exports.IllegalArgumentException = IllegalArgumentException;
20
+ class C {
21
+ static calculateSpeed(m, power, slope, props = {}) {
22
+ if (m === undefined || m === null || m < 0)
23
+ throw new IllegalArgumentException("m must be a positive number");
24
+ if (power === undefined || power === null || power < 0)
25
+ throw new IllegalArgumentException("power must be a positive number");
26
+ if (slope === undefined || slope === null)
27
+ slope = 0;
28
+ const _rho = props.rho || rho;
29
+ const _cRR = props.cRR || cRR;
30
+ const _cwA = props.cwA || cwABike[props.bikeType || 'race'] || cwABike.race;
77
31
  let sl = Math.atan(slope / 100);
78
- let c1 = 0.5 * rho * cwA(slope) + 2 * k;
79
- let c2 = (sl + cRR) * m * g;
32
+ let c1 = 0.5 * _rho * _cwA + 2 * k;
33
+ let c2 = (sl + _cRR) * m * g;
80
34
  let p = c2 / c1;
81
35
  let q = -1.0 * power / c1;
82
- var z = solveCubic(p, q);
83
- if (z.length > 0) {
84
- for (var i = 0; i < z.length; i++)
85
- if (z[i] > 0)
86
- return z[i] * 3.6;
36
+ var v = solveCubic(p, q).filter(value => value >= 0);
37
+ if (v.length === 1)
38
+ return v[0] * 3.6;
39
+ if (v.length > 1) {
40
+ if (props.previous) {
41
+ let speed = undefined;
42
+ let minDiff = undefined;
43
+ v.forEach(s => {
44
+ if (!minDiff) {
45
+ minDiff = Math.abs(s - props.previous);
46
+ speed = s;
47
+ return;
48
+ }
49
+ const diff = Math.abs(s - props.previous);
50
+ if (diff < minDiff) {
51
+ minDiff = diff;
52
+ speed = s;
53
+ }
54
+ });
55
+ return speed * 3.6;
56
+ }
57
+ for (var i = 0; i < v.length; i++)
58
+ if (v[i] > 0)
59
+ return v[i] * 3.6;
87
60
  }
88
61
  return 0;
89
62
  }
90
- static calculatePower(m, v, slope) {
63
+ static calculatePower(m, v, slope, props = {}) {
64
+ if (m === undefined || m === null || m < 0)
65
+ throw new IllegalArgumentException("m must be a positive number");
66
+ if (v === undefined || v === null || v < 0)
67
+ throw new IllegalArgumentException("v must be a positive number");
68
+ if (slope === undefined || slope === null)
69
+ slope = 0;
70
+ let _rho = props.rho || rho;
71
+ let _cRR = props.cRR || cRR;
72
+ let _cwA = props.cwA || cwABike[props.bikeType || 'race'] || cwABike.race;
91
73
  let sl = Math.sin(Math.atan(slope / 100));
92
- let P = (0.5 * rho * cwA(slope) + 2 * k) * Math.pow(v, 3.0) + (sl + cRR) * m * g * v;
74
+ let P = (0.5 * _rho * _cwA + 2 * k) * Math.pow(v, 3.0) + (sl + _cRR) * m * g * v;
93
75
  return P;
94
76
  }
95
- static calculateForce(m, v, slope) {
96
- let sl = Math.sin(Math.atan(slope / 100));
97
- let F = (0.5 * rho * cwA(slope) + 2 * k) * Math.pow(v, 3.0) + (sl + cRR) * m * g * v;
98
- return F;
99
- }
100
- static calculatePowerAccelaration(m, a, v) {
101
- let P = m * a * v;
102
- return P;
103
- }
104
- static calculatePowerResistance(m, v, slope) {
105
- let P = (0.5 * rho * cwA(slope) + 2 * k) * Math.pow(v, 3.0) + cRR * m * g * v;
106
- return P;
107
- }
108
- static crankPower(rpm, torque) {
109
- return torque * rpm * 2 * Math.PI / 60.0;
110
- }
111
- static crankTorque(rpm, power) {
112
- return power / (rpm * 2 * Math.PI / 60.0);
113
- }
114
- static crankRPM(power, torque) {
115
- return power * 60 / (2 * Math.PI * torque);
116
- }
117
77
  static calculateSpeedDaum(gear, rpm, bikeType) {
118
- if (bikeType === 0 || bikeType === undefined || bikeType === "race") {
78
+ if (bikeType === 0 || bikeType === undefined || bikeType === "race" || bikeType === 'triathlon') {
119
79
  let lengthRPM = 210;
120
80
  let gearRatio = 1.75 + (gear - 1) * 0.098767;
121
81
  let distRotation = lengthRPM * gearRatio;
@@ -130,18 +90,23 @@ class Calculations {
130
90
  return speed;
131
91
  }
132
92
  }
133
- }
134
- exports.default = Calculations;
135
- function cwA(slope) {
136
- let cw = cWAs[POS_TRIATHLON];
137
- if (slope <= -5)
138
- cw = cWAs[POS_BREMSGRIFF];
139
- else if (slope > -5 && slope < -1) {
140
- let pct = (slope + 5) / 4;
141
- cw = cWAs[POS_TRIATHLON] + pct * (cWAs[POS_BREMSGRIFF] - cWAs[POS_TRIATHLON]);
93
+ static calculateSpeedBike(gear, rpm, chain, cassette, props) {
94
+ if (chain.length !== 2 || cassette.length !== 2)
95
+ throw new IllegalArgumentException("chain and cassette must be an array of 2 numbers");
96
+ if (cassette[0] < 1 || cassette[1] < 1)
97
+ throw new IllegalArgumentException("cassette must be an array of 2 positive numbers");
98
+ const bikeProps = props || {};
99
+ const minGearRatio = chain[0] / cassette[1];
100
+ const maxGearRatio = chain[1] / cassette[0];
101
+ const numGears = bikeProps.numGears || 28;
102
+ const wheelCirc = bikeProps.wheelCirc || 2125;
103
+ const gearRatio = minGearRatio + (maxGearRatio - minGearRatio) * (gear - 1) / (numGears - 1);
104
+ let distRotation = wheelCirc * gearRatio / 1000;
105
+ let speed = rpm * distRotation * 60 / 1000;
106
+ return speed;
142
107
  }
143
- return cw;
144
108
  }
109
+ exports.default = C;
145
110
  function acosh(x) {
146
111
  return Math.log(x + Math.sqrt(x * x - 1.0));
147
112
  }
@@ -159,13 +124,13 @@ function solveCubic(p, q) {
159
124
  let D = Math.pow(q / 2.0, 2) + Math.pow(p / 3.0, 3);
160
125
  let R = Math.sign(q) * Math.sqrt(Math.abs(p) / 3.0);
161
126
  if (p === 0) {
162
- return [sqrtN(q, 3)];
127
+ return [sqrtN(-1 * q, 3)];
163
128
  }
164
129
  if (D === 0) {
165
130
  return [3 * q / p, -3 * q / (2 * p)];
166
131
  }
167
132
  if (D < 0 && p < 0) {
168
- var results = [];
133
+ const results = [];
169
134
  let phi = Math.acos(q / (2 * Math.pow(R, 3)));
170
135
  results[0] = -2 * R * Math.cos(phi / 3);
171
136
  results[1] = -2 * R * Math.cos(phi / 3 + 2 * Math.PI / 3);
@@ -173,16 +138,14 @@ function solveCubic(p, q) {
173
138
  return results;
174
139
  }
175
140
  if (D > 0 && p < 0) {
176
- let results = [];
141
+ const results = [];
177
142
  let phi = acosh(q / (2 * Math.pow(R, 3)));
178
143
  results[0] = -2 * R * Math.cosh(phi / 3);
179
144
  return results;
180
145
  }
181
- if (p > 0) {
182
- let results = [];
183
- let phi = asinh(q / (2 * Math.pow(R, 3)));
184
- results[0] = -2 * R * Math.sinh(phi / 3);
185
- return results;
186
- }
187
- return [];
146
+ const results = [];
147
+ let phi = asinh(q / (2 * Math.pow(R, 3)));
148
+ results[0] = -2 * R * Math.sinh(phi / 3);
149
+ return results;
188
150
  }
151
+ exports.solveCubic = solveCubic;
@@ -1,21 +1,37 @@
1
1
  import { EventLogger } from 'gd-eventlog';
2
- import Device from '../Device';
2
+ import CyclingMode from '../CyclingMode';
3
+ import DeviceAdapterBase, { Bike, DeviceAdapter } from '../Device';
3
4
  interface DaumAdapter {
4
5
  getCurrentBikeData(): Promise<any>;
5
6
  }
6
- export default class DaumAdapterBase extends Device implements DaumAdapter {
7
+ export default class DaumAdapterBase extends DeviceAdapterBase implements DeviceAdapter, DaumAdapter, Bike {
7
8
  bike: any;
8
9
  ignoreHrm: boolean;
9
10
  ignoreBike: boolean;
10
11
  ignorePower: boolean;
11
12
  distanceInternal: number;
12
13
  paused: boolean;
14
+ stopped: boolean;
13
15
  data: any;
14
16
  currentRequest: any;
15
17
  requests: Array<any>;
16
18
  iv: any;
17
19
  logger: EventLogger;
20
+ cyclingMode: CyclingMode;
21
+ userSettings: any;
22
+ bikeSettings: any;
23
+ tsPrevData: number;
24
+ adapterTime: number;
25
+ requestBusy: boolean;
26
+ updateBusy: boolean;
18
27
  constructor(props: any, bike: any);
28
+ setCyclingMode(mode: CyclingMode | string, settings?: any): void;
29
+ getSupportedCyclingModes(): Array<any>;
30
+ getCyclingMode(): CyclingMode;
31
+ getDefaultCyclingMode(): CyclingMode;
32
+ setUserSettings(userSettings: any): void;
33
+ setBikeSettings(bikeSettings: any): void;
34
+ getWeight(): number;
19
35
  getCurrentBikeData(): Promise<any>;
20
36
  getBike(): any;
21
37
  isBike(): boolean;
@@ -23,18 +39,25 @@ export default class DaumAdapterBase extends Device implements DaumAdapter {
23
39
  isHrm(): boolean;
24
40
  setIgnoreHrm(ignore: any): void;
25
41
  setIgnoreBike(ignore: any): void;
42
+ isStopped(): boolean;
26
43
  initData(): void;
44
+ start(props?: any): Promise<any>;
27
45
  startUpdatePull(): void;
28
46
  connect(): void;
29
47
  close(): any;
30
48
  logEvent(event: any): void;
31
- sendBikeUpdate(request: any): Promise<unknown>;
32
49
  stop(): Promise<boolean>;
33
50
  pause(): Promise<boolean>;
34
51
  resume(): Promise<boolean>;
35
- sendUpdate(data: any): Promise<void>;
52
+ sendUpdate(request: any): Promise<unknown>;
53
+ sendData(): void;
36
54
  update(): Promise<void>;
37
- updateData(data: any, bikeData: any): any;
38
- transformData(bikeData: any): any;
55
+ sendRequests(): Promise<void>;
56
+ bikeSync(): Promise<void>;
57
+ updateData(prev: any, bikeData: any): void;
58
+ transformData(): void;
59
+ sendRequest(request: any): Promise<any>;
60
+ refreshRequests(): void;
61
+ processClientRequest(request: any): Promise<unknown>;
39
62
  }
40
63
  export {};