Skip to content

Commit

Permalink
feat: fix up webhid-demo
Browse files Browse the repository at this point in the history
  • Loading branch information
Julusian committed Dec 31, 2021
1 parent c8c8af3 commit b08ede0
Show file tree
Hide file tree
Showing 11 changed files with 555 additions and 273 deletions.
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@
"@types/jest": "^27.0.3",
"@types/node": "^14.17.34",
"@types/node-hid": "^1.3.1",
"@types/react": "^17.0.38",
"@types/react-color": "^3.0.6",
"@types/react-dom": "^17.0.11",
"codecov": "^3.8.3",
"concurrently": "^6.4.0",
"copy-webpack-plugin": "^9.1.0",
Expand Down
6 changes: 5 additions & 1 deletion packages/webhid-demo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
},
"dependencies": {
"@xencelabs-quick-keys/webhid": "0.3.0",
"buffer": "^6.0.3"
"buffer": "^6.0.3",
"classnames": "^2.3.1",
"react": "^17.0.2",
"react-color": "^2.19.3",
"react-dom": "^17.0.2"
}
}
86 changes: 1 addition & 85 deletions packages/webhid-demo/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,92 +25,8 @@ <h3>Based on <a href="https://github.com/Julusian/node-xencelabs-quick-keys/">@x
<h3>
Note: For linux, you need to ensure udev is setup with the correct device permissions for the hidraw driver.
</h3>
<p>
<a href="#" id="consent-button">Select device</a>
</p>

<p>
Wheel Red: <input type="range" min="0" max="255" value="255" id="red-range" />
</p>
<p>
Wheel Green: <input type="range" min="0" max="255" value="0" id="green-range" />
</p>
<p>
Wheel Blue: <input type="range" min="0" max="255" value="0" id="blue-range" />
</p>

<p>
Wheel Speed: <input type="range" min="1" max="5" value="3" id="speed-range" />
</p>

<p>
Display Brightness:
<select id="brightness-select">
<option value="3">Full</option>
<option value="2">Medium</option>
<option value="1">Min</option>
<option value="0">Off</option>
</select>
</p>

<p>
Orientation:
<select id="orientation-select">
<option value="1">0&#176;</option>
<option value="2">90&#176;</option>
<option value="3">180&#176;</option>
<option value="4">270&#176;</option>
</select>
</p>

<p>
<table>
<tr>
<td colspan="5">Note: these are orientation for 0&#176;</td>
</tr>
<tr>
<td rowspan="2">
<div class="btn" data-id="8"></div>
</td>
<td>
<input class="textlabel" value="one" data-id="0" />
</td>
<td>
<input class="textlabel" value="two" data-id="1" />
</td>
<td>
<input class="textlabel" value="three" data-id="2" />
</td>
<td>
<input class="textlabel" value="four" data-id="3" />
</td>
<td rowspan="2">
<div class="btn" id="counter" data-id="9">0</div>
</td>
</tr>
<tr>
<td>
<input class="textlabel" value="five" data-id="4" />
</td>
<td>
<input class="textlabel" value="six" data-id="5" />
</td>
<td>
<input class="textlabel" value="seven" data-id="6" />
</td>
<td>
<input class="textlabel" value="eight" data-id="7" />
</td>
</tr>
</table>
</p>

<p>
Overlay:
<input id="overlay-duration" type="number" min="0" max="255" value="2" />
<input id="overlay-text" type="text" value="This is an overlay!" />
<button id="overlay-show">Show</button>
</p>
<div id="container">Loading...</div>

<div id="log" style="white-space: pre; background: #ffffff;"></div>

Expand Down
181 changes: 0 additions & 181 deletions packages/webhid-demo/src/app.ts

This file was deleted.

91 changes: 91 additions & 0 deletions packages/webhid-demo/src/app.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { XencelabsQuickKeysManagerInstance, XencelabsQuickKeys } from '@xencelabs-quick-keys/webhid'
import * as React from 'react'
import * as ReactDom from 'react-dom'
import { DeviceRenderer } from './device'

export interface DeviceManagerProps {}

interface WrappedDevice {
id: string
device: XencelabsQuickKeys
}
let nextId = 0

export function DeviceManager({}: DeviceManagerProps) {
const [devices, setDevices] = React.useState<Array<WrappedDevice>>([])

const onConnect = React.useCallback(
(dev: XencelabsQuickKeys) => {
dev.startData().catch((e) => {
console.error(`Failed to startData: ${e}`)
})

setDevices((old) => [
...old,
{
id: dev.deviceId ?? `${nextId++}`,
device: dev,
},
])
},
[setDevices]
)
const onDisconnect = React.useCallback(
(dev: XencelabsQuickKeys) => {
dev.stopData().catch((e) => {
console.error(`Failed to stopData: ${e}`)
})

setDevices((old) => {
if (dev.deviceId) {
return old.filter((d) => d.id === dev.deviceId)
} else {
return old.filter((d) => d.device === dev)
}
})
},
[setDevices]
)

React.useEffect(() => {
XencelabsQuickKeysManagerInstance.on('connect', onConnect)
XencelabsQuickKeysManagerInstance.on('disconnect', onDisconnect)

return () => {
XencelabsQuickKeysManagerInstance.off('connect', onConnect)
XencelabsQuickKeysManagerInstance.off('disconnect', onDisconnect)
}
}, [onConnect, onDisconnect])

const requestDevice = React.useCallback(() => {
XencelabsQuickKeysManagerInstance.requestXencelabsQuickKeys().catch((e: any) => {
console.error('Failed', e)
})
}, [])
const reopenDevices = React.useCallback(() => {
XencelabsQuickKeysManagerInstance.reopenXencelabsQuickKeys().catch((e: any) => {
console.error('Failed', e)
})
}, [])

return (
<div>
<button onClick={requestDevice}>Select usb device</button>
<button onClick={reopenDevices}>Reopen paired devices</button>

<hr />

{devices.map((entry) => (
<div key={entry.id}>
<DeviceRenderer device={entry.device} />
<hr />
</div>
))}

{devices.length === 0 ? <p>No devices are attached</p> : ''}
</div>
)
}

const elm = document.getElementById('container')
ReactDom.render(<DeviceManager />, elm!)
Loading

0 comments on commit b08ede0

Please sign in to comment.