mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2025-02-17 05:48:33 +00:00
Fixes
This commit is contained in:
parent
baca59927b
commit
7fd921227c
2 changed files with 79 additions and 38 deletions
|
@ -511,7 +511,7 @@ void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, ui
|
|||
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);
|
||||
FURI_LOG_I(TAG, "Transport departament: %x", transport_departament);
|
||||
|
||||
uint16_t layout_type = bit_lib_get_bits_16(block->data, 52, 4);
|
||||
if(layout_type == 0xE) {
|
||||
|
@ -520,7 +520,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
layout_type = bit_lib_get_bits_16(block->data, 52, 14);
|
||||
}
|
||||
|
||||
FURI_LOG_D(TAG, "Layout type %x", layout_type);
|
||||
FURI_LOG_I(TAG, "Layout type %x", layout_type);
|
||||
|
||||
uint16_t card_view = 0;
|
||||
uint16_t card_type = 0;
|
||||
|
@ -1483,8 +1483,7 @@ static bool social_moscow_verify_type(Nfc* nfc, MfClassicType type) {
|
|||
}
|
||||
|
||||
static bool social_moscow_verify(Nfc* nfc) {
|
||||
return social_moscow_verify_type(nfc, MfClassicType1k) ||
|
||||
social_moscow_verify_type(nfc, MfClassicType4k);
|
||||
return social_moscow_verify_type(nfc, MfClassicType4k);
|
||||
}
|
||||
|
||||
static bool social_moscow_read(Nfc* nfc, NfcDevice* device) {
|
||||
|
@ -1564,12 +1563,13 @@ static bool social_moscow_parse(const NfcDevice* device, FuriString* parsed_data
|
|||
data->block[60].data[14],
|
||||
furi_string_get_cstr(metro_result),
|
||||
furi_string_get_cstr(ground_result));
|
||||
furi_string_free(metro_result);
|
||||
furi_string_free(ground_result);
|
||||
|
||||
parsed = true;
|
||||
} else {
|
||||
return false;
|
||||
parsed = false;
|
||||
}
|
||||
furi_string_free(ground_result);
|
||||
furi_string_free(metro_result);
|
||||
} while(false);
|
||||
|
||||
return parsed;
|
||||
|
|
|
@ -530,7 +530,7 @@ void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, ui
|
|||
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);
|
||||
FURI_LOG_I(TAG, "Transport departament: %x", transport_departament);
|
||||
|
||||
uint16_t layout_type = bit_lib_get_bits_16(block->data, 52, 4);
|
||||
if(layout_type == 0xE) {
|
||||
|
@ -539,7 +539,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
layout_type = bit_lib_get_bits_16(block->data, 52, 14);
|
||||
}
|
||||
|
||||
FURI_LOG_D(TAG, "Layout type %x", layout_type);
|
||||
FURI_LOG_I(TAG, "Layout type %x", layout_type);
|
||||
|
||||
uint16_t card_view = 0;
|
||||
uint16_t card_type = 0;
|
||||
|
@ -612,6 +612,31 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
card_write_enabled,
|
||||
card_rfu2,
|
||||
card_crc16_2);
|
||||
if(card_valid_by_date == 0) {
|
||||
return false;
|
||||
}
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||
&card_start_trip_minutes_s,
|
||||
1992);
|
||||
furi_string_printf(
|
||||
result,
|
||||
"Number: %010lu\nValid for: %02d.%02d.%04d\nTrips: %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_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 0x06: {
|
||||
|
@ -668,11 +693,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
from_days_to_datetime(card_valid_by_date, &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_date) * 24 * 60 + card_start_trip_time,
|
||||
&card_start_trip_minutes_s,
|
||||
1992);
|
||||
furi_string_printf(
|
||||
|
@ -730,7 +755,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
result,
|
||||
|
@ -783,11 +808,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
from_days_to_datetime(card_use_before_date, &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);
|
||||
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\nTrip from: %02d.%02d.%04d %02d:%02d\nTrips left: %d\nValidator: %05d",
|
||||
|
@ -844,10 +868,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
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_date - 1) * 24 * 60 + card_start_trip_time,
|
||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||
&card_start_trip_minutes_s,
|
||||
1992);
|
||||
furi_string_printf(
|
||||
|
@ -925,10 +949,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
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_date - 1) * 24 * 60 + card_start_trip_time,
|
||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||
&card_start_trip_minutes_s,
|
||||
1992);
|
||||
furi_string_printf(
|
||||
|
@ -995,11 +1019,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
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 - (2 * 24 * 60), &card_start_trip_minutes_s, 1992);
|
||||
from_minutes_to_datetime(card_start_trip_minutes, &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",
|
||||
|
@ -1065,12 +1088,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
from_days_to_datetime(card_use_before_date, &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_valid_to_date) * 24 * 60 + card_valid_for_minutes - card_start_trip_neg_minutes,
|
||||
&card_start_trip_minutes_s,
|
||||
2016); //-time
|
||||
furi_string_printf(
|
||||
|
@ -1405,7 +1427,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
result,
|
||||
|
@ -1441,7 +1463,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||
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);
|
||||
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
result,
|
||||
|
@ -1464,10 +1486,10 @@ static bool troika_get_card_config(TroikaCardConfig* config, MfClassicType type)
|
|||
bool success = true;
|
||||
|
||||
if(type == MfClassicType1k) {
|
||||
config->data_sector = 11;
|
||||
config->data_sector = 4;
|
||||
config->keys = troika_1k_keys;
|
||||
} else if(type == MfClassicType4k) {
|
||||
config->data_sector = 11;
|
||||
config->data_sector = 8;
|
||||
config->keys = troika_4k_keys;
|
||||
} else {
|
||||
success = false;
|
||||
|
@ -1573,20 +1595,39 @@ static bool troika_parse(const NfcDevice* device, FuriString* parsed_data) {
|
|||
|
||||
FuriString* metro_result = furi_string_alloc();
|
||||
FuriString* ground_result = furi_string_alloc();
|
||||
FuriString* tat_result = furi_string_alloc();
|
||||
bool result1 = parse_transport_block(&data->block[32], metro_result);
|
||||
bool result2 = parse_transport_block(&data->block[28], ground_result);
|
||||
if(result1 || result2) {
|
||||
bool result3 = parse_transport_block(&data->block[16], tat_result);
|
||||
furi_string_printf(parsed_data, "#Troyka\n");
|
||||
if(result1) {
|
||||
furi_string_printf(
|
||||
parsed_data,
|
||||
"\e#Troika\n%s\n\e#Ediniy\n%s\n\e#TAT\n",
|
||||
furi_string_get_cstr(metro_result),
|
||||
furi_string_get_cstr(ground_result));
|
||||
furi_string_free(metro_result);
|
||||
furi_string_free(ground_result);
|
||||
parsed = true;
|
||||
} else {
|
||||
return false;
|
||||
"%s\n\e#Metro\n%s\n",
|
||||
furi_string_get_cstr(parsed_data),
|
||||
furi_string_get_cstr(metro_result));
|
||||
FURI_LOG_D(TAG, "Metro branch");
|
||||
}
|
||||
if(result2) {
|
||||
furi_string_printf(
|
||||
parsed_data,
|
||||
"%s\e#Ediniy\n%s\n",
|
||||
furi_string_get_cstr(parsed_data),
|
||||
furi_string_get_cstr(ground_result));
|
||||
FURI_LOG_D(TAG, "Ediny branch");
|
||||
}
|
||||
if(result3) {
|
||||
furi_string_printf(
|
||||
parsed_data,
|
||||
"%s\e#TAT\n%s\n",
|
||||
furi_string_get_cstr(parsed_data),
|
||||
furi_string_get_cstr(tat_result));
|
||||
FURI_LOG_D(TAG, "TAT branch");
|
||||
}
|
||||
furi_string_free(tat_result);
|
||||
furi_string_free(ground_result);
|
||||
furi_string_free(metro_result);
|
||||
parsed = result1 || result2 || result3;
|
||||
} while(false);
|
||||
|
||||
return parsed;
|
||||
|
|
Loading…
Add table
Reference in a new issue