This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit b2d4a1c93b049ad18f8484ff9e621972255b5278
Author: Sebastian Rühl <[email protected]>
AuthorDate: Wed Aug 21 22:41:18 2024 +0200

    feat(plc4go/bacnet): NetworkNumberIs
---
 plc4go/internal/bacnetip/npdu.go                   | 89 +++++++++++++++++++++-
 .../bacnetip/tests/test_npdu/test_codec_test.go    | 32 ++++++++
 2 files changed, 117 insertions(+), 4 deletions(-)

diff --git a/plc4go/internal/bacnetip/npdu.go b/plc4go/internal/bacnetip/npdu.go
index 0423bb58f4..d970b4a644 100644
--- a/plc4go/internal/bacnetip/npdu.go
+++ b/plc4go/internal/bacnetip/npdu.go
@@ -1197,10 +1197,91 @@ func (n *WhatIsNetworkNumber) String() string {
 
 type NetworkNumberIs struct {
        *_NPDU
+       nniNet  uint16
+       nniFlag bool
+
+       readWriteModel.NLMNetworkNumberIs
+}
+
+func NewNetworkNumberIs(opts ...func(*NetworkNumberIs)) (*NetworkNumberIs, 
error) {
+       i := &NetworkNumberIs{}
+       for _, opt := range opts {
+               opt(i)
+       }
+       i.NLMNetworkNumberIs = readWriteModel.NewNLMNetworkNumberIs(i.nniNet, 
i.nniFlag, 0)
+       npdu, err := NewNPDU(i.NLMNetworkNumberIs, nil)
+       if err != nil {
+               return nil, errors.Wrap(err, "error creating NPDU")
+       }
+       i._NPDU = npdu.(*_NPDU)
+       return i, nil
+}
+
+func WithNetworkNumberIsNET(net uint16) func(*NetworkNumberIs) {
+       return func(n *NetworkNumberIs) {
+               n.nniNet = net
+       }
+}
+
+func WithNetworkNumberIsTerminationConfigured(configured bool) 
func(*NetworkNumberIs) {
+       return func(n *NetworkNumberIs) {
+               n.nniFlag = configured
+       }
+}
+
+func (n *NetworkNumberIs) GetNniNet() uint16 {
+       return n.nniNet
+}
+
+func (n *NetworkNumberIs) GetNniFlag() bool {
+       return n.nniFlag
+}
+
+func (n *NetworkNumberIs) Encode(npdu Arg) error {
+       switch npdu := npdu.(type) {
+       case NPDU:
+               if err := npdu.Update(n); err != nil {
+                       return errors.Wrap(err, "error updating _NPCI")
+               }
+               npdu.PutShort(int16(n.nniNet))
+               flag := uint8(0)
+               if n.nniFlag {
+                       flag = 1
+               }
+               npdu.Put(flag)
+               npdu.setNPDU(n.npdu)
+               npdu.setNLM(n.nlm)
+               npdu.setAPDU(n.apdu)
+               return nil
+       default:
+               return errors.Errorf("invalid NPDU type %T", npdu)
+       }
 }
 
-func NewNetworkNumberIs() (*NetworkNumberIs, error) {
-       panic("implement me")
+func (n *NetworkNumberIs) Decode(npdu Arg) error {
+       switch npdu := npdu.(type) {
+       case NPDU:
+               if err := n.Update(npdu); err != nil {
+                       return errors.Wrap(err, "error updating _NPCI")
+               }
+               switch pduUserData := npdu.GetPDUUserData().(type) {
+               case readWriteModel.NPDUExactly:
+                       switch nlm := pduUserData.GetNlm().(type) {
+                       case readWriteModel.NLMNetworkNumberIsExactly:
+                               n.setNLM(nlm)
+                               n.NLMNetworkNumberIs = nlm
+                               n.nniNet = nlm.GetNetworkNumber()
+                               n.nniFlag = nlm.GetNetworkNumberConfigured()
+                       }
+               }
+               return nil
+       default:
+               return errors.Errorf("invalid NPDU type %T", npdu)
+       }
+}
+
+func (n *NetworkNumberIs) String() string {
+       return fmt.Sprintf("NetworkNumberIs{%s, nniNet: %v, nniFlag: %v}", 
n._NPDU, n.nniNet, n.nniFlag)
 }
 
 func init() {
@@ -1218,7 +1299,7 @@ func init() {
                        return v
                },
                0x03: func() interface{ Decode(Arg) error } {
-                       v, _ := NewRejectMessageToNetwork() // TODO: should be 
NewRejectMessageToNetwork
+                       v, _ := NewRejectMessageToNetwork()
                        return v
                },
                0x04: func() interface{ Decode(Arg) error } {
@@ -1226,7 +1307,7 @@ func init() {
                        return v
                },
                0x05: func() interface{ Decode(Arg) error } {
-                       v, _ := NewRouterBusyToNetwork()
+                       v, _ := NewRouterAvailableToNetwork()
                        return v
                },
                0x06: func() interface{ Decode(Arg) error } {
diff --git a/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go 
b/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go
index 0f9f67b626..4ec6bddd07 100644
--- a/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go
+++ b/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go
@@ -127,6 +127,14 @@ func WhatIsNetworkNumber(dnet uint16) 
*bacnetip.WhatIsNetworkNumber {
        return network
 }
 
+func NetworkNumberIs(net uint16, flag bool) *bacnetip.NetworkNumberIs {
+       network, err := 
bacnetip.NewNetworkNumberIs(bacnetip.WithNetworkNumberIsNET(net), 
bacnetip.WithNetworkNumberIsTerminationConfigured(flag))
+       if err != nil {
+               panic(err)
+       }
+       return network
+}
+
 type TestNPDUCodecSuite struct {
        suite.Suite
 
@@ -650,6 +658,30 @@ func (suite *TestNPDUCodecSuite) TestWhatIsNetworkNumber() 
{ // Test the Result
        err = 
suite.Confirmation(bacnetip.NewArgs(&bacnetip.WhatIsNetworkNumber{}), 
bacnetip.NoKWArgs)
 }
 
+func (suite *TestNPDUCodecSuite) TestNetworkNumberIs() { // Test the Result 
encoding and decoding.
+       // Request successful
+       pduBytes, err := bacnetip.Xtob(
+               "01.80" + // version, network layer message
+                       "13 0008 01", // message type, network, flqg
+       )
+       suite.Require().NoError(err)
+       { // Parse with plc4x parser to validate
+               parse, err := 
readWriteModel.NPDUParse(testutils.TestContext(suite.T()), pduBytes, 
uint16(len(pduBytes)))
+               suite.Assert().NoError(err)
+               if parse != nil {
+                       suite.T().Log("\n" + parse.String())
+               }
+       }
+
+       err = suite.Request(bacnetip.NewArgs(NetworkNumberIs(8, true)), 
bacnetip.NoKWArgs)
+       suite.Assert().NoError(err)
+       err = suite.Indication(bacnetip.NoArgs, 
bacnetip.NewKWArgs(bacnetip.KWPDUData, pduBytes))
+       suite.Assert().NoError(err)
+
+       err = 
suite.Response(bacnetip.NewArgs(bacnetip.NewPDU(&bacnetip.MessageBridge{Bytes: 
pduBytes})), bacnetip.NoKWArgs)
+       suite.Assert().NoError(err)
+       err = suite.Confirmation(bacnetip.NewArgs(&bacnetip.NetworkNumberIs{}), 
bacnetip.NewKWArgs(bacnetip.KWNniNet, uint16(8), bacnetip.KWNniFlag, true))
+}
 func TestNPDUCodec(t *testing.T) {
        suite.Run(t, new(TestNPDUCodecSuite))
 }

Reply via email to