@@ -18,9 +18,11 @@ package device
18
18
19
19
import (
20
20
"context"
21
+ "encoding/binary"
21
22
"encoding/json"
22
23
"errors"
23
24
"fmt"
25
+ "math"
24
26
"regexp"
25
27
"strconv"
26
28
"sync"
@@ -51,17 +53,65 @@ func setVisitor(visitorConfig *modbus.ModbusVisitorConfig, twin *common.Twin, cl
51
53
return
52
54
}
53
55
54
- klog .V (2 ).Infof ("Convert type: %s, value: %s " , twin .PVisitor .PProperty .DataType , twin .Desired .Value )
55
- value , err := common .Convert (twin .PVisitor .PProperty .DataType , twin .Desired .Value )
56
- if err != nil {
57
- klog .Errorf ("Convert error: %v" , err )
58
- return
59
- }
60
-
61
- valueInt , _ := value .(int64 )
62
- _ , err = client .Set (visitorConfig .Register , visitorConfig .Offset , uint16 (valueInt ))
63
- if err != nil {
64
- klog .Errorf ("Set visitor error: %v %v" , err , visitorConfig )
56
+ klog .Infof ("Convert type: %s, value: %s " , twin .PVisitor .PProperty .DataType , twin .Desired .Value )
57
+ value := twin .Desired .Value
58
+ switch twin .PVisitor .PProperty .DataType {
59
+ case "int" :
60
+ valueInt , err := strconv .ParseInt (value , 10 , 64 )
61
+ if err != nil {
62
+ klog .Errorf ("twin %s Convert error: %v" , value , err )
63
+ return
64
+ }
65
+ _ , err = client .Set (visitorConfig .Register , visitorConfig .Offset , uint16 (valueInt ))
66
+ if err != nil {
67
+ klog .Errorf ("Set visitor error: %v %v" , err , visitorConfig )
68
+ return
69
+ }
70
+ case "float" :
71
+ valueFloat , err := strconv .ParseFloat (value , 32 )
72
+ if err != nil {
73
+ klog .Errorf ("twin %s Convert error: %v" , value , err )
74
+ return
75
+ }
76
+ _ , err = client .SetString (visitorConfig .Register , visitorConfig .Offset , visitorConfig .Limit , string (ConvertFloat32ToBytes (float32 (valueFloat ))))
77
+ if err != nil {
78
+ klog .Errorf ("Set visitor error: %v %v" , err , visitorConfig )
79
+ return
80
+ }
81
+ case "double" :
82
+ valueDouble , err := strconv .ParseFloat (value , 64 )
83
+ if err != nil {
84
+ klog .Errorf ("twin %s Convert error: %v" , value , err )
85
+ return
86
+ }
87
+ _ , err = client .SetString (visitorConfig .Register , visitorConfig .Offset , visitorConfig .Limit , string (ConvertFloat64ToBytes (valueDouble )))
88
+ if err != nil {
89
+ klog .Errorf ("Set visitor error: %v %v" , err , visitorConfig )
90
+ return
91
+ }
92
+ case "boolean" :
93
+ valueBool , err := strconv .ParseBool (value )
94
+ if err != nil {
95
+ klog .Errorf ("twin %s Convert error: %v" , value , err )
96
+ return
97
+ }
98
+ var valueSet uint16 = 0x0000
99
+ if valueBool {
100
+ valueSet = 0xFF00
101
+ }
102
+ _ , err = client .Set (visitorConfig .Register , visitorConfig .Offset , valueSet )
103
+ if err != nil {
104
+ klog .Errorf ("Set visitor error: %v %v" , err , visitorConfig )
105
+ return
106
+ }
107
+ case "string" :
108
+ _ , err := client .SetString (visitorConfig .Register , visitorConfig .Offset , visitorConfig .Limit , value )
109
+ if err != nil {
110
+ klog .Errorf ("Set visitor error: %v %v" , err , visitorConfig )
111
+ return
112
+ }
113
+ default :
114
+ klog .Errorf ("wrong DataType of twin %s: %s" , value , twin .PVisitor .PProperty .DataType )
65
115
return
66
116
}
67
117
}
@@ -130,7 +180,7 @@ func initTwin(ctx context.Context, dev *modbus.ModbusDev) {
130
180
DeviceID : dev .Instance .ID ,
131
181
DeviceName : dev .Instance .Name ,
132
182
}
133
- collectCycle := time .Duration (dev .Instance .Twins [i ].PVisitor .CollectCycle )
183
+ collectCycle := time .Duration (dev .Instance .Twins [i ].PVisitor .CollectCycle ) * time . Second
134
184
// If the collect cycle is not set, set it to 1 second.
135
185
if collectCycle == 0 {
136
186
collectCycle = 1 * time .Second
@@ -178,7 +228,7 @@ func (d *DevPanel) start(ctx context.Context, dev *modbus.ModbusDev) {
178
228
klog .Infof ("All twins has been set, %+v" , dev .Instance )
179
229
180
230
d .wg .Done ()
181
- klog .InfoS ("sync wait group donw " , "deviceID" , dev .Instance .ID , "device name" , dev .Instance .Name )
231
+ klog .InfoS ("sync wait group done " , "deviceID" , dev .Instance .ID , "device name" , dev .Instance .Name )
182
232
}
183
233
184
234
// DevInit initialize the device data.
@@ -350,3 +400,15 @@ func (d *DevPanel) UpdateModel(model *common.DeviceModel) {
350
400
func (d * DevPanel ) RemoveModel (modelName string ) {
351
401
delete (d .models , modelName )
352
402
}
403
+
404
+ func ConvertFloat64ToBytes (f float64 ) []byte {
405
+ res := make ([]byte , 8 )
406
+ binary .BigEndian .PutUint64 (res , math .Float64bits (f ))
407
+ return res
408
+ }
409
+
410
+ func ConvertFloat32ToBytes (f float32 ) []byte {
411
+ res := make ([]byte , 4 )
412
+ binary .BigEndian .PutUint32 (res , math .Float32bits (f ))
413
+ return res
414
+ }
0 commit comments