mirror of
https://github.com/bettse/seader.git
synced 2026-04-28 01:55:22 +00:00
respond to seos
This commit is contained in:
@@ -20,6 +20,7 @@ void seader_scene_read_14a_on_enter(void* context) {
|
||||
view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewPopup);
|
||||
|
||||
seader->poller = nfc_poller_alloc(seader->nfc, NfcProtocolIso14443_4a);
|
||||
nfc_poller_start(seader->poller, seader_worker_poller_callback_iso14443_4a, seader);
|
||||
|
||||
seader_blink_start(seader);
|
||||
}
|
||||
@@ -30,18 +31,12 @@ bool seader_scene_read_14a_on_event(void* context, SceneManagerEvent event) {
|
||||
|
||||
if(event.type == SceneManagerEventTypeCustom) {
|
||||
if(event.event == SeaderCustomEventWorkerExit) {
|
||||
nfc_poller_stop(seader->poller);
|
||||
nfc_poller_free(seader->poller);
|
||||
seader->credential->type = SeaderCredentialType14A;
|
||||
scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
|
||||
consumed = true;
|
||||
}
|
||||
} else if(event.type == SceneManagerEventTypeBack) {
|
||||
nfc_poller_stop(seader->poller);
|
||||
nfc_poller_free(seader->poller);
|
||||
static const uint32_t possible_scenes[] = {SeaderSceneStart};
|
||||
scene_manager_search_and_switch_to_previous_scene_one_of(
|
||||
seader->scene_manager, possible_scenes, COUNT_OF(possible_scenes));
|
||||
scene_manager_search_and_switch_to_previous_scene(seader->scene_manager, SeaderSceneStart);
|
||||
consumed = true;
|
||||
}
|
||||
|
||||
@@ -51,6 +46,11 @@ bool seader_scene_read_14a_on_event(void* context, SceneManagerEvent event) {
|
||||
void seader_scene_read_14a_on_exit(void* context) {
|
||||
Seader* seader = context;
|
||||
|
||||
if (seader->poller) {
|
||||
nfc_poller_stop(seader->poller);
|
||||
nfc_poller_free(seader->poller);
|
||||
}
|
||||
|
||||
// Clear view
|
||||
popup_reset(seader->popup);
|
||||
|
||||
|
||||
+2
-2
@@ -24,8 +24,6 @@
|
||||
|
||||
#include <lib/nfc/nfc.h>
|
||||
#include <lib/nfc/protocols/iso14443_3a/iso14443_3a.h>
|
||||
#include <lib/nfc/protocols/iso14443_3a/iso14443_3a_listener.h>
|
||||
#include <lib/nfc/protocols/mf_ultralight/mf_ultralight_listener.h>
|
||||
|
||||
#include <nfc/nfc_poller.h>
|
||||
#include <nfc/nfc_scanner.h>
|
||||
@@ -67,6 +65,8 @@ enum SeaderCustomEvent {
|
||||
SeaderCustomEventWorkerExit,
|
||||
SeaderCustomEventByteInputDone,
|
||||
SeaderCustomEventTextInputDone,
|
||||
|
||||
SeaderCustomEventPollerSuccess,
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
|
||||
@@ -649,3 +649,46 @@ int32_t seader_worker_task(void* context) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context) {
|
||||
furi_assert(event.protocol == NfcProtocolIso14443_4a);
|
||||
|
||||
Seader* seader = context;
|
||||
SeaderUartBridge* seader_uart = seader->uart;
|
||||
const Iso14443_4aPollerEvent* iso14443_4a_event = event.event_data;
|
||||
|
||||
if(iso14443_4a_event->type == Iso14443_4aPollerEventTypeReady) {
|
||||
nfc_device_set_data(seader->nfc_device, NfcProtocolIso14443_4a, nfc_poller_get_data(seader->poller));
|
||||
FURI_LOG_D(TAG, "poller 14a ready");
|
||||
|
||||
size_t uid_len;
|
||||
const uint8_t* uid = nfc_device_get_uid(seader->nfc_device, &uid_len);
|
||||
|
||||
// const Iso14443_4aData* iso14443_4a_data = nfc_device_get_data(seader->nfc_device, NfcProtocolIso14443_4a);
|
||||
//const Iso14443_3aData* iso14443_3a_data = iso14443_4a_data->iso14443_3a_data;
|
||||
const Iso14443_3aData* iso14443_3a_data = nfc_device_get_data(seader->nfc_device, NfcProtocolIso14443_3a);
|
||||
uint8_t sak_val = iso14443_3a_get_sak(iso14443_3a_data);
|
||||
|
||||
CardDetails_t* cardDetails = 0;
|
||||
cardDetails = calloc(1, sizeof *cardDetails);
|
||||
assert(cardDetails);
|
||||
|
||||
OCTET_STRING_fromBuf(&cardDetails->csn, (const char*)uid, uid_len);
|
||||
uint8_t protocolBytes[] = {0x00, FrameProtocol_nfc};
|
||||
OCTET_STRING_fromBuf(&cardDetails->protocol, (const char*)protocolBytes, sizeof(protocolBytes));
|
||||
|
||||
OCTET_STRING_t sak = {.buf = &sak_val, .size = 1};
|
||||
cardDetails->sak = &sak;
|
||||
|
||||
OCTET_STRING_t atqa = {.buf = (uint8_t*)iso14443_3a_data->atqa, .size = 2};
|
||||
cardDetails->atqa = &atqa;
|
||||
|
||||
seader_send_card_detected(seader_uart, cardDetails);
|
||||
|
||||
ASN_STRUCT_FREE(asn_DEF_CardDetails, cardDetails);
|
||||
|
||||
return NfcCommandStop;
|
||||
}
|
||||
|
||||
return NfcCommandContinue;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <lib/nfc/protocols/iso14443_4a/iso14443_4a_poller.h>
|
||||
#include "seader_credential.h"
|
||||
#include "seader_bridge.h"
|
||||
|
||||
@@ -52,3 +53,6 @@ void seader_worker_start(
|
||||
void seader_worker_stop(SeaderWorker* seader_worker);
|
||||
void seader_worker_process_sam_message(SeaderWorker* seader_worker, CCID_Message* message);
|
||||
void seader_worker_send_version(SeaderWorker* seader_worker);
|
||||
|
||||
|
||||
NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context);
|
||||
|
||||
Reference in New Issue
Block a user