Skip to content
This repository has been archived by the owner on Jul 28, 2024. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
…irmware into xfw-dev
  • Loading branch information
Willy-JL committed Feb 15, 2024
2 parents a4387de + 8780437 commit fe0ff08
Show file tree
Hide file tree
Showing 31 changed files with 495 additions and 276 deletions.
2 changes: 1 addition & 1 deletion applications/debug/locale_test/locale_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ static void locale_test_view_draw_callback(Canvas* canvas, void* _model) {
}
canvas_draw_str(canvas, 0, 10, furi_string_get_cstr(tmp_string));

FuriHalRtcDateTime datetime;
DateTime datetime;
furi_hal_rtc_get_datetime(&datetime);

locale_format_time(tmp_string, &datetime, locale_get_time_format(), false);
Expand Down
175 changes: 175 additions & 0 deletions applications/debug/unit_tests/datetimelib/datetimelib_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
#include <furi.h>
#include "../minunit.h"

#include <datetime/datetime.h>

MU_TEST(test_datetime_validate_datetime_correct_min) {
DateTime correct_min = {0, 0, 0, 1, 1, 2000, 1};
bool result = datetime_validate_datetime(&correct_min);

mu_assert_int_eq(true, result);
}

MU_TEST(test_datetime_validate_datetime_correct_max) {
DateTime correct_max = {23, 59, 59, 31, 12, 2099, 7};
bool result = datetime_validate_datetime(&correct_max);

mu_assert_int_eq(true, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_second) {
DateTime incorrect_sec = {0, 0, 60, 1, 1, 2000, 1};
bool result = datetime_validate_datetime(&incorrect_sec);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_minute) {
DateTime incorrect_min = {0, 60, 0, 1, 1, 2000, 1};
bool result = datetime_validate_datetime(&incorrect_min);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_hour) {
DateTime incorrect_hour = {24, 0, 0, 1, 1, 2000, 1};
bool result = datetime_validate_datetime(&incorrect_hour);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_day_min) {
DateTime incorrect_day_min = {0, 0, 0, 0, 1, 2000, 1};
bool result = datetime_validate_datetime(&incorrect_day_min);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_day_max) {
DateTime incorrect_day_max = {0, 0, 0, 32, 1, 2000, 1};
bool result = datetime_validate_datetime(&incorrect_day_max);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_month_min) {
DateTime incorrect_month_min = {0, 0, 0, 1, 0, 2000, 1};
bool result = datetime_validate_datetime(&incorrect_month_min);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_month_max) {
DateTime incorrect_month_max = {0, 0, 0, 1, 13, 2000, 1};
bool result = datetime_validate_datetime(&incorrect_month_max);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_year_min) {
DateTime incorrect_year_min = {0, 0, 0, 1, 1, 1999, 1};
bool result = datetime_validate_datetime(&incorrect_year_min);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_year_max) {
DateTime incorrect_year_max = {0, 0, 0, 1, 1, 2100, 1};
bool result = datetime_validate_datetime(&incorrect_year_max);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_weekday_min) {
DateTime incorrect_weekday_min = {0, 0, 0, 1, 1, 2000, 0};
bool result = datetime_validate_datetime(&incorrect_weekday_min);

mu_assert_int_eq(false, result);
}

MU_TEST(test_datetime_validate_datetime_incorrect_weekday_max) {
DateTime incorrect_weekday_max = {0, 0, 0, 1, 1, 2000, 8};
bool result = datetime_validate_datetime(&incorrect_weekday_max);

mu_assert_int_eq(false, result);
}

MU_TEST_SUITE(test_datetime_validate_datetime) {
MU_RUN_TEST(test_datetime_validate_datetime_correct_min);
MU_RUN_TEST(test_datetime_validate_datetime_correct_max);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_second);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_minute);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_hour);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_day_min);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_day_max);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_month_min);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_month_max);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_year_min);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_year_max);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_weekday_min);
MU_RUN_TEST(test_datetime_validate_datetime_incorrect_weekday_max);
}

