add free memory command

add read and write nfc commands
fix function sending
This commit is contained in:
uvos 2022-03-25 13:41:02 +01:00
parent 58fe96f8b7
commit dca4421674
9 changed files with 115 additions and 31 deletions

2
item.h
View File

@ -18,7 +18,7 @@ private:
static constexpr unsigned char _pinLowA = PD4;
static constexpr unsigned char _pinHighB = PD2;
static constexpr unsigned char _pinLowB = PD3;
static constexpr uint8_t SEND_COUNT = 1;
static constexpr uint8_t SEND_COUNT = 2;
uint8_t _address;

View File

@ -127,6 +127,13 @@ void restore_state()
}
}
int freeRAM()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start: (int) __brkval);
}
inline static void printHelp(Serial* serial)
{
serial->write_p(PSTR("Available Commands: \n\
@ -157,6 +164,7 @@ inline static void printHelp(Serial* serial)
power on : power on the rail\n\
power auto : power off the rail when no trains are moveing\n\
dump : prints epprom contence\n\
free : show amount of free ram\n\
erase : Erase epprom.\n"));
}
@ -299,6 +307,13 @@ void serialDispatch(Serial* serial)
printHelp(serial);
ret = 0;
}
else if(strcmp(token, "free") == 0)
{
serial->write_p(PSTR("Free Ram: "));
serial->write(freeRAM());
serial->write_p(PSTR(" Bytes.\n"));
ret = 0;
}
else
{
serial->putChar('\"');

View File

@ -79,7 +79,7 @@ void Mfrc522::reset()
write(TReloadRegL, POLL_TIMER & 0x0F);
write(ModWidthReg, 0x26);
write(RFCfgReg, 0b111 << 4); //set gain to 48dB
write(RFCfgReg, 0b01110100); //set gain to 48dB
write(TxAutoReg, 0x40); // Default 0x00. Force a 100 % ASK modulation independent of the ModGsPReg register setting
updateBit(RxModeReg, 3, true);

View File

@ -192,9 +192,11 @@ public:
uint8_t wakeupTag(uint8_t* bufferATQA, uint8_t *bufferLen);
uint8_t selectTag(Uid *uid);
uint8_t getUid(Uid *uid);
uint8_t getCs(){return _csPin;}
void reset();
void irq();

View File

@ -25,11 +25,12 @@ private:
uint8_t _csPin;
uint8_t read(uint8_t addr);
public:
MfrcProxy(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin, void (detectCb)(MfrcProxy* proxy, Uid uid, void* data), void* userData = nullptr);
uint8_t read(uint8_t addr);
void irq();
static bool probe(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin);
uint8_t getId();
uint8_t getCs(){return _csPin;}
};

View File

@ -111,13 +111,13 @@ uint8_t NfcBoard::csToIrq(uint8_t cs)
switch(cs)
{
case 0:
return 3;
return 4;
case 1:
return 2;
case 2:
return 1;
case 3:
return 7;
return 0;
case 4:
return 7;
case 5:
@ -160,9 +160,11 @@ void NfcBoard::printNfcDevices()
serial->write_p(PSTR("NFC DEVICES:\n"));
for(uint8_t i = 0; i < readers.count(); ++i)
{
snprintf_P(buffer, SNPRINTF_BUFFER_SIZE, PSTR("NFC NUMBER: %u IRQ: %x TYPE: %d\n"),
readers[i].type == TYPE_MFRC522 ? i+0x80 : readers[i].device.proxy.getId(),
irqPins[i], readers[i].type);
uint8_t id = readers[i].type == TYPE_MFRC522 ? i+0x80 : readers[i].device.proxy.getId();
uint8_t cs = readers[i].type == TYPE_MFRC522 ?
readers[i].device.mfrc522.getCs() : readers[i].device.proxy.getCs();
snprintf_P(buffer, SNPRINTF_BUFFER_SIZE, PSTR("NFC NUMBER: %u CS: %x IRQ: %x TYPE: %d\n"),
id, cs, irqPins[i], readers[i].type);
serial->write(buffer, SNPRINTF_BUFFER_SIZE);
}
}
@ -189,8 +191,6 @@ int NfcBoard::dispatch(char* inBuffer)
}
else if(strcmp(inBuffer, "irqs") == 0 )
{
PCMSK1 &= ~(1 << PCINT11);
PCICR &= ~(1 << PCIE1);
serial->write_p(PSTR("Irq pin detection test\n"));
while(!serial->dataIsWaiting())
{
@ -206,8 +206,6 @@ int NfcBoard::dispatch(char* inBuffer)
}
}
serial->write_p(PSTR("Finished\n"));
PCMSK1 |= 1 << PCINT11;
PCICR |= 1 << PCIE1;
return 0;
}
else if(strcmp(inBuffer, "select") == 0 )
@ -317,9 +315,66 @@ int NfcBoard::dispatch(char* inBuffer)
}
else if(strcmp(inBuffer, "read") == 0 )
{
char* token = strtok(NULL, " ");
int16_t addr = -1;
int16_t csPin = -1;
char* token = strtok(NULL, " ");
if(token)
csPin = strtol(token, nullptr, 16);
if(csPin < 0 || csPin > 7)
{
serial->write_p(PSTR("A valid cs pin must be specified\n"));
return -1;
}
token = strtok(NULL, " ");
if(token)
addr = strtol(token, nullptr, 16);
if(addr < 0 || addr > 0xFF)
{
serial->write_p(PSTR("A address must be specified\n"));
return -1;
}
uint8_t result = 0;
for(uint8_t i = 0; i < readers.count(); ++i)
{
if(readers[i].type == TYPE_MFRC522)
{
if(readers[i].device.mfrc522.getCs() == csPin)
{
result = readers[i].device.mfrc522.read(addr);
serial->write_p(PSTR("read sucessfull\n"));
}
}
else
{
if(readers[i].device.proxy.getCs() == csPin)
{
result = readers[i].device.proxy.read(addr);
serial->write_p(PSTR("read sucessfull\n"));
}
}
}
snprintf_P(buffer, SNPRINTF_BUFFER_SIZE, PSTR("Got: 0x%02x in return\n"), result);
serial->write(buffer, SNPRINTF_BUFFER_SIZE);
return 0;
}
else if(strcmp(inBuffer, "write") == 0 )
{
int16_t addr = -1;
int16_t csPin = -1;
int16_t data = -1;
char* token = strtok(NULL, " ");
if(token)
csPin = strtol(token, nullptr, 16);
if(csPin < 0 || csPin > 7)
{
serial->write_p(PSTR("A valid cs pin must be specified\n"));
return -1;
}
token = strtok(NULL, " ");
if(token)
addr = strtol(token, nullptr, 16);
if(addr < 0 || addr > 0xFF)
@ -329,21 +384,32 @@ int NfcBoard::dispatch(char* inBuffer)
}
token = strtok(NULL, " ");
if(token)
csPin = strtol(token, nullptr, 16);
if(csPin < 0 || csPin > 7)
data = strtol(token, nullptr, 16);
if(data < 0 || data > 0xFF)
{
serial->write_p(PSTR("A valid cs pin must be specified\n"));
serial->write_p(PSTR("Data must be specified\n"));
return -1;
}
csReg.setBit(csPin, false);
_delay_us(5);
spim.readWrite(addr);
_delay_us(5);
uint8_t result = spim.readWrite();
csReg.setBit(csPin, true);
serial->write_p(PSTR("Got: "));
serial->write((int)result);
serial->write_p(PSTR(" in return\n"));
for(uint8_t i = 0; i < readers.count(); ++i)
{
if(readers[i].type == TYPE_MFRC522)
{
if(readers[i].device.mfrc522.getCs() == csPin)
{
readers[i].device.mfrc522.write(addr, data);
serial->write_p(PSTR("Write sucessfull\n"));
}
}
else
{
if(readers[i].device.proxy.getCs() == csPin)
{
serial->write_p(PSTR("Mfrc522 proxies are not writable\n"));
return -1;
}
}
}
return 0;
}
return -3;

