From afcbe0658154648c666f785c082aa7fdd35c6496 Mon Sep 17 00:00:00 2001 From: Jarno Rankinen Date: Thu, 9 Mar 2023 22:05:46 +0200 Subject: [PATCH] gh-24Rework of the locking mechanisms. The bug causinga deadlock was probably caused by locking bebefore calling another function that also tries to acquire the lock... --- enervent-ctrl-go/pingvinKL/pingvinKL.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/enervent-ctrl-go/pingvinKL/pingvinKL.go b/enervent-ctrl-go/pingvinKL/pingvinKL.go index bb6b86d..cdb5f51 100644 --- a/enervent-ctrl-go/pingvinKL/pingvinKL.go +++ b/enervent-ctrl-go/pingvinKL/pingvinKL.go @@ -175,7 +175,9 @@ func (p *PingvinKL) Quit() { // Update all coil values func (p *PingvinKL) updateCoils() { + p.buslock.Lock() results, err := p.modbusclient.ReadCoils(0, uint16(len(p.Coils))) + p.buslock.Unlock() if err != nil { log.Fatal("updateCoils: client.ReadCoils: ", err) } @@ -201,7 +203,9 @@ func (p *PingvinKL) updateCoils() { // Read a single holding register, stores value in p.Registers // Returns integer value of register func (p *PingvinKL) ReadRegister(addr uint16) (int, error) { + p.buslock.Lock() results, err := p.modbusclient.ReadHoldingRegisters(addr, 1) + p.buslock.Unlock() if err != nil { log.Println("ERROR: ReadRegister:", err) return 0, err @@ -218,7 +222,9 @@ func (p *PingvinKL) ReadRegister(addr uint16) (int, error) { // Update a single holding register func (p *PingvinKL) WriteRegister(addr uint16, value uint16) (uint16, error) { + p.buslock.Lock() _, err := p.modbusclient.WriteSingleRegister(addr, value) + p.buslock.Unlock() if err != nil { log.Println("ERROR: WriteRegister:", err) return 0, err @@ -249,7 +255,9 @@ func (p *PingvinKL) updateRegisters() { results := []byte{} for retries := 0; retries < 5; retries++ { p.Debug.Println("Reading registers, attempt", retries, "k:", k) + p.buslock.Lock() results, err = p.modbusclient.ReadHoldingRegisters(uint16(k), uint16(r)) + p.buslock.Unlock() if len(results) > 0 { break } else if retries == 4 {