#include <f_hal_nfc_i.h>
FHalNfcEventInternal* f_hal_nfc_event = NULL;
void f_hal_nfc_event_init() {
f_hal_nfc_event = malloc(sizeof(FHalNfcEventInternal));
}
FHalNfcError f_hal_nfc_event_start() {
furi_assert(f_hal_nfc_event);
f_hal_nfc_event->thread = furi_thread_get_current_id();
furi_thread_flags_clear(F_HAL_NFC_EVENT_INTERNAL_ALL);
return FHalNfcErrorNone;
}
void f_hal_nfc_set_event(FHalNfcEventInternalType event) {
furi_assert(f_hal_nfc_event);
furi_assert(f_hal_nfc_event->thread);
furi_thread_flags_set(f_hal_nfc_event->thread, event);
}
FHalNfcError f_hal_nfc_abort() {
f_hal_nfc_set_event(FHalNfcEventInternalTypeAbort);
return FHalNfcErrorNone;
}
FHalNfcEvent f_hal_nfc_wait_event(uint32_t timeout_ms) {
furi_assert(f_hal_nfc_event);
furi_assert(f_hal_nfc_event->thread);
FHalNfcEvent event = 0;
uint32_t event_timeout = timeout_ms == F_HAL_NFC_EVENT_WAIT_FOREVER ? FuriWaitForever :
timeout_ms;
uint32_t event_flag =
furi_thread_flags_wait(F_HAL_NFC_EVENT_INTERNAL_ALL, FuriFlagWaitAny, event_timeout);
if(event_flag != FuriFlagErrorTimeout) {
if(event_flag & FHalNfcEventInternalTypeIrq) {
furi_thread_flags_clear(FHalNfcEventInternalTypeIrq);
FuriHalSpiBusHandle* handle = &furi_hal_spi_bus_handle_nfc;
furi_hal_spi_acquire(handle);
uint32_t irq = f_hal_nfc_get_irq(handle);
furi_hal_spi_release(handle);
if(irq & ST25R3916_IRQ_MASK_OSC) {
event |= FHalNfcEventOscOn;
}
if(irq & ST25R3916_IRQ_MASK_TXE) {
event |= FHalNfcEventTxEnd;
}
if(irq & ST25R3916_IRQ_MASK_RXS) {
event |= FHalNfcEventRxStart;
}
if(irq & ST25R3916_IRQ_MASK_RXE) {
event |= FHalNfcEventRxEnd;
}
if(irq & ST25R3916_IRQ_MASK_COL) {
event |= FHalNfcEventCollision;
}
if(irq & ST25R3916_IRQ_MASK_EON) {
event |= FHalNfcEventFieldOn;
}
if(irq & ST25R3916_IRQ_MASK_EOF) {
event |= FHalNfcEventFieldOff;
}
if(irq & ST25R3916_IRQ_MASK_WU_A) {
event |= FHalNfcEventListenerActive;
}
if(irq & ST25R3916_IRQ_MASK_WU_A_X) {
event |= FHalNfcEventListenerActiveA;
}
}
if(event_flag & FHalNfcEventInternalTypeTimerFwtExpired) {
event |= FHalNfcEventTimerFwtExpired;
furi_thread_flags_clear(FHalNfcEventInternalTypeTimerFwtExpired);
}
if(event_flag & FHalNfcEventInternalTypeTimerBlockTxExpired) {
event |= FHalNfcEventTimerBlockTxExpired;
furi_thread_flags_clear(FHalNfcEventInternalTypeTimerBlockTxExpired);
}
if(event_flag & FHalNfcEventInternalTypeAbort) {
event |= FHalNfcEventAbortRequest;
furi_thread_flags_clear(FHalNfcEventInternalTypeAbort);
}
} else {
event = FHalNfcEventTimeout;
}
return event;
}
bool f_hal_nfc_event_wait_for_specific_irq(
FuriHalSpiBusHandle* handle,
uint32_t mask,
uint32_t timeout_ms) {
furi_assert(f_hal_nfc_event);
furi_assert(f_hal_nfc_event->thread);
bool irq_received = false;
uint32_t event_flag =
furi_thread_flags_wait(FHalNfcEventInternalTypeIrq, FuriFlagWaitAny, timeout_ms);
if(event_flag == FHalNfcEventInternalTypeIrq) {
uint32_t irq = f_hal_nfc_get_irq(handle);
irq_received = ((irq & mask) == mask);
furi_thread_flags_clear(FHalNfcEventInternalTypeIrq);
}
return irq_received;
}
↑ V605 Consider verifying the expression: event_flag != FuriFlagErrorTimeout. An unsigned value is compared to the number -2.