View File

@ -144,7 +144,7 @@ void Train::sendData(bool single)
if(_functionmask & (1 << functionToResend))
{
_delay_ms(2);
sendRaw(packetAddSpeed() | packetAddFunction(functionToResend) | packetAddFunction(0), single);
sendRaw(packetAddSpeed() | packetAddFunction(functionToResend) | packetAddFunction(0), false);
}
_function &= ~0xF0;
_function |= functionToResend << 4;
@ -174,7 +174,7 @@ uint8_t Train::getFunctionMask()
return _functionmask;
}
void Train::sendFunction(const uint8_t function, bool enable)
void Train::setFunction(const uint8_t function, bool enable)
{
if(function > 3)
return;

View File

@ -34,7 +34,7 @@ public:
void setFunctionMask(uint8_t functionmask) {_functionmask = functionmask;}
uint8_t getFunctions();
uint8_t getFunctionMask();
void sendFunction(const uint8_t function, bool enable = true);
void setFunction(const uint8_t function, bool enable = true);
uint8_t getQuirks();
void setQuirks(uint8_t quirks);

View File

@ -103,7 +103,7 @@ int trainDispatch(char* inBuffer, Serial* serial)
{
uint8_t functionId = atoi(token);
bool on = (strcmp(boolToken, "on") == 0);
trains[id].sendFunction(functionId, on );
trains[id].setFunction(functionId, on );
serial->write_p(PSTR("Set Train function "));
serial->write(functionId);
serial->write(on ? " on\n" : " off\n");