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 fe434f05734250f82da3700221a05b62578f2e57 Author: Sebastian Rühl <[email protected]> AuthorDate: Wed Aug 21 22:39:40 2024 +0200 feat(plc4go/bacnet): DisconnectConnectionToNetwork --- plc4go/internal/bacnetip/comp.go | 1 + plc4go/internal/bacnetip/npdu.go | 68 +++++++++++++++++++++- plc4go/internal/bacnetip/tests/state_machine.go | 6 ++ .../bacnetip/tests/test_npdu/test_codec_test.go | 33 +++++++++++ 4 files changed, 106 insertions(+), 2 deletions(-) diff --git a/plc4go/internal/bacnetip/comp.go b/plc4go/internal/bacnetip/comp.go index 8a7913983e..f184668ac4 100644 --- a/plc4go/internal/bacnetip/comp.go +++ b/plc4go/internal/bacnetip/comp.go @@ -134,6 +134,7 @@ const ( KWIrtaTable = KnownKey("irtaTable") KWEctnDNET = KnownKey("ectnDNET") KWEctnTerminationTime = KnownKey("ectnTerminationTime") + KWDctnDNET = KnownKey("dctnDNET") ) type MessageBridge struct { diff --git a/plc4go/internal/bacnetip/npdu.go b/plc4go/internal/bacnetip/npdu.go index a890ca955c..1832552aea 100644 --- a/plc4go/internal/bacnetip/npdu.go +++ b/plc4go/internal/bacnetip/npdu.go @@ -1067,10 +1067,74 @@ func (n *EstablishConnectionToNetwork) String() string { type DisconnectConnectionToNetwork struct { *_NPDU + dctnDNET uint16 + + readWriteModel.NLMDisconnectConnectionToNetwork } -func NewDisconnectConnectionToNetwork() (*DisconnectConnectionToNetwork, error) { - panic("implement me") +func NewDisconnectConnectionToNetwork(opts ...func(*DisconnectConnectionToNetwork)) (*DisconnectConnectionToNetwork, error) { + i := &DisconnectConnectionToNetwork{} + for _, opt := range opts { + opt(i) + } + i.NLMDisconnectConnectionToNetwork = readWriteModel.NewNLMDisconnectConnectionToNetwork(i.dctnDNET, 0) + npdu, err := NewNPDU(i.NLMDisconnectConnectionToNetwork, nil) + if err != nil { + return nil, errors.Wrap(err, "error creating NPDU") + } + i._NPDU = npdu.(*_NPDU) + return i, nil +} + +func WithDisconnectConnectionToNetworkDNET(dnet uint16) func(*DisconnectConnectionToNetwork) { + return func(n *DisconnectConnectionToNetwork) { + n.dctnDNET = dnet + } +} + +func (n *DisconnectConnectionToNetwork) GetDctnDNET() uint16 { + return n.dctnDNET +} + +func (n *DisconnectConnectionToNetwork) 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.dctnDNET)) + 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 *DisconnectConnectionToNetwork) 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.NLMDisconnectConnectionToNetworkExactly: + n.setNLM(nlm) + n.NLMDisconnectConnectionToNetwork = nlm + n.dctnDNET = nlm.GetDestinationNetworkAddress() + } + } + return nil + default: + return errors.Errorf("invalid NPDU type %T", npdu) + } +} + +func (n *DisconnectConnectionToNetwork) String() string { + return fmt.Sprintf("DisconnectConnectionToNetwork{%s, dctnDNET: %v}", n._NPDU, n.dctnDNET) } type WhatIsNetworkNumber struct { diff --git a/plc4go/internal/bacnetip/tests/state_machine.go b/plc4go/internal/bacnetip/tests/state_machine.go index 4131f6d5c3..472137df3c 100644 --- a/plc4go/internal/bacnetip/tests/state_machine.go +++ b/plc4go/internal/bacnetip/tests/state_machine.go @@ -257,6 +257,12 @@ func MatchPdu(localLog zerolog.Logger, pdu bacnetip.PDU, pduType any, pduAttrs m return false } return ectn.GetEctnTerminationTime() == attrValue + case bacnetip.KWDctnDNET: + dctn, ok := pdu.(*bacnetip.DisconnectConnectionToNetwork) + if !ok { + return false + } + return dctn.GetDctnDNET() == 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 e186843789..b27021ade6 100644 --- a/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go +++ b/plc4go/internal/bacnetip/tests/test_npdu/test_codec_test.go @@ -111,6 +111,14 @@ func EstablishConnectionToNetwork(dnet uint16, terminationTime uint8) *bacnetip. return network } +func DisconnectConnectionToNetwork(dnet uint16) *bacnetip.DisconnectConnectionToNetwork { + network, err := bacnetip.NewDisconnectConnectionToNetwork(bacnetip.WithDisconnectConnectionToNetworkDNET(dnet)) + if err != nil { + panic(err) + } + return network +} + type TestNPDUCodecSuite struct { suite.Suite @@ -584,6 +592,31 @@ func (suite *TestNPDUCodecSuite) TestEstablishConnectionToNetworks() { // Test t err = suite.Confirmation(bacnetip.NewArgs(&bacnetip.EstablishConnectionToNetwork{}), bacnetip.NewKWArgs(bacnetip.KWEctnDNET, uint16(5), bacnetip.KWEctnTerminationTime, uint8(6))) } +func (suite *TestNPDUCodecSuite) TestDisconnectConnectionToNetwork() { // Test the Result encoding and decoding. + // Request successful + pduBytes, err := bacnetip.Xtob( + "01.80" + // version, network layer message + "09 0007", // 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(DisconnectConnectionToNetwork(7)), 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.DisconnectConnectionToNetwork{}), bacnetip.NewKWArgs(bacnetip.KWDctnDNET, uint16(7))) +} + func TestNPDUCodec(t *testing.T) { suite.Run(t, new(TestNPDUCodecSuite)) }
