reduce Hue2 'update storms'..
continuous-integration/drone/push Build is passing

This commit is contained in:
2022-02-18 16:24:09 +01:00
parent 27fd858c04
commit 8a20bab709
3 changed files with 49 additions and 29 deletions
+24 -9
View File
@@ -87,6 +87,8 @@ func (p *Publisher) Publish(devices ...models.Device) {
return
}
unwaitMap := make(map[int]bool)
p.mu.Lock()
defer p.mu.Unlock()
@@ -106,10 +108,14 @@ func (p *Publisher) Publish(devices ...models.Device) {
}
} else {
p.pending[device.BridgeID] = append(p.pending[device.BridgeID], device)
if p.waiting[device.BridgeID] != nil {
close(p.waiting[device.BridgeID])
p.waiting[device.BridgeID] = nil
}
unwaitMap[device.BridgeID] = true
}
}
for bridgeID := range unwaitMap {
if p.waiting[bridgeID] != nil {
close(p.waiting[bridgeID])
p.waiting[bridgeID] = nil
}
}
}
@@ -124,11 +130,16 @@ func (p *Publisher) Run() {
ticker := time.NewTicker(time.Millisecond * 100)
deleteList := make([]int, 0, 8)
updatedList := make([]models.Device, 0, 16)
unwaitMap := make(map[int]bool)
for range ticker.C {
deleteList = deleteList[:0]
updatedList = updatedList[:0]
for key := range unwaitMap {
delete(unwaitMap, key)
}
p.mu.Lock()
for i, scene := range p.scenes {
if (!scene.endTime.IsZero() && time.Now().After(scene.endTime)) || scene.Empty() {
@@ -160,9 +171,13 @@ func (p *Publisher) Run() {
}
p.pending[device.BridgeID] = append(p.pending[device.BridgeID], device)
if p.waiting[device.BridgeID] != nil {
close(p.waiting[device.BridgeID])
p.waiting[device.BridgeID] = nil
unwaitMap[device.BridgeID] = true
}
for bridgeID := range unwaitMap {
if p.waiting[bridgeID] != nil {
close(p.waiting[bridgeID])
p.waiting[bridgeID] = nil
}
}
p.mu.Unlock()
@@ -270,8 +285,8 @@ func (p *Publisher) runBridge(id int) {
p.mu.Lock()
}
updates := p.pending[id]
p.pending[id] = p.pending[id][:0:0]
updates := append(p.pending[id][:0:0], p.pending[id]...)
p.pending[id] = p.pending[id][:0]
p.mu.Unlock()
// Only allow the latest update per device (this avoids slow bridges causing a backlog of cations).