Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e152a36ad7 | ||
|
|
e90544db33 | ||
|
|
7ceca202b4 | ||
|
|
ddc65aa54b | ||
|
|
13ec617d58 | ||
|
|
00c5b69129 | ||
|
|
6ccf005750 |
10
CHANGELOG.md
@@ -6,6 +6,16 @@ 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.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
|
||||||
|
|
||||||
|
- Handle privilege escalation gracefully on Linux even without PolicyKit.
|
||||||
|
- Fix application icon path.
|
||||||
|
- Replace application icon with a diagonal gradient based icon that should look better on desktop.
|
||||||
|
- Make saving the configuration more robust, and add a configuration recovery screen.
|
||||||
|
- Reposition the ISO key in the scancode list.
|
||||||
|
|
||||||
## [1.1.3] - 2018-04-06
|
## [1.1.3] - 2018-04-06
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
BIN
build/icon.icns
BIN
build/icon.ico
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 392 B After Width: | Height: | Size: 499 B |
|
Before Width: | Height: | Size: 546 B After Width: | Height: | Size: 735 B |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 660 B After Width: | Height: | Size: 913 B |
|
Before Width: | Height: | Size: 966 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 2.7 KiB |
271
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "uhk-agent",
|
"name": "uhk-agent",
|
||||||
"version": "1.1.2",
|
"version": "1.1.3",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -67,9 +67,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/fs-extra": {
|
"@types/fs-extra": {
|
||||||
"version": "4.0.5",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-4.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz",
|
||||||
"integrity": "sha512-tIG0GpHum5IFb8Qze/cSv0w/0gNzHB+MUDftTQaxenx46z50g51/MPkNLssLz9+uZLzCDd35bT9qtWOTXZ21Gw==",
|
"integrity": "sha512-h3wnflb+jMTipvbbZnClgA2BexrT4w0GcfoCz5qyxd0IRsbqhLSyesM6mqZTAnhbVmhyTm5tuxfRu9R+8l+lGw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "8.0.53"
|
"@types/node": "8.0.53"
|
||||||
@@ -571,6 +571,12 @@
|
|||||||
"integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=",
|
"integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"bindings": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"bl": {
|
"bl": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
|
||||||
@@ -1130,6 +1136,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"chownr": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"chromium-pickle-js": {
|
"chromium-pickle-js": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
|
||||||
@@ -1414,9 +1426,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"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==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"compare-func": {
|
"compare-func": {
|
||||||
@@ -2788,6 +2800,15 @@
|
|||||||
"strip-dirs": "2.1.0"
|
"strip-dirs": "2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"decompress-response": {
|
||||||
|
"version": "3.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
|
||||||
|
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"mimic-response": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"decompress-tar": {
|
"decompress-tar": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
|
||||||
@@ -3479,13 +3500,26 @@
|
|||||||
"requires": {
|
"requires": {
|
||||||
"debug": "3.1.0",
|
"debug": "3.1.0",
|
||||||
"env-paths": "1.0.0",
|
"env-paths": "1.0.0",
|
||||||
"fs-extra": "4.0.2",
|
"fs-extra": "4.0.3",
|
||||||
"minimist": "1.2.0",
|
"minimist": "1.2.0",
|
||||||
"nugget": "2.0.1",
|
"nugget": "2.0.1",
|
||||||
"path-exists": "3.0.0",
|
"path-exists": "3.0.0",
|
||||||
"rc": "1.2.1",
|
"rc": "1.2.1",
|
||||||
"semver": "5.4.1",
|
"semver": "5.4.1",
|
||||||
"sumchecker": "2.0.2"
|
"sumchecker": "2.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"fs-extra": {
|
||||||
|
"version": "4.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
|
||||||
|
"integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "4.1.11",
|
||||||
|
"jsonfile": "4.0.0",
|
||||||
|
"universalify": "0.1.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"find-up": {
|
"find-up": {
|
||||||
@@ -4266,6 +4300,12 @@
|
|||||||
"fill-range": "2.2.3"
|
"fill-range": "2.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"expand-template": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-kkjwkMqj0h4w/sb32ERCDxCQkREMCAgS39DscDnSwDsbxnwwM1BTZySdC3Bn1lhY7vL08n9GoO/fVTynjDgRyQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"exports-loader": {
|
"exports-loader": {
|
||||||
"version": "0.6.3",
|
"version": "0.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.3.tgz",
|
||||||
@@ -4533,25 +4573,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"fs-extra": {
|
"fs-extra": {
|
||||||
"version": "4.0.2",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
|
||||||
"integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
|
"integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"graceful-fs": "4.1.11",
|
"graceful-fs": "4.1.11",
|
||||||
"jsonfile": "4.0.0",
|
"jsonfile": "4.0.0",
|
||||||
"universalify": "0.1.1"
|
"universalify": "0.1.1"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"jsonfile": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
|
|
||||||
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"graceful-fs": "4.1.11"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"fs-extra-p": {
|
"fs-extra-p": {
|
||||||
@@ -5819,6 +5848,12 @@
|
|||||||
"ini": "1.3.4"
|
"ini": "1.3.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"github-from-package": {
|
||||||
|
"version": "0.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||||
|
"integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "6.0.4",
|
"version": "6.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
|
||||||
@@ -6950,7 +6985,7 @@
|
|||||||
"dedent": "0.7.0",
|
"dedent": "0.7.0",
|
||||||
"execa": "0.8.0",
|
"execa": "0.8.0",
|
||||||
"find-up": "2.1.0",
|
"find-up": "2.1.0",
|
||||||
"fs-extra": "4.0.2",
|
"fs-extra": "4.0.3",
|
||||||
"get-port": "3.2.0",
|
"get-port": "3.2.0",
|
||||||
"glob": "7.1.2",
|
"glob": "7.1.2",
|
||||||
"glob-parent": "3.1.0",
|
"glob-parent": "3.1.0",
|
||||||
@@ -7101,6 +7136,17 @@
|
|||||||
"locate-path": "2.0.0"
|
"locate-path": "2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"fs-extra": {
|
||||||
|
"version": "4.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
|
||||||
|
"integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"graceful-fs": "4.1.11",
|
||||||
|
"jsonfile": "4.0.0",
|
||||||
|
"universalify": "0.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"git-raw-commits": {
|
"git-raw-commits": {
|
||||||
"version": "1.3.4",
|
"version": "1.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.4.tgz",
|
||||||
@@ -7825,6 +7871,12 @@
|
|||||||
"integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
|
"integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"mimic-response": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"minimalistic-assert": {
|
"minimalistic-assert": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
|
||||||
@@ -7925,8 +7977,7 @@
|
|||||||
"version": "2.7.0",
|
"version": "2.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz",
|
||||||
"integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=",
|
"integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"optional": true
|
|
||||||
},
|
},
|
||||||
"node-abi": {
|
"node-abi": {
|
||||||
"version": "2.3.0",
|
"version": "2.3.0",
|
||||||
@@ -7989,6 +8040,17 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node-hid": {
|
||||||
|
"version": "0.5.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-hid/-/node-hid-0.5.7.tgz",
|
||||||
|
"integrity": "sha512-dwwpOetL2+MGYgivbO22ML+45ieCGbueWv1rYxRgBoEc2QMp6UF6ZucEkYts1IA3YPWJNkmpGh6dqQ85n19szw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"bindings": "1.3.0",
|
||||||
|
"nan": "2.7.0",
|
||||||
|
"prebuild-install": "2.5.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node-libs-browser": {
|
"node-libs-browser": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz",
|
||||||
@@ -8089,6 +8151,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"noop-logger": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
|
||||||
|
"integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"nopt": {
|
"nopt": {
|
||||||
"version": "3.0.6",
|
"version": "3.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
|
||||||
@@ -8971,6 +9039,29 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"prebuild-install": {
|
||||||
|
"version": "2.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.1.tgz",
|
||||||
|
"integrity": "sha512-3DX9L6pzwc1m1ksMkW3Ky2WLgPQUBiySOfXVl3WZyAeJSyJb4wtoH9OmeRGcubAWsMlLiL8BTHbwfm/jPQE9Ag==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"detect-libc": "1.0.3",
|
||||||
|
"expand-template": "1.1.0",
|
||||||
|
"github-from-package": "0.0.0",
|
||||||
|
"minimist": "1.2.0",
|
||||||
|
"mkdirp": "0.5.1",
|
||||||
|
"node-abi": "2.3.0",
|
||||||
|
"noop-logger": "0.1.1",
|
||||||
|
"npmlog": "4.1.2",
|
||||||
|
"os-homedir": "1.0.2",
|
||||||
|
"pump": "2.0.1",
|
||||||
|
"rc": "1.2.1",
|
||||||
|
"simple-get": "2.7.0",
|
||||||
|
"tar-fs": "1.16.0",
|
||||||
|
"tunnel-agent": "0.6.0",
|
||||||
|
"which-pm-runs": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"prepend-http": {
|
"prepend-http": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
|
||||||
@@ -9061,6 +9152,16 @@
|
|||||||
"randombytes": "2.0.5"
|
"randombytes": "2.0.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pump": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"end-of-stream": "1.4.0",
|
||||||
|
"once": "1.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"punycode": {
|
"punycode": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
|
||||||
@@ -9428,9 +9529,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"resolve": {
|
"resolve": {
|
||||||
"version": "1.4.0",
|
"version": "1.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz",
|
||||||
"integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
|
"integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"path-parse": "1.0.5"
|
"path-parse": "1.0.5"
|
||||||
@@ -9646,6 +9747,23 @@
|
|||||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
|
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"simple-concat": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"simple-get": {
|
||||||
|
"version": "2.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz",
|
||||||
|
"integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"decompress-response": "3.3.0",
|
||||||
|
"once": "1.4.0",
|
||||||
|
"simple-concat": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"single-line-log": {
|
"single-line-log": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz",
|
||||||
@@ -10526,6 +10644,30 @@
|
|||||||
"inherits": "2.0.3"
|
"inherits": "2.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"tar-fs": {
|
||||||
|
"version": "1.16.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.0.tgz",
|
||||||
|
"integrity": "sha512-I9rb6v7mjWLtOfCau9eH5L7sLJyU2BnxtEZRQ5Mt+eRKmf1F0ohXmT/Jc3fr52kDvjJ/HV5MH3soQfPL5bQ0Yg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"chownr": "1.0.1",
|
||||||
|
"mkdirp": "0.5.1",
|
||||||
|
"pump": "1.0.3",
|
||||||
|
"tar-stream": "1.5.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"pump": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"end-of-stream": "1.4.0",
|
||||||
|
"once": "1.4.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"tar-stream": {
|
"tar-stream": {
|
||||||
"version": "1.5.4",
|
"version": "1.5.4",
|
||||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz",
|
||||||
@@ -10843,29 +10985,51 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tslib": {
|
"tslib": {
|
||||||
"version": "1.7.1",
|
"version": "1.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
|
||||||
"integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=",
|
"integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"tslint": {
|
"tslint": {
|
||||||
"version": "5.5.0",
|
"version": "5.9.1",
|
||||||
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz",
|
||||||
"integrity": "sha1-EOjas+MGH6YelELozuOYKs8gpqo=",
|
"integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"babel-code-frame": "6.26.0",
|
"babel-code-frame": "6.26.0",
|
||||||
"colors": "1.1.2",
|
"builtin-modules": "1.1.1",
|
||||||
"commander": "2.11.0",
|
"chalk": "2.3.2",
|
||||||
|
"commander": "2.15.1",
|
||||||
"diff": "3.4.0",
|
"diff": "3.4.0",
|
||||||
"glob": "7.1.2",
|
"glob": "7.1.2",
|
||||||
|
"js-yaml": "3.10.0",
|
||||||
"minimatch": "3.0.4",
|
"minimatch": "3.0.4",
|
||||||
"resolve": "1.4.0",
|
"resolve": "1.6.0",
|
||||||
"semver": "5.4.1",
|
"semver": "5.4.1",
|
||||||
"tslib": "1.7.1",
|
"tslib": "1.9.0",
|
||||||
"tsutils": "2.12.0"
|
"tsutils": "2.26.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"ansi-styles": {
|
||||||
|
"version": "3.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
|
||||||
|
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"color-convert": "1.9.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"chalk": {
|
||||||
|
"version": "2.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
|
||||||
|
"integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ansi-styles": "3.2.1",
|
||||||
|
"escape-string-regexp": "1.0.5",
|
||||||
|
"supports-color": "5.3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.1.2",
|
"version": "7.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
|
||||||
@@ -10879,16 +11043,31 @@
|
|||||||
"once": "1.4.0",
|
"once": "1.4.0",
|
||||||
"path-is-absolute": "1.0.1"
|
"path-is-absolute": "1.0.1"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"has-flag": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||||
|
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"supports-color": {
|
||||||
|
"version": "5.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
|
||||||
|
"integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"has-flag": "3.0.0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tsutils": {
|
"tsutils": {
|
||||||
"version": "2.12.0",
|
"version": "2.26.1",
|
||||||
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.12.0.tgz",
|
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.26.1.tgz",
|
||||||
"integrity": "sha1-yJKoTI8vjeE/jvMsLFw4tFfM6sY=",
|
"integrity": "sha512-bnm9bcjOqOr1UljleL94wVCDlpa6KjfGaTkefeLch4GRafgDkROxPizbB/FxTEdI++5JqhxczRy/Qub0syNqZA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"tslib": "1.7.1"
|
"tslib": "1.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tty-browserify": {
|
"tty-browserify": {
|
||||||
@@ -11398,6 +11577,12 @@
|
|||||||
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
|
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"which-pm-runs": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"wide-align": {
|
"wide-align": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
|
||||||
|
|||||||
20
package.json
@@ -3,7 +3,7 @@
|
|||||||
"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.3",
|
"version": "1.1.4",
|
||||||
"firmwareVersion": "8.1.5",
|
"firmwareVersion": "8.1.5",
|
||||||
"deviceProtocolVersion": "4.2.0",
|
"deviceProtocolVersion": "4.2.0",
|
||||||
"userConfigVersion": "4.0.0",
|
"userConfigVersion": "4.0.0",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/electron-devtools-installer": "2.0.2",
|
"@types/electron-devtools-installer": "2.0.2",
|
||||||
"@types/electron-settings": "3.0.0",
|
"@types/electron-settings": "3.0.0",
|
||||||
"@types/fs-extra": "4.0.5",
|
"@types/fs-extra": "5.0.1",
|
||||||
"@types/jasmine": "2.6.0",
|
"@types/jasmine": "2.6.0",
|
||||||
"@types/jsonfile": "4.0.1",
|
"@types/jsonfile": "4.0.1",
|
||||||
"@types/node": "8.0.53",
|
"@types/node": "8.0.53",
|
||||||
@@ -47,10 +47,11 @@
|
|||||||
"electron-updater": "2.21.4",
|
"electron-updater": "2.21.4",
|
||||||
"exports-loader": "0.6.3",
|
"exports-loader": "0.6.3",
|
||||||
"file-loader": "0.10.0",
|
"file-loader": "0.10.0",
|
||||||
"fs-extra": "4.0.2",
|
"fs-extra": "5.0.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",
|
||||||
|
"node-hid": "0.5.7",
|
||||||
"npm-run-all": "4.0.2",
|
"npm-run-all": "4.0.2",
|
||||||
"pre-commit": "1.2.2",
|
"pre-commit": "1.2.2",
|
||||||
"request": "2.83.0",
|
"request": "2.83.0",
|
||||||
@@ -60,7 +61,7 @@
|
|||||||
"svg-sprite": "1.3.7",
|
"svg-sprite": "1.3.7",
|
||||||
"ts-loader": "2.3.1",
|
"ts-loader": "2.3.1",
|
||||||
"ts-node": "3.0.4",
|
"ts-node": "3.0.4",
|
||||||
"tslint": "5.5.0",
|
"tslint": "5.9.1",
|
||||||
"typescript": "2.5.2",
|
"typescript": "2.5.2",
|
||||||
"webpack": "2.4.1"
|
"webpack": "2.4.1"
|
||||||
},
|
},
|
||||||
@@ -76,11 +77,11 @@
|
|||||||
"test:uhk-web": "lerna exec --scope uhk-web npm test",
|
"test:uhk-web": "lerna exec --scope uhk-web npm test",
|
||||||
"lint": "run-s -scn lint:ts lint:style",
|
"lint": "run-s -scn lint:ts lint:style",
|
||||||
"lint:ts": "run-p -sn lint:ts:electron-main lint:ts:electron-renderer lint:ts:web lint:ts:test-serializer lint:ts:uhk-usb",
|
"lint:ts": "run-p -sn lint:ts:electron-main lint:ts:electron-renderer lint:ts:web lint:ts:test-serializer lint:ts:uhk-usb",
|
||||||
"lint:ts:electron-main": "tslint --type-check --project ./packages/uhk-agent/tsconfig.json",
|
"lint:ts:electron-main": "tslint --project ./packages/uhk-agent/tsconfig.json",
|
||||||
"lint:ts:electron-renderer": "tslint --type-check --project ./packages/uhk-web/src/tsconfig.renderer.json",
|
"lint:ts:electron-renderer": "tslint --project ./packages/uhk-web/src/tsconfig.renderer.json",
|
||||||
"lint:ts:web": "tslint --type-check --project ./packages/uhk-web/src/tsconfig.app.json",
|
"lint:ts:web": "tslint --project ./packages/uhk-web/src/tsconfig.app.json",
|
||||||
"lint:ts:test-serializer": "tslint --type-check --project ./packages/test-serializer/tsconfig.json",
|
"lint:ts:test-serializer": "tslint --project ./packages/test-serializer/tsconfig.json",
|
||||||
"lint:ts:uhk-usb": "tslint --type-check --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",
|
||||||
"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",
|
||||||
@@ -92,6 +93,7 @@
|
|||||||
"server:web": "lerna exec --scope uhk-web npm start",
|
"server:web": "lerna exec --scope uhk-web npm start",
|
||||||
"server:electron": "lerna exec --scope uhk-web npm run server:renderer",
|
"server:electron": "lerna exec --scope uhk-web npm run server:renderer",
|
||||||
"electron": "lerna exec --scope uhk-agent npm start",
|
"electron": "lerna exec --scope uhk-agent npm start",
|
||||||
|
"electron:spe": "lerna exec --scope uhk-agent npm run electron:spe",
|
||||||
"standard-version": "standard-version",
|
"standard-version": "standard-version",
|
||||||
"pack": "node ./scripts/release.js",
|
"pack": "node ./scripts/release.js",
|
||||||
"sprites": "node ./scripts/generate-svg-sprites",
|
"sprites": "node ./scripts/generate-svg-sprites",
|
||||||
|
|||||||
763
packages/uhk-agent/package-lock.json
generated
Normal file
@@ -17,7 +17,7 @@
|
|||||||
"command-line-args": "4.0.7",
|
"command-line-args": "4.0.7",
|
||||||
"decompress": "4.2.0",
|
"decompress": "4.2.0",
|
||||||
"decompress-bzip2": "4.0.0",
|
"decompress-bzip2": "4.0.0",
|
||||||
"node-hid": "0.5.4",
|
"node-hid": "0.5.7",
|
||||||
"sudo-prompt": "7.0.0",
|
"sudo-prompt": "7.0.0",
|
||||||
"tmp": "0.0.33",
|
"tmp": "0.0.33",
|
||||||
"uhk-common": "^1.0.0",
|
"uhk-common": "^1.0.0",
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "electron ./dist/electron-main.js",
|
"start": "electron ./dist/electron-main.js",
|
||||||
|
"electron:spe": "electron ./dist/electron-main.js --spe",
|
||||||
"build": "webpack && npm run install:build-deps && npm run build:usb && npm run download-firmware && npm run copy-blhost",
|
"build": "webpack && npm run install:build-deps && npm run build:usb && npm run download-firmware && npm run copy-blhost",
|
||||||
"build:usb": "electron-rebuild -w node-hid -p -m ./dist",
|
"build:usb": "electron-rebuild -w node-hid -p -m ./dist",
|
||||||
"install:build-deps": "cd ./dist && npm i",
|
"install:build-deps": "cd ./dist && npm i",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
/// <reference path="./custom_types/command-line-args.d.ts"/>
|
/// <reference path="./custom_types/command-line-args.d.ts"/>
|
||||||
|
|
||||||
import './polyfills';
|
import './polyfills';
|
||||||
import { app, BrowserWindow, ipcMain } from 'electron';
|
import { app, BrowserWindow } from 'electron';
|
||||||
import { autoUpdater } from 'electron-updater';
|
import { autoUpdater } from 'electron-updater';
|
||||||
|
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
@@ -10,7 +10,7 @@ import * as url from 'url';
|
|||||||
import * as commandLineArgs from 'command-line-args';
|
import * as commandLineArgs from 'command-line-args';
|
||||||
import { UhkHidDevice, UhkOperations } from 'uhk-usb';
|
import { UhkHidDevice, UhkOperations } from 'uhk-usb';
|
||||||
// import { ElectronDataStorageRepositoryService } from './services/electron-datastorage-repository.service';
|
// import { ElectronDataStorageRepositoryService } from './services/electron-datastorage-repository.service';
|
||||||
import { LogRegExps } from 'uhk-common';
|
import { CommandLineArgs, LogRegExps } from 'uhk-common';
|
||||||
import { DeviceService } from './services/device.service';
|
import { DeviceService } from './services/device.service';
|
||||||
import { logger } from './services/logger.service';
|
import { logger } from './services/logger.service';
|
||||||
import { AppUpdateService } from './services/app-update.service';
|
import { AppUpdateService } from './services/app-update.service';
|
||||||
@@ -18,13 +18,13 @@ import { AppService } from './services/app.service';
|
|||||||
import { SudoService } from './services/sudo.service';
|
import { SudoService } from './services/sudo.service';
|
||||||
import { UhkBlhost } from '../../uhk-usb/src';
|
import { UhkBlhost } from '../../uhk-usb/src';
|
||||||
import * as isDev from 'electron-is-dev';
|
import * as isDev from 'electron-is-dev';
|
||||||
import { CommandLineInputs } from './models/command-line-inputs';
|
|
||||||
|
|
||||||
const optionDefinitions = [
|
const optionDefinitions = [
|
||||||
{name: 'addons', type: Boolean}
|
{name: 'addons', type: Boolean},
|
||||||
|
{name: 'spe', type: Boolean} // simulate privilege escalation error
|
||||||
];
|
];
|
||||||
|
|
||||||
const options: CommandLineInputs = commandLineArgs(optionDefinitions);
|
const options: CommandLineArgs = commandLineArgs(optionDefinitions);
|
||||||
|
|
||||||
// import './dev-extension';
|
// import './dev-extension';
|
||||||
// require('electron-debug')({ showDevTools: true, enabled: true });
|
// require('electron-debug')({ showDevTools: true, enabled: true });
|
||||||
@@ -79,17 +79,17 @@ function createWindow() {
|
|||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
},
|
},
|
||||||
icon: 'assets/images/agent-icon.png'
|
icon: path.join(__dirname, 'renderer/assets/images/agent-app-icon.png')
|
||||||
});
|
});
|
||||||
win.setMenuBarVisibility(false);
|
win.setMenuBarVisibility(false);
|
||||||
win.maximize();
|
win.maximize();
|
||||||
uhkHidDeviceService = new UhkHidDevice(logger);
|
uhkHidDeviceService = new UhkHidDevice(logger, options);
|
||||||
uhkBlhost = new UhkBlhost(logger, packagesDir);
|
uhkBlhost = new UhkBlhost(logger, packagesDir);
|
||||||
uhkOperations = new UhkOperations(logger, uhkBlhost, uhkHidDeviceService, packagesDir);
|
uhkOperations = new UhkOperations(logger, uhkBlhost, uhkHidDeviceService, packagesDir);
|
||||||
deviceService = new DeviceService(logger, win, uhkHidDeviceService, uhkOperations);
|
deviceService = new DeviceService(logger, win, uhkHidDeviceService, uhkOperations);
|
||||||
appUpdateService = new AppUpdateService(logger, win, app);
|
appUpdateService = new AppUpdateService(logger, win, app);
|
||||||
appService = new AppService(logger, win, deviceService, options, uhkHidDeviceService);
|
appService = new AppService(logger, win, deviceService, options, uhkHidDeviceService);
|
||||||
sudoService = new SudoService(logger);
|
sudoService = new SudoService(logger, options);
|
||||||
// and load the index.html of the app.
|
// and load the index.html of the app.
|
||||||
|
|
||||||
win.loadURL(url.format({
|
win.loadURL(url.format({
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
export interface CommandLineInputs {
|
export interface CommandLineInputs {
|
||||||
|
/**
|
||||||
|
* addons menu visible or not
|
||||||
|
*/
|
||||||
addons?: boolean;
|
addons?: boolean;
|
||||||
|
/**
|
||||||
|
* simulate privilege escalation error
|
||||||
|
*/
|
||||||
|
spe?: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
import { ipcMain } from 'electron';
|
import { ipcMain } from 'electron';
|
||||||
import { ConfigurationReply, DeviceConnectionState, HardwareModules, IpcEvents, IpcResponse, LogService } from 'uhk-common';
|
import {
|
||||||
|
ConfigurationReply,
|
||||||
|
DeviceConnectionState,
|
||||||
|
getHardwareConfigFromDeviceResponse,
|
||||||
|
HardwareModules,
|
||||||
|
IpcEvents,
|
||||||
|
IpcResponse,
|
||||||
|
LogService,
|
||||||
|
mapObjectToUserConfigBinaryBuffer,
|
||||||
|
SaveUserConfigurationData
|
||||||
|
} from 'uhk-common';
|
||||||
import { snooze, UhkHidDevice, UhkOperations } from 'uhk-usb';
|
import { snooze, UhkHidDevice, UhkOperations } from 'uhk-usb';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { Subscription } from 'rxjs/Subscription';
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
@@ -14,6 +24,7 @@ import 'rxjs/add/operator/distinctUntilChanged';
|
|||||||
import { saveTmpFirmware } from '../util/save-extract-firmware';
|
import { saveTmpFirmware } from '../util/save-extract-firmware';
|
||||||
import { TmpFirmware } from '../models/tmp-firmware';
|
import { TmpFirmware } from '../models/tmp-firmware';
|
||||||
import { QueueManager } from './queue-manager';
|
import { QueueManager } from './queue-manager';
|
||||||
|
import { backupUserConfiguration, getBackupUserConfigurationContent } from '../util/backup-user-confoguration';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IpcMain pair of the UHK Communication
|
* IpcMain pair of the UHK Communication
|
||||||
@@ -78,10 +89,14 @@ export class DeviceService {
|
|||||||
rightModuleInfo: await this.operations.getRightModuleVersionInfo()
|
rightModuleInfo: await this.operations.getRightModuleVersionInfo()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const hardwareConfig = getHardwareConfigFromDeviceResponse(result.hardwareConfiguration);
|
||||||
|
const uniqueId = hardwareConfig.uniqueId;
|
||||||
|
|
||||||
response = {
|
response = {
|
||||||
success: true,
|
success: true,
|
||||||
...result,
|
...result,
|
||||||
modules
|
modules,
|
||||||
|
backupConfiguration: await getBackupUserConfigurationContent(this.logService, uniqueId)
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
response = {
|
response = {
|
||||||
@@ -162,10 +177,13 @@ export class DeviceService {
|
|||||||
|
|
||||||
private async saveUserConfiguration(event: Electron.Event, args: Array<string>): Promise<void> {
|
private async saveUserConfiguration(event: Electron.Event, args: Array<string>): Promise<void> {
|
||||||
const response = new IpcResponse();
|
const response = new IpcResponse();
|
||||||
const json = args[0];
|
const data: SaveUserConfigurationData = JSON.parse(args[0]);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await this.operations.saveUserConfiguration(json);
|
await backupUserConfiguration(data);
|
||||||
|
|
||||||
|
const buffer = mapObjectToUserConfigBinaryBuffer(data.configuration);
|
||||||
|
await this.operations.saveUserConfiguration(buffer);
|
||||||
|
|
||||||
response.success = true;
|
response.success = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,13 @@ import * as sudo from 'sudo-prompt';
|
|||||||
import { dirSync } from 'tmp';
|
import { dirSync } from 'tmp';
|
||||||
import { emptyDir, copy } from 'fs-extra';
|
import { emptyDir, copy } from 'fs-extra';
|
||||||
|
|
||||||
import { IpcEvents, LogService, IpcResponse } from 'uhk-common';
|
import { CommandLineArgs, IpcEvents, LogService, IpcResponse } from 'uhk-common';
|
||||||
|
|
||||||
export class SudoService {
|
export class SudoService {
|
||||||
private rootDir: string;
|
private rootDir: string;
|
||||||
|
|
||||||
constructor(private logService: LogService) {
|
constructor(private logService: LogService,
|
||||||
|
private options: CommandLineArgs) {
|
||||||
if (isDev) {
|
if (isDev) {
|
||||||
this.rootDir = path.join(path.join(process.cwd(), process.argv[1]), '../../../../');
|
this.rootDir = path.join(path.join(process.cwd(), process.argv[1]), '../../../../');
|
||||||
} else {
|
} else {
|
||||||
@@ -21,6 +22,19 @@ export class SudoService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async setPrivilege(event: Electron.Event) {
|
private async setPrivilege(event: Electron.Event) {
|
||||||
|
if (this.options.spe) {
|
||||||
|
const error = new Error('No polkit authentication agent found.');
|
||||||
|
this.logService.error('[SudoService] Simulate privilege escalation error ', error);
|
||||||
|
|
||||||
|
const response = new IpcResponse();
|
||||||
|
response.success = false;
|
||||||
|
response.error = {message: error.message};
|
||||||
|
|
||||||
|
event.sender.send(IpcEvents.device.setPrivilegeOnLinuxReply, response);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (process.platform) {
|
switch (process.platform) {
|
||||||
case 'linux':
|
case 'linux':
|
||||||
await this.setPrivilegeOnLinux(event);
|
await this.setPrivilegeOnLinux(event);
|
||||||
@@ -28,7 +42,7 @@ export class SudoService {
|
|||||||
default:
|
default:
|
||||||
const response: IpcResponse = {
|
const response: IpcResponse = {
|
||||||
success: false,
|
success: false,
|
||||||
error: { message: 'Permissions couldn\'t be set. Invalid platform: ' + process.platform }
|
error: {message: 'Permissions couldn\'t be set. Invalid platform: ' + process.platform}
|
||||||
};
|
};
|
||||||
|
|
||||||
event.sender.send(IpcEvents.device.setPrivilegeOnLinuxReply, response);
|
event.sender.send(IpcEvents.device.setPrivilegeOnLinuxReply, response);
|
||||||
@@ -39,7 +53,7 @@ export class SudoService {
|
|||||||
private async setPrivilegeOnLinux(event: Electron.Event) {
|
private async setPrivilegeOnLinux(event: Electron.Event) {
|
||||||
const tmpDirectory = dirSync();
|
const tmpDirectory = dirSync();
|
||||||
const rulesDir = path.join(this.rootDir, 'rules');
|
const rulesDir = path.join(this.rootDir, 'rules');
|
||||||
this.logService.debug('[SudoService] Copy rules dir', { src: rulesDir, dst: tmpDirectory.name });
|
this.logService.debug('[SudoService] Copy rules dir', {src: rulesDir, dst: tmpDirectory.name});
|
||||||
await copy(rulesDir, tmpDirectory.name);
|
await copy(rulesDir, tmpDirectory.name);
|
||||||
|
|
||||||
const scriptPath = path.join(tmpDirectory.name, 'setup-rules.sh');
|
const scriptPath = path.join(tmpDirectory.name, 'setup-rules.sh');
|
||||||
@@ -55,7 +69,7 @@ export class SudoService {
|
|||||||
if (error) {
|
if (error) {
|
||||||
this.logService.error('[SudoService] Error when set privilege: ', error);
|
this.logService.error('[SudoService] Error when set privilege: ', error);
|
||||||
response.success = false;
|
response.success = false;
|
||||||
response.error = error;
|
response.error = {message: error.message};
|
||||||
} else {
|
} else {
|
||||||
response.success = true;
|
response.success = true;
|
||||||
}
|
}
|
||||||
|
|||||||
32
packages/uhk-agent/src/util/backup-user-confoguration.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import { app } from 'electron';
|
||||||
|
import { LogService, UserConfiguration, SaveUserConfigurationData } from 'uhk-common';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as fs from 'fs-extra';
|
||||||
|
|
||||||
|
export const getBackupUserConfigurationPath = (uniqueId: number): string => {
|
||||||
|
const appDataDir = app.getPath('userData');
|
||||||
|
|
||||||
|
return path.join(appDataDir, `${uniqueId}.json`);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const backupUserConfiguration = (data: SaveUserConfigurationData): Promise<void> => {
|
||||||
|
const backupFilePath = getBackupUserConfigurationPath(data.uniqueId);
|
||||||
|
return fs.writeJSON(backupFilePath, data.configuration, {spaces: 2});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getBackupUserConfigurationContent = async (logService: LogService, uniqueId: number): Promise<UserConfiguration> => {
|
||||||
|
try {
|
||||||
|
const backupFilePath = getBackupUserConfigurationPath(uniqueId);
|
||||||
|
|
||||||
|
if (await fs.pathExists(backupFilePath)) {
|
||||||
|
const json = await fs.readJSON(backupFilePath);
|
||||||
|
new UserConfiguration().fromJsonObject(json);
|
||||||
|
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
} catch (error) {
|
||||||
|
logService.error('Can not load backup user configuration for device', {uniqueId, error});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -105,6 +105,10 @@
|
|||||||
{
|
{
|
||||||
"id": "29",
|
"id": "29",
|
||||||
"text": "Z"
|
"text": "Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "100",
|
||||||
|
"text": "| ISO"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -314,10 +318,6 @@
|
|||||||
"id": "69",
|
"id": "69",
|
||||||
"text": "F12"
|
"text": "F12"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "100",
|
|
||||||
"text": "| ISO"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "104",
|
"id": "104",
|
||||||
"text": "F13"
|
"text": "F13"
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
export interface CommandLineArgs {
|
export interface CommandLineArgs {
|
||||||
addons: boolean;
|
/**
|
||||||
|
* addons menu visible or not
|
||||||
|
*/
|
||||||
|
addons?: boolean;
|
||||||
|
/**
|
||||||
|
* simulate privilege escalation error
|
||||||
|
*/
|
||||||
|
spe?: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { HardwareModules } from './hardware-modules';
|
import { HardwareModules } from './hardware-modules';
|
||||||
|
import { UserConfiguration } from '../config-serializer/config-items';
|
||||||
|
|
||||||
export interface ConfigurationReply {
|
export interface ConfigurationReply {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
@@ -6,4 +7,5 @@ export interface ConfigurationReply {
|
|||||||
hardwareConfiguration?: string;
|
hardwareConfiguration?: string;
|
||||||
modules?: HardwareModules;
|
modules?: HardwareModules;
|
||||||
error?: string;
|
error?: string;
|
||||||
|
backupConfiguration?: UserConfiguration;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,3 +7,4 @@ export * from './version-information';
|
|||||||
export * from './device-connection-state';
|
export * from './device-connection-state';
|
||||||
export * from './hardware-modules';
|
export * from './hardware-modules';
|
||||||
export * from './hardware-module-info';
|
export * from './hardware-module-info';
|
||||||
|
export * from './save-user-configuration-data';
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface SaveUserConfigurationData {
|
||||||
|
uniqueId: number;
|
||||||
|
configuration: string;
|
||||||
|
}
|
||||||
33
packages/uhk-common/src/util/helpers.ts
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import { HardwareConfiguration, UhkBuffer, UserConfiguration } from '../../index';
|
||||||
|
|
||||||
|
export const getHardwareConfigFromDeviceResponse = (json: string): HardwareConfiguration => {
|
||||||
|
const data = JSON.parse(json);
|
||||||
|
const hardwareConfig = new HardwareConfiguration();
|
||||||
|
hardwareConfig.fromBinary(UhkBuffer.fromArray(data));
|
||||||
|
|
||||||
|
if (hardwareConfig.uniqueId > 0) {
|
||||||
|
return hardwareConfig;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getUserConfigFromDeviceResponse = (json: string): UserConfiguration => {
|
||||||
|
const data = JSON.parse(json);
|
||||||
|
const userConfig = new UserConfiguration();
|
||||||
|
userConfig.fromBinary(UhkBuffer.fromArray(data));
|
||||||
|
|
||||||
|
if (userConfig.userConfigMajorVersion > 0) {
|
||||||
|
return userConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw Error('Invalid user configuration');
|
||||||
|
};
|
||||||
|
|
||||||
|
export const mapObjectToUserConfigBinaryBuffer = (obj: any): Buffer => {
|
||||||
|
const configuration = new UserConfiguration();
|
||||||
|
configuration.fromJsonObject(obj);
|
||||||
|
const buffer = new UhkBuffer();
|
||||||
|
configuration.toBinary(buffer);
|
||||||
|
|
||||||
|
return buffer.getBufferContent();
|
||||||
|
};
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
export { IpcEvents } from './ipcEvents';
|
export { IpcEvents } from './ipcEvents';
|
||||||
export * from './log';
|
export * from './log';
|
||||||
export * from './constants';
|
export * from './constants';
|
||||||
|
export * from './helpers';
|
||||||
|
|
||||||
// Source: http://stackoverflow.com/questions/13720256/javascript-regex-camelcase-to-sentence
|
// Source: http://stackoverflow.com/questions/13720256/javascript-regex-camelcase-to-sentence
|
||||||
export function camelCaseToSentence(camelCasedText: string): string {
|
export function camelCaseToSentence(camelCasedText: string): string {
|
||||||
|
|||||||
172
packages/uhk-usb/package-lock.json
generated
@@ -23,7 +23,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"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bindings": {
|
"bindings": {
|
||||||
@@ -32,11 +32,12 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"chownr": {
|
"chownr": {
|
||||||
@@ -59,6 +60,14 @@
|
|||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||||
},
|
},
|
||||||
|
"decompress-response": {
|
||||||
|
"version": "3.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
|
||||||
|
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
|
||||||
|
"requires": {
|
||||||
|
"mimic-response": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"deep-extend": {
|
"deep-extend": {
|
||||||
"version": "0.4.2",
|
"version": "0.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
|
||||||
@@ -69,10 +78,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
||||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
||||||
},
|
},
|
||||||
|
"detect-libc": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||||
|
"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"
|
||||||
}
|
}
|
||||||
@@ -113,9 +127,9 @@
|
|||||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||||
},
|
},
|
||||||
"ini": {
|
"ini": {
|
||||||
"version": "1.3.4",
|
"version": "1.3.5",
|
||||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
|
||||||
"integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4="
|
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
|
||||||
},
|
},
|
||||||
"is-fullwidth-code-point": {
|
"is-fullwidth-code-point": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
@@ -130,6 +144,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="
|
||||||
},
|
},
|
||||||
|
"mimic-response": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4="
|
||||||
|
},
|
||||||
"minimist": {
|
"minimist": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||||
@@ -151,14 +170,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nan": {
|
"nan": {
|
||||||
"version": "2.7.0",
|
"version": "2.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
|
||||||
"integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY="
|
"integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
|
||||||
},
|
},
|
||||||
"node-abi": {
|
"node-abi": {
|
||||||
"version": "2.1.1",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.3.0.tgz",
|
||||||
"integrity": "sha512-6oxV13poCOv7TfGvhsSz6XZWpXeKkdGVh72++cs33OfMh3KAX8lN84dCvmqSETyDXAFcUHtV7eJrgFBoOqZbNQ=="
|
"integrity": "sha512-zwm6vU3SsVgw3e9fu48JBaRBCJGIvAgysDsqtf5+vEexFE71bEOtaMWb5zr/zODZNzTPtQlqUUpC79k68Hspow==",
|
||||||
|
"requires": {
|
||||||
|
"semver": "5.5.0"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node-hid": {
|
"node-hid": {
|
||||||
"version": "0.5.7",
|
"version": "0.5.7",
|
||||||
@@ -166,8 +188,8 @@
|
|||||||
"integrity": "sha512-dwwpOetL2+MGYgivbO22ML+45ieCGbueWv1rYxRgBoEc2QMp6UF6ZucEkYts1IA3YPWJNkmpGh6dqQ85n19szw==",
|
"integrity": "sha512-dwwpOetL2+MGYgivbO22ML+45ieCGbueWv1rYxRgBoEc2QMp6UF6ZucEkYts1IA3YPWJNkmpGh6dqQ85n19szw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"bindings": "1.3.0",
|
"bindings": "1.3.0",
|
||||||
"nan": "2.7.0",
|
"nan": "2.10.0",
|
||||||
"prebuild-install": "2.3.0"
|
"prebuild-install": "2.5.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"noop-logger": {
|
"noop-logger": {
|
||||||
@@ -210,62 +232,63 @@
|
|||||||
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
|
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
|
||||||
},
|
},
|
||||||
"prebuild-install": {
|
"prebuild-install": {
|
||||||
"version": "2.3.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.1.tgz",
|
||||||
"integrity": "sha512-gzjq2oHB8oMbzJSsSh9MQ64zrXZGt092/uT4TLZlz2qnrPxpWqp4vYB7LZrDxnlxf5RfbCjkgDI/z0EIVuYzAw==",
|
"integrity": "sha512-3DX9L6pzwc1m1ksMkW3Ky2WLgPQUBiySOfXVl3WZyAeJSyJb4wtoH9OmeRGcubAWsMlLiL8BTHbwfm/jPQE9Ag==",
|
||||||
"requires": {
|
"requires": {
|
||||||
|
"detect-libc": "1.0.3",
|
||||||
"expand-template": "1.1.0",
|
"expand-template": "1.1.0",
|
||||||
"github-from-package": "0.0.0",
|
"github-from-package": "0.0.0",
|
||||||
"minimist": "1.2.0",
|
"minimist": "1.2.0",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"node-abi": "2.1.1",
|
"node-abi": "2.3.0",
|
||||||
"noop-logger": "0.1.1",
|
"noop-logger": "0.1.1",
|
||||||
"npmlog": "4.1.2",
|
"npmlog": "4.1.2",
|
||||||
"os-homedir": "1.0.2",
|
"os-homedir": "1.0.2",
|
||||||
"pump": "1.0.2",
|
"pump": "2.0.1",
|
||||||
"rc": "1.2.2",
|
"rc": "1.2.6",
|
||||||
"simple-get": "1.4.3",
|
"simple-get": "2.7.0",
|
||||||
"tar-fs": "1.16.0",
|
"tar-fs": "1.16.0",
|
||||||
"tunnel-agent": "0.6.0",
|
"tunnel-agent": "0.6.0",
|
||||||
"xtend": "4.0.1"
|
"which-pm-runs": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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": "1.0.2",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
|
||||||
"integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=",
|
"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"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rc": {
|
"rc": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.6",
|
||||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz",
|
||||||
"integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=",
|
"integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"deep-extend": "0.4.2",
|
"deep-extend": "0.4.2",
|
||||||
"ini": "1.3.4",
|
"ini": "1.3.5",
|
||||||
"minimist": "1.2.0",
|
"minimist": "1.2.0",
|
||||||
"strip-json-comments": "2.0.1"
|
"strip-json-comments": "2.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -274,6 +297,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
||||||
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
|
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
|
||||||
},
|
},
|
||||||
|
"semver": {
|
||||||
|
"version": "5.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
|
||||||
|
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
|
||||||
|
},
|
||||||
"set-blocking": {
|
"set-blocking": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||||
@@ -284,14 +312,19 @@
|
|||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
||||||
},
|
},
|
||||||
|
"simple-concat": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
|
||||||
|
},
|
||||||
"simple-get": {
|
"simple-get": {
|
||||||
"version": "1.4.3",
|
"version": "2.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz",
|
||||||
"integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=",
|
"integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
|
"decompress-response": "3.3.0",
|
||||||
"once": "1.4.0",
|
"once": "1.4.0",
|
||||||
"unzip-response": "1.0.2",
|
"simple-concat": "1.0.0"
|
||||||
"xtend": "4.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"string-width": {
|
"string-width": {
|
||||||
@@ -305,9 +338,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"
|
||||||
}
|
}
|
||||||
@@ -332,18 +365,29 @@
|
|||||||
"requires": {
|
"requires": {
|
||||||
"chownr": "1.0.1",
|
"chownr": "1.0.1",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"pump": "1.0.2",
|
"pump": "1.0.3",
|
||||||
"tar-stream": "1.5.4"
|
"tar-stream": "1.5.5"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"pump": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
|
||||||
|
"requires": {
|
||||||
|
"end-of-stream": "1.4.1",
|
||||||
|
"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"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -355,16 +399,16 @@
|
|||||||
"safe-buffer": "5.1.1"
|
"safe-buffer": "5.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"unzip-response": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4="
|
|
||||||
},
|
|
||||||
"util-deprecate": {
|
"util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||||
},
|
},
|
||||||
|
"which-pm-runs": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
|
||||||
|
},
|
||||||
"wide-align": {
|
"wide-align": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Device, devices, HID } from 'node-hid';
|
import { Device, devices, HID } from 'node-hid';
|
||||||
import { LogService } from 'uhk-common';
|
import { CommandLineArgs, LogService } from 'uhk-common';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ConfigBufferId,
|
ConfigBufferId,
|
||||||
@@ -27,7 +27,8 @@ export class UhkHidDevice {
|
|||||||
private _device: HID;
|
private _device: HID;
|
||||||
private _hasPermission = false;
|
private _hasPermission = false;
|
||||||
|
|
||||||
constructor(private logService: LogService) {
|
constructor(private logService: LogService,
|
||||||
|
private options: CommandLineArgs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,6 +39,10 @@ export class UhkHidDevice {
|
|||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
public hasPermission(): boolean {
|
public hasPermission(): boolean {
|
||||||
|
if (this.options.spe) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (this._hasPermission) {
|
if (this._hasPermission) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -105,8 +105,6 @@ export class UhkOperations {
|
|||||||
* @returns {Promise<Buffer>}
|
* @returns {Promise<Buffer>}
|
||||||
*/
|
*/
|
||||||
public async loadConfiguration(configBufferId: ConfigBufferId): Promise<string> {
|
public async loadConfiguration(configBufferId: ConfigBufferId): Promise<string> {
|
||||||
let response = [];
|
|
||||||
|
|
||||||
const configBufferIdToName = ['HardwareConfig', 'StagingUserConfig', 'ValidatedUserConfig'];
|
const configBufferIdToName = ['HardwareConfig', 'StagingUserConfig', 'ValidatedUserConfig'];
|
||||||
const configName = configBufferIdToName[configBufferId];
|
const configName = configBufferIdToName[configBufferId];
|
||||||
|
|
||||||
@@ -140,7 +138,8 @@ export class UhkOperations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
response = convertBufferToIntArray(configBuffer);
|
const response = convertBufferToIntArray(configBuffer);
|
||||||
|
|
||||||
return Promise.resolve(JSON.stringify(response));
|
return Promise.resolve(JSON.stringify(response));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errMsg = `[DeviceOperation] ${configName} from eeprom error`;
|
const errMsg = `[DeviceOperation] ${configName} from eeprom error`;
|
||||||
@@ -165,10 +164,10 @@ export class UhkOperations {
|
|||||||
return configSize;
|
return configSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async saveUserConfiguration(json: string): Promise<void> {
|
public async saveUserConfiguration(buffer: Buffer): Promise<void> {
|
||||||
try {
|
try {
|
||||||
this.logService.debug('[DeviceOperation] USB[T]: Write user configuration to keyboard');
|
this.logService.debug('[DeviceOperation] USB[T]: Write user configuration to keyboard');
|
||||||
await this.sendUserConfigToKeyboard(json);
|
await this.sendUserConfigToKeyboard(buffer);
|
||||||
this.logService.debug('[DeviceOperation] USB[T]: Write user configuration to EEPROM');
|
this.logService.debug('[DeviceOperation] USB[T]: Write user configuration to EEPROM');
|
||||||
await this.device.writeConfigToEeprom(ConfigBufferId.validatedUserConfig);
|
await this.device.writeConfigToEeprom(ConfigBufferId.validatedUserConfig);
|
||||||
}
|
}
|
||||||
@@ -246,12 +245,11 @@ export class UhkOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* IpcMain handler. Send the UserConfiguration to the UHK Device and send a response with the result.
|
* IpcMain handler. Send the UserConfiguration to the UHK Device and send a response with the result.
|
||||||
* @param {string} json - UserConfiguration in JSON format
|
* @param {Buffer} buffer - UserConfiguration buffer
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
private async sendUserConfigToKeyboard(json: string): Promise<void> {
|
private async sendUserConfigToKeyboard(buffer: Buffer): Promise<void> {
|
||||||
const buffer: Buffer = new Buffer(JSON.parse(json).data);
|
|
||||||
const fragments = getTransferBuffers(UsbCommand.WriteStagingUserConfig, buffer);
|
const fragments = getTransferBuffers(UsbCommand.WriteStagingUserConfig, buffer);
|
||||||
for (const fragment of fragments) {
|
for (const fragment of fragments) {
|
||||||
await this.device.write(fragment);
|
await this.device.write(fragment);
|
||||||
|
|||||||
786
packages/uhk-web/package-lock.json
generated
@@ -38,7 +38,6 @@
|
|||||||
"@types/jasminewd2": "2.0.2",
|
"@types/jasminewd2": "2.0.2",
|
||||||
"@types/jquery": "3.2.9",
|
"@types/jquery": "3.2.9",
|
||||||
"@types/lodash-es": "4.17.0",
|
"@types/lodash-es": "4.17.0",
|
||||||
"@types/node-hid": "0.5.2",
|
|
||||||
"@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",
|
||||||
@@ -72,8 +71,8 @@
|
|||||||
"ng2-dragula": "1.5.0",
|
"ng2-dragula": "1.5.0",
|
||||||
"ng2-nouislider": "^1.7.6",
|
"ng2-nouislider": "^1.7.6",
|
||||||
"ng2-select2": "1.0.0-beta.10",
|
"ng2-select2": "1.0.0-beta.10",
|
||||||
|
"ngx-clipboard": "8.0.0",
|
||||||
"ngrx-store-freeze": "0.1.9",
|
"ngrx-store-freeze": "0.1.9",
|
||||||
"node-hid": "0.5.4",
|
|
||||||
"nouislider": "^10.1.0",
|
"nouislider": "^10.1.0",
|
||||||
"postcss-loader": "1.3.3",
|
"postcss-loader": "1.3.3",
|
||||||
"postcss-url": "5.1.2",
|
"postcss-url": "5.1.2",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Component, HostListener, ViewEncapsulation } from '@angular/core';
|
import { Component, ViewEncapsulation } from '@angular/core';
|
||||||
import { animate, style, transition, trigger } from '@angular/animations';
|
import { animate, style, transition, trigger } from '@angular/animations';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { Action, Store } from '@ngrx/store';
|
import { Action, Store } from '@ngrx/store';
|
||||||
@@ -14,7 +14,6 @@ import {
|
|||||||
saveToKeyboardState
|
saveToKeyboardState
|
||||||
} from './store';
|
} from './store';
|
||||||
import { ProgressButtonState } from './store/reducers/progress-button-state';
|
import { ProgressButtonState } from './store/reducers/progress-button-state';
|
||||||
import { SaveUserConfigInBinaryFileAction, SaveUserConfigInJsonFileAction } from './store/actions/user-config';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'main-app',
|
selector: 'main-app',
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { DeviceConfigurationComponent } from './configuration/device-configurati
|
|||||||
import { DeviceFirmwareComponent } from './firmware/device-firmware.component';
|
import { DeviceFirmwareComponent } from './firmware/device-firmware.component';
|
||||||
import { MouseSpeedComponent } from './mouse-speed/mouse-speed.component';
|
import { MouseSpeedComponent } from './mouse-speed/mouse-speed.component';
|
||||||
import { LEDBrightnessComponent } from './led-brightness/led-brightness.component';
|
import { LEDBrightnessComponent } from './led-brightness/led-brightness.component';
|
||||||
|
import { RestoreConfigurationComponent } from './restore-configuration/restore-configuration.component';
|
||||||
|
|
||||||
export const deviceRoutes: Routes = [
|
export const deviceRoutes: Routes = [
|
||||||
{
|
{
|
||||||
@@ -29,6 +30,10 @@ export const deviceRoutes: Routes = [
|
|||||||
{
|
{
|
||||||
path: 'firmware',
|
path: 'firmware',
|
||||||
component: DeviceFirmwareComponent
|
component: DeviceFirmwareComponent
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'restore-user-configuration',
|
||||||
|
component: RestoreConfigurationComponent
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ export * from './configuration/device-configuration.component';
|
|||||||
export * from './firmware/device-firmware.component';
|
export * from './firmware/device-firmware.component';
|
||||||
export * from './mouse-speed/mouse-speed.component';
|
export * from './mouse-speed/mouse-speed.component';
|
||||||
export * from './led-brightness/led-brightness.component';
|
export * from './led-brightness/led-brightness.component';
|
||||||
|
export * from './restore-configuration/restore-configuration.component';
|
||||||
export * from './device.routes';
|
export * from './device.routes';
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<h1>
|
||||||
|
<i class="fa fa-exclamation-circle"></i>
|
||||||
|
<span>Fix configuration</span>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Your on-board device configuration is invalid.
|
||||||
|
</p>
|
||||||
|
<button class="btn btn-primary"
|
||||||
|
*ngIf="state.hasBackupUserConfiguration"
|
||||||
|
[disabled]="state.restoringUserConfiguration"
|
||||||
|
(click)="restoreUserConfiguration()"> Restore the last valid device configuration
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button class="btn btn-danger"
|
||||||
|
*ngIf="!state.hasBackupUserConfiguration"
|
||||||
|
[disabled]="state.restoringUserConfiguration"
|
||||||
|
(click)="resetUserConfiguration()">Reset device configuration
|
||||||
|
</button>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
:host {
|
||||||
|
overflow-y: auto;
|
||||||
|
display: block;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 1.5rem 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
|
||||||
|
import { Store } from '@ngrx/store';
|
||||||
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
|
|
||||||
|
import { AppState, getBackupUserConfigurationState } from '../../../store';
|
||||||
|
import { ResetUserConfigurationAction, RestoreUserConfigurationFromBackupAction } from '../../../store/actions/device';
|
||||||
|
import { RestoreConfigurationState } from '../../../models/restore-configuration-state';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'restore-configuration',
|
||||||
|
templateUrl: './restore-configuration.component.html',
|
||||||
|
styleUrls: ['./restore-configuration.component.scss'],
|
||||||
|
host: {
|
||||||
|
'class': 'container-fluid'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export class RestoreConfigurationComponent implements OnInit, OnDestroy {
|
||||||
|
state: RestoreConfigurationState;
|
||||||
|
|
||||||
|
private stateSubscription: Subscription;
|
||||||
|
|
||||||
|
constructor(private store: Store<AppState>,
|
||||||
|
private cdRef: ChangeDetectorRef) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy(): void {
|
||||||
|
if (this.stateSubscription) {
|
||||||
|
this.stateSubscription.unsubscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.stateSubscription = this.store
|
||||||
|
.select(getBackupUserConfigurationState)
|
||||||
|
.subscribe(data => {
|
||||||
|
this.state = data;
|
||||||
|
this.cdRef.markForCheck();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
resetUserConfiguration() {
|
||||||
|
this.store.dispatch(new ResetUserConfigurationAction());
|
||||||
|
}
|
||||||
|
|
||||||
|
restoreUserConfiguration(): void {
|
||||||
|
this.store.dispatch(new RestoreUserConfigurationFromBackupAction());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,39 @@
|
|||||||
<span class="privilege-checker-wrapper">
|
<div class="privilege-checker-wrapper">
|
||||||
<uhk-message header="Cannot talk to your UHK" subtitle="Your UHK has been detected, but its permissions are not set up yet, so Agent can't talk to it."></uhk-message>
|
<uhk-message header="Cannot talk to your UHK"
|
||||||
<button class="btn btn-default btn-lg btn-primary" (click)="setUpPermissions()"> Set up permissions </button>
|
subtitle="Your UHK has been detected, but its permissions are not set up yet, so Agent can't talk to it."></uhk-message>
|
||||||
</span>
|
|
||||||
|
<button class="btn btn-default btn-lg btn-primary"
|
||||||
|
(click)="setUpPermissions()"> Set up permissions
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="mt-10">
|
||||||
|
<a class="link-inline"
|
||||||
|
*ngIf="state.showWhatWillThisDo"
|
||||||
|
(click)="whatWillThisDo()">What will this do?
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p class="privilege-error"
|
||||||
|
#privilegeError
|
||||||
|
*ngIf="state.permissionSetupFailed">
|
||||||
|
Agent wasn't able to set up permissions via PolicyKit. This is most likely because the
|
||||||
|
<code>polkit</code> package is not installed on your system.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div *ngIf="state.showWhatWillThisDoContent">
|
||||||
|
Agent uses the following script to set up permissions. You can run it manually as root, then
|
||||||
|
<a class="link-inline"
|
||||||
|
(click)="retry()">retry</a>.
|
||||||
|
<div class="copy-container">
|
||||||
|
<span class="fa fa-2x fa-copy"
|
||||||
|
ngxClipboard
|
||||||
|
[cbContent]="command"
|
||||||
|
title="Copy to clipboard"
|
||||||
|
data-toggle="tooltip"
|
||||||
|
data-placement="top"></span>
|
||||||
|
<pre><code>{{ command }}</code></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -9,3 +9,19 @@
|
|||||||
uhk-message {
|
uhk-message {
|
||||||
max-width: 50%;
|
max-width: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.privilege-error {
|
||||||
|
animation: error-fade-in 2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes error-fade-in {
|
||||||
|
0% {
|
||||||
|
color: white;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
color: inherit;
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,26 +1,61 @@
|
|||||||
import { Component } from '@angular/core';
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
import 'rxjs/add/observable/of';
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
import 'rxjs/add/observable/throw';
|
|
||||||
import 'rxjs/add/operator/distinctUntilChanged';
|
|
||||||
import 'rxjs/add/operator/ignoreElements';
|
|
||||||
import 'rxjs/add/operator/takeWhile';
|
|
||||||
|
|
||||||
import { AppState } from '../../store/index';
|
import { AppState, getPrivilegePageState } from '../../store';
|
||||||
import { SetPrivilegeOnLinuxAction } from '../../store/actions/device';
|
import { SetPrivilegeOnLinuxAction } from '../../store/actions/device';
|
||||||
|
import { LoadAppStartInfoAction, PrivilegeWhatWillThisDoAction } from '../../store/actions/app';
|
||||||
|
import { PrivilagePageSate } from '../../models/privilage-page-sate';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'privilege-checker',
|
selector: 'privilege-checker',
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
templateUrl: './privilege-checker.component.html',
|
templateUrl: './privilege-checker.component.html',
|
||||||
styleUrls: ['./privilege-checker.component.scss']
|
styleUrls: ['./privilege-checker.component.scss']
|
||||||
})
|
})
|
||||||
export class PrivilegeCheckerComponent {
|
|
||||||
|
|
||||||
constructor(protected store: Store<AppState>) {
|
export class PrivilegeCheckerComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
|
state: PrivilagePageSate;
|
||||||
|
|
||||||
|
command = `cat <<EOF >/etc/udev/rules.d/50-uhk60.rules
|
||||||
|
# Ultimate Hacking Keyboard rules
|
||||||
|
# These are the udev rules for accessing the USB interfaces of the UHK as non-root users.
|
||||||
|
# Copy this file to /etc/udev/rules.d and physically reconnect the UHK afterwards.
|
||||||
|
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="612[0-7]", MODE:="0666"
|
||||||
|
EOF
|
||||||
|
udevadm trigger
|
||||||
|
udevadm settle`;
|
||||||
|
|
||||||
|
private stateSubscription: Subscription;
|
||||||
|
|
||||||
|
constructor(private store: Store<AppState>,
|
||||||
|
private cdRef: ChangeDetectorRef) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.stateSubscription = this.store.select(getPrivilegePageState)
|
||||||
|
.subscribe(state => {
|
||||||
|
this.state = state;
|
||||||
|
this.cdRef.markForCheck();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnDestroy(): void {
|
||||||
|
if (this.stateSubscription) {
|
||||||
|
this.stateSubscription.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setUpPermissions(): void {
|
setUpPermissions(): void {
|
||||||
this.store.dispatch(new SetPrivilegeOnLinuxAction());
|
this.store.dispatch(new SetPrivilegeOnLinuxAction());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
whatWillThisDo(): void {
|
||||||
|
this.store.dispatch(new PrivilegeWhatWillThisDoAction());
|
||||||
|
}
|
||||||
|
|
||||||
|
retry(): void {
|
||||||
|
this.store.dispatch(new LoadAppStartInfoAction());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<input #deviceName cancelable
|
<input #deviceName cancelable
|
||||||
class="pane-title__name"
|
class="pane-title__name"
|
||||||
type="text"
|
type="text"
|
||||||
|
[readonly]="state.restoreUserConfiguration"
|
||||||
(change)="editDeviceName($event.target.value)"
|
(change)="editDeviceName($event.target.value)"
|
||||||
(keyup.enter)="deviceName.blur()"
|
(keyup.enter)="deviceName.blur()"
|
||||||
(keyup)="calculateHeaderTextWidth($event.target.value)">
|
(keyup)="calculateHeaderTextWidth($event.target.value)">
|
||||||
@@ -17,33 +18,43 @@
|
|||||||
<i class="fa fa-chevron-up pull-right" (click)="toggleHide($event, 'configuration')"></i>
|
<i class="fa fa-chevron-up pull-right" (click)="toggleHide($event, 'configuration')"></i>
|
||||||
</div>
|
</div>
|
||||||
<ul [@toggler]="animation['configuration']">
|
<ul [@toggler]="animation['configuration']">
|
||||||
<li class="sidebar__level-2--item">
|
<li class="sidebar__level-2--item"
|
||||||
|
*ngIf="!state.restoreUserConfiguration">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/device/mouse-speed']"
|
<a [routerLink]="['/device/mouse-speed']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Mouse speed</a>
|
[class.disabled]="state.updatingFirmware">Mouse speed</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-2--item">
|
<li class="sidebar__level-2--item"
|
||||||
|
*ngIf="!state.restoreUserConfiguration">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/device/led-brightness']"
|
<a [routerLink]="['/device/led-brightness']"
|
||||||
[class.disabled]="updatingFirmware$ | async">LED brightness</a>
|
[class.disabled]="state.updatingFirmware">LED brightness</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-2--item">
|
<li class="sidebar__level-2--item"
|
||||||
|
*ngIf="!state.restoreUserConfiguration">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/device/configuration']"
|
<a [routerLink]="['/device/configuration']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Configuration</a>
|
[class.disabled]="state.updatingFirmware">Configuration</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="sidebar__level-2--item"
|
||||||
|
*ngIf="state.restoreUserConfiguration">
|
||||||
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
|
<a [routerLink]="['/device/restore-user-configuration']">Fix configuration</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-2--item">
|
<li class="sidebar__level-2--item">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/device/firmware']"
|
<a [routerLink]="['/device/firmware']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Firmware</a>
|
[class.disabled]="state.updatingFirmware">Firmware</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-1--item">
|
<li class="sidebar__level-1--item"
|
||||||
|
*ngIf="!state.restoreUserConfiguration">
|
||||||
<div class="sidebar__level-1">
|
<div class="sidebar__level-1">
|
||||||
<i class="fa fa-keyboard-o"></i> Keymaps
|
<i class="fa fa-keyboard-o"></i> Keymaps
|
||||||
<!--a [routerLink]="['/keymap/add']"
|
<!--a [routerLink]="['/keymap/add']"
|
||||||
@@ -55,10 +66,10 @@
|
|||||||
(click)="toggleHide($event, 'keymap')"></i>
|
(click)="toggleHide($event, 'keymap')"></i>
|
||||||
</div>
|
</div>
|
||||||
<ul [@toggler]="animation['keymap']">
|
<ul [@toggler]="animation['keymap']">
|
||||||
<li *ngFor="let keymap of keymaps$ | async" class="sidebar__level-2--item">
|
<li *ngFor="let keymap of state.keymaps" class="sidebar__level-2--item">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/keymap', keymap.abbreviation]"
|
<a [routerLink]="['/keymap', keymap.abbreviation]"
|
||||||
[class.disabled]="updatingFirmware$ | async">{{keymap.name}}</a>
|
[class.disabled]="state.updatingFirmware">{{keymap.name}}</a>
|
||||||
<i *ngIf="keymap.isDefault" class="fa fa-star sidebar__fav"
|
<i *ngIf="keymap.isDefault" class="fa fa-star sidebar__fav"
|
||||||
title="This is the default keymap which gets activated when powering the keyboard."
|
title="This is the default keymap which gets activated when powering the keyboard."
|
||||||
data-toggle="tooltip" data-placement="bottom"></i>
|
data-toggle="tooltip" data-placement="bottom"></i>
|
||||||
@@ -66,26 +77,27 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-1--item">
|
<li class="sidebar__level-1--item"
|
||||||
|
*ngIf="!state.restoreUserConfiguration">
|
||||||
<div class="sidebar__level-1">
|
<div class="sidebar__level-1">
|
||||||
<i class="fa fa-play"></i> Macros
|
<i class="fa fa-play"></i> Macros
|
||||||
<a (click)="addMacro()"
|
<a (click)="addMacro()"
|
||||||
class="btn btn-default pull-right btn-sm"
|
class="btn btn-default pull-right btn-sm"
|
||||||
[class.disabled]="updatingFirmware$ | async">
|
[class.disabled]="state.updatingFirmware">
|
||||||
<i class="fa fa-plus"></i>
|
<i class="fa fa-plus"></i>
|
||||||
</a>
|
</a>
|
||||||
<i class="fa fa-chevron-up pull-right" (click)="toggleHide($event, 'macro')"></i>
|
<i class="fa fa-chevron-up pull-right" (click)="toggleHide($event, 'macro')"></i>
|
||||||
</div>
|
</div>
|
||||||
<ul [@toggler]="animation['macro']">
|
<ul [@toggler]="animation['macro']">
|
||||||
<li *ngFor="let macro of macros$ | async" class="sidebar__level-2--item">
|
<li *ngFor="let macro of state.macros" class="sidebar__level-2--item">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/macro', macro.id]"
|
<a [routerLink]="['/macro', macro.id]"
|
||||||
[class.disabled]="updatingFirmware$ | async">{{macro.name}}</a>
|
[class.disabled]="state.updatingFirmware">{{macro.name}}</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-1--item" *ngIf="showAddonMenu$ | async">
|
<li class="sidebar__level-1--item" *ngIf="state.showAddonMenu">
|
||||||
<div class="sidebar__level-1">
|
<div class="sidebar__level-1">
|
||||||
<i class="fa fa-puzzle-piece"></i> Add-on modules
|
<i class="fa fa-puzzle-piece"></i> Add-on modules
|
||||||
<i class="fa fa-chevron-up pull-right" (click)="toggleHide($event, 'addon')"></i>
|
<i class="fa fa-chevron-up pull-right" (click)="toggleHide($event, 'addon')"></i>
|
||||||
@@ -94,25 +106,25 @@
|
|||||||
<li class="sidebar__level-2--item" data-name="Key cluster" data-abbrev="">
|
<li class="sidebar__level-2--item" data-name="Key cluster" data-abbrev="">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/add-on', 'Key cluster']"
|
<a [routerLink]="['/add-on', 'Key cluster']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Key cluster</a>
|
[class.disabled]="state.updatingFirmware">Key cluster</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-2--item" data-name="Trackball" data-abbrev="">
|
<li class="sidebar__level-2--item" data-name="Trackball" data-abbrev="">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/add-on', 'Trackball']"
|
<a [routerLink]="['/add-on', 'Trackball']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Trackball</a>
|
[class.disabled]="state.updatingFirmware">Trackball</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-2--item" data-name="Toucpad" data-abbrev="">
|
<li class="sidebar__level-2--item" data-name="Toucpad" data-abbrev="">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/add-on', 'Touchpad']"
|
<a [routerLink]="['/add-on', 'Touchpad']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Touchpad</a>
|
[class.disabled]="state.updatingFirmware">Touchpad</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-2--item" data-name="Trackpoint" data-abbrev="">
|
<li class="sidebar__level-2--item" data-name="Trackpoint" data-abbrev="">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/add-on', 'Trackpoint']"
|
<a [routerLink]="['/add-on', 'Trackpoint']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Trackpoint</a>
|
[class.disabled]="state.updatingFirmware">Trackpoint</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -129,13 +141,13 @@
|
|||||||
<li class="sidebar__level-2--item">
|
<li class="sidebar__level-2--item">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/settings']"
|
<a [routerLink]="['/settings']"
|
||||||
[class.disabled]="updatingFirmware$ | async">Settings</a>
|
[class.disabled]="state.updatingFirmware">Settings</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="sidebar__level-2--item">
|
<li class="sidebar__level-2--item">
|
||||||
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
<div class="sidebar__level-2" [routerLinkActive]="['active']">
|
||||||
<a [routerLink]="['/about']"
|
<a [routerLink]="['/about']"
|
||||||
[class.disabled]="updatingFirmware$ | async">About</a>
|
[class.disabled]="state.updatingFirmware">About</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -1,20 +1,27 @@
|
|||||||
import { AfterContentInit, Component, ElementRef, OnDestroy, Renderer2, ViewChild } from '@angular/core';
|
import {
|
||||||
|
AfterContentInit,
|
||||||
|
ChangeDetectionStrategy,
|
||||||
|
ChangeDetectorRef,
|
||||||
|
Component,
|
||||||
|
ElementRef,
|
||||||
|
OnDestroy, OnInit,
|
||||||
|
Renderer2,
|
||||||
|
ViewChild
|
||||||
|
} from '@angular/core';
|
||||||
import { animate, state, style, transition, trigger } from '@angular/animations';
|
import { animate, state, style, transition, trigger } from '@angular/animations';
|
||||||
import { Keymap, Macro } from 'uhk-common';
|
|
||||||
|
|
||||||
import { Store } from '@ngrx/store';
|
import { Store } from '@ngrx/store';
|
||||||
|
|
||||||
import { Observable } from 'rxjs/Observable';
|
|
||||||
import { Subscription } from 'rxjs/Subscription';
|
import { Subscription } from 'rxjs/Subscription';
|
||||||
import 'rxjs/add/operator/do';
|
import 'rxjs/add/operator/do';
|
||||||
import 'rxjs/add/operator/map';
|
import 'rxjs/add/operator/map';
|
||||||
import 'rxjs/add/operator/let';
|
import 'rxjs/add/operator/let';
|
||||||
|
|
||||||
import { AppState, getDeviceName, runningInElectron, showAddonMenu, updatingFirmware } from '../../store';
|
import { AppState, getSideMenuPageState } from '../../store';
|
||||||
import { MacroActions } from '../../store/actions';
|
import { MacroActions } from '../../store/actions';
|
||||||
import { getKeymaps, getMacros } from '../../store/reducers/user-configuration';
|
|
||||||
import * as util from '../../util';
|
import * as util from '../../util';
|
||||||
import { RenameUserConfigurationAction } from '../../store/actions/user-config';
|
import { RenameUserConfigurationAction } from '../../store/actions/user-config';
|
||||||
|
import { SideMenuPageState } from '../../models/side-menu-page-state';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
animations: [
|
animations: [
|
||||||
@@ -30,24 +37,19 @@ import { RenameUserConfigurationAction } from '../../store/actions/user-config';
|
|||||||
],
|
],
|
||||||
selector: 'side-menu',
|
selector: 'side-menu',
|
||||||
templateUrl: './side-menu.component.html',
|
templateUrl: './side-menu.component.html',
|
||||||
styleUrls: ['./side-menu.component.scss']
|
styleUrls: ['./side-menu.component.scss'],
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush
|
||||||
})
|
})
|
||||||
export class SideMenuComponent implements AfterContentInit, OnDestroy {
|
export class SideMenuComponent implements AfterContentInit, OnInit, OnDestroy {
|
||||||
showAddonMenu$: Observable<boolean>;
|
state: SideMenuPageState;
|
||||||
runInElectron$: Observable<boolean>;
|
|
||||||
updatingFirmware$: Observable<boolean>;
|
|
||||||
|
|
||||||
deviceName$: Observable<string>;
|
|
||||||
deviceNameSubscription: Subscription;
|
|
||||||
keymaps$: Observable<Keymap[]>;
|
|
||||||
macros$: Observable<Macro[]>;
|
|
||||||
animation: { [key: string]: 'active' | 'inactive' };
|
animation: { [key: string]: 'active' | 'inactive' };
|
||||||
deviceNameValue: string;
|
|
||||||
updatingFirmware = false;
|
|
||||||
updatingFirmwareSubscription: Subscription;
|
|
||||||
@ViewChild('deviceName') deviceName: ElementRef;
|
@ViewChild('deviceName') deviceName: ElementRef;
|
||||||
|
|
||||||
constructor(private store: Store<AppState>, private renderer: Renderer2) {
|
private stateSubscription: Subscription;
|
||||||
|
|
||||||
|
constructor(private store: Store<AppState>,
|
||||||
|
private renderer: Renderer2,
|
||||||
|
private cdRef: ChangeDetectorRef) {
|
||||||
this.animation = {
|
this.animation = {
|
||||||
device: 'active',
|
device: 'active',
|
||||||
configuration: 'active',
|
configuration: 'active',
|
||||||
@@ -55,20 +57,13 @@ export class SideMenuComponent implements AfterContentInit, OnDestroy {
|
|||||||
macro: 'active',
|
macro: 'active',
|
||||||
addon: 'active'
|
addon: 'active'
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
this.keymaps$ = store.let(getKeymaps());
|
ngOnInit(): void {
|
||||||
this.macros$ = store.let(getMacros());
|
this.stateSubscription = this.store.select(getSideMenuPageState).subscribe(data => {
|
||||||
|
this.state = data;
|
||||||
this.showAddonMenu$ = this.store.select(showAddonMenu);
|
|
||||||
this.runInElectron$ = this.store.select(runningInElectron);
|
|
||||||
this.deviceName$ = store.select(getDeviceName);
|
|
||||||
this.deviceNameSubscription = this.deviceName$.subscribe(name => {
|
|
||||||
this.deviceNameValue = name;
|
|
||||||
this.setDeviceName();
|
this.setDeviceName();
|
||||||
});
|
this.cdRef.markForCheck();
|
||||||
this.updatingFirmware$ = store.select(updatingFirmware);
|
|
||||||
this.updatingFirmwareSubscription = this.updatingFirmware$.subscribe(updating => {
|
|
||||||
this.updatingFirmware = updating;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,12 +72,13 @@ export class SideMenuComponent implements AfterContentInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
this.deviceNameSubscription.unsubscribe();
|
if (this.stateSubscription) {
|
||||||
this.updatingFirmwareSubscription.unsubscribe();
|
this.stateSubscription.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleHide(event: Event, type: string) {
|
toggleHide(event: Event, type: string) {
|
||||||
if (this.updatingFirmware) {
|
if (this.state.updatingFirmware) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +106,7 @@ export class SideMenuComponent implements AfterContentInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
editDeviceName(name: string): void {
|
editDeviceName(name: string): void {
|
||||||
if (!util.isValidName(name) || name.trim() === this.deviceNameValue) {
|
if (!util.isValidName(name) || name.trim() === this.state.deviceName) {
|
||||||
this.setDeviceName();
|
this.setDeviceName();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -126,7 +122,7 @@ export class SideMenuComponent implements AfterContentInit, OnDestroy {
|
|||||||
|
|
||||||
private setDeviceName(): void {
|
private setDeviceName(): void {
|
||||||
if (this.deviceName) {
|
if (this.deviceName) {
|
||||||
this.renderer.setProperty(this.deviceName.nativeElement, 'value', this.deviceNameValue);
|
this.renderer.setProperty(this.deviceName.nativeElement, 'value', this.state.deviceName);
|
||||||
this.calculateHeaderTextWidth(this.deviceName.nativeElement.value);
|
this.calculateHeaderTextWidth(this.deviceName.nativeElement.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
packages/uhk-web/src/app/models/privilage-page-sate.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export interface PrivilagePageSate {
|
||||||
|
showWhatWillThisDo: boolean;
|
||||||
|
showWhatWillThisDoContent: boolean;
|
||||||
|
permissionSetupFailed: boolean;
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export interface RestoreConfigurationState {
|
||||||
|
restoringUserConfiguration: boolean;
|
||||||
|
hasBackupUserConfiguration: boolean;
|
||||||
|
}
|
||||||
11
packages/uhk-web/src/app/models/side-menu-page-state.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { Keymap, Macro } from 'uhk-common';
|
||||||
|
|
||||||
|
export interface SideMenuPageState {
|
||||||
|
showAddonMenu: boolean;
|
||||||
|
runInElectron: boolean;
|
||||||
|
updatingFirmware: boolean;
|
||||||
|
deviceName: string;
|
||||||
|
keymaps: Keymap[];
|
||||||
|
macros: Macro[];
|
||||||
|
restoreUserConfiguration: boolean;
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Injectable, NgZone } from '@angular/core';
|
import { Injectable, NgZone } from '@angular/core';
|
||||||
import { Action, Store } from '@ngrx/store';
|
import { Action, Store } from '@ngrx/store';
|
||||||
|
|
||||||
import { DeviceConnectionState, IpcEvents, IpcResponse, LogService } from 'uhk-common';
|
import { DeviceConnectionState, IpcEvents, IpcResponse, LogService, SaveUserConfigurationData } from 'uhk-common';
|
||||||
import { AppState } from '../store';
|
import { AppState } from '../store';
|
||||||
import { IpcCommonRenderer } from './ipc-common-renderer';
|
import { IpcCommonRenderer } from './ipc-common-renderer';
|
||||||
import {
|
import {
|
||||||
@@ -26,8 +26,8 @@ export class DeviceRendererService {
|
|||||||
this.ipcRenderer.send(IpcEvents.device.setPrivilegeOnLinux);
|
this.ipcRenderer.send(IpcEvents.device.setPrivilegeOnLinux);
|
||||||
}
|
}
|
||||||
|
|
||||||
saveUserConfiguration(buffer: Buffer): void {
|
saveUserConfiguration(data: SaveUserConfigurationData): void {
|
||||||
this.ipcRenderer.send(IpcEvents.device.saveUserConfiguration, JSON.stringify(buffer));
|
this.ipcRenderer.send(IpcEvents.device.saveUserConfiguration, JSON.stringify(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
loadConfigurationFromKeyboard(): void {
|
loadConfigurationFromKeyboard(): void {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { ConfirmationPopoverModule } from 'angular-confirmation-popover';
|
|||||||
import { DragulaModule } from 'ng2-dragula/ng2-dragula';
|
import { DragulaModule } from 'ng2-dragula/ng2-dragula';
|
||||||
import { Select2Module } from 'ng2-select2/ng2-select2';
|
import { Select2Module } from 'ng2-select2/ng2-select2';
|
||||||
import { NouisliderModule } from 'ng2-nouislider';
|
import { NouisliderModule } from 'ng2-nouislider';
|
||||||
|
import { ClipboardModule } from 'ngx-clipboard';
|
||||||
|
|
||||||
import { AddOnComponent } from './components/add-on';
|
import { AddOnComponent } from './components/add-on';
|
||||||
import { KeyboardSliderComponent } from './components/keyboard/slider';
|
import { KeyboardSliderComponent } from './components/keyboard/slider';
|
||||||
@@ -15,7 +16,8 @@ import {
|
|||||||
DeviceConfigurationComponent,
|
DeviceConfigurationComponent,
|
||||||
DeviceFirmwareComponent,
|
DeviceFirmwareComponent,
|
||||||
MouseSpeedComponent,
|
MouseSpeedComponent,
|
||||||
LEDBrightnessComponent
|
LEDBrightnessComponent,
|
||||||
|
RestoreConfigurationComponent
|
||||||
} from './components/device';
|
} from './components/device';
|
||||||
import { KeymapAddComponent, KeymapEditComponent, KeymapHeaderComponent } from './components/keymap';
|
import { KeymapAddComponent, KeymapEditComponent, KeymapHeaderComponent } from './components/keymap';
|
||||||
import { LayersComponent } from './components/layers';
|
import { LayersComponent } from './components/layers';
|
||||||
@@ -173,7 +175,8 @@ import { Autofocus } from './directives/autofocus/autofocus.directive';
|
|||||||
XtermComponent,
|
XtermComponent,
|
||||||
SliderWrapperComponent,
|
SliderWrapperComponent,
|
||||||
EditableTextComponent,
|
EditableTextComponent,
|
||||||
Autofocus
|
Autofocus,
|
||||||
|
RestoreConfigurationComponent
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
@@ -186,7 +189,8 @@ import { Autofocus } from './directives/autofocus/autofocus.directive';
|
|||||||
NotifierModule.withConfig(angularNotifierConfig),
|
NotifierModule.withConfig(angularNotifierConfig),
|
||||||
ConfirmationPopoverModule.forRoot({
|
ConfirmationPopoverModule.forRoot({
|
||||||
confirmButtonType: 'danger' // set defaults here
|
confirmButtonType: 'danger' // set defaults here
|
||||||
})
|
}),
|
||||||
|
ClipboardModule
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
SvgModuleProviderService,
|
SvgModuleProviderService,
|
||||||
|
|||||||
@@ -17,7 +17,10 @@ export const ActionTypes = {
|
|||||||
DISMISS_UNDO_NOTIFICATION: type(PREFIX + 'dismiss notification action'),
|
DISMISS_UNDO_NOTIFICATION: type(PREFIX + 'dismiss notification action'),
|
||||||
LOAD_HARDWARE_CONFIGURATION_SUCCESS: type(PREFIX + 'load hardware configuration success'),
|
LOAD_HARDWARE_CONFIGURATION_SUCCESS: type(PREFIX + 'load hardware configuration success'),
|
||||||
ELECTRON_MAIN_LOG_RECEIVED: type(PREFIX + 'Electron main log received'),
|
ELECTRON_MAIN_LOG_RECEIVED: type(PREFIX + 'Electron main log received'),
|
||||||
OPEN_URL_IN_NEW_WINDOW: type(PREFIX + 'Open URL in new Window')
|
OPEN_URL_IN_NEW_WINDOW: type(PREFIX + 'Open URL in new Window'),
|
||||||
|
PRIVILEGE_WHAT_WILL_THIS_DO: type(PREFIX + 'What will this do clicked'),
|
||||||
|
SETUP_PERMISSION_ERROR: type(PREFIX + 'Setup permission error'),
|
||||||
|
LOAD_APP_START_INFO: type(PREFIX + 'Load app start info')
|
||||||
};
|
};
|
||||||
|
|
||||||
export class AppBootsrappedAction implements Action {
|
export class AppBootsrappedAction implements Action {
|
||||||
@@ -31,25 +34,29 @@ export class AppStartedAction implements Action {
|
|||||||
export class ShowNotificationAction implements Action {
|
export class ShowNotificationAction implements Action {
|
||||||
type = ActionTypes.APP_SHOW_NOTIFICATION;
|
type = ActionTypes.APP_SHOW_NOTIFICATION;
|
||||||
|
|
||||||
constructor(public payload: Notification) { }
|
constructor(public payload: Notification) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ApplyCommandLineArgsAction implements Action {
|
export class ApplyCommandLineArgsAction implements Action {
|
||||||
type = ActionTypes.APPLY_COMMAND_LINE_ARGS;
|
type = ActionTypes.APPLY_COMMAND_LINE_ARGS;
|
||||||
|
|
||||||
constructor(public payload: CommandLineArgs) { }
|
constructor(public payload: CommandLineArgs) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ProcessAppStartInfoAction implements Action {
|
export class ProcessAppStartInfoAction implements Action {
|
||||||
type = ActionTypes.APP_PROCESS_START_INFO;
|
type = ActionTypes.APP_PROCESS_START_INFO;
|
||||||
|
|
||||||
constructor(public payload: AppStartInfo) { }
|
constructor(public payload: AppStartInfo) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class UndoLastAction implements Action {
|
export class UndoLastAction implements Action {
|
||||||
type = ActionTypes.UNDO_LAST;
|
type = ActionTypes.UNDO_LAST;
|
||||||
|
|
||||||
constructor(public payload: any) {}
|
constructor(public payload: any) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class UndoLastSuccessAction implements Action {
|
export class UndoLastSuccessAction implements Action {
|
||||||
@@ -63,19 +70,37 @@ export class DismissUndoNotificationAction implements Action {
|
|||||||
export class LoadHardwareConfigurationSuccessAction implements Action {
|
export class LoadHardwareConfigurationSuccessAction implements Action {
|
||||||
type = ActionTypes.LOAD_HARDWARE_CONFIGURATION_SUCCESS;
|
type = ActionTypes.LOAD_HARDWARE_CONFIGURATION_SUCCESS;
|
||||||
|
|
||||||
constructor(public payload: HardwareConfiguration) {}
|
constructor(public payload: HardwareConfiguration) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ElectronMainLogReceivedAction implements Action {
|
export class ElectronMainLogReceivedAction implements Action {
|
||||||
type = ActionTypes.ELECTRON_MAIN_LOG_RECEIVED;
|
type = ActionTypes.ELECTRON_MAIN_LOG_RECEIVED;
|
||||||
|
|
||||||
constructor(public payload: ElectronLogEntry) {}
|
constructor(public payload: ElectronLogEntry) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class OpenUrlInNewWindowAction implements Action {
|
export class OpenUrlInNewWindowAction implements Action {
|
||||||
type = ActionTypes.OPEN_URL_IN_NEW_WINDOW;
|
type = ActionTypes.OPEN_URL_IN_NEW_WINDOW;
|
||||||
|
|
||||||
constructor(public payload: string) {}
|
constructor(public payload: string) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class PrivilegeWhatWillThisDoAction implements Action {
|
||||||
|
type = ActionTypes.PRIVILEGE_WHAT_WILL_THIS_DO;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SetupPermissionErrorAction implements Action {
|
||||||
|
type = ActionTypes.SETUP_PERMISSION_ERROR;
|
||||||
|
|
||||||
|
constructor(public payload: string) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LoadAppStartInfoAction implements Action {
|
||||||
|
type = ActionTypes.LOAD_APP_START_INFO;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Actions
|
export type Actions
|
||||||
@@ -90,4 +115,7 @@ export type Actions
|
|||||||
| LoadHardwareConfigurationSuccessAction
|
| LoadHardwareConfigurationSuccessAction
|
||||||
| ElectronMainLogReceivedAction
|
| ElectronMainLogReceivedAction
|
||||||
| OpenUrlInNewWindowAction
|
| OpenUrlInNewWindowAction
|
||||||
|
| PrivilegeWhatWillThisDoAction
|
||||||
|
| SetupPermissionErrorAction
|
||||||
|
| LoadAppStartInfoAction
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { Action } from '@ngrx/store';
|
import { Action } from '@ngrx/store';
|
||||||
import { DeviceConnectionState, IpcResponse, type } from 'uhk-common';
|
import { DeviceConnectionState, HardwareModules, IpcResponse, type } from 'uhk-common';
|
||||||
import { HardwareModules } from '../../../../../uhk-common/src/models';
|
|
||||||
|
|
||||||
const PREFIX = '[device] ';
|
const PREFIX = '[device] ';
|
||||||
|
|
||||||
@@ -24,7 +23,10 @@ export const ActionTypes = {
|
|||||||
UPDATE_FIRMWARE_SUCCESS: type(PREFIX + 'update firmware success'),
|
UPDATE_FIRMWARE_SUCCESS: type(PREFIX + 'update firmware success'),
|
||||||
UPDATE_FIRMWARE_FAILED: type(PREFIX + 'update firmware failed'),
|
UPDATE_FIRMWARE_FAILED: type(PREFIX + 'update firmware failed'),
|
||||||
UPDATE_FIRMWARE_OK_BUTTON: type(PREFIX + 'update firmware ok button click'),
|
UPDATE_FIRMWARE_OK_BUTTON: type(PREFIX + 'update firmware ok button click'),
|
||||||
MODULES_INFO_LOADED: type(PREFIX + 'module info loaded')
|
MODULES_INFO_LOADED: type(PREFIX + 'module info loaded'),
|
||||||
|
HAS_BACKUP_USER_CONFIGURATION: type(PREFIX + 'Store backup user configuration'),
|
||||||
|
RESTORE_CONFIGURATION_FROM_BACKUP: type(PREFIX + 'Restore configuration from backup'),
|
||||||
|
RESTORE_CONFIGURATION_FROM_BACKUP_SUCCESS: type(PREFIX + 'Restore configuration from backup success')
|
||||||
};
|
};
|
||||||
|
|
||||||
export class SetPrivilegeOnLinuxAction implements Action {
|
export class SetPrivilegeOnLinuxAction implements Action {
|
||||||
@@ -123,6 +125,21 @@ export class HardwareModulesLoadedAction implements Action {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class RestoreUserConfigurationFromBackupAction implements Action {
|
||||||
|
type = ActionTypes.RESTORE_CONFIGURATION_FROM_BACKUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class HasBackupUserConfigurationAction implements Action {
|
||||||
|
type = ActionTypes.HAS_BACKUP_USER_CONFIGURATION;
|
||||||
|
|
||||||
|
constructor(public payload: boolean) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class RestoreUserConfigurationFromBackupSuccessAction implements Action {
|
||||||
|
type = ActionTypes.RESTORE_CONFIGURATION_FROM_BACKUP_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
export type Actions
|
export type Actions
|
||||||
= SetPrivilegeOnLinuxAction
|
= SetPrivilegeOnLinuxAction
|
||||||
| SetPrivilegeOnLinuxReplyAction
|
| SetPrivilegeOnLinuxReplyAction
|
||||||
@@ -142,4 +159,7 @@ export type Actions
|
|||||||
| UpdateFirmwareFailedAction
|
| UpdateFirmwareFailedAction
|
||||||
| UpdateFirmwareOkButtonAction
|
| UpdateFirmwareOkButtonAction
|
||||||
| HardwareModulesLoadedAction
|
| HardwareModulesLoadedAction
|
||||||
|
| RestoreUserConfigurationFromBackupAction
|
||||||
|
| HasBackupUserConfigurationAction
|
||||||
|
| RestoreUserConfigurationFromBackupSuccessAction
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -40,6 +40,13 @@ export class ApplicationEffects {
|
|||||||
this.logService.info('Renderer appStart effect end');
|
this.logService.info('Renderer appStart effect end');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@Effect({dispatch: false})
|
||||||
|
appStartInfo$: Observable<Action> = this.actions$
|
||||||
|
.ofType(ActionTypes.LOAD_APP_START_INFO)
|
||||||
|
.do(() => {
|
||||||
|
this.appRendererService.getAppStartInfo();
|
||||||
|
});
|
||||||
|
|
||||||
@Effect({dispatch: false})
|
@Effect({dispatch: false})
|
||||||
showNotification$: Observable<Action> = this.actions$
|
showNotification$: Observable<Action> = this.actions$
|
||||||
.ofType<ShowNotificationAction>(ActionTypes.APP_SHOW_NOTIFICATION)
|
.ofType<ShowNotificationAction>(ActionTypes.APP_SHOW_NOTIFICATION)
|
||||||
|
|||||||
@@ -13,11 +13,19 @@ import 'rxjs/add/operator/mergeMap';
|
|||||||
import 'rxjs/add/operator/withLatestFrom';
|
import 'rxjs/add/operator/withLatestFrom';
|
||||||
import 'rxjs/add/operator/switchMap';
|
import 'rxjs/add/operator/switchMap';
|
||||||
|
|
||||||
import { DeviceConnectionState, IpcResponse, NotificationType, UhkBuffer, UserConfiguration } from 'uhk-common';
|
import {
|
||||||
|
DeviceConnectionState,
|
||||||
|
HardwareConfiguration,
|
||||||
|
IpcResponse,
|
||||||
|
NotificationType,
|
||||||
|
UserConfiguration
|
||||||
|
} from 'uhk-common';
|
||||||
import {
|
import {
|
||||||
ActionTypes,
|
ActionTypes,
|
||||||
ConnectionStateChangedAction,
|
ConnectionStateChangedAction,
|
||||||
HideSaveToKeyboardButton,
|
HideSaveToKeyboardButton,
|
||||||
|
ResetUserConfigurationAction,
|
||||||
|
RestoreUserConfigurationFromBackupSuccessAction,
|
||||||
SaveConfigurationAction,
|
SaveConfigurationAction,
|
||||||
SaveConfigurationReplyAction,
|
SaveConfigurationReplyAction,
|
||||||
SaveToKeyboardSuccessAction,
|
SaveToKeyboardSuccessAction,
|
||||||
@@ -31,7 +39,7 @@ import {
|
|||||||
UpdateFirmwareWithAction
|
UpdateFirmwareWithAction
|
||||||
} from '../actions/device';
|
} from '../actions/device';
|
||||||
import { DeviceRendererService } from '../../services/device-renderer.service';
|
import { DeviceRendererService } from '../../services/device-renderer.service';
|
||||||
import { ShowNotificationAction } from '../actions/app';
|
import { SetupPermissionErrorAction, ShowNotificationAction } from '../actions/app';
|
||||||
import { AppState } from '../index';
|
import { AppState } from '../index';
|
||||||
import {
|
import {
|
||||||
ActionTypes as UserConfigActions,
|
ActionTypes as UserConfigActions,
|
||||||
@@ -78,30 +86,23 @@ export class DeviceEffects {
|
|||||||
setPrivilegeOnLinuxReply$: Observable<Action> = this.actions$
|
setPrivilegeOnLinuxReply$: Observable<Action> = this.actions$
|
||||||
.ofType<SetPrivilegeOnLinuxReplyAction>(ActionTypes.SET_PRIVILEGE_ON_LINUX_REPLY)
|
.ofType<SetPrivilegeOnLinuxReplyAction>(ActionTypes.SET_PRIVILEGE_ON_LINUX_REPLY)
|
||||||
.map(action => action.payload)
|
.map(action => action.payload)
|
||||||
.mergeMap((response: any) => {
|
.map((response: any): any => {
|
||||||
if (response.success) {
|
if (response.success) {
|
||||||
return [
|
return new ConnectionStateChangedAction({
|
||||||
new ConnectionStateChangedAction({
|
|
||||||
connected: true,
|
connected: true,
|
||||||
hasPermission: true
|
hasPermission: true
|
||||||
})
|
});
|
||||||
];
|
|
||||||
}
|
}
|
||||||
return [
|
|
||||||
<any>new ShowNotificationAction({
|
return new SetupPermissionErrorAction(response.error);
|
||||||
type: NotificationType.Error,
|
|
||||||
message: response.error.message || response.error
|
|
||||||
})
|
|
||||||
];
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@Effect({dispatch: false})
|
@Effect({dispatch: false})
|
||||||
saveConfiguration$: Observable<Action> = this.actions$
|
saveConfiguration$: Observable<Action> = this.actions$
|
||||||
.ofType(ActionTypes.SAVE_CONFIGURATION)
|
.ofType(ActionTypes.SAVE_CONFIGURATION)
|
||||||
.withLatestFrom(this.store)
|
.withLatestFrom(this.store)
|
||||||
.map(([action, state]) => state.userConfiguration)
|
.do(([action, state]) => {
|
||||||
.do((userConfiguration: UserConfiguration) => {
|
setTimeout(() => this.sendUserConfigToKeyboard(state.userConfiguration, state.app.hardwareConfig), 100);
|
||||||
setTimeout(() => this.sendUserConfigToKeyboard(userConfiguration), 100);
|
|
||||||
})
|
})
|
||||||
.switchMap(() => Observable.empty());
|
.switchMap(() => Observable.empty());
|
||||||
|
|
||||||
@@ -128,8 +129,18 @@ export class DeviceEffects {
|
|||||||
@Effect()
|
@Effect()
|
||||||
autoHideSaveToKeyboardButton$: Observable<Action> = this.actions$
|
autoHideSaveToKeyboardButton$: Observable<Action> = this.actions$
|
||||||
.ofType(ActionTypes.SAVE_TO_KEYBOARD_SUCCESS)
|
.ofType(ActionTypes.SAVE_TO_KEYBOARD_SUCCESS)
|
||||||
.switchMap(() => Observable.timer(1000)
|
.withLatestFrom(this.store)
|
||||||
.switchMap(() => Observable.of(new HideSaveToKeyboardButton()))
|
.switchMap(([action, state]) => Observable.timer(1000)
|
||||||
|
.mergeMap(() => {
|
||||||
|
const actions = [new HideSaveToKeyboardButton()];
|
||||||
|
|
||||||
|
if (state.device.hasBackupUserConfiguration) {
|
||||||
|
actions.push(new RestoreUserConfigurationFromBackupSuccessAction());
|
||||||
|
this.router.navigate(['/']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return actions;
|
||||||
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
@Effect()
|
@Effect()
|
||||||
@@ -199,6 +210,10 @@ export class DeviceEffects {
|
|||||||
.ofType<UpdateFirmwareOkButtonAction>(ActionTypes.UPDATE_FIRMWARE_OK_BUTTON)
|
.ofType<UpdateFirmwareOkButtonAction>(ActionTypes.UPDATE_FIRMWARE_OK_BUTTON)
|
||||||
.do(() => this.deviceRendererService.startConnectionPoller());
|
.do(() => this.deviceRendererService.startConnectionPoller());
|
||||||
|
|
||||||
|
@Effect() restoreUserConfiguration$ = this.actions$
|
||||||
|
.ofType<ResetUserConfigurationAction>(ActionTypes.RESTORE_CONFIGURATION_FROM_BACKUP)
|
||||||
|
.map(() => new SaveConfigurationAction());
|
||||||
|
|
||||||
constructor(private actions$: Actions,
|
constructor(private actions$: Actions,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private deviceRendererService: DeviceRendererService,
|
private deviceRendererService: DeviceRendererService,
|
||||||
@@ -207,9 +222,10 @@ export class DeviceEffects {
|
|||||||
private defaultUserConfigurationService: DefaultUserConfigurationService) {
|
private defaultUserConfigurationService: DefaultUserConfigurationService) {
|
||||||
}
|
}
|
||||||
|
|
||||||
private sendUserConfigToKeyboard(userConfiguration: UserConfiguration): void {
|
private sendUserConfigToKeyboard(userConfiguration: UserConfiguration, hardwareConfig: HardwareConfiguration): void {
|
||||||
const uhkBuffer = new UhkBuffer();
|
this.deviceRendererService.saveUserConfiguration({
|
||||||
userConfiguration.toBinary(uhkBuffer);
|
uniqueId: hardwareConfig && hardwareConfig.uniqueId,
|
||||||
this.deviceRendererService.saveUserConfiguration(uhkBuffer.getBufferContent());
|
configuration: userConfiguration.toJsonObject()
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ import 'rxjs/add/observable/of';
|
|||||||
import 'rxjs/add/observable/empty';
|
import 'rxjs/add/observable/empty';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
getHardwareConfigFromDeviceResponse,
|
||||||
|
getUserConfigFromDeviceResponse,
|
||||||
ConfigurationReply,
|
ConfigurationReply,
|
||||||
HardwareConfiguration,
|
|
||||||
LogService,
|
LogService,
|
||||||
NotificationType,
|
NotificationType,
|
||||||
UhkBuffer,
|
UhkBuffer,
|
||||||
@@ -43,7 +44,11 @@ import {
|
|||||||
ShowNotificationAction,
|
ShowNotificationAction,
|
||||||
UndoLastAction
|
UndoLastAction
|
||||||
} from '../actions/app';
|
} from '../actions/app';
|
||||||
import { HardwareModulesLoadedAction, ShowSaveToKeyboardButtonAction } from '../actions/device';
|
import {
|
||||||
|
HardwareModulesLoadedAction,
|
||||||
|
ShowSaveToKeyboardButtonAction,
|
||||||
|
HasBackupUserConfigurationAction
|
||||||
|
} from '../actions/device';
|
||||||
import { DeviceRendererService } from '../../services/device-renderer.service';
|
import { DeviceRendererService } from '../../services/device-renderer.service';
|
||||||
import { UndoUserConfigData } from '../../models/undo-user-config-data';
|
import { UndoUserConfigData } from '../../models/undo-user-config-data';
|
||||||
import { UploadFileData } from '../../models/upload-file-data';
|
import { UploadFileData } from '../../models/upload-file-data';
|
||||||
@@ -51,29 +56,6 @@ import { UploadFileData } from '../../models/upload-file-data';
|
|||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserConfigEffects {
|
export class UserConfigEffects {
|
||||||
|
|
||||||
private static getUserConfigFromDeviceResponse(json: string): UserConfiguration {
|
|
||||||
const data = JSON.parse(json);
|
|
||||||
const userConfig = new UserConfiguration();
|
|
||||||
userConfig.fromBinary(UhkBuffer.fromArray(data));
|
|
||||||
|
|
||||||
if (userConfig.userConfigMajorVersion > 0) {
|
|
||||||
return userConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static getHardwareConfigFromDeviceResponse(json: string): HardwareConfiguration {
|
|
||||||
const data = JSON.parse(json);
|
|
||||||
const hardwareConfig = new HardwareConfiguration();
|
|
||||||
hardwareConfig.fromBinary(UhkBuffer.fromArray(data));
|
|
||||||
|
|
||||||
if (hardwareConfig.uniqueId > 0) {
|
|
||||||
return hardwareConfig;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Effect() loadUserConfig$: Observable<Action> = defer(() => {
|
@Effect() loadUserConfig$: Observable<Action> = defer(() => {
|
||||||
return Observable.of(new LoadUserConfigSuccessAction(this.getUserConfiguration()));
|
return Observable.of(new LoadUserConfigSuccessAction(this.getUserConfiguration()));
|
||||||
});
|
});
|
||||||
@@ -146,23 +128,24 @@ export class UserConfigEffects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const result = [];
|
const result = [];
|
||||||
|
let newPageDestination = ['/'];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const userConfig = UserConfigEffects.getUserConfigFromDeviceResponse(data.userConfiguration);
|
const userConfig = getUserConfigFromDeviceResponse(data.userConfiguration);
|
||||||
result.push(new LoadUserConfigSuccessAction(userConfig));
|
result.push(new LoadUserConfigSuccessAction(userConfig));
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logService.error('Eeprom user-config parse error:', err);
|
this.logService.error('Eeprom user-config parse error:', err);
|
||||||
result.push(
|
const userConfig = new UserConfiguration().fromJsonObject(data.backupConfiguration);
|
||||||
new ShowNotificationAction({
|
|
||||||
type: NotificationType.Error,
|
|
||||||
message: err
|
|
||||||
}));
|
|
||||||
|
|
||||||
result.push(new LoadUserConfigSuccessAction(this.getUserConfiguration()));
|
result.push(new HasBackupUserConfigurationAction(!!data.backupConfiguration));
|
||||||
|
result.push(new LoadUserConfigSuccessAction(userConfig));
|
||||||
|
|
||||||
|
newPageDestination = ['/device/restore-user-configuration'];
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const hardwareConfig = UserConfigEffects.getHardwareConfigFromDeviceResponse(data.hardwareConfiguration);
|
const hardwareConfig = getHardwareConfigFromDeviceResponse(data.hardwareConfiguration);
|
||||||
result.push(new LoadHardwareConfigurationSuccessAction(hardwareConfig));
|
result.push(new LoadHardwareConfigurationSuccessAction(hardwareConfig));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.logService.error('Eeprom hardware-config parse error:', err);
|
this.logService.error('Eeprom hardware-config parse error:', err);
|
||||||
@@ -175,7 +158,7 @@ export class UserConfigEffects {
|
|||||||
|
|
||||||
result.push(new HardwareModulesLoadedAction(data.modules));
|
result.push(new HardwareModulesLoadedAction(data.modules));
|
||||||
|
|
||||||
this.router.navigate(['/']);
|
this.router.navigate(newPageDestination);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ export const metaReducers: MetaReducer<AppState>[] = environment.production
|
|||||||
: [storeFreeze];
|
: [storeFreeze];
|
||||||
|
|
||||||
export const getUserConfiguration = (state: AppState) => state.userConfiguration;
|
export const getUserConfiguration = (state: AppState) => state.userConfiguration;
|
||||||
export const getDeviceName = createSelector(getUserConfiguration, fromUserConfig.getDeviceName);
|
|
||||||
|
|
||||||
export const appState = (state: AppState) => state.app;
|
export const appState = (state: AppState) => state.app;
|
||||||
|
|
||||||
@@ -47,10 +46,10 @@ export const showAddonMenu = createSelector(appState, fromApp.showAddonMenu);
|
|||||||
export const getUndoableNotification = createSelector(appState, fromApp.getUndoableNotification);
|
export const getUndoableNotification = createSelector(appState, fromApp.getUndoableNotification);
|
||||||
export const getPrevUserConfiguration = createSelector(appState, fromApp.getPrevUserConfiguration);
|
export const getPrevUserConfiguration = createSelector(appState, fromApp.getPrevUserConfiguration);
|
||||||
export const runningInElectron = createSelector(appState, fromApp.runningInElectron);
|
export const runningInElectron = createSelector(appState, fromApp.runningInElectron);
|
||||||
export const getHardwareConfiguration = createSelector(appState, fromApp.getHardwareConfiguration);
|
|
||||||
export const getKeyboardLayout = createSelector(appState, fromApp.getKeyboardLayout);
|
export const getKeyboardLayout = createSelector(appState, fromApp.getKeyboardLayout);
|
||||||
export const deviceConfigurationLoaded = createSelector(appState, fromApp.deviceConfigurationLoaded);
|
export const deviceConfigurationLoaded = createSelector(appState, fromApp.deviceConfigurationLoaded);
|
||||||
export const getAgentVersionInfo = createSelector(appState, fromApp.getAgentVersionInfo);
|
export const getAgentVersionInfo = createSelector(appState, fromApp.getAgentVersionInfo);
|
||||||
|
export const getPrivilegePageState = createSelector(appState, fromApp.getPrivilagePageState);
|
||||||
|
|
||||||
export const appUpdateState = (state: AppState) => state.appUpdate;
|
export const appUpdateState = (state: AppState) => state.appUpdate;
|
||||||
export const getShowAppUpdateAvailable = createSelector(appUpdateState, fromAppUpdate.getShowAppUpdateAvailable);
|
export const getShowAppUpdateAvailable = createSelector(appUpdateState, fromAppUpdate.getShowAppUpdateAvailable);
|
||||||
@@ -78,3 +77,28 @@ export const firmwareOkButtonDisabled = createSelector(deviceState, fromDevice.f
|
|||||||
// tslint:disable-next-line: max-line-length
|
// tslint:disable-next-line: max-line-length
|
||||||
export const flashFirmwareButtonDisbabled = createSelector(runningInElectron, deviceState, (electron, state: fromDevice.State) => !electron || state.updatingFirmware);
|
export const flashFirmwareButtonDisbabled = createSelector(runningInElectron, deviceState, (electron, state: fromDevice.State) => !electron || state.updatingFirmware);
|
||||||
export const getHardwareModules = createSelector(deviceState, fromDevice.getHardwareModules);
|
export const getHardwareModules = createSelector(deviceState, fromDevice.getHardwareModules);
|
||||||
|
export const getBackupUserConfigurationState = createSelector(deviceState, fromDevice.getBackupUserConfigurationState);
|
||||||
|
export const getRestoreUserConfiguration = createSelector(deviceState, fromDevice.getHasBackupUserConfiguration);
|
||||||
|
|
||||||
|
export const getSideMenuPageState = createSelector(
|
||||||
|
showAddonMenu,
|
||||||
|
runningInElectron,
|
||||||
|
updatingFirmware,
|
||||||
|
getUserConfiguration,
|
||||||
|
getRestoreUserConfiguration,
|
||||||
|
(showAddonMenuValue: boolean,
|
||||||
|
runningInElectronValue: boolean,
|
||||||
|
updatingFirmwareValue: boolean,
|
||||||
|
userConfiguration: UserConfiguration,
|
||||||
|
restoreUserConfiguration: boolean) => {
|
||||||
|
return {
|
||||||
|
showAddonMenu: showAddonMenuValue,
|
||||||
|
runInElectron: runningInElectronValue,
|
||||||
|
updatingFirmware: updatingFirmwareValue,
|
||||||
|
deviceName: userConfiguration.deviceName,
|
||||||
|
keymaps: userConfiguration.keymaps,
|
||||||
|
macros: userConfiguration.macros,
|
||||||
|
restoreUserConfiguration
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|||||||
@@ -1,13 +1,20 @@
|
|||||||
import { ROUTER_NAVIGATION } from '@ngrx/router-store';
|
import { ROUTER_NAVIGATION } from '@ngrx/router-store';
|
||||||
import { Action } from '@ngrx/store';
|
import { Action } from '@ngrx/store';
|
||||||
import { VersionInformation } from 'uhk-common';
|
import {
|
||||||
|
HardwareConfiguration,
|
||||||
|
Notification,
|
||||||
|
NotificationType,
|
||||||
|
runInElectron,
|
||||||
|
UserConfiguration,
|
||||||
|
VersionInformation
|
||||||
|
} from 'uhk-common';
|
||||||
|
|
||||||
import { HardwareConfiguration, Notification, NotificationType, runInElectron, UserConfiguration } from 'uhk-common';
|
|
||||||
import { ActionTypes, ShowNotificationAction } from '../actions/app';
|
import { ActionTypes, ShowNotificationAction } from '../actions/app';
|
||||||
import { ActionTypes as UserConfigActionTypes } from '../actions/user-config';
|
import { ActionTypes as UserConfigActionTypes } from '../actions/user-config';
|
||||||
import { ActionTypes as DeviceActionTypes } from '../actions/device';
|
import { ActionTypes as DeviceActionTypes } from '../actions/device';
|
||||||
import { KeyboardLayout } from '../../keyboard/keyboard-layout.enum';
|
import { KeyboardLayout } from '../../keyboard/keyboard-layout.enum';
|
||||||
import { getVersions } from '../../util';
|
import { getVersions } from '../../util';
|
||||||
|
import { PrivilagePageSate } from '../../models/privilage-page-sate';
|
||||||
|
|
||||||
export interface State {
|
export interface State {
|
||||||
started: boolean;
|
started: boolean;
|
||||||
@@ -19,6 +26,8 @@ export interface State {
|
|||||||
configLoading: boolean;
|
configLoading: boolean;
|
||||||
hardwareConfig?: HardwareConfiguration;
|
hardwareConfig?: HardwareConfiguration;
|
||||||
agentVersionInfo?: VersionInformation;
|
agentVersionInfo?: VersionInformation;
|
||||||
|
privilegeWhatWillThisDoClicked: boolean;
|
||||||
|
permissionError?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const initialState: State = {
|
export const initialState: State = {
|
||||||
@@ -27,7 +36,8 @@ export const initialState: State = {
|
|||||||
navigationCountAfterNotification: 0,
|
navigationCountAfterNotification: 0,
|
||||||
runningInElectron: runInElectron(),
|
runningInElectron: runInElectron(),
|
||||||
configLoading: true,
|
configLoading: true,
|
||||||
agentVersionInfo: getVersions()
|
agentVersionInfo: getVersions(),
|
||||||
|
privilegeWhatWillThisDoClicked: false
|
||||||
};
|
};
|
||||||
|
|
||||||
export function reducer(state = initialState, action: Action & { payload: any }) {
|
export function reducer(state = initialState, action: Action & { payload: any }) {
|
||||||
@@ -115,6 +125,24 @@ export function reducer(state = initialState, action: Action & { payload: any })
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ActionTypes.PRIVILEGE_WHAT_WILL_THIS_DO:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
privilegeWhatWillThisDoClicked: true
|
||||||
|
};
|
||||||
|
|
||||||
|
case ActionTypes.SETUP_PERMISSION_ERROR:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
permissionError: action.payload
|
||||||
|
};
|
||||||
|
|
||||||
|
case DeviceActionTypes.SET_PRIVILEGE_ON_LINUX:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
permissionError: null
|
||||||
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
@@ -124,7 +152,6 @@ export const showAddonMenu = (state: State) => state.showAddonMenu;
|
|||||||
export const getUndoableNotification = (state: State) => state.undoableNotification;
|
export const getUndoableNotification = (state: State) => state.undoableNotification;
|
||||||
export const getPrevUserConfiguration = (state: State) => state.prevUserConfig;
|
export const getPrevUserConfiguration = (state: State) => state.prevUserConfig;
|
||||||
export const runningInElectron = (state: State) => state.runningInElectron;
|
export const runningInElectron = (state: State) => state.runningInElectron;
|
||||||
export const getHardwareConfiguration = (state: State) => state.hardwareConfig;
|
|
||||||
export const getKeyboardLayout = (state: State): KeyboardLayout => {
|
export const getKeyboardLayout = (state: State): KeyboardLayout => {
|
||||||
if (state.hardwareConfig && state.hardwareConfig.isIso) {
|
if (state.hardwareConfig && state.hardwareConfig.isIso) {
|
||||||
return KeyboardLayout.ISO;
|
return KeyboardLayout.ISO;
|
||||||
@@ -134,3 +161,12 @@ export const getKeyboardLayout = (state: State): KeyboardLayout => {
|
|||||||
};
|
};
|
||||||
export const deviceConfigurationLoaded = (state: State) => !state.runningInElectron ? true : !!state.hardwareConfig;
|
export const deviceConfigurationLoaded = (state: State) => !state.runningInElectron ? true : !!state.hardwareConfig;
|
||||||
export const getAgentVersionInfo = (state: State) => state.agentVersionInfo || {} as VersionInformation;
|
export const getAgentVersionInfo = (state: State) => state.agentVersionInfo || {} as VersionInformation;
|
||||||
|
export const getPrivilagePageState = (state: State): PrivilagePageSate => {
|
||||||
|
const permissionSetupFailed = !!state.permissionError;
|
||||||
|
|
||||||
|
return {
|
||||||
|
permissionSetupFailed,
|
||||||
|
showWhatWillThisDo: !state.privilegeWhatWillThisDoClicked && !permissionSetupFailed,
|
||||||
|
showWhatWillThisDoContent: state.privilegeWhatWillThisDoClicked || permissionSetupFailed
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import {
|
|||||||
ConnectionStateChangedAction,
|
ConnectionStateChangedAction,
|
||||||
HardwareModulesLoadedAction,
|
HardwareModulesLoadedAction,
|
||||||
SaveConfigurationAction,
|
SaveConfigurationAction,
|
||||||
|
HasBackupUserConfigurationAction,
|
||||||
UpdateFirmwareFailedAction
|
UpdateFirmwareFailedAction
|
||||||
} from '../actions/device';
|
} from '../actions/device';
|
||||||
import { ActionTypes as AppActions, ElectronMainLogReceivedAction } from '../actions/app';
|
import { ActionTypes as AppActions, ElectronMainLogReceivedAction } from '../actions/app';
|
||||||
import { initProgressButtonState, ProgressButtonState } from './progress-button-state';
|
import { initProgressButtonState, ProgressButtonState } from './progress-button-state';
|
||||||
import { XtermCssClass, XtermLog } from '../../models/xterm-log';
|
import { XtermCssClass, XtermLog } from '../../models/xterm-log';
|
||||||
|
import { RestoreConfigurationState } from '../../models/restore-configuration-state';
|
||||||
|
|
||||||
export interface State {
|
export interface State {
|
||||||
connected: boolean;
|
connected: boolean;
|
||||||
@@ -20,6 +22,8 @@ export interface State {
|
|||||||
firmwareUpdateFinished: boolean;
|
firmwareUpdateFinished: boolean;
|
||||||
modules: HardwareModules;
|
modules: HardwareModules;
|
||||||
log: Array<XtermLog>;
|
log: Array<XtermLog>;
|
||||||
|
restoringUserConfiguration: boolean;
|
||||||
|
hasBackupUserConfiguration: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const initialState: State = {
|
export const initialState: State = {
|
||||||
@@ -37,7 +41,9 @@ export const initialState: State = {
|
|||||||
firmwareVersion: ''
|
firmwareVersion: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
log: [{message: '', cssClass: XtermCssClass.standard}]
|
log: [{message: '', cssClass: XtermCssClass.standard}],
|
||||||
|
restoringUserConfiguration: false,
|
||||||
|
hasBackupUserConfiguration: false
|
||||||
};
|
};
|
||||||
|
|
||||||
export function reducer(state = initialState, action: Action) {
|
export function reducer(state = initialState, action: Action) {
|
||||||
@@ -87,7 +93,8 @@ export function reducer(state = initialState, action: Action) {
|
|||||||
showButton: true,
|
showButton: true,
|
||||||
text: 'Saved!',
|
text: 'Saved!',
|
||||||
action: null
|
action: null
|
||||||
}
|
},
|
||||||
|
restoringUserConfiguration: false
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,6 +174,25 @@ export function reducer(state = initialState, action: Action) {
|
|||||||
modules: (action as HardwareModulesLoadedAction).payload
|
modules: (action as HardwareModulesLoadedAction).payload
|
||||||
};
|
};
|
||||||
|
|
||||||
|
case ActionTypes.RESET_USER_CONFIGURATION:
|
||||||
|
case ActionTypes.RESTORE_CONFIGURATION_FROM_BACKUP:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
restoringUserConfiguration: true
|
||||||
|
};
|
||||||
|
|
||||||
|
case ActionTypes.HAS_BACKUP_USER_CONFIGURATION:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
hasBackupUserConfiguration: (action as HasBackupUserConfigurationAction).payload
|
||||||
|
};
|
||||||
|
|
||||||
|
case ActionTypes.RESTORE_CONFIGURATION_FROM_BACKUP_SUCCESS:
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
hasBackupUserConfiguration: false
|
||||||
|
};
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
@@ -179,3 +205,10 @@ export const getSaveToKeyboardState = (state: State) => state.saveToKeyboard;
|
|||||||
export const xtermLog = (state: State) => state.log;
|
export const xtermLog = (state: State) => state.log;
|
||||||
export const firmwareOkButtonDisabled = (state: State) => !state.firmwareUpdateFinished;
|
export const firmwareOkButtonDisabled = (state: State) => !state.firmwareUpdateFinished;
|
||||||
export const getHardwareModules = (state: State) => state.modules;
|
export const getHardwareModules = (state: State) => state.modules;
|
||||||
|
export const getHasBackupUserConfiguration = (state: State) => state.hasBackupUserConfiguration;
|
||||||
|
export const getBackupUserConfigurationState = (state: State): RestoreConfigurationState => {
|
||||||
|
return {
|
||||||
|
restoringUserConfiguration: state.restoringUserConfiguration,
|
||||||
|
hasBackupUserConfiguration: state.hasBackupUserConfiguration
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|||||||
@@ -494,5 +494,3 @@ function setKeyActionToLayer(newLayer: Layer, moduleIndex: number, keyIndex: num
|
|||||||
newModule.keyActions = newModule.keyActions.slice();
|
newModule.keyActions = newModule.keyActions.slice();
|
||||||
newModule.keyActions[keyIndex] = newKeyAction;
|
newModule.keyActions[keyIndex] = newKeyAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getDeviceName = (state: UserConfiguration) => state.deviceName;
|
|
||||||
|
|||||||
BIN
packages/uhk-web/src/assets/images/agent-app-icon.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
@@ -115,3 +115,43 @@ a.disabled {
|
|||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a.link-inline {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin code-style() {
|
||||||
|
color: #6a737d;
|
||||||
|
background-color: #f6f8fa;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
@include code-style();
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
code {
|
||||||
|
@include code-style();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mt-10 {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-container {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.fa-copy {
|
||||||
|
cursor: pointer;
|
||||||
|
color: #6a737d;
|
||||||
|
position: absolute;
|
||||||
|
right: 4px;
|
||||||
|
top: 4px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: darken(#6a737d, 15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,10 +1,149 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
<svg
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
width="15px" height="15px" viewBox="0 0 15 15" enable-background="new 0 0 15 15" xml:space="preserve">
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
<path fill="#333333" d="M3,0C1.338,0,0,1.338,0,3v9c0,1.662,1.338,3,3,3h9c1.662,0,3-1.338,3-3V3c0-1.662-1.338-3-3-3H3z
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
M1.375,3.75c0.07-0.012,0.125,0,0.125,0H6c0.375,0,0.75,0.375,0.75,0.375S7.125,4.5,7.5,4.5s0.75-0.375,0.75-0.375
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
S8.625,3.75,9,3.75h4.5c0.75,0,0.75,0.75,0.75,0.75V6c0,2.25-1.5,2.25-1.5,2.25H9c-0.375,0-0.75-1.125-0.75-1.125S7.875,6,7.5,6
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
S6.75,7.125,6.75,7.125S6.375,8.25,6,8.25H2.25c0,0-1.5,0-1.5-2.25V4.5C0.75,3.938,1.164,3.785,1.375,3.75z"/>
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
</svg>
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="15"
|
||||||
|
height="15"
|
||||||
|
viewBox="0 0 15 15"><metadata
|
||||||
|
id="metadata20"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs6"><linearGradient
|
||||||
|
x1="0"
|
||||||
|
y1="0"
|
||||||
|
x2="1"
|
||||||
|
y2="0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
spreadMethod="pad"
|
||||||
|
id="linearGradient5644"><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0"
|
||||||
|
id="stop5646" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5648" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5f63"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5650" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#cccccc"
|
||||||
|
offset="0.52557927"
|
||||||
|
id="stop5652" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62"
|
||||||
|
offset="1"
|
||||||
|
id="stop5654" /></linearGradient><linearGradient
|
||||||
|
x1="0"
|
||||||
|
y1="0"
|
||||||
|
x2="1"
|
||||||
|
y2="0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
spreadMethod="pad"
|
||||||
|
id="linearGradient4158-3"><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0"
|
||||||
|
id="stop5634" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5636" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5638" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#cccccc"
|
||||||
|
offset="0.49464694"
|
||||||
|
id="stop5640" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62"
|
||||||
|
offset="1"
|
||||||
|
id="stop5642" /></linearGradient><linearGradient
|
||||||
|
osb:paint="solid"
|
||||||
|
id="linearGradient5618"><stop
|
||||||
|
id="stop5620"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#cccccc;stop-opacity:1;" /></linearGradient><linearGradient
|
||||||
|
id="linearGradient4158"
|
||||||
|
spreadMethod="pad"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
y2="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
x1="0"><stop
|
||||||
|
id="stop4160"
|
||||||
|
offset="0"
|
||||||
|
style="stop-opacity:1;stop-color:#85878d" /><stop
|
||||||
|
id="stop4162"
|
||||||
|
offset="0.00137794"
|
||||||
|
style="stop-opacity:1;stop-color:#85878d" /><stop
|
||||||
|
id="stop4164"
|
||||||
|
offset="0.00137794"
|
||||||
|
style="stop-opacity:1;stop-color:#85878d" /><stop
|
||||||
|
id="stop4166"
|
||||||
|
offset="0.49464694"
|
||||||
|
style="stop-opacity:1;stop-color:#cccccc" /><stop
|
||||||
|
id="stop4168"
|
||||||
|
offset="1"
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62" /></linearGradient><clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath18"><path
|
||||||
|
d="M 2.398,12 C 1.07,12 0,10.93 0,9.602 L 0,9.602 0,2.398 C 0,1.07 1.07,0 2.398,0 L 2.398,0 9.601,0 C 10.93,0 12,1.07 12,2.398 L 12,2.398 12,9.602 C 12,10.93 10.93,12 9.601,12 L 9.601,12 2.398,12 Z M 0.602,7.199 0.602,8.398 C 0.602,8.852 0.931,8.973 1.102,9 L 1.102,9 C 1.156,9.008 1.199,9 1.199,9 L 1.199,9 4.801,9 C 5.102,9 5.398,8.699 5.398,8.699 L 5.398,8.699 C 5.398,8.699 5.699,8.398 6,8.398 L 6,8.398 C 6.301,8.398 6.602,8.699 6.602,8.699 L 6.602,8.699 C 6.602,8.699 6.898,9 7.199,9 L 7.199,9 10.801,9 C 11.398,9 11.398,8.398 11.398,8.398 L 11.398,8.398 11.398,7.199 C 11.398,5.398 10.199,5.398 10.199,5.398 L 10.199,5.398 7.199,5.398 C 6.898,5.398 6.602,6.301 6.602,6.301 L 6.602,6.301 C 6.602,6.301 6.301,7.199 6,7.199 L 6,7.199 C 5.699,7.199 5.398,6.301 5.398,6.301 L 5.398,6.301 C 5.398,6.301 5.102,5.398 4.801,5.398 L 4.801,5.398 1.801,5.398 C 1.801,5.398 0.602,5.398 0.602,7.199"
|
||||||
|
id="path20" /></clipPath><linearGradient
|
||||||
|
x1="0"
|
||||||
|
y1="0"
|
||||||
|
x2="1"
|
||||||
|
y2="0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
spreadMethod="pad"
|
||||||
|
id="linearGradient26"><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0"
|
||||||
|
id="stop28" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop30" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop32" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#b6b6b6"
|
||||||
|
offset="0.48571813"
|
||||||
|
id="stop34" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62"
|
||||||
|
offset="1"
|
||||||
|
id="stop36" /></linearGradient><linearGradient
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
y2="0"
|
||||||
|
x2="11.745763"
|
||||||
|
y1="11.542373"
|
||||||
|
x1="0.91525424"
|
||||||
|
id="linearGradient4154"
|
||||||
|
xlink:href="#linearGradient4158" /><linearGradient
|
||||||
|
y2="-0.050847456"
|
||||||
|
x2="12"
|
||||||
|
y1="11.898305"
|
||||||
|
x1="0.10169491"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient4156"
|
||||||
|
xlink:href="#linearGradient5644" /></defs><g
|
||||||
|
id="g10"
|
||||||
|
transform="matrix(1.25,0,0,-1.25,0,15)"><path
|
||||||
|
d="M 11.473,5.117 0.416,5.117 0.416,9.383 11.473,9.383 11.473,5.117 Z"
|
||||||
|
style="fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path12" /><g
|
||||||
|
style="fill:url(#linearGradient4154);fill-opacity:1.0"
|
||||||
|
clip-path="url(#clipPath18)"
|
||||||
|
id="g16"><g
|
||||||
|
style="fill:url(#linearGradient4154);fill-opacity:1.0"
|
||||||
|
id="g22"><g
|
||||||
|
style="fill:url(#linearGradient4154);fill-opacity:1.0"
|
||||||
|
id="g24"><path
|
||||||
|
id="path38"
|
||||||
|
style="fill:url(#linearGradient4156);stroke:none;fill-opacity:1;stroke-opacity:1"
|
||||||
|
d="M 2.398,12 C 1.07,12 0,10.93 0,9.602 L 0,9.602 0,2.398 C 0,1.07 1.07,0 2.398,0 L 2.398,0 9.601,0 C 10.93,0 12,1.07 12,2.398 L 12,2.398 12,9.602 C 12,10.93 10.93,12 9.601,12 L 9.601,12 2.398,12 Z M 0.602,7.199 0.602,8.398 C 0.602,8.852 0.931,8.973 1.102,9 L 1.102,9 C 1.156,9.008 1.199,9 1.199,9 L 1.199,9 4.801,9 C 5.102,9 5.398,8.699 5.398,8.699 L 5.398,8.699 C 5.398,8.699 5.699,8.398 6,8.398 L 6,8.398 C 6.301,8.398 6.602,8.699 6.602,8.699 L 6.602,8.699 C 6.602,8.699 6.898,9 7.199,9 L 7.199,9 10.801,9 C 11.398,9 11.398,8.398 11.398,8.398 L 11.398,8.398 11.398,7.199 C 11.398,5.398 10.199,5.398 10.199,5.398 L 10.199,5.398 7.199,5.398 C 6.898,5.398 6.602,6.301 6.602,6.301 L 6.602,6.301 C 6.602,6.301 6.301,7.199 6,7.199 L 6,7.199 C 5.699,7.199 5.398,6.301 5.398,6.301 L 5.398,6.301 C 5.398,6.301 5.102,5.398 4.801,5.398 L 4.801,5.398 1.801,5.398 C 1.801,5.398 0.602,5.398 0.602,7.199" /></g></g></g></g></svg>
|
||||||
|
Before Width: | Height: | Size: 935 B After Width: | Height: | Size: 6.9 KiB |
@@ -1,4 +1,149 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="-5 -5 9.9999999 10" height="15" width="15">
|
<svg
|
||||||
<path style="fill:#333" d="M -3,-5 C -4.108,-5 -5,-4.108 -5,-3 L -5,3 C -5,4.108 -4.108,5 -3,5 L 3,5 C 4.108,5 5,4.108 5,3 L 5,-3 C 5,-4.108 4.108,-5 3,-5 L -3,-5 Z M -4.0833333,-2.5 C -4.0364583,-2.5078125 -4,-2.5 -4,-2.5 L -0.99999998,-2.5 C -0.74999998,-2.5 -0.49999998,-2.25 -0.49999998,-2.25 -0.49999998,-2.25 -0.24999998,-2 2.4999999e-8,-2 0.25000003,-2 0.50000003,-2.25 0.50000003,-2.25 0.50000003,-2.25 0.75000003,-2.5 1,-2.5 L 4,-2.5 C 4.5,-2.5 4.5,-2 4.5,-2 L 4.5,-0.99999998 C 4.5,0.50000003 3.5,0.50000003 3.5,0.50000003 L 1,0.50000003 C 0.75000003,0.50000003 0.50000003,-0.24999998 0.50000003,-0.24999998 0.50000003,-0.24999998 0.25000003,-0.99999998 2.4999999e-8,-0.99999998 -0.24999998,-0.99999998 -0.49999998,-0.24999998 -0.49999998,-0.24999998 -0.49999998,-0.24999998 -0.74999998,0.50000003 -0.99999998,0.50000003 L -3.5,0.50000003 C -3.5,0.50000003 -4.5,0.50000003 -4.5,-0.99999998 L -4.5,-2 C -4.5,-2.375 -4.2239583,-2.4765625 -4.0833333,-2.5 Z" />
|
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||||
</svg>
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="15"
|
||||||
|
height="15"
|
||||||
|
viewBox="0 0 15 15"><metadata
|
||||||
|
id="metadata20"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs6"><linearGradient
|
||||||
|
x1="0"
|
||||||
|
y1="0"
|
||||||
|
x2="1"
|
||||||
|
y2="0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
spreadMethod="pad"
|
||||||
|
id="linearGradient5644"><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0"
|
||||||
|
id="stop5646" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5648" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5f63"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5650" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#cccccc"
|
||||||
|
offset="0.52557927"
|
||||||
|
id="stop5652" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62"
|
||||||
|
offset="1"
|
||||||
|
id="stop5654" /></linearGradient><linearGradient
|
||||||
|
x1="0"
|
||||||
|
y1="0"
|
||||||
|
x2="1"
|
||||||
|
y2="0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
spreadMethod="pad"
|
||||||
|
id="linearGradient4158-3"><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0"
|
||||||
|
id="stop5634" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5636" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop5638" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#cccccc"
|
||||||
|
offset="0.49464694"
|
||||||
|
id="stop5640" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62"
|
||||||
|
offset="1"
|
||||||
|
id="stop5642" /></linearGradient><linearGradient
|
||||||
|
osb:paint="solid"
|
||||||
|
id="linearGradient5618"><stop
|
||||||
|
id="stop5620"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#cccccc;stop-opacity:1;" /></linearGradient><linearGradient
|
||||||
|
id="linearGradient4158"
|
||||||
|
spreadMethod="pad"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
y2="0"
|
||||||
|
x2="1"
|
||||||
|
y1="0"
|
||||||
|
x1="0"><stop
|
||||||
|
id="stop4160"
|
||||||
|
offset="0"
|
||||||
|
style="stop-opacity:1;stop-color:#85878d" /><stop
|
||||||
|
id="stop4162"
|
||||||
|
offset="0.00137794"
|
||||||
|
style="stop-opacity:1;stop-color:#85878d" /><stop
|
||||||
|
id="stop4164"
|
||||||
|
offset="0.00137794"
|
||||||
|
style="stop-opacity:1;stop-color:#85878d" /><stop
|
||||||
|
id="stop4166"
|
||||||
|
offset="0.49464694"
|
||||||
|
style="stop-opacity:1;stop-color:#cccccc" /><stop
|
||||||
|
id="stop4168"
|
||||||
|
offset="1"
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62" /></linearGradient><clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath18"><path
|
||||||
|
d="M 2.398,12 C 1.07,12 0,10.93 0,9.602 L 0,9.602 0,2.398 C 0,1.07 1.07,0 2.398,0 L 2.398,0 9.601,0 C 10.93,0 12,1.07 12,2.398 L 12,2.398 12,9.602 C 12,10.93 10.93,12 9.601,12 L 9.601,12 2.398,12 Z M 0.602,7.199 0.602,8.398 C 0.602,8.852 0.931,8.973 1.102,9 L 1.102,9 C 1.156,9.008 1.199,9 1.199,9 L 1.199,9 4.801,9 C 5.102,9 5.398,8.699 5.398,8.699 L 5.398,8.699 C 5.398,8.699 5.699,8.398 6,8.398 L 6,8.398 C 6.301,8.398 6.602,8.699 6.602,8.699 L 6.602,8.699 C 6.602,8.699 6.898,9 7.199,9 L 7.199,9 10.801,9 C 11.398,9 11.398,8.398 11.398,8.398 L 11.398,8.398 11.398,7.199 C 11.398,5.398 10.199,5.398 10.199,5.398 L 10.199,5.398 7.199,5.398 C 6.898,5.398 6.602,6.301 6.602,6.301 L 6.602,6.301 C 6.602,6.301 6.301,7.199 6,7.199 L 6,7.199 C 5.699,7.199 5.398,6.301 5.398,6.301 L 5.398,6.301 C 5.398,6.301 5.102,5.398 4.801,5.398 L 4.801,5.398 1.801,5.398 C 1.801,5.398 0.602,5.398 0.602,7.199"
|
||||||
|
id="path20" /></clipPath><linearGradient
|
||||||
|
x1="0"
|
||||||
|
y1="0"
|
||||||
|
x2="1"
|
||||||
|
y2="0"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(12,0,0,-12,0,6)"
|
||||||
|
spreadMethod="pad"
|
||||||
|
id="linearGradient26"><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0"
|
||||||
|
id="stop28" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop30" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#85878d"
|
||||||
|
offset="0.00137794"
|
||||||
|
id="stop32" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#b6b6b6"
|
||||||
|
offset="0.48571813"
|
||||||
|
id="stop34" /><stop
|
||||||
|
style="stop-opacity:1;stop-color:#5d5c62"
|
||||||
|
offset="1"
|
||||||
|
id="stop36" /></linearGradient><linearGradient
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
y2="0"
|
||||||
|
x2="11.745763"
|
||||||
|
y1="11.542373"
|
||||||
|
x1="0.91525424"
|
||||||
|
id="linearGradient4154"
|
||||||
|
xlink:href="#linearGradient4158" /><linearGradient
|
||||||
|
y2="-0.050847456"
|
||||||
|
x2="12"
|
||||||
|
y1="11.898305"
|
||||||
|
x1="0.10169491"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient4156"
|
||||||
|
xlink:href="#linearGradient5644" /></defs><g
|
||||||
|
id="g10"
|
||||||
|
transform="matrix(1.25,0,0,-1.25,0,15)"><path
|
||||||
|
d="M 11.473,5.117 0.416,5.117 0.416,9.383 11.473,9.383 11.473,5.117 Z"
|
||||||
|
style="fill:#343434;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
id="path12" /><g
|
||||||
|
style="fill:url(#linearGradient4154);fill-opacity:1.0"
|
||||||
|
clip-path="url(#clipPath18)"
|
||||||
|
id="g16"><g
|
||||||
|
style="fill:url(#linearGradient4154);fill-opacity:1.0"
|
||||||
|
id="g22"><g
|
||||||
|
style="fill:url(#linearGradient4154);fill-opacity:1.0"
|
||||||
|
id="g24"><path
|
||||||
|
id="path38"
|
||||||
|
style="fill:url(#linearGradient4156);stroke:none;fill-opacity:1;stroke-opacity:1"
|
||||||
|
d="M 2.398,12 C 1.07,12 0,10.93 0,9.602 L 0,9.602 0,2.398 C 0,1.07 1.07,0 2.398,0 L 2.398,0 9.601,0 C 10.93,0 12,1.07 12,2.398 L 12,2.398 12,9.602 C 12,10.93 10.93,12 9.601,12 L 9.601,12 2.398,12 Z M 0.602,7.199 0.602,8.398 C 0.602,8.852 0.931,8.973 1.102,9 L 1.102,9 C 1.156,9.008 1.199,9 1.199,9 L 1.199,9 4.801,9 C 5.102,9 5.398,8.699 5.398,8.699 L 5.398,8.699 C 5.398,8.699 5.699,8.398 6,8.398 L 6,8.398 C 6.301,8.398 6.602,8.699 6.602,8.699 L 6.602,8.699 C 6.602,8.699 6.898,9 7.199,9 L 7.199,9 10.801,9 C 11.398,9 11.398,8.398 11.398,8.398 L 11.398,8.398 11.398,7.199 C 11.398,5.398 10.199,5.398 10.199,5.398 L 10.199,5.398 7.199,5.398 C 6.898,5.398 6.602,6.301 6.602,6.301 L 6.602,6.301 C 6.602,6.301 6.301,7.199 6,7.199 L 6,7.199 C 5.699,7.199 5.398,6.301 5.398,6.301 L 5.398,6.301 C 5.398,6.301 5.102,5.398 4.801,5.398 L 4.801,5.398 1.801,5.398 C 1.801,5.398 0.602,5.398 0.602,7.199" /></g></g></g></g></svg>
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 6.9 KiB |
1
packages/usb/invalid-config.bin
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@#%#@^^@#^@#$invalid config@#$@^%@^@@%
|
||||||
117
packages/usb/package-lock.json
generated
@@ -149,6 +149,14 @@
|
|||||||
"strip-dirs": "2.1.0"
|
"strip-dirs": "2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"decompress-response": {
|
||||||
|
"version": "3.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
|
||||||
|
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
|
||||||
|
"requires": {
|
||||||
|
"mimic-response": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"decompress-tar": {
|
"decompress-tar": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
|
||||||
@@ -216,6 +224,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
||||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
||||||
},
|
},
|
||||||
|
"detect-libc": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
||||||
|
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
|
||||||
|
},
|
||||||
"end-of-stream": {
|
"end-of-stream": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"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.0.tgz",
|
||||||
@@ -339,9 +352,9 @@
|
|||||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||||
},
|
},
|
||||||
"ini": {
|
"ini": {
|
||||||
"version": "1.3.4",
|
"version": "1.3.5",
|
||||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
|
||||||
"integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4="
|
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
|
||||||
},
|
},
|
||||||
"interpret": {
|
"interpret": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
@@ -386,6 +399,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mimic-response": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4="
|
||||||
|
},
|
||||||
"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",
|
||||||
@@ -415,14 +433,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nan": {
|
"nan": {
|
||||||
"version": "2.6.2",
|
"version": "2.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
|
||||||
"integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U="
|
"integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
|
||||||
},
|
},
|
||||||
"node-abi": {
|
"node-abi": {
|
||||||
"version": "2.1.1",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.3.0.tgz",
|
||||||
"integrity": "sha512-6oxV13poCOv7TfGvhsSz6XZWpXeKkdGVh72++cs33OfMh3KAX8lN84dCvmqSETyDXAFcUHtV7eJrgFBoOqZbNQ=="
|
"integrity": "sha512-zwm6vU3SsVgw3e9fu48JBaRBCJGIvAgysDsqtf5+vEexFE71bEOtaMWb5zr/zODZNzTPtQlqUUpC79k68Hspow==",
|
||||||
|
"requires": {
|
||||||
|
"semver": "5.5.0"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node-hid": {
|
"node-hid": {
|
||||||
"version": "0.5.7",
|
"version": "0.5.7",
|
||||||
@@ -430,8 +451,8 @@
|
|||||||
"integrity": "sha512-dwwpOetL2+MGYgivbO22ML+45ieCGbueWv1rYxRgBoEc2QMp6UF6ZucEkYts1IA3YPWJNkmpGh6dqQ85n19szw==",
|
"integrity": "sha512-dwwpOetL2+MGYgivbO22ML+45ieCGbueWv1rYxRgBoEc2QMp6UF6ZucEkYts1IA3YPWJNkmpGh6dqQ85n19szw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"bindings": "1.3.0",
|
"bindings": "1.3.0",
|
||||||
"nan": "2.6.2",
|
"nan": "2.10.0",
|
||||||
"prebuild-install": "2.3.0"
|
"prebuild-install": "2.5.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"noop-logger": {
|
"noop-logger": {
|
||||||
@@ -512,24 +533,25 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prebuild-install": {
|
"prebuild-install": {
|
||||||
"version": "2.3.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.1.tgz",
|
||||||
"integrity": "sha512-gzjq2oHB8oMbzJSsSh9MQ64zrXZGt092/uT4TLZlz2qnrPxpWqp4vYB7LZrDxnlxf5RfbCjkgDI/z0EIVuYzAw==",
|
"integrity": "sha512-3DX9L6pzwc1m1ksMkW3Ky2WLgPQUBiySOfXVl3WZyAeJSyJb4wtoH9OmeRGcubAWsMlLiL8BTHbwfm/jPQE9Ag==",
|
||||||
"requires": {
|
"requires": {
|
||||||
|
"detect-libc": "1.0.3",
|
||||||
"expand-template": "1.1.0",
|
"expand-template": "1.1.0",
|
||||||
"github-from-package": "0.0.0",
|
"github-from-package": "0.0.0",
|
||||||
"minimist": "1.2.0",
|
"minimist": "1.2.0",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"node-abi": "2.1.1",
|
"node-abi": "2.3.0",
|
||||||
"noop-logger": "0.1.1",
|
"noop-logger": "0.1.1",
|
||||||
"npmlog": "4.1.2",
|
"npmlog": "4.1.2",
|
||||||
"os-homedir": "1.0.2",
|
"os-homedir": "1.0.2",
|
||||||
"pump": "1.0.2",
|
"pump": "2.0.1",
|
||||||
"rc": "1.2.2",
|
"rc": "1.2.6",
|
||||||
"simple-get": "1.4.3",
|
"simple-get": "2.7.0",
|
||||||
"tar-fs": "1.16.0",
|
"tar-fs": "1.16.0",
|
||||||
"tunnel-agent": "0.6.0",
|
"tunnel-agent": "0.6.0",
|
||||||
"xtend": "4.0.1"
|
"which-pm-runs": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"process-nextick-args": {
|
"process-nextick-args": {
|
||||||
@@ -538,21 +560,21 @@
|
|||||||
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
|
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
|
||||||
},
|
},
|
||||||
"pump": {
|
"pump": {
|
||||||
"version": "1.0.2",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
|
||||||
"integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=",
|
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"end-of-stream": "1.4.0",
|
"end-of-stream": "1.4.0",
|
||||||
"once": "1.4.0"
|
"once": "1.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rc": {
|
"rc": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.6",
|
||||||
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz",
|
||||||
"integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=",
|
"integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"deep-extend": "0.4.2",
|
"deep-extend": "0.4.2",
|
||||||
"ini": "1.3.4",
|
"ini": "1.3.5",
|
||||||
"minimist": "1.2.0",
|
"minimist": "1.2.0",
|
||||||
"strip-json-comments": "2.0.1"
|
"strip-json-comments": "2.0.1"
|
||||||
}
|
}
|
||||||
@@ -610,6 +632,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"semver": {
|
||||||
|
"version": "5.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
|
||||||
|
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
|
||||||
|
},
|
||||||
"set-blocking": {
|
"set-blocking": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||||
@@ -640,14 +667,19 @@
|
|||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
||||||
},
|
},
|
||||||
|
"simple-concat": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
|
||||||
|
},
|
||||||
"simple-get": {
|
"simple-get": {
|
||||||
"version": "1.4.3",
|
"version": "2.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz",
|
||||||
"integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=",
|
"integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
|
"decompress-response": "3.3.0",
|
||||||
"once": "1.4.0",
|
"once": "1.4.0",
|
||||||
"unzip-response": "1.0.2",
|
"simple-concat": "1.0.0"
|
||||||
"xtend": "4.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"string-width": {
|
"string-width": {
|
||||||
@@ -704,8 +736,19 @@
|
|||||||
"requires": {
|
"requires": {
|
||||||
"chownr": "1.0.1",
|
"chownr": "1.0.1",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
"pump": "1.0.2",
|
"pump": "1.0.3",
|
||||||
"tar-stream": "1.5.4"
|
"tar-stream": "1.5.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"pump": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
|
||||||
|
"requires": {
|
||||||
|
"end-of-stream": "1.4.0",
|
||||||
|
"once": "1.4.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tar-stream": {
|
"tar-stream": {
|
||||||
@@ -754,16 +797,16 @@
|
|||||||
"through": "2.3.8"
|
"through": "2.3.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"unzip-response": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4="
|
|
||||||
},
|
|
||||||
"util-deprecate": {
|
"util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||||
},
|
},
|
||||||
|
"which-pm-runs": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
|
||||||
|
},
|
||||||
"wide-align": {
|
"wide-align": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
|
||||||
|
|||||||
21
packages/usb/write-userconfig.js
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
const fs = require('fs');
|
||||||
|
const program = require('commander');
|
||||||
|
const uhk = require('./uhk');
|
||||||
|
|
||||||
|
(async function() {
|
||||||
|
program
|
||||||
|
.usage(`configPath`)
|
||||||
|
.parse(process.argv);
|
||||||
|
|
||||||
|
if (program.args.length < 1) {
|
||||||
|
console.error('No configPath path specified.');
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
const configPath = program.args[0];
|
||||||
|
|
||||||
|
const device = uhk.getUhkDevice();
|
||||||
|
const configBuffer = fs.readFileSync(configPath);
|
||||||
|
await uhk.writeConfig(device, configBuffer, false);
|
||||||
|
await uhk.launchEepromTransfer(device, uhk.eepromOperations.write, uhk.configBufferIds.stagingUserConfig);
|
||||||
|
})();
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#!/usr/bin/env ts-node
|
|
||||||
///<reference path="./node_modules/@types/node/index.d.ts"/>
|
|
||||||
|
|
||||||
import { UhkBlhost, UhkHidDevice, UhkOperations } from 'uhk-usb';
|
|
||||||
import { LogService } from 'uhk-common';
|
|
||||||
import * as fs from 'fs';
|
|
||||||
|
|
||||||
if (process.argv.length < 3) {
|
|
||||||
console.log(`use: write-userconfig <path to config file.bin>`);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
const fileContent = fs.readFileSync(process.argv[2]);
|
|
||||||
const json = JSON.stringify(fileContent);
|
|
||||||
const logger = new LogService();
|
|
||||||
const uhkDevice = new UhkHidDevice(logger);
|
|
||||||
const uhkBlHost = new UhkBlhost(logger, '.');
|
|
||||||
const uhkOperations = new UhkOperations(logger, uhkBlHost, uhkDevice, '.');
|
|
||||||
|
|
||||||
const init = async (): Promise<void> => {
|
|
||||||
await uhkOperations.saveUserConfiguration(json);
|
|
||||||
};
|
|
||||||
|
|
||||||
init()
|
|
||||||
.then(() => {
|
|
||||||
console.log('Success');
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.log(error);
|
|
||||||
process.exit(-1);
|
|
||||||
});
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# apt-get install inkscape imagemagick-6.q16 icnsutils
|
# apt-get install inkscape imagemagick-6.q16 icnsutils
|
||||||
|
|
||||||
agentIconSvg=../packages/uhk-web/src/svgs/keyboard/icons/agent-icon.svg
|
agentIconSvg=../packages/uhk-web/src/svgs/icons/agent-icon.svg
|
||||||
|
|
||||||
for size in 16 24 32 48 64 96 128 256 512 1024; do
|
for size in 16 24 32 48 64 96 128 256 512 1024; do
|
||||||
inkscape -z --export-png=../build/icons/${size}x${size}.png -w $size $agentIconSvg
|
inkscape -z --export-png=../build/icons/${size}x${size}.png -w $size $agentIconSvg
|
||||||
|
|||||||