Skip to content

Commit

Permalink
nfc magic: write magic lib
Browse files Browse the repository at this point in the history
  • Loading branch information
gornekich committed Nov 1, 2022
1 parent 957780d commit a1ad24b
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 4 deletions.
55 changes: 53 additions & 2 deletions applications/plugins/nfc_magic/lib/magic/magic.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,59 @@
#include "magic.h"

#include <furi_hal_nfc.h>

#define TAG "Magic"

#define MAGIC_CMD_WUPA (0x40)
#define MAGIC_CMD_WIPE (0x41)
#define MAGIC_CMD_READ (0x43)
#define MAGIC_CMD_WRITE (0x43)

#define MAGIC_ACK (0x0A)

#define MAGIC_BUFFER_SIZE (32)

bool magic_wupa() {
return true;
bool magic_activated = false;
uint8_t tx_data[MAGIC_BUFFER_SIZE] = {};
uint8_t rx_data[MAGIC_BUFFER_SIZE] = {};
uint16_t rx_len = 0;
FuriHalNfcReturn ret = 0;

do {
// Setup nfc poller
furi_hal_nfc_ll_set_mode(
FuriHalNfcModePollNfca, FuriHalNfcBitrate106, FuriHalNfcBitrate106);
furi_hal_nfc_ll_set_fdt_listen(FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_POLLER);
furi_hal_nfc_ll_set_fdt_poll(FURI_HAL_NFC_LL_FDT_POLL_NFCA_POLLER);
furi_hal_nfc_ll_txrx_on();

// Start communication
tx_data[0] = MAGIC_CMD_WUPA;
ret = furi_hal_nfc_ll_txrx(
tx_data,
7,
rx_data,
sizeof(rx_data),
&rx_len,
FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_TX_MANUAL | FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON |
+FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_RX_KEEP,
furi_hal_nfc_ll_ms2fc(20));
FURI_LOG_I(TAG, "Ret: %d", ret);
if(ret != FuriHalNfcReturnIncompleteByte) break;
// if(rx_len != 4) break;
if(rx_data[0] != MAGIC_ACK) {
FURI_LOG_E(TAG, "Wrong ack");
break;
}
magic_activated = true;
} while(false);

if(!magic_activated) {
furi_hal_nfc_ll_txrx_off();
}

return magic_activated;
}

