Checkpoint 4
This commit is contained in:
59
godoor.go
59
godoor.go
@@ -31,6 +31,7 @@ type cardList struct {
|
||||
AllowedUids []struct {
|
||||
Token card `json:"token"`
|
||||
} `json:"allowed_uids"`
|
||||
KeepOpenUntil *time.Time `json:"keep_open_until,omitempty"`
|
||||
}
|
||||
|
||||
type ValidUids map[string]bool // bool has no meaning
|
||||
@@ -48,10 +49,16 @@ type Config struct {
|
||||
}
|
||||
}
|
||||
|
||||
type KeepDoorOpen struct {
|
||||
until time.Time
|
||||
timer *time.Timer
|
||||
}
|
||||
|
||||
var config Config
|
||||
var globalLock sync.Mutex
|
||||
var validUids ValidUids
|
||||
var wiegand Wiegand
|
||||
var keepDoorOpen KeepDoorOpen
|
||||
|
||||
func main() {
|
||||
|
||||
@@ -83,6 +90,9 @@ func setup() {
|
||||
|
||||
if config.mock {
|
||||
log.Println("MOCK mode enabled")
|
||||
if config.door == "" {
|
||||
config.door = "mockdoor"
|
||||
}
|
||||
wiegand = &WiegandMock{}
|
||||
} else {
|
||||
wiegand = WiegandSetup(wiegand_a, wiegand_b, wiegand_bit_timeout, solenoid)
|
||||
@@ -122,6 +132,12 @@ func OpenAndCloseDoor(w Wiegand) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if keepDoorOpen.until.After(time.Now().Add(5 * time.Second)) {
|
||||
fmt.Println("Door is already open")
|
||||
return nil
|
||||
}
|
||||
|
||||
fmt.Println("Door is now open")
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
@@ -146,16 +162,17 @@ func cardRunner(w Wiegand) {
|
||||
hashedHex := hashCardUid(card)
|
||||
log.Println(hashedHex)
|
||||
|
||||
globalLock.Lock()
|
||||
ok := validUids[hashedHex]
|
||||
globalLock.Unlock()
|
||||
|
||||
go func() {
|
||||
err := sendSwipeEvent(hashedHex)
|
||||
err := sendSwipeEvent(hashedHex, ok)
|
||||
if err != nil {
|
||||
log.Println("Failed to send swipe event: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
globalLock.Lock()
|
||||
ok := validUids[hashedHex]
|
||||
globalLock.Unlock()
|
||||
if ok {
|
||||
log.Println("Opening door")
|
||||
err := OpenAndCloseDoor(w)
|
||||
@@ -266,14 +283,46 @@ func reloadTokens() error {
|
||||
validUids[val.Token.UidHash] = true
|
||||
}
|
||||
|
||||
if cl.KeepOpenUntil != nil {
|
||||
updateKeepOpenDoor(*cl.KeepOpenUntil)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func sendSwipeEvent(cardUidHash string) error {
|
||||
func updateKeepOpenDoor(newKeepOpenTime time.Time) {
|
||||
|
||||
// is there one active?
|
||||
if keepDoorOpen.timer != nil {
|
||||
keepDoorOpen.timer.Stop()
|
||||
keepDoorOpen = KeepDoorOpen{}
|
||||
}
|
||||
|
||||
if newKeepOpenTime.After(time.Now()) {
|
||||
log.Printf("Keeping door open until %v", newKeepOpenTime)
|
||||
wiegand.OpenDoor()
|
||||
timer := time.AfterFunc(time.Until(newKeepOpenTime), handleKeepDoorOpenCloseCleanup)
|
||||
keepDoorOpen = KeepDoorOpen{
|
||||
timer: timer,
|
||||
until: newKeepOpenTime,
|
||||
}
|
||||
} else {
|
||||
wiegand.CloseDoor()
|
||||
}
|
||||
}
|
||||
|
||||
func handleKeepDoorOpenCloseCleanup() {
|
||||
fmt.Println("Keep door open time is reached!")
|
||||
wiegand.CloseDoor()
|
||||
keepDoorOpen = KeepDoorOpen{}
|
||||
}
|
||||
|
||||
func sendSwipeEvent(cardUidHash string, success bool) error {
|
||||
swipeEvent := map[string]string{
|
||||
"uid_hash": cardUidHash,
|
||||
"door": config.door,
|
||||
"timestamp": time.Now().Format(time.DateTime),
|
||||
"success": fmt.Sprint(success),
|
||||
}
|
||||
|
||||
data, err := json.Marshal(swipeEvent)
|
||||
|
||||
Reference in New Issue
Block a user