Namespace TCP.Frame
    ''' <summary>
    ''' Classe de base pour les trames nécéssitant un offset et une longueur
    ''' </summary>
    ''' <remarks></remarks>
    Friend MustInherit Class ClsFrameModbusOffsetLength

        Inherits ClsFrameModbusBase

#Region "Attributs privés"
        ''' <summary>
        ''' Offset de départ
        ''' </summary>
        ''' <remarks></remarks>
        Private mStart As UShort = 0
        ''' <summary>
        ''' Longueur des données à lire
        ''' </summary>
        ''' <remarks></remarks>
        Private mLength As Byte = 0
#End Region

#Region "Constructeurs"
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pTransId">numéro de la transaction</param>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pTransId As UShort, ByVal pSlaveId As Byte, ByVal pFunction As Byte)
            MyBase.New(pTransId, pSlaveId, pFunction)
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pTransId">numéro de la transaction</param>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <param name="pOffset">Offset de lecture</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pTransId As UShort, ByVal pSlaveId As Byte, ByVal pFunction As Byte, ByVal pOffset As UShort)
            MyClass.New(pTransId, pSlaveId, pFunction)
            mStart = pOffset
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pTransId">numéro de la transaction</param>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <param name="pOffset">Offset de lecture</param>
        ''' <param name="pLength">Longueur des données à lire</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pTransId As UShort, ByVal pSlaveId As Byte, ByVal pFunction As Byte, ByVal pOffset As UShort, ByVal pLength As Byte)
            MyClass.New(pTransId, pSlaveId, pFunction, pOffset)
            mLength = pLength
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pTransId">numéro de la transaction</param>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <param name="pLength">Longueur des données à lire</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pTransId As UShort, ByVal pSlaveId As Byte, ByVal pFunction As Byte, ByVal pLength As Byte)
            MyClass.New(pTransId, pSlaveId, pFunction)
            mLength = pLength
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pSlaveId As Byte, ByVal pFunction As Byte)
            MyBase.New(pSlaveId, pFunction)
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <param name="pOffset">Offset de lecture</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pSlaveId As Byte, ByVal pFunction As Byte, ByVal pOffset As UShort)
            MyClass.New(pSlaveId, pFunction)
            mStart = pOffset
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <param name="pOffset">Offset de lecture</param>
        ''' <param name="pLength">Longueur des données à lire</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pSlaveId As Byte, ByVal pFunction As Byte, ByVal pOffset As UShort, ByVal pLength As Byte)
            MyClass.New(pSlaveId, pFunction, pOffset)
            mLength = pLength
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pSlaveId">Numéro d'esclave</param>
        ''' <param name="pFunction">Numéro de fonction</param>
        ''' <param name="pLength">Longueur des données à lire</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pSlaveId As Byte, ByVal pFunction As Byte, ByVal pLength As Byte)
            MyClass.New(pSlaveId, pFunction)
            mLength = pLength
        End Sub
        ''' <summary>
        ''' Constructeur de la classe
        ''' </summary>
        ''' <param name="pFrame1">Trame reçue</param>
        ''' <param name="pFrame2">Trame reçue (copie)</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal pFrame1 As Byte(), ByVal pFrame2 As Byte())
            MyBase.New(pFrame1)
            If pFrame1.Length <> 4 Then
                Throw New LenErrorException(pFrame2)
            End If

            mStart = CUShort((CInt(pFrame1(0)) << 8) + pFrame1(1))
            If pFrame1(2) <> 0 Then
                Throw New IncorrectFrameException("Longueur de données à lire incorrect", pFrame2)
            End If
            mLength = pFrame1(3)
        End Sub
#End Region

        ''' <summary>
        ''' Retourne ou définit l'offset de lecture
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property Offset() As UShort
            Get
                Return mStart
            End Get
            Set(ByVal value As UShort)
                mStart = value
            End Set
        End Property
        ''' <summary>
        ''' Retourne ou définit la longueur des données à lire
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property Length() As Byte
            Get
                Return mLength
            End Get
            Set(ByVal value As Byte)
                mLength = value
            End Set
        End Property

        ''' <summary>
        ''' Retourne la trame
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Protected Overloads Overrides Function GetFrame() As Byte()
            Return MyBase.GetFrame(New Byte() {CByte((mStart And &HFF00) >> 8), CByte(mStart And &HFF), 0, mLength})
        End Function
    End Class
End Namespace