MU_TEST(test_datetime_timestamp_to_datetime_min) {
uint32_t test_value = 0;
DateTime min_datetime_expected = {0, 0, 0, 1, 1, 1970, 0};

DateTime result = {0};
datetime_timestamp_to_datetime(test_value, &result);

mu_assert_mem_eq(&min_datetime_expected, &result, sizeof(result));
}

MU_TEST(test_datetime_timestamp_to_datetime_max) {
uint32_t test_value = UINT32_MAX;
DateTime max_datetime_expected = {6, 28, 15, 7, 2, 2106, 0};

DateTime result = {0};
datetime_timestamp_to_datetime(test_value, &result);

mu_assert_mem_eq(&max_datetime_expected, &result, sizeof(result));
}

MU_TEST(test_datetime_timestamp_to_datetime_to_timestamp) {
uint32_t test_value = random();

DateTime datetime = {0};
datetime_timestamp_to_datetime(test_value, &datetime);

uint32_t result = datetime_datetime_to_timestamp(&datetime);

mu_assert_int_eq(test_value, result);
}

MU_TEST_SUITE(test_datetime_timestamp_to_datetime_suite) {
MU_RUN_TEST(test_datetime_timestamp_to_datetime_min);
MU_RUN_TEST(test_datetime_timestamp_to_datetime_max);
MU_RUN_TEST(test_datetime_timestamp_to_datetime_to_timestamp);
}

MU_TEST(test_datetime_datetime_to_timestamp_min) {
DateTime min_datetime = {0, 0, 0, 1, 1, 1970, 0};

uint32_t result = datetime_datetime_to_timestamp(&min_datetime);
mu_assert_int_eq(0, result);
}

MU_TEST(test_datetime_datetime_to_timestamp_max) {
DateTime max_datetime = {6, 28, 15, 7, 2, 2106, 0};

uint32_t result = datetime_datetime_to_timestamp(&max_datetime);
mu_assert_int_eq(UINT32_MAX, result);
}

MU_TEST_SUITE(test_datetime_datetime_to_timestamp_suite) {
MU_RUN_TEST(test_datetime_datetime_to_timestamp_min);
MU_RUN_TEST(test_datetime_datetime_to_timestamp_max);
}

int run_minunit_test_datetime() {
MU_RUN_SUITE(test_datetime_timestamp_to_datetime_suite);
MU_RUN_SUITE(test_datetime_datetime_to_timestamp_suite);
MU_RUN_SUITE(test_datetime_validate_datetime);

return MU_EXIT_CODE;
}
38 changes: 0 additions & 38 deletions applications/debug/unit_tests/furi_hal/furi_hal_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,37 +214,6 @@ MU_TEST(furi_hal_i2c_ext_eeprom) {
}
}

MU_TEST(furi_hal_rtc_timestamp2datetime_min) {
uint32_t test_value = 0;
FuriHalRtcDateTime min_datetime_expected = {0, 0, 0, 1, 1, 1970, 0};

FuriHalRtcDateTime result = {0};
furi_hal_rtc_timestamp_to_datetime(test_value, &result);

mu_assert_mem_eq(&min_datetime_expected, &result, sizeof(result));
}

MU_TEST(furi_hal_rtc_timestamp2datetime_max) {
uint32_t test_value = UINT32_MAX;
FuriHalRtcDateTime max_datetime_expected = {6, 28, 15, 7, 2, 2106, 0};

FuriHalRtcDateTime result = {0};
furi_hal_rtc_timestamp_to_datetime(test_value, &result);

mu_assert_mem_eq(&max_datetime_expected, &result, sizeof(result));
}

