ブラウザから無線機を制御する ~ DitDah CAT

無線機をソフトウェアで操作するときの制御方式の説明で「CAT」という用語が出てきます。次のようなものです。

八重洲以外の無線機(ICOMKenwood)のマニュアルには出てこないので八重洲の用語かと思ったのですが、次のように「CAT」は「Computer Aided Transceiver」とのことなので、コンピュータで制御する方式は一般的に「CAT」と言ってよいようです。

Computer Aided Transceiver - Wikipedia

ということで、ウェブブラウザで無線機を制御するアプリを「DitDah CAT」と名づけることにしました。

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

シリアルポートへの書き込みは前回と同じく次の記事を参考にします。

developer.chrome.com

コードは次のようになりました。UI のコードは省略します。

const BREAK_IN_OFF  = 0x00
const BREAK_IN_SEMI = 0x01
const BREAK_IN_FULL = 0x02

const breakInState = [BREAK_IN_OFF, BREAK_IN_SEMI, BREAK_IN_FULL]
const BREAK_IN_TEXT_MAP = { 0x00: "BKIN OFF", 0x01: "BKIN", 0x02: "F-BKIN" }

const breakIn = ref(BREAK_IN_OFF)
const breakInText = ref(BREAK_IN_TEXT_MAP[0])

const write = async (data) => {
  const writer = port.writable.getWriter()
  await writer.write(data)
  writer.releaseLock()
}

const onChangeBreakIn = async () => {
  breakInState.push(breakInState.shift())

  let data = new Uint8Array([0xfe, 0xfe, 0xa4, 0xe0, 0x16, 0x47, breakInState[0], 0xfd])
  await write(data)

  data = new Uint8Array([0xfe, 0xfe, 0xa4, 0xe0, 0x16, 0x47, 0xfd])
  await write(data)
}

最初のwriteでブレークインの設定、次のwriteで設定された値を読んでいます。writeすると無線機側から応答が返ってくるので、readで実行結果を知ることができますが、前回の記事でトランシーブをオンにしていますので、今回は実行結果はそちらの読み込みループの中で受け取っています。成功すると0xFB、失敗すると0xFDが返ります。

取得したブレークイン状態は読み込みループ内で次のように取得して UI に反映しています。

  switch (cmd) {
    ...(省略)...
  case 0x16:
    const subcmd = value[5]
    if (subcmd == 0x47) {
      breakInText.value = BREAK_IN_TEXT_MAP[value[6]]
    }
    break
  }

次のようにブレークイン状態によってボタンのテキストが変わりました。

無線機の制御はネイティブアプリで作成した方が楽ですが、今後もウェブブラウザでどこまでできるかゆるく試してみたいと思います。

JI1JDI

ゆるく楽しくアマチュア無線とプログラミングを楽しんでいます。 scrapbox.io