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)) }
