From be22e89f66d1485be527128842eeb922214716ea Mon Sep 17 00:00:00 2001 From: Arti Zirk Date: Sun, 3 Apr 2022 16:50:21 +0300 Subject: [PATCH] Read many cards --- godoor.go | 58 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/godoor.go b/godoor.go index a92c544..093f538 100644 --- a/godoor.go +++ b/godoor.go @@ -6,16 +6,19 @@ import "github.com/warthog618/gpiod" const wiegand_a = 17 const wiegand_b = 18 +const wiegand_bit_timeout = time.Millisecond * 8 const solenoid = 21 var bits [64]bool var card uint64 = 0 var bitnr uint64 = 0 +var timeout *time.Timer func openDoor(l *gpiod.Line) { fmt.Println("Open") l.SetValue(1) - time.Sleep(500000000) + d, _ := time.ParseDuration("500ms") + time.Sleep(d) l.SetValue(0) fmt.Println("Close") } @@ -28,20 +31,33 @@ func printCardId() { fmt.Printf("\n") } -func cardEvent() { - for i := 63; i != 0; i-- { - if bits[i] == true { - card |= 1 << (63 - i) +func cardRunner() { + for { + // Wait for bit timeout + fmt.Printf("Waiting for bit timeout\n") + <-timeout.C + fmt.Printf("\n") + + if bitnr != 64 { + fmt.Printf("We got less than 64 bits: %d\n", bitnr) } + + for i := 63; i != 0; i-- { + if bits[i] == true { + card |= 1 << (63 - i) + } + } + + printCardId() + + bitnr = 0 + card = 0 } - - printCardId() - - bitnr = 0 - card = 0 } func wiegandEvent(evt gpiod.LineEvent) { + timeout.Reset(wiegand_bit_timeout) + if evt.Offset == wiegand_b { bits[bitnr] = true fmt.Printf("1") @@ -49,16 +65,16 @@ func wiegandEvent(evt gpiod.LineEvent) { bits[bitnr] = false fmt.Printf("0") } + bitnr += 1 - - if bitnr == 64 { - fmt.Printf("\n") - cardEvent() - } - } func main() { + timeout = time.NewTimer(wiegand_bit_timeout) + if !timeout.Stop() { + <-timeout.C + } + wa, err := gpiod.RequestLine("gpiochip0", wiegand_a, gpiod.AsInput, gpiod.WithFallingEdge, gpiod.WithEventHandler(wiegandEvent)) if err != nil { @@ -75,9 +91,15 @@ func main() { panic(err) } - openDoor(solenoid_line) + //openDoor(solenoid_line) + _ = solenoid_line + go cardRunner() + fmt.Printf("Sleeping\n") - time.Sleep(time.Minute) + for { + time.Sleep(time.Second) + fmt.Printf(".") + } wa.Close() wb.Close() fmt.Println("Done")