mirror of https://github.com/nealey/vail.git
Add gamepad support + Enter=straight
This commit is contained in:
parent
feeadb65ba
commit
8e6e18f413
|
@ -77,7 +77,13 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<kbd>c</kbd> or <kbd>,</kbd> or <kbd>⇧ Shift</kbd>
|
<kbd>c</kbd>
|
||||||
|
<kbd>,</kbd>
|
||||||
|
<kbd>Enter</kbd>
|
||||||
|
<kbd>⇧ Shift</kbd>
|
||||||
|
<br>
|
||||||
|
<kbd class="gamepad a" title="Gamepad A">A</kbd>
|
||||||
|
<kbd class="gamepad b" title="Gamepad B">B</kbd>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
@ -98,12 +104,20 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<kbd>.</kbd> or <kbd>z</kbd>
|
<kbd>.</kbd>
|
||||||
|
<kbd>z</kbd>
|
||||||
|
<br>
|
||||||
|
<kbd class="gamepad x" title="Gamepad X">X</kbd>
|
||||||
|
<kbd class="gamepad" title="Gamepad LB">LB</kbd>
|
||||||
<br>
|
<br>
|
||||||
right-click for Dah
|
right-click for Dah
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<kbd>/</kbd> or <kbd>x</kbd>
|
<kbd>/</kbd>
|
||||||
|
<kbd>x</kbd>
|
||||||
|
<br>
|
||||||
|
<kbd class="gamepad y" title="Gamepad Y">Y</kbd>
|
||||||
|
<kbd class="gamepad" title="Gamepad RB">RB</kbd>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -55,6 +55,28 @@ kbd {
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
padding: .1em .6em;
|
padding: .1em .6em;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gamepad {
|
||||||
|
color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
background-color: #444;
|
||||||
|
border-radius: 50%;
|
||||||
|
height: 10px;
|
||||||
|
width: 10px;
|
||||||
|
}
|
||||||
|
.gamepad.a {
|
||||||
|
color: #8f8;
|
||||||
|
}
|
||||||
|
.gamepad.b {
|
||||||
|
color: #f88;
|
||||||
|
}
|
||||||
|
.gamepad.x {
|
||||||
|
color: #88f;
|
||||||
|
}
|
||||||
|
.gamepad.y {
|
||||||
|
color: #ff8;
|
||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
|
|
112
static/vail.js
112
static/vail.js
|
@ -262,8 +262,8 @@ class Vail {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen for keystrokes
|
// Listen for keystrokes
|
||||||
document.addEventListener("keydown", e => this.key(e))
|
document.addEventListener("keydown", e => this.keyboard(e))
|
||||||
document.addEventListener("keyup", e => this.key(e))
|
document.addEventListener("keyup", e => this.keyboard(e))
|
||||||
|
|
||||||
// Make helpers
|
// Make helpers
|
||||||
this.iambic = new Iambic(() => this.beginTx(), () => this.endTx())
|
this.iambic = new Iambic(() => this.beginTx(), () => this.endTx())
|
||||||
|
@ -282,19 +282,9 @@ class Vail {
|
||||||
navigator.requestMIDIAccess()
|
navigator.requestMIDIAccess()
|
||||||
.then(a => this.midiInit(a))
|
.then(a => this.midiInit(a))
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// Set up for gamepad input
|
||||||
maximize(e) {
|
window.addEventListener("gamepadconnected", e => this.gamepadConnected(e))
|
||||||
let element = e.target
|
|
||||||
while (! element.classList.contains("mdl-card")) {
|
|
||||||
element = element.parentElement
|
|
||||||
if (! element) {
|
|
||||||
console.log("Maximize button: couldn't find parent card")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
element.classList.toggle("maximized")
|
|
||||||
console.log(element)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
openSocket() {
|
openSocket() {
|
||||||
|
@ -368,14 +358,9 @@ class Vail {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error(msg) {
|
error(msg) {
|
||||||
let now = new Date()
|
toast(msg)
|
||||||
let el = document.querySelector("#snackbar")
|
|
||||||
el.MaterialSnackbar.showSnackbar({
|
|
||||||
message: msg,
|
|
||||||
timeout: 2000
|
|
||||||
})
|
|
||||||
this.buzzer.ErrorTone()
|
this.buzzer.ErrorTone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,8 +468,16 @@ class Vail {
|
||||||
this.endTx()
|
this.endTx()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iambicDit(begin) {
|
||||||
|
this.iambic.Key(begin, DIT)
|
||||||
|
}
|
||||||
|
|
||||||
|
iambicDah(begin) {
|
||||||
|
this.iambic.Key(begin, DAH)
|
||||||
|
}
|
||||||
|
|
||||||
key(event) {
|
keyboard(event) {
|
||||||
if (event.repeat) {
|
if (event.repeat) {
|
||||||
// Ignore key repeats generated by the OS, we do this ourselves
|
// Ignore key repeats generated by the OS, we do this ourselves
|
||||||
return
|
return
|
||||||
|
@ -494,19 +487,19 @@ class Vail {
|
||||||
|
|
||||||
if ((event.code == "KeyZ") || (event.code == "Period")) {
|
if ((event.code == "KeyZ") || (event.code == "Period")) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
this.iambic.Key(begin, DIT)
|
this.iambicDit(begin)
|
||||||
}
|
}
|
||||||
if ((event.code == "KeyX") || (event.code == "Slash")) {
|
if ((event.code == "KeyX") || (event.code == "Slash")) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
this.iambic.Key(begin, DAH)
|
this.iambicDah(begin)
|
||||||
}
|
}
|
||||||
if ((event.code == "KeyC") || (event.code == "Comma") || (event.key == "Shift")) {
|
if ((event.code == "KeyC") ||
|
||||||
|
(event.code == "Comma") ||
|
||||||
|
(event.key == "Shift") ||
|
||||||
|
(event.key == "Enter") ||
|
||||||
|
(event.key == "NumpadEnter")) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
if (begin) {
|
this.straightKey(begin)
|
||||||
this.beginTx()
|
|
||||||
} else {
|
|
||||||
this.endTx()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -516,11 +509,11 @@ class Vail {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
|
|
||||||
if (event.target.id == "dah") {
|
if (event.target.id == "dah") {
|
||||||
this.iambic.Key(begin, DAH)
|
this.iambicDah(begin)
|
||||||
} else if ((event.target.id == "dit") && (event.button == 2)) {
|
} else if ((event.target.id == "dit") && (event.button == 2)) {
|
||||||
this.iambic.Key(begin, DAH)
|
this.iambicDah(begin)
|
||||||
} else if (event.target.id == "dit") {
|
} else if (event.target.id == "dit") {
|
||||||
this.iambic.Key(begin, DIT)
|
this.iambigDit(begin)
|
||||||
} else if (event.target.id == "key") {
|
} else if (event.target.id == "key") {
|
||||||
this.straightKey(begin)
|
this.straightKey(begin)
|
||||||
} else if ((event.target.id == "ck") && begin) {
|
} else if ((event.target.id == "ck") && begin) {
|
||||||
|
@ -528,6 +521,42 @@ class Vail {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gamepadConnected(event) {
|
||||||
|
// Polling could be computationally expensive,
|
||||||
|
// especially on devices with a power budget, like phones.
|
||||||
|
// To be considerate, we only start polling if a gamepad appears.
|
||||||
|
if (! this.gamepadButtons) {
|
||||||
|
this.gamepadButtons = {}
|
||||||
|
this.gamepadPoll(event.timeStamp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gamepadPoll(timestamp) {
|
||||||
|
let currentButtons = {}
|
||||||
|
for (let gp of navigator.getGamepads()) {
|
||||||
|
if (gp == null) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
currentButtons.key |= gp.buttons[0].pressed || gp.buttons[1].pressed
|
||||||
|
currentButtons.dit |= gp.buttons[2].pressed || gp.buttons[4].pressed
|
||||||
|
currentButtons.dah |= gp.buttons[3].pressed || gp.buttons[5].pressed
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentButtons.key != this.gamepadButtons.key) {
|
||||||
|
this.straightKey(currentButtons.key)
|
||||||
|
}
|
||||||
|
if (currentButtons.dit != this.gamepadButtons.dit) {
|
||||||
|
this.iambicDit(currentButtons.dit)
|
||||||
|
}
|
||||||
|
if (currentButtons.dah != this.gamepadButtons.dah) {
|
||||||
|
this.iambicDah(currentButtons.dah)
|
||||||
|
}
|
||||||
|
this.gamepadButtons = currentButtons
|
||||||
|
|
||||||
|
requestAnimationFrame(e => this.gamepadPoll(e))
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send "CK" to server, and don't squelch the repeat
|
* Send "CK" to server, and don't squelch the repeat
|
||||||
*/
|
*/
|
||||||
|
@ -545,6 +574,21 @@ class Vail {
|
||||||
this.wsSend(Date.now(), 0) // Get round-trip time
|
this.wsSend(Date.now(), 0) // Get round-trip time
|
||||||
this.socket.send(JSON.stringify(msg))
|
this.socket.send(JSON.stringify(msg))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maximize(e) {
|
||||||
|
let element = e.target
|
||||||
|
while (! element.classList.contains("mdl-card")) {
|
||||||
|
element = element.parentElement
|
||||||
|
if (! element) {
|
||||||
|
console.log("Maximize button: couldn't find parent card")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
element.classList.toggle("maximized")
|
||||||
|
console.log(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function vailInit() {
|
function vailInit() {
|
||||||
|
|
Loading…
Reference in New Issue