ウェブブラウザから無線機の情報を取得する

前回の記事で Emacs Lisp を使って無線機の情報を取得してみました。今回はウェブブラウザから取得してみます。

ウェブブラウザは Chrome を使用しています。シリアルポートからの読み込みは次の記事が参考になります。

developer.chrome.com

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