FT8 コールサイン表示ツール Twitter フォロワーさん表示機能

投稿者: | 2021-12-25
abstract business code coder

各局皆様、こんにちは。アマチュア無線局、JS2IIUです。

前回作成した、FT8コールサイン表示ツール(過去記事参照:FT8 コールサイン表示ツール)に、Twitterのフォロワーさんかどうか、がわかる機能を入れたいと思います。フォロワーさんのコールサインを書き込んだCSVファイルを用意したので、それを読み込んで、交信中の局のコールサインと照合するようなアプリに改造したので、手順を残します。

  • 前提
    • 過去記事の続きです(FT8 コールサイン表示ツール
    • Visual Studio 2022
    • Visual BasicでWPFアプリ
    • FT8にはJTDXを使っています。JTDXが動いているのと同じパソコンで動作させます。

なお、JS2IIUのTwitterはこちら(@Js2Iiu)を参照してください。アマチュア無線の局長様各位のフォローをお待ちしております。

目次

アプリのイメージ

Twitterフォロワーさんでない局との交信の場合はこちらのような表示。(以前のアプリと見た目変わりません)残念ながら8J1RL局はJS2IIUのフォロワーさんではありません。コールサインの文字色は黒です。

フォロワーさんと交信している場合には、こちらのようにフォント色が赤に変わります。またWindowsのシステムサウンドが再生されるようにしています。

CSVファイルのイメージ

CSVファイルには一行に一つのコールサインが書かれています。こんな感じです。2エリアのレピータリストからコールサインを引用させていただきました。

JS2IIU
JP2YFT
JP2YFV
JP2YFX
JP2TGS
つづく・・・

CSVファイルを読み込み配列に格納する

CSVファイルの読み込みはStreamReaderで行います。Microsoftのドキュメントページにサンプルコード付きで説明されています。CSVファイルには一行に一つのコールサインが書かれているので、StreamReader.ReadLine メソッドで一行ずつ読み込みしています。

readCSVtoArrayという関数を定義して、CSVファイルのフルパスを引数で渡しています。また、格納する配列CallArray()は関数の外でPublicで宣言することにしました。(もっとスマートなやりかたがありそうですが・・・)

細かいところですが、今回CSVファイルはMicrosoft Excelで作成したのでエンコーディングがUTF-8でした。最初Shift-JISにしていたため気づくまで少々てこずりました。

Public CallArray() As String
    Private Sub readCSVtoArray(ByVal strFilePath As String)
        Dim ExtentionName As String
        Dim numCallsign As Integer = 0

        Try
            ExtentionName = Path.GetExtension(strFilePath)

            If ExtentionName = ".csv" Then
                Using sr As New StreamReader(strFilePath, Encoding.GetEncoding("UTF-8"))

                    Do While (sr.Peek() > -1)
                        CallArray(numCallsign) = sr.ReadLine()
                        numCallsign += 1
                    Loop

                    sr.Close()

                End Using
            End If

        Catch ex As IO.FileNotFoundException
            'File not found exception
        Catch ex As Exception
            ' do something here
        End Try

    End Sub

配列を検索して存在チェックする

フォロワーさんのコールサインが配列に無事格納できました。配列を検索して、特定のキーワードが存在しているかどうかをチェックするにはArray.IndexOfメソッドを使いました。Microsoftのドキュメントに詳しく説明があります。

Array.IndexOf メソッド
定義
名前空間: System
アセンブリ: System.Runtime.dll
指定されたオブジェクトを 1 次元の配列または配列の要素範囲内で検索し、最初に見つかったオブジェクトのインデックスを返します。

https://docs.microsoft.com/ja-jp/dotnet/api/system.array.indexof?view=net-6.0

一致する要素が見つからなければ、Array.IndexOf(CallArray, strCBText) = -1となります。

If Array.IndexOf(CallArray, strCBText) = -1 Then
    'テキストブロックの書式変更を戻す
    CB_TextBlock.Foreground = New SolidColorBrush(Colors.Black)
Else
    'テキストブロックの書式を変更する(リストにコールサインある場合)
    CB_TextBlock.Foreground = New SolidColorBrush(Colors.Red)
End If

TextBlockの文字色を変更する

TextBlockの文字色はTextblock.Foregroundプロパティで指定できます。こちらもMickrosoftのドキュメントを参照してください。 Textblock.Foregroundプロパティ はBrushオブジェクトなので、SolidColorBrush()で色を指定します。

TextBlock.Foreground Property
Definition
Namespace: System.Windows.Controls
Assembly: PresentationFramework.dll
Gets or sets the Brush to apply to the text contents of the TextBlock.

Public Property Foreground As Brush

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.textblock.foreground?view=windowsdesktop-6.0
TextBlock.Foreground = New SolidColorBrush(Colors.Red)

フォロワーさん配列を検索して、コールサインが見つかった時には赤色、そうでなければ黒色の文字色です。細かいところですが、フォロワーさん以外だった場合に文字色を黒に戻すのを忘れないように・・・

システムサウンドを再生する

システムサウンドはSystem.Media.SystemSounds.Asterisk.Play()で再生できます。Asteriskのところを変えると別のシステムサウンドが再生できます。

System.Media.SystemSounds.Asterisk.Play()

ソースコード

ソースコード全体です。冗長なところが多々ありますが、ご容赦願います。

'タイマー処理
Imports System.ComponentModel
Imports System.Windows.Threading
Imports System.IO
Imports System.Text


Class MainWindow

    Public Const CALL_MAX_LEN As Integer = 9
    Public Const STR_NOT_CALL As String = "STBY"
    Public Const MAX_CALL_ARRAY As Integer = 450
    Public Const CALL_CSV_FNAME As String = "(ここにCSVファイルのフルパス)JS2IIU_FOLLOWER.csv"

    Public CallArray() As String
    Public strMemCall As String = ""


    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        SetupTimer()


        ReDim CallArray(MAX_CALL_ARRAY)
        ' コールサインの読み出し -> CallArray()に読み込む
        readCSVtoArray(CALL_CSV_FNAME)

    End Sub

    Private Sub WatchButton_Click(sender As Object, e As RoutedEventArgs) Handles WatchButton.Click
        Dim strCBText As String
        If Clipboard.ContainsText() Then
            If Clipboard.GetText.Length < CALL_MAX_LEN Then
                strCBText = Clipboard.GetText()
                Me.CB_TextBlock.Text = strCBText
                'フォロワーリストとの照合
                If Array.IndexOf(CallArray, strCBText) = -1 Then
                    'テキストブロックの書式変更を戻す
                    CB_TextBlock.Foreground = New SolidColorBrush(Colors.Black)
                Else
                    'テキストブロックの書式を変更する(リストにコールサインある場合)
                    CB_TextBlock.Foreground = New SolidColorBrush(Colors.Red)
                End If
            Else
                Me.CB_TextBlock.Text = STR_NOT_CALL
            End If
        End If

    End Sub

    'タイマメソッド
    Private Sub MyTimerMethod(sender As Object, e As EventArgs)
        'Me.CB_TextBlock.Text = DateTime.Now.ToString("HH:mm:ss")
        Dim strCBText As String
        Dim flgSound As Boolean = False


        If Clipboard.ContainsText() Then
            If Clipboard.GetText.Length < CALL_MAX_LEN Then
                strCBText = Clipboard.GetText()
                Me.CB_TextBlock.Text = strCBText

                'システム音再生(コールサインが新しくなった時だけ再生させる)
                If strMemCall = strCBText Then
                    '音を鳴らさない
                    flgSound = False
                Else
                    strMemCall = strCBText
                    'システム音再生フラグ
                    flgSound = True
                End If

                'フォロワーリストとの照合
                If Array.IndexOf(CallArray, strCBText) = -1 Then
                    'テキストブロックの書式変更を戻す
                    CB_TextBlock.Foreground = New SolidColorBrush(Colors.Black)
                Else
                    'テキストブロックの書式を変更する(リストにコールサインある場合)
                    CB_TextBlock.Foreground = New SolidColorBrush(Colors.Red)
                    ' クリップボード読み込みのたびに音が鳴らないようにする
                    If flgSound = True Then
                        System.Media.SystemSounds.Asterisk.Play()
                        ' System.Media.SystemSounds.Beep.Play()
                        flgSound = False
                    End If
                End If
            Else
                Me.CB_TextBlock.Text = STR_NOT_CALL
            End If
        End If
    End Sub

    'タイマのインスタンス
    Private _timer As DispatcherTimer

    'タイマの設定
    Private Sub SetupTimer()
        'タイマのインスタンス生成
        _timer = New DispatcherTimer()
        'interval 1sec
        _timer.Interval = New TimeSpan(0, 0, 1)
        'タイマメソッド
        AddHandler _timer.Tick, New EventHandler(AddressOf MyTimerMethod)
        'タイマを開始
        _timer.Start()


        '画面閉じられるときに、タイマを停止する
        AddHandler Me.Closing, New CancelEventHandler(AddressOf StopTimer)

    End Sub

    Private Sub StopTimer(sender As Object, e As CancelEventArgs)
        _timer.Stop()
    End Sub

    'CSV読み込み
    ' strFilePath = (String)csvファイルのパス
    ' 
    Private Sub readCSVtoArray(ByVal strFilePath As String)
        ' Dim FSO As Object
        ' FSO = CreateObject("Scripting.FileSystemObject")

        Dim ExtentionName As String
        Dim numCallsign As Integer = 0

        Try
            ExtentionName = Path.GetExtension(strFilePath)

            If ExtentionName = ".csv" Then
                Using sr As New StreamReader(strFilePath, Encoding.GetEncoding("UTF-8"))

                    Do While (sr.Peek() > -1)
                        CallArray(numCallsign) = sr.ReadLine()
                        numCallsign += 1
                    Loop

                    sr.Close()

                End Using
            End If

        Catch ex As IO.FileNotFoundException
            'File not found exception
        Catch ex As Exception
            ' do something here
        End Try

    End Sub

    Private Sub CloseButton_Click(sender As Object, e As RoutedEventArgs) Handles CloseButton.Click
        Me.Close()
    End Sub
End Class

参考

最後まで読んでいただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です