diff --git a/driver/artNet.go b/driver/artNet.go index e26e0c9..fe0c8fd 100644 --- a/driver/artNet.go +++ b/driver/artNet.go @@ -82,7 +82,7 @@ func (d *ArtNetDriver) SetValue(bus string, address uint, value uint8) error { return fmt.Errorf("no dmx data on bus '%s' found", bus) } d.Buses[bus].Data.SetValue(address, value) - return d.Buses[bus].SendData() + return nil } // connect to websocket server and listen to subscriptions @@ -134,3 +134,10 @@ func (d *ArtNetDriver) Connect(ip, id string, port uint) error { } return nil } + +// send data to all buses that the send flage is true +func (d *ArtNetDriver) SendData() { + for _, bus := range d.Buses { + bus.Send <- bus.Data + } +} diff --git a/driver/publish.go b/driver/publish.go index 3f2cb7a..19aa127 100644 --- a/driver/publish.go +++ b/driver/publish.go @@ -8,10 +8,12 @@ func (d *ArtNetDriver) Publish(pubs ...json_dataModels.Publish) error { if d.Subscriptions == nil { return nil } + for _, pub := range pubs { if drv, ok := (d.Subscriptions)[pub.Uuid]; ok { d.SetValue(drv.Bus, drv.Address, uint8(pub.Value.(float64))) } } + d.SendData() return nil } diff --git a/driver/subscribe.go b/driver/subscribe.go index 942881d..d27d540 100644 --- a/driver/subscribe.go +++ b/driver/subscribe.go @@ -17,4 +17,5 @@ func (d *ArtNetDriver) Subscribe(subs ...json_dataModels.Subscription) { d.SetValue(drv.Bus, drv.Address, uint8(sub.Value.(float64))) } } + d.SendData() } diff --git a/models/bus.go b/models/bus.go index 29770f5..2c1727e 100644 --- a/models/bus.go +++ b/models/bus.go @@ -29,6 +29,7 @@ type Bus struct { Resubscribe *[]json_dataModels.Subscription `yaml:"-" json:"resubscribe"` Watchdog context.CancelFunc `yaml:"-" json:"-"` Reachable bool `yaml:"-" json:"-"` + Send chan *DMX `yaml:"-" json:"-"` } // adds new Art-Net interface to driver port 0 = 6454 (default art-net) @@ -102,7 +103,7 @@ func (b *Bus) Poll(interval time.Duration) error { } // start bus -func (b *Bus) Start(log *logging.Logger) { +func (b *Bus) Start(log *logging.Logger) error { var ctx context.Context ctx, b.Watchdog = context.WithCancel(context.Background()) @@ -132,26 +133,7 @@ func (b *Bus) Start(log *logging.Logger) { } } }() -} -// stop bus -func (b *Bus) Stop() { - if b.Watchdog != nil { - b.Watchdog() - } -} - -// status bus -func (b *Bus) Status() bool { - return b.Watchdog != nil -} - -// send dmx data -func (b *Bus) SendData() error { - if !b.Reachable { - return nil - } - // Send packet over UDP conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: net.ParseIP(b.Ip), Port: *b.Port, @@ -160,11 +142,38 @@ func (b *Bus) SendData() error { if err != nil { return err } - defer conn.Close() - _, err = conn.Write(NewArtNetPackage(b.Data)) + b.Send = make(chan *DMX, 1024) - return err + go func() { + defer conn.Close() + //close send channel + close(b.Send) + for send := range b.Send { + _, err = conn.Write(NewArtNetPackage(send)) + if err != nil { + log.Error("bus.Start", err) + return + } + time.Sleep(23 * time.Millisecond) + } + }() + return nil +} + +// stop bus +func (b *Bus) Stop() { + if b.Watchdog != nil { + //cancels context + b.Watchdog() + //close send channel + close(b.Send) + } +} + +// status bus +func (b *Bus) Status() bool { + return b.Watchdog != nil } func (b *Bus) ParsePayload(c *gin.Context) error {