mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2024-12-18 19:01:47 +03:00
cleanup
This commit is contained in:
parent
0e172b67eb
commit
8188b63522
@ -1,398 +0,0 @@
|
||||
#include "bit_lib.h"
|
||||
#include <core/check.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void bit_lib_push_bit(uint8_t* data, size_t data_size, bool bit) {
|
||||
size_t last_index = data_size - 1;
|
||||
|
||||
for(size_t i = 0; i < last_index; ++i) {
|
||||
data[i] = (data[i] << 1) | ((data[i + 1] >> 7) & 1);
|
||||
}
|
||||
data[last_index] = (data[last_index] << 1) | bit;
|
||||
}
|
||||
|
||||
void bit_lib_set_bit(uint8_t* data, size_t position, bool bit) {
|
||||
if(bit) {
|
||||
data[position / 8] |= 1UL << (7 - (position % 8));
|
||||
} else {
|
||||
data[position / 8] &= ~(1UL << (7 - (position % 8)));
|
||||
}
|
||||
}
|
||||
|
||||
void bit_lib_set_bits(uint8_t* data, size_t position, uint8_t byte, uint8_t length) {
|
||||
furi_check(length <= 8);
|
||||
furi_check(length > 0);
|
||||
|
||||
for(uint8_t i = 0; i < length; ++i) {
|
||||
uint8_t shift = (length - 1) - i;
|
||||
bit_lib_set_bit(data, position + i, (byte >> shift) & 1); //-V610
|
||||
}
|
||||
}
|
||||
|
||||
bool bit_lib_get_bit(const uint8_t* data, size_t position) {
|
||||
return (data[position / 8] >> (7 - (position % 8))) & 1;
|
||||
}
|
||||
|
||||
uint8_t bit_lib_get_bits(const uint8_t* data, size_t position, uint8_t length) {
|
||||
uint8_t shift = position % 8;
|
||||
if(shift == 0) {
|
||||
return data[position / 8] >> (8 - length);
|
||||
} else {
|
||||
// TODO fix read out of bounds
|
||||
uint8_t value = (data[position / 8] << (shift));
|
||||
value |= data[position / 8 + 1] >> (8 - shift);
|
||||
value = value >> (8 - length);
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t bit_lib_get_bits_16(const uint8_t* data, size_t position, uint8_t length) {
|
||||
uint16_t value = 0;
|
||||
if(length <= 8) {
|
||||
value = bit_lib_get_bits(data, position, length);
|
||||
} else {
|
||||
value = bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= bit_lib_get_bits(data, position + 8, length - 8);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
uint32_t bit_lib_get_bits_32(const uint8_t* data, size_t position, uint8_t length) {
|
||||
uint32_t value = 0;
|
||||
if(length <= 8) {
|
||||
value = bit_lib_get_bits(data, position, length);
|
||||
} else if(length <= 16) {
|
||||
value = bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= bit_lib_get_bits(data, position + 8, length - 8);
|
||||
} else if(length <= 24) {
|
||||
value = bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= bit_lib_get_bits(data, position + 8, 8) << (length - 16);
|
||||
value |= bit_lib_get_bits(data, position + 16, length - 16);
|
||||
} else {
|
||||
value = (uint32_t)bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= (uint32_t)bit_lib_get_bits(data, position + 8, 8) << (length - 16);
|
||||
value |= (uint32_t)bit_lib_get_bits(data, position + 16, 8) << (length - 24);
|
||||
value |= bit_lib_get_bits(data, position + 24, length - 24);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
uint64_t bit_lib_get_bits_64(const uint8_t* data, size_t position, uint8_t length) {
|
||||
uint64_t value = 0;
|
||||
if(length <= 8) {
|
||||
value = bit_lib_get_bits(data, position, length);
|
||||
} else if(length <= 16) {
|
||||
value = bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= bit_lib_get_bits(data, position + 8, length - 8);
|
||||
} else if(length <= 24) {
|
||||
value = bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= bit_lib_get_bits(data, position + 8, 8) << (length - 16);
|
||||
value |= bit_lib_get_bits(data, position + 16, length - 16);
|
||||
} else if(length <= 32) {
|
||||
value = (uint64_t)bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 8, 8) << (length - 16);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 16, 8) << (length - 24);
|
||||
value |= bit_lib_get_bits(data, position + 24, length - 24);
|
||||
} else {
|
||||
value = (uint64_t)bit_lib_get_bits(data, position, 8) << (length - 8);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 8, 8) << (length - 16);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 16, 8) << (length - 24);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 24, 8) << (length - 32);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 32, 8) << (length - 40);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 40, 8) << (length - 48);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 48, 8) << (length - 56);
|
||||
value |= (uint64_t)bit_lib_get_bits(data, position + 56, 8) << (length - 64);
|
||||
value |= bit_lib_get_bits(data, position + 64, length - 64);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
bool bit_lib_test_parity_32(uint32_t bits, BitLibParity parity) {
|
||||
#if !defined __GNUC__
|
||||
#error Please, implement parity test for non-GCC compilers
|
||||
#else
|
||||
switch(parity) {
|
||||
case BitLibParityEven:
|
||||
return __builtin_parity(bits);
|
||||
case BitLibParityOdd:
|
||||
return !__builtin_parity(bits);
|
||||
default:
|
||||
furi_crash("Unknown parity");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool bit_lib_test_parity(
|
||||
const uint8_t* bits,
|
||||
size_t position,
|
||||
uint8_t length,
|
||||
BitLibParity parity,
|
||||
uint8_t parity_length) {
|
||||
uint32_t parity_block;
|
||||
bool result = true;
|
||||
const size_t parity_blocks_count = length / parity_length;
|
||||
|
||||
for(size_t i = 0; i < parity_blocks_count; ++i) {
|
||||
switch(parity) {
|
||||
case BitLibParityEven:
|
||||
case BitLibParityOdd:
|
||||
parity_block = bit_lib_get_bits_32(bits, position + i * parity_length, parity_length);
|
||||
if(!bit_lib_test_parity_32(parity_block, parity)) {
|
||||
result = false;
|
||||
}
|
||||
break;
|
||||
case BitLibParityAlways0:
|
||||
if(bit_lib_get_bit(bits, position + i * parity_length + parity_length - 1)) {
|
||||
result = false;
|
||||
}
|
||||
break;
|
||||
case BitLibParityAlways1:
|
||||
if(!bit_lib_get_bit(bits, position + i * parity_length + parity_length - 1)) {
|
||||
result = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(!result) break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t bit_lib_add_parity(
|
||||
const uint8_t* data,
|
||||
size_t position,
|
||||
uint8_t* dest,
|
||||
size_t dest_position,
|
||||
uint8_t source_length,
|
||||
uint8_t parity_length,
|
||||
BitLibParity parity) {
|
||||
uint32_t parity_word = 0;
|
||||
size_t j = 0, bit_count = 0;
|
||||
for(int word = 0; word < source_length; word += parity_length - 1) {
|
||||
for(int bit = 0; bit < parity_length - 1; bit++) {
|
||||
parity_word = (parity_word << 1) | bit_lib_get_bit(data, position + word + bit);
|
||||
bit_lib_set_bit(
|
||||
dest, dest_position + j++, bit_lib_get_bit(data, position + word + bit));
|
||||
}
|
||||
// if parity fails then return 0
|
||||
switch(parity) {
|
||||
case BitLibParityAlways0:
|
||||
bit_lib_set_bit(dest, dest_position + j++, 0);
|
||||
break; // marker bit which should be a 0
|
||||
case BitLibParityAlways1:
|
||||
bit_lib_set_bit(dest, dest_position + j++, 1);
|
||||
break; // marker bit which should be a 1
|
||||
default:
|
||||
bit_lib_set_bit(
|
||||
dest,
|
||||
dest_position + j++,
|
||||
(bit_lib_test_parity_32(parity_word, BitLibParityOdd) ^ parity) ^ 1);
|
||||
break;
|
||||
}
|
||||
bit_count += parity_length;
|
||||
parity_word = 0;
|
||||
}
|
||||
// if we got here then all the parities passed
|
||||
// return bit count
|
||||
return bit_count;
|
||||
}
|
||||
|
||||
size_t bit_lib_remove_bit_every_nth(uint8_t* data, size_t position, uint8_t length, uint8_t n) {
|
||||
size_t counter = 0;
|
||||
size_t result_counter = 0;
|
||||
uint8_t bit_buffer = 0;
|
||||
uint8_t bit_counter = 0;
|
||||
|
||||
while(counter < length) {
|
||||
if((counter + 1) % n != 0) {
|
||||
bit_buffer = (bit_buffer << 1) | bit_lib_get_bit(data, position + counter);
|
||||
bit_counter++;
|
||||
}
|
||||
|
||||
if(bit_counter == 8) {
|
||||
bit_lib_set_bits(data, position + result_counter, bit_buffer, 8);
|
||||
bit_counter = 0;
|
||||
bit_buffer = 0;
|
||||
result_counter += 8;
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
|
||||
if(bit_counter != 0) {
|
||||
bit_lib_set_bits(data, position + result_counter, bit_buffer, bit_counter);
|
||||
result_counter += bit_counter;
|
||||
}
|
||||
return result_counter;
|
||||
}
|
||||
|
||||
void bit_lib_copy_bits(
|
||||
uint8_t* data,
|
||||
size_t position,
|
||||
size_t length,
|
||||
const uint8_t* source,
|
||||
size_t source_position) {
|
||||
for(size_t i = 0; i < length; ++i) {
|
||||
bit_lib_set_bit(data, position + i, bit_lib_get_bit(source, source_position + i));
|
||||
}
|
||||
}
|
||||
|
||||
void bit_lib_reverse_bits(uint8_t* data, size_t position, uint8_t length) {
|
||||
size_t i = 0;
|
||||
size_t j = length - 1;
|
||||
|
||||
while(i < j) {
|
||||
bool tmp = bit_lib_get_bit(data, position + i);
|
||||
bit_lib_set_bit(data, position + i, bit_lib_get_bit(data, position + j));
|
||||
bit_lib_set_bit(data, position + j, tmp);
|
||||
i++;
|
||||
j--;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t bit_lib_get_bit_count(uint32_t data) {
|
||||
#if defined __GNUC__
|
||||
return __builtin_popcountl(data);
|
||||
#else
|
||||
#error Please, implement popcount for non-GCC compilers
|
||||
#endif
|
||||
}
|
||||
|
||||
void bit_lib_print_bits(const uint8_t* data, size_t length) {
|
||||
for(size_t i = 0; i < length; ++i) {
|
||||
printf("%u", bit_lib_get_bit(data, i));
|
||||
}
|
||||
}
|
||||
|
||||
void bit_lib_print_regions(
|
||||
const BitLibRegion* regions,
|
||||
size_t region_count,
|
||||
const uint8_t* data,
|
||||
size_t length) {
|
||||
// print data
|
||||
bit_lib_print_bits(data, length);
|
||||
printf("\r\n");
|
||||
|
||||
// print regions
|
||||
for(size_t c = 0; c < length; ++c) {
|
||||
bool print = false;
|
||||
|
||||
for(size_t i = 0; i < region_count; i++) {
|
||||
if(regions[i].start <= c && c < regions[i].start + regions[i].length) {
|
||||
print = true;
|
||||
printf("%c", regions[i].mark);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!print) {
|
||||
printf(" ");
|
||||
}
|
||||
}
|
||||
printf("\r\n");
|
||||
|
||||
// print regions data
|
||||
for(size_t c = 0; c < length; ++c) {
|
||||
bool print = false;
|
||||
|
||||
for(size_t i = 0; i < region_count; i++) {
|
||||
if(regions[i].start <= c && c < regions[i].start + regions[i].length) {
|
||||
print = true;
|
||||
printf("%u", bit_lib_get_bit(data, c));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!print) {
|
||||
printf(" ");
|
||||
}
|
||||
}
|
||||
printf("\r\n");
|
||||
}
|
||||
|
||||
uint16_t bit_lib_reverse_16_fast(uint16_t data) {
|
||||
uint16_t result = 0;
|
||||
result |= (data & 0x8000) >> 15;
|
||||
result |= (data & 0x4000) >> 13;
|
||||
result |= (data & 0x2000) >> 11;
|
||||
result |= (data & 0x1000) >> 9;
|
||||
result |= (data & 0x0800) >> 7;
|
||||
result |= (data & 0x0400) >> 5;
|
||||
result |= (data & 0x0200) >> 3;
|
||||
result |= (data & 0x0100) >> 1;
|
||||
result |= (data & 0x0080) << 1;
|
||||
result |= (data & 0x0040) << 3;
|
||||
result |= (data & 0x0020) << 5;
|
||||
result |= (data & 0x0010) << 7;
|
||||
result |= (data & 0x0008) << 9;
|
||||
result |= (data & 0x0004) << 11;
|
||||
result |= (data & 0x0002) << 13;
|
||||
result |= (data & 0x0001) << 15;
|
||||
return result;
|
||||
}
|
||||
|
||||
uint8_t bit_lib_reverse_8_fast(uint8_t byte) {
|
||||
byte = (byte & 0xF0) >> 4 | (byte & 0x0F) << 4;
|
||||
byte = (byte & 0xCC) >> 2 | (byte & 0x33) << 2;
|
||||
byte = (byte & 0xAA) >> 1 | (byte & 0x55) << 1;
|
||||
return byte;
|
||||
}
|
||||
|
||||
uint16_t bit_lib_crc8(
|
||||
uint8_t const* data,
|
||||
size_t data_size,
|
||||
uint8_t polynom,
|
||||
uint8_t init,
|
||||
bool ref_in,
|
||||
bool ref_out,
|
||||
uint8_t xor_out) {
|
||||
uint8_t crc = init;
|
||||
|
||||
for(size_t i = 0; i < data_size; ++i) {
|
||||
uint8_t byte = data[i];
|
||||
if(ref_in) bit_lib_reverse_bits(&byte, 0, 8);
|
||||
crc ^= byte;
|
||||
|
||||
for(size_t j = 8; j > 0; --j) {
|
||||
if(crc & TOPBIT(8)) {
|
||||
crc = (crc << 1) ^ polynom;
|
||||
} else {
|
||||
crc = (crc << 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(ref_out) bit_lib_reverse_bits(&crc, 0, 8);
|
||||
crc ^= xor_out;
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
uint16_t bit_lib_crc16(
|
||||
uint8_t const* data,
|
||||
size_t data_size,
|
||||
uint16_t polynom,
|
||||
uint16_t init,
|
||||
bool ref_in,
|
||||
bool ref_out,
|
||||
uint16_t xor_out) {
|
||||
uint16_t crc = init;
|
||||
|
||||
for(size_t i = 0; i < data_size; ++i) {
|
||||
uint8_t byte = data[i];
|
||||
if(ref_in) byte = bit_lib_reverse_16_fast(byte) >> 8;
|
||||
|
||||
for(size_t j = 0; j < 8; ++j) {
|
||||
bool c15 = (crc >> 15 & 1);
|
||||
bool bit = (byte >> (7 - j) & 1);
|
||||
crc <<= 1;
|
||||
if(c15 ^ bit) crc ^= polynom;
|
||||
}
|
||||
}
|
||||
|
||||
if(ref_out) crc = bit_lib_reverse_16_fast(crc);
|
||||
crc ^= xor_out;
|
||||
|
||||
return crc;
|
||||
}
|
@ -1,281 +0,0 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define TOPBIT(X) (1 << ((X)-1))
|
||||
|
||||
typedef enum {
|
||||
BitLibParityEven,
|
||||
BitLibParityOdd,
|
||||
BitLibParityAlways0,
|
||||
BitLibParityAlways1,
|
||||
} BitLibParity;
|
||||
|
||||
/** @brief Increment and wrap around a value.
|
||||
* @param index value to increment
|
||||
* @param length wrap-around range
|
||||
*/
|
||||
#define bit_lib_increment_index(index, length) (index = (((index) + 1) % (length)))
|
||||
|
||||
/** @brief Test if a bit is set.
|
||||
* @param data value to test
|
||||
* @param index bit index to test
|
||||
*/
|
||||
#define bit_lib_bit_is_set(data, index) (((data) & (1 << (index))) != 0)
|
||||
|
||||
/** @brief Test if a bit is not set.
|
||||
* @param data value to test
|
||||
* @param index bit index to test
|
||||
*/
|
||||
#define bit_lib_bit_is_not_set(data, index) (((data) & (1 << (index))) == 0)
|
||||
|
||||
/** @brief Push a bit into a byte array.
|
||||
* @param data array to push bit into
|
||||
* @param data_size array size
|
||||
* @param bit bit to push
|
||||
*/
|
||||
void bit_lib_push_bit(uint8_t* data, size_t data_size, bool bit);
|
||||
|
||||
/** @brief Set a bit in a byte array.
|
||||
* @param data array to set bit in
|
||||
* @param position The position of the bit to set.
|
||||
* @param bit bit value to set
|
||||
*/
|
||||
void bit_lib_set_bit(uint8_t* data, size_t position, bool bit);
|
||||
|
||||
/** @brief Set the bit at the given position to the given value.
|
||||
* @param data The data to set the bit in.
|
||||
* @param position The position of the bit to set.
|
||||
* @param byte The data to set the bit to.
|
||||
* @param length The length of the data.
|
||||
*/
|
||||
void bit_lib_set_bits(uint8_t* data, size_t position, uint8_t byte, uint8_t length);
|
||||
|
||||
/** @brief Get the bit of a byte.
|
||||
* @param data The byte to get the bits from.
|
||||
* @param position The position of the bit.
|
||||
* @return The bit.
|
||||
*/
|
||||
bool bit_lib_get_bit(const uint8_t* data, size_t position);
|
||||
|
||||
/**
|
||||
* @brief Get the bits of a data, as uint8_t.
|
||||
* @param data The data to get the bits from.
|
||||
* @param position The position of the first bit.
|
||||
* @param length The length of the bits.
|
||||
* @return The bits.
|
||||
*/
|
||||
uint8_t bit_lib_get_bits(const uint8_t* data, size_t position, uint8_t length);
|
||||
|
||||
/**
|
||||
* @brief Get the bits of a data, as uint16_t.
|
||||
* @param data The data to get the bits from.
|
||||
* @param position The position of the first bit.
|
||||
* @param length The length of the bits.
|
||||
* @return The bits.
|
||||
*/
|
||||
uint16_t bit_lib_get_bits_16(const uint8_t* data, size_t position, uint8_t length);
|
||||
|
||||
/**
|
||||
* @brief Get the bits of a data, as uint32_t.
|
||||
* @param data The data to get the bits from.
|
||||
* @param position The position of the first bit.
|
||||
* @param length The length of the bits.
|
||||
* @return The bits.
|
||||
*/
|
||||
uint32_t bit_lib_get_bits_32(const uint8_t* data, size_t position, uint8_t length);
|
||||
|
||||
/**
|
||||
* @brief Get the bits of a data, as uint64_t.
|
||||
* @param data The data to get the bits from.
|
||||
* @param position The position of the first bit.
|
||||
* @param length The length of the bits.
|
||||
* @return The bits.
|
||||
*/
|
||||
uint64_t bit_lib_get_bits_64(const uint8_t* data, size_t position, uint8_t length);
|
||||
|
||||
/**
|
||||
* @brief Test parity of given bits
|
||||
* @param bits Bits to test parity of
|
||||
* @param parity Parity to test against
|
||||
* @return true if parity is correct, false otherwise
|
||||
*/
|
||||
bool bit_lib_test_parity_32(uint32_t bits, BitLibParity parity);
|
||||
|
||||
/**
|
||||
* @brief Test parity of bit array, check parity for every parity_length block from start
|
||||
*
|
||||
* @param data Bit array
|
||||
* @param position Start position
|
||||
* @param length Bit count
|
||||
* @param parity Parity to test against
|
||||
* @param parity_length Parity block length
|
||||
* @return true
|
||||
* @return false
|
||||
*/
|
||||
bool bit_lib_test_parity(
|
||||
const uint8_t* data,
|
||||
size_t position,
|
||||
uint8_t length,
|
||||
BitLibParity parity,
|
||||
uint8_t parity_length);
|
||||
|
||||
/**
|
||||
* @brief Add parity to bit array
|
||||
*
|
||||
* @param data Source bit array
|
||||
* @param position Start position
|
||||
* @param dest Destination bit array
|
||||
* @param dest_position Destination position
|
||||
* @param source_length Source bit count
|
||||
* @param parity_length Parity block length
|
||||
* @param parity Parity to test against
|
||||
* @return size_t
|
||||
*/
|
||||
size_t bit_lib_add_parity(
|
||||
const uint8_t* data,
|
||||
size_t position,
|
||||
uint8_t* dest,
|
||||
size_t dest_position,
|
||||
uint8_t source_length,
|
||||
uint8_t parity_length,
|
||||
BitLibParity parity);
|
||||
|
||||
/**
|
||||
* @brief Remove bit every n in array and shift array left. Useful to remove parity.
|
||||
*
|
||||
* @param data Bit array
|
||||
* @param position Start position
|
||||
* @param length Bit count
|
||||
* @param n every n bit will be removed
|
||||
* @return size_t
|
||||
*/
|
||||
size_t bit_lib_remove_bit_every_nth(uint8_t* data, size_t position, uint8_t length, uint8_t n);
|
||||
|
||||
/**
|
||||
* @brief Copy bits from source to destination.
|
||||
*
|
||||
* @param data destination array
|
||||
* @param position position in destination array
|
||||
* @param length length of bits to copy
|
||||
* @param source source array
|
||||
* @param source_position position in source array
|
||||
*/
|
||||
void bit_lib_copy_bits(
|
||||
uint8_t* data,
|
||||
size_t position,
|
||||
size_t length,
|
||||
const uint8_t* source,
|
||||
size_t source_position);
|
||||
|
||||
/**
|
||||
* @brief Reverse bits in bit array
|
||||
*
|
||||
* @param data Bit array
|
||||
* @param position start position
|
||||
* @param length length of bits to reverse
|
||||
*/
|
||||
void bit_lib_reverse_bits(uint8_t* data, size_t position, uint8_t length);
|
||||
|
||||
/**
|
||||
* @brief Count 1 bits in data
|
||||
*
|
||||
* @param data
|
||||
* @return uint8_t set bit count
|
||||
*/
|
||||
uint8_t bit_lib_get_bit_count(uint32_t data);
|
||||
|
||||
/**
|
||||
* @brief Print data as bit array
|
||||
*
|
||||
* @param data
|
||||
* @param length
|
||||
*/
|
||||
void bit_lib_print_bits(const uint8_t* data, size_t length);
|
||||
|
||||
typedef struct {
|
||||
const char mark;
|
||||
const size_t start;
|
||||
const size_t length;
|
||||
} BitLibRegion;
|
||||
|
||||
/**
|
||||
* @brief Print data as bit array and mark regions. Regions needs to be sorted by start position.
|
||||
*
|
||||
* @param regions
|
||||
* @param region_count
|
||||
* @param data
|
||||
* @param length
|
||||
*/
|
||||
void bit_lib_print_regions(
|
||||
const BitLibRegion* regions,
|
||||
size_t region_count,
|
||||
const uint8_t* data,
|
||||
size_t length);
|
||||
|
||||
/**
|
||||
* @brief Reverse bits in uint16_t, faster than generic bit_lib_reverse_bits.
|
||||
*
|
||||
* @param data
|
||||
* @return uint16_t
|
||||
*/
|
||||
uint16_t bit_lib_reverse_16_fast(uint16_t data);
|
||||
|
||||
/**
|
||||
* @brief Reverse bits in uint8_t, faster than generic bit_lib_reverse_bits.
|
||||
*
|
||||
* @param byte Byte
|
||||
* @return uint8_t the reversed byte
|
||||
*/
|
||||
uint8_t bit_lib_reverse_8_fast(uint8_t byte);
|
||||
|
||||
/**
|
||||
* @brief Slow, but generic CRC8 implementation
|
||||
*
|
||||
* @param data
|
||||
* @param data_size
|
||||
* @param polynom CRC polynom
|
||||
* @param init init value
|
||||
* @param ref_in true if the right bit is older
|
||||
* @param ref_out true to reverse output
|
||||
* @param xor_out xor output with this value
|
||||
* @return uint8_t
|
||||
*/
|
||||
uint16_t bit_lib_crc8(
|
||||
uint8_t const* data,
|
||||
size_t data_size,
|
||||
uint8_t polynom,
|
||||
uint8_t init,
|
||||
bool ref_in,
|
||||
bool ref_out,
|
||||
uint8_t xor_out);
|
||||
|
||||
/**
|
||||
* @brief Slow, but generic CRC16 implementation
|
||||
*
|
||||
* @param data
|
||||
* @param data_size
|
||||
* @param polynom CRC polynom
|
||||
* @param init init value
|
||||
* @param ref_in true if the right bit is older
|
||||
* @param ref_out true to reverse output
|
||||
* @param xor_out xor output with this value
|
||||
* @return uint16_t
|
||||
*/
|
||||
uint16_t bit_lib_crc16(
|
||||
uint8_t const* data,
|
||||
size_t data_size,
|
||||
uint16_t polynom,
|
||||
uint16_t init,
|
||||
bool ref_in,
|
||||
bool ref_out,
|
||||
uint16_t xor_out);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@ -1,983 +0,0 @@
|
||||
#include "transport.h"
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <stdint.h>
|
||||
#define TAG "Transport parser"
|
||||
|
||||
void timestamp_to_datetime(uint32_t timestamp, FuriHalRtcDateTime* datetime) {
|
||||
uint32_t days = timestamp / FURI_HAL_RTC_SECONDS_PER_DAY;
|
||||
uint32_t seconds_in_day = timestamp % FURI_HAL_RTC_SECONDS_PER_DAY;
|
||||
|
||||
datetime->year = FURI_HAL_RTC_EPOCH_START_YEAR;
|
||||
|
||||
while(days >= furi_hal_rtc_get_days_per_year(datetime->year)) {
|
||||
days -= furi_hal_rtc_get_days_per_year(datetime->year);
|
||||
(datetime->year)++;
|
||||
}
|
||||
|
||||
datetime->month = 1;
|
||||
while(days >= furi_hal_rtc_get_days_per_month(
|
||||
FURI_HAL_RTC_IS_LEAP_YEAR(datetime->year), datetime->month)) {
|
||||
days -= furi_hal_rtc_get_days_per_month(
|
||||
FURI_HAL_RTC_IS_LEAP_YEAR(datetime->year), datetime->month);
|
||||
(datetime->month)++;
|
||||
}
|
||||
|
||||
datetime->day = days + 1;
|
||||
datetime->hour = seconds_in_day / FURI_HAL_RTC_SECONDS_PER_HOUR;
|
||||
datetime->minute =
|
||||
(seconds_in_day % FURI_HAL_RTC_SECONDS_PER_HOUR) / FURI_HAL_RTC_SECONDS_PER_MINUTE;
|
||||
datetime->second = seconds_in_day % FURI_HAL_RTC_SECONDS_PER_MINUTE;
|
||||
}
|
||||
|
||||
void from_days_to_datetime(uint16_t days, FuriHalRtcDateTime* datetime, uint16_t start_year) {
|
||||
uint32_t timestamp = days * 24 * 60 * 60;
|
||||
FuriHalRtcDateTime start_datetime = {0};
|
||||
start_datetime.year = start_year - 1;
|
||||
start_datetime.month = 12;
|
||||
start_datetime.day = 31;
|
||||
timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime);
|
||||
timestamp_to_datetime(timestamp, datetime);
|
||||
}
|
||||
|
||||
void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, uint16_t start_year) {
|
||||
uint32_t timestamp = minutes * 60;
|
||||
FuriHalRtcDateTime start_datetime = {0};
|
||||
start_datetime.year = start_year - 1;
|
||||
start_datetime.month = 12;
|
||||
start_datetime.day = 31;
|
||||
timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime);
|
||||
timestamp_to_datetime(timestamp, datetime);
|
||||
}
|
||||
|
||||
bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
uint16_t transport_departament = bit_lib_get_bits_16(block->data, 0, 10);
|
||||
|
||||
FURI_LOG_D(TAG, "Transport departament: %x", transport_departament);
|
||||
|
||||
uint16_t layout_type = bit_lib_get_bits_16(block->data, 52, 4);
|
||||
if(layout_type == 0xE) {
|
||||
layout_type = bit_lib_get_bits_16(block->data, 52, 9);
|
||||
} else if(layout_type == 0xF) {
|
||||
layout_type = bit_lib_get_bits_16(block->data, 52, 14);
|
||||
}
|
||||
|
||||
FURI_LOG_D(TAG, "Layout type %x", layout_type);
|
||||
|
||||
uint16_t card_view = 0;
|
||||
uint16_t card_type = 0;
|
||||
uint32_t card_number = 0;
|
||||
uint8_t card_layout = 0;
|
||||
uint8_t card_layout2 = 0;
|
||||
uint16_t card_use_before_date = 0;
|
||||
uint16_t card_blank_type = 0;
|
||||
uint32_t card_start_trip_minutes = 0;
|
||||
uint8_t card_minutes_pass = 0;
|
||||
uint32_t card_remaining_funds = 0;
|
||||
uint16_t card_validator = 0;
|
||||
uint8_t card_blocked = 0;
|
||||
uint32_t card_hash = 0;
|
||||
|
||||
switch(layout_type) {
|
||||
case 0x02: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 56, 16); //202
|
||||
uint8_t card_benefit_code = bit_lib_get_bits(block->data, 72, 8); //124
|
||||
uint32_t card_rfu1 = bit_lib_get_bits_32(block->data, 80, 32); //rfu1
|
||||
uint16_t card_crc16 = bit_lib_get_bits_16(block->data, 112, 16); //501.1
|
||||
card_blocked = bit_lib_get_bits(block->data, 128, 1); //303
|
||||
uint16_t card_start_trip_time = bit_lib_get_bits_16(block->data, 177, 12); //403
|
||||
uint16_t card_start_trip_date = bit_lib_get_bits_16(block->data, 189, 16); //402
|
||||
uint16_t card_valid_from_date = bit_lib_get_bits_16(block->data, 157, 16); //311
|
||||
uint16_t card_valid_by_date = bit_lib_get_bits_16(block->data, 173, 16); //312
|
||||
uint8_t card_start_trip_seconds = bit_lib_get_bits(block->data, 189, 6); //406
|
||||
uint8_t card_transport_type1 = bit_lib_get_bits(block->data, 180, 2); //421.1
|
||||
uint8_t card_transport_type2 = bit_lib_get_bits(block->data, 182, 2); //421.2
|
||||
uint8_t card_transport_type3 = bit_lib_get_bits(block->data, 184, 2); //421.3
|
||||
uint8_t card_transport_type4 = bit_lib_get_bits(block->data, 186, 2); //421.4
|
||||
uint16_t card_use_with_date = bit_lib_get_bits_16(block->data, 189, 16); //205
|
||||
uint8_t card_route = bit_lib_get_bits(block->data, 205, 1); //424
|
||||
uint16_t card_validator1 = bit_lib_get_bits_16(block->data, 206, 15); //422.1
|
||||
card_validator = bit_lib_get_bits_16(block->data, 205, 16); //422
|
||||
uint16_t card_total_trips = bit_lib_get_bits_16(block->data, 221, 16); //331
|
||||
uint8_t card_write_enabled = bit_lib_get_bits(block->data, 237, 1); //write_enabled
|
||||
uint8_t card_rfu2 = bit_lib_get_bits(block->data, 238, 2); //rfu2
|
||||
uint16_t card_crc16_2 = bit_lib_get_bits_16(block->data, 240, 16); //501.2
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %lx %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_use_before_date,
|
||||
card_benefit_code,
|
||||
card_rfu1,
|
||||
card_crc16,
|
||||
card_blocked,
|
||||
card_start_trip_time,
|
||||
card_start_trip_date,
|
||||
card_valid_from_date,
|
||||
card_valid_by_date,
|
||||
card_start_trip_seconds,
|
||||
card_transport_type1,
|
||||
card_transport_type2,
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_use_with_date,
|
||||
card_route,
|
||||
card_validator1,
|
||||
card_validator,
|
||||
card_total_trips,
|
||||
card_write_enabled,
|
||||
card_rfu2,
|
||||
card_crc16_2);
|
||||
break;
|
||||
}
|
||||
case 0x06: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 56, 16); //202
|
||||
uint8_t card_geozone_a = bit_lib_get_bits(block->data, 72, 4); //GeoZoneA
|
||||
uint8_t card_geozone_b = bit_lib_get_bits(block->data, 76, 4); //GeoZoneB
|
||||
card_blank_type = bit_lib_get_bits_16(block->data, 80, 10); //121.
|
||||
uint16_t card_type_of_extended = bit_lib_get_bits_16(block->data, 90, 10); //122
|
||||
uint32_t card_rfu1 = bit_lib_get_bits_16(block->data, 100, 12); //rfu1
|
||||
uint16_t card_crc16 = bit_lib_get_bits_16(block->data, 112, 16); //501.1
|
||||
card_blocked = bit_lib_get_bits(block->data, 128, 1); //303
|
||||
uint16_t card_start_trip_time = bit_lib_get_bits_16(block->data, 129, 12); //403
|
||||
uint16_t card_start_trip_date = bit_lib_get_bits_16(block->data, 141, 16); //402
|
||||
uint16_t card_valid_from_date = bit_lib_get_bits_16(block->data, 157, 16); //311
|
||||
uint16_t card_valid_by_date = bit_lib_get_bits_16(block->data, 173, 16); //312
|
||||
uint16_t card_company = bit_lib_get_bits(block->data, 189, 4); //Company
|
||||
uint8_t card_validator1 = bit_lib_get_bits(block->data, 193, 4); //422.1
|
||||
uint16_t card_remaining_trips = bit_lib_get_bits_16(block->data, 197, 10); //321
|
||||
uint8_t card_units = bit_lib_get_bits(block->data, 207, 6); //Units
|
||||
uint16_t card_validator2 = bit_lib_get_bits_16(block->data, 213, 10); //422.2
|
||||
uint16_t card_total_trips = bit_lib_get_bits_16(block->data, 223, 16); //331
|
||||
uint8_t card_extended = bit_lib_get_bits(block->data, 239, 1); //123
|
||||
uint16_t card_crc16_2 = bit_lib_get_bits_16(block->data, 240, 16); //501.2
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %lx %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_use_before_date,
|
||||
card_geozone_a,
|
||||
card_geozone_b,
|
||||
card_blank_type,
|
||||
card_type_of_extended,
|
||||
card_rfu1,
|
||||
card_crc16,
|
||||
card_blocked,
|
||||
card_start_trip_time,
|
||||
card_start_trip_date,
|
||||
card_valid_from_date,
|
||||
card_valid_by_date,
|
||||
card_company,
|
||||
card_validator1,
|
||||
card_remaining_trips,
|
||||
card_units,
|
||||
card_validator2,
|
||||
card_total_trips,
|
||||
card_extended,
|
||||
card_crc16_2);
|
||||
card_validator = card_validator1 * 1024 + card_validator2;
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
|
||||
&card_start_trip_minutes_s,
|
||||
1992);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrips left: %d of %d\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_remaining_trips,
|
||||
card_total_trips,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x08: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 56, 16); //202
|
||||
uint64_t card_rfu1 = bit_lib_get_bits_64(block->data, 72, 56); //rfu1
|
||||
uint16_t card_valid_from_date = bit_lib_get_bits_16(block->data, 128, 16); //311
|
||||
uint8_t card_valid_for_days = bit_lib_get_bits(block->data, 144, 8); //313
|
||||
uint8_t card_requires_activation = bit_lib_get_bits(block->data, 152, 1); //301
|
||||
uint8_t card_rfu2 = bit_lib_get_bits(block->data, 153, 7); //rfu2
|
||||
uint8_t card_remaining_trips1 = bit_lib_get_bits(block->data, 160, 8); //321.1
|
||||
uint8_t card_remaining_trips = bit_lib_get_bits(block->data, 168, 8); //321
|
||||
uint8_t card_validator1 = bit_lib_get_bits(block->data, 193, 2); //422.1
|
||||
uint16_t card_validator = bit_lib_get_bits_16(block->data, 177, 15); //422
|
||||
card_hash = bit_lib_get_bits_32(block->data, 192, 32); //502
|
||||
uint32_t card_rfu3 = bit_lib_get_bits_32(block->data, 224, 32); //rfu3
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %llx %x %x %x %x %x %x %x %x %lx %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_use_before_date,
|
||||
card_rfu1,
|
||||
card_valid_from_date,
|
||||
card_valid_for_days,
|
||||
card_requires_activation,
|
||||
card_rfu2,
|
||||
card_remaining_trips1,
|
||||
card_remaining_trips,
|
||||
card_validator1,
|
||||
card_validator,
|
||||
card_hash,
|
||||
card_valid_from_date,
|
||||
card_rfu3);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrips left: %d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_remaining_trips,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x0A: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
uint16_t card_valid_from_date = bit_lib_get_bits_16(block->data, 64, 12); //311
|
||||
uint32_t card_valid_for_minutes = bit_lib_get_bits_32(block->data, 76, 19); //314
|
||||
uint8_t card_requires_activation = bit_lib_get_bits(block->data, 95, 1); //301
|
||||
card_start_trip_minutes = bit_lib_get_bits_32(block->data, 96, 19); //405
|
||||
card_minutes_pass = bit_lib_get_bits(block->data, 119, 7); //412
|
||||
uint8_t card_transport_type_flag = bit_lib_get_bits(block->data, 126, 2); //421.0
|
||||
uint8_t card_remaining_trips = bit_lib_get_bits(block->data, 128, 8); //321
|
||||
uint16_t card_validator = bit_lib_get_bits_16(block->data, 136, 16); //422
|
||||
uint8_t card_transport_type1 = bit_lib_get_bits(block->data, 152, 2); //421.1
|
||||
uint8_t card_transport_type2 = bit_lib_get_bits(block->data, 154, 2); //421.2
|
||||
uint8_t card_transport_type3 = bit_lib_get_bits(block->data, 156, 2); //421.3
|
||||
uint8_t card_transport_type4 = bit_lib_get_bits(block->data, 158, 2); //421.4
|
||||
card_hash = bit_lib_get_bits_32(block->data, 192, 32); //502
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %lx %x %lx %x %x %x %x %x %x %x %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_use_before_date,
|
||||
card_valid_from_date,
|
||||
card_valid_for_minutes,
|
||||
card_requires_activation,
|
||||
card_start_trip_minutes,
|
||||
card_minutes_pass,
|
||||
card_transport_type_flag,
|
||||
card_remaining_trips,
|
||||
card_validator,
|
||||
card_transport_type1,
|
||||
card_transport_type2,
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2016);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 2016);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nTrips left: %d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_remaining_trips,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x0C: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 56, 16); //202
|
||||
uint64_t card_rfu1 = bit_lib_get_bits_64(block->data, 72, 56); //rfu1
|
||||
uint16_t card_valid_from_date = bit_lib_get_bits_16(block->data, 128, 16); //311
|
||||
uint8_t card_valid_for_days = bit_lib_get_bits(block->data, 144, 8); //313
|
||||
uint8_t card_requires_activation = bit_lib_get_bits(block->data, 152, 1); //301
|
||||
uint16_t card_rfu2 = bit_lib_get_bits_16(block->data, 153, 13); //rfu2
|
||||
uint16_t card_remaining_trips = bit_lib_get_bits_16(block->data, 166, 10); //321
|
||||
uint16_t card_validator = bit_lib_get_bits_16(block->data, 176, 16); //422
|
||||
card_hash = bit_lib_get_bits_32(block->data, 192, 32); //502
|
||||
uint16_t card_start_trip_date = bit_lib_get_bits_16(block->data, 224, 16); //402
|
||||
uint16_t card_start_trip_time = bit_lib_get_bits_16(block->data, 240, 11); //403
|
||||
uint8_t card_transport_type = bit_lib_get_bits(block->data, 251, 2); //421
|
||||
uint8_t card_rfu3 = bit_lib_get_bits(block->data, 253, 2); //rfu3
|
||||
uint8_t card_transfer_in_metro = bit_lib_get_bits(block->data, 255, 1); //432
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %llx %x %x %x %x %x %x %x %x %x %x %x",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_use_before_date,
|
||||
card_rfu1,
|
||||
card_valid_from_date,
|
||||
card_valid_for_days,
|
||||
card_requires_activation,
|
||||
card_rfu2,
|
||||
card_remaining_trips,
|
||||
card_validator,
|
||||
card_start_trip_date,
|
||||
card_start_trip_time,
|
||||
card_transport_type,
|
||||
card_rfu3,
|
||||
card_transfer_in_metro);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992);
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
|
||||
&card_start_trip_minutes_s,
|
||||
1992);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nTrips left: %d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_remaining_trips,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x0D: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
uint8_t card_rfu1 = bit_lib_get_bits(block->data, 56, 8); //rfu1
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 64, 16); //202
|
||||
uint16_t card_valid_for_time = bit_lib_get_bits_16(block->data, 80, 11); //316
|
||||
uint8_t card_rfu2 = bit_lib_get_bits(block->data, 91, 5); //rfu2
|
||||
uint16_t card_use_before_date2 = bit_lib_get_bits_16(block->data, 96, 16); //202.2
|
||||
uint16_t card_valid_for_time2 = bit_lib_get_bits_16(block->data, 123, 11); //316.2
|
||||
uint8_t card_rfu3 = bit_lib_get_bits(block->data, 123, 5); //rfu3
|
||||
uint16_t card_valid_from_date = bit_lib_get_bits_16(block->data, 128, 16); //311
|
||||
uint8_t card_valid_for_days = bit_lib_get_bits(block->data, 144, 8); //313
|
||||
uint8_t card_requires_activation = bit_lib_get_bits(block->data, 152, 1); //301
|
||||
uint8_t card_rfu4 = bit_lib_get_bits(block->data, 153, 2); //rfu4
|
||||
uint8_t card_passage_5_minutes = bit_lib_get_bits(block->data, 155, 5); //413
|
||||
uint8_t card_transport_type1 = bit_lib_get_bits(block->data, 160, 2); //421.1
|
||||
uint8_t card_passage_in_metro = bit_lib_get_bits(block->data, 162, 1); //431
|
||||
uint8_t card_passages_ground_transport = bit_lib_get_bits(block->data, 163, 3); //433
|
||||
uint16_t card_remaining_trips = bit_lib_get_bits_16(block->data, 166, 10); //321
|
||||
uint16_t card_validator = bit_lib_get_bits_16(block->data, 176, 16); //422
|
||||
card_hash = bit_lib_get_bits_32(block->data, 192, 32); //502
|
||||
uint16_t card_start_trip_date = bit_lib_get_bits_16(block->data, 224, 16); //402
|
||||
uint16_t card_start_trip_time = bit_lib_get_bits_16(block->data, 240, 11); //403
|
||||
uint8_t card_transport_type2 = bit_lib_get_bits(block->data, 251, 2); //421.2
|
||||
uint8_t card_rfu5 = bit_lib_get_bits(block->data, 253, 2); //rfu5
|
||||
uint8_t card_transfer_in_metro = bit_lib_get_bits(block->data, 255, 1); //432
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_rfu1,
|
||||
card_use_before_date,
|
||||
card_valid_for_time,
|
||||
card_rfu2,
|
||||
card_use_before_date2,
|
||||
card_valid_for_time2,
|
||||
card_rfu3,
|
||||
card_valid_from_date,
|
||||
card_valid_for_days,
|
||||
card_requires_activation,
|
||||
card_rfu4,
|
||||
card_passage_5_minutes,
|
||||
card_transport_type1,
|
||||
card_passage_in_metro,
|
||||
card_passages_ground_transport,
|
||||
card_remaining_trips,
|
||||
card_validator,
|
||||
card_start_trip_date,
|
||||
card_start_trip_time,
|
||||
card_transport_type2,
|
||||
card_rfu5,
|
||||
card_transfer_in_metro);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992);
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
|
||||
&card_start_trip_minutes_s,
|
||||
1992);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nTrips left: %d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_remaining_trips,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x1C1: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_layout2 = bit_lib_get_bits(block->data, 56, 5); //112
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 61, 16); //202.
|
||||
card_blank_type = bit_lib_get_bits_16(block->data, 77, 10); //121.
|
||||
card_validator = bit_lib_get_bits_16(block->data, 128, 16); //422
|
||||
uint16_t card_start_trip_date = bit_lib_get_bits_16(block->data, 144, 16); //402
|
||||
uint16_t card_start_trip_time = bit_lib_get_bits_16(block->data, 160, 11); //403
|
||||
uint8_t card_transport_type1 = bit_lib_get_bits(block->data, 171, 2); //421.1
|
||||
uint8_t card_transport_type2 = bit_lib_get_bits(block->data, 173, 2); //421.2
|
||||
uint8_t card_transfer_in_metro = bit_lib_get_bits(block->data, 177, 1); //432
|
||||
uint8_t card_passage_in_metro = bit_lib_get_bits(block->data, 178, 1); //431
|
||||
uint8_t card_passages_ground_transport = bit_lib_get_bits(block->data, 179, 3); //433
|
||||
card_minutes_pass = bit_lib_get_bits(block->data, 185, 8); //412.
|
||||
card_remaining_funds = bit_lib_get_bits_32(block->data, 196, 19) / 100; //322
|
||||
uint8_t card_fare_trip = bit_lib_get_bits(block->data, 215, 2); //441
|
||||
card_blocked = bit_lib_get_bits(block->data, 202, 1); //303
|
||||
uint8_t card_zoo = bit_lib_get_bits(block->data, 218, 1); //zoo
|
||||
card_hash = bit_lib_get_bits_32(block->data, 224, 32); //502
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %x %x %x %x %x %x %x %x %lx %x %x %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_layout2,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_validator,
|
||||
card_start_trip_date,
|
||||
card_start_trip_time,
|
||||
card_transport_type1,
|
||||
card_transport_type2,
|
||||
card_transfer_in_metro,
|
||||
card_passage_in_metro,
|
||||
card_passages_ground_transport,
|
||||
card_minutes_pass,
|
||||
card_remaining_funds,
|
||||
card_fare_trip,
|
||||
card_blocked,
|
||||
card_zoo,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 1992);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 1992);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x1C2: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_layout2 = bit_lib_get_bits(block->data, 56, 5); //112
|
||||
uint16_t card_type_of_extended = bit_lib_get_bits_16(block->data, 61, 10); //122
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 71, 16); //202.
|
||||
card_blank_type = bit_lib_get_bits_16(block->data, 87, 10); //121.
|
||||
uint16_t card_valid_to_date = bit_lib_get_bits_16(block->data, 97, 16); //311
|
||||
uint16_t card_activate_during = bit_lib_get_bits_16(block->data, 113, 9); //302
|
||||
uint32_t card_valid_for_minutes = bit_lib_get_bits_32(block->data, 131, 20); //314
|
||||
card_minutes_pass = bit_lib_get_bits(block->data, 154, 8); //412.
|
||||
uint8_t card_transport_type = bit_lib_get_bits(block->data, 163, 2); //421
|
||||
uint8_t card_passage_in_metro = bit_lib_get_bits(block->data, 165, 1); //431
|
||||
uint8_t card_transfer_in_metro = bit_lib_get_bits(block->data, 166, 1); //432
|
||||
uint16_t card_remaining_trips = bit_lib_get_bits_16(block->data, 167, 10); //321
|
||||
card_validator = bit_lib_get_bits_16(block->data, 177, 16); //422
|
||||
uint32_t card_start_trip_neg_minutes = bit_lib_get_bits_32(block->data, 196, 20); //404
|
||||
uint8_t card_requires_activation = bit_lib_get_bits(block->data, 216, 1); //301
|
||||
card_blocked = bit_lib_get_bits(block->data, 217, 1); //303
|
||||
uint8_t card_extended = bit_lib_get_bits(block->data, 218, 1); //123
|
||||
card_hash = bit_lib_get_bits_32(block->data, 224, 32); //502
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %x %x %lx %x %x %x %x %x %x %lx %x %x %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_layout2,
|
||||
card_type_of_extended,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_valid_to_date,
|
||||
card_activate_during,
|
||||
card_valid_for_minutes,
|
||||
card_minutes_pass,
|
||||
card_transport_type,
|
||||
card_passage_in_metro,
|
||||
card_transfer_in_metro,
|
||||
card_remaining_trips,
|
||||
card_validator,
|
||||
card_start_trip_neg_minutes,
|
||||
card_requires_activation,
|
||||
card_blocked,
|
||||
card_extended,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2016);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
(card_valid_to_date - 1) * 24 * 60 + card_valid_for_minutes -
|
||||
card_start_trip_neg_minutes,
|
||||
&card_start_trip_minutes_s,
|
||||
2016); //-time
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x1C3: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_layout2 = bit_lib_get_bits(block->data, 56, 5); //112
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 61, 16); //202
|
||||
card_blank_type = bit_lib_get_bits_16(block->data, 77, 10); //121
|
||||
card_remaining_funds = bit_lib_get_bits_32(block->data, 188, 22) / 100; //322
|
||||
card_hash = bit_lib_get_bits_32(block->data, 224, 32); //502
|
||||
card_validator = bit_lib_get_bits_16(block->data, 128, 16); //422
|
||||
card_start_trip_minutes = bit_lib_get_bits_32(block->data, 144, 23); //405
|
||||
uint8_t card_fare_trip = bit_lib_get_bits(block->data, 210, 2); //441
|
||||
card_minutes_pass = bit_lib_get_bits(block->data, 171, 7); //412
|
||||
uint8_t card_transport_type_flag = bit_lib_get_bits(block->data, 178, 2); //421.0
|
||||
uint8_t card_transport_type1 = bit_lib_get_bits(block->data, 180, 2); //421.1
|
||||
uint8_t card_transport_type2 = bit_lib_get_bits(block->data, 182, 2); //421.2
|
||||
uint8_t card_transport_type3 = bit_lib_get_bits(block->data, 184, 2); //421.3
|
||||
uint8_t card_transport_type4 = bit_lib_get_bits(block->data, 186, 2); //421.4
|
||||
card_blocked = bit_lib_get_bits(block->data, 212, 1); //303
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"Card view: %x, type: %x, number: %lx, layout: %x, layout2: %x, use before date: %x, blank type: %x, remaining funds: %lx, hash: %lx, validator: %x, start trip minutes: %lx, fare trip: %x, minutes pass: %x, transport type flag: %x, transport type1: %x, transport type2: %x, transport type3: %x, transport type4: %x, blocked: %x",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_layout2,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_remaining_funds,
|
||||
card_hash,
|
||||
card_validator,
|
||||
card_start_trip_minutes,
|
||||
card_fare_trip,
|
||||
card_minutes_pass,
|
||||
card_transport_type_flag,
|
||||
card_transport_type1,
|
||||
card_transport_type2,
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_blocked);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nBalance: %ld rub\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_remaining_funds,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x1C4: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_layout2 = bit_lib_get_bits(block->data, 56, 5); //112
|
||||
uint16_t card_type_of_extended = bit_lib_get_bits_16(block->data, 61, 10); //122
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 71, 13); //202.
|
||||
card_blank_type = bit_lib_get_bits_16(block->data, 84, 10); //121.
|
||||
uint16_t card_valid_to_date = bit_lib_get_bits_16(block->data, 94, 13); //311
|
||||
uint16_t card_activate_during = bit_lib_get_bits_16(block->data, 107, 9); //302
|
||||
uint16_t card_extension_counter = bit_lib_get_bits_16(block->data, 116, 10); //304
|
||||
uint32_t card_valid_for_minutes = bit_lib_get_bits_32(block->data, 128, 20); //314
|
||||
card_minutes_pass = bit_lib_get_bits(block->data, 158, 7); //412.
|
||||
uint8_t card_transport_type_flag = bit_lib_get_bits(block->data, 178, 2); //421.0
|
||||
uint8_t card_transport_type1 = bit_lib_get_bits(block->data, 180, 2); //421.1
|
||||
uint8_t card_transport_type2 = bit_lib_get_bits(block->data, 182, 2); //421.2
|
||||
uint8_t card_transport_type3 = bit_lib_get_bits(block->data, 184, 2); //421.3
|
||||
uint8_t card_transport_type4 = bit_lib_get_bits(block->data, 186, 2); //421.4
|
||||
uint16_t card_remaining_trips = bit_lib_get_bits_16(block->data, 169, 10); //321
|
||||
card_validator = bit_lib_get_bits_16(block->data, 179, 16); //422
|
||||
uint32_t card_start_trip_neg_minutes = bit_lib_get_bits_32(block->data, 195, 20); //404
|
||||
uint8_t card_requires_activation = bit_lib_get_bits(block->data, 215, 1); //301
|
||||
card_blocked = bit_lib_get_bits(block->data, 216, 1); //303
|
||||
uint8_t card_extended = bit_lib_get_bits(block->data, 217, 1); //123
|
||||
card_hash = bit_lib_get_bits_32(block->data, 224, 32); //502
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %x %x %x %lx %x %x %x %x %x %x %x %x %lx %x %x %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_layout2,
|
||||
card_type_of_extended,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_valid_to_date,
|
||||
card_activate_during,
|
||||
card_extension_counter,
|
||||
card_valid_for_minutes,
|
||||
card_minutes_pass,
|
||||
card_transport_type_flag,
|
||||
card_transport_type1,
|
||||
card_transport_type2,
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_remaining_trips,
|
||||
card_validator,
|
||||
card_start_trip_neg_minutes,
|
||||
card_requires_activation,
|
||||
card_blocked,
|
||||
card_extended,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2016);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
(card_use_before_date - 1) * 24 * 60 + card_valid_for_minutes -
|
||||
card_start_trip_neg_minutes,
|
||||
&card_start_trip_minutes_s,
|
||||
2016); //-time
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x1C5: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_layout2 = bit_lib_get_bits(block->data, 56, 5); //112
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 61, 13); //202.
|
||||
card_blank_type = bit_lib_get_bits_16(block->data, 74, 10); //121.
|
||||
uint32_t card_valid_to_time = bit_lib_get_bits_32(block->data, 84, 23); //317
|
||||
uint16_t card_extension_counter = bit_lib_get_bits_16(block->data, 107, 10); //304
|
||||
card_start_trip_minutes = bit_lib_get_bits_32(block->data, 128, 23); //405
|
||||
uint8_t card_metro_ride_with = bit_lib_get_bits(block->data, 151, 7); //414
|
||||
card_minutes_pass = bit_lib_get_bits(block->data, 158, 7); //412.
|
||||
card_remaining_funds = bit_lib_get_bits_32(block->data, 167, 19) / 100; //322
|
||||
card_validator = bit_lib_get_bits_16(block->data, 186, 16); //422
|
||||
card_blocked = bit_lib_get_bits(block->data, 202, 1); //303
|
||||
uint16_t card_route = bit_lib_get_bits_16(block->data, 204, 12); //424
|
||||
uint8_t card_passages_ground_transport = bit_lib_get_bits(block->data, 216, 7); //433
|
||||
card_hash = bit_lib_get_bits_32(block->data, 224, 32); //502
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %lx %x %lx %x %x %lx %x %x %x %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_layout2,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_valid_to_time,
|
||||
card_extension_counter,
|
||||
card_start_trip_minutes,
|
||||
card_metro_ride_with,
|
||||
card_minutes_pass,
|
||||
card_remaining_funds,
|
||||
card_validator,
|
||||
card_blocked,
|
||||
card_route,
|
||||
card_passages_ground_transport,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2019);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
card_start_trip_minutes - (24 * 60), &card_start_trip_minutes_s, 2019);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nBalance: %ld rub\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_remaining_funds,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x1C6: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
card_layout2 = bit_lib_get_bits(block->data, 56, 5); //112
|
||||
uint16_t card_type_of_extended = bit_lib_get_bits_16(block->data, 61, 10); //122
|
||||
card_use_before_date = bit_lib_get_bits_16(block->data, 71, 13); //202.
|
||||
card_blank_type = bit_lib_get_bits_16(block->data, 84, 10); //121.
|
||||
uint32_t card_valid_from_date = bit_lib_get_bits_32(block->data, 94, 23); //311
|
||||
uint16_t card_extension_counter = bit_lib_get_bits_16(block->data, 117, 10); //304
|
||||
uint32_t card_valid_for_minutes = bit_lib_get_bits_32(block->data, 128, 20); //314
|
||||
uint32_t card_start_trip_neg_minutes = bit_lib_get_bits_32(block->data, 148, 20); //404
|
||||
uint8_t card_metro_ride_with = bit_lib_get_bits(block->data, 168, 7); //414
|
||||
card_minutes_pass = bit_lib_get_bits(block->data, 175, 7); //412.
|
||||
uint16_t card_remaining_trips = bit_lib_get_bits_16(block->data, 182, 7); //321
|
||||
card_validator = bit_lib_get_bits_16(block->data, 189, 16); //422
|
||||
card_blocked = bit_lib_get_bits(block->data, 205, 1); //303
|
||||
uint8_t card_extended = bit_lib_get_bits(block->data, 206, 1); //123
|
||||
uint16_t card_route = bit_lib_get_bits_16(block->data, 212, 12); //424
|
||||
card_hash = bit_lib_get_bits_32(block->data, 224, 32); //502
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %lx %x %lx %lx %x %x %x %x %x %x %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_layout2,
|
||||
card_type_of_extended,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_valid_from_date,
|
||||
card_extension_counter,
|
||||
card_valid_for_minutes,
|
||||
card_start_trip_neg_minutes,
|
||||
card_metro_ride_with,
|
||||
card_minutes_pass,
|
||||
card_remaining_trips,
|
||||
card_validator,
|
||||
card_blocked,
|
||||
card_extended,
|
||||
card_route,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date - 1, &card_use_before_date_s, 2019);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes - 24 * 60,
|
||||
&card_start_trip_minutes_s,
|
||||
2019); //-time
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrip from: %02d.%02d.%04d %02d:%02d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_start_trip_minutes_s.day,
|
||||
card_start_trip_minutes_s.month,
|
||||
card_start_trip_minutes_s.year,
|
||||
card_start_trip_minutes_s.hour,
|
||||
card_start_trip_minutes_s.minute,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x3CCB: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
uint16_t card_tech_code = bit_lib_get_bits_32(block->data, 56, 10); //tech_code
|
||||
uint16_t card_valid_to_minutes = bit_lib_get_bits_16(block->data, 66, 16); //311
|
||||
uint16_t card_valid_by_date = bit_lib_get_bits_16(block->data, 82, 16); //312
|
||||
uint8_t card_interval = bit_lib_get_bits(block->data, 98, 4); //interval
|
||||
uint16_t card_app_code1 = bit_lib_get_bits_16(block->data, 102, 16); //app_code1
|
||||
uint16_t card_hash1 = bit_lib_get_bits_16(block->data, 112, 16); //502.1
|
||||
uint16_t card_type1 = bit_lib_get_bits_16(block->data, 128, 10); //type1
|
||||
uint16_t card_app_code2 = bit_lib_get_bits_16(block->data, 138, 10); //app_code2
|
||||
uint16_t card_type2 = bit_lib_get_bits_16(block->data, 148, 10); //type2
|
||||
uint16_t card_app_code3 = bit_lib_get_bits_16(block->data, 158, 10); //app_code3
|
||||
uint16_t card_type3 = bit_lib_get_bits_16(block->data, 148, 10); //type3
|
||||
uint16_t card_app_code4 = bit_lib_get_bits_16(block->data, 168, 10); //app_code4
|
||||
uint16_t card_type4 = bit_lib_get_bits_16(block->data, 178, 10); //type4
|
||||
card_hash = bit_lib_get_bits_32(block->data, 224, 32); //502.2
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %lx",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_tech_code,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_valid_to_minutes,
|
||||
card_valid_by_date,
|
||||
card_interval,
|
||||
card_app_code1,
|
||||
card_hash1,
|
||||
card_type1,
|
||||
card_app_code2,
|
||||
card_type2,
|
||||
card_app_code3,
|
||||
card_type3,
|
||||
card_app_code4,
|
||||
card_type4,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
case 0x3C0B: {
|
||||
card_view = bit_lib_get_bits_16(block->data, 0, 10); //101
|
||||
card_type = bit_lib_get_bits_16(block->data, 10, 10); //102
|
||||
card_number = bit_lib_get_bits_32(block->data, 20, 32); //201
|
||||
card_layout = bit_lib_get_bits(block->data, 52, 4); //111
|
||||
uint16_t card_tech_code = bit_lib_get_bits_32(block->data, 56, 10); //tech_code
|
||||
uint16_t card_valid_to_minutes = bit_lib_get_bits_16(block->data, 66, 16); //311
|
||||
uint16_t card_valid_by_date = bit_lib_get_bits_16(block->data, 82, 16); //312
|
||||
uint16_t card_hash = bit_lib_get_bits_16(block->data, 112, 16); //502.1
|
||||
|
||||
FURI_LOG_D(
|
||||
TAG,
|
||||
"%x %x %lx %x %x %x %x %x %x %x",
|
||||
card_view,
|
||||
card_type,
|
||||
card_number,
|
||||
card_layout,
|
||||
card_tech_code,
|
||||
card_use_before_date,
|
||||
card_blank_type,
|
||||
card_valid_to_minutes,
|
||||
card_valid_by_date,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nValidator: %05d",
|
||||
card_number,
|
||||
card_use_before_date_s.day,
|
||||
card_use_before_date_s.month,
|
||||
card_use_before_date_s.year,
|
||||
card_validator);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <nfc/helpers/bit_lib.h>
|
||||
#include <nfc/protocols/mf_classic/mf_classic.h>
|
||||
|
||||
bool parse_transport_block(const MfClassicBlock* block, FuriString* result);
|
Loading…
Reference in New Issue
Block a user