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 c3c8f49cf26a550175fde36ddd327e57c6809b18 Author: Sebastian Rühl <[email protected]> AuthorDate: Wed Aug 21 22:40:40 2024 +0200 feat(plc4go/bacnet): WhatIsNetworkNumber --- plc4go/internal/bacnetip/comp.go | 2 + plc4go/internal/bacnetip/npdu.go | 54 +++++++++++++++++++++- plc4go/internal/bacnetip/tests/state_machine.go | 12 +++++ .../bacnetip/tests/test_npdu/test_codec_test.go | 33 +++++++++++++ 4 files changed, 99 insertions(+), 2 deletions(-) diff --git a/plc4go/internal/bacnetip/comp.go b/plc4go/internal/bacnetip/comp.go index f184668ac4..98c7f125d5 100644 --- a/plc4go/internal/bacnetip/comp.go +++ b/plc4go/internal/bacnetip/comp.go @@ -135,6 +135,8 @@ const ( KWEctnDNET = KnownKey("ectnDNET") KWEctnTerminationTime = KnownKey("ectnTerminationTime") KWDctnDNET = KnownKey("dctnDNET") + KWNniNet = KnownKey("nniNet") + KWNniFlag = KnownKey("nniFlag") ) type MessageBridge struct { diff --git a/plc4go/internal/bacnetip/npdu.go b/plc4go/internal/bacnetip/npdu.go index 1832552aea..0423bb58f4 100644 --- a/plc4go/internal/bacnetip/npdu.go +++ b/plc4go/internal/bacnetip/npdu.go @@ -1139,10 +1139,60 @@ func (n *DisconnectConnectionToNetwork) String() string { type WhatIsNetworkNumber struct { *_NPDU + readWriteModel.NLMWhatIsNetworkNumber } -func NewWhatIsNetworkNumber() (*WhatIsNetworkNumber, error) { - panic("implement me") +func NewWhatIsNetworkNumber(opts ...func(*WhatIsNetworkNumber)) (*WhatIsNetworkNumber, error) { + i := &WhatIsNetworkNumber{} + for _, opt := range opts { + opt(i) + } + i.NLMWhatIsNetworkNumber = readWriteModel.NewNLMWhatIsNetworkNumber(0) + npdu, err := NewNPDU(i.NLMWhatIsNetworkNumber, nil) + if err != nil { + return nil, errors.Wrap(err, "error creating NPDU") + } + i._NPDU = npdu.(*_NPDU) + return i, nil +} + +func (n *WhatIsNetworkNumber) 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.setNPDU(n.npdu) + npdu.setNLM(n.nlm) + npdu.setAPDU(n.apdu) + return nil + default: + return errors.Errorf("invalid NPDU type %T", npdu) + } +} + +func (n *WhatIsNetworkNumber) 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.NLMWhatIsNetworkNumberExactly: + n.setNLM(nlm) + n.NLMWhatIsNetworkNumber = nlm + } + } + return nil + default: + return errors.Errorf("invalid NPDU type %T", npdu) + } +} + +func (n *WhatIsNetworkNumber) String() string { + return fmt.Sprintf("WhatIsNetworkNumber{%s}", n._NPDU) } type NetworkNumberIs struct { diff --git a/plc4go/internal/bacnetip/tests/state_machine.go b/plc4go/internal/bacnetip/tests/state_machine.go index 472137df3c..0dc6b54d1e 100644 --- a/plc4go/internal/bacnetip/tests/state_machine.go +++ b/plc4go/internal/bacnetip/tests/state_machine.go @@ -263,6 +263,18 @@ func MatchPdu(localLog zerolog.Logger, pdu bacnetip.PDU, pduType any, pduAttrs m return false } return dctn.GetDctnDNET() == attrValue + case bacnetip.KWNniNet: + nni, ok := pdu.(*bacnetip.NetworkNumberIs) + if !ok { + return false + } + return nni.GetNetworkNumber() == attrValue + case bacnetip.KWNniFlag: + nni, ok := pdu.(*bacnetip.NetworkNumberIs) + if !ok { + return false + } + return nni.GetNniFlag() == attrValue default: panic("implement " + attrName) } 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 b27021ade6..0f9f67b626 100644 --- a/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go +++ b/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go @@ -119,6 +119,14 @@ func DisconnectConnectionToNetwork(dnet uint16) *bacnetip.DisconnectConnectionTo return network } +func WhatIsNetworkNumber(dnet uint16) *bacnetip.WhatIsNetworkNumber { + network, err := bacnetip.NewWhatIsNetworkNumber() + if err != nil { + panic(err) + } + return network +} + type TestNPDUCodecSuite struct { suite.Suite @@ -617,6 +625,31 @@ func (suite *TestNPDUCodecSuite) TestDisconnectConnectionToNetwork() { // Test t err = suite.Confirmation(bacnetip.NewArgs(&bacnetip.DisconnectConnectionToNetwork{}), bacnetip.NewKWArgs(bacnetip.KWDctnDNET, uint16(7))) } +func (suite *TestNPDUCodecSuite) TestWhatIsNetworkNumber() { // Test the Result encoding and decoding. + // Request successful + pduBytes, err := bacnetip.Xtob( + "01.80" + // version, network layer message + "12", // message type, network + ) + 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(WhatIsNetworkNumber(0)), 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.WhatIsNetworkNumber{}), bacnetip.NoKWArgs) +} + func TestNPDUCodec(t *testing.T) { suite.Run(t, new(TestNPDUCodecSuite)) }
