Format Parser

TWELITE PAL の親機出力形式を解釈するコードです。

TWELITE PAL 親機の書式フォーマット (ASCII形式のみ) を解釈しています。多くはその定義に従います。

Version 1.0 では書式フォーマットの解釈を VB.NET にて実装していましたが、v1.2 では C# による実装となりました。

当アプリのビルドでは PAL_PARSER プロジェクト(ターゲットフレームワーク .NET Framework 4, クラスライブラリ)が該当し、VB.NET 側の PAL_VIEWER プロジェクトから参照関係になっています。

本書では VB からの呼び出し例として記載します。

関連ソースファイル

以下のソースコードにより PAL 親機より出力されるデータを解釈します。

読み出し方法

TWELITE PAL Viewer では、SerialPort1.DataRecievedイベントを起点として、書式の解釈が行われます。

以下のコード例では、CSnsDataクラスにデータをコピーしています。

    ' event handler when got data from serial port
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim strDataReceived As String
        Dim bFlag As Boolean = True

        While SerialPort1.BytesToRead > 0
            Try
                strDataReceived = SerialPort1.ReadLine
            Catch ex As Exception
                strDataReceived = ex.Message
                bFlag = False
            End Try

            If bFlag Then
                Try
                    '' PAL 標準フォーマットを解釈する
                    Dim b() As Byte = System.Text.Encoding.ASCII.GetBytes(strDataReceived)
                    Dim dataArrival = PAL_Utils.genDataPresentation(b)

                    Dim dataFmt As ClsDataFormatPalApp = dataArrival.objFormat 'データ形式、無線ノードの情報
                    Dim dataPay As ClsDataPayloadPalSensors = dataFmt.objPayload '各種センサー情報

                    '' CSnsData 形式に変換
                    Dim snsdt As CSnsData = New CSnsData
                    snsdt.bStored = True
                    ' LQI
                    snsdt.iLQI = dataFmt.BLQI : snsdt.bLQI = True
                    ' 続き番号
                    snsdt.iSeq = dataFmt.UsDataSer
                    ' 名前ラベル
                    Dim iPalPcb_CD As UInteger = (dataFmt.BPalPcb And &HF)
                    Dim sPalPcb_Name As String
                    Select Case iPalPcb_CD
                        Case 0
                            sPalPcb_Name = "nc"
                        Case 1
                            sPalPcb_Name = "OnC"
                        Case 2
                            sPalPcb_Name = "AMB"
                        Case Else
                            sPalPcb_Name = "UNK"
                    End Select
                    snsdt.sID = sPalPcb_Name + dataFmt.BSrcAddr.ToString("_00")
                    ' 電圧
                    Dim l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.VOLT)
                    For Each m In l
                        If m.Ex = ClsDataPalSenseElement.E_EXCD_VOLT.POWER Then
                            snsdt.iVolt = l(0).Data(0) : snsdt.bVolt = True
                        End If
                    Next
                    ' OpnCls状態
                    l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.HALL)
                    If l.Count > 0 Then
                        snsdt.iPC = (l(0).Data(0) And &H7F) : snsdt.bPC = True
                    End If

                    ' TEMP
                    l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.TEMP)
                    If l.Count > 0 Then
                        Try
                            snsdt.fTemp = CSng(l(0).Data(0)) / 100.0
                            snsdt.bTemp = True
                        Catch ex As Exception
                            snsdt.bTemp = False
                        End Try
                    End If

                    ' HUMD
                    l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.HUMD)
                    If l.Count > 0 Then
                        Try
                            snsdt.fHumid = CSng(l(0).Data(0)) / 100.0
                            snsdt.bHumid = True
                        Catch ex As Exception
                            snsdt.bHumid = False
                        End Try
                    End If

                    ' LIGHT
                    l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.LUMI)
                    If l.Count > 0 Then
                        Try
                            snsdt.iLight = CInt(l(0).Data(0))
                            snsdt.bLight = True
                        Catch ex As Exception
                            snsdt.bHumid = False
                        End Try
                    End If

                    ' データ
                    snsObjs.AddEntryTemporary(snsdt, thetime)
                    snsObjsLong.AddEntryTemporary(snsdt, thetime)
                    SaveRawLog(snsdt)

                Catch ex As Exception
                    bFlag = False
                End Try


            End If

        End While

    End Sub

まず、解釈のために文字列をバイト列に変換して、genDataPresentation() により、データ解釈を行います。実行後、解釈済みのClsDataPresentationAsciiオブジェクトが生成されます。

Dim b() As Byte = System.Text.Encoding.ASCII.GetBytes(strDataReceived)
Dim dataArrival = PAL_Utils.genDataPresentation(b)

続いて、データ書式、センサー情報を取り出します。dataFmt はデータ書式で、アドレス情報などを得ることができます。dataPayはセンサー情報で複数のセンサーの情報をひとまとめにしています。

Dim dataFmt As ClsDataFormatPalApp = dataArrival.objFormat 'データ形式、無線ノードの情報
Dim dataPay As ClsDataPayloadPalSensors = dataFmt.objPayload '各種センサー情報

データ書式(ClsDataFormatPalApp)で得られる情報を列挙します。

次にセンサーの情報を得ます。dataPay.SensoerCode() により、センサーの種別を指定して情報を得ることができます。戻り型はList(Of ClsDataPalSenseElement)で、0個以上の要素が格納されます(Nothingにはならない)。ここでは電圧関連(ClsDataPalSenseElement.E_SNSCD.VOLT)のリストを探索します。

Dim l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.VOLT)

ここでは、電源電圧(ClsDataPalSenseElement.E_EXCD_VOLT.POWER)の情報が欲しいので、リストの中にあるか探索します。

For Each m In l
    If m.Ex = ClsDataPalSenseElement.E_EXCD_VOLT.POWER Then
        snsdt.iVolt = m.Data(0) : snsdt.bVolt = True
    End If
Next

ClsDataPalSenseElement クラス

このクラスは、各センサーの単一のデータを表現します。以下にデータの取り出しのためのプロパテを列挙します。

センサーの種別を調べるための列挙型ClsDataPalSenseElement.E_SNDCDの定義は以下です。

電圧センサーの種別を特定するための列挙型ClsDataPalSenseElement.E_EXCD_VOLTは以下です。

最終更新