From dd5b0ec4a02c0078d8c308761549029419be9959 Mon Sep 17 00:00:00 2001 From: Gene Mecija Date: Wed, 15 Jan 2020 00:41:40 -0800 Subject: [PATCH] Legend updates & morse paddle function --- src/app-modes/ChallengeMode.js | 2 +- src/app-modes/PracticeMode.js | 14 +-- src/components/Legend.js | 12 ++- src/config.json | 2 +- src/css/App.css | 32 +++++- src/css/App.css.map | 2 +- src/hooks/useMorsePlayer.js | 3 +- src/hooks/usePaddleTelegraph.js | 175 ++++++++++++++++++++++++++++++++ src/hooks/useTelegraph.js | 4 +- src/scss/App.scss | 25 ++++- 10 files changed, 252 insertions(+), 19 deletions(-) create mode 100644 src/hooks/usePaddleTelegraph.js diff --git a/src/app-modes/ChallengeMode.js b/src/app-modes/ChallengeMode.js index 7490f85..8577d9c 100644 --- a/src/app-modes/ChallengeMode.js +++ b/src/app-modes/ChallengeMode.js @@ -7,7 +7,7 @@ import useTelegraph from '../hooks/useTelegraph'; // import ChallengeDisplay from '../components/ChallengeDisplay'; import ChallengeBufferDisplay from '../components/ChallengeBufferDisplay'; -function ChallengeMode() { +function ChallengeMode() { console.log("ChallengeMode loaded"); let word = "morse" diff --git a/src/app-modes/PracticeMode.js b/src/app-modes/PracticeMode.js index 5379e62..b9451e5 100644 --- a/src/app-modes/PracticeMode.js +++ b/src/app-modes/PracticeMode.js @@ -1,18 +1,20 @@ import React from 'react'; import '../css/App.css'; -import useTelegraph from '../hooks/useTelegraph'; +// import useTelegraph from '../hooks/useTelegraph'; +import usePaddleTelegraph from '../hooks/usePaddleTelegraph'; import MorseBufferDisplay from '../components/MorseBufferDisplay' import MorseDisplay from '../components/MorseDisplay' function PracticeMode() { console.log("PracticeMode loaded"); - const {morseCharBuffer, morseWords, clearHistory} = useTelegraph('practice') - + // const {morseCharBuffer, morseWords, clearHistory} = useTelegraph('practice') + usePaddleTelegraph() + return ( <> -
-
-
+ {/*
+
*/} +
); diff --git a/src/components/Legend.js b/src/components/Legend.js index cdb0d71..c12dc3c 100644 --- a/src/components/Legend.js +++ b/src/components/Legend.js @@ -14,10 +14,9 @@ function Legend() { let newWord = convertWordToMorse(word) console.log(newWord); - let name = '--._._-._.' playMorseWord(newWord) - } + function convertWordToMorse(word) { let morse = '' for (let i in word) { @@ -27,9 +26,16 @@ function Legend() { return morse } + const legend = Object.keys(morseCode).map((morse, index) => +
+ + {morseCode[morse]} +
+ ) + return (
- + {legend}
diff --git a/src/config.json b/src/config.json index 52aff37..bf51225 100644 --- a/src/config.json +++ b/src/config.json @@ -2,7 +2,7 @@ "timingUnit": 1, "ditMaxTime": 60, "mainVolume": 0.2, - "frequency": 550.0, + "frequency": 700.0, "practiceSpeed": { "slow": 40, "normal": 24, diff --git a/src/css/App.css b/src/css/App.css index b625c8a..cd66f0b 100644 --- a/src/css/App.css +++ b/src/css/App.css @@ -40,6 +40,34 @@ html, body { border-radius: 0px; } +#legend { + width: 450px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: space-evenly; + -ms-flex-pack: space-evenly; + justify-content: space-evenly; + -ms-flex-item-align: center; + align-self: center; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +#legend div { + width: 80px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; +} + +#legend div button { + width: 40px; + margin: 4px; +} + #main-content { width: 95vw; border: 1px solid red; @@ -53,8 +81,8 @@ html, body { } #morseButton { - width: 200px !important; - height: 200px; + width: 100px !important; + height: 100px; margin: 30px; background: goldenrod; border-radius: 50%; diff --git a/src/css/App.css.map b/src/css/App.css.map index 18fd22b..b3a82f3 100644 --- a/src/css/App.css.map +++ b/src/css/App.css.map @@ -1,6 +1,6 @@ { "version": 3, - "mappings": "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", + "mappings": "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", "sources": [ "../scss/App.scss" ], diff --git a/src/hooks/useMorsePlayer.js b/src/hooks/useMorsePlayer.js index d5a74e9..6b9d696 100644 --- a/src/hooks/useMorsePlayer.js +++ b/src/hooks/useMorsePlayer.js @@ -2,7 +2,7 @@ import config from '../config.json' function useMorsePlayer() { - const ditMaxTime = config.ditMaxTime + const ditMaxTime = 85 //config.ditMaxTime // Tone Setup let AudioContext = window.AudioContext || window.webkitAudioContext @@ -43,7 +43,6 @@ function useMorsePlayer() { g.gain.setTargetAtTime(0.0001, startTime + length/1000, 0.001) o.stop(startTime + length/1000 + 0.05) - console.log("length/1000", length/1000); }) } diff --git a/src/hooks/usePaddleTelegraph.js b/src/hooks/usePaddleTelegraph.js new file mode 100644 index 0000000..22bf72e --- /dev/null +++ b/src/hooks/usePaddleTelegraph.js @@ -0,0 +1,175 @@ +import {useEffect} from 'react' +import config from '../config.json' + +// SINGLE/DUAL LEVER TELEGRAPH + +function usePaddleTelegraph() { + + const ditMaxTime = 85 + let leftIsPressed = false + let rightIsPressed = false + let queueRunning = false + let queue = [] + + let currentPromise = Promise.resolve() + + // Audio Setup + let AudioContext = window.AudioContext || window.webkitAudioContext || false + let context + window.AudioContext = window.AudioContext || window.webkitAudioContext; + if (AudioContext) { + context = new AudioContext() + } else { + context = null + } + let frequency = config.frequency + + + // Promisify playing Dits and Dahs + function play(ditDah) { + let playDuration = ((ditDah === '.') ? ditMaxTime : ditMaxTime*3) + + return new Promise((resolve, reject) => { + if (context.state === 'interrupted') { + context.resume() + } + + let o = context.createOscillator() + o.frequency.value = frequency + o.type = "sine" + o.onended = () => { + resolve() + } + + let startTime = context.currentTime; + + let g = context.createGain() + g.gain.exponentialRampToValueAtTime(config.mainVolume, startTime) + g.gain.setValueAtTime(config.mainVolume, startTime) + o.connect(g) + g.connect(context.destination) + o.start(startTime) + + g.gain.setTargetAtTime(0.0001, startTime + playDuration/1000, 0.001) + o.stop(startTime + playDuration/1000 + 0.05) + }) + } + + function playWithSpaces(ditDah) { + let delay = (ditDah === '.') ? ditMaxTime + ditMaxTime : ditMaxTime*3 + ditMaxTime + + return new Promise(function(resolve) { + if (ditDah === '.' || ditDah === '-') { + play(ditDah) + .then(setTimeout(() => { + resolve(); + }, delay)) + } else { + setTimeout(() => { + resolve(); + }, delay) + } + }); + } + + function executeQueue() { + let localQueue = queue + console.log('localQueue',localQueue); + + // Set wait time to completion of queue (including spaces) + let waitTime = 0 + for (let i in localQueue) { + if (localQueue[i] === '.') { + waitTime += ditMaxTime*2 + } else if (localQueue[i] === '-') { + waitTime += ditMaxTime*4 + } + } + + queueRunning = true + + // Wait till completion of queue to execute + setTimeout(() => { + queueRunning = false + queue = [] + checkPressed() + }, waitTime) + + // Execute queue + for (let i = 0; i < localQueue.length; i++) { + currentPromise = currentPromise.then(() => { + return playWithSpaces(localQueue[i]) + }); + } + } + + function checkPressed() { + if (leftIsPressed) { + queue.push('.') + } + if (rightIsPressed) { + queue.push('-') + } + if (queue.length > 0) { + executeQueue() + } + } + + function handleInputStart(event) { + event.preventDefault() + + if (event.repeat) { return } + + if (event.keyCode === 188) { + leftIsPressed = true + console.log("LEFT DOWN"); + + // Prevent further input if queue is executing + if (!queueRunning) { + checkPressed() + } + } + else if (event.keyCode === 190) { + rightIsPressed = true + console.log("RIGHT DOWN"); + + // Prevent further input if queue is executing + if (!queueRunning) { + checkPressed() + } + } + } + + function handleInputEnd(event) { + event.preventDefault() + + if (event.keyCode === 188) { + leftIsPressed = false + console.log("LEFT UP"); + } + else if (event.keyCode === 190) { + rightIsPressed = false + console.log("RIGHT UP"); + } + } + + useEffect(() => { + document.addEventListener('keydown', handleInputStart) + document.addEventListener('keyup', handleInputEnd) + + const morseButton = document.getElementById('morseButton') + morseButton.addEventListener('mousedown', handleInputStart) + morseButton.addEventListener('touchstart', handleInputStart) + morseButton.addEventListener('mouseup', handleInputEnd) + morseButton.addEventListener('touchend', handleInputEnd) + + return function cleanup() { + document.removeEventListener('keydown', handleInputStart) + document.removeEventListener('keyup', handleInputEnd) + } + // eslint-disable-next-line + }, []) + +} + +export default usePaddleTelegraph \ No newline at end of file diff --git a/src/hooks/useTelegraph.js b/src/hooks/useTelegraph.js index cd9d705..77050fc 100644 --- a/src/hooks/useTelegraph.js +++ b/src/hooks/useTelegraph.js @@ -1,6 +1,8 @@ import {useState, useEffect} from 'react' import config from '../config.json' +// STRAIGHT KEY TELEGRAPH + function useTelegraph(mode = 'practice') { const [morseCharBuffer, setMorseCharBuffer] = useState('') // e.g. '-..' @@ -30,7 +32,7 @@ function useTelegraph(mode = 'practice') { let o // Oscillator Node let g // Gain Node - let frequency = 550.0 + let frequency = config.frequency let isRunning = false diff --git a/src/scss/App.scss b/src/scss/App.scss index a8f1906..b0b01c7 100644 --- a/src/scss/App.scss +++ b/src/scss/App.scss @@ -31,6 +31,27 @@ html, body { border-radius: $main-border-radius; } } + +#legend { + width: 450px; + display: flex; + justify-content: space-evenly; + align-self: center; + flex-wrap: wrap; + + div { + width: 80px; + display: flex; + flex-wrap: nowrap; + + button { + width: 40px; + margin: 4px; + } + } + +} + #main-content { width: 95vw; border: 1px solid red; @@ -39,8 +60,8 @@ html, body { } #morseButton { - width: 200px !important; - height: 200px; + width: 100px !important; + height: 100px; margin: 30px; background: goldenrod; border-radius: 50%;