-
Notifications
You must be signed in to change notification settings - Fork 2
/
device.go
90 lines (73 loc) · 2.01 KB
/
device.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package zda
import (
"fmt"
"github.com/shimmeringbee/da"
"github.com/shimmeringbee/da/capabilities"
"github.com/shimmeringbee/zda/implcaps"
"github.com/shimmeringbee/zigbee"
"sync"
)
func (z *ZDA) transmissionLookup(d da.Device, _ zigbee.ProfileID) (zigbee.IEEEAddress, zigbee.Endpoint, bool, uint8) {
if dd, ok := d.(*device); ok {
return dd.address.IEEEAddress, DefaultGatewayHomeAutomationEndpoint, dd.n.useAPSAck, dd.n.nextTransactionSequence()
} else if dd, ok := d.(device); ok {
return dd.address.IEEEAddress, DefaultGatewayHomeAutomationEndpoint, dd.n.useAPSAck, dd.n.nextTransactionSequence()
} else {
return zigbee.IEEEAddress(0), zigbee.Endpoint(0), false, 0
}
}
type device struct {
// Immutable data.
address IEEEAddressWithSubIdentifier
gw da.Gateway
m *sync.RWMutex
eda *enumeratedDeviceAttachment
dr *deviceRemoval
n *node
// Mutable data, obtain lock first.
deviceId int
deviceIdSet bool
capabilities map[da.Capability]implcaps.ZDACapability
productData productData
}
func (d device) Capability(capability da.Capability) da.BasicCapability {
switch capability {
case capabilities.EnumerateDeviceFlag:
return d.eda
case capabilities.DeviceRemovalFlag:
return d.dr
default:
d.m.RLock()
defer d.m.RUnlock()
return d.capabilities[capability]
}
}
func (d device) Gateway() da.Gateway {
return d.gw
}
func (d device) Identifier() da.Identifier {
return d.address
}
func (d device) Capabilities() []da.Capability {
d.m.RLock()
defer d.m.RUnlock()
var caps []da.Capability
for k := range d.capabilities {
caps = append(caps, k)
}
if d.eda != nil {
caps = append(caps, capabilities.EnumerateDeviceFlag)
}
if d.dr != nil {
caps = append(caps, capabilities.DeviceRemovalFlag)
}
return caps
}
var _ da.Device = (*device)(nil)
type IEEEAddressWithSubIdentifier struct {
IEEEAddress zigbee.IEEEAddress
SubIdentifier uint8
}
func (a IEEEAddressWithSubIdentifier) String() string {
return fmt.Sprintf("%s-%02x", a.IEEEAddress, a.SubIdentifier)
}