[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:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user