#pragma once #include "placementnew.h" #include "serial.h" #include "shiftreg.h" #include "inputshiftreg.h" #include "mfrc522.h" #include "softspim.h" #include "staticvector.h" #include "defines.h" #include "mfrcproxy.h" class NfcBoard { private: static constexpr int TYPE_MFRC522 = 0; static constexpr int TYPE_PROXY = 1; union PortDevice { Mfrc522 mfrc522; MfrcProxy proxy; PortDevice(const Mfrc522& mfrc522In) { new (&mfrc522) Mfrc522(mfrc522In); } PortDevice(const MfrcProxy& proxyIn) { new (&proxy) MfrcProxy(proxyIn); } }; struct NfcPort { PortDevice device; uint8_t type; NfcPort(const Mfrc522& mfrc522): device(mfrc522) { type = TYPE_MFRC522; } NfcPort(const MfrcProxy& proxy): device(proxy) { type = TYPE_PROXY; } ~NfcPort() { if(type == TYPE_MFRC522) device.mfrc522.~Mfrc522(); else device.proxy.~MfrcProxy(); } }; Serial* serial; SpiMaster spim; ShiftReg csReg; bool enabled_ = false; static void printTag(const uint8_t id, const Uid& uid, Serial* serial); public: InputShiftReg irqReg; SVector irqPins; SVector readers; SVector watchDogBits; static void detectCb(Mfrc522* reader, void* data); static void timeoutCb(uint8_t ret, Mfrc522* reader, uint8_t* response, uint8_t responseLen, void* userData); static void proxyDetectCb(MfrcProxy* proxy, const Uid uid, void* data); NfcBoard(Serial* serialIn); void probe(); void setEnabled(bool enabled); void poll(Serial* serial = nullptr); void printNfcDevices(); int dispatch(char* inBuffer); uint8_t csToIrq(uint8_t cs); }; extern NfcBoard nfcBoard;