summaryrefslogtreecommitdiff
path: root/cmd/orca/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/orca/main.go')
-rw-r--r--cmd/orca/main.go61
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
}
}