forked from baetyl/baetyl-bacnet
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
88 lines (81 loc) · 2.18 KB
/
main.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
package main
import (
"strconv"
"github.com/baetyl/baetyl-bacnet/baetyl-bacnet"
dm "github.com/baetyl/baetyl-go/v2/dmcontext"
"github.com/baetyl/baetyl-go/v2/utils"
"gopkg.in/yaml.v2"
)
func main() {
dm.Run(func(ctx dm.Context) error {
cfg, err := genConfig(ctx)
if err != nil {
return err
}
bac, err := baetyl_bacnet.NewBacnet(ctx, cfg)
if err != nil {
return err
}
defer bac.Close()
ctx.Wait()
return nil
})
}
func genConfig(ctx dm.Context) (*baetyl_bacnet.Config, error) {
cfg := &baetyl_bacnet.Config{}
var slaves []baetyl_bacnet.SlaveConfig
var jobs []baetyl_bacnet.Job
// generate slave
var slave baetyl_bacnet.SlaveConfig
if err := yaml.Unmarshal([]byte(ctx.GetDriverConfig()), &slave); err != nil {
return nil, err
}
// generate job
for _, devInfo := range ctx.GetAllDevices() {
accessConfig := devInfo.AccessConfig
if accessConfig.Custom == nil {
continue
}
slave.Device = devInfo.Name
var job baetyl_bacnet.Job
if err := yaml.Unmarshal([]byte(*accessConfig.Custom), &job); err != nil {
return nil, err
}
job.Interval = slave.Interval
job.Device = slave.Device
// generate jobMap
jobMaps := make(map[string]baetyl_bacnet.Property)
devTpl, err := ctx.GetAccessTemplates(&devInfo)
if err != nil {
return nil, err
}
if devTpl != nil && devTpl.Properties != nil && len(devTpl.Properties) > 0 {
for _, prop := range devTpl.Properties {
if visitor := prop.Visitor.Custom; visitor != nil {
var jobMap baetyl_bacnet.Property
if err := yaml.Unmarshal([]byte(*visitor), &jobMap); err != nil {
return nil, err
}
jobMap.Id = prop.Id
jobMap.Name = prop.Name
jobMap.Type = prop.Type
jobMap.Mode = prop.Mode
jobMap.BacnetAddress = jobMap.BacnetAddress + job.AddressOffset
jobMaps[strconv.FormatUint(uint64(jobMap.BacnetType), 10)+":"+
strconv.FormatUint(uint64(jobMap.BacnetAddress), 10)] = jobMap
}
}
}
slave.Device = devInfo.Name
slave.DeviceId = job.DeviceId
slaves = append(slaves, slave)
job.Properties = jobMaps
jobs = append(jobs, job)
}
cfg.Jobs = jobs
cfg.Slaves = slaves
if err := utils.SetDefaults(cfg); err != nil {
return nil, err
}
return cfg, nil
}