respond to seos

This commit is contained in:
Eric Betts
2023-10-29 17:59:11 -07:00
parent 44051c3d34
commit 2a837eca2f
4 changed files with 56 additions and 9 deletions
+7 -7
View File
@@ -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
View File
@@ -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 {
+43
View File
@@ -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;
}
+4
View File
@@ -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);