mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-28 03:59:58 -07:00
Merge branch 'dev' of https://github.com/DarkFlippers/unleashed-firmware into xfw-dev
This commit is contained in:
@@ -112,6 +112,7 @@ void nfc_render_emv_transactions(const EmvApplication* apl, FuriString* str) {
|
|||||||
if(!apl->trans[i].amount) {
|
if(!apl->trans[i].amount) {
|
||||||
furi_string_cat_printf(str, "???");
|
furi_string_cat_printf(str, "???");
|
||||||
} else {
|
} else {
|
||||||
|
FURI_LOG_D("EMV Render", "Amount: %llX\n", apl->trans[i].amount);
|
||||||
uint8_t amount_bytes[6];
|
uint8_t amount_bytes[6];
|
||||||
bit_lib_num_to_bytes_le(apl->trans[i].amount, 6, amount_bytes);
|
bit_lib_num_to_bytes_le(apl->trans[i].amount, 6, amount_bytes);
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include <bit_lib.h>
|
#include <bit_lib.h>
|
||||||
#include <applications/services/locale/locale.h>
|
#include <applications/services/locale/locale.h>
|
||||||
#include <datetime/datetime.h>
|
#include <datetime.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -23,8 +23,6 @@
|
|||||||
#include "protocols/emv/emv.h"
|
#include "protocols/emv/emv.h"
|
||||||
#include "helpers/nfc_emv_parser.h"
|
#include "helpers/nfc_emv_parser.h"
|
||||||
|
|
||||||
#include <furi_hal_rtc.h>
|
|
||||||
|
|
||||||
#define TAG "EMV"
|
#define TAG "EMV"
|
||||||
|
|
||||||
bool emv_get_currency_name(uint16_t cur_code, FuriString* currency_name) {
|
bool emv_get_currency_name(uint16_t cur_code, FuriString* currency_name) {
|
||||||
@@ -99,7 +97,7 @@ static bool emv_parse(const NfcDevice* device, FuriString* parsed_data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(app.effective_month) {
|
if(app.effective_month) {
|
||||||
char day[] = "??";
|
char day[] = "--";
|
||||||
if(app.effective_day) itoa(app.effective_day, day, 16);
|
if(app.effective_day) itoa(app.effective_day, day, 16);
|
||||||
if(day[1] == '\0') {
|
if(day[1] == '\0') {
|
||||||
day[1] = day[0];
|
day[1] = day[0];
|
||||||
@@ -117,7 +115,7 @@ static bool emv_parse(const NfcDevice* device, FuriString* parsed_data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(app.exp_month) {
|
if(app.exp_month) {
|
||||||
char day[] = "??";
|
char day[] = "--";
|
||||||
if(app.exp_day) itoa(app.exp_day, day, 16);
|
if(app.exp_day) itoa(app.exp_day, day, 16);
|
||||||
if(day[1] == '\0') {
|
if(day[1] == '\0') {
|
||||||
day[1] = day[0];
|
day[1] = day[0];
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <lib/nfc/protocols/mf_desfire/mf_desfire.h>
|
#include <lib/nfc/protocols/mf_desfire/mf_desfire.h>
|
||||||
|
|
||||||
#include <applications/services/locale/locale.h>
|
#include <applications/services/locale/locale.h>
|
||||||
#include <datetime/datetime.h>
|
#include <datetime.h>
|
||||||
|
|
||||||
static const MfDesfireApplicationId itso_app_id = {.data = {0x16, 0x02, 0xa0}};
|
static const MfDesfireApplicationId itso_app_id = {.data = {0x16, 0x02, 0xa0}};
|
||||||
static const MfDesfireFileId itso_file_id = 0x0f;
|
static const MfDesfireFileId itso_file_id = 0x0f;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||||
|
|
||||||
#include <bit_lib.h>
|
#include <bit_lib.h>
|
||||||
#include <furi_hal_rtc.h>
|
#include <datetime.h>
|
||||||
|
|
||||||
#define TAG "Kazan"
|
#define TAG "Kazan"
|
||||||
|
|
||||||
@@ -282,12 +282,12 @@ static bool kazan_parse(const NfcDevice* device, FuriString* parsed_data) {
|
|||||||
enum SubscriptionType subscription_type =
|
enum SubscriptionType subscription_type =
|
||||||
get_subscription_type(block_start_ptr[0], tariff_name);
|
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.year = 2000 + block_start_ptr[1];
|
||||||
valid_from.month = block_start_ptr[2];
|
valid_from.month = block_start_ptr[2];
|
||||||
valid_from.day = block_start_ptr[3];
|
valid_from.day = block_start_ptr[3];
|
||||||
|
|
||||||
FuriHalRtcDateTime valid_to;
|
DateTime valid_to;
|
||||||
valid_to.year = 2000 + block_start_ptr[4];
|
valid_to.year = 2000 + block_start_ptr[4];
|
||||||
valid_to.month = block_start_ptr[5];
|
valid_to.month = block_start_ptr[5];
|
||||||
valid_to.day = block_start_ptr[6];
|
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;
|
const uint8_t last_trip_block_number = 2;
|
||||||
block_start_ptr = &data->block[start_block_num + last_trip_block_number].data[1];
|
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.year = 2000 + block_start_ptr[0];
|
||||||
last_trip.month = block_start_ptr[1];
|
last_trip.month = block_start_ptr[1];
|
||||||
last_trip.day = block_start_ptr[2];
|
last_trip.day = block_start_ptr[2];
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
#include "nfc_supported_card_plugin.h"
|
#include "nfc_supported_card_plugin.h"
|
||||||
#include <flipper_application.h>
|
#include <flipper_application.h>
|
||||||
|
|
||||||
#include <machine/endian.h>
|
|
||||||
#include <nfc/protocols/st25tb/st25tb.h>
|
#include <nfc/protocols/st25tb/st25tb.h>
|
||||||
|
|
||||||
|
#include <machine/endian.h>
|
||||||
|
|
||||||
#define TAG "MyKey"
|
#define TAG "MyKey"
|
||||||
|
|
||||||
const uint32_t blankBlock18 = 0x480FCD8F, blankBlock19 = 0x070082C0;
|
const uint32_t blankBlock18 = 0x480FCD8F, blankBlock19 = 0x070082C0;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <lib/nfc/protocols/mf_desfire/mf_desfire.h>
|
#include <lib/nfc/protocols/mf_desfire/mf_desfire.h>
|
||||||
|
|
||||||
#include <applications/services/locale/locale.h>
|
#include <applications/services/locale/locale.h>
|
||||||
#include <datetime/datetime.h>
|
#include <datetime.h>
|
||||||
|
|
||||||
static const MfDesfireApplicationId opal_app_id = {.data = {0x31, 0x45, 0x53}};
|
static const MfDesfireApplicationId opal_app_id = {.data = {0x31, 0x45, 0x53}};
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||||
|
|
||||||
#include <bit_lib.h>
|
#include <bit_lib.h>
|
||||||
#include <furi_hal_rtc.h>
|
#include <datetime.h>
|
||||||
|
|
||||||
#define TAG "Social_Moscow"
|
#define TAG "Social_Moscow"
|
||||||
|
|
||||||
@@ -59,24 +59,24 @@ static const MfClassicKeyPair social_moscow_4k_keys[] = {
|
|||||||
{.a = 0xa229e68ad9e5, .b = 0x49c2b5296ef4}, {.a = 0xa229e68ad9e5, .b = 0x49c2b5296ef4},
|
{.a = 0xa229e68ad9e5, .b = 0x49c2b5296ef4}, {.a = 0xa229e68ad9e5, .b = 0x49c2b5296ef4},
|
||||||
};
|
};
|
||||||
|
|
||||||
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;
|
uint32_t timestamp = days * 24 * 60 * 60;
|
||||||
FuriHalRtcDateTime start_datetime = {0};
|
DateTime start_datetime = {0};
|
||||||
start_datetime.year = start_year - 1;
|
start_datetime.year = start_year - 1;
|
||||||
start_datetime.month = 12;
|
start_datetime.month = 12;
|
||||||
start_datetime.day = 31;
|
start_datetime.day = 31;
|
||||||
timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime);
|
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||||
furi_hal_rtc_timestamp_to_datetime(timestamp, 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;
|
uint32_t timestamp = minutes * 60;
|
||||||
FuriHalRtcDateTime start_datetime = {0};
|
DateTime start_datetime = {0};
|
||||||
start_datetime.year = start_year - 1;
|
start_datetime.year = start_year - 1;
|
||||||
start_datetime.month = 12;
|
start_datetime.month = 12;
|
||||||
start_datetime.day = 31;
|
start_datetime.day = 31;
|
||||||
timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime);
|
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||||
furi_hal_rtc_timestamp_to_datetime(timestamp, datetime);
|
datetime_timestamp_to_datetime(timestamp, datetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||||
@@ -219,10 +219,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_extended,
|
card_extended,
|
||||||
card_crc16_2);
|
card_crc16_2);
|
||||||
card_validator = card_validator1 * 1024 + card_validator2;
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -281,7 +281,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_hash,
|
card_hash,
|
||||||
card_valid_from_date,
|
card_valid_from_date,
|
||||||
card_rfu3);
|
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);
|
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992);
|
||||||
|
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
@@ -334,10 +334,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type3,
|
card_transport_type3,
|
||||||
card_transport_type4,
|
card_transport_type4,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 2016);
|
card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 2016);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
@@ -395,9 +395,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type,
|
card_transport_type,
|
||||||
card_rfu3,
|
card_rfu3,
|
||||||
card_transfer_in_metro);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
|
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -476,9 +476,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type2,
|
card_transport_type2,
|
||||||
card_rfu5,
|
card_rfu5,
|
||||||
card_transfer_in_metro);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
|
(card_start_trip_date - 1) * 24 * 60 + card_start_trip_time,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -546,10 +546,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_blocked,
|
card_blocked,
|
||||||
card_zoo,
|
card_zoo,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 1992);
|
card_start_trip_minutes - (2 * 24 * 60), &card_start_trip_minutes_s, 1992);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
@@ -616,10 +616,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_blocked,
|
card_blocked,
|
||||||
card_extended,
|
card_extended,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_valid_to_date - 1) * 24 * 60 + card_valid_for_minutes -
|
(card_valid_to_date - 1) * 24 * 60 + card_valid_for_minutes -
|
||||||
card_start_trip_neg_minutes,
|
card_start_trip_neg_minutes,
|
||||||
@@ -682,10 +682,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type3,
|
card_transport_type3,
|
||||||
card_transport_type4,
|
card_transport_type4,
|
||||||
card_blocked);
|
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);
|
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);
|
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
result,
|
result,
|
||||||
@@ -758,10 +758,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_blocked,
|
card_blocked,
|
||||||
card_extended,
|
card_extended,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_use_before_date + 1) * 24 * 60 + card_valid_for_minutes -
|
(card_use_before_date + 1) * 24 * 60 + card_valid_for_minutes -
|
||||||
card_start_trip_neg_minutes,
|
card_start_trip_neg_minutes,
|
||||||
@@ -823,11 +823,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_route,
|
card_route,
|
||||||
card_passages_ground_transport,
|
card_passages_ground_transport,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
card_start_trip_minutes - (24 * 60), &card_start_trip_minutes_s, 2019);
|
card_start_trip_minutes - (24 * 60), &card_start_trip_minutes_s, 2019);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
@@ -891,10 +891,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_extended,
|
card_extended,
|
||||||
card_route,
|
card_route,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes - 24 * 60,
|
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes - 24 * 60,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -957,7 +957,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_app_code4,
|
card_app_code4,
|
||||||
card_type4,
|
card_type4,
|
||||||
card_hash);
|
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);
|
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
|
||||||
|
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
@@ -993,7 +993,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_valid_to_minutes,
|
card_valid_to_minutes,
|
||||||
card_valid_by_date,
|
card_valid_by_date,
|
||||||
card_hash);
|
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);
|
from_days_to_datetime(card_valid_by_date - 1, &card_use_before_date_s, 1992);
|
||||||
|
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||||
|
|
||||||
#include <bit_lib.h>
|
#include <bit_lib.h>
|
||||||
#include <furi_hal_rtc.h>
|
#include <datetime.h>
|
||||||
|
|
||||||
#define TAG "Troika"
|
#define TAG "Troika"
|
||||||
|
|
||||||
@@ -60,24 +60,24 @@ static const MfClassicKeyPair troika_4k_keys[] = {
|
|||||||
{.a = 0x518dc6eea089, .b = 0x97c64ac98ca4}, {.a = 0xbb52f8cce07f, .b = 0x6b6119752c70},
|
{.a = 0x518dc6eea089, .b = 0x97c64ac98ca4}, {.a = 0xbb52f8cce07f, .b = 0x6b6119752c70},
|
||||||
};
|
};
|
||||||
|
|
||||||
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;
|
uint32_t timestamp = days * 24 * 60 * 60;
|
||||||
FuriHalRtcDateTime start_datetime = {0};
|
DateTime start_datetime = {0};
|
||||||
start_datetime.year = start_year - 1;
|
start_datetime.year = start_year - 1;
|
||||||
start_datetime.month = 12;
|
start_datetime.month = 12;
|
||||||
start_datetime.day = 31;
|
start_datetime.day = 31;
|
||||||
timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime);
|
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||||
furi_hal_rtc_timestamp_to_datetime(timestamp, 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;
|
uint32_t timestamp = minutes * 60;
|
||||||
FuriHalRtcDateTime start_datetime = {0};
|
DateTime start_datetime = {0};
|
||||||
start_datetime.year = start_year - 1;
|
start_datetime.year = start_year - 1;
|
||||||
start_datetime.month = 12;
|
start_datetime.month = 12;
|
||||||
start_datetime.day = 31;
|
start_datetime.day = 31;
|
||||||
timestamp += furi_hal_rtc_datetime_to_timestamp(&start_datetime);
|
timestamp += datetime_datetime_to_timestamp(&start_datetime);
|
||||||
furi_hal_rtc_timestamp_to_datetime(timestamp, datetime);
|
datetime_timestamp_to_datetime(timestamp, datetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
||||||
@@ -168,10 +168,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
if(card_valid_by_date == 0) {
|
if(card_valid_by_date == 0) {
|
||||||
return false;
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -245,10 +245,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_extended,
|
card_extended,
|
||||||
card_crc16_2);
|
card_crc16_2);
|
||||||
card_validator = card_validator1 * 1024 + card_validator2;
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -307,7 +307,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_hash,
|
card_hash,
|
||||||
card_valid_from_date,
|
card_valid_from_date,
|
||||||
card_rfu3);
|
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);
|
from_days_to_datetime(card_use_before_date, &card_use_before_date_s, 1992);
|
||||||
|
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
@@ -360,10 +360,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type3,
|
card_transport_type3,
|
||||||
card_transport_type4,
|
card_transport_type4,
|
||||||
card_hash);
|
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);
|
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);
|
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
result,
|
result,
|
||||||
@@ -420,9 +420,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type,
|
card_transport_type,
|
||||||
card_rfu3,
|
card_rfu3,
|
||||||
card_transfer_in_metro);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -501,9 +501,9 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type2,
|
card_transport_type2,
|
||||||
card_rfu5,
|
card_rfu5,
|
||||||
card_transfer_in_metro);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
(card_start_trip_date) * 24 * 60 + card_start_trip_time,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -571,10 +571,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_blocked,
|
card_blocked,
|
||||||
card_zoo,
|
card_zoo,
|
||||||
card_hash);
|
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);
|
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);
|
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 1992);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
result,
|
result,
|
||||||
@@ -640,10 +640,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_blocked,
|
card_blocked,
|
||||||
card_extended,
|
card_extended,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_valid_to_date) * 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,
|
&card_start_trip_minutes_s,
|
||||||
@@ -705,10 +705,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_transport_type3,
|
card_transport_type3,
|
||||||
card_transport_type4,
|
card_transport_type4,
|
||||||
card_blocked);
|
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);
|
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);
|
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2016);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
result,
|
result,
|
||||||
@@ -781,10 +781,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_blocked,
|
card_blocked,
|
||||||
card_extended,
|
card_extended,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
(card_use_before_date + 1) * 24 * 60 + card_valid_for_minutes -
|
(card_use_before_date + 1) * 24 * 60 + card_valid_for_minutes -
|
||||||
card_start_trip_neg_minutes,
|
card_start_trip_neg_minutes,
|
||||||
@@ -846,11 +846,11 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_route,
|
card_route,
|
||||||
card_passages_ground_transport,
|
card_passages_ground_transport,
|
||||||
card_hash);
|
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);
|
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);
|
from_minutes_to_datetime(card_start_trip_minutes, &card_start_trip_minutes_s, 2019);
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
result,
|
result,
|
||||||
@@ -913,10 +913,10 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_extended,
|
card_extended,
|
||||||
card_route,
|
card_route,
|
||||||
card_hash);
|
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);
|
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(
|
from_minutes_to_datetime(
|
||||||
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes,
|
card_valid_from_date + card_valid_for_minutes - card_start_trip_neg_minutes,
|
||||||
&card_start_trip_minutes_s,
|
&card_start_trip_minutes_s,
|
||||||
@@ -979,7 +979,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_app_code4,
|
card_app_code4,
|
||||||
card_type4,
|
card_type4,
|
||||||
card_hash);
|
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);
|
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
|
||||||
|
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
@@ -1015,7 +1015,7 @@ bool parse_transport_block(const MfClassicBlock* block, FuriString* result) {
|
|||||||
card_valid_to_minutes,
|
card_valid_to_minutes,
|
||||||
card_valid_by_date,
|
card_valid_by_date,
|
||||||
card_hash);
|
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);
|
from_days_to_datetime(card_valid_by_date, &card_use_before_date_s, 1992);
|
||||||
|
|
||||||
furi_string_printf(
|
furi_string_printf(
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
#include "nfc_supported_card_plugin.h"
|
#include "nfc_supported_card_plugin.h"
|
||||||
|
|
||||||
#include <flipper_application/flipper_application.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 <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
|
||||||
|
|
||||||
|
#include <bit_lib.h>
|
||||||
|
|
||||||
#define TAG "TwoCities"
|
#define TAG "TwoCities"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
#include "protocols/mf_classic/mf_classic.h"
|
#include "protocols/mf_classic/mf_classic.h"
|
||||||
|
|
||||||
#include <bit_lib.h>
|
#include <bit_lib.h>
|
||||||
#include <datetime/datetime.h>
|
#include <datetime.h>
|
||||||
|
|
||||||
#define TAG "Umarsh"
|
#define TAG "Umarsh"
|
||||||
|
|
||||||
|
|||||||
@@ -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 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);
|
const uint16_t refill_counter = bit_lib_bytes_to_num_le(block_start_ptr + 10, 2);
|
||||||
|
|
||||||
FuriHalRtcDateTime last_refill_datetime = {0};
|
DateTime last_refill_datetime = {0};
|
||||||
furi_hal_rtc_timestamp_to_datetime(last_refill_timestamp, &last_refill_datetime);
|
datetime_timestamp_to_datetime(last_refill_timestamp, &last_refill_datetime);
|
||||||
|
|
||||||
// block 2: trip block
|
// block 2: trip block
|
||||||
block_start_ptr = &data->block[start_trip_block_number + 2].data[0];
|
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 uint32_t prev_balance_rub = prev_balance / 100;
|
||||||
const uint8_t prev_balance_kop = prev_balance % 100;
|
const uint8_t prev_balance_kop = prev_balance % 100;
|
||||||
|
|
||||||
FuriHalRtcDateTime last_trip_datetime = {0};
|
DateTime last_trip_datetime = {0};
|
||||||
furi_hal_rtc_timestamp_to_datetime(last_trip_timestamp, &last_trip_datetime);
|
datetime_timestamp_to_datetime(last_trip_timestamp, &last_trip_datetime);
|
||||||
|
|
||||||
// PARSE DATA FROM PURSE SECTOR
|
// PARSE DATA FROM PURSE SECTOR
|
||||||
const uint8_t start_purse_block_number =
|
const uint8_t start_purse_block_number =
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include "protocols/mf_classic/mf_classic.h"
|
#include "protocols/mf_classic/mf_classic.h"
|
||||||
|
|
||||||
#include <bit_lib.h>
|
#include <bit_lib.h>
|
||||||
#include <furi_hal_rtc.h>
|
|
||||||
|
|
||||||
#define TAG "Zolotaya Korona Online"
|
#define TAG "Zolotaya Korona Online"
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ void subghz_scene_save_name_on_enter(void* context) {
|
|||||||
FuriString* dir_name = furi_string_alloc();
|
FuriString* dir_name = furi_string_alloc();
|
||||||
|
|
||||||
char file_name_buf[SUBGHZ_MAX_LEN_NAME] = {0};
|
char file_name_buf[SUBGHZ_MAX_LEN_NAME] = {0};
|
||||||
FuriHalRtcDateTime* datetime = subghz->save_datetime_set ? &subghz->save_datetime : NULL;
|
DateTime* datetime = subghz->save_datetime_set ? &subghz->save_datetime : NULL;
|
||||||
subghz->save_datetime_set = false;
|
subghz->save_datetime_set = false;
|
||||||
if(!subghz_path_is_file(subghz->file_path)) {
|
if(!subghz_path_is_file(subghz->file_path)) {
|
||||||
SubGhzProtocolDecoderBase* decoder_result = subghz_txrx_get_decoder(subghz->txrx);
|
SubGhzProtocolDecoderBase* decoder_result = subghz_txrx_get_decoder(subghz->txrx);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ typedef struct {
|
|||||||
FlipperFormat* flipper_string;
|
FlipperFormat* flipper_string;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
SubGhzRadioPreset* preset;
|
SubGhzRadioPreset* preset;
|
||||||
FuriHalRtcDateTime datetime;
|
DateTime datetime;
|
||||||
uint32_t hash_data;
|
uint32_t hash_data;
|
||||||
const SubGhzProtocol* protocol;
|
const SubGhzProtocol* protocol;
|
||||||
uint16_t repeats;
|
uint16_t repeats;
|
||||||
@@ -170,13 +170,13 @@ const char* subghz_history_get_protocol_name(SubGhzHistory* instance, uint16_t i
|
|||||||
return furi_string_get_cstr(instance->tmp_string);
|
return furi_string_get_cstr(instance->tmp_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
FuriHalRtcDateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx) {
|
DateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx) {
|
||||||
furi_assert(instance);
|
furi_assert(instance);
|
||||||
SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx);
|
SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx);
|
||||||
if(item) {
|
if(item) {
|
||||||
return item->datetime;
|
return item->datetime;
|
||||||
} else {
|
} else {
|
||||||
return (FuriHalRtcDateTime){};
|
return (DateTime){};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +233,7 @@ void subghz_history_get_text_item_menu(SubGhzHistory* instance, FuriString* outp
|
|||||||
|
|
||||||
void subghz_history_get_time_item_menu(SubGhzHistory* instance, FuriString* output, uint16_t idx) {
|
void subghz_history_get_time_item_menu(SubGhzHistory* instance, FuriString* output, uint16_t idx) {
|
||||||
SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx);
|
SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx);
|
||||||
FuriHalRtcDateTime* t = &item->datetime;
|
DateTime* t = &item->datetime;
|
||||||
furi_string_printf(output, "%.2d:%.2d:%.2d ", t->hour, t->minute, t->second);
|
furi_string_printf(output, "%.2d:%.2d:%.2d ", t->hour, t->minute, t->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,9 +98,9 @@ const char* subghz_history_get_protocol_name(SubGhzHistory* instance, uint16_t i
|
|||||||
*
|
*
|
||||||
* @param instance - SubGhzHistory instance
|
* @param instance - SubGhzHistory instance
|
||||||
* @param idx - record index
|
* @param idx - record index
|
||||||
* @return datetime - FuriHalRtcDateTime received timestamp
|
* @return datetime - DateTime received timestamp
|
||||||
*/
|
*/
|
||||||
FuriHalRtcDateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx);
|
DateTime subghz_history_get_datetime(SubGhzHistory* instance, uint16_t idx);
|
||||||
|
|
||||||
/** Get string item menu to history[idx]
|
/** Get string item menu to history[idx]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ struct SubGhz {
|
|||||||
bool raw_send_only;
|
bool raw_send_only;
|
||||||
|
|
||||||
bool save_datetime_set;
|
bool save_datetime_set;
|
||||||
FuriHalRtcDateTime save_datetime;
|
DateTime save_datetime;
|
||||||
|
|
||||||
SubGhzLastSettings* last_settings;
|
SubGhzLastSettings* last_settings;
|
||||||
|
|
||||||
|
|||||||
@@ -131,9 +131,9 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FuriHalRtcDateTime curr_dt;
|
DateTime curr_dt;
|
||||||
furi_hal_rtc_get_datetime(&curr_dt);
|
furi_hal_rtc_get_datetime(&curr_dt);
|
||||||
uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt);
|
uint32_t curr_ts = datetime_datetime_to_timestamp(&curr_dt);
|
||||||
|
|
||||||
char time_string[TIME_LEN];
|
char time_string[TIME_LEN];
|
||||||
char date_string[DATE_LEN];
|
char date_string[DATE_LEN];
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
LocaleDateFormat date_format;
|
LocaleDateFormat date_format;
|
||||||
LocaleTimeFormat time_format;
|
LocaleTimeFormat time_format;
|
||||||
FuriHalRtcDateTime datetime;
|
DateTime datetime;
|
||||||
FuriMutex* mutex;
|
FuriMutex* mutex;
|
||||||
FuriMessageQueue* event_queue;
|
FuriMessageQueue* event_queue;
|
||||||
uint32_t timer_start_timestamp;
|
uint32_t timer_start_timestamp;
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
|
|
||||||
const ProtocolBase* lfrfid_protocols[] = {
|
const ProtocolBase* lfrfid_protocols[] = {
|
||||||
[LFRFIDProtocolEM4100] = &protocol_em4100,
|
[LFRFIDProtocolEM4100] = &protocol_em4100,
|
||||||
[LFRFIDProtocolEM410032] = &protocol_em4100_32,
|
[LFRFIDProtocolEM4100_32] = &protocol_em4100_32,
|
||||||
[LFRFIDProtocolEM410016] = &protocol_em4100_16,
|
[LFRFIDProtocolEM4100_16] = &protocol_em4100_16,
|
||||||
[LFRFIDProtocolH10301] = &protocol_h10301,
|
[LFRFIDProtocolH10301] = &protocol_h10301,
|
||||||
[LFRFIDProtocolIdteck] = &protocol_idteck,
|
[LFRFIDProtocolIdteck] = &protocol_idteck,
|
||||||
[LFRFIDProtocolIndala26] = &protocol_indala26,
|
[LFRFIDProtocolIndala26] = &protocol_indala26,
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
LFRFIDProtocolEM4100,
|
LFRFIDProtocolEM4100,
|
||||||
LFRFIDProtocolEM410032,
|
LFRFIDProtocolEM4100_32,
|
||||||
LFRFIDProtocolEM410016,
|
LFRFIDProtocolEM4100_16,
|
||||||
LFRFIDProtocolH10301,
|
LFRFIDProtocolH10301,
|
||||||
LFRFIDProtocolIdteck,
|
LFRFIDProtocolIdteck,
|
||||||
LFRFIDProtocolIndala26,
|
LFRFIDProtocolIndala26,
|
||||||
|
|||||||
@@ -99,7 +99,8 @@ static NfcCommand emv_poller_handler_get_processing_options(EmvPoller* instance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static NfcCommand emv_poller_handler_read_files(EmvPoller* instance) {
|
static NfcCommand emv_poller_handler_read_files(EmvPoller* instance) {
|
||||||
emv_poller_read_afl(instance);
|
// Search PAN
|
||||||
|
emv_poller_read_afl(instance, false, &instance->records_mask);
|
||||||
emv_poller_read_log_entry(instance);
|
emv_poller_read_log_entry(instance);
|
||||||
|
|
||||||
instance->state = EmvPollerStateReadExtra;
|
instance->state = EmvPollerStateReadExtra;
|
||||||
@@ -110,6 +111,9 @@ static NfcCommand emv_poller_handler_read_extra_data(EmvPoller* instance) {
|
|||||||
emv_poller_get_last_online_atc(instance);
|
emv_poller_get_last_online_atc(instance);
|
||||||
emv_poller_get_pin_try_counter(instance);
|
emv_poller_get_pin_try_counter(instance);
|
||||||
|
|
||||||
|
// Search cardholder name. This operation may break communication with the card, so it should be the last one
|
||||||
|
emv_poller_read_afl(instance, true, &instance->records_mask);
|
||||||
|
|
||||||
instance->state = EmvPollerStateReadSuccess;
|
instance->state = EmvPollerStateReadSuccess;
|
||||||
return NfcCommandContinue;
|
return NfcCommandContinue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ EmvError emv_poller_get_processing_options(EmvPoller* instance);
|
|||||||
|
|
||||||
EmvError emv_poller_read_sfi_record(EmvPoller* instance, uint8_t sfi, uint8_t record_num);
|
EmvError emv_poller_read_sfi_record(EmvPoller* instance, uint8_t sfi, uint8_t record_num);
|
||||||
|
|
||||||
EmvError emv_poller_read_afl(EmvPoller* instance);
|
EmvError emv_poller_read_afl(EmvPoller* instance, bool bruteforce_sfi, uint16_t* readed_mask);
|
||||||
|
|
||||||
EmvError emv_poller_read_log_entry(EmvPoller* instance);
|
EmvError emv_poller_read_log_entry(EmvPoller* instance);
|
||||||
|
|
||||||
|
|||||||
@@ -621,84 +621,80 @@ EmvError emv_poller_read_sfi_record(EmvPoller* instance, uint8_t sfi, uint8_t re
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
EmvError emv_poller_read_afl(EmvPoller* instance) {
|
EmvError emv_poller_read_afl(EmvPoller* instance, bool bruteforce_sfi, uint16_t* readed_mask) {
|
||||||
EmvError error = EmvErrorNone;
|
EmvError error = EmvErrorNone;
|
||||||
|
bool pan_fetched = (instance->data->emv_application.pan_len);
|
||||||
|
bool cardholder_name_fetched = strlen(instance->data->emv_application.cardholder_name);
|
||||||
|
|
||||||
APDU* afl = &instance->data->emv_application.afl;
|
if(!bruteforce_sfi) {
|
||||||
|
// SEARCH PAN, RETURN WHEN FOUND
|
||||||
|
APDU* afl = &instance->data->emv_application.afl;
|
||||||
|
|
||||||
if(afl->size == 0) {
|
if(afl->size == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
FURI_LOG_D(TAG, "Search PAN in SFI");
|
FURI_LOG_D(TAG, "Search PAN in SFI");
|
||||||
|
|
||||||
// uint8_t sfi_2_mask = 0;
|
// Iterate through all files
|
||||||
// uint8_t sfi_3_mask = 0;
|
for(size_t i = 0; i < instance->data->emv_application.afl.size; i += 4) {
|
||||||
|
uint8_t sfi = afl->data[i] >> 3;
|
||||||
|
uint8_t record_start = afl->data[i + 1];
|
||||||
|
uint8_t record_end = afl->data[i + 2];
|
||||||
|
// Iterate through all records in file
|
||||||
|
for(uint8_t record = record_start; record <= record_end; ++record) {
|
||||||
|
if((sfi <= 3) && (record <= 5))
|
||||||
|
FURI_BIT_SET(
|
||||||
|
*readed_mask,
|
||||||
|
record + ((sfi - 2) * 8)); //black magic: mask 0003333300022222
|
||||||
|
|
||||||
// bool pan_fetched = (instance->data->emv_application.pan_len);
|
error = emv_poller_read_sfi_record(instance, sfi, record);
|
||||||
|
if(error != EmvErrorNone) break;
|
||||||
|
|
||||||
// Iterate through all files
|
if(!emv_decode_response_tlv(
|
||||||
for(size_t i = 0; i < instance->data->emv_application.afl.size; i += 4) {
|
bit_buffer_get_data(instance->rx_buffer),
|
||||||
uint8_t sfi = afl->data[i] >> 3;
|
bit_buffer_get_size_bytes(instance->rx_buffer),
|
||||||
uint8_t record_start = afl->data[i + 1];
|
&instance->data->emv_application)) {
|
||||||
uint8_t record_end = afl->data[i + 2];
|
error = EmvErrorProtocol;
|
||||||
// Iterate through all records in file
|
FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record);
|
||||||
for(uint8_t record = record_start; record <= record_end; ++record) {
|
}
|
||||||
// if((sfi == 2) && (record < 8)) FURI_BIT_SET(sfi_2_mask, record);
|
|
||||||
// if((sfi == 3) && (record < 8)) FURI_BIT_SET(sfi_3_mask, record);
|
|
||||||
|
|
||||||
error = emv_poller_read_sfi_record(instance, sfi, record);
|
if(instance->data->emv_application.pan_len) {
|
||||||
if(error != EmvErrorNone) break;
|
pan_fetched = true;
|
||||||
|
break;
|
||||||
if(!emv_decode_response_tlv(
|
} // Card number fetched
|
||||||
bit_buffer_get_data(instance->rx_buffer),
|
|
||||||
bit_buffer_get_size_bytes(instance->rx_buffer),
|
|
||||||
&instance->data->emv_application)) {
|
|
||||||
error = EmvErrorProtocol;
|
|
||||||
FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record);
|
|
||||||
}
|
}
|
||||||
|
if(pan_fetched) break;
|
||||||
|
}
|
||||||
|
} else { // BRUTFORCE FILES 2-3. SEARCH CARDHOLDER NAME
|
||||||
|
FURI_LOG_T(TAG, "Bruteforce files 2-3");
|
||||||
|
for(size_t sfi = 2; sfi <= 3; sfi++) {
|
||||||
|
// Iterate through records 1-5 in file
|
||||||
|
for(size_t record = 1; record <= 5; record++) {
|
||||||
|
// Skip previously readed sfi
|
||||||
|
if((*readed_mask >> (record + ((sfi - 2) * 8))) & (0b1)) continue;
|
||||||
|
|
||||||
// Some READ RECORD returns 1 byte response 0x12/0x13 (IDK WTF),
|
error = emv_poller_read_sfi_record(instance, sfi, record);
|
||||||
// then poller return Timeout to all subsequent requests.
|
if(error != EmvErrorNone) break;
|
||||||
// TODO: remove below lines when it was fixed
|
|
||||||
if(instance->data->emv_application.pan_len != 0)
|
if(!emv_decode_response_tlv(
|
||||||
return EmvErrorNone; // Card number fetched
|
bit_buffer_get_data(instance->rx_buffer),
|
||||||
// if(instance->data->emv_application.pan_len) pan_fetched = true; // Card number fetched
|
bit_buffer_get_size_bytes(instance->rx_buffer),
|
||||||
|
&instance->data->emv_application)) {
|
||||||
|
error = EmvErrorProtocol;
|
||||||
|
FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(strlen(instance->data->emv_application.cardholder_name))
|
||||||
|
cardholder_name_fetched = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// bool cardholder_name_fetched = strlen(instance->data->emv_application.cardholder_name);
|
|
||||||
// Bruteforse files 2-3
|
|
||||||
// FURI_LOG_T(TAG, "Bruteforce files 2-3");
|
|
||||||
// for(size_t sfi = 2; sfi <= 3; sfi++) {
|
|
||||||
// // Iterate through records 1-5 in file
|
|
||||||
// for(size_t record = 1; record <= 5; record++) {
|
|
||||||
// // Skip previously readed sfi
|
|
||||||
// // if(sfi == 2) {
|
|
||||||
// // if((sfi_2_mask >> record) & (0b1)) continue;
|
|
||||||
// // }
|
|
||||||
// // if(sfi == 3) {
|
|
||||||
// // if((sfi_3_mask >> record) & (0b1)) continue;
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// if(strlen(instance->data->emv_application.cardholder_name))
|
if((pan_fetched && (!bruteforce_sfi)) || (cardholder_name_fetched && bruteforce_sfi))
|
||||||
// cardholder_name_fetched = true;
|
return EmvErrorNone;
|
||||||
// error = emv_poller_read_sfi_record(instance, sfi, record);
|
else
|
||||||
// if(error != EmvErrorNone) break;
|
return error;
|
||||||
|
|
||||||
// if(!emv_decode_response_tlv(
|
|
||||||
// bit_buffer_get_data(instance->rx_buffer),
|
|
||||||
// bit_buffer_get_size_bytes(instance->rx_buffer),
|
|
||||||
// &instance->data->emv_application)) {
|
|
||||||
// error = EmvErrorProtocol;
|
|
||||||
// FURI_LOG_T(TAG, "Failed to parse SFI 0x%X record %d", sfi, record);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if(pan_fetched || cardholder_name_fetched)
|
|
||||||
// return EmvErrorNone;
|
|
||||||
// else
|
|
||||||
// return error;
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static EmvError emv_poller_req_get_data(EmvPoller* instance, uint16_t tag) {
|
static EmvError emv_poller_req_get_data(EmvPoller* instance, uint16_t tag) {
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ struct EmvPoller {
|
|||||||
EmvPollerEvent emv_event;
|
EmvPollerEvent emv_event;
|
||||||
NfcGenericEvent general_event;
|
NfcGenericEvent general_event;
|
||||||
NfcGenericCallback callback;
|
NfcGenericCallback callback;
|
||||||
|
uint16_t records_mask;
|
||||||
void* context;
|
void* context;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -361,15 +361,38 @@ static void subghz_protocol_magellan_check_remote_controller(SubGhzBlockGeneric*
|
|||||||
*
|
*
|
||||||
* 0x1275EC => 0x12-event codes, 0x75EC-serial (dec 117236)
|
* 0x1275EC => 0x12-event codes, 0x75EC-serial (dec 117236)
|
||||||
*
|
*
|
||||||
* event codes
|
* Event codes consist of two parts:
|
||||||
* bit_0: 1-Open/Motion, 0-close/ok
|
* - The upper nibble (bits 7-4) represents the event type:
|
||||||
* bit_1: 1-Tamper On (alarm), 0-Tamper Off (ok)
|
* - 0x00: Nothing
|
||||||
* bit_2: ?
|
* - 0x01: Door
|
||||||
* bit_3: 1-power on
|
* - 0x02: Motion
|
||||||
* bit_4: model type - wireless reed
|
* - 0x03: Smoke Alarm
|
||||||
* bit_5: model type - motion sensor
|
* - 0x04: REM1
|
||||||
* bit_6: ?
|
* - 0x05: REM1 with subtype Off1
|
||||||
* bit_7: ?
|
* - 0x06: REM2
|
||||||
|
* - 0x07: REM2 with subtype Off1
|
||||||
|
* - Others: Unknown
|
||||||
|
* - The lower nibble (bits 3-0) represents the event subtype, which varies based on the model type:
|
||||||
|
* - If the model type is greater than 0x03 (e.g., REM1 or REM2):
|
||||||
|
* - 0x00: Arm1
|
||||||
|
* - 0x01: Btn1
|
||||||
|
* - 0x02: Btn2
|
||||||
|
* - 0x03: Btn3
|
||||||
|
* - 0x08: Reset
|
||||||
|
* - 0x09: LowBatt
|
||||||
|
* - 0x0A: BattOk
|
||||||
|
* - 0x0B: Learn
|
||||||
|
* - Others: Unknown
|
||||||
|
* - Otherwise:
|
||||||
|
* - 0x00: Sealed
|
||||||
|
* - 0x01: Alarm
|
||||||
|
* - 0x02: Tamper
|
||||||
|
* - 0x03: Alarm + Tamper
|
||||||
|
* - 0x08: Reset
|
||||||
|
* - 0x09: LowBatt
|
||||||
|
* - 0x0A: BattOk
|
||||||
|
* - 0x0B: Learn
|
||||||
|
* - Others: Unknown
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
uint64_t data_rev = subghz_protocol_blocks_reverse_key(instance->data >> 8, 24);
|
uint64_t data_rev = subghz_protocol_blocks_reverse_key(instance->data >> 8, 24);
|
||||||
@@ -378,18 +401,49 @@ static void subghz_protocol_magellan_check_remote_controller(SubGhzBlockGeneric*
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void subghz_protocol_magellan_get_event_serialize(uint8_t event, FuriString* output) {
|
static void subghz_protocol_magellan_get_event_serialize(uint8_t event, FuriString* output) {
|
||||||
furi_string_cat_printf(
|
const char* event_type;
|
||||||
output,
|
const char* event_subtype;
|
||||||
"%s%s%s%s%s%s%s%s",
|
|
||||||
((event >> 4) & 0x1 ? (event & 0x1 ? " Open" : " Close") :
|
switch ((event >> 4) & 0x0F) {
|
||||||
(event & 0x1 ? " Motion" : " Ok")),
|
case 0x00: event_type = "Nothing"; break;
|
||||||
((event >> 1) & 0x1 ? ", Tamper On\n(Alarm)" : ""),
|
case 0x01: event_type = "Door"; break;
|
||||||
((event >> 2) & 0x1 ? ", ?" : ""),
|
case 0x02: event_type = "Motion"; break;
|
||||||
((event >> 3) & 0x1 ? ", Power On" : ""),
|
case 0x03: event_type = "Smoke Alarm"; break;
|
||||||
((event >> 4) & 0x1 ? ", MT:Wireless_Reed" : ""),
|
case 0x04: event_type = "REM1"; break;
|
||||||
((event >> 5) & 0x1 ? ", MT:Motion_\nSensor" : ""),
|
case 0x05:
|
||||||
((event >> 6) & 0x1 ? ", ?" : ""),
|
event_type = "REM1";
|
||||||
((event >> 7) & 0x1 ? ", ?" : ""));
|
event_subtype = "Off1";
|
||||||
|
furi_string_cat_printf(output, "%s - %s", event_type, event_subtype);
|
||||||
|
return;
|
||||||
|
case 0x06:
|
||||||
|
event_type = "REM2";
|
||||||
|
event_subtype = "Off1";
|
||||||
|
furi_string_cat_printf(output, "%s - %s", event_type, event_subtype);
|
||||||
|
return;
|
||||||
|
default: event_type = "Unknown"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (event & 0x0F) {
|
||||||
|
case 0x00:
|
||||||
|
event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Arm1" : "Sealed";
|
||||||
|
break;
|
||||||
|
case 0x01:
|
||||||
|
event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Btn1" : "Alarm";
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Btn2" : "Tamper";
|
||||||
|
break;
|
||||||
|
case 0x03:
|
||||||
|
event_subtype = (((event >> 4) & 0x0F) > 0x03) ? "Btn3" : "Alarm + Tamper";
|
||||||
|
break;
|
||||||
|
case 0x08: event_subtype = "Reset"; break;
|
||||||
|
case 0x09: event_subtype = "LowBatt"; break;
|
||||||
|
case 0x0A: event_subtype = "BattOk"; break;
|
||||||
|
case 0x0B: event_subtype = "Learn"; break;
|
||||||
|
default: event_subtype = "Unknown"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
furi_string_cat_printf(output, "%s - %s", event_type, event_subtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t subghz_protocol_decoder_magellan_get_hash_data(void* context) {
|
uint32_t subghz_protocol_decoder_magellan_get_hash_data(void* context) {
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ void name_generator_make_auto_datetime(
|
|||||||
char* name,
|
char* name,
|
||||||
size_t max_name_size,
|
size_t max_name_size,
|
||||||
const char* prefix,
|
const char* prefix,
|
||||||
FuriHalRtcDateTime* custom_time) {
|
DateTime* custom_time) {
|
||||||
if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagRandomFilename)) {
|
if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagRandomFilename)) {
|
||||||
name_generator_make_detailed_datetime(
|
name_generator_make_detailed_datetime(
|
||||||
name, max_name_size, prefix, custom_time, xtreme_settings.file_naming_prefix_after);
|
name, max_name_size, prefix, custom_time, xtreme_settings.file_naming_prefix_after);
|
||||||
@@ -107,13 +107,13 @@ void name_generator_make_detailed_datetime(
|
|||||||
char* name,
|
char* name,
|
||||||
size_t max_name_size,
|
size_t max_name_size,
|
||||||
const char* prefix,
|
const char* prefix,
|
||||||
FuriHalRtcDateTime* custom_time,
|
DateTime* custom_time,
|
||||||
bool prefix_after) {
|
bool prefix_after) {
|
||||||
furi_assert(name);
|
furi_assert(name);
|
||||||
furi_assert(max_name_size);
|
furi_assert(max_name_size);
|
||||||
furi_assert(prefix);
|
furi_assert(prefix);
|
||||||
|
|
||||||
FuriHalRtcDateTime dateTime;
|
DateTime dateTime;
|
||||||
if(custom_time) {
|
if(custom_time) {
|
||||||
dateTime = *custom_time;
|
dateTime = *custom_time;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ void name_generator_make_auto_datetime(
|
|||||||
char* name,
|
char* name,
|
||||||
size_t max_name_size,
|
size_t max_name_size,
|
||||||
const char* prefix,
|
const char* prefix,
|
||||||
FuriHalRtcDateTime* custom_time);
|
DateTime* custom_time);
|
||||||
|
|
||||||
/** Generates random name
|
/** Generates random name
|
||||||
*
|
*
|
||||||
@@ -45,7 +45,7 @@ void name_generator_make_detailed_datetime(
|
|||||||
char* name,
|
char* name,
|
||||||
size_t max_name_size,
|
size_t max_name_size,
|
||||||
const char* prefix,
|
const char* prefix,
|
||||||
FuriHalRtcDateTime* custom_time,
|
DateTime* custom_time,
|
||||||
bool prefix_after);
|
bool prefix_after);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -957,7 +957,7 @@ Function,+,emv_load,_Bool,"EmvData*, FlipperFormat*, uint32_t"
|
|||||||
Function,+,emv_poller_get_last_online_atc,EmvError,EmvPoller*
|
Function,+,emv_poller_get_last_online_atc,EmvError,EmvPoller*
|
||||||
Function,+,emv_poller_get_pin_try_counter,EmvError,EmvPoller*
|
Function,+,emv_poller_get_pin_try_counter,EmvError,EmvPoller*
|
||||||
Function,+,emv_poller_get_processing_options,EmvError,EmvPoller*
|
Function,+,emv_poller_get_processing_options,EmvError,EmvPoller*
|
||||||
Function,+,emv_poller_read_afl,EmvError,EmvPoller*
|
Function,+,emv_poller_read_afl,EmvError,"EmvPoller*, _Bool, uint16_t*"
|
||||||
Function,+,emv_poller_read_log_entry,EmvError,EmvPoller*
|
Function,+,emv_poller_read_log_entry,EmvError,EmvPoller*
|
||||||
Function,+,emv_poller_read_sfi_record,EmvError,"EmvPoller*, uint8_t, uint8_t"
|
Function,+,emv_poller_read_sfi_record,EmvError,"EmvPoller*, uint8_t, uint8_t"
|
||||||
Function,+,emv_poller_select_application,EmvError,EmvPoller*
|
Function,+,emv_poller_select_application,EmvError,EmvPoller*
|
||||||
@@ -2665,9 +2665,9 @@ Function,-,music_worker_set_volume,void,"MusicWorker*, float"
|
|||||||
Function,-,music_worker_start,void,MusicWorker*
|
Function,-,music_worker_start,void,MusicWorker*
|
||||||
Function,-,music_worker_stop,void,MusicWorker*
|
Function,-,music_worker_stop,void,MusicWorker*
|
||||||
Function,+,name_generator_make_auto,void,"char*, size_t, const char*"
|
Function,+,name_generator_make_auto,void,"char*, size_t, const char*"
|
||||||
Function,+,name_generator_make_auto_datetime,void,"char*, size_t, const char*, FuriHalRtcDateTime*"
|
Function,+,name_generator_make_auto_datetime,void,"char*, size_t, const char*, DateTime*"
|
||||||
Function,+,name_generator_make_detailed,void,"char*, size_t, const char*"
|
Function,+,name_generator_make_detailed,void,"char*, size_t, const char*"
|
||||||
Function,+,name_generator_make_detailed_datetime,void,"char*, size_t, const char*, FuriHalRtcDateTime*, _Bool"
|
Function,+,name_generator_make_detailed_datetime,void,"char*, size_t, const char*, DateTime*, _Bool"
|
||||||
Function,+,name_generator_make_random,void,"char*, size_t"
|
Function,+,name_generator_make_random,void,"char*, size_t"
|
||||||
Function,+,name_generator_make_random_prefixed,void,"char*, size_t, const char*, _Bool"
|
Function,+,name_generator_make_random_prefixed,void,"char*, size_t, const char*, _Bool"
|
||||||
Function,-,nan,double,const char*
|
Function,-,nan,double,const char*
|
||||||
|
|||||||
|
Reference in New Issue
Block a user