diff --git a/lib/nfc/nfc.c b/lib/nfc/nfc.c index 90e65b282fa..4f435871111 100644 --- a/lib/nfc/nfc.c +++ b/lib/nfc/nfc.c @@ -646,6 +646,33 @@ NfcError nfc_iso15693_listener_tx_sof(Nfc* instance) { return ret; } +NfcError nfc_iso15693_detect_mode(Nfc* instance) { + furi_check(instance); + + FuriHalNfcError error = furi_hal_nfc_iso15693_detect_mode(); + NfcError ret = nfc_process_hal_error(error); + + return ret; +} + +NfcError nfc_iso15693_force_1outof4(Nfc* instance) { + furi_check(instance); + + FuriHalNfcError error = furi_hal_nfc_iso15693_force_1outof4(); + NfcError ret = nfc_process_hal_error(error); + + return ret; +} + +NfcError nfc_iso15693_force_1outof256(Nfc* instance) { + furi_check(instance); + + FuriHalNfcError error = furi_hal_nfc_iso15693_force_1outof256(); + NfcError ret = nfc_process_hal_error(error); + + return ret; +} + NfcError nfc_felica_listener_set_sensf_res_data( Nfc* instance, const uint8_t* idm, diff --git a/lib/nfc/nfc.h b/lib/nfc/nfc.h index 8fbf90d1fa9..ebd29dc4b1d 100644 --- a/lib/nfc/nfc.h +++ b/lib/nfc/nfc.h @@ -380,6 +380,30 @@ NfcError nfc_felica_listener_set_sensf_res_data( */ NfcError nfc_iso15693_listener_tx_sof(Nfc* instance); +/** + * @brief Set ISO15693 parser mode to autodetect + * +* @param[in,out] instance pointer to the instance to be configured. + * @returns NfcErrorNone on success, any other error code on failure. +*/ +NfcError nfc_iso15693_detect_mode(Nfc* instance); + +/** + * @brief Set ISO15693 parser mode to 1OutOf4, disables autodetection + * + * @param[in,out] instance pointer to the instance to be configured. + * @return NfcErrorNone on success, any other error code on failure. +*/ +NfcError nfc_iso15693_force_1outof4(Nfc* instance); + +/** + * @brief Set ISO15693 parser mode to 1OutOf256, disables autodetection + * + * @param[in,out] instance pointer to the instance to be configured. + * @return NfcErrorNone on success, any other error code on failure. +*/ +NfcError nfc_iso15693_force_1outof256(Nfc* instance); + #ifdef __cplusplus } #endif diff --git a/lib/nfc/nfc_mock.c b/lib/nfc/nfc_mock.c index ee4bb09cc7d..9826ea36f82 100644 --- a/lib/nfc/nfc_mock.c +++ b/lib/nfc/nfc_mock.c @@ -497,6 +497,24 @@ NfcError nfc_iso15693_listener_tx_sof(Nfc* instance) { return NfcErrorNone; } +NfcError nfc_iso15693_detect_mode(Nfc* instance) { + UNUSED(instance); + + return NfcErrorNone; +} + +NfcError nfc_iso15693_force_1outof4(Nfc* instance) { + UNUSED(instance); + + return NfcErrorNone; +} + +NfcError nfc_iso15693_force_1outof256(Nfc* instance) { + UNUSED(instance); + + return NfcErrorNone; +} + NfcError nfc_felica_listener_set_sensf_res_data( Nfc* instance, const uint8_t* idm, diff --git a/lib/signal_reader/parsers/iso15693/iso15693_parser.c b/lib/signal_reader/parsers/iso15693/iso15693_parser.c index a2c6912e637..f4065e49711 100644 --- a/lib/signal_reader/parsers/iso15693/iso15693_parser.c +++ b/lib/signal_reader/parsers/iso15693/iso15693_parser.c @@ -26,6 +26,7 @@ typedef enum { struct Iso15693Parser { Iso15693ParserState state; Iso15693ParserMode mode; + bool detect_mode; SignalReader* signal_reader; @@ -62,6 +63,7 @@ typedef Iso15693ParserCommand (*Iso15693ParserStateHandler)(Iso15693Parser* inst Iso15693Parser* iso15693_parser_alloc(const GpioPin* pin, size_t max_frame_size) { Iso15693Parser* instance = malloc(sizeof(Iso15693Parser)); + instance->detect_mode = true; instance->parsed_frame = bit_buffer_alloc(max_frame_size); instance->signal_reader = signal_reader_alloc(pin, ISO15693_PARSER_SIGNAL_READER_BUFF_SIZE); @@ -86,7 +88,7 @@ void iso15693_parser_reset(Iso15693Parser* instance) { furi_assert(instance); instance->state = Iso15693ParserStateParseSoF; - instance->mode = Iso15693ParserMode1OutOf4; + if(instance->detect_mode) instance->mode = Iso15693ParserMode1OutOf4; memset(instance->bitstream_buff, 0x00, sizeof(instance->bitstream_buff)); instance->bitstream_idx = 0; @@ -122,10 +124,10 @@ static void signal_reader_callback(SignalReaderEvent event, void* context) { if(instance->state == Iso15693ParserStateParseSoF) { if(event.data->data[0] == sof_1_out_of_4) { - instance->mode = Iso15693ParserMode1OutOf4; + if(instance->detect_mode) instance->mode = Iso15693ParserMode1OutOf4; instance->state = Iso15693ParserStateParseFrame; } else if(event.data->data[0] == sof_1_out_of_256) { - instance->mode = Iso15693ParserMode1OutOf256; + if(instance->detect_mode) instance->mode = Iso15693ParserMode1OutOf256; instance->state = Iso15693ParserStateParseFrame; } else if(event.data->data[0] == eof_single) { instance->eof_received = true; @@ -298,3 +300,23 @@ void iso15693_parser_get_data( bit_buffer_write_bytes(instance->parsed_frame, buff, buff_size); *data_bits = bit_buffer_get_size(instance->parsed_frame); } + +void iso15693_parser_detect_mode(Iso15693Parser* instance) { + furi_assert(instance); + + instance->detect_mode = true; +} + +void iso15693_parser_force_1outof4(Iso15693Parser* instance) { + furi_assert(instance); + + instance->detect_mode = false; + instance->mode = Iso15693ParserMode1OutOf4; +} + +void iso15693_parser_force_1outof256(Iso15693Parser* instance) { + furi_assert(instance); + + instance->detect_mode = false; + instance->mode = Iso15693ParserMode1OutOf256; +} diff --git a/lib/signal_reader/parsers/iso15693/iso15693_parser.h b/lib/signal_reader/parsers/iso15693/iso15693_parser.h index 3017a96d79a..66486e0e7a2 100644 --- a/lib/signal_reader/parsers/iso15693/iso15693_parser.h +++ b/lib/signal_reader/parsers/iso15693/iso15693_parser.h @@ -37,6 +37,10 @@ void iso15693_parser_get_data( size_t buff_size, size_t* data_bits); +void iso15693_parser_detect_mode(Iso15693Parser* instance); +void iso15693_parser_force_1outof4(Iso15693Parser* instance); +void iso15693_parser_force_1outof256(Iso15693Parser* instance); + #ifdef __cplusplus } #endif diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index ee81f76a97a..c7813ef8077 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1465,6 +1465,9 @@ Function,+,furi_hal_nfc_iso14443a_poller_trx_short_frame,FuriHalNfcError,FuriHal Function,+,furi_hal_nfc_iso14443a_poller_tx_custom_parity,FuriHalNfcError,"const uint8_t*, size_t" Function,+,furi_hal_nfc_iso14443a_rx_sdd_frame,FuriHalNfcError,"uint8_t*, size_t, size_t*" Function,+,furi_hal_nfc_iso14443a_tx_sdd_frame,FuriHalNfcError,"const uint8_t*, size_t" +Function,+,furi_hal_nfc_iso15693_detect_mode,FuriHalNfcError, +Function,+,furi_hal_nfc_iso15693_force_1outof256,FuriHalNfcError, +Function,+,furi_hal_nfc_iso15693_force_1outof4,FuriHalNfcError, Function,+,furi_hal_nfc_iso15693_listener_tx_sof,FuriHalNfcError, Function,+,furi_hal_nfc_listener_enable_rx,FuriHalNfcError, Function,+,furi_hal_nfc_listener_idle,FuriHalNfcError, @@ -2804,6 +2807,9 @@ Function,+,nfc_iso14443a_listener_tx_custom_parity,NfcError,"Nfc*, const BitBuff Function,+,nfc_iso14443a_poller_trx_custom_parity,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t" Function,+,nfc_iso14443a_poller_trx_sdd_frame,NfcError,"Nfc*, const BitBuffer*, BitBuffer*, uint32_t" Function,+,nfc_iso14443a_poller_trx_short_frame,NfcError,"Nfc*, NfcIso14443aShortFrame, BitBuffer*, uint32_t" +Function,+,nfc_iso15693_detect_mode,NfcError,Nfc* +Function,+,nfc_iso15693_force_1outof256,NfcError,Nfc* +Function,+,nfc_iso15693_force_1outof4,NfcError,Nfc* Function,+,nfc_iso15693_listener_tx_sof,NfcError,Nfc* Function,+,nfc_listener_alloc,NfcListener*,"Nfc*, NfcProtocol, const NfcDeviceData*" Function,+,nfc_listener_free,void,NfcListener* diff --git a/targets/f7/furi_hal/furi_hal_nfc_iso15693.c b/targets/f7/furi_hal/furi_hal_nfc_iso15693.c index 3245b67cc8c..0fd5dbca5d0 100644 --- a/targets/f7/furi_hal/furi_hal_nfc_iso15693.c +++ b/targets/f7/furi_hal/furi_hal_nfc_iso15693.c @@ -406,6 +406,24 @@ FuriHalNfcError furi_hal_nfc_iso15693_listener_tx_sof(void) { return FuriHalNfcErrorNone; } +FuriHalNfcError furi_hal_nfc_iso15693_detect_mode(void) { + iso15693_parser_detect_mode(furi_hal_nfc_iso15693_listener->parser); + + return FuriHalNfcErrorNone; +} + +FuriHalNfcError furi_hal_nfc_iso15693_force_1outof4(void) { + iso15693_parser_force_1outof4(furi_hal_nfc_iso15693_listener->parser); + + return FuriHalNfcErrorNone; +} + +FuriHalNfcError furi_hal_nfc_iso15693_force_1outof256(void) { + iso15693_parser_force_1outof256(furi_hal_nfc_iso15693_listener->parser); + + return FuriHalNfcErrorNone; +} + static FuriHalNfcError furi_hal_nfc_iso15693_listener_rx( FuriHalSpiBusHandle* handle, uint8_t* rx_data, diff --git a/targets/furi_hal_include/furi_hal_nfc.h b/targets/furi_hal_include/furi_hal_nfc.h index 3a81de6f52d..a651c97772a 100644 --- a/targets/furi_hal_include/furi_hal_nfc.h +++ b/targets/furi_hal_include/furi_hal_nfc.h @@ -452,6 +452,24 @@ FuriHalNfcError furi_hal_nfc_iso14443a_listener_tx_custom_parity( */ FuriHalNfcError furi_hal_nfc_iso15693_listener_tx_sof(void); +/** Set ISO15693 parser mode to autodetect + * + * @return FuriHalNfcError +*/ +FuriHalNfcError furi_hal_nfc_iso15693_detect_mode(void); + +/** Set ISO15693 parser mode to 1OutOf4, disables autodetection + * + * @return FuriHalNfcError +*/ +FuriHalNfcError furi_hal_nfc_iso15693_force_1outof4(void); + +/** Set ISO15693 parser mode to 1OutOf256, disables autodetection + * + * @return FuriHalNfcError +*/ +FuriHalNfcError furi_hal_nfc_iso15693_force_1outof256(void); + /** * @brief Set FeliCa collision resolution parameters in listener mode. *