-
Notifications
You must be signed in to change notification settings - Fork 0
/
converter.go
106 lines (99 loc) · 3.04 KB
/
converter.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright © 2017 The Things Network
// Use of this source code is governed by the MIT license that can be found in the LICENSE file.
package device
import (
pb_handler "github.com/TheThingsNetwork/api/handler"
pb_lorawan "github.com/TheThingsNetwork/api/protocol/lorawan"
"github.com/TheThingsNetwork/ttn/core/types"
)
// ToPb converts a device struct to its protocol buffer
func (d Device) ToPb() *pb_handler.Device {
return &pb_handler.Device{
AppID: d.AppID,
DevID: d.DevID,
Description: d.Description,
Device: &pb_handler.Device_LoRaWANDevice{LoRaWANDevice: d.ToLoRaWANPb()},
Latitude: d.Latitude,
Longitude: d.Longitude,
Altitude: d.Altitude,
Attributes: d.Attributes,
}
}
// ToLoRaWANPb converts a device struct to a LoRaWAN protocol buffer
func (d Device) ToLoRaWANPb() *pb_lorawan.Device {
pbDev := &pb_lorawan.Device{
AppID: d.AppID,
AppEUI: d.AppEUI,
DevID: d.DevID,
DevEUI: d.DevEUI,
DevAddr: &d.DevAddr,
NwkSKey: &d.NwkSKey,
AppSKey: &d.AppSKey,
AppKey: &d.AppKey,
DisableFCntCheck: d.Options.DisableFCntCheck,
Uses32BitFCnt: d.Options.Uses32BitFCnt,
ActivationConstraints: d.Options.ActivationConstraints,
}
for _, nonce := range d.UsedDevNonces {
pbDev.UsedDevNonces = append(pbDev.UsedDevNonces, types.DevNonce(nonce))
}
for _, nonce := range d.UsedAppNonces {
pbDev.UsedAppNonces = append(pbDev.UsedAppNonces, types.AppNonce(nonce))
}
return pbDev
}
// FromPb returns a new device from the given proto
func FromPb(in *pb_handler.Device) *Device {
d := new(Device)
d.FromPb(in)
return d
}
// FromPb fills Device fields from a device proto
func (d *Device) FromPb(in *pb_handler.Device) {
d.AppID = in.AppID
d.DevID = in.DevID
d.Description = in.Description
d.Latitude = in.Latitude
d.Longitude = in.Longitude
d.Altitude = in.Altitude
d.Attributes = in.Attributes
d.FromLoRaWANPb(in.GetLoRaWANDevice())
}
// FromLoRaWANPb fills Device fields from a lorawan device proto
func (d *Device) FromLoRaWANPb(lorawan *pb_lorawan.Device) {
if lorawan == nil {
return
}
d.AppEUI = lorawan.AppEUI
d.DevEUI = lorawan.DevEUI
if lorawan.DevAddr != nil {
d.DevAddr = *lorawan.DevAddr
}
if lorawan.AppKey != nil {
d.AppKey = *lorawan.AppKey
}
if lorawan.AppSKey != nil {
d.AppSKey = *lorawan.AppSKey
}
if lorawan.NwkSKey != nil {
d.NwkSKey = *lorawan.NwkSKey
}
if len(lorawan.UsedDevNonces) > 0 {
d.UsedDevNonces = make([]DevNonce, len(lorawan.UsedDevNonces))
for i, nonce := range lorawan.UsedDevNonces {
d.UsedDevNonces[i] = DevNonce(nonce)
}
}
if len(lorawan.UsedAppNonces) > 0 {
d.UsedAppNonces = make([]AppNonce, len(lorawan.UsedAppNonces))
for i, nonce := range lorawan.UsedAppNonces {
d.UsedAppNonces[i] = AppNonce(nonce)
}
}
d.FCntUp = lorawan.FCntUp
d.Options = Options{
DisableFCntCheck: lorawan.DisableFCntCheck,
Uses32BitFCnt: lorawan.Uses32BitFCnt,
ActivationConstraints: lorawan.ActivationConstraints,
}
}