Imports System.IO
Imports VBforWalk

' シリアルポートを探しオープン（接続）する

Public Class FormSetupSerialPort
    Private FlagGetSerialPortNo As Boolean                  'ポート番号の取得状況
    Private PortNo As String                                '調査対象のポート番号格納変数
    Private Pnumber As Integer                              'ポート番号のスキャン用変数
    Private ProlificExist As Boolean                        'Prolific USB-to-Serial Comm Port 接続状況

    Private objWMIService As Object = GetObject("winmgmts:\\.\root\cimv2")
    Private objSerialSet As Object
    Private objSerial As Object

    'ウィンドウ表示直前の処理
    Private Sub FormSetupSerialPort_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        FlagGetSerialPortNo = False                         'ポート番号未取得
        FindComPortFromKey()                                'MPL2303SAが接続されているか確認
        CheckComPort()                                      'ポートオープンを試みる
        'ポート番号が取得できたら
        If (FlagGetSerialPortNo = True) And (ProlificExist = True) Then
            VBforWalk.FormVBforWalk.GetPort = True
            Me.Close()                                      'このウィンドウを閉じる
        End If
        LabelComment.BackColor = Color.LightYellow
        LabelComment.Text = "マイコンが動作していることと、　ＵＳＢケーブルの接続を確認し、接続ボタンを押してください！"
    End Sub

    '決定ボタンを押したとき
    Private Sub ButtonSet_Click(sender As Object, e As EventArgs) Handles ButtonSet.Click
        LabelComment.BackColor = SystemColors.Control       'Label背景を背景色に
        LabelComment.Text = "しばらくお待ちください"
        FindComPortFromKey()                                'MPL2303SAが接続されているか確認
        CheckComPort()                                      'ポートオープンを試みる
        'ポート番号が取得できたら
        If (FlagGetSerialPortNo = True) And (ProlificExist = True) Then
            VBforWalk.FormVBforWalk.GetPort = True
            Me.Close()                                      'このウィンドウを閉じる
        End If
        LabelComment.BackColor = Color.LightYellow          'Label背景を薄黄色に
        LabelComment.Text = "マイコンが動作していることと、　ＵＳＢケーブルの接続を確認し、接続ボタンを押してください！"
    End Sub

    'Prolific USB-to-Serial Comm Portが接続されていればCOM番号を取得する
    Public Sub FindComPortFromKey()
        Dim sposition As Integer                            'COM番号記述開始位置
        Dim eposition As Integer                            'COM番号記述終了位置+1
        Dim strComName As String                            'デバイス名(COM番号)

        'ﾌﾟﾗｸﾞｱﾝﾄﾞﾌﾟﾚｲかつCOMを含むdeviceのｵﾌﾞｼﾞｪｸﾄのｾｯﾄを取得
        objSerialSet = objWMIService.ExecQuery("Select * from Win32_PNPEntity " & "Where (Name Like '%(COM%)')")
        ProlificExist = False
        strComName = ""
        For Each objSerial In objSerialSet
            'device情報にProlificが含まれるか
            If (objSerial.Name.Contains("Prolific") = True) Then
                strComName = objSerial.Name                 'device名とCOM番号を取得
                ProlificExist = True
                Try                                         'COM番号の記載位置取得
                    sposition = InStr(strComName, "(COM")
                    eposition = InStr(sposition, strComName, ")")
                Catch ex As Exception                       'COM番号の記載位置取得失敗
                    ProlificExist = False                   'COM番号の取得失敗
                End Try
                If ProlificExist = True Then                'COM番号の取得成功
                    'COM番号の取得
                    PortNo = Mid(strComName, sposition + 1, eposition - sposition - 1)
                    Exit For
                End If
            End If
        Next
    End Sub

    'ポートオープンを試みる
    Public Sub CheckComPort()
        Try 'ポートを開く
            FlagGetSerialPortNo = True                      'ポート番号取得済に設定
            VBforWalk.FormVBforWalk.port.PortName = PortNo  'ポート番号を設定
            VBforWalk.FormVBforWalk.PortOpen()              'ポートを開く
        Catch ex As Exception                               'ポートが開けなかった場合
            FlagGetSerialPortNo = False                     'ポート番号未取得に戻す
        End Try
    End Sub

End Class