mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2025-12-13 05:06:30 +04:00
Naming and coding style convention, new linter tool. (#945)
* Makefile, Scripts: new linter * About: remove ID from IC * Firmware: remove double define for DIVC/DIVR * Scripts: check folder names too. Docker: replace syntax check with make lint. * Reformat Sources and Migrate to new file naming convention * Docker: symlink clang-format-12 to clang-format * Add coding style guide
This commit is contained in:
76
applications/lfrfid/helpers/decoder_indala.cpp
Normal file
76
applications/lfrfid/helpers/decoder_indala.cpp
Normal file
@@ -0,0 +1,76 @@
|
||||
#include "decoder_indala.h"
|
||||
#include <furi_hal.h>
|
||||
|
||||
constexpr uint32_t clocks_in_us = 64;
|
||||
constexpr uint32_t us_per_bit = 255;
|
||||
|
||||
bool DecoderIndala::read(uint8_t* data, uint8_t data_size) {
|
||||
bool result = false;
|
||||
|
||||
if(ready) {
|
||||
result = true;
|
||||
if(cursed_data_valid) {
|
||||
indala.decode(
|
||||
reinterpret_cast<const uint8_t*>(&cursed_raw_data),
|
||||
sizeof(uint64_t),
|
||||
data,
|
||||
data_size);
|
||||
} else {
|
||||
indala.decode(
|
||||
reinterpret_cast<const uint8_t*>(&raw_data), sizeof(uint64_t), data, data_size);
|
||||
}
|
||||
reset_state();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void DecoderIndala::process_front(bool polarity, uint32_t time) {
|
||||
if(ready) return;
|
||||
|
||||
process_internal(polarity, time, &raw_data);
|
||||
if(ready) return;
|
||||
|
||||
if(polarity) {
|
||||
time = time + 110;
|
||||
} else {
|
||||
time = time - 110;
|
||||
}
|
||||
|
||||
process_internal(!polarity, time, &cursed_raw_data);
|
||||
if(ready) {
|
||||
cursed_data_valid = true;
|
||||
}
|
||||
}
|
||||
|
||||
void DecoderIndala::process_internal(bool polarity, uint32_t time, uint64_t* data) {
|
||||
time /= clocks_in_us;
|
||||
time += (us_per_bit / 2);
|
||||
|
||||
uint32_t bit_count = (time / us_per_bit);
|
||||
|
||||
if(bit_count < 64) {
|
||||
for(uint32_t i = 0; i < bit_count; i++) {
|
||||
*data = (*data << 1) | polarity;
|
||||
|
||||
if((*data >> 32) == 0xa0000000ULL) {
|
||||
if(indala.can_be_decoded(
|
||||
reinterpret_cast<const uint8_t*>(data), sizeof(uint64_t))) {
|
||||
ready = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DecoderIndala::DecoderIndala() {
|
||||
reset_state();
|
||||
}
|
||||
|
||||
void DecoderIndala::reset_state() {
|
||||
raw_data = 0;
|
||||
cursed_raw_data = 0;
|
||||
ready = false;
|
||||
cursed_data_valid = false;
|
||||
}
|
||||
Reference in New Issue
Block a user