Checkpoint 4

This commit is contained in:
Arti Zirk
2023-07-30 01:03:52 +03:00
parent 172dbcc210
commit 9116635efc
5 changed files with 208 additions and 17 deletions

View File

@@ -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)