bool magic_read_block(uint8_t block_num, MfClassicBlock* data) {
Expand All @@ -21,4 +73,3 @@ bool magic_write_blk(uint8_t block_num, MfClassicBlock* data) {
bool magic_wipe() {
return true;
}

2 changes: 1 addition & 1 deletion applications/plugins/nfc_magic/nfc_magic.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ int32_t nfc_magic_app(void* p) {
UNUSED(p);
NfcMagic* nfc_magic = nfc_magic_alloc();

scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneStart);
scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneWrite);

view_dispatcher_run(nfc_magic->view_dispatcher);

Expand Down
1 change: 1 addition & 0 deletions applications/plugins/nfc_magic/nfc_magic_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// #include "nfc_magic_device.h"

// #include "rfal_nfc_magic.h"
#include "lib/magic/magic.h"

#include <furi.h>
#include <gui/gui.h>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ ADD_SCENE(nfc_magic, start, Start)
ADD_SCENE(nfc_magic, file_select, FileSelect)
ADD_SCENE(nfc_magic, write_confirm, WriteConfirm)
ADD_SCENE(nfc_magic, wrong_card, WrongCard)
ADD_SCENE(nfc_magic, write, Write)
96 changes: 96 additions & 0 deletions applications/plugins/nfc_magic/scenes/nfc_magic_write.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#include "../nfc_magic_i.h"

enum {
NfcMagicSceneWriteStateCardSearch,
NfcMagicSceneWriteStateCardFound,
};

// bool nfc_magic_write_worker_callback(NfcMagicWorkerEvent event, void* context) {
// furi_assert(context);

// NfcMagic* nfc_magic = context;
// view_dispatcher_send_custom_event(nfc->view_dispatcher, event);

// return true;
// }

static void nfc_magic_scene_write_setup_view(NfcMagic* nfc_magic) {
Popup* popup = nfc_magic->popup;
popup_reset(popup);
uint32_t state = scene_manager_get_scene_state(nfc_magic->scene_manager, NfcMagicSceneWrite);

if(state == NfcMagicSceneWriteStateCardSearch) {
popup_set_text(
nfc_magic->popup, "Apply the initial\ncard only", 128, 32, AlignRight, AlignCenter);
// popup_set_icon(nfc_magic->popup, 0, 8, &I_NFC_manual_60x50);
} else {
popup_set_header(popup, "Writing\nDon't move...", 52, 32, AlignLeft, AlignCenter);
// popup_set_icon(popup, 12, 23, &A_Loading_24);
}

view_dispatcher_switch_to_view(nfc_magic->view_dispatcher, NfcMagicViewPopup);

FURI_LOG_I("write", "send wupa");
bool ret = magic_wupa();
FURI_LOG_W("write", "return %d", ret);
}

void nfc_magic_scene_write_on_enter(void* context) {
NfcMagic* nfc_magic = context;

scene_manager_set_scene_state(
nfc_magic->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardSearch);
nfc_magic_scene_write_setup_view(nfc_magic);

// Setup and start worker
// nfc_worker_start(
// nfc->worker,
// NfcMagicWorkerStateMfClassicWrite,
// &nfc->dev->dev_data,
// nfc_magic_write_worker_callback,
// nfc);
nfc_magic_blink_start(nfc_magic);
}

bool nfc_magic_scene_write_on_event(void* context, SceneManagerEvent event) {
UNUSED(context);
UNUSED(event);
// NfcMagic* nfc_magic = context;
bool consumed = false;

// if(event.type == SceneManagerEventTypeCustom) {
// if(event.event == NfcMagicWorkerEventSuccess) {
// scene_manager_next_scene(nfc->scene_manager, NfcMagicSceneWriteSuccess);
// consumed = true;
// } else if(event.event == NfcMagicWorkerEventFail) {
// scene_manager_next_scene(nfc->scene_manager, NfcMagicSceneWriteFail);
// consumed = true;
// } else if(event.event == NfcMagicWorkerEventWrongCard) {
// scene_manager_next_scene(nfc->scene_manager, NfcMagicSceneMfClassicWrongCard);
// consumed = true;
// } else if(event.event == NfcMagicWorkerEventCardDetected) {
// scene_manager_set_scene_state(
// nfc->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardFound);
// nfc_magic_scene_write_setup_view(nfc);
// consumed = true;
// } else if(event.event == NfcMagicWorkerEventNoCardDetected) {
// scene_manager_set_scene_state(
// nfc->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardSearch);
// nfc_magic_scene_write_setup_view(nfc);
// consumed = true;
// }
// }
return consumed;
}

void nfc_magic_scene_write_on_exit(void* context) {
NfcMagic* nfc_magic = context;

// nfc_worker_stop(nfc->worker);
scene_manager_set_scene_state(
nfc_magic->scene_manager, NfcMagicSceneWrite, NfcMagicSceneWriteStateCardSearch);
// Clear view
popup_reset(nfc_magic->popup);

nfc_magic_blink_stop(nfc_magic);
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ bool nfc_magic_scene_write_confirm_on_event(void* context, SceneManagerEvent eve
if(event.event == GuiButtonTypeLeft) {
consumed = scene_manager_previous_scene(nfc_magic->scene_manager);
} else if(event.event == GuiButtonTypeCenter) {
scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneStart);
scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneWrite);
consumed = true;
}
}
Expand Down

0 comments on commit a1ad24b

Please sign in to comment.