incyclist-devices 1.5.38 → 2.0.0

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 (267) hide show
  1. package/README.MD +238 -0
  2. package/lib/adapters.d.ts +7 -0
  3. package/lib/adapters.js +49 -0
  4. package/lib/antv2/adapter-factory.d.ts +21 -10
  5. package/lib/antv2/adapter-factory.js +51 -33
  6. package/lib/antv2/adapter.d.ts +65 -0
  7. package/lib/antv2/adapter.js +310 -0
  8. package/lib/antv2/ant-interface.d.ts +17 -11
  9. package/lib/antv2/ant-interface.js +41 -31
  10. package/lib/antv2/{ant-binding.d.ts → binding.d.ts} +1 -1
  11. package/lib/antv2/{ant-binding.js → binding.js} +1 -1
  12. package/lib/antv2/fe/adapter.d.ts +28 -0
  13. package/lib/antv2/{fe.js → fe/adapter.js} +106 -90
  14. package/lib/antv2/fe/index.d.ts +2 -0
  15. package/lib/antv2/fe/index.js +7 -0
  16. package/lib/antv2/hr/adapter.d.ts +15 -0
  17. package/lib/antv2/hr/adapter.js +76 -0
  18. package/lib/antv2/hr/index.d.ts +2 -0
  19. package/lib/antv2/hr/index.js +7 -0
  20. package/lib/antv2/index.d.ts +7 -0
  21. package/lib/antv2/index.js +20 -0
  22. package/lib/antv2/modes/ant-fe-adv-st-mode.d.ts +9 -0
  23. package/lib/{ant/antfe → antv2/modes}/ant-fe-adv-st-mode.js +1 -1
  24. package/lib/antv2/modes/ant-fe-erg-mode.d.ts +6 -0
  25. package/lib/{ant/antfe → antv2/modes}/ant-fe-erg-mode.js +1 -1
  26. package/lib/antv2/modes/ant-fe-st-mode.d.ts +5 -0
  27. package/lib/{ant/antfe → antv2/modes}/ant-fe-st-mode.js +1 -1
  28. package/lib/antv2/pwr/adapter.d.ts +24 -0
  29. package/lib/antv2/pwr/adapter.js +141 -0
  30. package/lib/antv2/pwr/index.d.ts +2 -0
  31. package/lib/antv2/pwr/index.js +7 -0
  32. package/lib/antv2/sensor-factory.d.ts +2 -2
  33. package/lib/antv2/types.d.ts +22 -0
  34. package/lib/antv2/types.js +5 -0
  35. package/lib/antv2/utils.d.ts +4 -0
  36. package/lib/antv2/utils.js +192 -0
  37. package/lib/base/adpater.d.ts +68 -0
  38. package/lib/base/adpater.js +183 -0
  39. package/lib/ble/adapter-factory.d.ts +33 -0
  40. package/lib/ble/adapter-factory.js +105 -0
  41. package/lib/ble/base/adapter.d.ts +53 -0
  42. package/lib/ble/base/adapter.js +290 -0
  43. package/lib/ble/base/comms-utils.d.ts +7 -0
  44. package/lib/ble/base/comms-utils.js +91 -0
  45. package/lib/ble/{ble-device.d.ts → base/comms.d.ts} +31 -16
  46. package/lib/ble/{ble-device.js → base/comms.js} +193 -55
  47. package/lib/ble/bindings/index.d.ts +2 -0
  48. package/lib/ble/bindings/index.js +8 -0
  49. package/lib/ble/bindings/linux.d.ts +15 -0
  50. package/lib/ble/bindings/linux.js +39 -0
  51. package/lib/ble/bindings/mock.d.ts +9 -0
  52. package/lib/ble/bindings/mock.js +108 -0
  53. package/lib/ble/bindings/types.d.ts +57 -0
  54. package/lib/ble/bindings/types.js +96 -0
  55. package/lib/ble/ble-interface.d.ts +38 -59
  56. package/lib/ble/ble-interface.js +254 -462
  57. package/lib/ble/ble-peripheral.d.ts +7 -5
  58. package/lib/ble/ble-peripheral.js +52 -21
  59. package/lib/ble/consts.d.ts +3 -0
  60. package/lib/ble/consts.js +4 -1
  61. package/lib/ble/cp/adapter.d.ts +22 -0
  62. package/lib/ble/cp/adapter.js +111 -0
  63. package/lib/ble/cp/comm.d.ts +31 -0
  64. package/lib/ble/cp/comm.js +125 -0
  65. package/lib/ble/cp/index.d.ts +4 -0
  66. package/lib/ble/cp/index.js +10 -0
  67. package/lib/ble/cp/types.d.ts +13 -0
  68. package/lib/ble/cp/types.js +2 -0
  69. package/lib/ble/elite/adapter.d.ts +19 -0
  70. package/lib/ble/elite/adapter.js +120 -0
  71. package/lib/ble/elite/comms.d.ts +32 -0
  72. package/lib/ble/elite/comms.js +126 -0
  73. package/lib/ble/elite/index.d.ts +3 -0
  74. package/lib/ble/elite/index.js +10 -0
  75. package/lib/ble/fm/adapter.d.ts +22 -0
  76. package/lib/ble/fm/adapter.js +249 -0
  77. package/lib/ble/fm/comms.d.ts +50 -0
  78. package/lib/ble/{fm.js → fm/comms.js} +34 -277
  79. package/lib/ble/fm/consts.d.ts +6 -0
  80. package/lib/ble/fm/consts.js +9 -0
  81. package/lib/ble/fm/index.d.ts +5 -0
  82. package/lib/ble/fm/index.js +13 -0
  83. package/lib/ble/fm/types.d.ts +30 -0
  84. package/lib/ble/fm/types.js +2 -0
  85. package/lib/ble/hr/adapter.d.ts +14 -0
  86. package/lib/ble/hr/adapter.js +45 -0
  87. package/lib/ble/hr/comm.d.ts +19 -0
  88. package/lib/ble/hr/comm.js +56 -0
  89. package/lib/ble/hr/index.d.ts +4 -0
  90. package/lib/ble/hr/index.js +10 -0
  91. package/lib/ble/hr/mock.d.ts +7 -0
  92. package/lib/ble/hr/mock.js +47 -0
  93. package/lib/ble/hr/types.d.ts +5 -0
  94. package/lib/ble/hr/types.js +2 -0
  95. package/lib/ble/index.d.ts +9 -0
  96. package/lib/ble/index.js +26 -0
  97. package/lib/ble/peripheral-cache.d.ts +43 -0
  98. package/lib/ble/peripheral-cache.js +107 -0
  99. package/lib/ble/tacx/adapter.d.ts +10 -0
  100. package/lib/ble/tacx/adapter.js +99 -0
  101. package/lib/ble/{tacx.d.ts → tacx/comms.d.ts} +11 -43
  102. package/lib/ble/{tacx.js → tacx/comms.js} +23 -155
  103. package/lib/ble/tacx/index.d.ts +4 -0
  104. package/lib/ble/tacx/index.js +10 -0
  105. package/lib/ble/tacx/types.d.ts +25 -0
  106. package/lib/ble/tacx/types.js +2 -0
  107. package/lib/ble/types.d.ts +128 -0
  108. package/lib/ble/types.js +2 -0
  109. package/lib/ble/utils.d.ts +17 -0
  110. package/lib/ble/utils.js +54 -0
  111. package/lib/ble/wahoo/adapter.d.ts +9 -0
  112. package/lib/ble/wahoo/adapter.js +95 -0
  113. package/lib/ble/{wahoo-kickr.d.ts → wahoo/comms.d.ts} +11 -44
  114. package/lib/ble/{wahoo-kickr.js → wahoo/comms.js} +29 -129
  115. package/lib/ble/wahoo/index.d.ts +4 -0
  116. package/lib/ble/wahoo/index.js +10 -0
  117. package/lib/ble/wahoo/types.d.ts +19 -0
  118. package/lib/ble/wahoo/types.js +2 -0
  119. package/lib/index.d.ts +15 -0
  120. package/lib/index.js +34 -0
  121. package/lib/interfaces.d.ts +7 -0
  122. package/lib/interfaces.js +27 -0
  123. package/lib/{ble → modes}/ble-erg-mode.d.ts +4 -4
  124. package/lib/{ble → modes}/ble-erg-mode.js +2 -2
  125. package/lib/{ble → modes}/ble-st-mode.d.ts +3 -3
  126. package/lib/{ble → modes}/ble-st-mode.js +1 -1
  127. package/lib/{cycling-mode.d.ts → modes/cycling-mode.d.ts} +8 -8
  128. package/lib/modes/power-base.d.ts +3 -3
  129. package/lib/modes/power-base.js +8 -4
  130. package/lib/modes/power-meter.d.ts +3 -3
  131. package/lib/modes/simulator.d.ts +2 -2
  132. package/lib/modes/simulator.js +1 -1
  133. package/lib/serial/adapter-factory.d.ts +12 -0
  134. package/lib/serial/adapter-factory.js +30 -0
  135. package/lib/serial/adapter.d.ts +21 -0
  136. package/lib/serial/adapter.js +61 -0
  137. package/lib/serial/bindings/tcp.d.ts +45 -0
  138. package/lib/serial/bindings/tcp.js +284 -0
  139. package/lib/serial/comm.d.ts +7 -0
  140. package/lib/serial/comm.js +2 -0
  141. package/lib/{daum → serial/daum}/DaumAdapter.d.ts +14 -23
  142. package/lib/{daum → serial/daum}/DaumAdapter.js +57 -97
  143. package/lib/{daum → serial/daum}/DaumPowerMeterCyclingMode.d.ts +2 -2
  144. package/lib/{daum → serial/daum}/DaumPowerMeterCyclingMode.js +1 -1
  145. package/lib/{daum → serial/daum}/ERGCyclingMode.d.ts +3 -3
  146. package/lib/{daum → serial/daum}/ERGCyclingMode.js +3 -3
  147. package/lib/{daum → serial/daum}/SmartTrainerCyclingMode.d.ts +3 -3
  148. package/lib/{daum → serial/daum}/SmartTrainerCyclingMode.js +4 -3
  149. package/lib/serial/daum/classic/adapter.d.ts +29 -0
  150. package/lib/{daum/classic/DaumClassicAdapter.js → serial/daum/classic/adapter.js} +77 -50
  151. package/lib/{daum/classic/bike.d.ts → serial/daum/classic/comms.d.ts} +14 -16
  152. package/lib/{daum/classic/bike.js → serial/daum/classic/comms.js} +68 -152
  153. package/lib/serial/daum/classic/mock.d.ts +96 -0
  154. package/lib/serial/daum/classic/mock.js +365 -0
  155. package/lib/{daum/classic/DaumClassicCyclingMode.d.ts → serial/daum/classic/modes/daum-classic.d.ts} +3 -3
  156. package/lib/{daum/classic/DaumClassicCyclingMode.js → serial/daum/classic/modes/daum-classic.js} +2 -2
  157. package/lib/{daum → serial/daum}/classic/utils.d.ts +1 -1
  158. package/lib/serial/daum/premium/adapter.d.ts +25 -0
  159. package/lib/{daum/premium/DaumPremiumAdapter.js → serial/daum/premium/adapter.js} +107 -47
  160. package/lib/{daum/premium/bike.d.ts → serial/daum/premium/comms.d.ts} +26 -54
  161. package/lib/{daum/premium/bike.js → serial/daum/premium/comms.js} +215 -420
  162. package/lib/serial/daum/premium/mock.d.ts +75 -0
  163. package/lib/serial/daum/premium/mock.js +289 -0
  164. package/lib/{daum/premium/DaumClassicCyclingMode.d.ts → serial/daum/premium/modes/daum-classic.d.ts} +3 -3
  165. package/lib/{daum/premium/DaumClassicCyclingMode.js → serial/daum/premium/modes/daum-classic.js} +2 -2
  166. package/lib/serial/daum/premium/types.d.ts +12 -0
  167. package/lib/serial/daum/premium/types.js +2 -0
  168. package/lib/{daum → serial/daum}/premium/utils.d.ts +8 -11
  169. package/lib/{daum → serial/daum}/premium/utils.js +22 -63
  170. package/lib/serial/index.d.ts +9 -0
  171. package/lib/serial/index.js +49 -0
  172. package/lib/{kettler → serial/kettler}/comms.d.ts +8 -6
  173. package/lib/{kettler → serial/kettler}/comms.js +71 -32
  174. package/lib/{kettler → serial/kettler}/ergo-racer/adapter.d.ts +14 -28
  175. package/lib/{kettler → serial/kettler}/ergo-racer/adapter.js +102 -169
  176. package/lib/serial/kettler/ergo-racer/mock.d.ts +66 -0
  177. package/lib/serial/kettler/ergo-racer/mock.js +216 -0
  178. package/lib/{kettler/ergo-racer/ERGCyclingMode.d.ts → serial/kettler/ergo-racer/modes/erg.d.ts} +4 -4
  179. package/lib/{kettler/ergo-racer/ERGCyclingMode.js → serial/kettler/ergo-racer/modes/erg.js} +2 -2
  180. package/lib/serial/serial-interface.d.ts +60 -0
  181. package/lib/serial/serial-interface.js +309 -0
  182. package/lib/simulator/Simulator.d.ts +12 -25
  183. package/lib/simulator/Simulator.js +26 -87
  184. package/lib/types/adapter.d.ts +39 -0
  185. package/lib/types/adapter.js +2 -0
  186. package/lib/types/capabilities.d.ts +8 -0
  187. package/lib/types/capabilities.js +12 -0
  188. package/lib/types/data.d.ts +12 -0
  189. package/lib/types/data.js +2 -0
  190. package/lib/types/device.d.ts +32 -0
  191. package/lib/types/device.js +11 -0
  192. package/lib/types/interface.d.ts +18 -0
  193. package/lib/types/interface.js +2 -0
  194. package/lib/types/route.d.ts +2 -2
  195. package/lib/types/user.d.ts +1 -1
  196. package/lib/{utils.d.ts → utils/utils.d.ts} +1 -0
  197. package/lib/{utils.js → utils/utils.js} +5 -1
  198. package/package.json +16 -14
  199. package/lib/DeviceSupport.d.ts +0 -36
  200. package/lib/DeviceSupport.js +0 -82
  201. package/lib/ant/AntAdapter.d.ts +0 -50
  202. package/lib/ant/AntAdapter.js +0 -109
  203. package/lib/ant/AntScanner.d.ts +0 -60
  204. package/lib/ant/AntScanner.js +0 -651
  205. package/lib/ant/antfe/AntFEAdapter.d.ts +0 -83
  206. package/lib/ant/antfe/AntFEAdapter.js +0 -652
  207. package/lib/ant/antfe/ant-fe-adv-st-mode.d.ts +0 -9
  208. package/lib/ant/antfe/ant-fe-erg-mode.d.ts +0 -6
  209. package/lib/ant/antfe/ant-fe-st-mode.d.ts +0 -5
  210. package/lib/ant/anthrm/AntHrmAdapter.d.ts +0 -16
  211. package/lib/ant/anthrm/AntHrmAdapter.js +0 -130
  212. package/lib/ant/antpwr/pwr-adapter.d.ts +0 -49
  213. package/lib/ant/antpwr/pwr-adapter.js +0 -251
  214. package/lib/ant/utils.d.ts +0 -1
  215. package/lib/ant/utils.js +0 -23
  216. package/lib/antv2/AntAdapter.d.ts +0 -48
  217. package/lib/antv2/AntAdapter.js +0 -104
  218. package/lib/antv2/ant-device.d.ts +0 -59
  219. package/lib/antv2/ant-device.js +0 -161
  220. package/lib/antv2/fe.d.ts +0 -32
  221. package/lib/antv2/hr.d.ts +0 -18
  222. package/lib/antv2/hr.js +0 -102
  223. package/lib/antv2/incyclist-protocol.d.ts +0 -37
  224. package/lib/antv2/incyclist-protocol.js +0 -126
  225. package/lib/antv2/pwr.d.ts +0 -28
  226. package/lib/antv2/pwr.js +0 -171
  227. package/lib/ble/ble.d.ts +0 -129
  228. package/lib/ble/ble.js +0 -86
  229. package/lib/ble/elite.d.ts +0 -90
  230. package/lib/ble/elite.js +0 -322
  231. package/lib/ble/fm.d.ts +0 -125
  232. package/lib/ble/hrm.d.ts +0 -48
  233. package/lib/ble/hrm.js +0 -134
  234. package/lib/ble/incyclist-protocol.d.ts +0 -31
  235. package/lib/ble/incyclist-protocol.js +0 -153
  236. package/lib/ble/pwr.d.ts +0 -89
  237. package/lib/ble/pwr.js +0 -322
  238. package/lib/daum/classic/DaumClassicAdapter.d.ts +0 -28
  239. package/lib/daum/classic/DaumClassicProtocol.d.ts +0 -27
  240. package/lib/daum/classic/DaumClassicProtocol.js +0 -185
  241. package/lib/daum/premium/DaumPremiumAdapter.d.ts +0 -16
  242. package/lib/daum/premium/DaumPremiumProtocol.d.ts +0 -32
  243. package/lib/daum/premium/DaumPremiumProtocol.js +0 -207
  244. package/lib/daum/premium/tcpserial.d.ts +0 -33
  245. package/lib/daum/premium/tcpserial.js +0 -123
  246. package/lib/device.d.ts +0 -94
  247. package/lib/device.js +0 -76
  248. package/lib/kettler/ergo-racer/protocol.d.ts +0 -41
  249. package/lib/kettler/ergo-racer/protocol.js +0 -203
  250. package/lib/protocol.d.ts +0 -74
  251. package/lib/protocol.js +0 -41
  252. package/lib/registry.d.ts +0 -8
  253. package/lib/registry.js +0 -33
  254. package/lib/serialport/bindings/tcp.d.ts +0 -20
  255. package/lib/serialport/bindings/tcp.js +0 -33
  256. package/lib/serialport/index.d.ts +0 -2
  257. package/lib/serialport/index.js +0 -29
  258. package/lib/serialport/serialport.d.ts +0 -29
  259. package/lib/serialport/serialport.js +0 -87
  260. /package/lib/{cycling-mode.js → modes/cycling-mode.js} +0 -0
  261. /package/lib/{daum → serial/daum}/classic/utils.js +0 -0
  262. /package/lib/{daum → serial/daum}/constants.d.ts +0 -0
  263. /package/lib/{daum → serial/daum}/constants.js +0 -0
  264. /package/lib/{serialport.d.ts → serial/serialport.d.ts} +0 -0
  265. /package/lib/{serialport.js → serial/serialport.js} +0 -0
  266. /package/lib/{calculations.d.ts → utils/calculations.d.ts} +0 -0
  267. /package/lib/{calculations.js → utils/calculations.js} +0 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.ControllableAntAdapter = exports.DEFAULT_UPDATE_FREQUENCY = void 0;
