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.
- package/lib/CyclingMode.d.ts +72 -0
- package/lib/CyclingMode.js +66 -0
- package/lib/Device.d.ts +48 -10
- package/lib/Device.js +9 -8
- package/lib/DeviceProtocol.d.ts +40 -12
- package/lib/DeviceProtocol.js +16 -16
- package/lib/DeviceRegistry.d.ts +4 -4
- package/lib/DeviceRegistry.js +10 -10
- package/lib/DeviceSupport.d.ts +4 -3
- package/lib/DeviceSupport.js +32 -8
- package/lib/ant/AntAdapter.d.ts +7 -3
- package/lib/ant/AntAdapter.js +23 -3
- package/lib/ant/AntScanner.d.ts +15 -6
- package/lib/ant/AntScanner.js +372 -128
- package/lib/ant/antfe/AntFEAdapter.d.ts +1 -1
- package/lib/ant/antfe/AntFEAdapter.js +191 -92
- package/lib/ant/anthrm/AntHrmAdapter.d.ts +3 -1
- package/lib/ant/anthrm/AntHrmAdapter.js +70 -19
- package/lib/ant/utils.js +2 -1
- package/lib/calculations.d.ts +12 -13
- package/lib/calculations.js +88 -125
- package/lib/daum/DaumAdapter.d.ts +29 -6
- package/lib/daum/DaumAdapter.js +219 -96
- package/lib/daum/ERGCyclingMode.d.ts +28 -0
- package/lib/daum/ERGCyclingMode.js +207 -0
- package/lib/daum/PowerMeterCyclingMode.d.ts +18 -0
- package/lib/daum/PowerMeterCyclingMode.js +79 -0
- package/lib/daum/SmartTrainerCyclingMode.d.ts +41 -0
- package/lib/daum/SmartTrainerCyclingMode.js +344 -0
- package/lib/daum/classic/DaumClassicAdapter.d.ts +3 -1
- package/lib/daum/classic/DaumClassicAdapter.js +46 -32
- package/lib/daum/classic/DaumClassicCyclingMode.d.ts +13 -0
- package/lib/daum/classic/DaumClassicCyclingMode.js +98 -0
- package/lib/daum/classic/DaumClassicProtocol.d.ts +5 -3
- package/lib/daum/classic/DaumClassicProtocol.js +47 -8
- package/lib/daum/classic/ERGCyclingMode.d.ts +23 -0
- package/lib/daum/classic/ERGCyclingMode.js +171 -0
- package/lib/daum/classic/bike.d.ts +41 -37
- package/lib/daum/classic/bike.js +86 -53
- package/lib/daum/classic/utils.d.ts +3 -3
- package/lib/daum/classic/utils.js +18 -10
- package/lib/daum/indoorbike.d.ts +2 -1
- package/lib/daum/indoorbike.js +23 -21
- package/lib/daum/premium/DaumPremiumAdapter.d.ts +2 -2
- package/lib/daum/premium/DaumPremiumAdapter.js +30 -20
- package/lib/daum/premium/DaumPremiumProtocol.d.ts +11 -2
- package/lib/daum/premium/DaumPremiumProtocol.js +57 -10
- package/lib/daum/premium/bike.d.ts +63 -52
- package/lib/daum/premium/bike.js +254 -207
- package/lib/daum/premium/tcpserial.d.ts +18 -14
- package/lib/daum/premium/tcpserial.js +44 -20
- package/lib/daum/premium/utils.d.ts +2 -2
- package/lib/simulator/Simulator.d.ts +13 -7
- package/lib/simulator/Simulator.js +62 -21
- package/lib/utils.d.ts +3 -1
- package/lib/utils.js +39 -18
- package/package.json +12 -11
- package/lib/ant/AntScanner.unit.tests.d.ts +0 -1
- package/lib/ant/AntScanner.unit.tests.js +0 -25
- package/lib/ant/antfe/AntFEProcessor.d.ts +0 -40
- package/lib/ant/antfe/AntFEProcessor.js +0 -238
- package/lib/ant/antfe/AntHrmProtocol.d.ts +0 -9
- package/lib/ant/antfe/AntHrmProtocol.js +0 -30
- package/lib/ant/antfe/FEDevice.d.ts +0 -1
- package/lib/ant/antfe/FEDevice.js +0 -7
- package/lib/ant/antfe/bike.d.ts +0 -47
- package/lib/ant/antfe/bike.js +0 -602
- package/lib/ant/anthrm/anthrm.d.ts +0 -33
- package/lib/ant/anthrm/anthrm.js +0 -523
- package/lib/simulator/Simulator.unit.tests.d.ts +0 -1
- package/lib/simulator/Simulator.unit.tests.js +0 -79
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const gd_eventlog_1 = require("gd-eventlog");
|
|
7
|
+
const CyclingMode_1 = require("../../CyclingMode");
|
|
8
|
+
const SmartTrainerCyclingMode_1 = __importDefault(require("../SmartTrainerCyclingMode"));
|
|
9
|
+
const config = {
|
|
10
|
+
name: "Daum Classic",
|
|
11
|
+
description: "The device calculates speed and power based on slope. Incyclist will not modify any values recived from the device\nThis mode will not respect maximum power and/or workout limits",
|
|
12
|
+
properties: [
|
|
13
|
+
{ key: 'bikeType', name: 'Bike Type', description: '', type: CyclingMode_1.CyclingModeProperyType.SingleSelect, options: ['Race', 'Mountain'], default: 'Race' },
|
|
14
|
+
]
|
|
15
|
+
};
|
|
16
|
+
class DaumClassicCyclingMode extends SmartTrainerCyclingMode_1.default {
|
|
17
|
+
constructor(adapter, props) {
|
|
18
|
+
super(adapter, props);
|
|
19
|
+
this.logger = adapter ? adapter.logger : undefined;
|
|
20
|
+
if (!this.logger)
|
|
21
|
+
this.logger = new gd_eventlog_1.EventLogger('DaumClassic');
|
|
22
|
+
}
|
|
23
|
+
getName() {
|
|
24
|
+
return config.name;
|
|
25
|
+
}
|
|
26
|
+
getDescription() {
|
|
27
|
+
return config.description;
|
|
28
|
+
}
|
|
29
|
+
getProperties() {
|
|
30
|
+
return config.properties;
|
|
31
|
+
}
|
|
32
|
+
getProperty(name) {
|
|
33
|
+
return config.properties.find(p => p.name === name);
|
|
34
|
+
}
|
|
35
|
+
getBikeInitRequest() {
|
|
36
|
+
return { slope: 0 };
|
|
37
|
+
}
|
|
38
|
+
sendBikeUpdate(request) {
|
|
39
|
+
const getData = () => {
|
|
40
|
+
if (!this.data)
|
|
41
|
+
return {};
|
|
42
|
+
const { gear, pedalRpm, slope, power, speed } = this.data;
|
|
43
|
+
return { gear, pedalRpm, slope, power, speed };
|
|
44
|
+
};
|
|
45
|
+
const event = Object.assign({}, this.event);
|
|
46
|
+
if (this.data === undefined)
|
|
47
|
+
event.noData = true;
|
|
48
|
+
if (request.slope !== undefined && (event.noData || Math.abs(request.slope - this.data.slope) >= 0.1))
|
|
49
|
+
event.slopeUpdate = true;
|
|
50
|
+
if (this.prevRequest === undefined)
|
|
51
|
+
event.initialCall = true;
|
|
52
|
+
this.logger.logEvent({ message: "processing update request", request, prev: this.prevRequest, data: getData(), event });
|
|
53
|
+
let newRequest = {};
|
|
54
|
+
if (request.slope === undefined && request.refresh && this.prevRequest) {
|
|
55
|
+
return this.prevRequest;
|
|
56
|
+
}
|
|
57
|
+
if (request.slope !== undefined) {
|
|
58
|
+
newRequest.slope = parseFloat(request.slope.toFixed(1));
|
|
59
|
+
this.data.slope = newRequest.slope;
|
|
60
|
+
}
|
|
61
|
+
this.prevRequest = JSON.parse(JSON.stringify(newRequest));
|
|
62
|
+
return newRequest;
|
|
63
|
+
}
|
|
64
|
+
updateData(data) {
|
|
65
|
+
try {
|
|
66
|
+
const prevData = this.data || {};
|
|
67
|
+
const prevRequest = this.prevRequest || {};
|
|
68
|
+
const bikeData = JSON.parse(JSON.stringify(data));
|
|
69
|
+
let power = bikeData.power || 0;
|
|
70
|
+
let slope = (prevData.slope !== undefined ? prevData.slope : prevRequest.slope || 0);
|
|
71
|
+
let speed = bikeData.speed || 0;
|
|
72
|
+
let distanceInternal = prevData.distanceInternal || 0;
|
|
73
|
+
let ts = Date.now();
|
|
74
|
+
if (bikeData.pedalRpm === 0 || bikeData.isPedalling === false) {
|
|
75
|
+
speed = 0;
|
|
76
|
+
power = 0;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
|
|
80
|
+
let v = speed / 3.6;
|
|
81
|
+
distanceInternal += Math.round(v * duration);
|
|
82
|
+
}
|
|
83
|
+
data.speed = parseFloat(speed.toFixed(1));
|
|
84
|
+
data.power = Math.round(power);
|
|
85
|
+
data.slope = slope;
|
|
86
|
+
data.distanceInternal = distanceInternal;
|
|
87
|
+
data.distance = Math.round(distanceInternal / 100);
|
|
88
|
+
this.logger.logEvent({ message: "updateData result", data, bikeData, prevRequest: this.prevRequest || {}, prevSpeed: prevData.speed, event: this.event });
|
|
89
|
+
this.data = JSON.parse(JSON.stringify(data));
|
|
90
|
+
this.prevUpdateTS = ts;
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
this.logger.logEvent({ message: 'error', fn: 'updateData()', error: err.message || err });
|
|
94
|
+
}
|
|
95
|
+
return data;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.default = DaumClassicCyclingMode;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import DeviceProtocolBase, { ScanProps, DeviceProtocol, DeviceSettings } from '../../DeviceProtocol';
|
|
2
|
+
import Adapter from './DaumClassicAdapter';
|
|
2
3
|
import { EventLogger } from 'gd-eventlog';
|
|
3
4
|
export interface DaumClassicProtocolState {
|
|
4
5
|
activeScans: Array<any>;
|
|
@@ -8,12 +9,13 @@ export interface DaumClassicProtocolState {
|
|
|
8
9
|
export interface DaumClassicScanProps extends ScanProps {
|
|
9
10
|
port: string;
|
|
10
11
|
}
|
|
11
|
-
export default class DaumClassicProtocol extends DeviceProtocol {
|
|
12
|
+
export default class DaumClassicProtocol extends DeviceProtocolBase implements DeviceProtocol {
|
|
12
13
|
logger: EventLogger;
|
|
13
14
|
state: DaumClassicProtocolState;
|
|
14
15
|
constructor();
|
|
16
|
+
add(settings: DeviceSettings): Adapter;
|
|
15
17
|
getName(): string;
|
|
16
|
-
getInterfaces(): string
|
|
18
|
+
getInterfaces(): Array<string>;
|
|
17
19
|
isBike(): boolean;
|
|
18
20
|
isHrm(): boolean;
|
|
19
21
|
isPower(): boolean;
|
|
@@ -1,4 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
2
21
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
22
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
23
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -8,12 +27,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
27
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
28
|
});
|
|
10
29
|
};
|
|
30
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
|
+
};
|
|
11
33
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const DeviceProtocol_1 = require("../../DeviceProtocol");
|
|
13
|
-
const DeviceRegistry_1 = require("../../DeviceRegistry");
|
|
14
|
-
const bike_1 = require("./bike");
|
|
15
|
-
const DaumClassicAdapter_1 = require("./DaumClassicAdapter");
|
|
34
|
+
const DeviceProtocol_1 = __importStar(require("../../DeviceProtocol"));
|
|
35
|
+
const DeviceRegistry_1 = __importDefault(require("../../DeviceRegistry"));
|
|
36
|
+
const bike_1 = __importDefault(require("./bike"));
|
|
37
|
+
const DaumClassicAdapter_1 = __importDefault(require("./DaumClassicAdapter"));
|
|
16
38
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
39
|
+
const DaumClassicAdapter_2 = __importDefault(require("./DaumClassicAdapter"));
|
|
17
40
|
const PROTOCOL_NAME = "Daum Classic";
|
|
18
41
|
const DefaultState = {
|
|
19
42
|
activeScans: [],
|
|
@@ -27,6 +50,15 @@ class DaumClassicProtocol extends DeviceProtocol_1.default {
|
|
|
27
50
|
this.logger = new gd_eventlog_1.EventLogger('DaumClassic');
|
|
28
51
|
this.devices = [];
|
|
29
52
|
}
|
|
53
|
+
add(settings) {
|
|
54
|
+
this.logger.logEvent({ message: 'adding device', settings });
|
|
55
|
+
const { port } = settings;
|
|
56
|
+
bike_1.default.setSerialPort(DeviceProtocol_1.default.getSerialPort());
|
|
57
|
+
const bike = new bike_1.default({ port });
|
|
58
|
+
let device = new DaumClassicAdapter_2.default(this, bike);
|
|
59
|
+
this.devices.push(device);
|
|
60
|
+
return device;
|
|
61
|
+
}
|
|
30
62
|
getName() {
|
|
31
63
|
return PROTOCOL_NAME;
|
|
32
64
|
}
|
|
@@ -48,7 +80,7 @@ class DaumClassicProtocol extends DeviceProtocol_1.default {
|
|
|
48
80
|
this.state.scanning = true;
|
|
49
81
|
let device = this.addDevice(props, props.port);
|
|
50
82
|
if (device) {
|
|
51
|
-
const iv = setInterval(() => { this.scanCommand(device, props); },
|
|
83
|
+
const iv = setInterval(() => { this.scanCommand(device, props); }, 1000);
|
|
52
84
|
this.state.activeScans.push({ iv, device, props });
|
|
53
85
|
}
|
|
54
86
|
}
|
|
@@ -60,7 +92,8 @@ class DaumClassicProtocol extends DeviceProtocol_1.default {
|
|
|
60
92
|
this.devices.push(device);
|
|
61
93
|
}
|
|
62
94
|
else {
|
|
63
|
-
const
|
|
95
|
+
const devices = this.devices;
|
|
96
|
+
const idx = devices.findIndex(d => d.getBike().getPort() === portName);
|
|
64
97
|
if (idx === -1) {
|
|
65
98
|
const bike = new bike_1.default(opts);
|
|
66
99
|
device = new DaumClassicAdapter_1.default(this, bike);
|
|
@@ -123,7 +156,7 @@ class DaumClassicProtocol extends DeviceProtocol_1.default {
|
|
|
123
156
|
return;
|
|
124
157
|
scan.scanning = true;
|
|
125
158
|
return device.check()
|
|
126
|
-
.then(() => {
|
|
159
|
+
.then(() => __awaiter(this, void 0, void 0, function* () {
|
|
127
160
|
if (this.state.stopScanning)
|
|
128
161
|
return;
|
|
129
162
|
const { onDeviceFound, onScanFinished, id } = opts;
|
|
@@ -133,10 +166,16 @@ class DaumClassicProtocol extends DeviceProtocol_1.default {
|
|
|
133
166
|
if (onScanFinished) {
|
|
134
167
|
onScanFinished(id);
|
|
135
168
|
}
|
|
169
|
+
try {
|
|
170
|
+
yield device.getBike().saveClose();
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
this.logger.logEvent({ message: 'scanCommand warning: Could not close port', error: err.message });
|
|
174
|
+
}
|
|
136
175
|
clearInterval(scan.iv);
|
|
137
176
|
scan.iv = undefined;
|
|
138
177
|
scan.scanning = false;
|
|
139
|
-
})
|
|
178
|
+
}))
|
|
140
179
|
.catch(() => {
|
|
141
180
|
scan.scanning = false;
|
|
142
181
|
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { EventLogger } from "gd-eventlog";
|
|
2
|
+
import CyclingMode, { CyclingModeProperty, IncyclistBikeData, Settings, UpdateRequest } from "../../CyclingMode";
|
|
3
|
+
import DaumClassicAdapter from "./DaumClassicAdapter";
|
|
4
|
+
export default class ERGCyclingMode implements CyclingMode {
|
|
5
|
+
adapter: DaumClassicAdapter;
|
|
6
|
+
logger: EventLogger;
|
|
7
|
+
prevData: IncyclistBikeData;
|
|
8
|
+
prevRequest: UpdateRequest;
|
|
9
|
+
prevUpdateTS: number;
|
|
10
|
+
hasBikeUpdate: boolean;
|
|
11
|
+
settings: Settings;
|
|
12
|
+
constructor(adapter: DaumClassicAdapter, props?: Settings);
|
|
13
|
+
setAdapter(adapter: DaumClassicAdapter): void;
|
|
14
|
+
getName(): string;
|
|
15
|
+
getDescription(): string;
|
|
16
|
+
getProperties(): CyclingModeProperty[];
|
|
17
|
+
getProperty(name: string): CyclingModeProperty;
|
|
18
|
+
setSetting(name: string, value: any): void;
|
|
19
|
+
getSetting(name: string): any;
|
|
20
|
+
sendBikeUpdate(request: UpdateRequest): UpdateRequest;
|
|
21
|
+
updateData(data: IncyclistBikeData): IncyclistBikeData;
|
|
22
|
+
caclulateTargetPower(request: any, updateMode?: boolean): any;
|
|
23
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const gd_eventlog_1 = require("gd-eventlog");
|
|
7
|
+
const CyclingMode_1 = require("../../CyclingMode");
|
|
8
|
+
const calculations_1 = __importDefault(require("../../calculations"));
|
|
9
|
+
const settings = {
|
|
10
|
+
name: "ERG",
|
|
11
|
+
description: "Ergometer mode:\n Keeps power constant. Calculates speed based on power and slope",
|
|
12
|
+
properties: [
|
|
13
|
+
{ name: 'Starting Power', description: 'Starting power in watts', type: CyclingMode_1.CyclingModeProperyType.Integer, default: 50 }
|
|
14
|
+
]
|
|
15
|
+
};
|
|
16
|
+
class ERGCyclingMode {
|
|
17
|
+
constructor(adapter, props) {
|
|
18
|
+
this.prevUpdateTS = 0;
|
|
19
|
+
this.hasBikeUpdate = false;
|
|
20
|
+
this.settings = {};
|
|
21
|
+
this.setAdapter(adapter);
|
|
22
|
+
this.logger = new gd_eventlog_1.EventLogger('ERGMode');
|
|
23
|
+
}
|
|
24
|
+
setAdapter(adapter) {
|
|
25
|
+
this.adapter = adapter;
|
|
26
|
+
}
|
|
27
|
+
getName() {
|
|
28
|
+
return settings.name;
|
|
29
|
+
}
|
|
30
|
+
getDescription() {
|
|
31
|
+
return settings.description;
|
|
32
|
+
}
|
|
33
|
+
getProperties() {
|
|
34
|
+
return settings.properties;
|
|
35
|
+
}
|
|
36
|
+
getProperty(name) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
setSetting(name, value) {
|
|
40
|
+
this.settings[name] = value;
|
|
41
|
+
}
|
|
42
|
+
getSetting(name) {
|
|
43
|
+
const res = this.settings[name];
|
|
44
|
+
if (res)
|
|
45
|
+
return res;
|
|
46
|
+
const prop = this.getProperty(name);
|
|
47
|
+
if (prop && prop.default)
|
|
48
|
+
return prop.default;
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
sendBikeUpdate(request) {
|
|
52
|
+
this.logger.logEvent({ message: "setValues request", request, prev: this.prevRequest });
|
|
53
|
+
try {
|
|
54
|
+
if (!request || request.reset || Object.keys(request).length === 0) {
|
|
55
|
+
this.prevRequest = undefined;
|
|
56
|
+
return request;
|
|
57
|
+
}
|
|
58
|
+
if (request.refresh) {
|
|
59
|
+
if (this.prevRequest !== undefined && !this.hasBikeUpdate) {
|
|
60
|
+
request.slope = this.prevRequest.slope;
|
|
61
|
+
request.targetPower = this.prevRequest.targetPower;
|
|
62
|
+
request.minPower = this.prevRequest.minPower;
|
|
63
|
+
request.maxPower = this.prevRequest.maxPower;
|
|
64
|
+
return request;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
return this.caclulateTargetPower(request);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const isSlopeUpdate = request.slope !== undefined && Object.keys(request).length === 1;
|
|
71
|
+
if (request.targetPower !== undefined) {
|
|
72
|
+
delete request.slope;
|
|
73
|
+
}
|
|
74
|
+
else if (request.maxPower !== undefined && request.minPower !== undefined && request.maxPower === request.minPower) {
|
|
75
|
+
request.targetPower = request.maxPower;
|
|
76
|
+
delete request.slope;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
if (request.slope !== undefined || (this.prevData !== undefined && this.prevData.slope !== undefined)) {
|
|
80
|
+
request = this.caclulateTargetPower(request, false);
|
|
81
|
+
}
|
|
82
|
+
if (request.maxPower !== undefined) {
|
|
83
|
+
if (request.targetPower !== undefined && request.targetPower > request.maxPower) {
|
|
84
|
+
request.targetPower = request.maxPower;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (request.minPower !== undefined) {
|
|
88
|
+
if (request.targetPower !== undefined && request.targetPower < request.minPower) {
|
|
89
|
+
request.targetPower = request.minPower;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (!isSlopeUpdate)
|
|
94
|
+
this.prevRequest = JSON.parse(JSON.stringify(request));
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
this.logger.logEvent({ message: "setValues Exception", error: err.message, stack: err.stack });
|
|
98
|
+
}
|
|
99
|
+
this.logger.logEvent({ message: "setValues result", data: request });
|
|
100
|
+
this.hasBikeUpdate = false;
|
|
101
|
+
return request;
|
|
102
|
+
}
|
|
103
|
+
updateData(data) {
|
|
104
|
+
this.logger.logEvent({ message: "updateData", data });
|
|
105
|
+
const getSlope = () => {
|
|
106
|
+
if (data.slope)
|
|
107
|
+
return data.slope;
|
|
108
|
+
if (this.prevData && this.prevData.slope)
|
|
109
|
+
return this.prevData.slope;
|
|
110
|
+
if (this.prevRequest && this.prevRequest.slope)
|
|
111
|
+
return this.prevRequest.slope;
|
|
112
|
+
return 0;
|
|
113
|
+
};
|
|
114
|
+
try {
|
|
115
|
+
const prevData = this.prevData || {};
|
|
116
|
+
let rpm = data.pedalRpm || 0;
|
|
117
|
+
let gear = data.gear || 0;
|
|
118
|
+
let power = data.power || 0;
|
|
119
|
+
let slope = getSlope();
|
|
120
|
+
let speed = data.speed || 0;
|
|
121
|
+
let m = this.adapter.getWeight();
|
|
122
|
+
let distanceInternal = prevData.distanceInternal || 0;
|
|
123
|
+
let distance = Math.round(distanceInternal / 100);
|
|
124
|
+
let ts = Date.now();
|
|
125
|
+
let duration = this.prevUpdateTS === 0 ? 0 : ((ts - this.prevUpdateTS) / 1000);
|
|
126
|
+
if (rpm === 0 || data.isPedalling === false) {
|
|
127
|
+
speed = 0;
|
|
128
|
+
power = 0;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
speed = calculations_1.default.calculateSpeed(m, power, slope);
|
|
132
|
+
let v = speed / 3.6;
|
|
133
|
+
distanceInternal += Math.round(v * duration);
|
|
134
|
+
distance = Math.round(distanceInternal / 100);
|
|
135
|
+
}
|
|
136
|
+
data.speed = parseFloat(speed.toFixed(1));
|
|
137
|
+
data.power = Math.round(power);
|
|
138
|
+
data.distanceInternal = Math.round(distanceInternal);
|
|
139
|
+
data.distance = distance;
|
|
140
|
+
data.slope = slope;
|
|
141
|
+
data.pedalRpm = rpm;
|
|
142
|
+
if (this.prevData === undefined || gear !== prevData.gear || rpm !== prevData.pedalRpm) {
|
|
143
|
+
this.hasBikeUpdate = true;
|
|
144
|
+
}
|
|
145
|
+
this.prevData = data;
|
|
146
|
+
this.prevUpdateTS = ts;
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
this.logger.logEvent({ message: 'error', fn: 'updateData()', error: err.message || err });
|
|
150
|
+
}
|
|
151
|
+
this.logger.logEvent({ message: "updateData result", data });
|
|
152
|
+
return data;
|
|
153
|
+
}
|
|
154
|
+
caclulateTargetPower(request, updateMode = true) {
|
|
155
|
+
const bikeType = 'race';
|
|
156
|
+
const defaultPower = this.getSetting('Starting Power') || 50;
|
|
157
|
+
const m = this.adapter.getWeight();
|
|
158
|
+
const prevData = this.prevData || {};
|
|
159
|
+
if (prevData.pedalRpm !== undefined && prevData.gear !== undefined && (!updateMode || prevData.pedalRpm !== 0)) {
|
|
160
|
+
var speed = calculations_1.default.calculateSpeedDaum(prevData.gear, prevData.pedalRpm, bikeType);
|
|
161
|
+
var power = calculations_1.default.calculatePower(m, speed / 3.6, 0);
|
|
162
|
+
request.targetPower = power;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
request.targetPower = request.targetPower || defaultPower;
|
|
166
|
+
}
|
|
167
|
+
delete request.slope;
|
|
168
|
+
return request;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.default = ERGCyclingMode;
|
|
@@ -1,59 +1,63 @@
|
|
|
1
|
+
import { EventLogger } from 'gd-eventlog';
|
|
2
|
+
import { Queue } from '../../utils';
|
|
3
|
+
declare type SuccessCallbackFn = (data: any) => void;
|
|
4
|
+
declare type ErrorCallbackFn = (status: number, error: any) => void;
|
|
5
|
+
interface CommandInstructions {
|
|
6
|
+
logStr: string;
|
|
7
|
+
payload: Array<number>;
|
|
8
|
+
expected: number;
|
|
9
|
+
callback: SuccessCallbackFn;
|
|
10
|
+
callbackErr: ErrorCallbackFn;
|
|
11
|
+
options?: any;
|
|
12
|
+
}
|
|
1
13
|
export default class Daum8008 {
|
|
2
|
-
static setSerialPort(spClass: any): void;
|
|
3
|
-
static getClassName(): string;
|
|
4
|
-
constructor(opts?: {});
|
|
5
14
|
logger: EventLogger;
|
|
6
|
-
portName:
|
|
15
|
+
portName: string;
|
|
7
16
|
settings: any;
|
|
8
|
-
bikeData:
|
|
9
|
-
userWeight: number;
|
|
10
|
-
bikeWeight: number;
|
|
11
|
-
maxPower: number;
|
|
12
|
-
};
|
|
13
|
-
processor: IndoorBikeProcessor;
|
|
17
|
+
bikeData: any;
|
|
14
18
|
sp: any;
|
|
15
|
-
error:
|
|
19
|
+
error: Error;
|
|
16
20
|
opening: boolean;
|
|
17
21
|
connected: boolean;
|
|
18
22
|
closing: boolean;
|
|
19
23
|
closed: boolean;
|
|
20
24
|
cmdBusy: boolean;
|
|
21
|
-
queue: Queue<
|
|
25
|
+
queue: Queue<CommandInstructions>;
|
|
26
|
+
bikeCmdWorker: any;
|
|
27
|
+
cmdStart: number;
|
|
28
|
+
cmdCurrent: any;
|
|
29
|
+
constructor(opts?: any);
|
|
30
|
+
static setSerialPort(spClass: any): void;
|
|
31
|
+
static getClassName(): string;
|
|
22
32
|
getType(): string;
|
|
23
|
-
getPort():
|
|
33
|
+
getPort(): string;
|
|
24
34
|
isConnected(): boolean;
|
|
25
35
|
setUser(user: any, callback: any): void;
|
|
26
|
-
getUserWeight():
|
|
36
|
+
getUserWeight(): number;
|
|
27
37
|
getBikeWeight(): any;
|
|
28
38
|
connect(): void;
|
|
29
|
-
|
|
30
|
-
saveConnect(): Promise<any>;
|
|
39
|
+
saveConnect(): Promise<unknown>;
|
|
31
40
|
close(): void;
|
|
32
|
-
|
|
33
|
-
saveClose(): Promise<any>;
|
|
41
|
+
saveClose(): Promise<unknown>;
|
|
34
42
|
onPortOpen(): void;
|
|
35
|
-
cmdStart: number;
|
|
36
43
|
onPortClose(): void;
|
|
37
44
|
onPortError(err: any): void;
|
|
38
45
|
startWorker(): void;
|
|
39
46
|
sendDaum8008CommandfromQueue(): any;
|
|
40
|
-
|
|
41
|
-
sendDaum8008Command(logStr: any, payload: any, expected: any, callback: any, callbackErr: any, options: any): void;
|
|
47
|
+
sendDaum8008Command(logStr: any, payload: any, expected: any, callback?: any, callbackErr?: any, options?: any): void;
|
|
42
48
|
send(cmdInfo: any): void;
|
|
43
|
-
checkCockpit(bikeNo?: number): Promise<
|
|
44
|
-
getAddress(): Promise<
|
|
45
|
-
getVersion(bikeNo?: number): Promise<
|
|
46
|
-
resetDevice(bikeNo?: number): Promise<
|
|
47
|
-
startProg(bikeNo?: number): Promise<
|
|
48
|
-
stopProg(bikeNo?: number): Promise<
|
|
49
|
-
setProg(progNo?: number, bikeNo?: number): Promise<
|
|
50
|
-
setBikeType(bikeType: any, bikeNo?: number): Promise<
|
|
51
|
-
setPerson(user?:
|
|
52
|
-
runData(bikeNo?: number): Promise<
|
|
53
|
-
setGear(gear: any, bikeNo?: number): Promise<
|
|
54
|
-
setPower(power: any, bikeNo?: number): Promise<
|
|
55
|
-
setSlope(slope: any, bikeNo?: number): Promise<
|
|
49
|
+
checkCockpit(bikeNo?: number): Promise<unknown>;
|
|
50
|
+
getAddress(): Promise<unknown>;
|
|
51
|
+
getVersion(bikeNo?: number): Promise<unknown>;
|
|
52
|
+
resetDevice(bikeNo?: number): Promise<unknown>;
|
|
53
|
+
startProg(bikeNo?: number): Promise<unknown>;
|
|
54
|
+
stopProg(bikeNo?: number): Promise<unknown>;
|
|
55
|
+
setProg(progNo?: number, bikeNo?: number): Promise<unknown>;
|
|
56
|
+
setBikeType(bikeType: any, bikeNo?: number): Promise<unknown>;
|
|
57
|
+
setPerson(user?: any, bikeNo?: number): Promise<unknown>;
|
|
58
|
+
runData(bikeNo?: number): Promise<unknown>;
|
|
59
|
+
setGear(gear: any, bikeNo?: number): Promise<unknown>;
|
|
60
|
+
setPower(power: any, bikeNo?: number): Promise<unknown>;
|
|
61
|
+
setSlope(slope: any, bikeNo?: number): Promise<unknown>;
|
|
56
62
|
}
|
|
57
|
-
|
|
58
|
-
import IndoorBikeProcessor from "../indoorbike.js";
|
|
59
|
-
import { Queue } from "../../utils.js";
|
|
63
|
+
export {};
|