Skip to content

Commit

Permalink
add chameleon LF scan and full scan (HF+LF)
Browse files Browse the repository at this point in the history
  • Loading branch information
rennancockles committed Oct 31, 2024
1 parent 849dfe4 commit ca99829
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 14 deletions.
65 changes: 54 additions & 11 deletions src/modules/rfid/chameleon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Chameleon::Chameleon() {

Chameleon::~Chameleon() {
if (_scanned_set.size() > 0) {
saveHFScanResult();
saveScanResult();
_scanned_set.clear();
_scanned_tags.clear();
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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();
}
Expand All @@ -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;
Expand Down Expand Up @@ -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(" -------------");
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -1104,7 +1141,7 @@ void Chameleon::parseHFData() {
}


void Chameleon::saveHFScanResult() {
void Chameleon::saveScanResult() {
FS *fs;
if(!getFsStorage(fs)) return;

Expand All @@ -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();
}
17 changes: 14 additions & 3 deletions src/modules/rfid/chameleon.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -44,6 +50,8 @@ class Chameleon {
HF_WRITE_MODE,
HF_CUSTOM_UID_MODE,

FULL_SCAN_MODE,

// WRITE_NDEF_MODE,
// ERASE_MODE,
};
Expand Down Expand Up @@ -79,7 +87,7 @@ class Chameleon {
int totalPages = 0;
int dataPages = 0;
std::set<String> _scanned_set;
std::vector<String> _scanned_tags;
std::vector<ScanResult> _scanned_tags;


/////////////////////////////////////////////////////////////////////////////////////
Expand All @@ -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();
Expand All @@ -114,6 +123,8 @@ class Chameleon {
void saveFileHF();
void loadFileHF();

void fullScanTags();

void getBatteryInfo();
void factoryReset();
// void erase_card();
Expand All @@ -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();

};

Expand Down

0 comments on commit ca99829

Please sign in to comment.