diff --git a/applications/services/expansion/expansion.c b/applications/services/expansion/expansion.c index 2b0c5b27a..3e8191f7a 100644 --- a/applications/services/expansion/expansion.c +++ b/applications/services/expansion/expansion.c @@ -51,10 +51,12 @@ struct Expansion { ExpansionState state; }; +#ifndef LOGS_RELEASE_BUILD static const char* const expansion_uart_names[] = { "USART", "LPUART", }; +#endif // Called from the serial control thread static void expansion_detect_callback(void* context) { diff --git a/applications/services/rpc/rpc_app.c b/applications/services/rpc/rpc_app.c index 2b9a6542d..87405d654 100644 --- a/applications/services/rpc/rpc_app.c +++ b/applications/services/rpc/rpc_app.c @@ -31,7 +31,11 @@ static void rpc_system_app_send_state_response( response->which_content = PB_Main_app_state_response_tag; response->content.app_state_response.state = state; +#ifndef LOGS_RELEASE_BUILD FURI_LOG_D(TAG, "%s", name); +#else + UNUSED(name); +#endif rpc_send(rpc_app->session, response); free(response); @@ -371,7 +375,9 @@ void rpc_system_app_confirm(RpcAppSystem* rpc_app, bool result) { rpc_app->last_event_type == RpcAppEventTypeDataExchange); const uint32_t last_command_id = rpc_app->last_command_id; +#ifndef LOGS_RELEASE_BUILD const RpcAppSystemEventType last_event_type = rpc_app->last_event_type; +#endif rpc_app->last_command_id = 0; rpc_app->last_event_type = RpcAppEventTypeInvalid; diff --git a/applications/services/rpc/rpc_cli.c b/applications/services/rpc/rpc_cli.c index fda059ec8..d9314e453 100644 --- a/applications/services/rpc/rpc_cli.c +++ b/applications/services/rpc/rpc_cli.c @@ -43,8 +43,10 @@ void rpc_cli_command_start_session(PipeSide* pipe, FuriString* args, void* conte furi_assert(context); Rpc* rpc = context; +#ifndef LOGS_RELEASE_BUILD uint32_t mem_before = memmgr_get_free_heap(); FURI_LOG_D(TAG, "Free memory %lu", mem_before); +#endif furi_hal_usb_lock(); RpcSession* rpc_session = rpc_session_open(rpc, RpcOwnerUsb); diff --git a/firmware.scons b/firmware.scons index e7378f957..3431c35bb 100644 --- a/firmware.scons +++ b/firmware.scons @@ -49,6 +49,7 @@ env = ENV.Clone( "CPPDEFINES": [ "NDEBUG", "FURI_DEBUG" if ENV["LIB_DEBUG"] else "FURI_NDEBUG", + "LOGS_DEBUG_BUILD" if ENV["LIB_DEBUG"] else "LOGS_RELEASE_BUILD", ], # You can add other entries named after libraries # If they are present, they have precedence over Default @@ -61,6 +62,7 @@ env = ENV.Clone( "CPPDEFINES": [ "NDEBUG", "FURI_DEBUG" if ENV["DEBUG"] else "FURI_NDEBUG", + "LOGS_DEBUG_BUILD" if ENV["LIB_DEBUG"] else "LOGS_RELEASE_BUILD", ], }, "flipper_application": { @@ -70,6 +72,7 @@ env = ENV.Clone( "CPPDEFINES": [ "NDEBUG", "FURI_DEBUG" if ENV["DEBUG"] else "FURI_NDEBUG", + "LOGS_DEBUG_BUILD" if ENV["LIB_DEBUG"] else "LOGS_RELEASE_BUILD", ], }, }, diff --git a/furi/core/log.h b/furi/core/log.h index 817d9dda3..e4c62b1a3 100644 --- a/furi/core/log.h +++ b/furi/core/log.h @@ -160,6 +160,23 @@ bool furi_log_level_from_string(const char* str, FuriLogLevel* level); #define FURI_LOG_RAW_T(format, ...) \ furi_log_print_raw_format(FuriLogLevelTrace, format, ##__VA_ARGS__) +#ifdef LOGS_RELEASE_BUILD +// Undefine existing macros +//#undef FURI_LOG_E +//#undef FURI_LOG_W +//#undef FURI_LOG_I +#undef FURI_LOG_D +#undef FURI_LOG_T +#undef FURI_LOG_RAW_T +// Define empty macros +//#define FURI_LOG_E(tag, format, ...) +//#define FURI_LOG_W(tag, format, ...) +//#define FURI_LOG_I(tag, format, ...) +#define FURI_LOG_D(tag, format, ...) +#define FURI_LOG_T(tag, format, ...) +#define FURI_LOG_RAW_T(format, ...) +#endif + #ifdef __cplusplus } #endif diff --git a/lib/lfrfid/lfrfid_worker_modes.c b/lib/lfrfid/lfrfid_worker_modes.c index 68b09c5bf..ff4fadc83 100644 --- a/lib/lfrfid/lfrfid_worker_modes.c +++ b/lib/lfrfid/lfrfid_worker_modes.c @@ -56,6 +56,7 @@ void lfrfid_worker_delay(LFRFIDWorker* worker, uint32_t milliseconds) { } void t5577_trace(LFRFIDT5577 t5577, const char* message) { +#ifndef LOGS_RELEASE_BUILD if(furi_log_get_level() == FuriLogLevelTrace) { FURI_LOG_T(TAG, "%s", message); for(uint8_t i = 0; i < 8; i++) @@ -63,6 +64,10 @@ void t5577_trace(LFRFIDT5577 t5577, const char* message) { FURI_LOG_T(TAG, "Mask: %u", t5577.mask); FURI_LOG_T(TAG, "Blocks to write: %lu", t5577.blocks_to_write); } +#else + UNUSED(t5577); + UNUSED(message); +#endif } /**************************************************************************************************/ diff --git a/lib/nfc/protocols/emv/emv_poller_i.c b/lib/nfc/protocols/emv/emv_poller_i.c index 74734c894..c1fd6b6b1 100644 --- a/lib/nfc/protocols/emv/emv_poller_i.c +++ b/lib/nfc/protocols/emv/emv_poller_i.c @@ -59,6 +59,7 @@ EmvError emv_process_error(Iso14443_4aError error) { } static void emv_trace(EmvPoller* instance, const char* message) { +#ifndef LOGS_RELEASE_BUILD if(furi_log_get_level() == FuriLogLevelTrace) { FURI_LOG_T(TAG, "%s", message); @@ -75,6 +76,10 @@ static void emv_trace(EmvPoller* instance, const char* message) { } printf("\r\n"); } +#else + UNUSED(instance); + UNUSED(message); +#endif } static bool @@ -181,7 +186,8 @@ static bool } } - // Convert 4-bit to ASCII representation +// Convert 4-bit to ASCII representation +#ifndef LOGS_RELEASE_BUILD char track_2_equiv[41]; uint8_t track_2_equiv_len = 0; for(int x = 0; x < tlen; x++) { @@ -196,6 +202,7 @@ static bool } track_2_equiv[track_2_equiv_len] = '\0'; FURI_LOG_T(TAG, "found EMV_TAG_TRACK_2 %X : %s", tag, track_2_equiv); +#endif success = true; break; } diff --git a/lib/nfc/protocols/mf_classic/mf_classic_poller.c b/lib/nfc/protocols/mf_classic/mf_classic_poller.c index 86a3ccddd..e81271bc0 100644 --- a/lib/nfc/protocols/mf_classic/mf_classic_poller.c +++ b/lib/nfc/protocols/mf_classic/mf_classic_poller.c @@ -1358,6 +1358,7 @@ NfcCommand mf_classic_poller_handler_nested_calibrate(MfClassicPoller* instance) instance->state = MfClassicPollerStateNestedController; mf_classic_poller_halt(instance); +#ifndef LOGS_RELEASE_BUILD uint16_t d_dist = dict_attack_ctx->d_max - dict_attack_ctx->d_min; FURI_LOG_D( TAG, @@ -1365,7 +1366,7 @@ NfcCommand mf_classic_poller_handler_nested_calibrate(MfClassicPoller* instance) dict_attack_ctx->d_min, dict_attack_ctx->d_max, ((d_dist >= 3) && (d_dist <= 6)) ? "true" : "false"); - +#endif return command; } diff --git a/lib/nfc/protocols/mf_ultralight/mf_ultralight_poller.c b/lib/nfc/protocols/mf_ultralight/mf_ultralight_poller.c index 6dd761af8..55b10e60c 100644 --- a/lib/nfc/protocols/mf_ultralight/mf_ultralight_poller.c +++ b/lib/nfc/protocols/mf_ultralight/mf_ultralight_poller.c @@ -418,9 +418,11 @@ static NfcCommand mf_ultralight_poller_handler_auth(MfUltralightPoller* instance command = instance->callback(instance->general_event, instance->context); if(!instance->mfu_event.data->auth_context.skip_auth) { instance->auth_context.password = instance->mfu_event.data->auth_context.password; +#ifndef LOGS_RELEASE_BUILD uint32_t pass = bit_lib_bytes_to_num_be( instance->auth_context.password.data, sizeof(MfUltralightAuthPassword)); FURI_LOG_D(TAG, "Trying to authenticate with password %08lX", pass); +#endif instance->error = mf_ultralight_poller_auth_pwd(instance, &instance->auth_context); if(instance->error == MfUltralightErrorNone) { FURI_LOG_D(TAG, "Auth success"); diff --git a/lib/nfc/protocols/st25tb/st25tb_poller_i.c b/lib/nfc/protocols/st25tb/st25tb_poller_i.c index 2bf025563..d9caec724 100644 --- a/lib/nfc/protocols/st25tb/st25tb_poller_i.c +++ b/lib/nfc/protocols/st25tb/st25tb_poller_i.c @@ -77,8 +77,10 @@ St25tbError st25tb_poller_initiate(St25tbPoller* instance, uint8_t* chip_id_ptr) ret = St25tbErrorCommunication; break; } +#ifndef LOGS_RELEASE_BUILD uint8_t chip_id = bit_buffer_get_byte(instance->rx_buffer, 0); FURI_LOG_D(TAG, "Got chip_id=0x%02X", chip_id); +#endif if(chip_id_ptr) { *chip_id_ptr = bit_buffer_get_byte(instance->rx_buffer, 0); } diff --git a/lib/subghz/protocols/beninca_arc.c b/lib/subghz/protocols/beninca_arc.c index 308989d61..d141612dc 100644 --- a/lib/subghz/protocols/beninca_arc.c +++ b/lib/subghz/protocols/beninca_arc.c @@ -351,8 +351,9 @@ static void subghz_protocol_beninca_arc_encoder_prepare_packets( instance->generic.btn = subghz_protocol_beninca_arc_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) + if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", instance->generic.btn); + } // Make 3 packets with different mini counter values - 2, 4, 6 for(uint8_t i = 0; i < 3; i++) { diff --git a/lib/subghz/protocols/came_atomo.c b/lib/subghz/protocols/came_atomo.c index ddab59ff3..89f263192 100644 --- a/lib/subghz/protocols/came_atomo.c +++ b/lib/subghz/protocols/came_atomo.c @@ -265,8 +265,9 @@ static void subghz_protocol_encoder_came_atomo_get_upload( } // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&btn)) + if(subghz_block_generic_global_button_override_get(&btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", btn); + } //Send header instance->encoder.upload[index++] = diff --git a/lib/subghz/protocols/ditec_gol4.c b/lib/subghz/protocols/ditec_gol4.c index c046ae770..451aeab06 100644 --- a/lib/subghz/protocols/ditec_gol4.c +++ b/lib/subghz/protocols/ditec_gol4.c @@ -351,9 +351,6 @@ static void subghz_protocol_ditec_gol4_decode_key(SubGhzBlockGeneric* instance) static void subghz_protocol_ditec_gol4_encode_key(SubGhzBlockGeneric* instance) { // Encoder crypto part: // - // TODO: Current issue - last bit at original remote sometimes 0 but we encode as 1, or vice versa. - // This does not affect decoding but may have issue on real receiver - // uint8_t decrypted[GOL4_RAW_BYTES]; // Save original button for later use @@ -364,8 +361,9 @@ static void subghz_protocol_ditec_gol4_encode_key(SubGhzBlockGeneric* instance) instance->btn = subghz_protocol_ditec_gol4_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&instance->btn)) + if(subghz_block_generic_global_button_override_get(&instance->btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", instance->btn); + } // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { diff --git a/lib/subghz/protocols/gangqi.c b/lib/subghz/protocols/gangqi.c index f3e9c0daa..14b69df13 100644 --- a/lib/subghz/protocols/gangqi.c +++ b/lib/subghz/protocols/gangqi.c @@ -170,8 +170,9 @@ static void subghz_protocol_encoder_gangqi_get_upload(SubGhzProtocolEncoderGangQ instance->generic.btn = subghz_protocol_gangqi_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) + if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", instance->generic.btn); + } uint16_t serial = (uint16_t)((instance->generic.data >> 18) & 0xFFFF); uint8_t const_and_button = (uint8_t)(0xD0 | instance->generic.btn); diff --git a/lib/subghz/protocols/hay21.c b/lib/subghz/protocols/hay21.c index 19995932c..57d5cacc0 100644 --- a/lib/subghz/protocols/hay21.c +++ b/lib/subghz/protocols/hay21.c @@ -145,8 +145,9 @@ static void subghz_protocol_encoder_hay21_get_upload(SubGhzProtocolEncoderHay21* instance->generic.btn = subghz_protocol_hay21_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) + if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", instance->generic.btn); + } // Counter increment // Check for OFEX (overflow experimental) mode diff --git a/lib/subghz/protocols/hollarm.c b/lib/subghz/protocols/hollarm.c index fade91278..80bfb68dc 100644 --- a/lib/subghz/protocols/hollarm.c +++ b/lib/subghz/protocols/hollarm.c @@ -169,8 +169,9 @@ static void subghz_protocol_encoder_hollarm_get_upload(SubGhzProtocolEncoderHoll instance->generic.btn = subghz_protocol_hollarm_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) + if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", instance->generic.btn); + } uint64_t new_key = (instance->generic.data >> 12) << 12 | (instance->generic.btn << 8); diff --git a/lib/subghz/protocols/jarolift.c b/lib/subghz/protocols/jarolift.c index eae35bb31..5f6994a1a 100644 --- a/lib/subghz/protocols/jarolift.c +++ b/lib/subghz/protocols/jarolift.c @@ -153,8 +153,9 @@ static bool btn = subghz_protocol_jarolift_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&btn)) + if(subghz_block_generic_global_button_override_get(&btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", btn); + } // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index ac04610f9..e512dd3c2 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -198,8 +198,9 @@ static bool subghz_protocol_keeloq_gen_data( } // end gendata part // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&btn)) + if(subghz_block_generic_global_button_override_get(&btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", btn); + } uint32_t fix = (uint32_t)btn << 28 | instance->generic.serial; uint32_t hop = 0; diff --git a/lib/subghz/protocols/kinggates_stylo_4k.c b/lib/subghz/protocols/kinggates_stylo_4k.c index ef2bd5dc8..5dbeeaed7 100644 --- a/lib/subghz/protocols/kinggates_stylo_4k.c +++ b/lib/subghz/protocols/kinggates_stylo_4k.c @@ -155,8 +155,9 @@ static bool subghz_protocol_kinggates_stylo_4k_gen_data( btn = subghz_protocol_kinggates_stylo_4k_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&btn)) + if(subghz_block_generic_global_button_override_get(&btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", btn); + } // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { diff --git a/lib/subghz/protocols/princeton.c b/lib/subghz/protocols/princeton.c index f77e0e722..96bbddd08 100644 --- a/lib/subghz/protocols/princeton.c +++ b/lib/subghz/protocols/princeton.c @@ -258,8 +258,9 @@ static bool instance->generic.btn = subghz_protocol_princeton_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) + if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", instance->generic.btn); + } // Reconstruction of the data // If we have 8bit button code move serial to left by 8 bits (and 4 if 4 bits) diff --git a/lib/subghz/protocols/roger.c b/lib/subghz/protocols/roger.c index 35d80788d..28b6b7a80 100644 --- a/lib/subghz/protocols/roger.c +++ b/lib/subghz/protocols/roger.c @@ -179,8 +179,9 @@ static void subghz_protocol_encoder_roger_get_upload(SubGhzProtocolEncoderRoger* btn = subghz_protocol_roger_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&btn)) + if(subghz_block_generic_global_button_override_get(&btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", btn); + } // If End is not == button - transmit as is, no custom button allowed // For "End" values 23 and 20 - transmit correct ending used for their buttons diff --git a/lib/subghz/protocols/secplus_v2.c b/lib/subghz/protocols/secplus_v2.c index cab5d575f..f78cb1657 100644 --- a/lib/subghz/protocols/secplus_v2.c +++ b/lib/subghz/protocols/secplus_v2.c @@ -396,8 +396,9 @@ static void subghz_protocol_secplus_v2_encode(SubGhzProtocolEncoderSecPlus_v2* i instance->generic.btn = subghz_protocol_secplus_v2_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) + if(subghz_block_generic_global_button_override_get(&instance->generic.btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", instance->generic.btn); + } uint32_t fixed_1[1] = {instance->generic.btn << 12 | instance->generic.serial >> 20}; uint32_t fixed_2[1] = {instance->generic.serial & 0xFFFFF}; diff --git a/lib/subghz/protocols/somfy_keytis.c b/lib/subghz/protocols/somfy_keytis.c index cf03f4b4d..f912dc40a 100644 --- a/lib/subghz/protocols/somfy_keytis.c +++ b/lib/subghz/protocols/somfy_keytis.c @@ -164,8 +164,9 @@ static bool btn = subghz_protocol_somfy_keytis_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&btn)) + if(subghz_block_generic_global_button_override_get(&btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", btn); + } // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index c0b26c945..1ba729d37 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -125,8 +125,9 @@ static bool subghz_protocol_somfy_telis_gen_data( btn = subghz_protocol_somfy_telis_get_btn_code(); // override button if we change it with signal settings button editor - if(subghz_block_generic_global_button_override_get(&btn)) + if(subghz_block_generic_global_button_override_get(&btn)) { FURI_LOG_D(TAG, "Button sucessfully changed to 0x%X", btn); + } // Check for OFEX (overflow experimental) mode if(furi_hal_subghz_get_rolling_counter_mult() != -0x7FFFFFFF) { diff --git a/site_scons/firmwareopts.scons b/site_scons/firmwareopts.scons index 4ef210f89..f91329a9e 100644 --- a/site_scons/firmwareopts.scons +++ b/site_scons/firmwareopts.scons @@ -6,6 +6,7 @@ if ENV["DEBUG"]: CPPDEFINES=[ "FURI_DEBUG", "NDEBUG", + "LOGS_DEBUG_BUILD", ], CCFLAGS=[ "-Og", @@ -16,6 +17,7 @@ elif ENV["COMPACT"]: CPPDEFINES=[ "FURI_NDEBUG", "NDEBUG", + "LOGS_RELEASE_BUILD", ], CCFLAGS=[ "-Os", @@ -26,6 +28,7 @@ else: CPPDEFINES=[ "FURI_NDEBUG", "NDEBUG", + "LOGS_DEBUG_BUILD", ], CCFLAGS=[ "-Os", diff --git a/targets/f7/ble_glue/services/serial_service.c b/targets/f7/ble_glue/services/serial_service.c index 6fe6a7130..7eaf29261 100644 --- a/targets/f7/ble_glue/services/serial_service.c +++ b/targets/f7/ble_glue/services/serial_service.c @@ -103,6 +103,7 @@ static BleEventAckStatus ble_svc_serial_event_handler(void* event, void* context } serial_svc->bytes_ready_to_receive -= MIN( serial_svc->bytes_ready_to_receive, attribute_modified->Attr_Data_Length); +#ifndef LOGS_RELEASE_BUILD SerialServiceEvent event = { .event = SerialServiceEventTypeDataReceived, .data = { @@ -111,6 +112,7 @@ static BleEventAckStatus ble_svc_serial_event_handler(void* event, void* context }}; uint32_t buff_free_size = serial_svc->callback(event, serial_svc->context); FURI_LOG_D(TAG, "Available buff size: %ld", buff_free_size); +#endif furi_check(furi_mutex_release(serial_svc->buff_size_mtx) == FuriStatusOk); } ret = BleEventAckFlowEnable; diff --git a/targets/f7/furi_hal/furi_hal_subghz.c b/targets/f7/furi_hal/furi_hal_subghz.c index b23b2ea75..0b352f4ce 100644 --- a/targets/f7/furi_hal/furi_hal_subghz.c +++ b/targets/f7/furi_hal/furi_hal_subghz.c @@ -899,6 +899,7 @@ void furi_hal_subghz_stop_async_tx(void) { free(furi_hal_subghz_async_tx.buffer); +#ifndef LOGS_RELEASE_BUILD float duty_cycle = 100.0f * (float)furi_hal_subghz_async_tx.duty_high / ((float)furi_hal_subghz_async_tx.duty_low + (float)furi_hal_subghz_async_tx.duty_high); @@ -908,6 +909,7 @@ void furi_hal_subghz_stop_async_tx(void) { (double)furi_hal_subghz_async_tx.duty_high, (double)furi_hal_subghz_async_tx.duty_low, (double)duty_cycle); +#endif furi_hal_subghz.state = SubGhzStateIdle; }