feat(plc4go/bacnetip): WriteBroadcastDistributionTable
diff --git a/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go b/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go
index a195173..384bfc5 100644
--- a/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go
+++ b/plc4go/internal/bacnetip/BACnetVirtualLinkLayerService.go
@@ -329,7 +329,6 @@
// encode it as a generic BVLL PDU
bvlpdu := NewBVLPDU(nil)
- // TODO: runtime cast might be dangerous
if err := rpdu.(interface{ Encode(Arg) error }).Encode(bvlpdu); err != nil {
return errors.Wrap(err, "error encoding PDU")
}
diff --git a/plc4go/internal/bacnetip/bvll.go b/plc4go/internal/bacnetip/bvll.go
index fd6f23b..2ba8277 100644
--- a/plc4go/internal/bacnetip/bvll.go
+++ b/plc4go/internal/bacnetip/bvll.go
@@ -21,6 +21,7 @@
import (
"context"
+ "encoding/binary"
"fmt"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
@@ -109,7 +110,6 @@
b := &_BVLPDU{
bvlc: bvlc,
}
- //b.bvlc = readWriteModel.NewBVLC() // TODO: using this function leads to a npe
b._BVLCI = NewBVLCI(bvlc).(*_BVLCI)
b._PDUData = newPDUData(b)
return b
@@ -282,7 +282,7 @@
for _, opt := range opts {
opt(b)
}
- b._BVLPDU = NewBVLPDU(nil).(*_BVLPDU)
+ b._BVLPDU = NewBVLPDU(readWriteModel.NewBVLCWriteBroadcastDistributionTable(b.produceBroadcastDistributionTable(), 0)).(*_BVLPDU)
return b, nil
}
@@ -296,6 +296,35 @@
return w.bvlciBDT
}
+func (w *WriteBroadcastDistributionTable) produceBroadcastDistributionTable() (entries []readWriteModel.BVLCBroadcastDistributionTableEntry) {
+ for _, address := range w.bvlciBDT {
+ addr := address.AddrAddress[:4]
+ port := uint16(47808)
+ if address.AddrPort != nil {
+ port = *address.AddrPort
+ }
+ mask := make([]byte, 4)
+ if address.AddrMask != nil {
+ binary.BigEndian.PutUint32(mask, *address.AddrMask)
+ }
+ entries = append(entries, readWriteModel.NewBVLCBroadcastDistributionTableEntry(addr, port, mask))
+ }
+ return
+}
+
+func (w *WriteBroadcastDistributionTable) produceBvlciBDT(entries []readWriteModel.BVLCBroadcastDistributionTableEntry) (bvlciBDT []*Address) {
+ for _, entry := range entries {
+ addr := entry.GetIp()
+ port := entry.GetPort()
+ var portArray = make([]byte, 2)
+ binary.BigEndian.PutUint16(portArray, port)
+ address, _ := NewAddress(zerolog.Nop(), append(addr, portArray...))
+ mask := binary.BigEndian.Uint32(entry.GetBroadcastDistributionMap())
+ address.AddrMask = &mask
+ bvlciBDT = append(bvlciBDT, address)
+ }
+ return
+}
func (w *WriteBroadcastDistributionTable) Encode(bvlpdu Arg) error {
switch bvlpdu := bvlpdu.(type) {
case BVLPDU:
@@ -324,11 +353,7 @@
switch bvlc := pduUserData.(type) {
case readWriteModel.BVLCWriteBroadcastDistributionTable:
w.setBVLC(bvlc)
- for _, entry := range bvlc.GetTable() {
- // TODO: what is with port and the map??
- address, _ := NewAddress(zerolog.Nop(), entry.GetIp())
- w.bvlciBDT = append(w.bvlciBDT, address)
- }
+ w.bvlciBDT = w.produceBvlciBDT(bvlc.GetTable())
}
}
return nil
diff --git a/plc4go/internal/bacnetip/tests/state_machine.go b/plc4go/internal/bacnetip/tests/state_machine.go
index c3f702d..dae5d47 100644
--- a/plc4go/internal/bacnetip/tests/state_machine.go
+++ b/plc4go/internal/bacnetip/tests/state_machine.go
@@ -146,9 +146,9 @@
if !equal {
switch want := want.(type) {
case []byte:
- localLog.Debug().Bytes("got", got).Bytes("want", want).Msg("mismatch")
+ localLog.Debug().Hex("got", got).Hex("want", want).Msg("mismatch")
default:
- localLog.Debug().Bytes("got", got).Interface("want", want).Msg("mismatch")
+ localLog.Debug().Hex("got", got).Interface("want", want).Msg("mismatch")
}
}
return equal
diff --git a/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go b/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go
index e38f2cb..a3ab26c 100644
--- a/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go
+++ b/plc4go/internal/bacnetip/tests/test_bvll/test_codec_test.go
@@ -154,7 +154,6 @@
}
func (suite *TestAnnexJCodecSuite) TestWriteBroadcastDistributionTable() {
- suite.T().Skip("something is odd here") // TODO: check what is going on with the output...
// write an empty table
pduBytes, err := bacnetip.Xtob("81.01.0004")
suite.Require().NoError(err)