ウェブブラウザから無線機の情報を取得する
前回の記事で Emacs Lisp を使って無線機の情報を取得してみました。今回はウェブブラウザから取得してみます。
ウェブブラウザは Chrome を使用しています。シリアルポートからの読み込みは次の記事が参考になります。
Emacs Lisp で書いたコードを元にして、次のようなコードになりました。
const MODE_MAP = { 0: "LSB", 1: "USB", 2: "AM", 3: "CW", 4: "RTTY", 5: "FM", 6: "WFM", 7: "CW-R", 8: "RTTY-R", 23: "DV" } const FILTER_MAP = { 1: "FIL1", 2: "FIL2", 3: "FIL3" } let port = null const freq = ref(null) const mode = ref(null) const filter = ref(null) const readFreq = (data) => { const l = [] l.push(data[4] >> 4 & 0x0f) // 1GMHz l.push(data[4] & 0x0f) // 100MHz l.push(data[3] >> 4 & 0x0f) // 10MHz l.push(data[3] & 0x0f) // 1MHz l.push(data[2] >> 4 & 0x0f) // 100kHz l.push(data[2] & 0x0f) // 10kHz l.push(data[1] >> 4 & 0x0f) // 1kHz l.push(data[1] & 0x0f) // 100Hz l.push(data[0] >> 4 & 0x0f) // 10Hz l.push(data[0] & 0x0f) // 1Hz const s = l.join("") return `${s.substring(0, 4)}.${s.substring(4, 7)}.${s.substring(7)}` } const readMode = (data) => { return MODE_MAP[data[0]] ?? "UNKNOWN" } const readFilter = (data) => { return FILTER_MAP[data[1]] ?? "UNKNOWN" } const readCIV = (value) => { console.log(value) const cmd = value[4] const data = value.slice(5) switch (cmd) { case 0x00: freq.value = readFreq(data) break case 0x01: mode.value = readMode(data) filter.value = readFilter(data) break } } const onOpenPort = async () => { try { port = await navigator.serial.requestPort() await port.open({ baudRate: 115200 }) } catch (e) { console.log("ERROR", e) return } while (port.readable) { const reader = port.readable.getReader() try { while (true) { const { value, done } = await reader.read() if (done) { reader.releaseLock() break } if (value) { readCIV(value) } } } catch (e) { // TODO: Handle non-fatal read error console.log("ERROR", e) } } }
無線機の周波数、モード、フィルターを変更すると、次のようにブラウザに表示されました。
CWキーイング、無線機の情報取得ができましたので、次は無線機の制御(ブレークインのオン/オフ等)を試してみたいと思います。
JI1JDI
ゆるく楽しくアマチュア無線とプログラミングを楽しんでいます。 scrapbox.io