New LF-RFID app (#534)
* Hal lfrfid: add read timer pulse and period config fns * New debug application for lfrfid subsystem * New lfrfid: app, fix naming * App lfrfid: assets * Container view module * App ibutton: remove unused header * App lfrfid scenes * App notification, add yield to blocking operations, add speaker volume control * App lfrfid: reading key scene * Assets: placeholder icon * App lfrfid: reworked container view module * App lfrfid: new scenes * App lfrfid: write scene * App lfrfid: write hid * App lfrfid: emulate scene * App lfrfid: save name scene * App lfrfid: add missing file
This commit is contained in:
111
applications/lfrfid/helpers/rfid-worker.cpp
Normal file
111
applications/lfrfid/helpers/rfid-worker.cpp
Normal file
@@ -0,0 +1,111 @@
|
||||
#include "rfid-worker.h"
|
||||
|
||||
RfidWorker::RfidWorker() {
|
||||
}
|
||||
|
||||
RfidWorker::~RfidWorker() {
|
||||
}
|
||||
|
||||
void RfidWorker::start_read() {
|
||||
reader.start(RfidReader::Type::Normal);
|
||||
}
|
||||
|
||||
bool RfidWorker::read() {
|
||||
static const uint8_t data_size = LFRFID_KEY_SIZE;
|
||||
uint8_t data[data_size] = {0};
|
||||
LfrfidKeyType type;
|
||||
|
||||
bool result = reader.read(&type, data, data_size);
|
||||
|
||||
if(result) {
|
||||
key.set_type(type);
|
||||
key.set_data(data, data_size);
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void RfidWorker::stop_read() {
|
||||
reader.stop();
|
||||
}
|
||||
|
||||
void RfidWorker::start_write() {
|
||||
write_result = WriteResult::Nothing;
|
||||
write_sequence = new TickSequencer();
|
||||
validate_counts = 0;
|
||||
|
||||
write_sequence->do_every_tick(1, std::bind(&RfidWorker::sq_write, this));
|
||||
write_sequence->do_after_tick(2, std::bind(&RfidWorker::sq_write_start_validate, this));
|
||||
write_sequence->do_after_tick(15, std::bind(&RfidWorker::sq_write_validate, this));
|
||||
write_sequence->do_every_tick(1, std::bind(&RfidWorker::sq_write_stop_validate, this));
|
||||
}
|
||||
|
||||
RfidWorker::WriteResult RfidWorker::write() {
|
||||
write_sequence->tick();
|
||||
return write_result;
|
||||
}
|
||||
|
||||
void RfidWorker::stop_write() {
|
||||
delete write_sequence;
|
||||
reader.stop();
|
||||
}
|
||||
|
||||
void RfidWorker::start_emulate() {
|
||||
emulator.start(key.get_type(), key.get_data(), key.get_type_data_count());
|
||||
}
|
||||
|
||||
void RfidWorker::stop_emulate() {
|
||||
emulator.stop();
|
||||
}
|
||||
|
||||
void RfidWorker::sq_write() {
|
||||
// TODO expand this
|
||||
switch(key.get_type()) {
|
||||
case LfrfidKeyType::KeyEM4100:
|
||||
writer.start();
|
||||
writer.write_em(key.get_data());
|
||||
writer.stop();
|
||||
break;
|
||||
case LfrfidKeyType::KeyH10301:
|
||||
writer.start();
|
||||
writer.write_hid(key.get_data());
|
||||
writer.stop();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void RfidWorker::sq_write_start_validate() {
|
||||
reader.start(RfidReader::Type::Normal);
|
||||
}
|
||||
|
||||
void RfidWorker::sq_write_validate() {
|
||||
static const uint8_t data_size = LFRFID_KEY_SIZE;
|
||||
uint8_t data[data_size] = {0};
|
||||
LfrfidKeyType type;
|
||||
|
||||
bool result = reader.read(&type, data, data_size);
|
||||
|
||||
if(result) {
|
||||
if(type == key.get_type()) {
|
||||
if(memcmp(data, key.get_data(), key.get_type_data_count()) == 0) {
|
||||
write_result = WriteResult::Ok;
|
||||
validate_counts = 0;
|
||||
} else {
|
||||
validate_counts++;
|
||||
}
|
||||
} else {
|
||||
validate_counts++;
|
||||
}
|
||||
|
||||
if(validate_counts > 5) {
|
||||
write_result = WriteResult::NotWritable;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
void RfidWorker::sq_write_stop_validate() {
|
||||
reader.stop();
|
||||
}
|
Reference in New Issue
Block a user