[FL-1058] Low frequency RFID app [Indala 40134 Encoder] (#447)

* App Lfrfid: Rename encoder to match extact protocol.
* Api-hal-gpio: fix alt fn config
* Api-hal-gpio: fixed fix
* App Lfrfid: indala 40134 timer stage
This commit is contained in:
SG 2021-05-06 18:45:52 +10:00 committed by GitHub
parent c880f90eb5
commit ffd4948ae2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 64 additions and 97 deletions

View File

@ -1,7 +1,7 @@
#include "encoder-hid.h" #include "encoder-hid-h10301.h"
#include <furi.h> #include <furi.h>
void EncoderHID::init(const uint8_t* data, const uint8_t data_size) { void EncoderHID_H10301::init(const uint8_t* data, const uint8_t data_size) {
furi_check(data_size == 3); furi_check(data_size == 3);
card_data[0] = 0; card_data[0] = 0;
@ -73,12 +73,12 @@ void EncoderHID::init(const uint8_t* data, const uint8_t data_size) {
bit_index = 0; bit_index = 0;
} }
void EncoderHID::write_bit(bool bit, uint8_t position) { void EncoderHID_H10301::write_bit(bool bit, uint8_t position) {
write_raw_bit(bit, position + 0); write_raw_bit(bit, position + 0);
write_raw_bit(!bit, position + 1); write_raw_bit(!bit, position + 1);
} }
void EncoderHID::write_raw_bit(bool bit, uint8_t position) { void EncoderHID_H10301::write_raw_bit(bool bit, uint8_t position) {
if(bit) { if(bit) {
card_data[position / 32] |= 1UL << (31 - (position % 32)); card_data[position / 32] |= 1UL << (31 - (position % 32));
} else { } else {
@ -86,7 +86,7 @@ void EncoderHID::write_raw_bit(bool bit, uint8_t position) {
} }
} }
void EncoderHID::get_next(bool* polarity, uint16_t* period, uint16_t* pulse) { void EncoderHID_H10301::get_next(bool* polarity, uint16_t* period, uint16_t* pulse) {
// hid 0 is 6 cycles by 8 clocks // hid 0 is 6 cycles by 8 clocks
const uint8_t hid_0_period = 8; const uint8_t hid_0_period = 8;
const uint8_t hid_0_count = 6; const uint8_t hid_0_count = 6;

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "encoder-generic.h" #include "encoder-generic.h"
class EncoderHID : public EncoderGeneric { class EncoderHID_H10301 : public EncoderGeneric {
public: public:
/** /**
* @brief init data to emulate * @brief init data to emulate

View File

@ -0,0 +1,34 @@
#include "encoder-indala-40134.h"
#include <furi.h>
void EncoderIndala_40134::init(const uint8_t* data, const uint8_t data_size) {
card_data = 0b1010000000000000000000000000000011010000010010001000011000110010;
last_bit = card_data & 1;
card_data_index = 0;
current_polarity = true;
}
void EncoderIndala_40134::get_next(bool* polarity, uint16_t* period, uint16_t* pulse) {
*period = 2;
*pulse = 1;
*polarity = current_polarity;
bit_clock_index++;
if(bit_clock_index >= clock_per_bit) {
bit_clock_index = 0;
bool current_bit = (card_data >> (63 - card_data_index)) & 1;
if(current_bit != last_bit) {
current_polarity = !current_polarity;
}
last_bit = current_bit;
card_data_index++;
if(card_data_index >= 64) {
card_data_index = 0;
}
}
}

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "encoder-generic.h" #include "encoder-generic.h"
class EncoderIndala : public EncoderGeneric { class EncoderIndala_40134 : public EncoderGeneric {
public: public:
/** /**
* @brief init data to emulate * @brief init data to emulate
@ -17,6 +17,7 @@ private:
uint64_t card_data; uint64_t card_data;
uint8_t card_data_index; uint8_t card_data_index;
uint8_t bit_clock_index; uint8_t bit_clock_index;
bool last_polarity; bool last_bit;
bool current_polarity;
static const uint8_t clock_per_bit = 16; static const uint8_t clock_per_bit = 16;
}; };

View File

@ -1,27 +0,0 @@
#include "encoder-indala.h"
#include <furi.h>
void EncoderIndala::init(const uint8_t* data, const uint8_t data_size) {
card_data = 0b1010000000000000000000000000000010011101111110011001001001010010;
last_polarity = card_data & 1;
card_data_index = 0;
}
void EncoderIndala::get_next(bool* polarity, uint16_t* period, uint16_t* pulse) {
bool new_bit = (card_data >> (63 - card_data_index)) & 1;
*period = 2;
*pulse = 1;
*polarity = (new_bit != last_polarity);
bit_clock_index++;
if(bit_clock_index >= clock_per_bit) {
bit_clock_index = 0;
last_polarity = *polarity;
card_data_index++;
if(card_data_index >= 64) {
card_data_index = 0;
}
}
}

View File

@ -4,47 +4,6 @@ extern TIM_HandleTypeDef htim1;
/* /*
static uint16_t times_index = 0; static uint16_t times_index = 0;
constexpr uint16_t hid_237_34672_count = 528;
constexpr uint8_t hid_237_34672[hid_237_34672_count] = {
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8,
8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8,
10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10,
10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8,
8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8,
8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8,
8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10,
10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8,
8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8,
10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10,
10, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8,
8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10,
10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10,
10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10,
10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10,
8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 10,
10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10,
10, 10, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8,
};
static void callback_hid(void* _hw, void* ctx) {
//RfidTimerEmulator* _this = static_cast<RfidTimerEmulator*>(ctx);
TIM_HandleTypeDef* hw = static_cast<TIM_HandleTypeDef*>(_hw);
if(hw == &htim1) {
hw->Instance->ARR = hid_237_34672[times_index] - 1;
hw->Instance->CCR1 = hid_237_34672[times_index] / 2; // - 1
times_index++;
if(times_index >= hid_237_34672_count) {
times_index = 0;
}
}
}
typedef struct { typedef struct {
uint8_t arr; uint8_t arr;
uint8_t ccr; uint8_t ccr;
@ -347,10 +306,10 @@ void RfidTimerEmulator::start(Type type) {
case Type::EM: case Type::EM:
current_encoder->init(em_data, 5); current_encoder->init(em_data, 5);
break; break;
case Type::HID: case Type::HID_H10301:
current_encoder->init(hid_data, 3); current_encoder->init(hid_data, 3);
break; break;
case Type::Indala: case Type::Indala_40134:
current_encoder->init(nullptr, 5); current_encoder->init(nullptr, 5);
break; break;
} }

View File

@ -3,8 +3,8 @@
#include "key-info.h" #include "key-info.h"
#include "encoder-generic.h" #include "encoder-generic.h"
#include "encoder-emmarine.h" #include "encoder-emmarine.h"
#include "encoder-hid.h" #include "encoder-hid-h10301.h"
#include "encoder-indala.h" #include "encoder-indala-40134.h"
#include "pulse-joiner.h" #include "pulse-joiner.h"
#include <map> #include <map>
@ -12,8 +12,8 @@ class RfidTimerEmulator {
public: public:
enum class Type : uint8_t { enum class Type : uint8_t {
EM, EM,
HID, HID_H10301,
Indala, Indala_40134,
}; };
RfidTimerEmulator(); RfidTimerEmulator();
@ -27,8 +27,8 @@ private:
std::map<Type, EncoderGeneric*> encoders = { std::map<Type, EncoderGeneric*> encoders = {
{Type::EM, new EncoderEM()}, {Type::EM, new EncoderEM()},
{Type::HID, new EncoderHID()}, {Type::HID_H10301, new EncoderHID_H10301()},
{Type::Indala, new EncoderIndala()}, {Type::Indala_40134, new EncoderIndala_40134()},
}; };
PulseJoiner pulse_joiner; PulseJoiner pulse_joiner;

View File

@ -10,11 +10,11 @@ void LfrfidSceneEmulateHID::on_enter(LfrfidApp* app) {
Popup* popup = view_manager->get_popup(); Popup* popup = view_manager->get_popup();
popup_set_header(popup, "LF-RFID", 64, 16, AlignCenter, AlignBottom); popup_set_header(popup, "LF-RFID", 64, 16, AlignCenter, AlignBottom);
app->set_text_store("HID emulation"); app->set_text_store("HID H10301 emulation");
popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop); popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop);
view_manager->switch_to(LfrfidAppViewManager::ViewType::Popup); view_manager->switch_to(LfrfidAppViewManager::ViewType::Popup);
app->get_emulator()->start(RfidTimerEmulator::Type::HID); app->get_emulator()->start(RfidTimerEmulator::Type::HID_H10301);
} }
bool LfrfidSceneEmulateHID::on_event(LfrfidApp* app, LfrfidEvent* event) { bool LfrfidSceneEmulateHID::on_event(LfrfidApp* app, LfrfidEvent* event) {

View File

@ -10,11 +10,11 @@ void LfrfidSceneEmulateIndala::on_enter(LfrfidApp* app) {
Popup* popup = view_manager->get_popup(); Popup* popup = view_manager->get_popup();
popup_set_header(popup, "LF-RFID", 64, 16, AlignCenter, AlignBottom); popup_set_header(popup, "LF-RFID", 64, 16, AlignCenter, AlignBottom);
app->set_text_store("Indala emulation"); app->set_text_store("Indala 40134 emulation");
popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop); popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop);
view_manager->switch_to(LfrfidAppViewManager::ViewType::Popup); view_manager->switch_to(LfrfidAppViewManager::ViewType::Popup);
app->get_emulator()->start(RfidTimerEmulator::Type::Indala); app->get_emulator()->start(RfidTimerEmulator::Type::Indala_40134);
} }
bool LfrfidSceneEmulateIndala::on_event(LfrfidApp* app, LfrfidEvent* event) { bool LfrfidSceneEmulateIndala::on_event(LfrfidApp* app, LfrfidEvent* event) {

View File

@ -33,6 +33,14 @@
static volatile GpioInterrupt gpio_interrupt[GPIO_NUMBER]; static volatile GpioInterrupt gpio_interrupt[GPIO_NUMBER];
static uint8_t hal_gpio_get_pin_num(const GpioPin* gpio) {
uint8_t pin_num = 0;
for(pin_num = 0; pin_num < GPIO_NUMBER; pin_num++) {
if(gpio->pin & (1 << pin_num)) break;
}
return pin_num;
}
void hal_gpio_init( void hal_gpio_init(
const GpioPin* gpio, const GpioPin* gpio,
const GpioMode mode, const GpioMode mode,
@ -120,7 +128,7 @@ void hal_gpio_init_alt(
LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_ALTERNATE); LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_ALTERNATE);
// set alternate function // set alternate function
if(gpio->pin < 8) { if(hal_gpio_get_pin_num(gpio) < 8) {
LL_GPIO_SetAFPin_0_7(gpio->port, gpio->pin, alt_fn); LL_GPIO_SetAFPin_0_7(gpio->port, gpio->pin, alt_fn);
} else { } else {
LL_GPIO_SetAFPin_8_15(gpio->port, gpio->pin, alt_fn); LL_GPIO_SetAFPin_8_15(gpio->port, gpio->pin, alt_fn);
@ -128,14 +136,6 @@ void hal_gpio_init_alt(
__enable_irq(); __enable_irq();
} }
static uint8_t hal_gpio_get_pin_num(const GpioPin* gpio) {
uint8_t pin_num = 0;
for(pin_num = 0; pin_num < GPIO_NUMBER; pin_num++) {
if(gpio->pin & (1 << pin_num)) break;
}
return pin_num;
}
void hal_gpio_add_int_callback(const GpioPin* gpio, GpioExtiCallback cb, void* ctx) { void hal_gpio_add_int_callback(const GpioPin* gpio, GpioExtiCallback cb, void* ctx) {
furi_assert(gpio); furi_assert(gpio);
furi_assert(cb); furi_assert(cb);