diff options
| author | Kevin Wallace <kevin@pentabarf.net> | 2026-04-26 08:18:53 -0700 |
|---|---|---|
| committer | Kevin Wallace <kevin@pentabarf.net> | 2026-04-26 08:18:53 -0700 |
| commit | 1c8205cff6432248212a160a7a86b8c896dd2a8d (patch) | |
| tree | c2b33124837881e20becce13285c3b5a9a2a183b /cmd/orca | |
| parent | wait for cvend at startup, only redraw on state changes (diff) | |
cvend wip
Diffstat (limited to 'cmd/orca')
| -rw-r--r-- | cmd/orca/display.go | 4 | ||||
| -rw-r--r-- | cmd/orca/main.go | 61 |
2 files changed, 44 insertions, 21 deletions
diff --git a/cmd/orca/display.go b/cmd/orca/display.go index 5bd4f87..7eaf778 100644 --- a/cmd/orca/display.go +++ b/cmd/orca/display.go @@ -102,7 +102,9 @@ func drawDisplay(img draw.Image, s displayState) { drawText(img, notoSans_Regular, 16, justifyCenter, color.White, fixed.P(400, 25), "V1234567-D98765") draw.Draw(img, orcaImg.Bounds().Add(image.Point{400 - orcaImg.Bounds().Dx()/2, 75}), orcaImg, image.Point{}, draw.Over) if s.cvend.ready { - drawText(img, notoSans_Bold, 48, justifyCenter, color.White, fixed.P(400, 330), "Tap below") + if !s.cvend.hasCard { + drawText(img, notoSans_Bold, 48, justifyCenter, color.White, fixed.P(400, 330), "Tap below") + } draw.Draw(img, belowImg.Bounds().Add(image.Point{400 - belowImg.Bounds().Dx()/2, 380}), belowImg, image.Point{}, draw.Over) } } 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 } } |