代码拉取完成,页面将自动刷新
package FlyModbusSlaves
import (
"sync"
"gitee.com/flyiot/flylibs/FlyTasks"
)
type FlyModbusSlaveTriggerInt16 struct {
LastValue int16
Func func(int16) int16
}
type FlyModbusSlaveTriggerInt32 struct {
LastValue int32
Func func(int32) int32
}
type FlyModbusSlaveTrigger struct {
sync.Mutex
MB *FlyModbusSlave
ListInt16 map[int]*FlyModbusSlaveTriggerInt16
ListInt32 map[int]*FlyModbusSlaveTriggerInt32
// isStart bool
// isStop bool
Task *FlyTasks.FlyLoopTask
}
func NewFlyModbusSlaveTrigger(mb *FlyModbusSlave) *FlyModbusSlaveTrigger {
s := FlyModbusSlaveTrigger{}
s.Clean()
s.MB = mb
s.Task = FlyTasks.NewFlyLoopTask()
return &s
}
func (s *FlyModbusSlaveTrigger) Start() error {
s.Lock()
defer s.Unlock()
s.Task.SetFunc(s.loop)
s.Task.SetInterval(1)
return s.Task.Start()
// if s.isStart {
// return errors.New("start")
// }
// s.isStart = true
// s.isStop = false
// go func() {
// for {
// if s.isStop {
// break
// }
// s.loop()
// time.Sleep(1 * time.Millisecond)
// }
// s.isStart = false
// s.isStop = false
// }()
// s.isStart = true
// return nil
}
func (s *FlyModbusSlaveTrigger) Stop() error {
s.Lock()
defer s.Unlock()
err := s.Task.Stop()
return err
// s.isStop = true
// for {
// if !s.isStart {
// break
// }
// time.Sleep(1 * time.Millisecond)
// }
}
func (s *FlyModbusSlaveTrigger) Clean() {
s.ListInt16 = make(map[int]*FlyModbusSlaveTriggerInt16)
s.ListInt32 = make(map[int]*FlyModbusSlaveTriggerInt32)
}
func (s *FlyModbusSlaveTrigger) OnInt16(addr int, f func(int16) int16) {
s.ListInt16[addr] = &FlyModbusSlaveTriggerInt16{
Func: f,
}
}
func (s *FlyModbusSlaveTrigger) OnInt32(addr int, f func(int32) int32) {
s.ListInt32[addr] = &FlyModbusSlaveTriggerInt32{
Func: f,
}
}
func (s *FlyModbusSlaveTrigger) loop() error {
defer func() {
recover()
}()
for addr, v := range s.ListInt16 {
if val, err := s.MB.GetInt16(addr); err == nil {
if val != v.LastValue {
val2 := v.Func(val)
if val2 != val {
val = val2
s.MB.SetInt16(addr, val)
}
v.LastValue = val
}
}
}
for addr, v := range s.ListInt32 {
if val, err := s.MB.GetInt32(addr); err == nil {
if val != v.LastValue {
val2 := v.Func(val)
if val2 != val {
val = val2
s.MB.SetInt32(addr, val)
}
v.LastValue = val
}
}
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。