Skip to content

Commit 5f8f066

Browse files
committed
update log level, update collectCycle with time.Second and support twin for string, bool and float type
Signed-off-by: Ryan <[email protected]>
1 parent c2b402d commit 5f8f066

File tree

6 files changed

+166
-22
lines changed

6 files changed

+166
-22
lines changed

config/config.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type Config struct {
3939
GrpcServer GRPCServer `yaml:"grpc_server"`
4040
Common Common `yaml:"common"`
4141
DevInit DevInit `yaml:"dev_init"`
42+
LogLevel string `yaml:"log_level"`
4243
}
4344

4445
type GRPCServer struct {
@@ -63,9 +64,13 @@ type DevInit struct {
6364
func (c *Config) Parse() error {
6465
var level klog.Level
6566
var loglevel string
66-
var configFile string
6767

6868
pflag.StringVar(&loglevel, "v", "1", "log level")
69+
if err := level.Set(loglevel); err != nil {
70+
return err
71+
}
72+
73+
var configFile string
6974
pflag.StringVar(&configFile, "config-file", defaultConfigFile, "Config file name")
7075

7176
cf, err := ioutil.ReadFile(configFile)
@@ -75,8 +80,10 @@ func (c *Config) Parse() error {
7580
if err = yaml.Unmarshal(cf, c); err != nil {
7681
return err
7782
}
78-
if err = level.Set(loglevel); err != nil {
79-
return err
83+
if len(c.LogLevel) != 0 && c.LogLevel != "0" {
84+
if serr := level.Set(c.LogLevel); serr != nil {
85+
return serr
86+
}
8087
}
8188

8289
switch c.DevInit.Mode {

config/config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ common:
1010
dev_init:
1111
mode: register #register/configmap
1212
configmap: /opt/kubeedge/deviceProfile.json
13+
log_level: 1

mappers/modbus-dmi/config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ common:
99
edgecore_sock: /etc/kubeedge/dmi.sock
1010
dev_init:
1111
mode: register #register/configmap
12+
log_level: 1

mappers/modbus-dmi/device/device.go

+75-13
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ package device
1818

1919
import (
2020
"context"
21+
"encoding/binary"
2122
"encoding/json"
2223
"errors"
2324
"fmt"
25+
"math"
2426
"regexp"
2527
"strconv"
2628
"sync"
@@ -51,17 +53,65 @@ func setVisitor(visitorConfig *modbus.ModbusVisitorConfig, twin *common.Twin, cl
5153
return
5254
}
5355

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)
65115
return
66116
}
67117
}
@@ -130,7 +180,7 @@ func initTwin(ctx context.Context, dev *modbus.ModbusDev) {
130180
DeviceID: dev.Instance.ID,
131181
DeviceName: dev.Instance.Name,
132182
}
133-
collectCycle := time.Duration(dev.Instance.Twins[i].PVisitor.CollectCycle)
183+
collectCycle := time.Duration(dev.Instance.Twins[i].PVisitor.CollectCycle) * time.Second
134184
// If the collect cycle is not set, set it to 1 second.
135185
if collectCycle == 0 {
136186
collectCycle = 1 * time.Second
@@ -178,7 +228,7 @@ func (d *DevPanel) start(ctx context.Context, dev *modbus.ModbusDev) {
178228
klog.Infof("All twins has been set, %+v", dev.Instance)
179229

180230
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)
182232
}
183233

184234
// DevInit initialize the device data.
@@ -350,3 +400,15 @@ func (d *DevPanel) UpdateModel(model *common.DeviceModel) {
350400
func (d *DevPanel) RemoveModel(modelName string) {
351401
delete(d.models, modelName)
352402
}
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+
}

mappers/modbus-dmi/device/twindata.go

+44-3
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,59 @@ func TransferData(isRegisterSwap bool, isSwap bool,
114114
}
115115
bits := binary.BigEndian.Uint32(value)
116116
data := float64(math.Float32frombits(bits)) * scale
117-
sData := strconv.FormatFloat(data, 'f', 6, 64)
117+
sData := strconv.FormatFloat(data, 'f', 2, 64)
118118
return sData, nil
119119
case "boolean":
120-
return strconv.FormatBool(value[0] == 1), nil
120+
return strconv.FormatBool(value[0] == 0xFF), nil
121121
case "string":
122-
data := string(value)
122+
for i, b := range value {
123+
if !isUpper(b) && !isLowercase(b) && !isNumber(b) && !isSpecial(b) {
124+
value[i] = ' '
125+
}
126+
}
127+
data := strings.ReplaceAll(string(value), " ", "")
123128
return data, nil
124129
default:
125130
return "", errors.New("data type is not support")
126131
}
127132
}
128133

134+
func isUpper(b byte) bool {
135+
return 'A' <= b && b <= 'Z'
136+
}
137+
138+
func isLowercase(b byte) bool {
139+
return 'a' <= b && b <= 'z'
140+
}
141+
142+
func isNumber(b byte) bool {
143+
return '0' <= b && b <= '9'
144+
}
145+
146+
func isSpecial(b byte) bool {
147+
whiteList := map[byte]byte{
148+
'/': '/',
149+
'-': '-',
150+
'_': '_',
151+
'.': '.',
152+
'%': '%',
153+
'+': '+',
154+
',': ',',
155+
'=': '=',
156+
'@': '@',
157+
'#': '#',
158+
':': ':',
159+
'^': '^',
160+
'~': '~',
161+
'?': '?',
162+
'&': '&',
163+
'!': '!',
164+
'*': '*',
165+
}
166+
_, ok := whiteList[b]
167+
return ok
168+
}
169+
129170
func (td *TwinData) GetPayload() ([]byte, bool, error) {
130171
var err error
131172

pkg/driver/modbus/client.go

+35-3
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func (c *ModbusClient) Get(registerType string, addr uint16, quantity uint16) (r
159159
case "InputRegister":
160160
results, err = c.Client.ReadInputRegisters(addr, quantity)
161161
default:
162-
return nil, errors.New("Bad register type")
162+
return nil, errors.New("bad register type")
163163
}
164164
klog.V(2).Info("Get result: ", results)
165165
return results, err
@@ -181,18 +181,50 @@ func (c *ModbusClient) Set(registerType string, addr uint16, value uint16) (resu
181181
case 1:
182182
valueSet = 0xFF00
183183
default:
184-
return nil, errors.New("Wrong value")
184+
return nil, errors.New("wrong value")
185185
}
186186
results, err = c.Client.WriteSingleCoil(addr, valueSet)
187187
case "HoldingRegister":
188188
results, err = c.Client.WriteSingleRegister(addr, value)
189189
default:
190-
return nil, errors.New("Bad register type")
190+
return nil, errors.New("bad register type")
191191
}
192192
klog.V(1).Info("Set result:", err, results)
193193
return results, err
194194
}
195195

196+
func (c *ModbusClient) SetString(registerType string, offset uint16, limit int, value string) (results []byte, err error) {
197+
c.mu.Lock()
198+
defer c.mu.Unlock()
199+
200+
klog.V(1).InfoS("ModbusClient Set:", "register", registerType, "offset", offset, "limit", limit, "value", value)
201+
202+
switch registerType {
203+
case "CoilRegister":
204+
var valueSet uint16
205+
switch value {
206+
case "0":
207+
valueSet = 0x0000
208+
case "1":
209+
valueSet = 0xFF00
210+
default:
211+
return nil, errors.New("wrong value")
212+
}
213+
results, err = c.Client.WriteSingleCoil(offset, valueSet)
214+
case "HoldingRegister":
215+
valueBytes := make([]byte, limit*2)
216+
copy(valueBytes, value)
217+
results, err = c.Client.WriteMultipleRegisters(offset, uint16(limit), valueBytes)
218+
if err != nil {
219+
klog.ErrorS(err, "Failed to set HoldingRegister", "offset", offset, "limit", limit, "value", value)
220+
}
221+
default:
222+
return nil, errors.New("bad register type")
223+
}
224+
klog.V(1).InfoS("ModbusClient Set result", "results", results)
225+
return results, err
226+
}
227+
196228
// parity convert into the format that modbus driver requires.
197229
func parity(ori string) string {
198230
var p string

0 commit comments

Comments
 (0)