diff --git a/driver/artNet.go b/driver/artNet.go index f8498c4..25571bb 100644 --- a/driver/artNet.go +++ b/driver/artNet.go @@ -141,9 +141,6 @@ func (d *ArtNetDriver) Connect(ip, id string, port uint) error { // send data to all buses that the send flage is true func (d *ArtNetDriver) SendData() { for _, bus := range d.Buses { - if !bus.Reachable { - continue - } - bus.Send <- bus.Data + bus.Send = bus.Reachable } } diff --git a/models/bus.go b/models/bus.go index 299e58b..1a4f9e6 100644 --- a/models/bus.go +++ b/models/bus.go @@ -29,7 +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:"-"` + Send bool `yaml:"-" json:"-"` } // adds new Art-Net interface to driver port 0 = 6454 (default art-net) @@ -107,8 +107,6 @@ func (b *Bus) Start(log *logging.Logger) error { var ctx context.Context ctx, b.Watchdog = context.WithCancel(context.Background()) - b.Send = make(chan *DMX, 1024) - go func() { var interval time.Duration = 10 * time.Second log.Info("bus.Start", fmt.Sprintf("device:%s ip:%s watchdog starting", b.Name, b.Ip)) @@ -129,7 +127,7 @@ func (b *Bus) Start(log *logging.Logger) error { } else { b.Reachable = true // send data as a heartbeat for she ArtNet Protocol - b.Send <- b.Data + b.Send = true log.Info("bus.Start", fmt.Sprintf("device:%s ip:%s watchdog running", b.Name, b.Ip)) interval = 30 * time.Second } @@ -148,17 +146,26 @@ func (b *Bus) Start(log *logging.Logger) error { } go func() { - defer conn.Close() - //close send channel - defer close(b.Send) + ticker := time.NewTicker(23 * time.Millisecond) - for send := range b.Send { - _, err = conn.Write(NewArtNetPackage(send)) + defer func() { + b.Send = false + conn.Close() + ticker.Stop() + }() + + for range ticker.C { + if !b.Send { + continue + } + + b.Send = false + + _, err = conn.Write(NewArtNetPackage(b.Data)) if err != nil { log.Error("bus.Start", err) return } - time.Sleep(23 * time.Millisecond) } }() return nil @@ -169,8 +176,8 @@ func (b *Bus) Stop() { if b.Watchdog != nil { //cancels context b.Watchdog() - //close send channel - close(b.Send) + + b.Send = false } }