diff options
Diffstat (limited to 'cmd/orca/main.go')
| -rw-r--r-- | cmd/orca/main.go | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/cmd/orca/main.go b/cmd/orca/main.go index f840d22..a068617 100644 --- a/cmd/orca/main.go +++ b/cmd/orca/main.go @@ -1,6 +1,7 @@ package main import ( + "encoding/hex" "flag" "image" "log" @@ -9,11 +10,11 @@ import ( "pm3.dev/cvend" "pm3.dev/fb" - "pm3.dev/ipp" ) type cvendState struct { - ready bool + ready bool + hasCard bool } type displayState struct { @@ -61,14 +62,14 @@ func wallTicker(d time.Duration) *time.Ticker { return ticker } -func displayTask(stateCh <-chan displayState) { +func displayTask(in <-chan displayState) { fb, err := fb.Open() if err != nil { log.Fatalf("open fb: %v", err) } defer fb.Close() - for state := range stateCh { + for state := range in { start := time.Now() img := image.NewRGBA(fb.Bounds()) drawDisplay(img, state) @@ -81,24 +82,44 @@ func displayTask(stateCh <-chan displayState) { func cvendTask(out chan<- cvendState) { var state cvendState - var cv ipp.Session - var err error - cv, err = cvend.OpenIPP(func(msgType byte, msgData []byte) { - switch msgType { - case 0x05: // StatusReply - if !state.ready { - state.ready = true - out <- state - } - default: - cvend.LogIPP(msgType, msgData) - } - }) + cv, err := cvend.Open() + if err != nil { + log.Fatalf("cvend Open: %s", err) + } + status, err := cv.AwaitStatus() + if err != nil { + log.Fatalf("cvend AwaitStatus: %s", err) + } + log.Printf("cvend status: %q", string(status)) + reply, err := cv.ProxCardFunction(7, true) if err != nil { - panic(err) + log.Fatalf("cvend ProxCardFunction: %s", err) } + log.Printf("enabled DESFire %s", hex.EncodeToString(reply)) + state.ready = true + out <- state + go func() { // send periodic status requests to keep cvend from going to sleep + for { + time.Sleep(30 * time.Second) + if err := cv.SendIPP(0x04, nil); err != nil { + log.Printf("failed to send Status: %s", err) + } + } + }() + for { - cv.SendIPP(0x04, nil) // Status - time.Sleep(1 * time.Second) + cardRaw, err := cv.AwaitCard() + if err != nil { + log.Println("error awaiting card: %s", err) + continue + } + card := cardRaw.(*cvend.DESFireCard) // todo other types + log.Println("got card %+v", card) + state.hasCard = true + out <- state + card.AwaitRemoved() + log.Println("card removed") + state.hasCard = false + out <- state } } |