39
+ const ant_interface_1 = __importDefault(require("./ant-interface"));
40
+ const adpater_1 = __importStar(require("../base/adpater"));
41
+ const types_1 = require("./types");
42
+ const utils_1 = require("../utils/utils");
43
+ const capabilities_1 = require("../types/capabilities");
44
+ const adpater_2 = require("../base/adpater");
45
+ const utils_2 = require("./utils");
46
+ exports.DEFAULT_UPDATE_FREQUENCY = 1000;
47
+ const NO_DATA_TIMEOUT = 5000;
48
+ const INTERFACE_NAME = 'ant';
49
+ class AntAdapter extends adpater_1.default {
50
+ constructor(settings, props) {
51
+ super(settings, props);
52
+ this.startupRetryPause = 1000;
53
+ const antSettings = this.settings;
54
+ if ((0, types_1.isLegacyProfile)(antSettings.profile))
55
+ antSettings.profile = (0, utils_2.mapLegacyProfile)(antSettings.profile);
56
+ if (this.settings.interface !== 'ant')
57
+ throw new Error('Incorrect interface');
58
+ this.sensor = this.createSensor(settings);
59
+ this.deviceData = {};
60
+ this.data = {};
61
+ this.dataMsgCount = 0;
62
+ this.updateFrequency = exports.DEFAULT_UPDATE_FREQUENCY;
63
+ this.channel = undefined;
64
+ this.ant = ant_interface_1.default.getInstance();
65
+ }
66
+ createSensor(settings) {
67
+ throw new Error('Method not implemented.');
68
+ }
69
+ isEqual(settings) {
70
+ const as = this.settings;
71
+ if (as.interface !== settings.interface)
72
+ return false;
73
+ if (as.deviceID !== settings.deviceID || as.profile !== settings.profile)
74
+ return false;
75
+ return true;
76
+ }
77
+ connect() {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ const connected = yield ant_interface_1.default.getInstance().connect();
80
+ return connected;
81
+ });
82
+ }
83
+ close() {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ return true;
86
+ });
87
+ }
88
+ resetData() {
89
+ this.dataMsgCount = 0;
90
+ const { DeviceID } = this.deviceData;
91
+ this.deviceData = { DeviceID };
92
+ this.lastDataTS = undefined;
93
+ }
94
+ isSame(device) {
95
+ if (!(device instanceof AntAdapter))
96
+ return false;
97
+ const adapter = device;
98
+ return (adapter.getID() === this.getID() && adapter.getProfile() === this.getProfile());
99
+ }
100
+ hasData() {
101
+ return this.dataMsgCount > 0;
102
+ }
103
+ onDeviceData(deviceData) {
104
+ const { ManId } = this.deviceData;
105
+ this.deviceData = Object.assign({}, deviceData);
106
+ if (!ManId && deviceData.ManId) {
107
+ this.emit('device-info', { device: this.getSettings(), manufacturer: (0, utils_2.getBrand)(deviceData.ManId) });
108
+ }
109
+ }
110
+ waitForData(timeout) {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ const startTs = Date.now();
113
+ const timeoutTs = startTs + timeout;
114
+ if (this.hasData())
115
+ return true;
116
+ return new Promise((resolve, reject) => {
117
+ if (this.ivWaitForData)
118
+ return reject(new Error('busy'));
119
+ this.ivWaitForData = setInterval(() => {
120
+ const nowTs = Date.now();
121
+ const hasData = this.hasData();
122
+ if (nowTs > timeoutTs && !hasData) {
123
+ clearInterval(this.ivWaitForData);
124
+ this.ivWaitForData = undefined;
125
+ reject(new Error('No Data Received'));
126
+ }
127
+ if (hasData) {
128
+ clearInterval(this.ivWaitForData);
129
+ this.ivWaitForData = undefined;
130
+ resolve(true);
131
+ }
132
+ }, 500);
133
+ });
134
+ });
135
+ }
136
+ getID() {
137
+ return this.sensor.getDeviceID().toString();
138
+ }
139
+ getName() {
140
+ const deviceID = this.sensor.getDeviceID();
141
+ const profile = this.sensor.getProfile();
142
+ return `Ant+${profile} ${deviceID}`;
143
+ }
144
+ getInterface() {
145
+ return INTERFACE_NAME;
146
+ }
147
+ getProfile() {
148
+ const settings = this.settings;
149
+ if (settings.protocol === undefined)
150
+ return settings.profile;
151
+ else {
152
+ return (0, utils_2.mapLegacyProfile)(settings.profile);
153
+ }
154
+ }
155
+ startDataTimeoutCheck() {
156
+ if (this.ivDataTimeout)
157
+ return;
158
+ this.ivDataTimeout = setInterval(() => {
159
+ if (!this.lastDataTS)
160
+ return;
161
+ if (this.lastDataTS + NO_DATA_TIMEOUT < Date.now()) {
162
+ this.emit('disconnected', Date.now() - this.lastDataTS);
163
+ }
164
+ }, 1000);
165
+ }
166
+ stopDataTimeoutCheck() {
167
+ if (!this.ivDataTimeout)
168
+ return;
169
+ clearInterval(this.ivDataTimeout);
170
+ this.ivDataTimeout = undefined;
171
+ this.lastDataTS = undefined;
172
+ this.dataMsgCount = 0;
173
+ }
174
+ check() {
175
+ return __awaiter(this, void 0, void 0, function* () {
176
+ try {
177
+ return yield this.start();
178
+ }
179
+ catch (error) {
180
+ return false;
181
+ }
182
+ });
183
+ }
184
+ checkCapabilities() {
185
+ return __awaiter(this, void 0, void 0, function* () {
186
+ return;
187
+ });
188
+ }
189
+ initControl() {
190
+ return __awaiter(this, void 0, void 0, function* () {
191
+ return;
192
+ });
193
+ }
194
+ start(props = {}) {
195
+ return __awaiter(this, void 0, void 0, function* () {
196
+ if (this.started)
197
+ return true;
198
+ const connected = yield this.connect();
199
+ if (!connected)
200
+ throw new Error(`could not start device, reason:could not connect`);
201
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
202
+ this.resetData();
203
+ this.stopped = false;
204
+ const { startupTimeout = 20000 } = props;
205
+ let to = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
206
+ try {
207
+ yield this.stop();
208
+ }
209
+ catch (_a) { }
210
+ this.started = false;
211
+ reject(new Error(`could not start device, reason:timeout`));
212
+ }), startupTimeout);
213
+ let started = false;
214
+ do {
215
+ started = yield this.ant.startSensor(this.sensor, (data) => {
216
+ this.onDeviceData(data);
217
+ });
218
+ if (!started)
219
+ yield (0, utils_1.sleep)(this.startupRetryPause);
220
+ } while (!started);
221
+ try {
222
+ yield this.waitForData(startupTimeout - 100);
223
+ yield this.checkCapabilities();
224
+ if (this.hasCapability(capabilities_1.IncyclistCapability.Control))
225
+ yield this.initControl();
226
+ this.started = true;
227
+ if (to)
228
+ clearTimeout(to);
229
+ resolve(true);
230
+ }
231
+ catch (err) {
232
+ }
233
+ }));
234
+ });
235
+ }
236
+ stop() {
237
+ return __awaiter(this, void 0, void 0, function* () {
238
+ this.stopDataTimeoutCheck();
239
+ let stopped = yield this.ant.stopSensor(this.sensor);
240
+ if (!stopped)
241
+ return false;
242
+ this.started = false;
243
+ this.stopped = true;
244
+ this.removeAllListeners();
245
+ return true;
246
+ });
247
+ }
248
+ }
249
+ exports.default = AntAdapter;
250
+ class ControllableAntAdapter extends AntAdapter {
251
+ constructor(settings, props) {
252
+ super(settings, props);
253
+ this.cyclingMode = this.getDefaultCyclingMode();
254
+ this.user = {};
255
+ }
256
+ isControllable() {
257
+ return true;
258
+ }
259
+ setUser(user) {
260
+ this.user = user;
261
+ if (!user.weight)
262
+ this.user.weight = adpater_2.DEFAULT_USER_WEIGHT;
263
+ }
264
+ setBikeProps(props) {
265
+ const { user, userWeight } = props || {};
266
+ if (user)
267
+ this.setUser(user);
268
+ if (userWeight)
269
+ this.user.weight = userWeight;
270
+ const keys = Object.keys(props);
271
+ keys.forEach(k => {
272
+ const p = props[k];
273
+ if (p === null)
274
+ delete this.props[k];
275
+ else if (p !== undefined)
276
+ this.props[k] = p;
277
+ });
278
+ }
279
+ getWeight() {
280
+ const { user = {}, props = adpater_2.DEFAULT_PROPS } = this;
281
+ const userWeight = user.weight || props.userWeight || adpater_2.DEFAULT_USER_WEIGHT;
282
+ const bikeWeight = props.bikeWeight || adpater_1.DEFAULT_BIKE_WEIGHT;
283
+ return userWeight + bikeWeight;
284
+ }
285
+ getSupportedCyclingModes() { throw new Error('not implemented'); }
286
+ getDefaultCyclingMode() { throw new Error('not implemented'); }
287
+ setCyclingMode(mode, settings) {
288
+ let selectedMode;
289
+ if (typeof mode === 'string') {
290
+ const supported = this.getSupportedCyclingModes();
291
+ const CyclingModeClass = supported.find(M => { const m = new M(this); return m.getName() === mode; });
292
+ if (CyclingModeClass) {
293
+ this.cyclingMode = new CyclingModeClass(this, settings);
294
+ return;
295
+ }
296
+ selectedMode = this.getDefaultCyclingMode();
297
+ }
298
+ else {
299
+ selectedMode = mode;
300
+ }
301
+ this.cyclingMode = selectedMode;
302
+ this.cyclingMode.setSettings(settings);
303
+ }
304
+ getCyclingMode() {
305
+ if (!this.cyclingMode)
306
+ this.setCyclingMode(this.getDefaultCyclingMode());
307
+ return this.cyclingMode;
308
+ }
309
+ }
310
+ exports.ControllableAntAdapter = ControllableAntAdapter;
@@ -2,34 +2,40 @@
2
2
  import EventEmitter from "events";
