package main

import (
	"fmt"
	"os"
	"time"
)

func main() {
	f, err := os.Open("/dev/nfc_dev")
	if err != nil {
		fmt.Fprintf(os.Stderr, "open /dev/nfc_dev failed: %v\n", err)
		os.Exit(1)
	}
	defer f.Close()

	fmt.Println("NFC test started, waiting for card...")

	buf := make([]byte, 256)
	for {
		n, err := f.Read(buf)
		if err != nil {
			fmt.Fprintf(os.Stderr, "read error: %v\n", err)
			continue
		}
		if n < 4 {
			fmt.Printf("short read: %d bytes\n", n)
			continue
		}

		datatype := buf[0]
		status := buf[1]
		dataLen := int(buf[2])<<8 | int(buf[3])
		if n < 4+dataLen {
			dataLen = n - 4
		}
		data := buf[4 : 4+dataLen]

		ts := time.Now().Format("15:04:05.000")
		switch datatype {
		case 1:
			fmt.Printf("[%s] ATQA  (type=1 status=%d len=%d): %02X %02X\n",
				ts, status, dataLen, data[0], data[1])
		case 2:
			fmt.Printf("[%s] SAK   (type=2 status=%d len=%d): %02X\n",
				ts, status, dataLen, data[0])
		case 0:
			uidStr := ""
			for i, b := range data {
				if i > 0 {
					uidStr += " "
				}
				uidStr += fmt.Sprintf("%02X", b)
			}
			fmt.Printf("[%s] UID   (type=0 status=%d len=%d): %s\n",
				ts, status, dataLen, uidStr)
		default:
			hexStr := ""
			for i, b := range data {
				if i > 0 {
					hexStr += " "
				}
				hexStr += fmt.Sprintf("%02X", b)
			}
			fmt.Printf("[%s] UNKNOWN (type=%d status=%d len=%d): %s\n",
				ts, datatype, status, dataLen, hexStr)
		}
	}
}
