2章:ToCoStick(トコスティック)Windowsアプリ理解のための基礎知識

    作成2014.08.04

     ToCoStick(トコスティック)WindowsアプリはVisualBasicで作成されていますが、高度のテクニックを使用しているため、 これを理解するための予習が必要です。

  1. ToCoStick(トコスティック)Windowsアプリ
     http://tocos-wireless.com/jp/products/TWE-Lite-USB/windows.html
    Windows端末で使用するでダウンロードできます。


  2. VisualBasic のソース概説
    (1)clsComPort.cls
    COMポートの取り扱いをまとめたクラス群。
    COMポートのオープン、クローズ
    FTDI チップの認識 (ToCoStick, TWE-Lite-R の場合は自動接続とリセットの実行)
    COMポートからのデータを読み取り ITweDataPresentation 型のオブジェクトを生成

    (2)clsDataPresetation.cls
    ITweDataPresentation: データの表現形式の基底クラス
    clsDataPresentationAscii: modbus アスキー形式を模した表現
    例「:7880123456...[CheckSum][CR][LF]」

    (3)clsDataFormat.cls
    ITweDataFormat: データ形式の基底クラス
    clsDataFormatSimple: 単純な形式「1バイトアドレス+1バイトコマンド+ペイロード」

    (4)clsDataPayload.cls
    ITweDataPayload: ペイロードの形式の基底クラス
    clsDataPayloadIO_0x80: 0x80 コマンドのペイロード (IO設定を要求するとき)
    clsDataPayloadIO_0x81: 0x81 コマンドのペイロード (IO状態を受信したとき)

    (5)MDataGenerator.vb
    各種ジェネレータ(生成)関数
    genDataPayload: ITweDataPayloadのジェネレータ
    genDataFormat: ITweDataFormatのジェネレータ
    genDataPresentation: ITweDataPresentationのジェネレータ

    (6)modFtdiD2xx.vb
    FTDI の取り扱い用の定義など

    (7)frmMain.vb
    メインウインドウの定義
    frmMain_Load:始動・初期化時の関数
    cmbComPort_SelectedIndexChanged:COMポートの選択時に呼び出される。COMポートのオープン、またはクローズを行う
    btnResetLiteR_Click:ToCoStick をリセットするための処理
    serObject_DataComplete:シリアルポートの読み出しが1書式分終了した時に呼び出される。Delegate にデータをゆだねる。
    serObject_Err:シリアルポート関連のエラー
    ※ MsgBox は問題があるかもしれない。
    handleDelegData:COMポートからの受信完了時に呼び出される処理関数(delegate の仕組みを利用)。
    updateWithComingData:データ入力時の主要処理。リストボックスの先頭に項目を挿入し、先頭を選択状態にする(暗黙に lstIncomingData_SelectedIndexChanged が呼び出される)
    lstIncomingData_SelectedIndexChanged:シリアルポートから受信した各データが格納されるリストボックスで、リスト中の要素が選択された時に実行される。ボタンの状態などを解釈し、受信データ表示部のGUIコンポーネントに反映する。データは ITweDataPresentation 型のオブジェクトで、リストボックスへの表示は Object 基底型のToString メソッドオーバーライドによる。
    updateIOCmd:IO設定要求を送信する設定GUIコンポーネントの値が変更されたときに、ITweDataPresentation型のオブジェクトを生成し、かつ生成したコマンド表現をテキストボックスに表示する。
    btnIoTx_Click:IO設定要求をシリアルポートに送信する。

    *受信するとclsComPort.clsのserPort_DataReceivedが実行されます。
    *frmMain.vbのbtnIoTx_Clickで送信が実行されます。
    *内容を理解して利用することが重要です!!


  3. 学習サンプルプログラムのダウンロード
     まずは下記の「40-2.zip」ファイルをダウンロードしてください。
    [40-2.zip]をダウンロードする。

    解凍するとフォルダー内にWindowsApplicationフォルダーがあります。WindowsApplicationフォルダー内に

    (1)WindowsApplication1フォルダー
    http://msdn.microsoft.com/ja-jp/library/cd43d244.aspx *チュートリアル: インターフェイスの作成と実装 (Visual Basic)サンプルプログラムです。

    (2)WindowsApplication2フォルダー
    http://code.msdn.microsoft.com/windowsapps/20-Delegate-ff228d6e *連載! とことん VB: 第 20 回 デリゲート (Delegate) の基本とジェネリック デリゲートサンプルプログラム1です。
    (2)WindowsApplication3フォルダー
    http://code.msdn.microsoft.com/windowsapps/20-Delegate-ff228d6e *連載! とことん VB: 第 20 回 デリゲート (Delegate) の基本とジェネリック デリゲートサンプルプログラム2です。



  4. チュートリアル: インターフェイスの作成と実装 (Visual Basic)
     ToCoStick(トコスティック)Windowsアプリはインターフェイスを使用しており、インターフェイスについての学習が必要です。詳細の説明は下記アドレスで確認できます。
    http://msdn.microsoft.com/ja-jp/library/cd43d244.aspx

    4.1 インターフェイスのコード
    Public Class Form1
        Dim WithEvents testInstance As TestInterface
    
        ''testInstance.Event1発生時に実行される!!
        Sub EventHandler() Handles testInstance.Event1
            MsgBox("The event handler caught the event.")
        End Sub
    
        Sub Test()
            '  Create an instance of the class.
            Dim T As New ImplementationClass
            ' Assign the class instance to the interface.
            ' Calls to the interface members are 
            ' executed through the class instance.
            testInstance = T
            ' Set a property.
            testInstance.Prop1 = 9
            ' Read the property.
            MsgBox("Prop1 was set to " & testInstance.Prop1)
            '  Test the method and raise an event.
            testInstance.Method1(5) ''testInstance.Method1を実行!!
        End Sub
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Test() ' Test the class.
        End Sub
    End Class
    
    
    Module Module1
        Interface TestInterface
            Property Prop1() As Integer
            Sub Method1(ByVal X As Integer)
            Event Event1()
        End Interface
    
        Class ImplementationClass
            Implements TestInterface
    
            Public Event Event1() Implements TestInterface.Event1
    
            Public Sub Method1(X As Integer) Implements TestInterface.Method1
                MsgBox("The X parameter for Method1 is " & X)
                RaiseEvent Event1() ''Event1()を発生!!
    
            End Sub
    
            ' Holds the value of the property.
            Private pval As Integer
            Public Property Prop1 As Integer Implements TestInterface.Prop1
                Get
                    Return pval
    
                End Get
                Set(value As Integer)
                    pval = value
                End Set
            End Property
        End Class
    
    End Module
    

    4.2 動作
    (1) Form1_LoadでTest()が実行
    (2)変数Tを ImplementationClassで生成
    (3)testInstance に Tを設定
    (4)testInstance.Prop1 に 9を設定
    (5)MsgBoxが”Prop1 was set to 9”を表示
    (6)「OK」ボタンで testInstance.Method1(5)が実行
    (7)MsgBoxが”The X parameter for Method1 is 5”を表示
    (8)Event1()を発生
    (9)MsgBoxが”The event handler caught the event.”を表示
    *かなり複雑な動作となります。
    *Event1()を発生し、Sub EventHandler() Handles testInstance.Event1を実行します。
    *なぜ?こうなるか?じっくり考える必要があります。うーん!!難しい!!


  5. 連載! とことん VB: 第 20 回 デリゲート (Delegate) の基本とジェネリック デリゲート
     ToCoStick(トコスティック)Windowsアプリはデリゲート (Delegate)を使用しており、デリゲート (Delegate)についての学習が必要です。詳細の説明は下記アドレスで確認できます。
    http://code.msdn.microsoft.com/windowsapps/20-Delegate-ff228d6e

    5.1 デリゲート (Delegate)を使用しない場合のコード
    Public Class Form1
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim snd As New Sender() '←[1]
            snd.Target = Me '←[2]
            snd.TestAction() '←[3]
        End Sub
    
        Public Function Notified(ByVal msg As String) As Boolean '←[4]
            MessageBox.Show(msg)
            Return True
        End Function
    End Class
    
    Public Class Sender '←[5]
    
        Public Target As Form1 '←[6]
    
        Public Sub TestAction() '←[7]
            Dim result As Boolean
            result = Target.Notified("Notified by Method Name") '←[8]
            MessageBox.Show(result)
        End Sub
    
    End Class
    

    5.2 デリゲート (Delegate)を使用しない場合の動作
    (1)Button1_Clickが実行
    (2)変数sndがSender型で生成
    (3)snd.TargetにMeを代入
    (4)snd.TestAction()が実行
    (5)変数resultをBoolean型で生成
    (6)Public Function Notified(ByVal msg As String) As Booleanを実行
    (7)MessageBoxに"Notified by Method Name"を表示
    (8)結果をresultに代入
    (9)MessageBoxに"True"を表示

    5.3 コードの単純化単純化
     コードを単純化すると
    Public Class Form1
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim snd As New Sender() '←[1]
            snd.TestAction() '←[3]
        End Sub
    
        Public Function Notified(ByVal msg As String) As Boolean '←[4]
            MessageBox.Show(msg)
            Return True
        End Function
    End Class
    
    Public Class Sender '←[5]
        Public Sub TestAction() '←[7]
            Dim result As Boolean
            result = Form1.Notified("Notified by Method Name") '←[8]
            MessageBox.Show(result)
        End Sub
    End Class
    
     さらに単純化すると
    Public Class Form1
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim result As Boolean
            result = Notified("Notified by Method Name") '←[8]
            MessageBox.Show(result)
        End Sub
    
        Public Function Notified(ByVal msg As String) As Boolean '←[4]
            MessageBox.Show(msg)
            Return True
        End Function
    End Class
    
    *ここまで単純化するとプログラムの流れの理解が容易となります。

    5.4 デリゲート (Delegate)を使用した場合のコード
    Public Delegate Function Func1(ByVal msg As String) As Boolean '←[1]
    
    Public Class Form1
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim snd As New Sender()
            snd.Notify = New Func1(AddressOf Me.Notified) ' ←[2]
            snd.TestAction()
        End Sub
    
        Public Function Notified(ByVal msg As String) As Boolean
            MessageBox.Show(msg)
            Return True
        End Function
    End Class
    
    Public Class Sender '←[3]
    
        Public Notify As Func1 '←[4]
    
        Public Sub TestAction()
            Dim result As Boolean
            result = Notify("Notify by Delegate") '←[5] デリゲートによる呼び出し
            MessageBox.Show(result)
        End Sub
    End Class
    

    5.3 デリゲート (Delegate)を使用した場合の動作
    (1)Button1_Clickが実行
    (2)変数sndがSender型で生成
    (3)変数snd.Notifyを Func1(AddressOf Me.Notified)型で生成
    (4)snd.TestAction()を実行
    (5)変数resultをBoolean型で生成
    (6)MessageBoxに"Notified by Method Name"を表示
    (7)結果をresultに代入
    (8)MessageBoxに"True"を表示
    *ToCoStick(トコスティック)Windowsアプリで多用しています。
    *難解ですがToCoStick(トコスティック)Windowsアプリを理解するには必須です。


  6. 結果の検討
    (1)I2Cデバイスにアクセスするには、それに対応したWindowsアプリの作成が必要となります。
    (2)ゼロからI2Cデバイスに対応したWindowsアプリの作成はけっして容易な作業ではありません。
    (3)従って、ToCoStick(トコスティック)Windowsアプリをベースに修正するのが効率的です。
    (4)ToCoStick(トコスティック)Windowsアプリを自由に修正するには、このプログラムの構造を理解する必要があります。
    (5)ToCoStick(トコスティック)Windowsアプリは「インターフェイス」、「デリゲート (Delegate)」等の高等テクニックを多用しているため、これらのテクニックを理解する必要があります。




3章:無線マイコンTWE-Lite DIPのアナログ入力と消費電力の特性評価に行く。

トップページに戻る。