MU_TEST(furi_hal_rtc_timestamp2datetime2timestamp) {
uint32_t test_value = random();

FuriHalRtcDateTime datetime = {0};
furi_hal_rtc_timestamp_to_datetime(test_value, &datetime);

uint32_t result = furi_hal_rtc_datetime_to_timestamp(&datetime);

mu_assert_int_eq(test_value, result);
}

MU_TEST_SUITE(furi_hal_i2c_int_suite) {
MU_SUITE_CONFIGURE(&furi_hal_i2c_int_setup, &furi_hal_i2c_int_teardown);
MU_RUN_TEST(furi_hal_i2c_int_1b);
Expand All @@ -258,15 +227,8 @@ MU_TEST_SUITE(furi_hal_i2c_ext_suite) {
MU_RUN_TEST(furi_hal_i2c_ext_eeprom);
}

MU_TEST_SUITE(furi_hal_rtc_datetime_suite) {
MU_RUN_TEST(furi_hal_rtc_timestamp2datetime_min);
MU_RUN_TEST(furi_hal_rtc_timestamp2datetime_max);
MU_RUN_TEST(furi_hal_rtc_timestamp2datetime2timestamp);
}

int run_minunit_test_furi_hal() {
MU_RUN_SUITE(furi_hal_i2c_int_suite);
MU_RUN_SUITE(furi_hal_i2c_ext_suite);
MU_RUN_SUITE(furi_hal_rtc_datetime_suite);
return MU_EXIT_CODE;
}
2 changes: 2 additions & 0 deletions applications/debug/unit_tests/test_index.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ int run_minunit_test_protocol_dict();
int run_minunit_test_lfrfid_protocols();
int run_minunit_test_nfc();
int run_minunit_test_bit_lib();
int run_minunit_test_datetime();
int run_minunit_test_float_tools();
int run_minunit_test_bt();
int run_minunit_test_dialogs_file_browser_options();
Expand Down Expand Up @@ -57,6 +58,7 @@ const UnitTest unit_tests[] = {
{.name = "protocol_dict", .entry = run_minunit_test_protocol_dict},
{.name = "lfrfid", .entry = run_minunit_test_lfrfid_protocols},
{.name = "bit_lib", .entry = run_minunit_test_bit_lib},
{.name = "datetime", .entry = run_minunit_test_datetime},
{.name = "float_tools", .entry = run_minunit_test_float_tools},
{.name = "bt", .entry = run_minunit_test_bt},
{.name = "dialogs_file_browser_options",
Expand Down
14 changes: 7 additions & 7 deletions applications/main/nfc/plugins/supported_cards/clipper.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

#include <bit_lib.h>
#include <applications/services/locale/locale.h>
#include <furi_hal_rtc.h>
#include <datetime/datetime.h>
#include <inttypes.h>

//
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);

Expand All @@ -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
Expand All @@ -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
Expand Down
6 changes: 3 additions & 3 deletions applications/main/nfc/plugins/supported_cards/itso.c
Original file line number Diff line number Diff line change
Expand Up @@ -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/datetime.h>

static const MfDesfireApplicationId itso_app_id = {.data = {0x16, 0x02, 0xa0}};
static const MfDesfireFileId itso_file_id = 0x0f;
Expand Down Expand Up @@ -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, &timestamp);
DateTime timestamp = {0};
datetime_timestamp_to_datetime(unixTimestamp, &timestamp);
FuriString* timestamp_str = furi_string_alloc();
locale_format_date(timestamp_str, &timestamp, locale_get_date_format(), "-");

Expand Down
14 changes: 7 additions & 7 deletions applications/main/nfc/plugins/supported_cards/opal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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/datetime.h>

static const MfDesfireApplicationId opal_app_id = {.data = {0x31, 0x45, 0x53}};

Expand Down Expand Up @@ -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
Expand All @@ -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++;
Expand All @@ -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++;
Expand Down Expand Up @@ -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, &timestamp);

// Usages 4..6 associated with the Manly Ferry, which correspond to
Expand Down
Loading

0 comments on commit fe0ff08

Please sign in to comment.