diff --git a/util/modbus/connection.go b/util/modbus/connection.go index 672a44ffd..7dad55b20 100644 --- a/util/modbus/connection.go +++ b/util/modbus/connection.go @@ -1,18 +1,15 @@ package modbus import ( - "sync" "time" - "github.com/grid-x/modbus" "github.com/volkszaehler/mbmd/meters" ) // Connection is a logical modbus connection per slave ID sharing a physical connection type Connection struct { + *logger meters.Connection - mu sync.Mutex - logger *logger logical meters.Logger delay time.Duration } @@ -42,72 +39,79 @@ func (c *Connection) Timeout(timeout time.Duration) { } } -func (c *Connection) Logger(l modbus.Logger) { - c.mu.Lock() - defer c.mu.Unlock() - - c.logical = l -} - -func (c *Connection) prepare() { - c.mu.Lock() - defer c.mu.Unlock() - +func (c *Connection) exec(fun func() ([]byte, error)) ([]byte, error) { time.Sleep(c.delay) - c.logger.Logger(c.logical) + return c.WithLogger(c.logical, func() ([]byte, error) { + b, err := fun() + if err != nil { + c.Connection.Close() + } + return b, err + }) } func (c *Connection) ReadCoils(address, quantity uint16) ([]byte, error) { - c.prepare() - return c.ModbusClient().ReadCoils(address, quantity) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().ReadCoils(address, quantity) + }) } func (c *Connection) WriteSingleCoil(address, value uint16) ([]byte, error) { - c.prepare() - return c.ModbusClient().WriteSingleCoil(address, value) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().WriteSingleCoil(address, value) + }) } func (c *Connection) ReadInputRegisters(address, quantity uint16) ([]byte, error) { - c.prepare() - return c.ModbusClient().ReadInputRegisters(address, quantity) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().ReadInputRegisters(address, quantity) + }) } func (c *Connection) ReadHoldingRegisters(address, quantity uint16) ([]byte, error) { - c.prepare() - return c.ModbusClient().ReadHoldingRegisters(address, quantity) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().ReadHoldingRegisters(address, quantity) + }) } func (c *Connection) WriteSingleRegister(address, value uint16) ([]byte, error) { - c.prepare() - return c.ModbusClient().WriteSingleRegister(address, value) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().WriteSingleRegister(address, value) + }) } func (c *Connection) WriteMultipleRegisters(address, quantity uint16, value []byte) ([]byte, error) { - c.prepare() - return c.ModbusClient().WriteMultipleRegisters(address, quantity, value) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().WriteMultipleRegisters(address, quantity, value) + }) } func (c *Connection) ReadDiscreteInputs(address, quantity uint16) (results []byte, err error) { - c.prepare() - return c.ModbusClient().ReadDiscreteInputs(address, quantity) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().ReadDiscreteInputs(address, quantity) + }) } func (c *Connection) WriteMultipleCoils(address, quantity uint16, value []byte) (results []byte, err error) { - c.prepare() - return c.ModbusClient().WriteMultipleCoils(address, quantity, value) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().WriteMultipleCoils(address, quantity, value) + }) } func (c *Connection) ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity uint16, value []byte) (results []byte, err error) { - c.prepare() - return c.ModbusClient().ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity, value) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().ReadWriteMultipleRegisters(readAddress, readQuantity, writeAddress, writeQuantity, value) + }) } func (c *Connection) MaskWriteRegister(address, andMask, orMask uint16) (results []byte, err error) { - c.prepare() - return c.ModbusClient().MaskWriteRegister(address, andMask, orMask) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().MaskWriteRegister(address, andMask, orMask) + }) } func (c *Connection) ReadFIFOQueue(address uint16) (results []byte, err error) { - c.prepare() - return c.ModbusClient().ReadFIFOQueue(address) + return c.exec(func() ([]byte, error) { + return c.ModbusClient().ReadFIFOQueue(address) + }) } diff --git a/util/modbus/log.go b/util/modbus/log.go index 59495eb20..be19a94e8 100644 --- a/util/modbus/log.go +++ b/util/modbus/log.go @@ -12,11 +12,12 @@ type logger struct { logger meters.Logger } -func (l *logger) Logger(logger modbus.Logger) { +func (l *logger) WithLogger(logger modbus.Logger, fun func() ([]byte, error)) ([]byte, error) { l.mu.Lock() defer l.mu.Unlock() l.logger = logger + return fun() } func (l *logger) Printf(format string, v ...interface{}) {