Add CK button

This commit is contained in:
Neale Pickett 2020-04-26 22:37:31 -06:00
parent 308131f901
commit 0bd790e23a
2 changed files with 72 additions and 17 deletions

View File

@ -26,6 +26,7 @@
<nav class="mdl-navigation"> <nav class="mdl-navigation">
<a class="mdl-navigation__link" href="https://github.com/nealey/vail">Source Code</a> <a class="mdl-navigation__link" href="https://github.com/nealey/vail">Source Code</a>
<a class="mdl-navigation__link" href="https://github.com/nealey/vail/issues/new">Bug Report</a> <a class="mdl-navigation__link" href="https://github.com/nealey/vail/issues/new">Bug Report</a>
<a class="mdl-navigation__link" href="https://morse.withgoogle.com/learn/">Learn Morse</a>
</nav> </nav>
</div> </div>
</header> </header>
@ -37,6 +38,10 @@
<a class="mdl-navigation__link" href="?repeater=int">16-20 WPM</a> <a class="mdl-navigation__link" href="?repeater=int">16-20 WPM</a>
<a class="mdl-navigation__link" href="?repeater=adv">21-99 WPM</a> <a class="mdl-navigation__link" href="?repeater=adv">21-99 WPM</a>
</nav> </nav>
<hr>
<nav class="mdl-navigation">
<a class="mdl-navigation__link" href="https://morse.withgoogle.com/learn/">Learn Morse Code</a>
</nav>
</div> </div>
<main class="mdl-layout__content"> <main class="mdl-layout__content">
@ -51,6 +56,7 @@
<div class="mdl-tabs__tab-bar"> <div class="mdl-tabs__tab-bar">
<a href="#straight" class="mdl-tabs__tab is-active">Straight Key</a> <a href="#straight" class="mdl-tabs__tab is-active">Straight Key</a>
<a href="#iambic" class="mdl-tabs__tab">Iambic</a> <a href="#iambic" class="mdl-tabs__tab">Iambic</a>
<a href="#tools" class="mdl-tabs__tab">Tools</a>
</div> </div>
<div class="mdl-tabs__panel is-active" id="straight"> <div class="mdl-tabs__panel is-active" id="straight">
<table class="center wide"> <table class="center wide">
@ -92,6 +98,20 @@
</tr> </tr>
</table> </table>
</div> </div>
<div class="mdl-tabs__panel" id="tools">
<table class="center wide">
<tr>
<td>
<button id="ck" class="key mdl-button mdl-js-button mdl-button--raised mdl-button--colored">
CK
</button>
</td>
</tr>
<tr>
<td>Echo On</td>
</tr>
</table>
</div>
</div> </div>
</div> </div>
@ -142,7 +162,7 @@
type="range" type="range"
min="0" min="0"
max="5000" max="5000"
value="300"> value="400">
</p> </p>
<p> <p>
Dit length (iambic): Dit length (iambic):
@ -153,7 +173,7 @@
type="range" type="range"
min="40" min="40"
max="255" max="255"
value="80"> value="100">
</p> </p>
</div> </div>
</div> </div>
@ -210,7 +230,6 @@
<li>Make this page less ugly</li> <li>Make this page less ugly</li>
<li>Arduino program to let you hook up an iambic paddle over USB</li> <li>Arduino program to let you hook up an iambic paddle over USB</li>
<li>Document the protocol</li> <li>Document the protocol</li>
<li>Support multiple channels/frequencies</li>
</ul> </ul>

View File

