github.com/simpleiot/simpleiot@v0.18.3/node/modbus-manager.go (about) 1 package node 2 3 import ( 4 "log" 5 6 "github.com/nats-io/nats.go" 7 "github.com/simpleiot/simpleiot/client" 8 "github.com/simpleiot/simpleiot/data" 9 ) 10 11 // ModbusManager manages state of modbus 12 type ModbusManager struct { 13 nc *nats.Conn 14 busses map[string]*Modbus 15 rootNodeID string 16 } 17 18 // NewModbusManager creates a new modbus manager 19 func NewModbusManager(nc *nats.Conn, rootNodeID string) *ModbusManager { 20 return &ModbusManager{ 21 nc: nc, 22 busses: make(map[string]*Modbus), 23 rootNodeID: rootNodeID, 24 } 25 } 26 27 // Update queries DB for modbus nodes and synchronizes 28 // with internal structures and updates data 29 func (mm *ModbusManager) Update() error { 30 nodes, err := client.GetNodes(mm.nc, mm.rootNodeID, "all", data.NodeTypeModbus, false) 31 if err != nil { 32 return err 33 } 34 35 found := make(map[string]bool) 36 37 for _, node := range nodes { 38 found[node.ID] = true 39 _, ok := mm.busses[node.ID] 40 if !ok { 41 var err error 42 bus, err := NewModbus(mm.nc, node) 43 if err != nil { 44 log.Println("Error creating new modbus:", err) 45 continue 46 } 47 mm.busses[node.ID] = bus 48 } 49 } 50 51 // remove busses that have been deleted 52 for id, bus := range mm.busses { 53 _, ok := found[id] 54 if !ok { 55 // bus was deleted so close and clear it 56 log.Println("removing modbus on port:", bus.busNode.portName) 57 bus.Stop() 58 delete(mm.busses, id) 59 } 60 } 61 62 return nil 63 }