Files
MarklinController/nfcbord.h
2022-03-21 21:22:18 +01:00

87 lines
1.7 KiB
C++

#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<NFC_PORTS> csReg;
bool enabled_ = false;
static void printTag(const uint8_t id, const Uid& uid, Serial* serial);
public:
InputShiftReg<NFC_PORTS> irqReg;
SVector<uint8_t, NFC_PORTS> irqPins;
SVector<NfcPort, NFC_PORTS> readers;
SVector<volatile uint8_t, NFC_PORTS> 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;