@ -134,7 +134,8 @@ class Buzzer {
} }
let acOffset = Date.now() - this.ac.currentTime*1000 let acOffset = Date.now() - this.ac.currentTime*1000
return (when - acOffset) / 1000 let acTime = (when - acOffset) / 1000
return acTime
} }
/** /**
@ -206,8 +207,8 @@ class Vail {
let wsUrl = new URL(window.location) let wsUrl = new URL(window.location)
wsUrl.protocol = "ws:" wsUrl.protocol = "ws:"
wsUrl.pathname += "chat" wsUrl.pathname += "chat"
window.socket = new WebSocket(wsUrl) this.socket = new WebSocket(wsUrl)
window.socket.addEventListener("message", e => this.wsMessage(e)) this.socket.addEventListener("message", e => this.wsMessage(e))
// Listen to HTML buttons // Listen to HTML buttons
for (let e of document.querySelectorAll("button.key")) { for (let e of document.querySelectorAll("button.key")) {
@ -226,7 +227,7 @@ class Vail {
// Listen for slider values // Listen for slider values
this.inputInit("#iambic-duration", e => this.iambic.SetInterval(e.target.value)) this.inputInit("#iambic-duration", e => this.iambic.SetInterval(e.target.value))
this.inputInit("#rx-delay", e => {this.rxDelay = e.target.value}) this.inputInit("#rx-delay", e => {this.rxDelay = Number(e.target.value)})
} }
inputInit(selector, func) { inputInit(selector, func) {
@ -268,7 +269,7 @@ class Vail {
updateReadings() { updateReadings() {
let avgLag = this.lagTimes.reduce((a,b) => (a+b)) / this.lagTimes.length let avgLag = this.lagTimes.reduce((a,b) => (a+b)) / this.lagTimes.length
let longestRx = this.rxDurations.reduce(Math.max) let longestRx = this.rxDurations.reduce((a,b) => Math.max(a,b))
let suggestedDelay = (avgLag + longestRx) * 1.2 let suggestedDelay = (avgLag + longestRx) * 1.2
this.updateReading("#lag-value", avgLag.toFixed()) this.updateReading("#lag-value", avgLag.toFixed())
@ -278,7 +279,7 @@ class Vail {
addLagReading(duration) { addLagReading(duration) {
this.lagTimes.push(duration) this.lagTimes.push(duration)
if (this.lagTimes.length > 20) { while (this.lagTimes.length > 20) {
this.lagTimes.shift() this.lagTimes.shift()
} }
this.updateReadings() this.updateReadings()
@ -286,7 +287,7 @@ class Vail {
addRxDuration(duration) { addRxDuration(duration) {
this.rxDurations.push(duration) this.rxDurations.push(duration)
if (this.rxDurations.length > 20) { while (this.rxDurations.length > 20) {
this.rxDurations.shift() this.rxDurations.shift()
} }
this.updateReadings() this.updateReadings()
@ -295,30 +296,46 @@ class Vail {
wsSend(time, duration) { wsSend(time, duration) {
let msg = [time, duration] let msg = [time, duration]
let jmsg = JSON.stringify(msg) let jmsg = JSON.stringify(msg)
window.socket.send(jmsg) this.socket.send(jmsg)
this.sent.push(jmsg) this.sent.push(jmsg)
} }
wsMessage(event) { wsMessage(event) {
let now = Date.now()
let jmsg = event.data let jmsg = event.data
let msg = JSON.parse(jmsg) let msg = JSON.parse(jmsg)
let beginTxTime = msg[0] let beginTxTime = msg[0]
let duration = msg[1] let durations = msg.slice(1)
let sent = this.sent.filter(e => e != jmsg) let sent = this.sent.filter(e => e != jmsg)
if (sent.length < this.sent.length) { if (sent.length < this.sent.length) {
// We're getting our own message back, which tells us our lag. // We're getting our own message back, which tells us our lag.
// We shouldn't emit a tone, though. // We shouldn't emit a tone, though.
let totalDuration = durations.reduce((a,b) => a+b)
this.sent = sent this.sent = sent
this.addLagReading(Date.now() - beginTxTime - duration) this.addLagReading(now - beginTxTime - totalDuration)
return return
} }
// Beep!
this.buzzer.BuzzDuration(false, beginTxTime+this.rxDelay, duration)
let adjustedTxTime = beginTxTime+this.rxDelay
if (adjustedTxTime < now) {
this.buzzer.ErrorTone()
return
}
// Every other value is a silence duration
let tx = true
for (let duration of durations) {
duration = Number(duration)
if (tx) {
this.buzzer.BuzzDuration(false, adjustedTxTime, duration)
this.addRxDuration(duration) this.addRxDuration(duration)
} }
adjustedTxTime = Number(adjustedTxTime) + duration
tx = !tx
}
}
key(event) { key(event) {
if (event.repeat) { if (event.repeat) {
@ -361,8 +378,27 @@ class Vail {
} else { } else {
this.endTx() this.endTx()
} }
} else if (event.target.id == "ck") {
this.Test()
} }
} }
/**
* Send "CK" to server, and don't squelch the repeat
*/
Test() {
let dit = Number(document.querySelector("#iambic-duration-value").value)
let dah = dit * 3
let s = dit
let msg = [
Date.now(),
dah, s, dit, s, dah, s, dit,
s * 3,
dah, s, dit, s, dah
]
this.socket.send(JSON.stringify(msg))
}
} }
function vailInit() { function vailInit() {