From 407f1f361889b0f99bea2f0cc363e5ba0129a9ab Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Tue, 23 Dec 2025 14:19:52 -0600 Subject: [PATCH 1/3] add basic artnet decode/encode --- go.mod | 3 ++- go.sum | 2 ++ internal/processor/artnet-decode.go | 42 +++++++++++++++++++++++++++++ internal/processor/artnet-encode.go | 41 ++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 internal/processor/artnet-decode.go create mode 100644 internal/processor/artnet-encode.go diff --git a/go.mod b/go.mod index ecb47b3..e6980d4 100644 --- a/go.mod +++ b/go.mod @@ -1,12 +1,13 @@ module github.com/jwetzell/showbridge-go -go 1.25.3 +go 1.25.5 require ( github.com/eclipse/paho.mqtt.golang v1.5.1 github.com/emiago/diago v0.23.1-0.20251211215055-e1d875617111 github.com/emiago/sipgo v1.0.1 github.com/expr-lang/expr v1.17.7 + github.com/jwetzell/artnet-go v0.0.0-20251223201031-5097901aa9db github.com/jwetzell/free-d-go v0.1.0 github.com/jwetzell/osc-go v0.1.0 github.com/jwetzell/psn-go v0.3.0 diff --git a/go.sum b/go.sum index 43be236..b4e2fc2 100644 --- a/go.sum +++ b/go.sum @@ -30,6 +30,8 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/icholy/digest v1.1.0 h1:HfGg9Irj7i+IX1o1QAmPfIBNu/Q5A5Tu3n/MED9k9H4= github.com/icholy/digest v1.1.0/go.mod h1:QNrsSGQ5v7v9cReDI0+eyjsXGUoRSUZQHeQ5C4XLa0Y= +github.com/jwetzell/artnet-go v0.0.0-20251223201031-5097901aa9db h1:PR9sdDEWBufi8/3yiQHRXncLNKUHBMKiEBDtdNWsK/E= +github.com/jwetzell/artnet-go v0.0.0-20251223201031-5097901aa9db/go.mod h1:gli97Z32a0kMkZ6taoTiK7/lqHcF/dhiGjGJdx/PxqA= github.com/jwetzell/free-d-go v0.1.0 h1:xHt6dvyit98X+OC3jVzV0aLidxbyzi3vI9QiYkteEtA= github.com/jwetzell/free-d-go v0.1.0/go.mod h1:KmrkooRARRaxJTBSPvwt/6IMAIaHH1R8bSA8cwbbELw= github.com/jwetzell/osc-go v0.1.0 h1:EXxup5VWBErHot2Ri4MFToPf6KCzLDTbCt2x6GLfw8I= diff --git a/internal/processor/artnet-decode.go b/internal/processor/artnet-decode.go new file mode 100644 index 0000000..cbdbb06 --- /dev/null +++ b/internal/processor/artnet-decode.go @@ -0,0 +1,42 @@ +package processor + +import ( + "context" + "fmt" + + "github.com/jwetzell/artnet-go" + "github.com/jwetzell/showbridge-go/internal/config" +) + +type ArtNetDecode struct { + config config.ProcessorConfig +} + +func (ad *ArtNetDecode) Process(ctx context.Context, payload any) (any, error) { + payloadBytes, ok := payload.([]byte) + + if !ok { + return nil, fmt.Errorf("artnet.decode processor only accepts a []byte") + } + + payloadMessage, err := artnet.Decode(payloadBytes) + + if err != nil { + return nil, err + } + + return payloadMessage, nil +} + +func (ad *ArtNetDecode) Type() string { + return ad.config.Type +} + +func init() { + RegisterProcessor(ProcessorRegistration{ + Type: "artnet.decode", + New: func(config config.ProcessorConfig) (Processor, error) { + return &ArtNetDecode{config: config}, nil + }, + }) +} diff --git a/internal/processor/artnet-encode.go b/internal/processor/artnet-encode.go new file mode 100644 index 0000000..a26bd4b --- /dev/null +++ b/internal/processor/artnet-encode.go @@ -0,0 +1,41 @@ +package processor + +import ( + "context" + "fmt" + + "github.com/jwetzell/artnet-go" + "github.com/jwetzell/showbridge-go/internal/config" +) + +type ArtNetEncode struct { + config config.ProcessorConfig +} + +func (ad *ArtNetEncode) Process(ctx context.Context, payload any) (any, error) { + payloadPacket, ok := payload.(artnet.ArtNetPacket) + + if !ok { + return nil, fmt.Errorf("artnet.encode processor only accepts an ArtNetPacket") + } + + payloadBytes, err := payloadPacket.MarshalBinary() + if err != nil { + return nil, err + } + + return payloadBytes, nil +} + +func (ad *ArtNetEncode) Type() string { + return ad.config.Type +} + +func init() { + RegisterProcessor(ProcessorRegistration{ + Type: "artnet.encode", + New: func(config config.ProcessorConfig) (Processor, error) { + return &ArtNetEncode{config: config}, nil + }, + }) +} From 58cb7766fe9c3b9296cfe9ed040ccf669ac3a106 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Wed, 24 Dec 2025 15:28:25 -0600 Subject: [PATCH 2/3] change namespace --- .../{artnet-decode.go => artnet-packet-decode.go} | 14 +++++++------- .../{artnet-encode.go => artnet-packet-encode.go} | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) rename internal/processor/{artnet-decode.go => artnet-packet-decode.go} (57%) rename internal/processor/{artnet-encode.go => artnet-packet-encode.go} (57%) diff --git a/internal/processor/artnet-decode.go b/internal/processor/artnet-packet-decode.go similarity index 57% rename from internal/processor/artnet-decode.go rename to internal/processor/artnet-packet-decode.go index cbdbb06..9bda0d8 100644 --- a/internal/processor/artnet-decode.go +++ b/internal/processor/artnet-packet-decode.go @@ -8,15 +8,15 @@ import ( "github.com/jwetzell/showbridge-go/internal/config" ) -type ArtNetDecode struct { +type ArtNetPacketDecode struct { config config.ProcessorConfig } -func (ad *ArtNetDecode) Process(ctx context.Context, payload any) (any, error) { +func (apd *ArtNetPacketDecode) Process(ctx context.Context, payload any) (any, error) { payloadBytes, ok := payload.([]byte) if !ok { - return nil, fmt.Errorf("artnet.decode processor only accepts a []byte") + return nil, fmt.Errorf("artnet.packet.decode processor only accepts a []byte") } payloadMessage, err := artnet.Decode(payloadBytes) @@ -28,15 +28,15 @@ func (ad *ArtNetDecode) Process(ctx context.Context, payload any) (any, error) { return payloadMessage, nil } -func (ad *ArtNetDecode) Type() string { - return ad.config.Type +func (apd *ArtNetPacketDecode) Type() string { + return apd.config.Type } func init() { RegisterProcessor(ProcessorRegistration{ - Type: "artnet.decode", + Type: "artnet.packet.decode", New: func(config config.ProcessorConfig) (Processor, error) { - return &ArtNetDecode{config: config}, nil + return &ArtNetPacketDecode{config: config}, nil }, }) } diff --git a/internal/processor/artnet-encode.go b/internal/processor/artnet-packet-encode.go similarity index 57% rename from internal/processor/artnet-encode.go rename to internal/processor/artnet-packet-encode.go index a26bd4b..b820909 100644 --- a/internal/processor/artnet-encode.go +++ b/internal/processor/artnet-packet-encode.go @@ -8,15 +8,15 @@ import ( "github.com/jwetzell/showbridge-go/internal/config" ) -type ArtNetEncode struct { +type ArtNetPacketEncode struct { config config.ProcessorConfig } -func (ad *ArtNetEncode) Process(ctx context.Context, payload any) (any, error) { +func (ape *ArtNetPacketEncode) Process(ctx context.Context, payload any) (any, error) { payloadPacket, ok := payload.(artnet.ArtNetPacket) if !ok { - return nil, fmt.Errorf("artnet.encode processor only accepts an ArtNetPacket") + return nil, fmt.Errorf("artnet.packet.encode processor only accepts an ArtNetPacket") } payloadBytes, err := payloadPacket.MarshalBinary() @@ -27,15 +27,15 @@ func (ad *ArtNetEncode) Process(ctx context.Context, payload any) (any, error) { return payloadBytes, nil } -func (ad *ArtNetEncode) Type() string { - return ad.config.Type +func (ape *ArtNetPacketEncode) Type() string { + return ape.config.Type } func init() { RegisterProcessor(ProcessorRegistration{ - Type: "artnet.encode", + Type: "artnet.packet.encode", New: func(config config.ProcessorConfig) (Processor, error) { - return &ArtNetEncode{config: config}, nil + return &ArtNetPacketEncode{config: config}, nil }, }) } From e12b6e098ebafad6fcdc4d8be53ec1cd4e3a7fcf Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Wed, 24 Dec 2025 15:28:35 -0600 Subject: [PATCH 3/3] add artnet packet filter --- internal/processor/artnet-packet-filter.go | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 internal/processor/artnet-packet-filter.go diff --git a/internal/processor/artnet-packet-filter.go b/internal/processor/artnet-packet-filter.go new file mode 100644 index 0000000..cf7b96c --- /dev/null +++ b/internal/processor/artnet-packet-filter.go @@ -0,0 +1,52 @@ +package processor + +import ( + "context" + "fmt" + + "github.com/jwetzell/artnet-go" + "github.com/jwetzell/showbridge-go/internal/config" +) + +type ArtNetPacketFilter struct { + config config.ProcessorConfig + OpCode uint16 +} + +func (apf *ArtNetPacketFilter) Process(ctx context.Context, payload any) (any, error) { + payloadPacket, ok := payload.(artnet.ArtNetPacket) + + if !ok { + return nil, fmt.Errorf("artnet.packet.filter processor only accepts an ArtNetPacket") + } + + if payloadPacket.GetOpCode() != apf.OpCode { + return nil, nil + } + + return payloadPacket, nil +} + +func (apf *ArtNetPacketFilter) Type() string { + return apf.config.Type +} + +func init() { + RegisterProcessor(ProcessorRegistration{ + Type: "artnet.packet.filter", + New: func(config config.ProcessorConfig) (Processor, error) { + params := config.Params + + opCode, ok := params["opCode"] + if !ok { + return nil, fmt.Errorf("artnet.packet.filter requires an opCode parameter") + } + opCodeNum, ok := opCode.(float64) + if !ok { + return nil, fmt.Errorf("artnet.packet.filter opCode must be a number") + } + + return &ArtNetPacketFilter{config: config, OpCode: uint16(opCodeNum)}, nil + }, + }) +}