1 Star 0 Fork 1

flyiot/flylibs

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
FlyModbusSlaveTrigger.go 2.35 KB
一键复制 编辑 原始数据 按行查看 历史
flyrainning 提交于 2023-08-25 23:18 +08:00 . u
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
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/flyiot/flylibs.git
git@gitee.com:flyiot/flylibs.git
flyiot
flylibs
flylibs
b9c81f1c9857

搜索帮助