Skip to content

Commit

Permalink
add mifare classic loading
Browse files Browse the repository at this point in the history
  • Loading branch information
luu176 committed Feb 7, 2025
1 parent c09aa88 commit 5e40d55
Show file tree
Hide file tree
Showing 6 changed files with 151 additions and 50 deletions.
2 changes: 1 addition & 1 deletion metroflip_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,11 @@ typedef struct {
bool auto_mode;
CardType mfc_card_type;
NfcProtocol protocol;
const char* file_path;

// Calypso specific context
CalypsoContext* calypso_context;


DialogsApp* dialogs;

bool data_loaded;
Expand Down
3 changes: 1 addition & 2 deletions scenes/metroflip_scene_load.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ void metroflip_scene_load_on_enter(void* context) {
do {
if(!flipper_format_file_open_existing(format, furi_string_get_cstr(file_path))) break;
if(!flipper_format_read_string(format, "Card Type", card_type)) break;
if(furi_string_equal_str(card_type, "suica")) {
}
app->file_path = furi_string_get_cstr(file_path);
app->data_loaded = true;
} while(0);
flipper_format_free(format);
Expand Down
45 changes: 36 additions & 9 deletions scenes/plugins/charliecard.c
Original file line number Diff line number Diff line change
Expand Up @@ -1253,17 +1253,44 @@ static void charliecard_on_enter(Metroflip* app) {

app->sec_num = 0;

// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);
if(app->data_loaded) {
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* ff = flipper_format_file_alloc(storage);
if(flipper_format_file_open_existing(ff, app->file_path)) {
MfClassicData* mfc_data = mf_classic_alloc();
mf_classic_load(mfc_data, ff, 2);
FuriString* parsed_data = furi_string_alloc();
Widget* widget = app->widget;

// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, metroflip_scene_charlicard_poller_callback, app);
furi_string_reset(app->text_box_store);
if(!charliecard_parse(parsed_data, mfc_data)) {
furi_string_reset(app->text_box_store);
FURI_LOG_I(TAG, "Unknown card type");
furi_string_printf(parsed_data, "\e#Unknown card\n");
}
widget_add_text_scroll_element(
widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));

widget_add_button_element(
widget, GuiButtonTypeRight, "Exit", metroflip_exit_widget_callback, app);
mf_classic_free(mfc_data);
furi_string_free(parsed_data);
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
}
flipper_format_free(ff);
} else {
// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);

metroflip_app_blink_start(app);
// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, metroflip_scene_charlicard_poller_callback, app);

metroflip_app_blink_start(app);
}
}

static bool charliecard_on_event(Metroflip* app, SceneManagerEvent event) {
Expand Down
50 changes: 38 additions & 12 deletions scenes/plugins/metromoney.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,18 +142,44 @@ static void metromoney_on_enter(Metroflip* app) {

app->sec_num = 0;

// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);

// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
nfc_scanner_alloc(app->nfc);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, metromoney_poller_callback, app);

metroflip_app_blink_start(app);
if(app->data_loaded) {
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* ff = flipper_format_file_alloc(storage);
if(flipper_format_file_open_existing(ff, app->file_path)) {
MfClassicData* mfc_data = mf_classic_alloc();
mf_classic_load(mfc_data, ff, 2);
FuriString* parsed_data = furi_string_alloc();
Widget* widget = app->widget;

furi_string_reset(app->text_box_store);
if(!metromoney_parse(parsed_data, mfc_data)) {
furi_string_reset(app->text_box_store);
FURI_LOG_I(TAG, "Unknown card type");
furi_string_printf(parsed_data, "\e#Unknown card\n");
}
widget_add_text_scroll_element(
widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));

widget_add_button_element(
widget, GuiButtonTypeRight, "Exit", metroflip_exit_widget_callback, app);
mf_classic_free(mfc_data);
furi_string_free(parsed_data);
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
}
flipper_format_free(ff);
} else {
// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);

// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, metromoney_poller_callback, app);

metroflip_app_blink_start(app);
}
}

