change send data to dmx as 23 millisecond ticker when new data

This commit is contained in:
Adrian Zuercher
2025-07-25 22:37:35 +02:00
parent b484745ed1
commit 05409c2544
2 changed files with 20 additions and 16 deletions

View File

@@ -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
}
}

View File

@@ -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
}
}