[FL-1063} LF-RFID Cli (#515)

* App lfrfid: update emulator to process external data.
* App lfrfid: cleanup emulator
* App lfrfid: cli interface
* Lib: arguments parser lib

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
SG
2021-06-10 21:53:59 +10:00
committed by GitHub
parent ced7d6315d
commit 4ad5245969
18 changed files with 372 additions and 63 deletions

View File

@@ -0,0 +1,33 @@
#include "key-info.h"
const char* lfrfid_key_get_type_string(LfrfidKeyType type) {
switch(type) {
case LfrfidKeyType::KeyEM4100:
return "EM4100";
break;
case LfrfidKeyType::KeyH10301:
return "H10301";
break;
case LfrfidKeyType::KeyI40134:
return "I40134";
break;
}
return "Unknown";
}
uint8_t lfrfid_key_get_type_data_count(LfrfidKeyType type) {
switch(type) {
case LfrfidKeyType::KeyEM4100:
return 5;
break;
case LfrfidKeyType::KeyH10301:
return 3;
break;
case LfrfidKeyType::KeyI40134:
return 3;
break;
}
return 0;
}

View File

@@ -4,7 +4,10 @@
static const uint8_t LFRFID_KEY_SIZE = 8;
enum class LfrfidKeyType : uint8_t {
KeyEmarine,
KeyHID,
KeyIndala,
};
KeyEM4100,
KeyH10301,
KeyI40134,
};
const char* lfrfid_key_get_type_string(LfrfidKeyType type);
uint8_t lfrfid_key_get_type_data_count(LfrfidKeyType type);

View File

@@ -71,12 +71,12 @@ bool RfidReader::read(LfrfidKeyType* type, uint8_t* data, uint8_t data_size) {
bool result = false;
if(decoder_em.read(data, data_size)) {
*type = LfrfidKeyType::KeyEmarine;
*type = LfrfidKeyType::KeyEM4100;
result = true;
}
if(decoder_hid26.read(data, data_size)) {
*type = LfrfidKeyType::KeyHID;
*type = LfrfidKeyType::KeyH10301;
result = true;
}

View File

@@ -6,7 +6,7 @@ RfidTimerEmulator::RfidTimerEmulator() {
}
RfidTimerEmulator::~RfidTimerEmulator() {
std::map<Type, EncoderGeneric*>::iterator it;
std::map<LfrfidKeyType, EncoderGeneric*>::iterator it;
for(it = encoders.begin(); it != encoders.end(); ++it) {
delete it->second;
@@ -14,38 +14,28 @@ RfidTimerEmulator::~RfidTimerEmulator() {
}
}
void RfidTimerEmulator::start(Type type) {
void RfidTimerEmulator::start(LfrfidKeyType type, const uint8_t* data, uint8_t data_size) {
if(encoders.count(type)) {
current_encoder = encoders.find(type)->second;
uint8_t em_data[5] = {0x53, 0x00, 0x5F, 0xB3, 0xC2};
uint8_t hid_data[3] = {0xED, 0x87, 0x70};
uint8_t indala_data[3] = {0x1F, 0x2E, 0x3D};
switch(type) {
case Type::EM:
current_encoder->init(em_data, 5);
break;
case Type::HID_H10301:
current_encoder->init(hid_data, 3);
break;
case Type::Indala_40134:
current_encoder->init(indala_data, 3);
break;
if(lfrfid_key_get_type_data_count(type) == data_size) {
current_encoder->init(data, data_size);
api_hal_rfid_tim_emulate(125000);
api_hal_rfid_pins_emulate();
api_interrupt_add(timer_update_callback, InterruptTypeTimerUpdate, this);
// TODO make api for interrupts priority
for(size_t i = WWDG_IRQn; i <= DMAMUX1_OVR_IRQn; i++) {
HAL_NVIC_SetPriority(static_cast<IRQn_Type>(i), 15, 0);
}
HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
api_hal_rfid_tim_emulate_start();
}
api_hal_rfid_tim_emulate(125000);
api_hal_rfid_pins_emulate();
api_interrupt_add(timer_update_callback, InterruptTypeTimerUpdate, this);
for(size_t i = WWDG_IRQn; i <= DMAMUX1_OVR_IRQn; i++) {
HAL_NVIC_SetPriority(static_cast<IRQn_Type>(i), 15, 0);
}
HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
api_hal_rfid_tim_emulate_start();
} else {
// not found
}

View File

@@ -10,24 +10,18 @@
class RfidTimerEmulator {
public:
enum class Type : uint8_t {
EM,
HID_H10301,
Indala_40134,
};
RfidTimerEmulator();
~RfidTimerEmulator();
void start(Type type);
void start(LfrfidKeyType type, const uint8_t* data, uint8_t data_size);
void stop();
private:
EncoderGeneric* current_encoder = nullptr;
std::map<Type, EncoderGeneric*> encoders = {
{Type::EM, new EncoderEM()},
{Type::HID_H10301, new EncoderHID_H10301()},
{Type::Indala_40134, new EncoderIndala_40134()},
std::map<LfrfidKeyType, EncoderGeneric*> encoders = {
{LfrfidKeyType::KeyEM4100, new EncoderEM()},
{LfrfidKeyType::KeyH10301, new EncoderHID_H10301()},
{LfrfidKeyType::KeyI40134, new EncoderIndala_40134()},
};
PulseJoiner pulse_joiner;