• Switched On USB 後編

前回は、USBシリアル変換アダプターを使って、フットスイッチをPCに接続した。今回は、そのソフトウェアについて解説する。なお、ソフトウェアとしては、いろいろな言語もあり、好みもあるだろう。ということで、.NET Frameworkを使った場合の制御方法を解説する。簡単に試せるようにWindowsに標準で含まれているWindows PowerShellから.NET Frameworkのオブジェクトを利用することにする。イベントハンドラーなど一部の構文を除けば、C#やC++などから.NET Frameworkのオブジェクトを扱うのと同じである。

.NET Frameworkを使うのは、シリアルポートの扱いがWin32APIよりも簡単になるからだ。SerialPortをオープンしてCTS信号の状態をループして調べるといった程度の使い方なら呼び出す関数/メソッド名が違う程度なのだが、CTS信号がオンになったときにイベントハンドラーを実行させるといった処理になると天と地ほど違う。.NET FrameworkならPowerShellのコマンドだけで記述できる。.NET Frameworkでは、SerialPortクラスを使ってCOMポートを制御する。

・SerialPort クラス (System.IO.Ports)
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport?view=netframework-4.8

まずは、COMポート番号を調べる。これは、前回と同じく、コントロールパネルのデバイスマネージャーを使ってもいいし、以下のWindows PowerShellコマンドでも行える。


Get-CimInstance Win32_PnPEntity | Where-Object -Property PNPClass -eq 'Ports' | Select-Object Name

COMポート番号が“COM6”だったとき、SerialPortオブジェクトを作ってフットスイッチの状態を調べるには、準備として以下のコマンドをWindows PowerShellで実行する。


$port=[System.IO.Ports.SerialPort]("COM6")
$port.Open()
$port.RtsEnable=$true

このあと、“$port.CtsHolding”を実行すれば、フットスイッチ(CTS信号)の状態を取得できる(写真01)。利用が終わったら、“$port.Close()”でオープンしたCOMポートをクローズしておく。COMポートは、プロセスごとの排他的な利用なので、利用が終わったらクローズしておく。

  • 写真01: SerialPortオブジェクトを作り、オープンしたら、RTSをオン(RtsEnable)しておく。CTSの状態をCtsHoldingで調べると、フットスイッチが踏まれている($true)かそうでないか($false)かを判定できる

一般に、ユーザーが行う操作は、いつ行われるかわからないので、こうした処理には「イベント」を使って、イベントハンドラーで処理を実行するのが定石である。Windows PowerShellで.NET Frameworkのイベントを処理するなら、以下のコマンドを実行する。


$PortEvent=Register-ObjectEvent -InputObject $port -EventName "PinChanged" -Action {if($Sender.CtsHolding) { Write-Host "$($Sender.PortName) CTS is $($Sender.CtsHolding)"}}

これでフットスイッチを踏むとコンソールに“COM6 CTS is True”といった表示が出るはずだ(写真02)。“-Action”オプションの波括弧の中を書き換えることで任意のコマンドを実行させることができる。なお、イベントとしては、CTSがTrueになったときとFalseになったときの両方が出ている。ただし、上記のコマンドでは、ifを使ってCTSがTrueのときのみメッセージを表示している。

  • 写真02: ポートをオープンしたあと、Register-ObjectEventでイベントを登録する。フットスイッチを踏んでCTS信号の状態が変化すると、イベントが発生し、“-Action”で指定したコマンドが実行される。終わったら、Unregister-Eventでイベント発生を止めておく

イベントを登録したら、使い終わるときに、登録を解除しておく。それには、以下のコマンドを実行する。


Unregister-Event -SubscriptionId $PortEvent.Id

ここでは、イベントの受信者ID(SubscriptionId)に、Register-ObjectEventしたときに保存したイベントオブジェクトからIdプロパティを使っているが、“Get-EventSubscriber”コマンドで調べることも可能だ。

今回のタイトルの元ネタは、前回と同じくWendy Carlosの“Switched-On Bach”(1968)である。Wendy Carlosといえば、 Stanley Kubrickの“A Clockwork Orange”(1971年。時計じかけのオレンジ)の音楽を担当し、ベートーベンの「第九」など、やはりクラシックをシンセサイザーで演奏していた。ちなみにファミコンディスクシステムのゲーム「謎の村雨城」(任天堂。1986)では、終盤にWendy Carlosをリスペクトしたかのような「第九」が流れる。