[FL-1059] T5577 write (#463)

* Api-hal-gpio: extend init functions
* App Lfrfid: separate protocol layer
* App Lfrfid: write EM key scene
* App Lfrfid: syntax fix
This commit is contained in:
SG
2021-05-18 18:37:47 +10:00
committed by GitHub
parent 588480831a
commit 618ddfcd04
28 changed files with 956 additions and 420 deletions

View File

@@ -20,84 +20,13 @@ void DecoderEMMarine::reset_state() {
manchester_saved_state, ManchesterEventReset, &manchester_saved_state, nullptr);
}
void printEM_raw(uint64_t data) {
// header
for(uint8_t i = 0; i < 9; i++) {
printf("%u ", data & (1LLU << 63) ? 1 : 0);
data = data << 1;
}
printf("\r\n");
// nibbles
for(uint8_t r = 0; r < 11; r++) {
printf(" ");
uint8_t value = 0;
for(uint8_t i = 0; i < 5; i++) {
printf("%u ", data & (1LLU << 63) ? 1 : 0);
if(i < 4) value = (value << 1) | (data & (1LLU << 63) ? 1 : 0);
data = data << 1;
}
printf("0x%X", value);
printf("\r\n");
}
}
void printEM_data(uint64_t data) {
printf("EM ");
// header
for(uint8_t i = 0; i < 9; i++) {
data = data << 1;
}
// nibbles
for(uint8_t r = 0; r < EM_ROW_COUNT; r++) {
uint8_t value = 0;
for(uint8_t i = 0; i < 5; i++) {
if(i < 4) value = (value << 1) | (data & (1LLU << 63) ? 1 : 0);
data = data << 1;
}
printf("%X", value);
if(r % 2) printf(" ");
}
printf("\r\n");
}
void copyEM_data(uint64_t data, uint8_t* result, uint8_t result_size) {
furi_assert(result_size >= 5);
uint8_t result_index = 0;
// clean result
memset(result, 0, result_size);
// header
for(uint8_t i = 0; i < 9; i++) {
data = data << 1;
}
// nibbles
uint8_t value = 0;
for(uint8_t r = 0; r < EM_ROW_COUNT; r++) {
uint8_t nibble = 0;
for(uint8_t i = 0; i < 5; i++) {
if(i < 4) nibble = (nibble << 1) | (data & (1LLU << 63) ? 1 : 0);
data = data << 1;
}
value = (value << 4) | nibble;
if(r % 2) {
result[result_index] |= value;
result_index++;
value = 0;
}
}
}
bool DecoderEMMarine::read(uint8_t* data, uint8_t data_size) {
bool result = false;
if(ready) {
result = true;
copyEM_data(readed_data, data, data_size);
em_marine.decode(
reinterpret_cast<const uint8_t*>(&readed_data), sizeof(uint64_t), data, data_size);
ready = false;
}
@@ -132,37 +61,8 @@ void DecoderEMMarine::process_front(bool polarity, uint32_t time) {
if(data_ok) {
readed_data = (readed_data << 1) | data;
// header and stop bit
if((readed_data & EM_HEADER_AND_STOP_MASK) != EM_HEADER_AND_STOP_DATA) return;
// row parity
for(uint8_t i = 0; i < EM_ROW_COUNT; i++) {
uint8_t parity_sum = 0;
for(uint8_t j = 0; j < 5; j++) {
parity_sum += (readed_data >> (EM_FIRST_ROW_POS - i * 5 + j)) & 1;
}
if((parity_sum % 2)) {
return;
}
}
// columns parity
for(uint8_t i = 0; i < 4; i++) {
uint8_t parity_sum = 0;
for(uint8_t j = 0; j < EM_ROW_COUNT + 1; j++) {
parity_sum += (readed_data >> (EM_COLUMN_POS - i + j * 5)) & 1;
}
if((parity_sum % 2)) {
return;
}
}
// checks ok
ready = true;
ready = em_marine.can_be_decoded(
reinterpret_cast<const uint8_t*>(&readed_data), sizeof(uint64_t));
}
}
}