mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-13 23:48:35 -07:00
Merge remote-tracking branch 'upstream/dev' into emv-fixes
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
|
||||
#include <bit_lib.h>
|
||||
#include <applications/services/locale/locale.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <datetime.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
//
|
||||
@@ -173,7 +173,7 @@ static void furi_string_cat_timestamp(
|
||||
const char* date_hdr,
|
||||
const char* time_hdr,
|
||||
uint32_t tmst_1900);
|
||||
static void epoch_1900_datetime_to_furi(uint32_t seconds, FuriHalRtcDateTime* out);
|
||||
static void epoch_1900_datetime_to_furi(uint32_t seconds, DateTime* out);
|
||||
static bool get_file_contents(
|
||||
const MfDesfireApplication* app,
|
||||
const MfDesfireFileId* id,
|
||||
@@ -528,7 +528,7 @@ static void furi_string_cat_timestamp(
|
||||
const char* date_hdr,
|
||||
const char* time_hdr,
|
||||
uint32_t tmst_1900) {
|
||||
FuriHalRtcDateTime tm;
|
||||
DateTime tm;
|
||||
|
||||
epoch_1900_datetime_to_furi(tmst_1900, &tm);
|
||||
|
||||
@@ -551,7 +551,7 @@ static void furi_string_cat_timestamp(
|
||||
}
|
||||
|
||||
// Convert a "1900"-based timestamp to Furi time, assuming a UTC/GMT timezone.
|
||||
static void epoch_1900_datetime_to_furi(uint32_t seconds, FuriHalRtcDateTime* out) {
|
||||
static void epoch_1900_datetime_to_furi(uint32_t seconds, DateTime* out) {
|
||||
uint16_t year, month, day, hour, minute, second;
|
||||
|
||||
// Calculate absolute number of days elapsed since the 1900 epoch
|
||||
@@ -569,17 +569,17 @@ static void epoch_1900_datetime_to_furi(uint32_t seconds, FuriHalRtcDateTime* ou
|
||||
//
|
||||
|
||||
for(year = 1900;; year++) {
|
||||
uint16_t year_days = furi_hal_rtc_get_days_per_year(year);
|
||||
uint16_t year_days = datetime_get_days_per_year(year);
|
||||
if(absolute_days >= year_days)
|
||||
absolute_days -= year_days;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
bool is_leap = furi_hal_rtc_is_leap_year(year);
|
||||
bool is_leap = datetime_is_leap_year(year);
|
||||
|
||||
for(month = 1;; month++) {
|
||||
uint8_t days_in_month = furi_hal_rtc_get_days_per_month(is_leap, month);
|
||||
uint8_t days_in_month = datetime_get_days_per_month(is_leap, month);
|
||||
if(absolute_days >= days_in_month)
|
||||
absolute_days -= days_in_month;
|
||||
else
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
#include "protocols/emv/emv.h"
|
||||
#include "helpers/nfc_emv_parser.h"
|
||||
|
||||
#include <furi_hal_rtc.h>
|
||||
|
||||
#define TAG "EMV"
|
||||
|
||||
bool emv_get_currency_name(uint16_t cur_code, FuriString* currency_name) {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <lib/nfc/protocols/mf_desfire/mf_desfire.h>
|
||||
|
||||
#include <applications/services/locale/locale.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <datetime.h>
|
||||
|
||||
static const MfDesfireApplicationId itso_app_id = {.data = {0x16, 0x02, 0xa0}};
|
||||
static const MfDesfireFileId itso_file_id = 0x0f;
|
||||
@@ -87,8 +87,8 @@ static bool itso_parse(const NfcDevice* device, FuriString* parsed_data) {
|
||||
furi_string_push_back(parsed_data, ' ');
|
||||
}
|
||||
|
||||
FuriHalRtcDateTime timestamp = {0};
|
||||
furi_hal_rtc_timestamp_to_datetime(unixTimestamp, ×tamp);
|
||||
DateTime timestamp = {0};
|
||||
datetime_timestamp_to_datetime(unixTimestamp, ×tamp);
|
||||
FuriString* timestamp_str = furi_string_alloc();
|
||||
locale_format_date(timestamp_str, ×tamp, locale_get_date_format(), "-");
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||
|
||||
#include <bit_lib.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <datetime.h>
|
||||
|
||||
#define TAG "Kazan"
|
||||
|
||||
@@ -282,12 +282,12 @@ static bool kazan_parse(const NfcDevice* device, FuriString* parsed_data) {
|
||||
enum SubscriptionType subscription_type =
|
||||
get_subscription_type(block_start_ptr[0], tariff_name);
|
||||
|
||||
FuriHalRtcDateTime valid_from;
|
||||
DateTime valid_from;
|
||||
valid_from.year = 2000 + block_start_ptr[1];
|
||||
valid_from.month = block_start_ptr[2];
|
||||
valid_from.day = block_start_ptr[3];
|
||||
|
||||
FuriHalRtcDateTime valid_to;
|
||||
DateTime valid_to;
|
||||
valid_to.year = 2000 + block_start_ptr[4];
|
||||
valid_to.month = block_start_ptr[5];
|
||||
valid_to.day = block_start_ptr[6];
|
||||
@@ -295,7 +295,7 @@ static bool kazan_parse(const NfcDevice* device, FuriString* parsed_data) {
|
||||
const uint8_t last_trip_block_number = 2;
|
||||
block_start_ptr = &data->block[start_block_num + last_trip_block_number].data[1];
|
||||
|
||||
FuriHalRtcDateTime last_trip;
|
||||
DateTime last_trip;
|
||||
last_trip.year = 2000 + block_start_ptr[0];
|
||||
last_trip.month = block_start_ptr[1];
|
||||
last_trip.day = block_start_ptr[2];
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
#include "nfc_supported_card_plugin.h"
|
||||
#include <flipper_application.h>
|
||||
|
||||
#include <machine/endian.h>
|
||||
#include <nfc/protocols/st25tb/st25tb.h>
|
||||
|
||||
#include <machine/endian.h>
|
||||
|
||||
#define TAG "MyKey"
|
||||
|
||||
const uint32_t blankBlock18 = 0x480FCD8F, blankBlock19 = 0x070082C0;
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <lib/nfc/protocols/mf_desfire/mf_desfire.h>
|
||||
|
||||
#include <applications/services/locale/locale.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <datetime.h>
|
||||
|
||||
static const MfDesfireApplicationId opal_app_id = {.data = {0x31, 0x45, 0x53}};
|
||||
|
||||
@@ -78,11 +78,11 @@ typedef struct __attribute__((__packed__)) {
|
||||
|
||||
static_assert(sizeof(OpalFile) == 16, "OpalFile");
|
||||
|
||||
// Converts an Opal timestamp to FuriHalRtcDateTime.
|
||||
// Converts an Opal timestamp to DateTime.
|
||||
//
|
||||
// Opal measures days since 1980-01-01 and minutes since midnight, and presumes
|
||||
// all days are 1440 minutes.
|
||||
static void opal_date_time_to_furi(uint16_t days, uint16_t minutes, FuriHalRtcDateTime* out) {
|
||||
static void opal_date_time_to_furi(uint16_t days, uint16_t minutes, DateTime* out) {
|
||||
out->year = 1980;
|
||||
out->month = 1;
|
||||
// 1980-01-01 is a Tuesday
|
||||
@@ -93,7 +93,7 @@ static void opal_date_time_to_furi(uint16_t days, uint16_t minutes, FuriHalRtcDa
|
||||
|
||||
// What year is it?
|
||||
for(;;) {
|
||||
const uint16_t num_days_in_year = furi_hal_rtc_get_days_per_year(out->year);
|
||||
const uint16_t num_days_in_year = datetime_get_days_per_year(out->year);
|
||||
if(days < num_days_in_year) break;
|
||||
days -= num_days_in_year;
|
||||
out->year++;
|
||||
@@ -104,8 +104,8 @@ static void opal_date_time_to_furi(uint16_t days, uint16_t minutes, FuriHalRtcDa
|
||||
|
||||
for(;;) {
|
||||
// What month is it?
|
||||
const bool is_leap = furi_hal_rtc_is_leap_year(out->year);
|
||||
const uint8_t num_days_in_month = furi_hal_rtc_get_days_per_month(is_leap, out->month);
|
||||
const bool is_leap = datetime_is_leap_year(out->year);
|
||||
const uint8_t num_days_in_month = datetime_get_days_per_month(is_leap, out->month);
|
||||
if(days <= num_days_in_month) break;
|
||||
days -= num_days_in_month;
|
||||
out->month++;
|
||||
@@ -154,7 +154,7 @@ static bool opal_parse(const NfcDevice* device, FuriString* parsed_data) {
|
||||
const uint8_t balance_cents = balance % 100;
|
||||
const int32_t balance_dollars = balance / 100;
|
||||
|
||||
FuriHalRtcDateTime timestamp;
|
||||
DateTime timestamp;
|
||||
opal_date_time_to_furi(opal_file->days, opal_file->minutes, ×tamp);
|
||||
|
||||
// Usages 4..6 associated with the Manly Ferry, which correspond to
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||
|
||||
#include <bit_lib.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <datetime.h>
|
||||
|
||||
#define TAG "Social_Moscow"
|
||||
|
||||
@@ -61,24 +61,24 @@ static const MfClassicKeyPair social_moscow_4k_keys[] = {
|
||||
|
||||
#define TOPBIT(X) (1 << ((X)-1))
|
||||
|
||||
void from_days_to_datetime(uint16_t days, FuriHalRtcDateTime* datetime, uint16_t start_year) {
|
||||
void from_days_to_datetime(uint16_t days, DateTime* datetime, uint16_t start_year) {
|
||||
uint32_t timestamp = days * 24 * 60 * 60;
|
||||
FuriHalRtcDateTime start_datetime = {0};
|
||||
DateTime 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);
|
||||
furi_hal_rtc_timestamp_to_datetime(timestamp, datetime);
|
||||
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||
datetime_timestamp_to_datetime(timestamp, datetime);
|
||||
}
|
||||
|
||||
void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, uint16_t start_year) {
|
||||
void from_minutes_to_datetime(uint32_t minutes, DateTime* datetime, uint16_t start_year) {
|
||||
uint32_t timestamp = minutes * 60;
|
||||
FuriHalRtcDateTime start_datetime = {0};
|
||||
DateTime 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);
|
||||
furi_hal_rtc_timestamp_to_datetime(timestamp, datetime);
|
||||
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||
datetime_timestamp_to_datetime(timestamp, datetime);
|
||||
}
|
||||
|
||||
bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
@@ -221,10 +221,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_extended,
|
||||
card_crc16_2);
|
||||
card_validator = card_validator1 * 1024 + card_validator2;
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -283,7 +283,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_hash,
|
||||
card_valid_from_date,
|
||||
card_rfu3);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
@@ -336,10 +336,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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(
|
||||
@@ -397,9 +397,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type,
|
||||
card_rfu3,
|
||||
card_transfer_in_metro);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -478,9 +478,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type2,
|
||||
card_rfu5,
|
||||
card_transfer_in_metro);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -548,10 +548,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_blocked,
|
||||
card_zoo,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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(
|
||||
@@ -618,10 +618,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_blocked,
|
||||
card_extended,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -684,10 +684,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_blocked);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016);
|
||||
furi_string_printf(
|
||||
result,
|
||||
@@ -760,10 +760,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_blocked,
|
||||
card_extended,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
DateTime 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,
|
||||
@@ -825,11 +825,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_route,
|
||||
card_passages_ground_transport,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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(
|
||||
@@ -893,10 +893,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_extended,
|
||||
card_route,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -959,7 +959,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_app_code4,
|
||||
card_type4,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
@@ -995,7 +995,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_valid_to_minutes,
|
||||
card_valid_by_date,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||
|
||||
#include <bit_lib.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <datetime.h>
|
||||
|
||||
#define TAG "Troika"
|
||||
|
||||
@@ -62,24 +62,24 @@ static const MfClassicKeyPair troika_4k_keys[] = {
|
||||
|
||||
#define TOPBIT(X) (1 << ((X)-1))
|
||||
|
||||
void from_days_to_datetime(uint16_t days, FuriHalRtcDateTime* datetime, uint16_t start_year) {
|
||||
void from_days_to_datetime(uint16_t days, DateTime* datetime, uint16_t start_year) {
|
||||
uint32_t timestamp = days * 24 * 60 * 60;
|
||||
FuriHalRtcDateTime start_datetime = {0};
|
||||
DateTime 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);
|
||||
furi_hal_rtc_timestamp_to_datetime(timestamp, datetime);
|
||||
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||
datetime_timestamp_to_datetime(timestamp, datetime);
|
||||
}
|
||||
|
||||
void from_minutes_to_datetime(uint32_t minutes, FuriHalRtcDateTime* datetime, uint16_t start_year) {
|
||||
void from_minutes_to_datetime(uint32_t minutes, DateTime* datetime, uint16_t start_year) {
|
||||
uint32_t timestamp = minutes * 60;
|
||||
FuriHalRtcDateTime start_datetime = {0};
|
||||
DateTime 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);
|
||||
furi_hal_rtc_timestamp_to_datetime(timestamp, datetime);
|
||||
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||
datetime_timestamp_to_datetime(timestamp, datetime);
|
||||
}
|
||||
|
||||
bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
@@ -170,10 +170,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
if(card_valid_by_date == 0) {
|
||||
return false;
|
||||
}
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -247,10 +247,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_extended,
|
||||
card_crc16_2);
|
||||
card_validator = card_validator1 * 1024 + card_validator2;
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -309,7 +309,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_hash,
|
||||
card_valid_from_date,
|
||||
card_rfu3);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
@@ -362,10 +362,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
DateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016);
|
||||
furi_string_printf(
|
||||
result,
|
||||
@@ -422,9 +422,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type,
|
||||
card_rfu3,
|
||||
card_transfer_in_metro);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -503,9 +503,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type2,
|
||||
card_rfu5,
|
||||
card_transfer_in_metro);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime 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,
|
||||
@@ -573,10 +573,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_blocked,
|
||||
card_zoo,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 1992);
|
||||
furi_string_printf(
|
||||
result,
|
||||
@@ -642,10 +642,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_blocked,
|
||||
card_extended,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
DateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
(card_valid_to_date)*24 * 60 + card_valid_for_minutes - card_start_trip_neg_minutes,
|
||||
&card_start_trip_minutes_s,
|
||||
@@ -707,10 +707,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_transport_type3,
|
||||
card_transport_type4,
|
||||
card_blocked);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016);
|
||||
furi_string_printf(
|
||||
result,
|
||||
@@ -783,10 +783,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_blocked,
|
||||
card_extended,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 2016);
|
||||
|
||||
FuriHalRtcDateTime card_start_trip_minutes_s = {0};
|
||||
DateTime 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,
|
||||
@@ -848,11 +848,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_route,
|
||||
card_passages_ground_transport,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2019);
|
||||
furi_string_printf(
|
||||
result,
|
||||
@@ -915,10 +915,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_extended,
|
||||
card_route,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime 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};
|
||||
DateTime card_start_trip_minutes_s = {0};
|
||||
from_minutes_to_datetime(
|
||||
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes,
|
||||
&card_start_trip_minutes_s,
|
||||
@@ -981,7 +981,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_app_code4,
|
||||
card_type4,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
@@ -1017,7 +1017,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||
card_valid_to_minutes,
|
||||
card_valid_by_date,
|
||||
card_hash);
|
||||
FuriHalRtcDateTime card_use_before_date_s = {0};
|
||||
DateTime card_use_before_date_s = {0};
|
||||
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
|
||||
|
||||
furi_string_printf(
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
#include "nfc_supported_card_plugin.h"
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
|
||||
#include <nfc/nfc_device.h>
|
||||
#include <bit_lib.h>
|
||||
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||
|
||||
#include <bit_lib.h>
|
||||
|
||||
#define TAG "TwoCities"
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -29,11 +29,11 @@
|
||||
#include "protocols/mf_classic/mf_classic.h"
|
||||
|
||||
#include <bit_lib.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
#include <datetime.h>
|
||||
|
||||
#define TAG "Umarsh"
|
||||
|
||||
bool parse_datetime(uint16_t date, FuriHalRtcDateTime* result) {
|
||||
bool parse_datetime(uint16_t date, DateTime* result) {
|
||||
result->year = 2000 + (date >> 9);
|
||||
result->month = date >> 5 & 0x0F;
|
||||
result->day = date & 0x1F;
|
||||
@@ -81,13 +81,13 @@ static bool umarsh_parse(const NfcDevice* device, FuriString* parsed_data) {
|
||||
const uint16_t balance_rub = (bit_lib_bytes_to_num_be(block_start_ptr + 8, 2)) & 0x7FFF;
|
||||
const uint8_t balance_kop = bit_lib_bytes_to_num_be(block_start_ptr + 10, 1) & 0x7F;
|
||||
|
||||
FuriHalRtcDateTime expiry_datetime;
|
||||
DateTime expiry_datetime;
|
||||
bool is_expiry_datetime_valid = parse_datetime(expiry_date, &expiry_datetime);
|
||||
|
||||
FuriHalRtcDateTime valid_to_datetime;
|
||||
DateTime valid_to_datetime;
|
||||
bool is_valid_to_datetime_valid = parse_datetime(valid_to, &valid_to_datetime);
|
||||
|
||||
FuriHalRtcDateTime last_refill_datetime;
|
||||
DateTime last_refill_datetime;
|
||||
bool is_last_refill_datetime_valid =
|
||||
parse_datetime(last_refill_date, &last_refill_datetime);
|
||||
|
||||
|
||||
@@ -97,8 +97,8 @@ static bool zolotaya_korona_parse(const NfcDevice* device, FuriString* parsed_da
|
||||
const uint8_t last_refill_amount_kop = last_refill_amount % 100;
|
||||
const uint16_t refill_counter = bit_lib_bytes_to_num_le(block_start_ptr + 10, 2);
|
||||
|
||||
FuriHalRtcDateTime last_refill_datetime = {0};
|
||||
furi_hal_rtc_timestamp_to_datetime(last_refill_timestamp, &last_refill_datetime);
|
||||
DateTime last_refill_datetime = {0};
|
||||
datetime_timestamp_to_datetime(last_refill_timestamp, &last_refill_datetime);
|
||||
|
||||
// block 2: trip block
|
||||
block_start_ptr = &data->block[start_trip_block_number + 2].data[0];
|
||||
@@ -110,8 +110,8 @@ static bool zolotaya_korona_parse(const NfcDevice* device, FuriString* parsed_da
|
||||
const uint32_t prev_balance_rub = prev_balance / 100;
|
||||
const uint8_t prev_balance_kop = prev_balance % 100;
|
||||
|
||||
FuriHalRtcDateTime last_trip_datetime = {0};
|
||||
furi_hal_rtc_timestamp_to_datetime(last_trip_timestamp, &last_trip_datetime);
|
||||
DateTime last_trip_datetime = {0};
|
||||
datetime_timestamp_to_datetime(last_trip_timestamp, &last_trip_datetime);
|
||||
|
||||
// PARSE DATA FROM PURSE SECTOR
|
||||
const uint8_t start_purse_block_number =
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "protocols/mf_classic/mf_classic.h"
|
||||
|
||||
#include <bit_lib.h>
|
||||
#include <furi_hal_rtc.h>
|
||||
|
||||
#define TAG "Zolotaya Korona Online"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user