From 25eab0dc756bfd98fab1d8054f33a34d8bf84fe0 Mon Sep 17 00:00:00 2001 From: yurii Date: Fri, 25 Jul 2025 17:36:08 +0100 Subject: [PATCH] added check if the room exists --- lockserver/saltolockserver.go | 41 ++++++++++++++++++++++++++--------- main.go | 6 ++--- release notes.md | 3 +++ 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/lockserver/saltolockserver.go b/lockserver/saltolockserver.go index b4f784c..33ef8c3 100644 --- a/lockserver/saltolockserver.go +++ b/lockserver/saltolockserver.go @@ -77,6 +77,8 @@ func (lock *SaltoLockServer) BuildCommand(req DoorCardRequest, checkIn, checkOut // LockSequence performs the full ENQ/ACK handshake and command exchange func (lock *SaltoLockServer) LockSequence(conn net.Conn) error { + log.Infof("Sending command: %q", string(lock.command)) + const timeout = 10 * time.Second reader := bufio.NewReader(conn) @@ -96,7 +98,7 @@ func (lock *SaltoLockServer) LockSequence(conn net.Conn) error { return fmt.Errorf("expected ACK after ENQ, got 0x%X", b) } - // 3. Send the command frame + // 3. Send command frame if _, err := conn.Write(lock.command); err != nil { return fmt.Errorf("failed to send command frame: %w", err) } @@ -113,18 +115,37 @@ func (lock *SaltoLockServer) LockSequence(conn net.Conn) error { return fmt.Errorf("expected ACK to command, got 0x%X", b) } - // 5. Read response: expect STX + // 5. Expect STX conn.SetReadDeadline(time.Now().Add(timeout)) - b, err = reader.ReadByte() + stx, err := reader.ReadByte() if err != nil { - return fmt.Errorf("error reading response STX: %w", err) + return fmt.Errorf("error reading STX: %w", err) } - if b != STX { - return fmt.Errorf("expected STX at response start, got 0x%X", b) + if stx != STX { + return fmt.Errorf("expected STX, got 0x%X", stx) + } + conn.SetReadDeadline(time.Now().Add(timeout)) + _ , err = reader.ReadByte() + if err != nil { + return fmt.Errorf("error reading separator after STX: %w", err) } - // 6. Read until ETX - var resp []byte + // 6. Read next two bytes and check for TD error + conn.SetReadDeadline(time.Now().Add(timeout)) + b1, err := reader.ReadByte() + if err != nil { + return fmt.Errorf("error reading first response byte: %w", err) + } + b2, err := reader.ReadByte() + if err != nil { + return fmt.Errorf("error reading second response byte: %w", err) + } + if b1 == 'T' && b2 == 'D' { + return fmt.Errorf("lock response indicates room does not exist (TD)") + } + + // 7. Continue reading until ETX + resp := []byte{b1, b2} for { conn.SetReadDeadline(time.Now().Add(timeout)) c, err := reader.ReadByte() @@ -137,7 +158,7 @@ func (lock *SaltoLockServer) LockSequence(conn net.Conn) error { } } - // 7. (Optional) Read LRC or final CR + // 8. Optional: read LRC or trailing byte conn.SetReadDeadline(time.Now().Add(timeout)) if lrc, err := reader.ReadByte(); err == nil { resp = append(resp, lrc) @@ -145,6 +166,6 @@ func (lock *SaltoLockServer) LockSequence(conn net.Conn) error { log.Warnf("LockSequence: failed to read trailing LRC/CR: %v", err) } - log.Infof("LockSequence: received response: % X", resp) + log.Infof("LockSequence: received response: %q", string(resp)) return nil } diff --git a/main.go b/main.go index 8ac61f6..f5c604e 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,7 @@ import ( ) const ( - buildVersion = "1.0.6" + buildVersion = "1.0.7" serviceName = "hardlink" customLayout = "2006-01-02 15:04:05 -0700" transactionUrl = "http://127.0.0.1:18181/start-transaction/" @@ -46,7 +46,7 @@ type configRec struct { DispenserAdrr string `yaml:"dispensAddr"` PrinterName string `yaml:"printerName"` LogDir string `yaml:"logdir"` - isPayment bool `yaml:"isPayment"` + IsPayment bool `yaml:"isPayment"` } // App holds shared resources. @@ -113,7 +113,7 @@ func main() { // } // defer db.Close() - if config.isPayment { + if config.IsPayment { startClient := func() (*exec.Cmd, error) { cmd := exec.Command("./ChipDNAClient/ChipDnaClient.exe") err := cmd.Start() diff --git a/release notes.md b/release notes.md index 4d00431..442b1d1 100644 --- a/release notes.md +++ b/release notes.md @@ -2,6 +2,9 @@ builtVersion is a const in main.go +#### 1.0.7 - 25 July 2024 +added check if the room exists + #### 1.0.6 - 25 July 2024 updated workflow for Salto locks