From ca998295ae9b83f257d36c2ca2a3cd913e0c7d6f Mon Sep 17 00:00:00 2001 From: Rennan Cockles Date: Thu, 31 Oct 2024 15:04:46 -0300 Subject: [PATCH] add chameleon LF scan and full scan (HF+LF) --- src/modules/rfid/chameleon.cpp | 65 ++++++++++++++++++++++++++++------ src/modules/rfid/chameleon.h | 17 +++++++-- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/modules/rfid/chameleon.cpp b/src/modules/rfid/chameleon.cpp index 16fe8546d..5d4ee5e79 100644 --- a/src/modules/rfid/chameleon.cpp +++ b/src/modules/rfid/chameleon.cpp @@ -18,7 +18,7 @@ Chameleon::Chameleon() { Chameleon::~Chameleon() { if (_scanned_set.size() > 0) { - saveHFScanResult(); + saveScanResult(); _scanned_set.clear(); _scanned_tags.clear(); } @@ -83,9 +83,16 @@ void Chameleon::loop() { factoryReset(); break; + case FULL_SCAN_MODE: + fullScanTags(); + break; + case LF_READ_MODE: readLFTag(); break; + case LF_SCAN_MODE: + scanLFTags(); + break; case LF_CLONE_MODE: cloneLFTag(); break; @@ -151,9 +158,11 @@ void Chameleon::selectMode() { options.push_back({"LF Save file", [=]() { setMode(LF_SAVE_MODE); }}); } options.push_back({"LF Read", [=]() { setMode(LF_READ_MODE); }}); + options.push_back({"LF Scan", [=]() { setMode(LF_SCAN_MODE); }}); options.push_back({"LF Load file", [=]() { setMode(LF_LOAD_MODE); }}); options.push_back({"LF Custom UID", [=]() { setMode(LF_CUSTOM_UID_MODE); }}); + options.push_back({"Full Scan", [=]() { setMode(FULL_SCAN_MODE); }}); options.push_back({"Factory Reset", [=]() { setMode(FACTORY_RESET_MODE); }}); delay(200); @@ -167,8 +176,8 @@ void Chameleon::setMode(AppMode mode) { displayBanner(); - if (_scanned_set.size()>0) { - saveHFScanResult(); + if (_scanned_set.size() > 0) { + saveScanResult(); _scanned_set.clear(); _scanned_tags.clear(); } @@ -181,7 +190,9 @@ void Chameleon::setMode(AppMode mode) { _lf_read_uid = false; _hf_read_uid = false; break; + case LF_SCAN_MODE: case HF_SCAN_MODE: + case FULL_SCAN_MODE: _scanned_set.clear(); _scanned_tags.clear(); break; @@ -233,11 +244,19 @@ void Chameleon::displayBanner() { padprintln(" FACTORY RESET"); padprintln(" -------------"); break; + case FULL_SCAN_MODE: + padprintln(" FULL SCAN MODE"); + padprintln(" --------------"); + break; case LF_READ_MODE: padprintln(" LF READ MODE"); padprintln(" ------------"); break; + case LF_SCAN_MODE: + padprintln(" LF SCAN MODE"); + padprintln(" ------------"); + break; case LF_CLONE_MODE: padprintln(" LF CLONE MODE"); padprintln(" -------------"); @@ -309,10 +328,10 @@ void Chameleon::dumpHFCardDetails() { } -void Chameleon::dumpHFScanResults() { +void Chameleon::dumpScanResults() { for (int i = _scanned_tags.size(); i > 0; i--) { if (_scanned_tags.size() > 5 && i <= _scanned_tags.size()-5) return; - padprintln(String(i) + ": " + _scanned_tags[i-1]); + padprintln(String(i) + ": " + _scanned_tags[i-1].tagType + " | " + _scanned_tags[i-1].uid); } } @@ -409,6 +428,24 @@ void Chameleon::readLFTag() { } +void Chameleon::scanLFTags() { + if (!chmUltra.cmdLFRead()) return; + + formatLFUID(); + + if (_scanned_set.find(printableLFUID) == _scanned_set.end()) { + Serial.println("New LF tag found: " + printableLFUID); + _scanned_set.insert(printableLFUID); + _scanned_tags.push_back({"LF", printableLFUID}); + } + + displayBanner(); + dumpScanResults(); + + delay(200); +} + + void Chameleon::cloneLFTag() { if (!chmUltra.cmdLFRead()) return; @@ -624,13 +661,13 @@ void Chameleon::scanHFTags() { formatHFData(); if (_scanned_set.find(printableHFUID.uid) == _scanned_set.end()) { - Serial.println("New tag found: " + printableHFUID.uid); + Serial.println("New HF tag found: " + printableHFUID.uid); _scanned_set.insert(printableHFUID.uid); - _scanned_tags.push_back(printableHFUID.uid); + _scanned_tags.push_back({"HF", printableHFUID.uid}); } displayBanner(); - dumpHFScanResults(); + dumpScanResults(); delay(200); } @@ -1104,7 +1141,7 @@ void Chameleon::parseHFData() { } -void Chameleon::saveHFScanResult() { +void Chameleon::saveScanResult() { FS *fs; if(!getFsStorage(fs)) return; @@ -1125,11 +1162,17 @@ void Chameleon::saveHFScanResult() { } file.println("Filetype: Bruce RFID Scan Result"); - for (String uid : _scanned_tags) { - file.println(uid); + for (ScanResult scanResult : _scanned_tags) { + file.println(scanResult.tagType + " | " + scanResult.uid); } file.close(); delay(100); return; } + + +void Chameleon::fullScanTags() { + scanLFTags(); + scanHFTags(); +} diff --git a/src/modules/rfid/chameleon.h b/src/modules/rfid/chameleon.h index cf282e6ee..8b21f7664 100644 --- a/src/modules/rfid/chameleon.h +++ b/src/modules/rfid/chameleon.h @@ -24,11 +24,17 @@ class Chameleon { String piccType; } PrintableUID; + typedef struct { + String tagType; + String uid; + } ScanResult; + enum AppMode { BATTERY_INFO_MODE, FACTORY_RESET_MODE, LF_READ_MODE, + LF_SCAN_MODE, LF_CLONE_MODE, LF_EMULATION_MODE, LF_SAVE_MODE, @@ -44,6 +50,8 @@ class Chameleon { HF_WRITE_MODE, HF_CUSTOM_UID_MODE, + FULL_SCAN_MODE, + // WRITE_NDEF_MODE, // ERASE_MODE, }; @@ -79,7 +87,7 @@ class Chameleon { int totalPages = 0; int dataPages = 0; std::set _scanned_set; - std::vector _scanned_tags; + std::vector _scanned_tags; ///////////////////////////////////////////////////////////////////////////////////// @@ -93,12 +101,13 @@ class Chameleon { ///////////////////////////////////////////////////////////////////////////////////// void displayBanner(); void dumpHFCardDetails(); - void dumpHFScanResults(); + void dumpScanResults(); ///////////////////////////////////////////////////////////////////////////////////// // Operations ///////////////////////////////////////////////////////////////////////////////////// void readLFTag(); + void scanLFTags(); void cloneLFTag(); void customLFUid(); void emulateLF(); @@ -114,6 +123,8 @@ class Chameleon { void saveFileHF(); void loadFileHF(); + void fullScanTags(); + void getBatteryInfo(); void factoryReset(); // void erase_card(); @@ -135,10 +146,10 @@ class Chameleon { bool readMifareClassicDataBlocks(uint8_t *key); bool readMifareUltralightDataBlocks(); bool writeHFDataBlocks(); - void saveHFScanResult(); uint8_t selectSlot(); bool isMifareClassic(byte sak); + void saveScanResult(); };