3
3
  import { EventLogger } from "gd-eventlog";
4
4
  import { IAntDevice, IChannel, ISensor } from "incyclist-ant-plus";
5
- import AntDeviceBinding from "./ant-binding";
6
- import { AntScannerProps } from "./incyclist-protocol";
7
- export declare type AntInterfaceProps = {
8
- binding?: typeof AntDeviceBinding;
9
- logger?: EventLogger;
5
+ import { InterfaceProps } from "../types/interface";
6
+ import AntDeviceBinding from "./binding";
7
+ import { IncyclistInterface } from "../types/interface";
8
+ import { AntDeviceSettings, AntScanProps } from "./types";
9
+ export interface AntInterfaceProps extends InterfaceProps {
10
10
  startupTimeout?: number;
11
- };
12
- export default class AntInterface extends EventEmitter {
11
+ }
12
+ export interface ConnectState {
13
+ connected: boolean;
14
+ connecting: boolean;
15
+ }
16
+ export default class AntInterface extends EventEmitter implements IncyclistInterface {
13
17
  static _instance: AntInterface;
18
+ static INTERFACE_NAME: string;
14
19
  static getInstance(props?: AntInterfaceProps): AntInterface;
15
20
  static hasInstance(): boolean;
16
21
  protected logger: EventLogger;
17
22
  protected device: IAntDevice;
18
23
  protected Binding: typeof AntDeviceBinding;
19
- protected isConnected: boolean;
20
- protected isConnecting: boolean;
24
+ protected connectState: ConnectState;
21
25
  protected props: AntInterfaceProps;
22
26
  protected activeScan: IChannel;
23
27
  constructor(props: AntInterfaceProps);
28
+ getName(): string;
24
29
  getBinding(): typeof AntDeviceBinding;
25
30
  setBinding(binding: typeof AntDeviceBinding): void;
26
31
  setLogger(logger: EventLogger): void;
27
32
  logEvent(event: any): void;
28
- connect(): Promise<unknown>;
33
+ isConnected(): boolean;
34
+ connect(): Promise<boolean>;
29
35
  disconnect(): Promise<boolean>;
30
36
  onError(profile: any, error: any): void;
31
37
  onData(profile: any, id: any, data: any, tag: any): void;
32
- scan(props?: AntScannerProps): Promise<unknown>;
38
+ scan(props?: AntScanProps): Promise<AntDeviceSettings[]>;
33
39
  stopScan(): Promise<boolean>;
34
40
  startSensor(sensor: ISensor, onDeviceData: (data: any) => void): Promise<boolean>;
35
41
  stopSensor(sensor: ISensor): Promise<boolean>;
@@ -16,12 +16,22 @@ const events_1 = __importDefault(require("events"));
16
16
  const gd_eventlog_1 = require("gd-eventlog");
17
17
  const sensor_factory_1 = __importDefault(require("./sensor-factory"));
18
18
  class AntInterface extends events_1.default {
19
+ static getInstance(props = {}) {
20
+ if (AntInterface._instance === undefined)
21
+ AntInterface._instance = new AntInterface(props);
22
+ return AntInterface._instance;
23
+ }
24
+ static hasInstance() {
25
+ return AntInterface._instance !== undefined;
26
+ }
19
27
  constructor(props) {
20
28
  super();
21
29
  this.props = props;
22
30
  this.device = undefined;
23
- this.isConnected = false;
24
- this.isConnecting = false;
31
+ this.connectState = {
32
+ connected: false,
33
+ connecting: false
34
+ };
25
35
  const { binding, logger } = props;
26
36
  if (logger)
27
37
  this.logger = logger;
@@ -32,13 +42,8 @@ class AntInterface extends events_1.default {
32
42
  this.Binding = binding;
33
43
  }
34
44
  }
35
- static getInstance(props = {}) {
36
- if (AntInterface._instance === undefined)
37
- AntInterface._instance = new AntInterface(props);
38
- return AntInterface._instance;
39
- }
40
- static hasInstance() {
41
- return AntInterface._instance !== undefined;
45
+ getName() {
46
+ return AntInterface.INTERFACE_NAME;
42
47
  }
43
48
  getBinding() {
44
49
  return this.Binding;
@@ -53,38 +58,42 @@ class AntInterface extends events_1.default {
53
58
  if (this.logger)
54
59
  this.logger.logEvent(event);
55
60
  }
61
+ isConnected() {
62
+ return this.connectState.connected;
63
+ }
56
64
  connect() {
57
65
  return __awaiter(this, void 0, void 0, function* () {
58
- if (this.isConnected)
66
+ if (this.isConnected())
59
67
  return true;
60
- if (!this.isConnecting) {
61
- this.isConnecting = true;
68
+ if (!this.connectState.connecting) {
69
+ this.connectState.connecting = true;
62
70
  this.logEvent({ message: 'ANT+ connecting ...' });
63
71
  try {
64
72
  const device = new this.Binding(Object.assign(Object.assign({}, this.props), { logger: this.logger }));
65
73
  const opened = yield device.open();
66
74
  if (!opened) {
67
75
  this.logEvent({ message: 'ANT+ not connected' });
68
- this.isConnecting = false;
76
+ this.connectState.connecting = false;
69
77
  return false;
70
78
  }
71
79
  this.device = device;
72
- this.isConnected = true;
73
- this.isConnecting = false;
80
+ this.connectState.connected = true;
81
+ this.connectState.connecting = false;
74
82
  this.logEvent({ message: 'ANT+ connected' });
75
83
  return true;
76
84
  }
77
85
  catch (err) {
78
- this.isConnected = false;
79
- this.isConnecting = false;
86
+ this.logEvent({ message: 'error', fn: 'connect', error: err.message, stack: err.stack });
87
+ this.connectState.connected = false;
88
+ this.connectState.connecting = false;
80
89
  return false;
81
90
  }
82
91
  }
83
92
  else {
84
93
  return new Promise(resolve => {
85
94
  setInterval(() => {
86
- if (!this.isConnecting)
87
- resolve(this.isConnected);
95
+ if (!this.connectState.connecting)
96
+ resolve(this.connectState.connected);
88
97
  }, 500);
89
98
  });
90
99
  }
@@ -94,10 +103,10 @@ class AntInterface extends events_1.default {
94
103
  return __awaiter(this, void 0, void 0, function* () {
95
104
  if (!this.device)
96
105
  return true;
97
- this.logEvent({ message: 'disconnecting ...' });
106
+ this.logEvent({ message: 'ANT+ disconnecting ...' });
98
107
  const closed = yield this.device.close();
99
- this.isConnected = !closed;
100
- this.logEvent({ message: 'disconnected' });
108
+ this.connectState.connected = !closed;
109
+ this.logEvent({ message: 'ANT+ disconnected' });
101
110
  return closed;
102
111
  });
103
112
  }
@@ -111,16 +120,11 @@ class AntInterface extends events_1.default {
111
120
  return __awaiter(this, void 0, void 0, function* () {
112
121
  this.logEvent({ message: 'starting scan ..' });
113
122
  const detected = [];
114
- if (!this.isConnected) {
115
- const connected = yield this.connect();
116
- if (!connected)
117
- return [];
118
- }
119
123
  const onDetected = (profile, deviceID) => {
120
124
  if (deviceID && detected.find(s => s.deviceID === deviceID && s.profile === profile) === undefined) {
121
125
  try {
122
- detected.push({ profile, deviceID });
123
- this.emit('detected', profile, deviceID);
126
+ detected.push({ interface: this.getName(), profile, deviceID });
127
+ this.emit('device', { interface: 'ant', profile, deviceID });
124
128
  }
125
129
  catch (err) {
126
130
  this.logEvent({ message: 'error', fn: 'onDerected', error: err.message, stack: err.stack });
@@ -129,6 +133,11 @@ class AntInterface extends events_1.default {
129
133
  };
130
134
  let channel;
131
135
  if (!this.activeScan) {
136
+ while (!this.isConnected()) {
137
+ const connected = yield this.connect();
138
+ if (!connected)
139
+ return [];
140
+ }
132
141
  channel = this.device.getChannel();
133
142
  channel.setProps({ logger: this.logger });
134
143
  if (!channel)
@@ -201,7 +210,7 @@ class AntInterface extends events_1.default {
201
210
  }
202
211
  startSensor(sensor, onDeviceData) {
203
212
  return __awaiter(this, void 0, void 0, function* () {
204
- if (!this.isConnected) {
213
+ if (!this.isConnected()) {
205
214
  const connected = yield this.connect();
206
215
  if (!connected)
207
216
  return false;
@@ -232,7 +241,7 @@ class AntInterface extends events_1.default {
232
241
  }
233
242
  stopSensor(sensor) {
234
243
  return __awaiter(this, void 0, void 0, function* () {
235
- if (!this.isConnected || !this.device)
244
+ if (!this.isConnected() || !this.device)
236
245
  return true;
237
246
  const channel = sensor.getChannel();
238
247
  if (channel) {
@@ -267,3 +276,4 @@ class AntInterface extends events_1.default {
267
276
  }
268
277
  exports.default = AntInterface;
269
278
  AntInterface._instance = undefined;
279
+ AntInterface.INTERFACE_NAME = 'ant';
@@ -2,7 +2,7 @@
2
2
  import { IAntDevice, IChannel } from 'incyclist-ant-plus';
3
3
  import { AntInterfaceProps } from './ant-interface';
4
4
  export default class AntDeviceBinding implements IAntDevice {
5
- constructor(props: AntInterfaceProps);
5
+ constructor(_props: AntInterfaceProps);
6
6
  open(): Promise<boolean>;
7
7
  close(): Promise<boolean>;
8
8
  getMaxChannels(): number;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class AntDeviceBinding {
4
- constructor(props) { }
4
+ constructor(_props) { }
5
5
  open() {
6
6
  throw new Error('Method not implemented.');
7
7
  }
@@ -0,0 +1,28 @@
1
+ import { FitnessEquipmentSensorState, ISensor, Profile } from "incyclist-ant-plus";
2
+ import { ControllableAntAdapter } from "../adapter";
3
+ import CyclingMode, { IncyclistBikeData, UpdateRequest } from '../../modes/cycling-mode';
4
+ import { AntDeviceProperties, AntDeviceSettings, LegacyProfile } from "../types";
5
+ export default class AntFEAdapter extends ControllableAntAdapter {
6
+ static INCYCLIST_PROFILE_NAME: LegacyProfile;
7
+ static ANT_PROFILE_NAME: Profile;
8
+ protected distanceInternal?: number;
9
+ protected startProps: AntDeviceProperties;
10
+ protected isReconnecting: boolean;
11
+ constructor(settings: AntDeviceSettings, props?: AntDeviceProperties);
12
+ createSensor(settings: AntDeviceSettings): ISensor;
13
+ getName(): string;
14
+ getUniqueName(): string;
15
+ getDisplayName(): string;
16
+ getSupportedCyclingModes(): Array<any>;
17
+ getDefaultCyclingMode(): CyclingMode;
18
+ getLogData(data: any, excludeList: any): any;
19
+ sendUpdate(request: UpdateRequest, forced?: boolean): Promise<void>;
20
+ onDeviceData(deviceData: FitnessEquipmentSensorState): void;
21
+ canSendUpdate(): boolean;
22
+ mapToCycleModeData(deviceData: FitnessEquipmentSensorState): IncyclistBikeData;
23
+ transformData(bikeData: IncyclistBikeData): any;
24
+ start(props?: any): Promise<any>;
25
+ setFEDefaultTimeout(): void;
26
+ reconnect(): Promise<boolean>;
27
+ setCyclingMode(mode: string | CyclingMode, settings?: any): void;
28
+ }