static bool metromoney_on_event(Metroflip* app, SceneManagerEvent event) {
Expand Down
51 changes: 37 additions & 14 deletions scenes/plugins/smartrider.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,8 @@ static void calculate_date(uint32_t timestamp, char* date_str, size_t date_str_s
}
}

static bool smartrider_parse(const NfcDevice* device, FuriString* parsed_data) {
furi_assert(device);
static bool smartrider_parse(FuriString* parsed_data, MfClassicData* data) {
furi_assert(parsed_data);
const MfClassicData* data = nfc_device_get_data(device, NfcProtocolMfClassic);
SmartRiderData sr_data = {0};

if(data->type != MfClassicType1k) {
Expand Down Expand Up @@ -333,23 +331,48 @@ static NfcCommand smartrider_poller_callback(NfcGenericEvent event, void* contex
}

static void smartrider_on_enter(Metroflip* app) {
FURI_LOG_I(TAG, "entered smartrider");
dolphin_deed(DolphinDeedNfcRead);

mf_classic_key_cache_reset(app->mfc_key_cache);

// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);
if(app->data_loaded) {
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* ff = flipper_format_file_alloc(storage);
if(flipper_format_file_open_existing(ff, app->file_path)) {
MfClassicData* mfc_data = mf_classic_alloc();
mf_classic_load(mfc_data, ff, 2);
FuriString* parsed_data = furi_string_alloc();
Widget* widget = app->widget;

furi_string_reset(app->text_box_store);
if(!smartrider_parse(parsed_data, mfc_data)) {
furi_string_reset(app->text_box_store);
FURI_LOG_I(TAG, "Unknown card type");
furi_string_printf(parsed_data, "\e#Unknown card\n");
}
widget_add_text_scroll_element(
widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));

widget_add_button_element(
widget, GuiButtonTypeRight, "Exit", metroflip_exit_widget_callback, app);
mf_classic_free(mfc_data);
furi_string_free(parsed_data);
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
}
flipper_format_free(ff);
} else {
// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);

// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
nfc_scanner_alloc(app->nfc);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, smartrider_poller_callback, app);
// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, smartrider_poller_callback, app);

metroflip_app_blink_start(app);
metroflip_app_blink_start(app);
}
}

static bool smartrider_on_event(Metroflip* app, SceneManagerEvent event) {
Expand Down
50 changes: 38 additions & 12 deletions scenes/plugins/troika.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,18 +239,44 @@ static void troika_on_enter(Metroflip* app) {

app->sec_num = 0;

// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);

// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
nfc_scanner_alloc(app->nfc);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, troika_poller_callback, app);

metroflip_app_blink_start(app);
if(app->data_loaded) {
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* ff = flipper_format_file_alloc(storage);
if(flipper_format_file_open_existing(ff, app->file_path)) {
MfClassicData* mfc_data = mf_classic_alloc();
mf_classic_load(mfc_data, ff, 2);
FuriString* parsed_data = furi_string_alloc();
Widget* widget = app->widget;

furi_string_reset(app->text_box_store);
if(!troika_parse(parsed_data, mfc_data)) {
furi_string_reset(app->text_box_store);
FURI_LOG_I(TAG, "Unknown card type");
furi_string_printf(parsed_data, "\e#Unknown card\n");
}
widget_add_text_scroll_element(
widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));

widget_add_button_element(
widget, GuiButtonTypeRight, "Exit", metroflip_exit_widget_callback, app);
mf_classic_free(mfc_data);
furi_string_free(parsed_data);
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewWidget);
}
flipper_format_free(ff);
} else {
// Setup view
Popup* popup = app->popup;
popup_set_header(popup, "Apply\n card to\nthe back", 68, 30, AlignLeft, AlignTop);
popup_set_icon(popup, 0, 3, &I_RFIDDolphinReceive_97x61);

// Start worker
view_dispatcher_switch_to_view(app->view_dispatcher, MetroflipViewPopup);
app->poller = nfc_poller_alloc(app->nfc, NfcProtocolMfClassic);
nfc_poller_start(app->poller, troika_poller_callback, app);

metroflip_app_blink_start(app);
}
}

static bool troika_on_event(Metroflip* app, SceneManagerEvent event) {
Expand Down

0 comments on commit 5e40d55

Please sign in to comment.