26 Commits

Author SHA1 Message Date
László Monda
e294727ac5 Bump Agent version to 1.2.1 and update the changelog. 2018-05-12 11:26:41 +02:00
László Monda
f29d64c803 Rename kbootKommandName to kbootCommandName. 2018-05-09 02:16:38 +02:00
László Monda
0385b0ce29 Simply write that the list of available devices is unchanged instead of always listing the devices. 2018-05-09 01:32:55 +02:00
László Monda
b526274cd7 Upgrade to firmware 8.2.2 2018-05-09 00:38:48 +02:00
László Monda
88c16af4a9 Merge branch 'master' of github.com:UltimateHackingKeyboard/agent 2018-05-08 17:17:36 +02:00
László Monda
05ac9a6832 Clarify the content of the tooltop regarding non-US characters. 2018-05-08 17:17:04 +02:00
Kristian Sloth Lauszus
04aa5236c2 The usage page and usage number was changed in 6f0b1adc14 (#630) 2018-05-06 21:38:40 +02:00
László Monda
ec98e4e1c6 Rephrase and add explanations about the macro engine not being ready yet. 2018-05-06 03:24:54 +02:00
László Monda
bb9ece494c Update README.md 2018-05-05 21:55:52 +02:00
László Monda
217e6776ac Add changelog entry that I forgot to add. 2018-05-03 01:38:40 +02:00
László Monda
2286218980 Make long media key macro actions work. (#621)
* Make long media key macro actions work.

* fix: macro key action mapping
2018-05-03 00:28:35 +02:00
Róbert Kiss
3d9c83f9f4 build: check node version before build (#625)
* build: check node version before build

* use package.json engine section
2018-05-01 22:50:28 +02:00
Róbert Kiss
14ed163238 chore: npm run clean delete root node_modules and dist folders (#624) 2018-05-01 22:46:23 +02:00
László Monda
c815de0718 Edit phrasing: "... layer by *tapping* this key" 2018-05-01 03:20:44 +02:00
László Monda
6a46556d9e Make get-right-firmware-version.js display not only firmware version but also device protocol version, module protocol version, user config version and hardware config version. 2018-05-01 02:31:17 +02:00
krokofant
f8f820529f Resolve #553 (#614) 2018-04-29 21:32:33 +02:00
László Monda
cac11155e7 Update firmware version to 8.2.0 2018-04-20 10:04:21 +02:00
László Monda
d20870f11e Update firmware version and default mouse speed. 2018-04-20 09:49:27 +02:00
László Monda
10ceb6c79d Merge branch 'master' of github.com:UltimateHackingKeyboard/agent 2018-04-20 09:19:58 +02:00
Róbert Kiss
b38b6fa294 build: fix nouislider conflict in webpack conflict (#611)
* build: fix nouislider conflict in webpack conflict and upgrade nouislider

* use package import instead of sub file
2018-04-20 09:19:10 +02:00
László Monda
94c1d35429 Merge branch 'master' of github.com:UltimateHackingKeyboard/agent 2018-04-19 22:31:25 +02:00
László Monda
e33cef4e89 Update README. Fix #609 2018-04-13 19:32:20 +02:00
Róbert Kiss
9b815ed9c1 chore: upgrade angular to 5.3.9 and typescript to 2.6.2 (#605)
* chore: upgrade angular to 5.3.9 and typescript to 2.6.2

* fix electron renderer build

* fix webpack config

* format webpack.config

* fix renderer build
2018-04-10 19:52:58 +02:00
László Monda
1d4bb6113c Bump version to 1.1.5 in package.json and update the changelog. 2018-04-10 11:42:34 +02:00
Róbert Kiss
136120b831 feat: not allow run multiple Agent (#603) 2018-04-09 21:09:09 +02:00
Róbert Kiss
cd299c06d6 feat: not allow run multiple Agent (#604) 2018-04-09 20:48:22 +02:00
32 changed files with 5433 additions and 4010 deletions

View File

@@ -6,6 +6,28 @@ The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1
Every Agent version includes the most recent firmware version. See the [firmware changelog](https://github.com/UltimateHackingKeyboard/firmware/blob/master/CHANGELOG.md). Every Agent version includes the most recent firmware version. See the [firmware changelog](https://github.com/UltimateHackingKeyboard/firmware/blob/master/CHANGELOG.md).
## [1.2.1] - 2018-05-12
Firmware: 8.2.**2** [[release](https://github.com/UltimateHackingKeyboard/firmware/releases/tag/v8.2.2)] | Device Protocol: 4.3.0| User Config: 4.0.**1** | Hardware Config: 1.0.0
- Match for the new USB usage page and usage number. This is critical for UHKs flashed with firmware >=8.2.2 to be recognized by Agent on OSX.
- Make the config serializer handle long media macro actions. `USERCONFIG:PATCH`
- Add note on the macro page explaining that the macro engine of the firmware is not ready yet.
- Add an example to the scancode tooltip to better explain users how to invoke non-US characters.
## [1.2.0] - 2018-04-20
Firmware: 8.**2.0** [[release](https://github.com/UltimateHackingKeyboard/firmware/releases/tag/v8.2.0)] | Device Protocol: 4.**3.0** | User Config: 4.0.0 | Hardware Config: 1.0.0
- Tweak the default mouse speed. This was necessary because the last firmware version adjusted speed multipliers. The mouse speed can be reset via the "Reset speeds to default" button of the "Mouse speed" page.
- Make the newly added switch-keymap.js script utilize the new UsbCommandId_SwitchKeymap, allowing for programmatic keymap switching. `DEVICEPROTOCOL:MINOR`
## [1.1.5] - 2018-04-10
Firmware: 8.1.5 [[release](https://github.com/UltimateHackingKeyboard/firmware/releases/tag/v8.1.5)] | Device Protocol: 4.2.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Don't allow to run multiple instances of Agent at the same time, but rather focus the already existing Agent window.
## [1.1.4] - 2018-04-09 ## [1.1.4] - 2018-04-09
Firmware: 8.1.5 [[release](https://github.com/UltimateHackingKeyboard/firmware/releases/tag/v8.1.5)] | Device Protocol: 4.2.0 | User Config: 4.0.0 | Hardware Config: 1.0.0 Firmware: 8.1.5 [[release](https://github.com/UltimateHackingKeyboard/firmware/releases/tag/v8.1.5)] | Device Protocol: 4.2.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
@@ -50,7 +72,7 @@ Firmware: 8.1.**2** [[release](https://github.com/UltimateHackingKeyboard/firmwa
## [1.1.0] - 2018-01-15 ## [1.1.0] - 2018-01-15
Firmware: 8.**1**.0 [[release](https://github.com/UltimateHackingKeyboard/firmware/releases/tag/v8.1.0)] | Device Protocol: 4.2.0 | User Config: 4.0.0 | Hardware Config: 1.0.0 Firmware: 8.**1**.0 [[release](https://github.com/UltimateHackingKeyboard/firmware/releases/tag/v8.1.0)] | Device Protocol: 4.**2.0** | User Config: 4.0.0 | Hardware Config: 1.0.0
- Only accept device, keymap, and macro names upon editing if their trimmed length is non-zero. - Only accept device, keymap, and macro names upon editing if their trimmed length is non-zero.
- Add diagnostics USB scripts, most notably /packages/usb/{get-i2c-health,set-i2c-baud-rate}.js, some utilizing new device protocol commands and properties. `DEVICEPROTOCOL:MINOR` - Add diagnostics USB scripts, most notably /packages/usb/{get-i2c-health,set-i2c-baud-rate}.js, some utilizing new device protocol commands and properties. `DEVICEPROTOCOL:MINOR`

View File

@@ -5,17 +5,8 @@
Agent is the configuration application of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/). Agent is the configuration application of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
[Give it a whirl!](http://ultimatehackingkeyboard.github.io/agent/) * Try out the [web build of Agent](http://ultimatehackingkeyboard.github.io/agent/) in your browser. This is meant to be used for demonstration purposes.
* Download the [desktop build of Agent](https://github.com/UltimateHackingKeyboard/agent/releases) from our releases page. Use this if you have an actual UHK at hand, or else you won't get past the opening screen!
## Two builds to rule them all
It's worth mentioning that Agent has two builds.
The **electron build** is the desktop application which is meant to be used if you have an actual UHK at hand. It starts with an opening screen which detects your UHK. You cannot get past this screen without connecting a UHK via USB.
The **web build** is meant to be used for demonstration purposes, so people who don't yet own a UHK can get a feel of Agent and its capabilities in their browser. Eventually, WebUSB support will be added to the web build, making it able to communicate with the UHK. Given the sandboxed nature of browsers, the web build will always lack features that the electron build offers, so this won't make the electron build obsolete.
The two builds share code as much as possible.
## Building the electron application ## Building the electron application
@@ -33,9 +24,9 @@ For everyone else, use the appropriate package manager for your OS.
``` ```
git clone git@github.com:UltimateHackingKeyboard/agent.git git clone git@github.com:UltimateHackingKeyboard/agent.git
cd agent cd agent
npm install # to install Node dependencies npm install
npm run build:electron # to build the agent npm run build
npm run electron # to run the newly built agent npm run electron
``` ```
At this point, Agent should be running on your machine. At this point, Agent should be running on your machine.

2415
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,10 +3,10 @@
"private": true, "private": true,
"author": "Ultimate Gadget Laboratories", "author": "Ultimate Gadget Laboratories",
"main": "electron/dist/electron-main.js", "main": "electron/dist/electron-main.js",
"version": "1.1.4", "version": "1.2.1",
"firmwareVersion": "8.1.5", "firmwareVersion": "8.2.2",
"deviceProtocolVersion": "4.2.0", "deviceProtocolVersion": "4.3.0",
"userConfigVersion": "4.0.0", "userConfigVersion": "4.0.1",
"hardwareConfigVersion": "1.0.0", "hardwareConfigVersion": "1.0.0",
"description": "Agent is the configuration application of the Ultimate Hacking Keyboard.", "description": "Agent is the configuration application of the Ultimate Hacking Keyboard.",
"repository": { "repository": {
@@ -23,6 +23,7 @@
"@types/electron-settings": "3.0.0", "@types/electron-settings": "3.0.0",
"@types/fs-extra": "5.0.1", "@types/fs-extra": "5.0.1",
"@types/jasmine": "2.6.0", "@types/jasmine": "2.6.0",
"@types/jquery": "3.3.1",
"@types/jsonfile": "4.0.1", "@types/jsonfile": "4.0.1",
"@types/node": "8.0.53", "@types/node": "8.0.53",
"@types/node-hid": "0.5.2", "@types/node-hid": "0.5.2",
@@ -30,8 +31,9 @@
"@types/usb": "1.1.3", "@types/usb": "1.1.3",
"autoprefixer": "6.5.3", "autoprefixer": "6.5.3",
"buffer": "5.0.6", "buffer": "5.0.6",
"copyfiles": "^2.0.0", "check-node-version": "^3.2.0",
"copy-webpack-plugin": "4.0.1", "copy-webpack-plugin": "4.0.1",
"copyfiles": "^2.0.0",
"core-js": "2.4.1", "core-js": "2.4.1",
"cross-env": "5.0.5", "cross-env": "5.0.5",
"decompress": "4.2.0", "decompress": "4.2.0",
@@ -48,6 +50,7 @@
"exports-loader": "0.6.3", "exports-loader": "0.6.3",
"file-loader": "0.10.0", "file-loader": "0.10.0",
"fs-extra": "5.0.0", "fs-extra": "5.0.0",
"gh-pages": "1.1.0",
"jsonfile": "4.0.0", "jsonfile": "4.0.0",
"lerna": "2.9.0", "lerna": "2.9.0",
"mkdirp": "0.5.1", "mkdirp": "0.5.1",
@@ -62,8 +65,8 @@
"ts-loader": "2.3.1", "ts-loader": "2.3.1",
"ts-node": "3.0.4", "ts-node": "3.0.4",
"tslint": "5.9.1", "tslint": "5.9.1",
"typescript": "2.5.2", "typescript": "2.6.2",
"webpack": "2.4.1" "webpack": "3.10.0"
}, },
"pre-commit": [ "pre-commit": [
"precommit-msg" "precommit-msg"
@@ -83,6 +86,7 @@
"lint:ts:test-serializer": "tslint --project ./packages/test-serializer/tsconfig.json", "lint:ts:test-serializer": "tslint --project ./packages/test-serializer/tsconfig.json",
"lint:ts:uhk-usb": "tslint --project ./packages/uhk-usb/tsconfig.json", "lint:ts:uhk-usb": "tslint --project ./packages/uhk-usb/tsconfig.json",
"lint:style": "stylelint \"packages/uhk-agent/src/**/*.scss\" \"packages/uhk-web/src/**/*.scss\" --syntax scss", "lint:style": "stylelint \"packages/uhk-agent/src/**/*.scss\" \"packages/uhk-web/src/**/*.scss\" --syntax scss",
"prebuild": "check-node-version --package",
"build": "run-s build:common build:usb build:web build:electron", "build": "run-s build:common build:usb build:web build:electron",
"build:web": "lerna exec --scope uhk-web npm run build", "build:web": "lerna exec --scope uhk-web npm run build",
"build:electron": "cross-env AOT_BUILD=true run-s -sn build:electron:renderer build:electron:main", "build:electron": "cross-env AOT_BUILD=true run-s -sn build:electron:renderer build:electron:main",
@@ -98,7 +102,9 @@
"pack": "node ./scripts/release.js", "pack": "node ./scripts/release.js",
"sprites": "node ./scripts/generate-svg-sprites", "sprites": "node ./scripts/generate-svg-sprites",
"release": "node ./scripts/release.js", "release": "node ./scripts/release.js",
"clean": "lerna exec rimraf ./node_modules ./dist" "clean": "lerna exec rimraf ./node_modules ./dist && rimraf ./node_modules ./dist",
"predeploy-gh-pages": "run-s build:web",
"deploy-gh-pages": "gh-pages -d packages/uhk-web/dist"
}, },
"dependencies": {} "dependencies": {}
} }

View File

@@ -60,7 +60,25 @@ if (console.debug) {
}; };
} }
const isSecondInstance = app.makeSingleInstance(function (commandLine, workingDirectory) {
// Someone tried to run a second instance, we should focus our window.
if (win) {
if (win.isMinimized()) {
win.restore();
}
win.focus();
}
});
if (isSecondInstance) {
app.quit();
}
function createWindow() { function createWindow() {
if (isSecondInstance) {
return;
}
logger.info('[Electron Main] Create new window.'); logger.info('[Electron Main] Create new window.');
let packagesDir; let packagesDir;
if (isDev) { if (isDev) {
@@ -133,13 +151,13 @@ app.on('ready', createWindow);
// Quit when all windows are closed. // Quit when all windows are closed.
app.on('window-all-closed', () => { app.on('window-all-closed', () => {
app.quit();
});
app.on('will-quit', () => {
if (appUpdateService) { if (appUpdateService) {
appUpdateService.saveFirtsRun(); appUpdateService.saveFirtsRun();
} }
app.exit();
});
app.on('will-quit', () => {
}); });
app.on('activate', () => { app.on('activate', () => {

View File

@@ -18,11 +18,11 @@
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
}, },
"ansi-styles": { "ansi-styles": {
"version": "3.2.0", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": { "requires": {
"color-convert": "1.9.0" "color-convert": "1.9.1"
} }
}, },
"arrify": { "arrify": {
@@ -36,9 +36,9 @@
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.8", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": { "requires": {
"balanced-match": "1.0.0", "balanced-match": "1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@@ -55,13 +55,13 @@
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
}, },
"chalk": { "chalk": {
"version": "2.1.0", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
"integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
"requires": { "requires": {
"ansi-styles": "3.2.0", "ansi-styles": "3.2.1",
"escape-string-regexp": "1.0.5", "escape-string-regexp": "1.0.5",
"supports-color": "4.4.0" "supports-color": "5.3.0"
} }
}, },
"cliui": { "cliui": {
@@ -100,9 +100,9 @@
} }
}, },
"color-convert": { "color-convert": {
"version": "1.9.0", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
"integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
"requires": { "requires": {
"color-name": "1.1.3" "color-name": "1.1.3"
} }
@@ -122,15 +122,15 @@
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
"requires": { "requires": {
"lru-cache": "4.1.1", "lru-cache": "4.1.2",
"shebang-command": "1.2.0", "shebang-command": "1.2.0",
"which": "1.3.0" "which": "1.3.0"
}, },
"dependencies": { "dependencies": {
"lru-cache": { "lru-cache": {
"version": "4.1.1", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
"integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
"requires": { "requires": {
"pseudomap": "1.0.2", "pseudomap": "1.0.2",
"yallist": "2.1.2" "yallist": "2.1.2"
@@ -144,9 +144,9 @@
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
}, },
"diff": { "diff": {
"version": "3.4.0", "version": "3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
"integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
}, },
"error-ex": { "error-ex": {
"version": "1.3.1", "version": "1.3.1",
@@ -271,9 +271,9 @@
"integrity": "sha1-3i1mE20ALhErpw8/EMMc98NQsto=" "integrity": "sha1-3i1mE20ALhErpw8/EMMc98NQsto="
}, },
"has-flag": { "has-flag": {
"version": "2.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
}, },
"homedir-polyfill": { "homedir-polyfill": {
"version": "1.0.1", "version": "1.0.1",
@@ -284,9 +284,9 @@
} }
}, },
"hosted-git-info": { "hosted-git-info": {
"version": "2.5.0", "version": "2.6.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
"integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
}, },
"inflight": { "inflight": {
"version": "1.0.6", "version": "1.0.6",
@@ -382,7 +382,7 @@
"requires": { "requires": {
"jasmine": "2.8.0", "jasmine": "2.8.0",
"ts-node": "3.3.0", "ts-node": "3.3.0",
"typescript": "2.5.3", "typescript": "2.8.1",
"yargs": "8.0.2" "yargs": "8.0.2"
} }
}, },
@@ -432,29 +432,29 @@
"integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI="
}, },
"make-error": { "make-error": {
"version": "1.3.0", "version": "1.3.4",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz",
"integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=" "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g=="
}, },
"mem": { "mem": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
"integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
"requires": { "requires": {
"mimic-fn": "1.1.0" "mimic-fn": "1.2.0"
} }
}, },
"mimic-fn": { "mimic-fn": {
"version": "1.1.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
}, },
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": { "requires": {
"brace-expansion": "1.1.8" "brace-expansion": "1.1.11"
} }
}, },
"minimist": { "minimist": {
@@ -472,10 +472,10 @@
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
"integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"requires": { "requires": {
"hosted-git-info": "2.5.0", "hosted-git-info": "2.6.0",
"is-builtin-module": "1.0.0", "is-builtin-module": "1.0.0",
"semver": "5.4.1", "semver": "5.5.0",
"validate-npm-package-license": "3.0.1" "validate-npm-package-license": "3.0.3"
} }
}, },
"npm-run-path": { "npm-run-path": {
@@ -1942,18 +1942,26 @@
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
}, },
"p-limit": { "p-limit": {
"version": "1.1.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
"integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
"requires": {
"p-try": "1.0.0"
}
}, },
"p-locate": { "p-locate": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
"requires": { "requires": {
"p-limit": "1.1.0" "p-limit": "1.2.0"
} }
}, },
"p-try": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
},
"parse-json": { "parse-json": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@@ -2030,9 +2038,9 @@
"integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
}, },
"semver": { "semver": {
"version": "5.4.1", "version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
"integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
}, },
"set-blocking": { "set-blocking": {
"version": "2.0.0", "version": "2.0.0",
@@ -2076,22 +2084,32 @@
} }
}, },
"spdx-correct": { "spdx-correct": {
"version": "1.0.2", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
"integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
"requires": { "requires": {
"spdx-license-ids": "1.2.2" "spdx-expression-parse": "3.0.0",
"spdx-license-ids": "3.0.0"
} }
}, },
"spdx-exceptions": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
"integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
},
"spdx-expression-parse": { "spdx-expression-parse": {
"version": "1.0.4", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
"integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
"requires": {
"spdx-exceptions": "2.1.0",
"spdx-license-ids": "3.0.0"
}
}, },
"spdx-license-ids": { "spdx-license-ids": {
"version": "1.2.2", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
"integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
}, },
"string-width": { "string-width": {
"version": "2.1.1", "version": "2.1.1",
@@ -2146,11 +2164,11 @@
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
}, },
"supports-color": { "supports-color": {
"version": "4.4.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
"requires": { "requires": {
"has-flag": "2.0.0" "has-flag": "3.0.0"
} }
}, },
"ts-node": { "ts-node": {
@@ -2159,14 +2177,14 @@
"integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=",
"requires": { "requires": {
"arrify": "1.0.1", "arrify": "1.0.1",
"chalk": "2.1.0", "chalk": "2.3.2",
"diff": "3.4.0", "diff": "3.5.0",
"make-error": "1.3.0", "make-error": "1.3.4",
"minimist": "1.2.0", "minimist": "1.2.0",
"mkdirp": "0.5.1", "mkdirp": "0.5.1",
"source-map-support": "0.4.18", "source-map-support": "0.4.18",
"tsconfig": "6.0.0", "tsconfig": "6.0.0",
"v8flags": "3.0.1", "v8flags": "3.0.2",
"yn": "2.0.0" "yn": "2.0.0"
}, },
"dependencies": { "dependencies": {
@@ -2202,9 +2220,9 @@
} }
}, },
"typescript": { "typescript": {
"version": "2.5.3", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz",
"integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==" "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg=="
}, },
"underscore": { "underscore": {
"version": "1.6.0", "version": "1.6.0",
@@ -2212,20 +2230,20 @@
"integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag="
}, },
"v8flags": { "v8flags": {
"version": "3.0.1", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz",
"integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==",
"requires": { "requires": {
"homedir-polyfill": "1.0.1" "homedir-polyfill": "1.0.1"
} }
}, },
"validate-npm-package-license": { "validate-npm-package-license": {
"version": "3.0.1", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
"integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
"requires": { "requires": {
"spdx-correct": "1.0.2", "spdx-correct": "3.0.0",
"spdx-expression-parse": "1.0.4" "spdx-expression-parse": "3.0.0"
} }
}, },
"walkdir": { "walkdir": {

View File

@@ -3,7 +3,8 @@
"private": true, "private": true,
"version": "1.0.0", "version": "1.0.0",
"description": "Common Library contains the common code for uhk-agent (electron-main) and web (electron-renderer) modules", "description": "Common Library contains the common code for uhk-agent (electron-main) and web (electron-renderer) modules",
"main": "dist/index.js", "main": "dist/src/index.js",
"types": "dist/src/index.d.ts",
"author": "Ultimate Gadget Laboratories", "author": "Ultimate Gadget Laboratories",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@@ -13,7 +13,7 @@ export enum KeystrokeActionFlag {
const KEYSTROKE_ACTION_FLAG_LENGTH = 3; const KEYSTROKE_ACTION_FLAG_LENGTH = 3;
interface JsonObjectKeystrokeAction { export interface JsonObjectKeystrokeAction {
keyActionType: string; keyActionType: string;
scancode?: number; scancode?: number;
modifierMask?: number; modifierMask?: number;

View File

@@ -1,10 +1,10 @@
import { assertEnum, assertUInt8 } from '../../assert'; import { assertEnum, assertUInt8, assertUInt16 } from '../../assert';
import { UhkBuffer } from '../../uhk-buffer'; import { UhkBuffer } from '../../uhk-buffer';
import { KeyModifiers } from '../key-modifiers'; import { KeyModifiers } from '../key-modifiers';
import { MacroAction, MacroActionId, MacroKeySubAction, macroActionType } from './macro-action'; import { MacroAction, MacroActionId, MacroKeySubAction, macroActionType } from './macro-action';
import { KeystrokeType } from '../key-action'; import { KeystrokeType } from '../key-action';
interface JsObjectKeyMacroAction { export interface JsObjectKeyMacroAction {
macroActionType: string; macroActionType: string;
action: string; action: string;
type?: string; type?: string;
@@ -20,12 +20,24 @@ export class KeyMacroAction extends MacroAction {
@assertEnum(KeystrokeType) @assertEnum(KeystrokeType)
type: KeystrokeType; type: KeystrokeType;
@assertUInt8
scancode: number;
@assertUInt8 @assertUInt8
modifierMask: number; modifierMask: number;
@assertUInt16
private _scancode: number;
set scancode(scancode: number) {
this._scancode = scancode;
if (this.type !== KeystrokeType.shortMedia && this.type !== KeystrokeType.longMedia) {
return;
}
this.type = scancode < 256 ? KeystrokeType.shortMedia : KeystrokeType.longMedia;
}
get scancode() {
return this._scancode;
}
constructor(other?: KeyMacroAction) { constructor(other?: KeyMacroAction) {
super(); super();
if (!other) { if (!other) {
@@ -33,7 +45,7 @@ export class KeyMacroAction extends MacroAction {
} }
this.action = other.action; this.action = other.action;
this.type = other.type; this.type = other.type;
this.scancode = other.scancode; this._scancode = other._scancode;
this.modifierMask = other.modifierMask; this.modifierMask = other.modifierMask;
} }
@@ -45,7 +57,7 @@ export class KeyMacroAction extends MacroAction {
} else { } else {
this.type = KeystrokeType[jsObject.type]; this.type = KeystrokeType[jsObject.type];
} }
this.scancode = jsObject.scancode; this._scancode = jsObject.scancode;
this.modifierMask = jsObject.modifierMask; this.modifierMask = jsObject.modifierMask;
return this; return this;
} }
@@ -58,7 +70,7 @@ export class KeyMacroAction extends MacroAction {
this.type = keyMacroType & 0b11; this.type = keyMacroType & 0b11;
keyMacroType >>= 2; keyMacroType >>= 2;
if (keyMacroType & 0b10) { if (keyMacroType & 0b10) {
this.scancode = buffer.readUInt8(); this._scancode = this.type === KeystrokeType.longMedia ? buffer.readUInt16() : buffer.readUInt8();
} }
if (keyMacroType & 0b01) { if (keyMacroType & 0b01) {
this.modifierMask = buffer.readUInt8(); this.modifierMask = buffer.readUInt8();
@@ -78,7 +90,7 @@ export class KeyMacroAction extends MacroAction {
} else { } else {
jsObject.type = KeystrokeType[this.type]; jsObject.type = KeystrokeType[this.type];
} }
jsObject.scancode = this.scancode; jsObject.scancode = this._scancode;
} }
if (this.hasModifiers()) { if (this.hasModifiers()) {
@@ -98,7 +110,11 @@ export class KeyMacroAction extends MacroAction {
buffer.writeUInt8(keyMacroType); buffer.writeUInt8(keyMacroType);
if (this.hasScancode()) { if (this.hasScancode()) {
buffer.writeUInt8(this.scancode); if (this.type === KeystrokeType.longMedia) {
buffer.writeUInt16(this.scancode);
} else {
buffer.writeUInt8(this.scancode);
}
} }
if (this.hasModifiers()) { if (this.hasModifiers()) {
buffer.writeUInt8(this.modifierMask); buffer.writeUInt8(this.modifierMask);
@@ -106,7 +122,7 @@ export class KeyMacroAction extends MacroAction {
} }
toString(): string { toString(): string {
return `<KeyMacroAction action="${this.action}" scancode="${this.scancode}" modifierMask="${this.modifierMask}">`; return `<KeyMacroAction action="${this.action}" scancode="${this._scancode}" modifierMask="${this.modifierMask}">`;
} }
isModifierActive(modifier: KeyModifiers): boolean { isModifierActive(modifier: KeyModifiers): boolean {
@@ -114,7 +130,7 @@ export class KeyMacroAction extends MacroAction {
} }
hasScancode(): boolean { hasScancode(): boolean {
return !!this.scancode; return !!this._scancode;
} }
hasModifiers(): boolean { hasModifiers(): boolean {

View File

@@ -8,7 +8,7 @@ export enum MouseButtons {
Right = 1 << 2 Right = 1 << 2
} }
interface JsObjectMouseButtonMacroAction { export interface JsObjectMouseButtonMacroAction {
macroActionType: string; macroActionType: string;
action: string; action: string;
mouseButtonsMask?: number; mouseButtonsMask?: number;

View File

@@ -1,4 +1,4 @@
import { HardwareConfiguration, UhkBuffer, UserConfiguration } from '../../index'; import { HardwareConfiguration, UhkBuffer, UserConfiguration } from '../config-serializer';
export const getHardwareConfigFromDeviceResponse = (json: string): HardwareConfiguration => { export const getHardwareConfigFromDeviceResponse = (json: string): HardwareConfiguration => {
const data = JSON.parse(json); const data = JSON.parse(json);

View File

@@ -1,4 +1,4 @@
class App { export class App {
public static readonly appStarted = 'app-started'; public static readonly appStarted = 'app-started';
public static readonly getAppStartInfo = 'app-get-start-info'; public static readonly getAppStartInfo = 'app-get-start-info';
public static readonly getAppStartInfoReply = 'app-get-start-info-reply'; public static readonly getAppStartInfoReply = 'app-get-start-info-reply';
@@ -6,7 +6,7 @@ class App {
public static readonly openUrl = 'open-url'; public static readonly openUrl = 'open-url';
} }
class AutoUpdate { export class AutoUpdate {
public static readonly checkingForUpdate = 'checking-for-update'; public static readonly checkingForUpdate = 'checking-for-update';
public static readonly updateAvailable = 'update-available'; public static readonly updateAvailable = 'update-available';
public static readonly updateNotAvailable = 'update-not-available'; public static readonly updateNotAvailable = 'update-not-available';
@@ -18,7 +18,7 @@ class AutoUpdate {
public static readonly checkForUpdateNotAvailable = 'check-for-update-not-available'; public static readonly checkForUpdateNotAvailable = 'check-for-update-not-available';
} }
class Device { export class Device {
public static readonly setPrivilegeOnLinux = 'set-privilege-on-linux'; public static readonly setPrivilegeOnLinux = 'set-privilege-on-linux';
public static readonly setPrivilegeOnLinuxReply = 'set-privilege-on-linux-reply'; public static readonly setPrivilegeOnLinuxReply = 'set-privilege-on-linux-reply';
public static readonly deviceConnectionStateChanged = 'device-connection-state-changed'; public static readonly deviceConnectionStateChanged = 'device-connection-state-changed';

View File

@@ -3,7 +3,7 @@
"compilerOptions": { "compilerOptions": {
"sourceMap": true, "sourceMap": true,
"outDir": "./dist", "outDir": "./dist",
"declaration": false, "declaration": true,
"module": "commonjs", "module": "commonjs",
"moduleResolution": "node", "moduleResolution": "node",
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,

View File

@@ -1,11 +1,14 @@
{ {
"requires": true, "name": "uhk-usb",
"version": "1.0.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true,
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
"version": "8.0.28", "version": "8.0.28",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.28.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.28.tgz",
"integrity": "sha512-HupkFXEv3O3KSzcr3Ylfajg0kaerBg1DyaZzRBBQfrU3NN1mTBRE7sCveqHwXLS5Yrjvww8qFzkzYQQakG9FuQ==" "integrity": "sha512-HupkFXEv3O3KSzcr3Ylfajg0kaerBg1DyaZzRBBQfrU3NN1mTBRE7sCveqHwXLS5Yrjvww8qFzkzYQQakG9FuQ==",
"dev": true
}, },
"ansi-regex": { "ansi-regex": {
"version": "2.1.1", "version": "2.1.1",
@@ -144,6 +147,11 @@
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
}, },
"lodash-es": {
"version": "4.17.10",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz",
"integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg=="
},
"mimic-response": { "mimic-response": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz",

View File

@@ -11,6 +11,7 @@
"@types/node": "8.0.28" "@types/node": "8.0.28"
}, },
"dependencies": { "dependencies": {
"lodash-es": "^4.17.10",
"node-hid": "0.5.7", "node-hid": "0.5.7",
"uhk-common": "1.0.0" "uhk-common": "1.0.0"
} }

View File

@@ -1,3 +1,4 @@
import { cloneDeep, isEqual } from 'lodash-es';
import { Device, devices, HID } from 'node-hid'; import { Device, devices, HID } from 'node-hid';
import { CommandLineArgs, LogService } from 'uhk-common'; import { CommandLineArgs, LogService } from 'uhk-common';
@@ -24,6 +25,7 @@ export class UhkHidDevice {
* Internal variable that represent the USB UHK device * Internal variable that represent the USB UHK device
* @private * @private
*/ */
private _prevDevices = {};
private _device: HID; private _device: HID;
private _hasPermission = false; private _hasPermission = false;
@@ -197,7 +199,7 @@ export class UhkHidDevice {
async sendKbootCommandToModule(module: ModuleSlotToI2cAddress, command: KbootCommands, maxTry = 1): Promise<any> { async sendKbootCommandToModule(module: ModuleSlotToI2cAddress, command: KbootCommands, maxTry = 1): Promise<any> {
let transfer; let transfer;
const moduleName = kbootKommandName(module); const moduleName = kbootCommandName(module);
this.logService.debug(`[UhkHidDevice] USB[T]: Send KbootCommand ${moduleName} ${KbootCommands[command].toString()}`); this.logService.debug(`[UhkHidDevice] USB[T]: Send KbootCommand ${moduleName} ${KbootCommands[command].toString()}`);
if (command === KbootCommands.idle) { if (command === KbootCommands.idle) {
transfer = new Buffer([UsbCommand.SendKbootCommandToModule, command]); transfer = new Buffer([UsbCommand.SendKbootCommandToModule, command]);
@@ -233,12 +235,20 @@ export class UhkHidDevice {
private connectToDevice(): HID { private connectToDevice(): HID {
try { try {
const devs = devices(); const devs = devices();
this.logService.debug('[UhkHidDevice] Available devices:', devs); if (!isEqual(this._prevDevices, devs)) {
this.logService.debug('[UhkHidDevice] Available devices:', devs);
this._prevDevices = devs;
} else {
this.logService.debug('[UhkHidDevice] Available devices unchanged');
}
const dev = devs.find((x: Device) => const dev = devs.find((x: Device) =>
x.vendorId === Constants.VENDOR_ID && x.vendorId === Constants.VENDOR_ID &&
x.productId === Constants.PRODUCT_ID && x.productId === Constants.PRODUCT_ID &&
((x.usagePage === 128 && x.usage === 129) || x.interface === 0)); // hidapi can not read the interface number on Mac, so check the usage page and usage
((x.usagePage === 128 && x.usage === 129) || // Old firmware
(x.usagePage === (0xFF00 | 0x00) && x.usage === 0x01) || // New firmware
x.interface === 0));
if (!dev) { if (!dev) {
this.logService.debug('[UhkHidDevice] UHK Device not found:'); this.logService.debug('[UhkHidDevice] UHK Device not found:');
@@ -256,7 +266,7 @@ export class UhkHidDevice {
} }
} }
function kbootKommandName(module: ModuleSlotToI2cAddress): string { function kbootCommandName(module: ModuleSlotToI2cAddress): string {
switch (module) { switch (module) {
case ModuleSlotToI2cAddress.leftHalf: case ModuleSlotToI2cAddress.leftHalf:
return 'leftHalf'; return 'leftHalf';

File diff suppressed because it is too large Load Diff

View File

@@ -10,22 +10,24 @@
"lint": "ng lint", "lint": "ng lint",
"e2e": "ng e2e", "e2e": "ng e2e",
"build:renderer": "webpack --config webpack.config.js", "build:renderer": "webpack --config webpack.config.js",
"server:renderer": "webpack --config webpack.config.js --watch" "server:renderer": "webpack --config webpack.config.js --watch",
"pree2e": "webdriver-manager update --standalone false --gecko false --quiet"
}, },
"private": true, "private": true,
"devDependencies": { "devDependencies": {
"@angular/animations": "4.4.5", "@angular/animations": "5.2.9",
"@angular/cli": "1.4.7", "@angular/cli": "1.7.4",
"@angular/common": "4.4.5", "@angular/common": "5.2.9",
"@angular/compiler": "4.4.5", "@angular/compiler": "5.2.9",
"@angular/compiler-cli": "4.4.5", "@angular/compiler-cli": "5.2.9",
"@angular/core": "4.4.5", "@angular/core": "5.2.9",
"@angular/forms": "4.4.5", "@angular-devkit/build-optimizer": "0.3.2",
"@angular/http": "4.4.5", "@angular/forms": "5.2.9",
"@angular/language-service": "4.4.5", "@angular/http": "5.2.9",
"@angular/platform-browser": "4.4.5", "@angular/language-service": "5.2.9",
"@angular/platform-browser-dynamic": "4.4.5", "@angular/platform-browser": "5.2.9",
"@angular/router": "4.4.5", "@angular/platform-browser-dynamic": "5.2.9",
"@angular/router": "5.2.9",
"@ngrx/effects": "4.0.5", "@ngrx/effects": "4.0.5",
"@ngrx/router-store": "4.0.4", "@ngrx/router-store": "4.0.4",
"@ngrx/store": "4.0.3", "@ngrx/store": "4.0.3",
@@ -41,60 +43,41 @@
"@types/usb": "1.1.3", "@types/usb": "1.1.3",
"angular-confirmation-popover": "3.2.0", "angular-confirmation-popover": "3.2.0",
"angular-notifier": "2.0.0", "angular-notifier": "2.0.0",
"autoprefixer": "6.5.3", "autoprefixer": "^7.2.3",
"bootstrap": "3.3.7", "bootstrap": "3.3.7",
"buffer": "5.0.6", "buffer": "5.0.6",
"circular-dependency-plugin": "3.0.0", "circular-dependency-plugin": "^4.2.1",
"codelyzer": "3.0.1", "codelyzer": "3.0.1",
"copy-webpack-plugin": "4.0.1",
"css-loader": "0.28.1",
"cssnano": "3.10.0",
"dragula": "3.7.2", "dragula": "3.7.2",
"exports-loader": "0.6.3",
"file-loader": "0.10.0",
"file-saver": "1.3.3",
"font-awesome": "4.7.0", "font-awesome": "4.7.0",
"html-webpack-plugin": "2.29.0", "html-webpack-plugin": "^2.29.0",
"istanbul-instrumenter-loader": "2.0.0",
"jasmine-core": "2.6.2", "jasmine-core": "2.6.2",
"jasmine-spec-reporter": "4.1.0", "jasmine-spec-reporter": "4.1.0",
"jquery": "3.2.1", "jquery": "3.2.1",
"jsonfile": "3.0.1", "jsonfile": "3.0.1",
"karma": "1.7.0", "karma": "1.7.0",
"karma-chrome-launcher": "2.1.1", "karma-chrome-launcher": "2.1.1",
"karma-cli": "1.0.1",
"karma-coverage-istanbul-reporter": "1.2.1", "karma-coverage-istanbul-reporter": "1.2.1",
"karma-jasmine": "1.1.0", "karma-jasmine": "1.1.0",
"karma-jasmine-html-reporter": "0.2.2", "karma-jasmine-html-reporter": "0.2.2",
"less-loader": "4.0.5",
"lodash-es": "4.17.4", "lodash-es": "4.17.4",
"ng2-dragula": "1.5.0", "ng2-dragula": "1.5.0",
"ng2-nouislider": "^1.7.6", "ng2-nouislider": "^1.7.7",
"ng2-select2": "1.0.0-beta.10", "ng2-select2": "1.0.0-beta.10",
"ngx-clipboard": "8.0.0", "ngx-clipboard": "10.0.0",
"ngrx-store-freeze": "0.1.9", "ngrx-store-freeze": "0.1.9",
"nouislider": "^10.1.0", "nouislider": "^11.1.0",
"postcss-loader": "1.3.3", "postcss-url": "^7.1.2",
"postcss-url": "5.1.2",
"protractor": "5.1.2", "protractor": "5.1.2",
"raw-loader": "0.5.1",
"reselect": "3.0.1", "reselect": "3.0.1",
"sass-loader": "6.0.3", "rxjs": "5.5.8",
"script-loader": "0.7.0",
"select2": "4.0.3", "select2": "4.0.3",
"source-map-loader": "0.2.0", "typescript": "2.6.2",
"style-loader": "0.13.1",
"stylus-loader": "3.0.1",
"sudo-prompt": "7.1.1",
"ts-loader": "2.3.1",
"ts-node": "3.0.4",
"uhk-common": "1.0.0", "uhk-common": "1.0.0",
"url-loader": "0.5.7",
"webpack": "3.4.1",
"webpack-dev-server": "2.5.1",
"webpack-svgstore-plugin": "4.0.1",
"xml-loader": "1.2.1", "xml-loader": "1.2.1",
"zone.js": "0.8.14" "zone.js": "0.8.26",
"@angular-devkit/core": "0.3.2",
"@ngtools/webpack": "1.10.2"
}, },
"dependencies": { "dependencies": {
"classlist.js": "1.1.20150312", "classlist.js": "1.1.20150312",

View File

@@ -67,7 +67,7 @@ export class MacroKeyTabComponent extends MacroBaseComponent implements OnInit {
} }
getKeyMacroAction(): KeyMacroAction { getKeyMacroAction(): KeyMacroAction {
const keyMacroAction = Object.assign(new KeyMacroAction(), this.keypressTab.toKeyAction()); const keyMacroAction = new KeyMacroAction(this.keypressTab.toKeyAction() as any);
keyMacroAction.action = this.getActionType(this.activeTab); keyMacroAction.action = this.getActionType(this.activeTab);
return keyMacroAction; return keyMacroAction;
} }

View File

@@ -1,5 +1,6 @@
<div class="row list-container"> <div class="row list-container">
<div class="col-xs-10 col-xs-offset-1 list-group"> <div class="col-xs-10 col-xs-offset-1 list-group">
<p><i>Please note that macro playback is not implemented yet. You can create macros, but they won't have any effect until firmware support is implemented. We're working on this.</i></p>
<div class="macro-actions-container" [dragula]="'macroActions'" [dragulaModel]="macro.macroActions"> <div class="macro-actions-container" [dragula]="'macroActions'" [dragulaModel]="macro.macroActions">
<macro-item *ngFor="let macroAction of macro.macroActions; let macroActionIndex = index" <macro-item *ngFor="let macroAction of macro.macroActions; let macroActionIndex = index"
[macroAction]="macroAction" [macroAction]="macroAction"

View File

@@ -79,8 +79,8 @@ export class PopoverComponent implements OnChanges {
@Input() defaultKeyAction: KeyAction; @Input() defaultKeyAction: KeyAction;
@Input() currentKeymap: Keymap; @Input() currentKeymap: Keymap;
@Input() currentLayer: number; @Input() currentLayer: number;
@Input() keyPosition: ClientRect; @Input() keyPosition: any;
@Input() wrapPosition: ClientRect; @Input() wrapPosition: any;
@Input() visible: boolean; @Input() visible: boolean;
@Output() cancel = new EventEmitter<any>(); @Output() cancel = new EventEmitter<any>();

View File

@@ -9,7 +9,7 @@
></select2> ></select2>
<icon name="question-circle" <icon name="question-circle"
data-toggle="tooltip" data-toggle="tooltip"
title="Looking for a non-US character? Just pick the character of the desired key according to the US layout." title="Looking for a non-US character? Just pick the character of the desired key according to the US layout. For example, on US keyboards next to Tab there is the Q key, but it's й on Russian keyboards, so in this case choose Q instead of й in Agent."
data-placement="bottom"></icon> data-placement="bottom"></icon>
<capture-keystroke-button (capture)="onKeysCapture($event)" tabindex="0"></capture-keystroke-button> <capture-keystroke-button (capture)="onKeysCapture($event)" tabindex="0"></capture-keystroke-button>
</div> </div>

View File

@@ -115,7 +115,7 @@ export class KeypressTabComponent extends Tab implements OnChanges {
const scTypePair = this.toScancodeTypePair(this.selectedScancodeOption); const scTypePair = this.toScancodeTypePair(this.selectedScancodeOption);
keystrokeAction.scancode = scTypePair[0]; keystrokeAction.scancode = scTypePair[0];
if (scTypePair[1] === 'media') { if (scTypePair[1] === 'media') {
keystrokeAction.type = KeystrokeType.shortMedia; keystrokeAction.type = keystrokeAction.scancode > 255 ? KeystrokeType.longMedia : KeystrokeType.shortMedia;
} else { } else {
keystrokeAction.type = KeystrokeType[scTypePair[1]]; keystrokeAction.type = KeystrokeType[scTypePair[1]];
} }

View File

@@ -11,7 +11,7 @@
</option> </option>
</select> </select>
<span [ngSwitch]="toggle"> <span [ngSwitch]="toggle">
<ng-template [ngSwitchCase]="true">layer by pressing this key.</ng-template> <ng-template [ngSwitchCase]="true">layer by tapping this key.</ng-template>
<ng-template ngSwitchDefault>layer by holding this key.</ng-template> <ng-template ngSwitchDefault>layer by holding this key.</ng-template>
</span> </span>
</ng-template> </ng-template>

View File

@@ -2,7 +2,7 @@
<span> No macros are available to choose from. Create a macro first! </span> <span> No macros are available to choose from. Create a macro first! </span>
</ng-template> </ng-template>
<ng-template [ngIf]="macroOptions.length > 0"> <ng-template [ngIf]="macroOptions.length > 0">
<p><i>Please note that macro playback is not implemented yet. You can bind macros, but they don't have any effect.</i></p> <p><i>Please note that macro playback is not implemented yet. You can bind macros, but they won't have any effect until firmware support is implemented. We're working on this.</i></p>
<div class="macro-selector"> <div class="macro-selector">
<b> Play macro: </b> <b> Play macro: </b>
<select2 [data]="macroOptions" [value]="macroOptions[selectedMacroIndex].id" (valueChanged)="onChange($event)" [width]="'100%'"></select2> <select2 [data]="macroOptions" [value]="macroOptions[selectedMacroIndex].id" (valueChanged)="onChange($event)" [width]="'100%'"></select2>

View File

@@ -1,6 +1,6 @@
import { AfterViewInit, Component, EventEmitter, forwardRef, Input, Output, OnDestroy, ViewChild } from '@angular/core'; import { AfterViewInit, Component, EventEmitter, forwardRef, Input, Output, OnDestroy, ViewChild } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
import { NouisliderComponent } from 'ng2-nouislider/src/nouislider'; import { NouisliderComponent } from 'ng2-nouislider';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { Observer } from 'rxjs/Observer'; import { Observer } from 'rxjs/Observer';
import 'rxjs/add/operator/debounceTime'; import 'rxjs/add/operator/debounceTime';

View File

@@ -7,11 +7,11 @@
"iconsAndLayerTextsBrightness": 255, "iconsAndLayerTextsBrightness": 255,
"alphanumericSegmentsBrightness": 255, "alphanumericSegmentsBrightness": 255,
"keyBacklightBrightness": 255, "keyBacklightBrightness": 255,
"mouseMoveInitialSpeed": 5, "mouseMoveInitialSpeed": 4,
"mouseMoveAcceleration": 35, "mouseMoveAcceleration": 68,
"mouseMoveDeceleratedSpeed": 10, "mouseMoveDeceleratedSpeed": 8,
"mouseMoveBaseSpeed": 40, "mouseMoveBaseSpeed": 32,
"mouseMoveAcceleratedSpeed": 80, "mouseMoveAcceleratedSpeed": 64,
"mouseScrollInitialSpeed": 20, "mouseScrollInitialSpeed": 20,
"mouseScrollAcceleration": 20, "mouseScrollAcceleration": 20,
"mouseScrollDeceleratedSpeed": 20, "mouseScrollDeceleratedSpeed": 20,

File diff suppressed because it is too large Load Diff

View File

@@ -11,4 +11,24 @@ const firmwareMajorVersion = uhk.getUint16(response, 1);
const firmwareMinorVersion = uhk.getUint16(response, 3); const firmwareMinorVersion = uhk.getUint16(response, 3);
const firmwarePatchVersion = uhk.getUint16(response, 5); const firmwarePatchVersion = uhk.getUint16(response, 5);
const deviceProtocolMajorVersion = uhk.getUint16(response, 7);
const deviceProtocolMinorVersion = uhk.getUint16(response, 9);
const deviceProtocolPatchVersion = uhk.getUint16(response, 11);
const moduleProtocolMajorVersion = uhk.getUint16(response, 13);
const moduleProtocolMinorVersion = uhk.getUint16(response, 15);
const moduleProtocolPatchVersion = uhk.getUint16(response, 17);
const userConfigMajorVersion = uhk.getUint16(response, 19);
const userConfigMinorVersion = uhk.getUint16(response, 21);
const userConfigPatchVersion = uhk.getUint16(response, 23);
const hardwareConfigMajorVersion = uhk.getUint16(response, 25);
const hardwareConfigMinorVersion = uhk.getUint16(response, 27);
const hardwareConfigPatchVersion = uhk.getUint16(response, 29);
console.log(`firmwareVersion: ${firmwareMajorVersion}.${firmwareMinorVersion}.${firmwarePatchVersion}`); console.log(`firmwareVersion: ${firmwareMajorVersion}.${firmwareMinorVersion}.${firmwarePatchVersion}`);
console.log(`deviceProtocolVersion: ${deviceProtocolMajorVersion}.${deviceProtocolMinorVersion}.${deviceProtocolPatchVersion}`);
console.log(`moduleProtocolVersion: ${moduleProtocolMajorVersion}.${moduleProtocolMinorVersion}.${moduleProtocolPatchVersion}`);
console.log(`userConfigVersion: ${userConfigMajorVersion}.${userConfigMinorVersion}.${userConfigPatchVersion}`);
console.log(`hardwareConfigVersion: ${hardwareConfigMajorVersion}.${hardwareConfigMinorVersion}.${hardwareConfigPatchVersion}`);

View File

@@ -13,11 +13,11 @@
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
}, },
"ansi-styles": { "ansi-styles": {
"version": "3.2.0", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": { "requires": {
"color-convert": "1.9.0" "color-convert": "1.9.1"
} }
}, },
"aproba": { "aproba": {
@@ -31,7 +31,7 @@
"integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
"requires": { "requires": {
"delegates": "1.0.0", "delegates": "1.0.0",
"readable-stream": "2.3.3" "readable-stream": "2.3.6"
} }
}, },
"balanced-match": { "balanced-match": {
@@ -50,17 +50,18 @@
"integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw=="
}, },
"bl": { "bl": {
"version": "1.2.1", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
"integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
"requires": { "requires": {
"readable-stream": "2.3.3" "readable-stream": "2.3.6",
"safe-buffer": "5.1.1"
} }
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.8", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": { "requires": {
"balanced-match": "1.0.0", "balanced-match": "1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@@ -72,7 +73,7 @@
"integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=",
"requires": { "requires": {
"base64-js": "0.0.8", "base64-js": "0.0.8",
"ieee754": "1.1.8", "ieee754": "1.1.11",
"isarray": "1.0.0" "isarray": "1.0.0"
} }
}, },
@@ -86,9 +87,9 @@
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz",
"integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
"requires": { "requires": {
"ansi-styles": "3.2.0", "ansi-styles": "3.2.1",
"escape-string-regexp": "1.0.5", "escape-string-regexp": "1.0.5",
"supports-color": "4.4.0" "supports-color": "4.5.0"
} }
}, },
"chownr": { "chownr": {
@@ -102,9 +103,9 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
}, },
"color-convert": { "color-convert": {
"version": "1.9.0", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
"integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
"requires": { "requires": {
"color-name": "1.1.3" "color-name": "1.1.3"
} }
@@ -115,9 +116,9 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
}, },
"commander": { "commander": {
"version": "2.11.0", "version": "2.15.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
"integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
@@ -144,7 +145,7 @@
"decompress-targz": "4.1.1", "decompress-targz": "4.1.1",
"decompress-unzip": "4.0.1", "decompress-unzip": "4.0.1",
"graceful-fs": "4.1.11", "graceful-fs": "4.1.11",
"make-dir": "1.1.0", "make-dir": "1.2.0",
"pify": "2.3.0", "pify": "2.3.0",
"strip-dirs": "2.1.0" "strip-dirs": "2.1.0"
} }
@@ -164,7 +165,7 @@
"requires": { "requires": {
"file-type": "5.2.0", "file-type": "5.2.0",
"is-stream": "1.1.0", "is-stream": "1.1.0",
"tar-stream": "1.5.4" "tar-stream": "1.5.5"
} }
}, },
"decompress-tarbz2": { "decompress-tarbz2": {
@@ -230,9 +231,9 @@
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
}, },
"end-of-stream": { "end-of-stream": {
"version": "1.4.0", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
"integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
"requires": { "requires": {
"once": "1.4.0" "once": "1.4.0"
} }
@@ -333,9 +334,9 @@
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
}, },
"ieee754": { "ieee754": {
"version": "1.1.8", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz",
"integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg=="
}, },
"inflight": { "inflight": {
"version": "1.0.6", "version": "1.0.6",
@@ -357,9 +358,9 @@
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
}, },
"interpret": { "interpret": {
"version": "1.0.4", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
"integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
}, },
"is-fullwidth-code-point": { "is-fullwidth-code-point": {
"version": "1.0.0", "version": "1.0.0",
@@ -385,9 +386,9 @@
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
}, },
"make-dir": { "make-dir": {
"version": "1.1.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
"integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
"requires": { "requires": {
"pify": "3.0.0" "pify": "3.0.0"
}, },
@@ -409,7 +410,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": { "requires": {
"brace-expansion": "1.1.8" "brace-expansion": "1.1.11"
} }
}, },
"minimist": { "minimist": {
@@ -555,16 +556,16 @@
} }
}, },
"process-nextick-args": { "process-nextick-args": {
"version": "1.0.7", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
}, },
"pump": { "pump": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
"requires": { "requires": {
"end-of-stream": "1.4.0", "end-of-stream": "1.4.1",
"once": "1.4.0" "once": "1.4.0"
} }
}, },
@@ -580,16 +581,16 @@
} }
}, },
"readable-stream": { "readable-stream": {
"version": "2.3.3", "version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": { "requires": {
"core-util-is": "1.0.2", "core-util-is": "1.0.2",
"inherits": "2.0.3", "inherits": "2.0.3",
"isarray": "1.0.0", "isarray": "1.0.0",
"process-nextick-args": "1.0.7", "process-nextick-args": "2.0.0",
"safe-buffer": "5.1.1", "safe-buffer": "5.1.1",
"string_decoder": "1.0.3", "string_decoder": "1.1.1",
"util-deprecate": "1.0.2" "util-deprecate": "1.0.2"
} }
}, },
@@ -598,13 +599,13 @@
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"requires": { "requires": {
"resolve": "1.5.0" "resolve": "1.7.0"
} }
}, },
"resolve": { "resolve": {
"version": "1.5.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz",
"integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==",
"requires": { "requires": {
"path-parse": "1.0.5" "path-parse": "1.0.5"
} }
@@ -648,7 +649,7 @@
"integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
"requires": { "requires": {
"glob": "7.1.2", "glob": "7.1.2",
"interpret": "1.0.4", "interpret": "1.1.0",
"rechoir": "0.6.2" "rechoir": "0.6.2"
} }
}, },
@@ -693,9 +694,9 @@
} }
}, },
"string_decoder": { "string_decoder": {
"version": "1.0.3", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": { "requires": {
"safe-buffer": "5.1.1" "safe-buffer": "5.1.1"
} }
@@ -722,9 +723,9 @@
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
}, },
"supports-color": { "supports-color": {
"version": "4.4.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
"requires": { "requires": {
"has-flag": "2.0.0" "has-flag": "2.0.0"
} }
@@ -737,7 +738,7 @@
"chownr": "1.0.1", "chownr": "1.0.1",
"mkdirp": "0.5.1", "mkdirp": "0.5.1",
"pump": "1.0.3", "pump": "1.0.3",
"tar-stream": "1.5.4" "tar-stream": "1.5.5"
}, },
"dependencies": { "dependencies": {
"pump": { "pump": {
@@ -745,20 +746,20 @@
"resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
"integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
"requires": { "requires": {
"end-of-stream": "1.4.0", "end-of-stream": "1.4.1",
"once": "1.4.0" "once": "1.4.0"
} }
} }
} }
}, },
"tar-stream": { "tar-stream": {
"version": "1.5.4", "version": "1.5.5",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz",
"integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==",
"requires": { "requires": {
"bl": "1.2.1", "bl": "1.2.2",
"end-of-stream": "1.4.0", "end-of-stream": "1.4.1",
"readable-stream": "2.3.3", "readable-stream": "2.3.6",
"xtend": "4.0.1" "xtend": "4.0.1"
} }
}, },
@@ -784,9 +785,9 @@
} }
}, },
"typescript": { "typescript": {
"version": "2.5.3", "version": "2.6.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
"integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==" "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q="
}, },
"unbzip2-stream": { "unbzip2-stream": {
"version": "1.2.5", "version": "1.2.5",

View File

@@ -7,7 +7,7 @@
"devDependencies": { "devDependencies": {
"@types/node": "8.0.28", "@types/node": "8.0.28",
"shx": "0.2.2", "shx": "0.2.2",
"typescript": "2.5.3" "typescript": "2.6.2"
}, },
"dependencies": { "dependencies": {
"chalk": "2.1.0", "chalk": "2.1.0",

View File

@@ -71,7 +71,10 @@ function writeDevice(device, data, options={}) {
function getUhkDevice() { function getUhkDevice() {
const foundDevice = HID.devices().find(device => const foundDevice = HID.devices().find(device =>
device.vendorId === 0x1d50 && device.productId === 0x6122 && device.vendorId === 0x1d50 && device.productId === 0x6122 &&
((device.usagePage === 128 && device.usage === 129) || device.interface === 0)); // hidapi can not read the interface number on Mac, so check the usage page and usage
((device.usagePage === 128 && device.usage === 129) || // Old firmware
(device.usagePage === (0xFF00 | 0x00) && device.usage === 0x01) || // New firmware
device.interface === 0));
if (!foundDevice) { if (!foundDevice) {
return null; return null;