Files
MarklinController/nfcbord.cpp
2022-03-09 17:03:36 +01:00

125 lines
2.7 KiB
C++

#include "nfcbord.h"
#include <avr/io.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "writepin.h"
extern char buffer[SNPRINTF_BUFFER_SIZE];
NfcBoard::NfcBoard():
csReg(&PORTC, PC1, PC2, PC0),
irqReg(&PORTC, &PINB, PC5, PB1, PC4)
{
DDRC = (1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC4) | (1 << PC5);
DDRB = (1 << PB4) | (1 << PB3);
csReg.clear(true);
probe();
}
void NfcBoard::probe()
{
readers.clear();
irqPins.clear();
for(uint8_t i = 0; i < NFC_PORTS; ++i)
{
if(Mfrc522::probe(&spim, &csReg, i))
{
irqPins.push_back(i);
}
}
for(uint8_t i = 0; i < irqPins.count(); ++i)
{
readers.push_back(Mfrc522(&spim, &csReg, irqPins[i]));
}
}
void NfcBoard::printNfcDevices(Serial* serial)
{
serial->write_p(PSTR("NFC DEVICES:\n"));
for(uint8_t i = 0; i < readers.count(); ++i)
{
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "NFC NUMBER: %u IRQ: %x\n", i, irqPins[i]);
serial->write(buffer, SNPRINTF_BUFFER_SIZE);
}
}
int NfcBoard::dispatch(char* inBuffer, Serial* serial)
{
else if(strcmp(inBuffer, "detect") == 0 )
{
serial->write_p(PSTR("Runing tag detection test\n"));
bool oldPresent = false;
while(!serial->dataIsWaiting())
{
bool present = readers[0].cardPresent();
if(present && !oldPresent)
{
oldPresent = present;
Mfrc522::Uid uid;
//Mfrc522::serial = serial;
uint8_t res = readers[0].selectTag(&uid);
Mfrc522::serial = nullptr;
if(res != 0)
{
serial->write_p(PSTR("Select Failed with "));
serial->write((int)res);
serial->putChar('\n');
continue;
}
serial->write_p(PSTR("Uid: "));
for(uint8_t i = 0; i < uid.size; ++i)
{
serial->write((int)uid.uidByte[i]);
serial->putChar(':');
}
serial->putChar('\n');
break;
}
else if(!present && oldPresent)
{
serial->write_p(PSTR("Tag lost\n"));
oldPresent = present;
}
_delay_ms(100);
}
serial->write_p(PSTR("Finished\n"));
return 0;
}
else if(strcmp(inBuffer, "tste") == 0 )
{
serial->write_p(PSTR("Runing fifo test\n"));
Mfrc522::serial = serial;
readers[0].testFifo();
Mfrc522::serial = nullptr;
serial->write_p(PSTR("Finished\n"));
return 0;
}
else if(strcmp(inBuffer, "status") == 0 )
{
printNfcDevices(serial);
return 0;
}
else if(strcmp(inBuffer, "wake") == 0 )
{
uint8_t bufferATQA[2];
uint8_t len = sizeof(bufferATQA);
uint8_t res = readers[0].wakeupTag(bufferATQA, &len);
snprintf(buffer, SNPRINTF_BUFFER_SIZE, "wakeupTag returned: %u Buffer: 0x%x 0x%x len %u\n",
res, bufferATQA[0], bufferATQA[1], len);
serial->write(buffer, SNPRINTF_BUFFER_SIZE);
return 0;
}
else if(strcmp(inBuffer, "probe") == 0 )
{
probe();
printNfcDevices(serial);
return 0;
}
return -3;
}