From dca442167458a68797a33c25398eaf7ced22a6dd Mon Sep 17 00:00:00 2001 From: uvos Date: Fri, 25 Mar 2022 13:41:02 +0100 Subject: [PATCH] add free memory command add read and write nfc commands fix function sending --- item.h | 2 +- main.cpp | 15 +++++++ mfrc522.cpp | 2 +- mfrc522.h | 6 ++- mfrcproxy.h | 3 +- nfcbord.cpp | 110 ++++++++++++++++++++++++++++++++++++++---------- train.cpp | 4 +- train.h | 2 +- traindispatch.h | 2 +- 9 files changed, 115 insertions(+), 31 deletions(-) diff --git a/item.h b/item.h index d08f73e..49406b3 100644 --- a/item.h +++ b/item.h @@ -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; diff --git a/main.cpp b/main.cpp index cd86948..a23323d 100644 --- a/main.cpp +++ b/main.cpp @@ -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('\"'); diff --git a/mfrc522.cpp b/mfrc522.cpp index fb80011..86d12ba 100644 --- a/mfrc522.cpp +++ b/mfrc522.cpp @@ -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); diff --git a/mfrc522.h b/mfrc522.h index 61eb457..1b5b0d0 100644 --- a/mfrc522.h +++ b/mfrc522.h @@ -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(); diff --git a/mfrcproxy.h b/mfrcproxy.h index 1cfd1b5..2e66f2d 100644 --- a/mfrcproxy.h +++ b/mfrcproxy.h @@ -25,11 +25,12 @@ private: uint8_t _csPin; - uint8_t read(uint8_t addr); public: MfrcProxy(SpiMaster* spi, ShiftReg* 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* csReg, uint8_t csPin); uint8_t getId(); + uint8_t getCs(){return _csPin;} }; diff --git a/nfcbord.cpp b/nfcbord.cpp index 8b08d6b..5173abd 100644 --- a/nfcbord.cpp +++ b/nfcbord.cpp @@ -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; diff --git a/train.cpp b/train.cpp index 4633772..3f910e3 100644 --- a/train.cpp +++ b/train.cpp @@ -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; diff --git a/train.h b/train.h index 07a7303..579992d 100644 --- a/train.h +++ b/train.h @@ -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); diff --git a/traindispatch.h b/traindispatch.h index 0c4dea4..3c25fa3 100644 --- a/traindispatch.h +++ b/traindispatch.h @@ -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");