-
Notifications
You must be signed in to change notification settings - Fork 305
/
tts.go
88 lines (77 loc) · 2.19 KB
/
tts.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
// Copyright © 2019 The Things Network Foundation, The Things Industries B.V.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package devicetemplates
import (
"context"
"io"
pbtypes "github.com/gogo/protobuf/types"
"go.thethings.network/lorawan-stack/v3/pkg/ttnpb"
ttnio "go.thethings.network/lorawan-stack/v3/pkg/util/io"
)
// TTS is the device template converter id.
const TTS = "the-things-stack"
type tts struct{}
// Format implements the devicetemplates.Converter interface.
func (t *tts) Format() *ttnpb.EndDeviceTemplateFormat {
return &ttnpb.EndDeviceTemplateFormat{
Name: "The Things Stack JSON",
Description: "File containing end devices in The Things Stack JSON format.",
FileExtensions: []string{".json"},
}
}
// Convert implements the devicetemplates.Converter interface.
func (t *tts) Convert(ctx context.Context, r io.Reader, ch chan<- *ttnpb.EndDeviceTemplate) error {
defer close(ch)
dec := ttnio.NewJSONDecoder(r)
for {
dev := ttnpb.EndDevice{}
paths, err := dec.Decode(&dev)
if err != nil {
if err != io.EOF {
return err
}
return nil
}
paths = append(paths, "supports_join")
// dev_addr must be set as `session.dev_addr`.
dev.DevAddr = nil
for idx, path := range paths {
if path == "dev_addr" {
switch idx {
case 0:
paths = paths[1:]
case len(paths) - 1:
paths = paths[:len(paths)-1]
default:
paths = append(paths[:idx], paths[idx+1:]...)
}
break
}
}
tmpl := &ttnpb.EndDeviceTemplate{
EndDevice: dev,
FieldMask: pbtypes.FieldMask{
Paths: paths,
},
}
select {
case <-ctx.Done():
return ctx.Err()
case ch <- tmpl:
}
}
}
func init() {
RegisterConverter(TTS, &tts{})
}