動機
ユーザーがGUIボタンをパネルの最下行に追加するクラス(BottomWidgets)がQuiskに準備されていることが、コードの精査から判明しました。このBottomWidgetsクラスをユーザー専用ファイル(widgets_***.py)に定義してConfig設定から読み込むことでGUIを拡張することができます。この方式の利点は、Quiskの基本コードとユーザー専用の拡張コードが混在しないことです。Quiskの基本コードを実装したquisk.pyに手を入れてしまうと、Quiskバージョンアップ時の対応が難しくなります。
そこで、RS-HFIQ専用の内蔵テスト機能をBottomWidgetsクラスに実装し直して、Config設定から読み込む方式に改めました。
BottomWidgetsクラス
ソフトウェアモジュール間の関係
モジュール間の関係を下記に示します。
インストールしたQuiskのアプリケーションAppクラス(quisk.py)に対して、BottomWidgetsクラス(widgets_rshfiq.py)、RS-HFIQ内蔵テスト用のcontrol_panelクラス(lib_rshfiq.py)、RS-HFIQのHardwareクラス(hardware_rshfiq.py)はユーザーが準備するモジュールです。
なお、DL1KSV局Volker Schroer OMが公開してくれているRS-HFIQ用ハードウェアファイルの名称は「hardware_usbserial.py」でしたが、改造を加えたため、元本と区別するために名称を「hardware_rshfiq.py」に変更しました。ファイル名の接尾語としてハードウェアの名称(rehfiq)を付ける一貫性保持のため、RS-HFIQ内蔵テスト機能制御パネルを実装したファイルの名称を「lib_rshfiq.py」に変えました。BottomWidgetsクラスを実装したファイル名は「widgets_rshfiq.py」です。
Quiskのインストールディレクトリの下に「rshfiq」ディレクトリを作り、これらのファイルを格納しました。QuiskをRaspberry Pi等にインストールした場合も、「rshfiq」ディレクトリを複写するだけで対応できるようになる予定です。(シリアルポート名の変更は必要。)
BottomWidgetsクラスのインスタンス化コードの調査
quisk.pyのアプリケーションクラス(App)の初期化関数(OnInit)の中で、BottomWidgetsクラスのインスタンス化を行っている箇所を下記に示します。ここで追加ボタンを実体化する準備がされているため、ユーザーは必要に応じてBottomWidgetsクラスを実装するだけで済みます。
elif conf.quisk_widgets: self.bottom_widgets = conf.quisk_widgets.BottomWidgets(self, Hardware, conf, frame, gbs, vertBox) if self.bottom_widgets: # Extend the sliders to the bottom of the screen try: i = self.bottom_widgets.num_rows_added # No way to get total rows until ver 2.9 !! except: i = 1 rows = self.widget_row + i for i in self.slider_columns: item = gbs.FindItemAtPosition((0, i)) item.SetSpan((rows, 1))
なお、ボタンを追加した後に、ボタンパネルの行数を取得してスライダの長さを決めていることが分かります。これにより、ボリュームスライダ等の長さがボタンパネルの高さの変化に追従して伸長することができます。
BottomWidgetsクラスへの追加ボタンの実装
追加したRS-HFIQ内蔵テスト機能起動ボタン(RSHFIQ)の実装例を下記に示します。BottomWidgetsクラスのコンストラクタ(__init__)がhardwareインスタンスを引数に取るため、アプリケーションクラスでインスタンス化したRS-HFIQのhardwareクラスをRS-HFIQ内蔵テスト機能制御パネル(lib_rshfiq.control_panel)に引き渡し、RS-HFIQのSI5351Aを制御することができます。
# This module is used to add extra widgets to the QUISK screen. from __future__ import print_function from __future__ import absolute_import from __future__ import division import wx, time import _quisk as QS from rshfiq import lib_rshfiq ## added for RS-HFIQ control panel class BottomWidgets: # Add extra widgets to the bottom of the screen def __init__(self, app, hardware, conf, frame, gbs, vertBox): self.config = conf self.hardware = hardware self.application = app self.correct_screen = None self.num_rows_added = 1 start_row = app.widget_row # The first available row start_col = app.button_start_col # The start of the button columns ## A plain push button widget to open RS-HFIQ control panel. b = app.QuiskPushbutton(frame, self.OnBtnRSHFIQ, text='RSHFIQ') gbs.Add(b, (start_row, start_col), flag=wx.EXPAND) ## callback function of the added button to open RS-HFIQ control panel. def OnBtnRSHFIQ(self, event): print('OnBtnRSHFIQ() called back with event', event) lib_rshfiq.control_panel(self.hardware)
Config設定
ユーザー専用ファイルの設定パネルを下記に示します。
手順は下記の通りです。
- *RS-HFIQ*タグを開く。
- Hardwareタグを開く。
- RS-HFIQハードウェアファイルのパスを設定する。
- 追加ボタン定義ファイルのパスを設定する。
- Quiskを再立ち上げすると、「RSHFIQ」ボタンが出現します。
- この時、スライダの長さはボタンパネル高さと一致するように伸長します。
RS-HFIQ内蔵テスト機能の実行
実装方法を変えたRS-HFIQ内蔵テスト機能の動作検証を行いました。
上側がLO=7.020MHzに対して1kHzアップの7.021MHzのBIT信号をUSB側に注入した場合、下側が1kHzダウンの7.019MHzのBIT信号をLSB側に注入した場合を示します。
LSB側の信号がUSB側に漏れたイメージの方が若干大きいことがテストで再現できています。この結果はHDSDRによる測定結果と一致します。