elero-usb-transmitter-client 1.0.6 → 1.1.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/.github/workflows/nodejs.yml +27 -0
- package/README.md +58 -1
- package/dist/UsbTransmitterClient.d.ts +18 -0
- package/dist/UsbTransmitterClient.js +284 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +277 -0
- package/dist/domain/constants.d.ts +32 -0
- package/dist/domain/constants.js +44 -0
- package/dist/domain/enums.d.ts +34 -0
- package/dist/domain/enums.js +40 -0
- package/dist/domain/types.d.ts +3 -0
- package/dist/domain/types.js +2 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +18 -0
- package/dist/model/Response.d.ts +10 -0
- package/dist/model/Response.js +2 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +277 -0
- package/jest.json +1 -1
- package/package.json +5 -2
- package/src/UsbTransmitterClient.ts +46 -39
- package/src/cli.ts +167 -0
- package/test/UsbTransmitterClient.test.ts +39 -0
- package/test/UsbTransmitterClientMock.test.ts +182 -0
- package/__test__/UsbTransmitterClient.test.ts +0 -31
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const DEFAULT_BAUDRATE = 38400;
|
|
2
|
+
export declare const DEFAULT_BYTESIZE = 8;
|
|
3
|
+
export declare const DEFAULT_PARITY = "none";
|
|
4
|
+
export declare const DEFAULT_STOPBITS = 1;
|
|
5
|
+
export declare const HEX_255: number;
|
|
6
|
+
export declare const BIT_8: number;
|
|
7
|
+
export declare const BYTE_HEADER: number;
|
|
8
|
+
export declare const BYTE_LENGTH_2: number;
|
|
9
|
+
export declare const BYTE_LENGTH_4: number;
|
|
10
|
+
export declare const BYTE_LENGTH_5: number;
|
|
11
|
+
export declare const RESPONSE_LENGTH_CHECK: number;
|
|
12
|
+
export declare const RESPONSE_LENGTH_SEND: number;
|
|
13
|
+
export declare const RESPONSE_LENGTH_INFO: number;
|
|
14
|
+
export declare const NO_SERIAL_RESPONSE: string;
|
|
15
|
+
export declare const INFO_UNKNOWN = "unknown response";
|
|
16
|
+
export declare const INFO_NO_INFORMATION = "no information";
|
|
17
|
+
export declare const INFO_TOP_POSITION_STOP = "top position stop";
|
|
18
|
+
export declare const INFO_BOTTOM_POSITION_STOP = "bottom position stop";
|
|
19
|
+
export declare const INFO_INTERMEDIATE_POSITION_STOP = "intermediate position stop";
|
|
20
|
+
export declare const INFO_TILT_VENTILATION_POS_STOP = "tilt ventilation position stop";
|
|
21
|
+
export declare const INFO_BLOCKING = "blocking";
|
|
22
|
+
export declare const INFO_OVERHEATED = "overheated";
|
|
23
|
+
export declare const INFO_TIMEOUT = "timeout";
|
|
24
|
+
export declare const INFO_START_TO_MOVE_UP = "start to move up";
|
|
25
|
+
export declare const INFO_START_TO_MOVE_DOWN = "start to move down";
|
|
26
|
+
export declare const INFO_MOVING_UP = "moving up";
|
|
27
|
+
export declare const INFO_MOVING_DOWN = "moving down";
|
|
28
|
+
export declare const INFO_STOPPED_IN_UNDEFINED_POSITION = "stopped in undefined position";
|
|
29
|
+
export declare const INFO_TOP_POS_STOP_WICH_TILT_POS = "top position stop wich is tilt position";
|
|
30
|
+
export declare const INFO_BOTTOM_POS_STOP_WICH_INT_POS = "bottom position stop wich is intermediate position";
|
|
31
|
+
export declare const INFO_SWITCHING_DEVICE_SWITCHED_OFF = "switching device switched off";
|
|
32
|
+
export declare const INFO_SWITCHING_DEVICE_SWITCHED_ON = "switching device switched on";
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INFO_SWITCHING_DEVICE_SWITCHED_ON = exports.INFO_SWITCHING_DEVICE_SWITCHED_OFF = exports.INFO_BOTTOM_POS_STOP_WICH_INT_POS = exports.INFO_TOP_POS_STOP_WICH_TILT_POS = exports.INFO_STOPPED_IN_UNDEFINED_POSITION = exports.INFO_MOVING_DOWN = exports.INFO_MOVING_UP = exports.INFO_START_TO_MOVE_DOWN = exports.INFO_START_TO_MOVE_UP = exports.INFO_TIMEOUT = exports.INFO_OVERHEATED = exports.INFO_BLOCKING = exports.INFO_TILT_VENTILATION_POS_STOP = exports.INFO_INTERMEDIATE_POSITION_STOP = exports.INFO_BOTTOM_POSITION_STOP = exports.INFO_TOP_POSITION_STOP = exports.INFO_NO_INFORMATION = exports.INFO_UNKNOWN = exports.NO_SERIAL_RESPONSE = exports.RESPONSE_LENGTH_INFO = exports.RESPONSE_LENGTH_SEND = exports.RESPONSE_LENGTH_CHECK = exports.BYTE_LENGTH_5 = exports.BYTE_LENGTH_4 = exports.BYTE_LENGTH_2 = exports.BYTE_HEADER = exports.BIT_8 = exports.HEX_255 = exports.DEFAULT_STOPBITS = exports.DEFAULT_PARITY = exports.DEFAULT_BYTESIZE = exports.DEFAULT_BAUDRATE = void 0;
|
|
4
|
+
// Default serial connection details.
|
|
5
|
+
exports.DEFAULT_BAUDRATE = 38400;
|
|
6
|
+
exports.DEFAULT_BYTESIZE = 8;
|
|
7
|
+
exports.DEFAULT_PARITY = 'none';
|
|
8
|
+
exports.DEFAULT_STOPBITS = 1;
|
|
9
|
+
// values to bit shift.
|
|
10
|
+
exports.HEX_255 = 0xff;
|
|
11
|
+
exports.BIT_8 = 8;
|
|
12
|
+
// Header for all command.
|
|
13
|
+
exports.BYTE_HEADER = 0xaa;
|
|
14
|
+
// command lengths
|
|
15
|
+
exports.BYTE_LENGTH_2 = 0x02;
|
|
16
|
+
exports.BYTE_LENGTH_4 = 0x04;
|
|
17
|
+
exports.BYTE_LENGTH_5 = 0x05;
|
|
18
|
+
// required response lenth.
|
|
19
|
+
exports.RESPONSE_LENGTH_CHECK = 6;
|
|
20
|
+
// required response lenth.
|
|
21
|
+
exports.RESPONSE_LENGTH_SEND = 7;
|
|
22
|
+
// Required response lenth.
|
|
23
|
+
exports.RESPONSE_LENGTH_INFO = 7;
|
|
24
|
+
// for Serial error handling
|
|
25
|
+
exports.NO_SERIAL_RESPONSE = '';
|
|
26
|
+
// Info to receive response.
|
|
27
|
+
exports.INFO_UNKNOWN = 'unknown response';
|
|
28
|
+
exports.INFO_NO_INFORMATION = 'no information';
|
|
29
|
+
exports.INFO_TOP_POSITION_STOP = 'top position stop';
|
|
30
|
+
exports.INFO_BOTTOM_POSITION_STOP = 'bottom position stop';
|
|
31
|
+
exports.INFO_INTERMEDIATE_POSITION_STOP = 'intermediate position stop';
|
|
32
|
+
exports.INFO_TILT_VENTILATION_POS_STOP = 'tilt ventilation position stop';
|
|
33
|
+
exports.INFO_BLOCKING = 'blocking';
|
|
34
|
+
exports.INFO_OVERHEATED = 'overheated';
|
|
35
|
+
exports.INFO_TIMEOUT = 'timeout';
|
|
36
|
+
exports.INFO_START_TO_MOVE_UP = 'start to move up';
|
|
37
|
+
exports.INFO_START_TO_MOVE_DOWN = 'start to move down';
|
|
38
|
+
exports.INFO_MOVING_UP = 'moving up';
|
|
39
|
+
exports.INFO_MOVING_DOWN = 'moving down';
|
|
40
|
+
exports.INFO_STOPPED_IN_UNDEFINED_POSITION = 'stopped in undefined position';
|
|
41
|
+
exports.INFO_TOP_POS_STOP_WICH_TILT_POS = 'top position stop wich is tilt position';
|
|
42
|
+
exports.INFO_BOTTOM_POS_STOP_WICH_INT_POS = 'bottom position stop wich is intermediate position';
|
|
43
|
+
exports.INFO_SWITCHING_DEVICE_SWITCHED_OFF = 'switching device switched off';
|
|
44
|
+
exports.INFO_SWITCHING_DEVICE_SWITCHED_ON = 'switching device switched on';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare enum ControlCommand {
|
|
2
|
+
stop = 16,
|
|
3
|
+
up = 32,
|
|
4
|
+
ventilationPosTilting = 36,
|
|
5
|
+
down = 64,
|
|
6
|
+
intermediatePos = 68
|
|
7
|
+
}
|
|
8
|
+
export declare enum EasyCommand {
|
|
9
|
+
EASY_CHECK = 74,
|
|
10
|
+
EASY_CONFIRM = 75,
|
|
11
|
+
EASY_SEND = 76,
|
|
12
|
+
EASY_ACK = 77,
|
|
13
|
+
EASY_INFO = 78
|
|
14
|
+
}
|
|
15
|
+
export declare enum InfoData {
|
|
16
|
+
INFO_UNKNOWN = -1,
|
|
17
|
+
INFO_NO_INFORMATION = 0,
|
|
18
|
+
INFO_TOP_POSITION_STOP = 1,
|
|
19
|
+
INFO_BOTTOM_POSITION_STOP = 2,
|
|
20
|
+
INFO_INTERMEDIATE_POSITION_STOP = 3,
|
|
21
|
+
INFO_TILT_VENTILATION_POS_STOP = 4,
|
|
22
|
+
INFO_BLOCKING = 5,
|
|
23
|
+
INFO_OVERHEATED = 6,
|
|
24
|
+
INFO_TIMEOUT = 7,
|
|
25
|
+
INFO_START_TO_MOVE_UP = 8,
|
|
26
|
+
INFO_START_TO_MOVE_DOWN = 9,
|
|
27
|
+
INFO_MOVING_UP = 10,
|
|
28
|
+
INFO_MOVING_DOWN = 11,
|
|
29
|
+
INFO_STOPPED_IN_UNDEFINED_POSITION = 13,
|
|
30
|
+
INFO_TOP_POS_STOP_WICH_TILT_POS = 14,
|
|
31
|
+
INFO_BOTTOM_POS_STOP_WICH_INT_POS = 15,
|
|
32
|
+
INFO_SWITCHING_DEVICE_SWITCHED_OFF = 16,
|
|
33
|
+
INFO_SWITCHING_DEVICE_SWITCHED_ON = 17
|
|
34
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InfoData = exports.EasyCommand = exports.ControlCommand = void 0;
|
|
4
|
+
var ControlCommand;
|
|
5
|
+
(function (ControlCommand) {
|
|
6
|
+
ControlCommand[ControlCommand["stop"] = 16] = "stop";
|
|
7
|
+
ControlCommand[ControlCommand["up"] = 32] = "up";
|
|
8
|
+
ControlCommand[ControlCommand["ventilationPosTilting"] = 36] = "ventilationPosTilting";
|
|
9
|
+
ControlCommand[ControlCommand["down"] = 64] = "down";
|
|
10
|
+
ControlCommand[ControlCommand["intermediatePos"] = 68] = "intermediatePos";
|
|
11
|
+
})(ControlCommand = exports.ControlCommand || (exports.ControlCommand = {}));
|
|
12
|
+
var EasyCommand;
|
|
13
|
+
(function (EasyCommand) {
|
|
14
|
+
EasyCommand[EasyCommand["EASY_CHECK"] = 74] = "EASY_CHECK";
|
|
15
|
+
EasyCommand[EasyCommand["EASY_CONFIRM"] = 75] = "EASY_CONFIRM";
|
|
16
|
+
EasyCommand[EasyCommand["EASY_SEND"] = 76] = "EASY_SEND";
|
|
17
|
+
EasyCommand[EasyCommand["EASY_ACK"] = 77] = "EASY_ACK";
|
|
18
|
+
EasyCommand[EasyCommand["EASY_INFO"] = 78] = "EASY_INFO";
|
|
19
|
+
})(EasyCommand = exports.EasyCommand || (exports.EasyCommand = {}));
|
|
20
|
+
var InfoData;
|
|
21
|
+
(function (InfoData) {
|
|
22
|
+
InfoData[InfoData["INFO_UNKNOWN"] = -1] = "INFO_UNKNOWN";
|
|
23
|
+
InfoData[InfoData["INFO_NO_INFORMATION"] = 0] = "INFO_NO_INFORMATION";
|
|
24
|
+
InfoData[InfoData["INFO_TOP_POSITION_STOP"] = 1] = "INFO_TOP_POSITION_STOP";
|
|
25
|
+
InfoData[InfoData["INFO_BOTTOM_POSITION_STOP"] = 2] = "INFO_BOTTOM_POSITION_STOP";
|
|
26
|
+
InfoData[InfoData["INFO_INTERMEDIATE_POSITION_STOP"] = 3] = "INFO_INTERMEDIATE_POSITION_STOP";
|
|
27
|
+
InfoData[InfoData["INFO_TILT_VENTILATION_POS_STOP"] = 4] = "INFO_TILT_VENTILATION_POS_STOP";
|
|
28
|
+
InfoData[InfoData["INFO_BLOCKING"] = 5] = "INFO_BLOCKING";
|
|
29
|
+
InfoData[InfoData["INFO_OVERHEATED"] = 6] = "INFO_OVERHEATED";
|
|
30
|
+
InfoData[InfoData["INFO_TIMEOUT"] = 7] = "INFO_TIMEOUT";
|
|
31
|
+
InfoData[InfoData["INFO_START_TO_MOVE_UP"] = 8] = "INFO_START_TO_MOVE_UP";
|
|
32
|
+
InfoData[InfoData["INFO_START_TO_MOVE_DOWN"] = 9] = "INFO_START_TO_MOVE_DOWN";
|
|
33
|
+
InfoData[InfoData["INFO_MOVING_UP"] = 10] = "INFO_MOVING_UP";
|
|
34
|
+
InfoData[InfoData["INFO_MOVING_DOWN"] = 11] = "INFO_MOVING_DOWN";
|
|
35
|
+
InfoData[InfoData["INFO_STOPPED_IN_UNDEFINED_POSITION"] = 13] = "INFO_STOPPED_IN_UNDEFINED_POSITION";
|
|
36
|
+
InfoData[InfoData["INFO_TOP_POS_STOP_WICH_TILT_POS"] = 14] = "INFO_TOP_POS_STOP_WICH_TILT_POS";
|
|
37
|
+
InfoData[InfoData["INFO_BOTTOM_POS_STOP_WICH_INT_POS"] = 15] = "INFO_BOTTOM_POS_STOP_WICH_INT_POS";
|
|
38
|
+
InfoData[InfoData["INFO_SWITCHING_DEVICE_SWITCHED_OFF"] = 16] = "INFO_SWITCHING_DEVICE_SWITCHED_OFF";
|
|
39
|
+
InfoData[InfoData["INFO_SWITCHING_DEVICE_SWITCHED_ON"] = 17] = "INFO_SWITCHING_DEVICE_SWITCHED_ON";
|
|
40
|
+
})(InfoData = exports.InfoData || (exports.InfoData = {}));
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
var UsbTransmitterClient_1 = require("./UsbTransmitterClient");
|
|
14
|
+
Object.defineProperty(exports, "UsbTransmitterClient", { enumerable: true, get: function () { return UsbTransmitterClient_1.UsbTransmitterClient; } });
|
|
15
|
+
__exportStar(require("./model/Response"), exports);
|
|
16
|
+
__exportStar(require("./domain/constants"), exports);
|
|
17
|
+
__exportStar(require("./domain/enums"), exports);
|
|
18
|
+
__exportStar(require("./domain/types"), exports);
|
package/dist/src/cli.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
4
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
5
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
6
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
7
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
8
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
9
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
13
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
14
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
15
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
16
|
+
function step(op) {
|
|
17
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
18
|
+
while (_) try {
|
|
19
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
20
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
21
|
+
switch (op[0]) {
|
|
22
|
+
case 0: case 1: t = op; break;
|
|
23
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
24
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
25
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
26
|
+
default:
|
|
27
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
28
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
29
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
30
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
31
|
+
if (t[2]) _.ops.pop();
|
|
32
|
+
_.trys.pop(); continue;
|
|
33
|
+
}
|
|
34
|
+
op = body.call(thisArg, _);
|
|
35
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
36
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
var commander_1 = require("commander");
|
|
41
|
+
var inquirer = require("inquirer");
|
|
42
|
+
var UsbTransmitterClient_1 = require("./UsbTransmitterClient");
|
|
43
|
+
var enums_1 = require("./domain/enums");
|
|
44
|
+
var serialport_1 = require("serialport");
|
|
45
|
+
var program = new commander_1.Command();
|
|
46
|
+
var client = null;
|
|
47
|
+
program
|
|
48
|
+
.version('1.0.0')
|
|
49
|
+
.option('-p, --port <path>', 'Path to serial port')
|
|
50
|
+
.parse(process.argv);
|
|
51
|
+
var options = program.opts();
|
|
52
|
+
function main() {
|
|
53
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
54
|
+
var portPath, ports, portChoices, answer, error_1;
|
|
55
|
+
return __generator(this, function (_a) {
|
|
56
|
+
switch (_a.label) {
|
|
57
|
+
case 0:
|
|
58
|
+
portPath = options.port;
|
|
59
|
+
if (!!portPath) return [3 /*break*/, 3];
|
|
60
|
+
return [4 /*yield*/, serialport_1.SerialPort.list()];
|
|
61
|
+
case 1:
|
|
62
|
+
ports = _a.sent();
|
|
63
|
+
portChoices = ports.map(function (p) { return ({ name: p.path + " " + (p.manufacturer || ''), value: p.path }); });
|
|
64
|
+
if (portChoices.length === 0) {
|
|
65
|
+
console.error('No serial ports found. Please specify one with --port.');
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
return [4 /*yield*/, inquirer.prompt([
|
|
69
|
+
{
|
|
70
|
+
type: 'list',
|
|
71
|
+
name: 'port',
|
|
72
|
+
message: 'Select Serial Port',
|
|
73
|
+
choices: portChoices,
|
|
74
|
+
},
|
|
75
|
+
])];
|
|
76
|
+
case 2:
|
|
77
|
+
answer = _a.sent();
|
|
78
|
+
portPath = answer.port;
|
|
79
|
+
_a.label = 3;
|
|
80
|
+
case 3:
|
|
81
|
+
client = new UsbTransmitterClient_1.UsbTransmitterClient(portPath);
|
|
82
|
+
_a.label = 4;
|
|
83
|
+
case 4:
|
|
84
|
+
_a.trys.push([4, 7, , 8]);
|
|
85
|
+
return [4 /*yield*/, client.open()];
|
|
86
|
+
case 5:
|
|
87
|
+
_a.sent();
|
|
88
|
+
console.log("Connected to " + portPath);
|
|
89
|
+
return [4 /*yield*/, mainMenu()];
|
|
90
|
+
case 6:
|
|
91
|
+
_a.sent();
|
|
92
|
+
return [3 /*break*/, 8];
|
|
93
|
+
case 7:
|
|
94
|
+
error_1 = _a.sent();
|
|
95
|
+
console.error('Error connecting to device:', error_1);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
return [3 /*break*/, 8];
|
|
98
|
+
case 8: return [2 /*return*/];
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function mainMenu() {
|
|
104
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
105
|
+
var answer, _a;
|
|
106
|
+
return __generator(this, function (_b) {
|
|
107
|
+
switch (_b.label) {
|
|
108
|
+
case 0: return [4 /*yield*/, inquirer.prompt([
|
|
109
|
+
{
|
|
110
|
+
type: 'list',
|
|
111
|
+
name: 'action',
|
|
112
|
+
message: 'Main Menu',
|
|
113
|
+
choices: [
|
|
114
|
+
{ name: 'Check Channels', value: 'check' },
|
|
115
|
+
{ name: 'Select Channel', value: 'select' },
|
|
116
|
+
new inquirer.Separator(),
|
|
117
|
+
{ name: 'Exit', value: 'exit' },
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
])];
|
|
121
|
+
case 1:
|
|
122
|
+
answer = _b.sent();
|
|
123
|
+
_a = answer.action;
|
|
124
|
+
switch (_a) {
|
|
125
|
+
case 'check': return [3 /*break*/, 2];
|
|
126
|
+
case 'select': return [3 /*break*/, 4];
|
|
127
|
+
case 'exit': return [3 /*break*/, 6];
|
|
128
|
+
}
|
|
129
|
+
return [3 /*break*/, 8];
|
|
130
|
+
case 2: return [4 /*yield*/, checkChannels()];
|
|
131
|
+
case 3:
|
|
132
|
+
_b.sent();
|
|
133
|
+
return [3 /*break*/, 8];
|
|
134
|
+
case 4: return [4 /*yield*/, selectChannel()];
|
|
135
|
+
case 5:
|
|
136
|
+
_b.sent();
|
|
137
|
+
return [3 /*break*/, 8];
|
|
138
|
+
case 6: return [4 /*yield*/, client.close()];
|
|
139
|
+
case 7:
|
|
140
|
+
_b.sent();
|
|
141
|
+
process.exit(0);
|
|
142
|
+
_b.label = 8;
|
|
143
|
+
case 8: return [2 /*return*/];
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function checkChannels() {
|
|
149
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
150
|
+
var channels, error_2;
|
|
151
|
+
return __generator(this, function (_a) {
|
|
152
|
+
switch (_a.label) {
|
|
153
|
+
case 0:
|
|
154
|
+
console.log('Checking channels...');
|
|
155
|
+
_a.label = 1;
|
|
156
|
+
case 1:
|
|
157
|
+
_a.trys.push([1, 3, , 4]);
|
|
158
|
+
return [4 /*yield*/, client.checkChannels()];
|
|
159
|
+
case 2:
|
|
160
|
+
channels = _a.sent();
|
|
161
|
+
console.log('Active Channels:', channels.join(', '));
|
|
162
|
+
return [3 /*break*/, 4];
|
|
163
|
+
case 3:
|
|
164
|
+
error_2 = _a.sent();
|
|
165
|
+
console.error('Error checking channels:', error_2);
|
|
166
|
+
return [3 /*break*/, 4];
|
|
167
|
+
case 4: return [4 /*yield*/, mainMenu()];
|
|
168
|
+
case 5:
|
|
169
|
+
_a.sent();
|
|
170
|
+
return [2 /*return*/];
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function selectChannel() {
|
|
176
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
177
|
+
var answer, channel;
|
|
178
|
+
return __generator(this, function (_a) {
|
|
179
|
+
switch (_a.label) {
|
|
180
|
+
case 0: return [4 /*yield*/, inquirer.prompt([
|
|
181
|
+
{
|
|
182
|
+
type: 'input',
|
|
183
|
+
name: 'channel',
|
|
184
|
+
message: 'Enter Channel Number (1-9):',
|
|
185
|
+
validate: function (input) {
|
|
186
|
+
var num = parseInt(input, 10);
|
|
187
|
+
if (isNaN(num) || num < 1 || num > 9) {
|
|
188
|
+
return 'Please enter a number between 1 and 9';
|
|
189
|
+
}
|
|
190
|
+
return true;
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
])];
|
|
194
|
+
case 1:
|
|
195
|
+
answer = _a.sent();
|
|
196
|
+
channel = parseInt(answer.channel, 10);
|
|
197
|
+
return [4 /*yield*/, channelMenu(channel)];
|
|
198
|
+
case 2:
|
|
199
|
+
_a.sent();
|
|
200
|
+
return [2 /*return*/];
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
function channelMenu(channel) {
|
|
206
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
207
|
+
var answer, info, cmd, response, error_3;
|
|
208
|
+
return __generator(this, function (_a) {
|
|
209
|
+
switch (_a.label) {
|
|
210
|
+
case 0: return [4 /*yield*/, inquirer.prompt([
|
|
211
|
+
{
|
|
212
|
+
type: 'list',
|
|
213
|
+
name: 'action',
|
|
214
|
+
message: "Channel " + channel + " Actions",
|
|
215
|
+
choices: [
|
|
216
|
+
{ name: 'Get Info', value: 'info' },
|
|
217
|
+
{ name: 'Move Up', value: 'up' },
|
|
218
|
+
{ name: 'Move Down', value: 'down' },
|
|
219
|
+
{ name: 'Stop', value: 'stop' },
|
|
220
|
+
new inquirer.Separator(),
|
|
221
|
+
{ name: 'Back to Main Menu', value: 'back' },
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
])];
|
|
225
|
+
case 1:
|
|
226
|
+
answer = _a.sent();
|
|
227
|
+
if (!(answer.action === 'back')) return [3 /*break*/, 3];
|
|
228
|
+
return [4 /*yield*/, mainMenu()];
|
|
229
|
+
case 2:
|
|
230
|
+
_a.sent();
|
|
231
|
+
return [2 /*return*/];
|
|
232
|
+
case 3:
|
|
233
|
+
_a.trys.push([3, 8, , 9]);
|
|
234
|
+
if (!(answer.action === 'info')) return [3 /*break*/, 5];
|
|
235
|
+
return [4 /*yield*/, client.getInfo(channel)];
|
|
236
|
+
case 4:
|
|
237
|
+
info = _a.sent();
|
|
238
|
+
console.log('Channel Info:', info);
|
|
239
|
+
return [3 /*break*/, 7];
|
|
240
|
+
case 5:
|
|
241
|
+
cmd = void 0;
|
|
242
|
+
switch (answer.action) {
|
|
243
|
+
case 'up':
|
|
244
|
+
cmd = enums_1.ControlCommand.up;
|
|
245
|
+
break;
|
|
246
|
+
case 'down':
|
|
247
|
+
cmd = enums_1.ControlCommand.down;
|
|
248
|
+
break;
|
|
249
|
+
case 'stop':
|
|
250
|
+
cmd = enums_1.ControlCommand.stop;
|
|
251
|
+
break;
|
|
252
|
+
default:
|
|
253
|
+
throw new Error('Unknown command');
|
|
254
|
+
}
|
|
255
|
+
console.log("Sending " + answer.action + " command to channel " + channel + "...");
|
|
256
|
+
return [4 /*yield*/, client.sendControlCommand(channel, cmd)];
|
|
257
|
+
case 6:
|
|
258
|
+
response = _a.sent();
|
|
259
|
+
console.log('Response:', response);
|
|
260
|
+
_a.label = 7;
|
|
261
|
+
case 7: return [3 /*break*/, 9];
|
|
262
|
+
case 8:
|
|
263
|
+
error_3 = _a.sent();
|
|
264
|
+
console.error('Error executing command:', error_3);
|
|
265
|
+
return [3 /*break*/, 9];
|
|
266
|
+
case 9: return [4 /*yield*/, channelMenu(channel)];
|
|
267
|
+
case 10:
|
|
268
|
+
_a.sent();
|
|
269
|
+
return [2 /*return*/];
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
main().catch(function (err) {
|
|
275
|
+
console.error('Unexpected error:', err);
|
|
276
|
+
process.exit(1);
|
|
277
|
+
});
|
package/jest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "elero-usb-transmitter-client",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -20,16 +20,19 @@
|
|
|
20
20
|
},
|
|
21
21
|
"homepage": "https://github.com/marc2016/elero-usb-transmitter-client#readme",
|
|
22
22
|
"devDependencies": {
|
|
23
|
+
"@types/inquirer": "^8.2.12",
|
|
23
24
|
"@types/jest": "^24.0.25",
|
|
24
25
|
"@types/lodash": "^4.14.149",
|
|
25
26
|
"@types/node": "^13.1.5",
|
|
26
27
|
"@types/serialport": "^8.0.1",
|
|
27
28
|
"@typescript-eslint/eslint-plugin": "^2.23.0",
|
|
28
29
|
"@typescript-eslint/parser": "^2.23.0",
|
|
30
|
+
"commander": "^14.0.2",
|
|
29
31
|
"eslint": "^6.8.0",
|
|
30
32
|
"eslint-config-google": "^0.14.0",
|
|
31
33
|
"eslint-config-prettier": "^6.10.1",
|
|
32
34
|
"eslint-plugin-prettier": "^3.1.2",
|
|
35
|
+
"inquirer": "^8.2.7",
|
|
33
36
|
"jest": "^24.9.0",
|
|
34
37
|
"prettier": "^2.0.2",
|
|
35
38
|
"ts-jest": "^24.2.0",
|
|
@@ -40,4 +43,4 @@
|
|
|
40
43
|
"lodash": "^4.17.15",
|
|
41
44
|
"serialport": "^13.0.0"
|
|
42
45
|
}
|
|
43
|
-
}
|
|
46
|
+
}
|
|
@@ -60,20 +60,14 @@ export class UsbTransmitterClient {
|
|
|
60
60
|
public async checkChannels(): Promise<number[]> {
|
|
61
61
|
const data = [BYTE_HEADER, BYTE_LENGTH_2, EasyCommand.EASY_CHECK]
|
|
62
62
|
const release = await mutex.acquire()
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
this.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
const response = that.parseResponse(responseBytes as Buffer)
|
|
73
|
-
release()
|
|
74
|
-
return resolve(response.activeChannels)
|
|
75
|
-
})
|
|
76
|
-
})
|
|
63
|
+
try {
|
|
64
|
+
await this.sendCommand(data)
|
|
65
|
+
const responseBytes = await this.waitForResponse(RESPONSE_LENGTH_CHECK)
|
|
66
|
+
const response = this.parseResponse(responseBytes)
|
|
67
|
+
return response.activeChannels
|
|
68
|
+
} finally {
|
|
69
|
+
release()
|
|
70
|
+
}
|
|
77
71
|
}
|
|
78
72
|
|
|
79
73
|
public async getInfo(channel: number): Promise<Response> {
|
|
@@ -88,20 +82,14 @@ export class UsbTransmitterClient {
|
|
|
88
82
|
lowChannels,
|
|
89
83
|
]
|
|
90
84
|
const release = await mutex.acquire()
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
this.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
const response = that.parseResponse(responseBytes as Buffer)
|
|
101
|
-
release()
|
|
102
|
-
return resolve(response)
|
|
103
|
-
})
|
|
104
|
-
})
|
|
85
|
+
try {
|
|
86
|
+
await this.sendCommand(data)
|
|
87
|
+
const responseBytes = await this.waitForResponse(RESPONSE_LENGTH_INFO)
|
|
88
|
+
const response = this.parseResponse(responseBytes)
|
|
89
|
+
return response
|
|
90
|
+
} finally {
|
|
91
|
+
release()
|
|
92
|
+
}
|
|
105
93
|
}
|
|
106
94
|
|
|
107
95
|
public async sendControlCommand(
|
|
@@ -120,19 +108,38 @@ export class UsbTransmitterClient {
|
|
|
120
108
|
controlCommand,
|
|
121
109
|
]
|
|
122
110
|
const release = await mutex.acquire()
|
|
123
|
-
|
|
111
|
+
try {
|
|
112
|
+
await this.sendCommand(data)
|
|
113
|
+
const responseBytes = await this.waitForResponse(RESPONSE_LENGTH_INFO)
|
|
114
|
+
const response = this.parseResponse(responseBytes)
|
|
115
|
+
return response
|
|
116
|
+
} finally {
|
|
117
|
+
release()
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private waitForResponse(length: number): Promise<Buffer> {
|
|
124
122
|
return new Promise((resolve, reject) => {
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
123
|
+
const timeout = setTimeout(() => {
|
|
124
|
+
cleanup()
|
|
125
|
+
reject(new Error('Timeout waiting for response'))
|
|
126
|
+
}, 2000)
|
|
127
|
+
|
|
128
|
+
const tryRead = () => {
|
|
129
|
+
const buffer = this.serialPort.read(length)
|
|
130
|
+
if (buffer) {
|
|
131
|
+
cleanup()
|
|
132
|
+
resolve(buffer)
|
|
131
133
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const cleanup = () => {
|
|
137
|
+
clearTimeout(timeout)
|
|
138
|
+
this.serialPort.removeListener('readable', tryRead)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
this.serialPort.on('readable', tryRead)
|
|
142
|
+
tryRead()
|
|
136
143
|
})
|
|
137
144
|
}
|
|
138
145
|
|