incyclist-devices 1.4.15 → 1.4.18
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.js +0 -1
- package/lib/Device.js +0 -1
- package/lib/DeviceProtocol.js +0 -1
- package/lib/DeviceSupport.js +8 -21
- package/lib/ant/AntAdapter.js +0 -1
- package/lib/ant/AntScanner.js +7 -20
- package/lib/ant/antfe/AntFEAdapter.js +7 -7
- package/lib/ant/anthrm/AntHrmAdapter.js +1 -1
- package/lib/ant/utils.js +1 -3
- package/lib/calculations.js +0 -1
- package/lib/daum/DaumAdapter.js +13 -25
- package/lib/daum/SmartTrainerCyclingMode.js +0 -1
- package/lib/daum/classic/DaumClassicAdapter.js +1 -1
- package/lib/daum/classic/DaumClassicProtocol.js +7 -19
- package/lib/daum/classic/bike.js +26 -26
- package/lib/daum/classic/utils.js +0 -1
- package/lib/daum/constants.js +0 -1
- package/lib/daum/premium/DaumPremiumAdapter.js +1 -1
- package/lib/daum/premium/DaumPremiumProtocol.js +7 -19
- package/lib/daum/premium/bike.js +17 -18
- package/lib/daum/premium/utils.js +0 -1
- package/lib/kettler/comms.d.ts +1 -0
- package/lib/kettler/comms.js +30 -7
- package/lib/kettler/ergo-racer/adapter.js +21 -26
- package/lib/kettler/ergo-racer/protocol.js +7 -19
- package/lib/simulator/Simulator.js +2 -15
- package/lib/types/route.js +0 -1
- package/lib/types/user.js +0 -1
- package/lib/utils.js +1 -3
- package/package.json +1 -1
package/lib/CyclingMode.js
CHANGED
package/lib/Device.js
CHANGED
package/lib/DeviceProtocol.js
CHANGED
package/lib/DeviceSupport.js
CHANGED
|
@@ -1,43 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
});
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
14
5
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
6
|
if (mod && mod.__esModule) return mod;
|
|
16
7
|
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (
|
|
18
|
-
|
|
8
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
9
|
+
result["default"] = mod;
|
|
19
10
|
return result;
|
|
20
11
|
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.CyclingModeProperyType = exports.AntScanner = exports.Protocols = exports.Device = exports.INTERFACE = exports.DeviceRegistry = exports.DeviceProtocolBase = void 0;
|
|
26
13
|
const DeviceRegistry_1 = __importDefault(require("./DeviceRegistry"));
|
|
27
14
|
exports.DeviceRegistry = DeviceRegistry_1.default;
|
|
28
15
|
const Device_1 = __importDefault(require("./Device"));
|
|
29
16
|
exports.Device = Device_1.default;
|
|
30
17
|
const DeviceProtocol_1 = __importStar(require("./DeviceProtocol"));
|
|
31
18
|
exports.DeviceProtocolBase = DeviceProtocol_1.default;
|
|
32
|
-
|
|
19
|
+
exports.INTERFACE = DeviceProtocol_1.INTERFACE;
|
|
33
20
|
const Simulator_1 = __importDefault(require("./simulator/Simulator"));
|
|
34
21
|
const DaumPremiumProtocol_1 = __importDefault(require("./daum/premium/DaumPremiumProtocol"));
|
|
35
22
|
const DaumClassicProtocol_1 = __importDefault(require("./daum/classic/DaumClassicProtocol"));
|
|
36
23
|
const protocol_1 = __importDefault(require("./kettler/ergo-racer/protocol"));
|
|
37
24
|
const AntScanner_1 = require("./ant/AntScanner");
|
|
38
|
-
|
|
25
|
+
exports.AntScanner = AntScanner_1.AntScanner;
|
|
39
26
|
const CyclingMode_1 = require("./CyclingMode");
|
|
40
|
-
|
|
27
|
+
exports.CyclingModeProperyType = CyclingMode_1.CyclingModeProperyType;
|
|
41
28
|
const Protocols = {
|
|
42
29
|
SimulatorProtocol: Simulator_1.default,
|
|
43
30
|
DaumClassicProtocol: DaumClassicProtocol_1.default,
|
package/lib/ant/AntAdapter.js
CHANGED
|
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.DEFAULT_UPDATE_FREQUENCY = void 0;
|
|
7
6
|
const Device_1 = __importDefault(require("../Device"));
|
|
8
7
|
exports.DEFAULT_UPDATE_FREQUENCY = 1000;
|
|
9
8
|
class AntAdapter extends Device_1.default {
|
package/lib/ant/AntScanner.js
CHANGED
|
@@ -1,23 +1,4 @@
|
|
|
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
|
-
};
|
|
21
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -27,11 +8,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
27
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
9
|
});
|
|
29
10
|
};
|
|
11
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
12
|
+
if (mod && mod.__esModule) return mod;
|
|
13
|
+
var result = {};
|
|
14
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
15
|
+
result["default"] = mod;
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
30
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
20
|
};
|
|
33
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
-
exports.AntScanner = exports.AntProtocol = void 0;
|
|
35
22
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
36
23
|
const DeviceProtocol_1 = __importStar(require("../DeviceProtocol"));
|
|
37
24
|
const AntHrmAdapter_1 = __importDefault(require("./anthrm/AntHrmAdapter"));
|
|
@@ -52,7 +52,7 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
52
52
|
getDisplayName() {
|
|
53
53
|
const { DeviceID, ManId, ComputedHeartRate } = this.deviceData;
|
|
54
54
|
const hrmStr = ComputedHeartRate ? ` (${ComputedHeartRate})` : '';
|
|
55
|
-
return `${
|
|
55
|
+
return `${utils_1.getBrand(ManId)} FE ${DeviceID}${hrmStr}`;
|
|
56
56
|
}
|
|
57
57
|
onAttached() {
|
|
58
58
|
this.logger.logEvent({ message: 'Device connected' });
|
|
@@ -225,7 +225,7 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
225
225
|
trackResistanceSent: false,
|
|
226
226
|
userSent: false,
|
|
227
227
|
};
|
|
228
|
-
|
|
228
|
+
utils_2.runWithRetries(() => __awaiter(this, void 0, void 0, function* () {
|
|
229
229
|
if (this.isStopped())
|
|
230
230
|
resolve(false);
|
|
231
231
|
try {
|
|
@@ -310,18 +310,18 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
310
310
|
try {
|
|
311
311
|
const isReset = (!request || request.reset || Object.keys(request).length === 0);
|
|
312
312
|
if (request.slope !== undefined) {
|
|
313
|
-
yield
|
|
313
|
+
yield utils_2.runWithRetries(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTrackResistance(request.slope); }), 2, 100);
|
|
314
314
|
}
|
|
315
315
|
if (request.targetPower !== undefined) {
|
|
316
|
-
yield
|
|
316
|
+
yield utils_2.runWithRetries(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTargetPower(request.targetPower); }), 2, 100);
|
|
317
317
|
}
|
|
318
318
|
else if (request.maxPower !== undefined) {
|
|
319
319
|
if (this.data.power && this.data.power > request.maxPower)
|
|
320
|
-
yield
|
|
320
|
+
yield utils_2.runWithRetries(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTargetPower(request.maxPower); }), 2, 100);
|
|
321
321
|
}
|
|
322
322
|
else if (request.minPower !== undefined) {
|
|
323
323
|
if (this.data.power && this.data.power < request.minPower)
|
|
324
|
-
yield
|
|
324
|
+
yield utils_2.runWithRetries(() => __awaiter(this, void 0, void 0, function* () { return yield this.sendTargetPower(request.minPower); }), 2, 100);
|
|
325
325
|
}
|
|
326
326
|
}
|
|
327
327
|
catch (err) {
|
|
@@ -406,7 +406,7 @@ class AntFEAdapter extends AntAdapter_1.default {
|
|
|
406
406
|
this.currentCmd = this.queue.dequeue();
|
|
407
407
|
this.currentCmd.tsStart = Date.now();
|
|
408
408
|
const { msg, logStr } = this.currentCmd;
|
|
409
|
-
this.logger.logEvent({ message: "sending", cmd: logStr, msg:
|
|
409
|
+
this.logger.logEvent({ message: "sending", cmd: logStr, msg: utils_2.hexstr(msg), queueSize: this.queue.size() });
|
|
410
410
|
if (this.stick)
|
|
411
411
|
this.stick.write(msg);
|
|
412
412
|
}
|
|
@@ -43,7 +43,7 @@ class AntHrmAdapter extends AntAdapter_1.default {
|
|
|
43
43
|
getDisplayName() {
|
|
44
44
|
const { DeviceID, manID, ComputedHeartRate } = this.deviceData;
|
|
45
45
|
const hrmStr = ComputedHeartRate ? ` (${ComputedHeartRate})` : '';
|
|
46
|
-
return `${
|
|
46
|
+
return `${utils_1.getBrand(manID)} Hrm ${DeviceID}${hrmStr}`;
|
|
47
47
|
}
|
|
48
48
|
onDeviceData(deviceData) {
|
|
49
49
|
if (!this.started)
|
package/lib/ant/utils.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getBrand =
|
|
4
|
-
const getBrand = (manId) => {
|
|
3
|
+
exports.getBrand = (manId) => {
|
|
5
4
|
if (manId === undefined)
|
|
6
5
|
return "ANT+";
|
|
7
6
|
switch (manId) {
|
|
@@ -20,4 +19,3 @@ const getBrand = (manId) => {
|
|
|
20
19
|
return "ANT+";
|
|
21
20
|
}
|
|
22
21
|
};
|
|
23
|
-
exports.getBrand = getBrand;
|
package/lib/calculations.js
CHANGED
package/lib/daum/DaumAdapter.js
CHANGED
|
@@ -1,23 +1,4 @@
|
|
|
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
|
-
};
|
|
21
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -27,6 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
27
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
9
|
});
|
|
29
10
|
};
|
|
11
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
12
|
+
if (mod && mod.__esModule) return mod;
|
|
13
|
+
var result = {};
|
|
14
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
15
|
+
result["default"] = mod;
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
30
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
20
|
};
|
|
@@ -308,16 +296,16 @@ class DaumAdapterBase extends Device_1.default {
|
|
|
308
296
|
return;
|
|
309
297
|
let distance = 0;
|
|
310
298
|
if (this.distanceInternal !== undefined && this.daumRunData.distanceInternal !== undefined) {
|
|
311
|
-
distance =
|
|
299
|
+
distance = utils_1.intVal(this.daumRunData.distanceInternal - this.distanceInternal);
|
|
312
300
|
}
|
|
313
301
|
if (this.daumRunData.distanceInternal !== undefined)
|
|
314
302
|
this.distanceInternal = this.daumRunData.distanceInternal;
|
|
315
303
|
let data = {
|
|
316
|
-
speed:
|
|
317
|
-
slope:
|
|
318
|
-
power:
|
|
319
|
-
cadence:
|
|
320
|
-
heartrate:
|
|
304
|
+
speed: utils_1.floatVal(this.daumRunData.speed),
|
|
305
|
+
slope: utils_1.floatVal(this.daumRunData.slope),
|
|
306
|
+
power: utils_1.intVal(this.daumRunData.power),
|
|
307
|
+
cadence: utils_1.intVal(this.daumRunData.pedalRpm),
|
|
308
|
+
heartrate: utils_1.intVal(this.daumRunData.heartrate),
|
|
321
309
|
distance,
|
|
322
310
|
timestamp: Date.now(),
|
|
323
311
|
deviceTime: this.daumRunData.time,
|
|
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.direction = void 0;
|
|
7
6
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
8
7
|
const CyclingMode_1 = require("../CyclingMode");
|
|
9
8
|
const calculations_1 = __importDefault(require("../calculations"));
|
|
@@ -86,7 +86,7 @@ class DaumClassicAdapter extends DaumAdapter_1.default {
|
|
|
86
86
|
const { user } = props;
|
|
87
87
|
this.initData();
|
|
88
88
|
let startState = {};
|
|
89
|
-
return
|
|
89
|
+
return utils_1.runWithRetries(() => __awaiter(this, void 0, void 0, function* () {
|
|
90
90
|
try {
|
|
91
91
|
if (!this.bike.isConnected())
|
|
92
92
|
yield this.bike.saveConnect();
|
|
@@ -1,23 +1,4 @@
|
|
|
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
|
-
};
|
|
21
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -27,6 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
27
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
9
|
});
|
|
29
10
|
};
|
|
11
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
12
|
+
if (mod && mod.__esModule) return mod;
|
|
13
|
+
var result = {};
|
|
14
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
15
|
+
result["default"] = mod;
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
30
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
20
|
};
|
package/lib/daum/classic/bike.js
CHANGED
|
@@ -52,9 +52,9 @@ class Daum8008 {
|
|
|
52
52
|
}
|
|
53
53
|
getUserWeight() {
|
|
54
54
|
if (this.settings && this.settings.user && this.settings.user.weight)
|
|
55
|
-
return
|
|
55
|
+
return utils_1.getWeight(this.settings.user.weight);
|
|
56
56
|
else
|
|
57
|
-
return
|
|
57
|
+
return utils_1.getWeight();
|
|
58
58
|
}
|
|
59
59
|
getBikeWeight() {
|
|
60
60
|
if (this.settings && this.settings.weight) {
|
|
@@ -274,7 +274,7 @@ class Daum8008 {
|
|
|
274
274
|
};
|
|
275
275
|
this.queue.enqueue(cmdInfo);
|
|
276
276
|
if (this.queue.size() > 1)
|
|
277
|
-
this.logger.logEvent({ message: "sendCommand:adding:", cmd: logStr, hex:
|
|
277
|
+
this.logger.logEvent({ message: "sendCommand:adding:", cmd: logStr, hex: utils_1.hexstr(payload), queueSize: this.queue.size() });
|
|
278
278
|
if (this.bikeCmdWorker === undefined) {
|
|
279
279
|
this.startWorker();
|
|
280
280
|
}
|
|
@@ -293,7 +293,7 @@ class Daum8008 {
|
|
|
293
293
|
const parser = serialPort.pipe(new ByteLength({ length: expected }));
|
|
294
294
|
parser.on('data', (data) => {
|
|
295
295
|
let duration = Date.now() - this.cmdStart;
|
|
296
|
-
this.logger.logEvent({ message: "sendCommand:received:", duration, hex:
|
|
296
|
+
this.logger.logEvent({ message: "sendCommand:received:", duration, hex: utils_1.hexstr(data), port: this.getPort() });
|
|
297
297
|
serialPort.unpipe();
|
|
298
298
|
if (callbackErr !== undefined) {
|
|
299
299
|
if (data[0] !== payload[0]) {
|
|
@@ -306,7 +306,7 @@ class Daum8008 {
|
|
|
306
306
|
callback(data);
|
|
307
307
|
done();
|
|
308
308
|
});
|
|
309
|
-
this.logger.logEvent({ message: "sendCommand:sending:", cmd: logStr, hex:
|
|
309
|
+
this.logger.logEvent({ message: "sendCommand:sending:", cmd: logStr, hex: utils_1.hexstr(payload), port: this.getPort() });
|
|
310
310
|
this.cmdCurrent.start = this.cmdStart = Date.now();
|
|
311
311
|
serialPort.write(payload);
|
|
312
312
|
}
|
|
@@ -321,53 +321,53 @@ class Daum8008 {
|
|
|
321
321
|
this.sendDaum8008Command(`checkCockpit(${bikeNo})`, [0x10, bikeNo], 3, (data) => resolve({ bike: data[1], version: data[2] }), (status, err) => {
|
|
322
322
|
if (status === 408)
|
|
323
323
|
return resolve({ bike: bikeNo, version: undefined });
|
|
324
|
-
reject(
|
|
324
|
+
reject(utils_1.buildError(status, err));
|
|
325
325
|
});
|
|
326
326
|
});
|
|
327
327
|
}
|
|
328
328
|
getAddress() {
|
|
329
329
|
return new Promise((resolve, reject) => {
|
|
330
|
-
this.sendDaum8008Command(`getAddress()`, [0x11], 2, (data) => resolve({ bike: data[1] }), (status, err) => reject(
|
|
330
|
+
this.sendDaum8008Command(`getAddress()`, [0x11], 2, (data) => resolve({ bike: data[1] }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
331
331
|
});
|
|
332
332
|
}
|
|
333
333
|
getVersion(bikeNo = 0) {
|
|
334
334
|
return new Promise((resolve, reject) => {
|
|
335
|
-
this.sendDaum8008Command(`getVersion(${bikeNo})`, [0x73, bikeNo], 11, (data) => resolve({ bike: data[1], serialNo:
|
|
335
|
+
this.sendDaum8008Command(`getVersion(${bikeNo})`, [0x73, bikeNo], 11, (data) => resolve({ bike: data[1], serialNo: utils_1.hexstr(data, 2, 8), cockpit: utils_1.getCockpit(data[10]) }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
336
336
|
});
|
|
337
337
|
}
|
|
338
338
|
resetDevice(bikeNo = 0) {
|
|
339
339
|
return new Promise((resolve, reject) => {
|
|
340
|
-
this.sendDaum8008Command(`resetDevice(${bikeNo})`, [0x12, bikeNo], 2, (data) => resolve({}), (status, err) => reject(
|
|
340
|
+
this.sendDaum8008Command(`resetDevice(${bikeNo})`, [0x12, bikeNo], 2, (data) => resolve({}), (status, err) => reject(utils_1.buildError(status, err)));
|
|
341
341
|
});
|
|
342
342
|
}
|
|
343
343
|
startProg(bikeNo = 0) {
|
|
344
344
|
return new Promise((resolve, reject) => {
|
|
345
|
-
this.sendDaum8008Command(`startProg(${bikeNo})`, [0x21, bikeNo], 3, (data) => resolve({ bike: data[1], pedalling: data[2] > 0 }), (status, err) => reject(
|
|
345
|
+
this.sendDaum8008Command(`startProg(${bikeNo})`, [0x21, bikeNo], 3, (data) => resolve({ bike: data[1], pedalling: data[2] > 0 }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
346
346
|
});
|
|
347
347
|
}
|
|
348
348
|
stopProg(bikeNo = 0) {
|
|
349
349
|
return new Promise((resolve, reject) => {
|
|
350
|
-
this.sendDaum8008Command(`stopProg(${bikeNo})`, [0x22, bikeNo], 3, (data) => resolve({ bike: data[1], pedalling: data[2] !== 0 }), (status, err) => reject(
|
|
350
|
+
this.sendDaum8008Command(`stopProg(${bikeNo})`, [0x22, bikeNo], 3, (data) => resolve({ bike: data[1], pedalling: data[2] !== 0 }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
351
351
|
});
|
|
352
352
|
}
|
|
353
353
|
setProg(progNo = 0, bikeNo = 0) {
|
|
354
354
|
return new Promise((resolve, reject) => {
|
|
355
|
-
this.sendDaum8008Command(`setProg(${bikeNo},${progNo})`, [0x23, bikeNo, progNo], 4, (data) => resolve({ bike: data[1], progNo: data[2], pedalling: data[3] !== 0 }), (status, err) => reject(
|
|
355
|
+
this.sendDaum8008Command(`setProg(${bikeNo},${progNo})`, [0x23, bikeNo, progNo], 4, (data) => resolve({ bike: data[1], progNo: data[2], pedalling: data[3] !== 0 }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
356
356
|
});
|
|
357
357
|
}
|
|
358
358
|
setBikeType(bikeType, bikeNo = 0) {
|
|
359
|
-
const bikeVal =
|
|
359
|
+
const bikeVal = utils_1.getBikeType(bikeType);
|
|
360
360
|
return new Promise((resolve, reject) => {
|
|
361
|
-
this.sendDaum8008Command(`setBikeType(${bikeNo},${bikeType})`, [0x69, bikeNo, 0, 0, bikeVal], 3, (data) => resolve({}), (status, err) => reject(
|
|
361
|
+
this.sendDaum8008Command(`setBikeType(${bikeNo},${bikeType})`, [0x69, bikeNo, 0, 0, bikeVal], 3, (data) => resolve({}), (status, err) => reject(utils_1.buildError(status, err)));
|
|
362
362
|
});
|
|
363
363
|
}
|
|
364
364
|
setPerson(user = {}, bikeNo = 0) {
|
|
365
365
|
const age = user.age !== undefined ? user.age : utils_1.DEFAULT_AGE;
|
|
366
|
-
const gender =
|
|
367
|
-
const length =
|
|
366
|
+
const gender = utils_1.getGender(user.sex);
|
|
367
|
+
const length = utils_1.getLength(user.length);
|
|
368
368
|
const maxPower = this.settings.maxPower === undefined ? 800 : this.settings.maxPower;
|
|
369
369
|
const mUser = user.weight || this.getUserWeight();
|
|
370
|
-
const weight =
|
|
370
|
+
const weight = utils_1.getWeight(mUser) + this.getBikeWeight();
|
|
371
371
|
var cmd = [0x24, bikeNo, 0];
|
|
372
372
|
cmd.push(age);
|
|
373
373
|
cmd.push(gender);
|
|
@@ -390,26 +390,26 @@ class Daum8008 {
|
|
|
390
390
|
if (data[i] === 0 || data[i] === 80)
|
|
391
391
|
return;
|
|
392
392
|
}
|
|
393
|
-
reject(
|
|
393
|
+
reject(utils_1.buildError(512, 'illegal response'));
|
|
394
394
|
ok = false;
|
|
395
395
|
}
|
|
396
396
|
});
|
|
397
397
|
if (ok)
|
|
398
398
|
resolve({ bike: data[1], age, gender, length, weight });
|
|
399
|
-
}, (status, err) => reject(
|
|
399
|
+
}, (status, err) => reject(utils_1.buildError(status, err)));
|
|
400
400
|
});
|
|
401
401
|
}
|
|
402
402
|
runData(bikeNo = 0) {
|
|
403
403
|
return new Promise((resolve, reject) => {
|
|
404
404
|
this.sendDaum8008Command(`runData(${bikeNo})`, [0x40, bikeNo], 19, (data) => {
|
|
405
405
|
try {
|
|
406
|
-
const parsed =
|
|
406
|
+
const parsed = utils_1.parseRunData(data);
|
|
407
407
|
resolve(parsed);
|
|
408
408
|
}
|
|
409
409
|
catch (e) {
|
|
410
|
-
reject(
|
|
410
|
+
reject(utils_1.buildError(500, e));
|
|
411
411
|
}
|
|
412
|
-
}, (status, err) => reject(
|
|
412
|
+
}, (status, err) => reject(utils_1.buildError(status, err)));
|
|
413
413
|
});
|
|
414
414
|
}
|
|
415
415
|
setGear(gear, bikeNo = 0) {
|
|
@@ -419,7 +419,7 @@ class Daum8008 {
|
|
|
419
419
|
if (gear > 28)
|
|
420
420
|
gearVal = 28;
|
|
421
421
|
return new Promise((resolve, reject) => {
|
|
422
|
-
this.sendDaum8008Command(`setGear(${bikeNo},${gearVal})`, [0x53, bikeNo, gearVal], 3, (data) => resolve({ bike: data[1], gear: data[2] }), (status, err) => reject(
|
|
422
|
+
this.sendDaum8008Command(`setGear(${bikeNo},${gearVal})`, [0x53, bikeNo, gearVal], 3, (data) => resolve({ bike: data[1], gear: data[2] }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
423
423
|
});
|
|
424
424
|
}
|
|
425
425
|
setPower(power, bikeNo = 0) {
|
|
@@ -434,7 +434,7 @@ class Daum8008 {
|
|
|
434
434
|
if (power > 800)
|
|
435
435
|
powerRequest = 800;
|
|
436
436
|
const powerVal = Math.round(powerRequest / 5);
|
|
437
|
-
this.sendDaum8008Command(`setPower(${bikeNo},${power})`, [0x51, bikeNo, powerVal], 3, (data) => resolve({ bike: data[1], power: (data[2] * 5) }), (status, err) => reject(
|
|
437
|
+
this.sendDaum8008Command(`setPower(${bikeNo},${power})`, [0x51, bikeNo, powerVal], 3, (data) => resolve({ bike: data[1], power: (data[2] * 5) }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
438
438
|
});
|
|
439
439
|
}
|
|
440
440
|
setSlope(slope, bikeNo = 0) {
|
|
@@ -444,12 +444,12 @@ class Daum8008 {
|
|
|
444
444
|
return;
|
|
445
445
|
}
|
|
446
446
|
const cmd = [0x55, bikeNo];
|
|
447
|
-
const arr =
|
|
447
|
+
const arr = utils_1.Float32ToIntArray(slope);
|
|
448
448
|
cmd.push(arr[3]);
|
|
449
449
|
cmd.push(arr[2]);
|
|
450
450
|
cmd.push(arr[1]);
|
|
451
451
|
cmd.push(arr[0]);
|
|
452
|
-
this.sendDaum8008Command(`setSlope(${bikeNo},${slope})`, cmd, 6, (data) => resolve({ bike: data[1], slope: slope }), (status, err) => reject(
|
|
452
|
+
this.sendDaum8008Command(`setSlope(${bikeNo},${slope})`, cmd, 6, (data) => resolve({ bike: data[1], slope: slope }), (status, err) => reject(utils_1.buildError(status, err)));
|
|
453
453
|
});
|
|
454
454
|
}
|
|
455
455
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Float32ToIntArray = exports.Float32ToHex = exports.hexstr = exports.buildError = exports.parseRunData = exports.getWeight = exports.getLength = exports.getGender = exports.getBikeType = exports.getCockpit = exports.DEFAULT_BIKE_WEIGHT = exports.DEFAULT_USER_WEIGHT = exports.DEFAULT_AGE = void 0;
|
|
4
3
|
exports.DEFAULT_AGE = 30;
|
|
5
4
|
exports.DEFAULT_USER_WEIGHT = 75;
|
|
6
5
|
exports.DEFAULT_BIKE_WEIGHT = 10;
|
package/lib/daum/constants.js
CHANGED
|
@@ -72,7 +72,7 @@ class DaumPremiumDevice extends DaumAdapter_1.default {
|
|
|
72
72
|
const route = opts.route;
|
|
73
73
|
var info = {};
|
|
74
74
|
this.initData();
|
|
75
|
-
return
|
|
75
|
+
return utils_1.runWithRetries(() => __awaiter(this, void 0, void 0, function* () {
|
|
76
76
|
if (this.isStopped())
|
|
77
77
|
return;
|
|
78
78
|
try {
|
|
@@ -1,23 +1,4 @@
|
|
|
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
|
-
};
|
|
21
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -27,6 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
27
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
9
|
});
|
|
29
10
|
};
|
|
11
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
12
|
+
if (mod && mod.__esModule) return mod;
|
|
13
|
+
var result = {};
|
|
14
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
15
|
+
result["default"] = mod;
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
30
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
20
|
};
|
package/lib/daum/premium/bike.js
CHANGED
|
@@ -12,7 +12,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.Daum8iSerial = exports.Daum8iTcp = void 0;
|
|
16
15
|
const constants_1 = require("../constants");
|
|
17
16
|
const tcpserial_1 = __importDefault(require("./tcpserial"));
|
|
18
17
|
const utils_1 = require("./utils");
|
|
@@ -408,7 +407,7 @@ class Daum8i {
|
|
|
408
407
|
incoming = bufferData;
|
|
409
408
|
}
|
|
410
409
|
const response = [...incoming];
|
|
411
|
-
this.logger.logEvent({ message: 'sendCommand:RECV', data:
|
|
410
|
+
this.logger.logEvent({ message: 'sendCommand:RECV', data: utils_1.hexstr(response) });
|
|
412
411
|
for (let i = 0; i < incoming.length; i++) {
|
|
413
412
|
const getRemaining = () => {
|
|
414
413
|
let remaining = '';
|
|
@@ -441,11 +440,11 @@ class Daum8i {
|
|
|
441
440
|
}
|
|
442
441
|
else if (c === 0x17) {
|
|
443
442
|
const remaining = getRemaining();
|
|
444
|
-
this.logger.logEvent({ message: "sendCommand:received:", duration: Date.now() - this.state.sending.tsRequest, port: portName, cmd: `${cmd} [${
|
|
443
|
+
this.logger.logEvent({ message: "sendCommand:received:", duration: Date.now() - this.state.sending.tsRequest, port: portName, cmd: `${cmd} [${utils_1.hexstr(cmd)}]`, remaining: utils_1.hexstr(remaining) });
|
|
445
444
|
this.state.waitingForEnd = false;
|
|
446
445
|
const cmdStr = cmd.substring(0, cmd.length - 2);
|
|
447
446
|
const checksumExtracted = cmd.slice(-2);
|
|
448
|
-
const checksumCalculated =
|
|
447
|
+
const checksumCalculated = utils_1.checkSum(utils_1.getAsciiArrayFromStr(cmdStr), []);
|
|
449
448
|
if (checksumExtracted === checksumCalculated) {
|
|
450
449
|
this.sendACK();
|
|
451
450
|
if (this.state.sending && this.state.sending.responseCheckIv) {
|
|
@@ -487,8 +486,8 @@ class Daum8i {
|
|
|
487
486
|
this.state.busy = true;
|
|
488
487
|
}
|
|
489
488
|
else {
|
|
490
|
-
const message =
|
|
491
|
-
this.logger.logEvent({ message: 'sendCommand:waiting', port: this.portName, cmd: command, hex:
|
|
489
|
+
const message = utils_1.buildMessage(command, payload);
|
|
490
|
+
this.logger.logEvent({ message: 'sendCommand:waiting', port: this.portName, cmd: command, hex: utils_1.hexstr(message) });
|
|
492
491
|
const busyWait = () => {
|
|
493
492
|
return new Promise((done) => {
|
|
494
493
|
let start = Date.now();
|
|
@@ -509,7 +508,7 @@ class Daum8i {
|
|
|
509
508
|
};
|
|
510
509
|
const res = yield busyWait();
|
|
511
510
|
if (!res) {
|
|
512
|
-
this.logger.logEvent({ message: 'sendCommand:busy timeout', port: this.portName, cmd: command, hex:
|
|
511
|
+
this.logger.logEvent({ message: 'sendCommand:busy timeout', port: this.portName, cmd: command, hex: utils_1.hexstr(message), duration: Date.now() - tsRequest });
|
|
513
512
|
return reject(new Error('BUSY timeout'));
|
|
514
513
|
}
|
|
515
514
|
this.state.busy = true;
|
|
@@ -527,10 +526,10 @@ class Daum8i {
|
|
|
527
526
|
const portName = this.portName;
|
|
528
527
|
this.state.received = [];
|
|
529
528
|
try {
|
|
530
|
-
const message =
|
|
529
|
+
const message = utils_1.buildMessage(command, payload);
|
|
531
530
|
const start = Date.now();
|
|
532
531
|
const timeout = start + this.getTimeoutValue();
|
|
533
|
-
this.logger.logEvent({ message: "sendCommand:sending:", port: this.portName, cmd: command, hex:
|
|
532
|
+
this.logger.logEvent({ message: "sendCommand:sending:", port: this.portName, cmd: command, hex: utils_1.hexstr(message) });
|
|
534
533
|
this.state.writeBusy = true;
|
|
535
534
|
if (!this.connected || port === undefined) {
|
|
536
535
|
this.logger.logEvent({ message: "sendCommand:error: not connected", port: this.portName });
|
|
@@ -590,10 +589,10 @@ class Daum8i {
|
|
|
590
589
|
buffer.writeUInt16LE(0, 2);
|
|
591
590
|
}
|
|
592
591
|
const cmdData = Uint8Array.from(buffer);
|
|
593
|
-
return this.sendDaum8iCommand('M70', cmdType,
|
|
592
|
+
return this.sendDaum8iCommand('M70', cmdType, utils_1.bin2esc(cmdData))
|
|
594
593
|
.then((res) => {
|
|
595
594
|
const resData = Uint8Array.from(res, x => x.charCodeAt(0));
|
|
596
|
-
const cmd =
|
|
595
|
+
const cmd = utils_1.esc2bin(resData);
|
|
597
596
|
return cmd;
|
|
598
597
|
});
|
|
599
598
|
}
|
|
@@ -618,7 +617,7 @@ class Daum8i {
|
|
|
618
617
|
else if (str === '7')
|
|
619
618
|
deviceType = 'lyps';
|
|
620
619
|
else
|
|
621
|
-
throw (new Error(`unknown device type ${typeof str === 'string' ?
|
|
620
|
+
throw (new Error(`unknown device type ${typeof str === 'string' ? utils_1.ascii(str.charAt(0)) : str}`));
|
|
622
621
|
return deviceType;
|
|
623
622
|
});
|
|
624
623
|
}
|
|
@@ -633,7 +632,7 @@ class Daum8i {
|
|
|
633
632
|
else if (str === '2')
|
|
634
633
|
deviceType = constants_1.ACTUAL_BIKE_TYPE.MOUNTAIN;
|
|
635
634
|
else {
|
|
636
|
-
throw (new Error(`unknown actual device type ${typeof str === 'string' ?
|
|
635
|
+
throw (new Error(`unknown actual device type ${typeof str === 'string' ? utils_1.ascii(str.charAt(0)) : str}`));
|
|
637
636
|
}
|
|
638
637
|
this.state.actualBikeType = deviceType;
|
|
639
638
|
return deviceType;
|
|
@@ -675,12 +674,12 @@ class Daum8i {
|
|
|
675
674
|
getTrainingData() {
|
|
676
675
|
return this.sendDaum8iCommand('X70', 'AF', [])
|
|
677
676
|
.then((data) => {
|
|
678
|
-
const td =
|
|
677
|
+
const td = utils_1.parseTrainingData(data);
|
|
679
678
|
return td;
|
|
680
679
|
});
|
|
681
680
|
}
|
|
682
681
|
setLoadControl(enabled) {
|
|
683
|
-
const val = enabled ?
|
|
682
|
+
const val = enabled ? utils_1.ascii('1') : utils_1.ascii('0');
|
|
684
683
|
return this.sendDaum8iCommand('S20', 'BF', [val])
|
|
685
684
|
.then((data) => {
|
|
686
685
|
const res = data === '1';
|
|
@@ -714,7 +713,7 @@ class Daum8i {
|
|
|
714
713
|
setPerson(person) {
|
|
715
714
|
const { sex, age, length, weight } = person;
|
|
716
715
|
this.logger.logEvent({ message: 'setPerson() request', sex, age, length, weight });
|
|
717
|
-
return this.sendReservedDaum8iCommand(utils_1.ReservedCommands.PERSON_SET, 'BF',
|
|
716
|
+
return this.sendReservedDaum8iCommand(utils_1.ReservedCommands.PERSON_SET, 'BF', utils_1.getPersonData(person))
|
|
718
717
|
.then((res) => {
|
|
719
718
|
const buffer = Buffer.from(res);
|
|
720
719
|
const success = buffer.readInt16LE(0) === utils_1.ReservedCommands.PERSON_SET;
|
|
@@ -738,9 +737,9 @@ class Daum8i {
|
|
|
738
737
|
}
|
|
739
738
|
programUploadStart(bikeType, route) {
|
|
740
739
|
const payload = Buffer.alloc(40);
|
|
741
|
-
const epp = route ?
|
|
740
|
+
const epp = route ? utils_1.routeToEpp(route) : undefined;
|
|
742
741
|
const eppLength = epp ? epp.length : 0;
|
|
743
|
-
const bikeTypeVal =
|
|
742
|
+
const bikeTypeVal = utils_1.getBikeType(bikeType);
|
|
744
743
|
const wBits = route.lapMode ? DS_BITS_ENDLESS_RACE : DS_BITS_OFF;
|
|
745
744
|
payload.writeInt32LE(0, 0);
|
|
746
745
|
payload.writeInt8(bikeTypeVal, 4);
|
|
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getPersonData = exports.parseTrainingData = exports.routeToEpp = exports.getBikeType = exports.BikeType = exports.ReservedCommands = exports.Int32ToIntArray = exports.Int16ToIntArray = exports.Float32ToIntArray = exports.Float32ToHex = exports.getAsciiArrayFromStr = exports.asciiArrayToString = exports.charArrayToString = exports.ascii = exports.append = exports.getHex = exports.hexstr = exports.getMessageData = exports.buildMessage = exports.checkSum = exports.esc2bin = exports.bin2esc = void 0;
|
|
7
6
|
const win32filetime_1 = __importDefault(require("win32filetime"));
|
|
8
7
|
const sum = (arr) => arr.reduce((a, b) => a + b, 0);
|
|
9
8
|
function bin2esc(arr) {
|
package/lib/kettler/comms.d.ts
CHANGED
|
@@ -43,6 +43,7 @@ export default class KettlerSerialComms<T extends Command> extends EventEmitter
|
|
|
43
43
|
_setState(state: SerialCommsState): void;
|
|
44
44
|
_setSendState(state: SendState): void;
|
|
45
45
|
_setCurrentCmd(cmd: T): void;
|
|
46
|
+
stopCurrentTimeoutCheck(): void;
|
|
46
47
|
onPortOpen(): void;
|
|
47
48
|
onPortClose(): Promise<void>;
|
|
48
49
|
onPortError(err: any): void;
|
package/lib/kettler/comms.js
CHANGED
|
@@ -12,11 +12,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.SendState = exports.SerialCommsState = void 0;
|
|
16
15
|
const gd_eventlog_1 = require("gd-eventlog");
|
|
17
16
|
const utils_1 = require("../utils");
|
|
18
17
|
const events_1 = __importDefault(require("events"));
|
|
19
18
|
const DEFAULT_RCV_TIMEOUT = 1500;
|
|
19
|
+
const DEFAULT_OPEN_TIMEOUT = 1500;
|
|
20
20
|
const DEBUG_LOGGER = {
|
|
21
21
|
log: (e, ...args) => console.log(e, ...args),
|
|
22
22
|
logEvent: (event) => console.log(JSON.stringify(event))
|
|
@@ -51,6 +51,7 @@ class KettlerSerialComms extends events_1.default {
|
|
|
51
51
|
this.sendState = SendState.Idle;
|
|
52
52
|
this.settings = opts.settings || {};
|
|
53
53
|
this.currentCmd = undefined;
|
|
54
|
+
this.currentTimeout = undefined;
|
|
54
55
|
this.protocol = opts.protocol;
|
|
55
56
|
}
|
|
56
57
|
getPort() {
|
|
@@ -74,10 +75,17 @@ class KettlerSerialComms extends events_1.default {
|
|
|
74
75
|
_setCurrentCmd(cmd) {
|
|
75
76
|
this.currentCmd = cmd;
|
|
76
77
|
}
|
|
78
|
+
stopCurrentTimeoutCheck() {
|
|
79
|
+
if (this.currentTimeout) {
|
|
80
|
+
clearTimeout(this.currentTimeout);
|
|
81
|
+
this.currentTimeout = undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
77
84
|
onPortOpen() {
|
|
78
85
|
this.logger.logEvent({ message: 'port opened', port: this.getPort() });
|
|
79
86
|
this.state = SerialCommsState.Connected;
|
|
80
87
|
this.sendState = SendState.Idle;
|
|
88
|
+
this.stopCurrentTimeoutCheck();
|
|
81
89
|
this.startWorker();
|
|
82
90
|
this.emit('opened');
|
|
83
91
|
}
|
|
@@ -89,6 +97,7 @@ class KettlerSerialComms extends events_1.default {
|
|
|
89
97
|
}
|
|
90
98
|
this.state = SerialCommsState.Disconnected;
|
|
91
99
|
this.sendState = SendState.Idle;
|
|
100
|
+
this.stopCurrentTimeoutCheck();
|
|
92
101
|
this.queue.clear();
|
|
93
102
|
this.emit('closed');
|
|
94
103
|
this.sp.removeAllListeners();
|
|
@@ -96,14 +105,23 @@ class KettlerSerialComms extends events_1.default {
|
|
|
96
105
|
});
|
|
97
106
|
}
|
|
98
107
|
onPortError(err) {
|
|
108
|
+
let ignore = false;
|
|
99
109
|
if (this.stateIn([SerialCommsState.Connected, SerialCommsState.Disconnected]))
|
|
100
|
-
|
|
110
|
+
ignore = true;
|
|
101
111
|
if (this.state === SerialCommsState.Disconnecting && (err.message === 'Port is not open' || err.message === 'Writing to COM port (GetOverlappedResult): Operation aborted'))
|
|
102
|
-
|
|
112
|
+
ignore = true;
|
|
103
113
|
if (this.state === SerialCommsState.Connecting && (err.message === 'Port is already open' || err.message === 'Port is opening'))
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
ignore = true;
|
|
115
|
+
if (!ignore) {
|
|
116
|
+
this.logger.logEvent({ message: "port error:", port: this.getPort(), error: err.message, stack: err.stack, state: this.state });
|
|
117
|
+
this.emit('error', err);
|
|
118
|
+
this.stopCurrentTimeoutCheck();
|
|
119
|
+
if (this.state === SerialCommsState.Connecting || this.state === SerialCommsState.Disconnecting) {
|
|
120
|
+
this.state = SerialCommsState.Error;
|
|
121
|
+
this.sp.removeAllListeners();
|
|
122
|
+
this.sp = undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
107
125
|
}
|
|
108
126
|
open() {
|
|
109
127
|
this.logger.logEvent({ message: "open()", port: this.getPort() });
|
|
@@ -122,6 +140,11 @@ class KettlerSerialComms extends events_1.default {
|
|
|
122
140
|
const parser = this.sp.pipe(new SerialPort.parsers.Readline({ delimiter: CRLF }));
|
|
123
141
|
parser.on('data', (data) => { this.onData(data); });
|
|
124
142
|
this.sp.open();
|
|
143
|
+
const timeout = this.settings.openTimeout || DEFAULT_OPEN_TIMEOUT;
|
|
144
|
+
this.currentTimeout = setTimeout(() => {
|
|
145
|
+
this.logger.logEvent({ message: "open() timeout", port: this.getPort() });
|
|
146
|
+
this.onPortError(new Error("open() timeout"));
|
|
147
|
+
}, timeout);
|
|
125
148
|
}
|
|
126
149
|
catch (err) {
|
|
127
150
|
this.logger.logEvent({ message: "error", fn: 'open()', error: err.message });
|
|
@@ -170,7 +193,7 @@ class KettlerSerialComms extends events_1.default {
|
|
|
170
193
|
write(cmd) {
|
|
171
194
|
this.sendState = SendState.Sending;
|
|
172
195
|
const { logStr, message, timeout = (this.settings.timeout || DEFAULT_RCV_TIMEOUT) } = cmd;
|
|
173
|
-
const msg = typeof message === 'string' ? message :
|
|
196
|
+
const msg = typeof message === 'string' ? message : utils_1.hexstr(message);
|
|
174
197
|
const onError = (err) => {
|
|
175
198
|
this.logger.logEvent({ message: "sendCommand:error:", cmd: logStr, error: err.message, port: this.getPort() });
|
|
176
199
|
if (cmd.onError)
|
|
@@ -1,23 +1,4 @@
|
|
|
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
|
-
};
|
|
21
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -27,6 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
27
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
9
|
});
|
|
29
10
|
};
|
|
11
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
12
|
+
if (mod && mod.__esModule) return mod;
|
|
13
|
+
var result = {};
|
|
14
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
15
|
+
result["default"] = mod;
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
30
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
20
|
};
|
|
@@ -298,7 +286,7 @@ class KettlerRacerAdapter extends Device_1.default {
|
|
|
298
286
|
start(props) {
|
|
299
287
|
this.logger.logEvent({ message: 'start()' });
|
|
300
288
|
var info = {};
|
|
301
|
-
return
|
|
289
|
+
return utils_1.runWithRetries(() => __awaiter(this, void 0, void 0, function* () {
|
|
302
290
|
try {
|
|
303
291
|
if (!info.checkDone) {
|
|
304
292
|
info.checkDone = yield this.check();
|
|
@@ -430,14 +418,21 @@ class KettlerRacerAdapter extends Device_1.default {
|
|
|
430
418
|
this.updateBusy = true;
|
|
431
419
|
this.getStatus()
|
|
432
420
|
.then((bikeData) => {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
421
|
+
if (bikeData) {
|
|
422
|
+
try {
|
|
423
|
+
this.kettlerData = bikeData;
|
|
424
|
+
let data = this.mapData(bikeData);
|
|
425
|
+
data = this.getCyclingMode().updateData(data);
|
|
426
|
+
this.data = this.transformData(data, bikeData);
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
this.logger.logEvent({ message: 'bike update error', error: err.message });
|
|
430
|
+
}
|
|
431
|
+
}
|
|
437
432
|
this.updateBusy = false;
|
|
438
433
|
})
|
|
439
434
|
.catch(err => {
|
|
440
|
-
this.logger.logEvent({ message: 'bike update error', error: err.message
|
|
435
|
+
this.logger.logEvent({ message: 'bike update error', error: err.message });
|
|
441
436
|
this.updateBusy = false;
|
|
442
437
|
});
|
|
443
438
|
});
|
|
@@ -540,7 +535,7 @@ class KettlerRacerAdapter extends Device_1.default {
|
|
|
540
535
|
}));
|
|
541
536
|
}
|
|
542
537
|
waitForOpened() {
|
|
543
|
-
return
|
|
538
|
+
return utils_1.runWithRetries(() => {
|
|
544
539
|
return new Promise((resolve, reject) => {
|
|
545
540
|
try {
|
|
546
541
|
if (this.comms.isConnected()) {
|
|
@@ -1,23 +1,4 @@
|
|
|
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
|
-
};
|
|
21
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
22
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
23
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -27,6 +8,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
27
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
28
9
|
});
|
|
29
10
|
};
|
|
11
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
12
|
+
if (mod && mod.__esModule) return mod;
|
|
13
|
+
var result = {};
|
|
14
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
15
|
+
result["default"] = mod;
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
30
18
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
31
19
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
32
20
|
};
|
|
@@ -1,28 +1,15 @@
|
|
|
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
2
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
3
|
if (mod && mod.__esModule) return mod;
|
|
16
4
|
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (
|
|
18
|
-
|
|
5
|
+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
6
|
+
result["default"] = mod;
|
|
19
7
|
return result;
|
|
20
8
|
};
|
|
21
9
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
10
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
11
|
};
|
|
24
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.Simulator = void 0;
|
|
26
13
|
const DeviceProtocol_1 = __importStar(require("../DeviceProtocol"));
|
|
27
14
|
const DeviceRegistry_1 = __importDefault(require("../DeviceRegistry"));
|
|
28
15
|
const Device_1 = __importDefault(require("../Device"));
|
package/lib/types/route.js
CHANGED
package/lib/types/user.js
CHANGED
package/lib/utils.js
CHANGED
|
@@ -9,11 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
13
|
-
const sleep = (ms) => {
|
|
12
|
+
exports.sleep = (ms) => {
|
|
14
13
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
15
14
|
};
|
|
16
|
-
exports.sleep = sleep;
|
|
17
15
|
function runWithRetries(fn, maxRetries, timeBetween) {
|
|
18
16
|
return new Promise((resolve, reject) => {
|
|
19
17
|
let retries = 0;
|