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  }