Skip to content

Commit

Permalink
feat(plc4go/bacnetip): progression on APDU handling APDU
Browse files Browse the repository at this point in the history
  • Loading branch information
sruehl committed Sep 17, 2024
1 parent 52f355f commit fe2f1a3
Show file tree
Hide file tree
Showing 95 changed files with 2,023 additions and 1,083 deletions.
9 changes: 6 additions & 3 deletions plc4go/internal/bacnetip/bacgopes/apdu/apdu.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,22 @@ package apdu

import (
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/debugging"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
)

var _debug = CreateDebugPrinter()

var APDUTypes map[readWriteModel.ApduType]func() Decoder

func init() {
APDUTypes = map[readWriteModel.ApduType]func() Decoder{
readWriteModel.ApduType_CONFIRMED_REQUEST_PDU: func() Decoder {
pdu, _ := NewConfirmedRequestPDU(nil)
pdu, _ := NewConfirmedRequestPDU(Nothing())
return pdu
},
readWriteModel.ApduType_UNCONFIRMED_REQUEST_PDU: func() Decoder {
pdu, _ := NewUnconfirmedRequestPDU(nil)
pdu, _ := NewUnconfirmedRequestPDU(Nothing())
return pdu
},
readWriteModel.ApduType_SIMPLE_ACK_PDU: func() Decoder {
Expand Down Expand Up @@ -110,7 +113,7 @@ func init() {
panic("implement me")
},
readWriteModel.BACnetUnconfirmedServiceChoice_WHO_IS: func() Decoder {
request, _ := NewWhoIsRequest()
request, _ := NewWhoIsRequest(Nothing())
return request
},
readWriteModel.BACnetUnconfirmedServiceChoice_UTC_TIME_SYNCHRONIZATION: func() Decoder {
Expand Down
69 changes: 41 additions & 28 deletions plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCI.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import (

. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/debugging"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
)
Expand Down Expand Up @@ -93,17 +92,16 @@ type _APCI struct {

var _ APCI = (*_APCI)(nil)

func NewAPCI(apdu readWriteModel.APDU) APCI {
func NewAPCI(args Args, kwArgs KWArgs) APCI {
if _debug != nil {
_debug("__init__ %r %r", args, kwArgs)
}
a := &_APCI{}
a.DebugContents = NewDebugContents(a, "apduType", "apduSeg", "apduMor", "apduSA", "apduSrv",
"apduNak", "apduSeq", "apduWin", "apduMaxSegs", "apduMaxResp",
"apduService", "apduInvokeID", "apduAbortRejectReason")
a.PCI = NewPCI(NoArgs, NKW(KWCompRootMessage, apdu)) // TODO: convert to args so we can solve all those todos
a.PCI = NewPCI(args, kwArgs)
a.AddExtraPrinters(a.PCI.(DebugContentPrinter))
if apdu != nil {
apduType := apdu.GetApduType()
a.apduType = &apduType
}
return a
}

Expand All @@ -112,14 +110,29 @@ func (a *_APCI) GetDebugAttr(attr string) any {
case "apduType":
return a.apduType
case "apduSeg":
if !a.apduSeg {
return nil
}
return a.apduSeq
case "apduMor":
if !a.apduMor {
return nil
}
return a.apduMor
case "apduSA":
if !a.apduSA {
return nil
}
return a.apduSA
case "apduSrv":
if !a.apduSrv {
return nil
}
return a.apduSrv
case "apduNak":
if !a.apduNak {
return nil
}
return a.apduNak
case "apduSeq":
if a.apduSeq != nil {
Expand Down Expand Up @@ -149,7 +162,6 @@ func (a *_APCI) GetDebugAttr(attr string) any {
if a.apduAbortRejectReason != nil {
return *a.apduAbortRejectReason
}
panic("implement me")
default:
return nil
}
Expand Down Expand Up @@ -265,6 +277,9 @@ func (a *_APCI) Update(apci Arg) error {
}

func (a *_APCI) Encode(pdu Arg) error {
if _debug != nil {
_debug("encode %r", pdu)
}
switch pdu := pdu.(type) {
case PCI:
if err := pdu.GetPCI().Update(a); err != nil {
Expand Down Expand Up @@ -363,6 +378,9 @@ func (a *_APCI) Encode(pdu Arg) error {
}

func (a *_APCI) Decode(pdu Arg) error {
if _debug != nil {
_debug("decode %r", pdu)
}
if err := a.PCI.Update(pdu); err != nil {
return errors.Wrap(err, "error updating pdu")
}
Expand Down Expand Up @@ -486,27 +504,22 @@ func (a *_APCI) deepCopy() *_APCI {
}

func (a *_APCI) String() string {
if ExtendedPDUOutput {
return fmt.Sprintf("APCI{%s}", a.PCI) // TODO: add other fields
} else {
sname := fmt.Sprintf("%T", a)

// expand the type if possible

stype := ""
if a.apduType != nil {
if v, ok := APDUTypes[*a.apduType]; ok {
stype = fmt.Sprintf("%T", v)
} else {
stype = "?"
}
sname := StructName()

// expand the type if possible
stype := ""
if a.apduType != nil {
if v, ok := APDUTypes[*a.apduType]; ok {
stype = fmt.Sprintf("%T", v)
} else {
stype = "?"
}
}

// add the invoke ID if it has one
if a.apduInvokeID != nil {
stype += ", " + strconv.Itoa(int(*a.apduInvokeID))
}
// put it together
return fmt.Sprintf("<%s(%s instance at %p)>", sname, stype, a)
// add the invoke ID if it has one
if a.apduInvokeID != nil {
stype += ", " + strconv.Itoa(int(*a.apduInvokeID))
}
// put it together
return fmt.Sprintf("<%s(%s instance at %p)>", sname, stype, a)
}
4 changes: 1 addition & 3 deletions plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCISequence.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import (
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/constructeddata"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/primitivedata"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
)

// APCISequenceContract provides a set of functions which can be overwritten by a sub struct
Expand Down Expand Up @@ -60,8 +59,7 @@ func NewAPCISequence(args Args, kwArgs KWArgs, opts ...func(*APCISequence)) (*AP
} else {
a._contract.(APCISequenceContractRequirement).SetAPCISequence(a)
}
apdu := GA[readWriteModel.APDU](args, 0) // TODO: might break but should be fine as we are a GA*
a._APCI = NewAPCI(apdu).(*_APCI)
a._APCI = NewAPCI(args, kwArgs).(*_APCI)
var err error
a.Sequence, err = NewSequence(args, kwArgs, WithSequenceExtension(a._contract))
if err != nil {
Expand Down
49 changes: 17 additions & 32 deletions plc4go/internal/bacnetip/bacgopes/apdu/apdu_APDU.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import (

. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/debugging"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
"github.com/apache/plc4x/plc4go/spi"
Expand All @@ -43,43 +42,25 @@ type APDU interface {
type __APDU struct {
*_APCI
PDUData

// post construct function
_postConstruct []func()
}

var _ APDU = (*__APDU)(nil)

// TODO: optimize with options and smart non-recoding...
func NewAPDU(apdu readWriteModel.APDU, opts ...func(*__APDU)) (APDU, error) {
a := &__APDU{}
for _, opt := range opts {
opt(a)
func NewAPDU(args Args, kwArgs KWArgs) (APDU, error) {
if _debug != nil {
_debug("__init__ %r %r", args, kwArgs)
}
a._APCI = NewAPCI(apdu).(*_APCI)
a.PDUData = NewPDUData(NoArgs, NoKWArgs())
a := &__APDU{}
a._APCI = NewAPCI(args, kwArgs).(*_APCI)
a.PDUData = NewPDUData(args, kwArgs)
a.AddExtraPrinters(a.PDUData.(DebugContentPrinter))
// Do a post construct for a bit more easy initialization
for _, f := range a._postConstruct {
f()
}
a._postConstruct = nil
if a.GetRootMessage() != nil {
data, _ := a.GetRootMessage().Serialize()
a.SetPduData(data)
}
return a, nil
}

func WithAPDUUserData(userData spi.Message) func(*__APDU) {
return func(apdu *__APDU) {
apdu._postConstruct = append(apdu._postConstruct, func() {
apdu.SetPDUUserData(userData)
})
}
}

func (a *__APDU) Encode(pdu Arg) error {
if _debug != nil {
_debug("encode %s", pdu)
}
if err := a._APCI.Encode(pdu); err != nil {
return errors.Wrap(err, "error encoding APCI")
}
Expand All @@ -91,11 +72,16 @@ func (a *__APDU) Encode(pdu Arg) error {
}

func (a *__APDU) Decode(pdu Arg) error {
if _debug != nil {
_debug("decode %s", pdu)
}
var rootMessage spi.Message
switch pdu := pdu.(type) { // Save a root message as long as we have enough data
case PDUData:
data := pdu.GetPduData()
rootMessage, _ = readWriteModel.APDUParse[readWriteModel.APDU](context.Background(), data, uint16(len(data)))
rootMessage, _ = Try1(func() (readWriteModel.APDU, error) {
return readWriteModel.APDUParse[readWriteModel.APDU](context.Background(), data, uint16(len(data)))
})
}
switch pdu := pdu.(type) {
case IPCI:
Expand Down Expand Up @@ -147,10 +133,9 @@ func (a *__APDU) DeepCopy() any {
}

func (a *__APDU) String() string {
if ExtendedPDUOutput {
return fmt.Sprintf("APDU{%s}", a.PCI)
} else {
if IsDebuggingActive() {
pci := "\t" + strings.Join(strings.Split(a.PCI.String(), "\n"), "\n\t")
return fmt.Sprintf("<APDU instance at %p>\n%s\n\tpduData = x'%s'", a, pci, Btox(a.GetPduData(), "."))
}
return fmt.Sprintf("APDU{%s}", a.PCI)
}
6 changes: 6 additions & 0 deletions plc4go/internal/bacnetip/bacgopes/apdu/apdu_AbortPDU.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@ package apdu
// TODO: implement it...
type AbortPDU struct {
*___APDU

apduSrv any
}

func (a *AbortPDU) GetAPDUSrv() any {
panic("implement me")
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,14 @@ import (
readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
)

// TODO: implement it...
type ConfirmedPrivateTransferRequest struct {
*ConfirmedRequestSequence

serviceChoice readWriteModel.BACnetConfirmedServiceChoice
sequenceElements []Element
}

func NewConfirmedPrivateTransferRequest(_ Args, _ KWArgs) (*ConfirmedPrivateTransferRequest, error) {
func NewConfirmedPrivateTransferRequest(args Args, kwArgs KWArgs) (*ConfirmedPrivateTransferRequest, error) {
c := &ConfirmedPrivateTransferRequest{
serviceChoice: readWriteModel.BACnetConfirmedServiceChoice_CONFIRMED_PRIVATE_TRANSFER,
sequenceElements: []Element{
Expand All @@ -47,17 +46,16 @@ func NewConfirmedPrivateTransferRequest(_ Args, _ KWArgs) (*ConfirmedPrivateTran
NewElement("serviceParameters", Vs2E(NewAny), WithElementContext(2), WithElementOptional(true)),
},
}
var err error
c.ConfirmedRequestSequence, err = NewConfirmedRequestSequence(
readWriteModel.NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer(
readWriteModel.CreateBACnetVendorIdContextTagged(0, 0),
readWriteModel.CreateBACnetContextTagUnsignedInteger(1, 0),
if _, ok := kwArgs[KWCompRootMessage]; !ok {
kwArgs[KWCompRootMessage] = readWriteModel.NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer(
readWriteModel.CreateBACnetVendorIdContextTagged(0, 0), // TODO: get right values
readWriteModel.CreateBACnetContextTagUnsignedInteger(1, 0), // TODO: get right values
nil,
0,
),
NoKWArgs(),
WithConfirmedRequestSequenceExtension(c),
)
)
}
var err error
c.ConfirmedRequestSequence, err = NewConfirmedRequestSequence(args, kwArgs, WithConfirmedRequestSequenceExtension(c))
if err != nil {
return nil, errors.Wrap(err, "error building confirmed request")
}
Expand Down
35 changes: 21 additions & 14 deletions plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedRequestPDU.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ package apdu
import (
"github.com/pkg/errors"

. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
)

Expand All @@ -33,26 +34,32 @@ type ConfirmedRequestPDU struct {

var _ readWriteModel.APDUConfirmedRequest = (*ConfirmedRequestPDU)(nil)

func NewConfirmedRequestPDU(serviceRequest readWriteModel.BACnetConfirmedServiceRequest, opts ...func(*ConfirmedRequestPDU)) (*ConfirmedRequestPDU, error) {
u := &ConfirmedRequestPDU{
serviceRequest: serviceRequest,
func NewConfirmedRequestPDU(args Args, kwArgs KWArgs) (*ConfirmedRequestPDU, error) {
c := &ConfirmedRequestPDU{}
choice, ok := KWO[*readWriteModel.BACnetConfirmedServiceChoice](kwArgs, KWConfirmedServiceChoice, nil)
if _debug != nil {
_debug("__init__ %r %r %r", choice, args, kwArgs)
}
for _, opt := range opts {
opt(u)
}
apdu, err := new_APDU(nil)
apdu, err := New_APDU(args, kwArgs)
if err != nil {
return nil, errors.Wrap(err, "error creating _APDU")
}
u.___APDU = apdu.(*___APDU)
if serviceRequest != nil {
serviceChoice := uint8(serviceRequest.GetServiceChoice())
u.apduService = &serviceChoice
c.___APDU = apdu.(*___APDU)
c.apduType = ToPtr(readWriteModel.ApduType_CONFIRMED_REQUEST_PDU)
if ok {
serviceChoice := uint8(*choice)
c.apduService = &serviceChoice
}
c.SetExpectingReply(true)
switch rm := c.GetRootMessage().(type) {
case readWriteModel.BACnetConfirmedServiceRequest:
c.serviceRequest = rm
serviceChoice := rm.GetServiceChoice()
c.apduService = ToPtr(uint8(serviceChoice))
}
u.SetExpectingReply(true)
u.SetRootMessage(u.buildConfirmedRequest(serviceRequest))
c.SetRootMessage(c.buildConfirmedRequest(c.serviceRequest))

return u, nil
return c, nil
}

func (c *ConfirmedRequestPDU) buildConfirmedRequest(serviceRequest readWriteModel.BACnetConfirmedServiceRequest) readWriteModel.APDUConfirmedRequest {
Expand Down
Loading

0 comments on commit fe2f1a3

Please sign in to comment.