From 80158e84a21aabb42f4e3926718636333b7871cd Mon Sep 17 00:00:00 2001 From: Dmitry422 Date: Thu, 5 Feb 2026 18:04:42 +0700 Subject: [PATCH] subgh rpc refactor to "one click send signal" --- .../main/subghz/scenes/subghz_scene_rpc.c | 102 +++++++++++------- 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index b262679a4..bb6b29fc7 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -1,6 +1,9 @@ #include "../subghz_i.h" #include +#include +//#include +#include "applications/main/subghz/helpers/subghz_txrx_i.h" typedef enum { SubGhzRpcStateIdle, @@ -52,9 +55,13 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubGhzCustomEventSceneRpcButtonPress) { bool result = false; if(state == SubGhzRpcStateLoaded) { + // START endless TX until user release button + // variable used in protocol yield for endless TX + subghz_block_generic_global.endless_tx = true; switch( subghz_txrx_tx_start(subghz->txrx, subghz_txrx_get_fff_data(subghz->txrx))) { case SubGhzTxRxStartTxStateErrorOnlyRx: + subghz_block_generic_global.endless_tx = false; rpc_system_app_set_error_code( subghz->rpc_ctx, RpcAppSystemErrorCodeRegionLock); rpc_system_app_set_error_text( @@ -62,6 +69,7 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { "Transmission on this frequency is restricted in your settings"); break; case SubGhzTxRxStartTxStateErrorParserOthers: + subghz_block_generic_global.endless_tx = false; rpc_system_app_set_error_code( subghz->rpc_ctx, RpcAppSystemErrorCodeInternalParse); rpc_system_app_set_error_text( @@ -80,50 +88,53 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubGhzCustomEventSceneRpcButtonRelease) { bool result = false; if(state == SubGhzRpcStateTx) { - subghz_txrx_stop(subghz->txrx); - subghz_blink_stop(subghz); + // user release button + // set endless TX to OFF and switch off TX in section event.type == SceneManagerEventTypeTick + subghz_block_generic_global.endless_tx = false; result = true; } - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); + // scene_manager_set_scene_state( + // subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); rpc_system_app_confirm(subghz->rpc_ctx, result); - } else if(event.event == SubGhzCustomEventSceneRpcButtonPressRelease) { - bool result = false; - if(state == SubGhzRpcStateLoaded) { - switch( - subghz_txrx_tx_start(subghz->txrx, subghz_txrx_get_fff_data(subghz->txrx))) { - case SubGhzTxRxStartTxStateErrorOnlyRx: - rpc_system_app_set_error_code( - subghz->rpc_ctx, RpcAppSystemErrorCodeRegionLock); - rpc_system_app_set_error_text( - subghz->rpc_ctx, - "Transmission on this frequency is restricted in your region"); - break; - case SubGhzTxRxStartTxStateErrorParserOthers: - rpc_system_app_set_error_code( - subghz->rpc_ctx, RpcAppSystemErrorCodeInternalParse); - rpc_system_app_set_error_text( - subghz->rpc_ctx, "Error in protocol parameters description"); - break; - default: //if(SubGhzTxRxStartTxStateOk) - result = true; - subghz_blink_start(subghz); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateTx); - break; - } - } + // USELESS PART + // } else if(event.event == SubGhzCustomEventSceneRpcButtonPressRelease) { + // bool result = false; + // if(state == SubGhzRpcStateLoaded) { + // switch( + // subghz_txrx_tx_start(subghz->txrx, subghz_txrx_get_fff_data(subghz->txrx))) { + // case SubGhzTxRxStartTxStateErrorOnlyRx: + // rpc_system_app_set_error_code( + // subghz->rpc_ctx, RpcAppSystemErrorCodeRegionLock); + // rpc_system_app_set_error_text( + // subghz->rpc_ctx, + // "Transmission on this frequency is restricted in your region"); + // break; + // case SubGhzTxRxStartTxStateErrorParserOthers: + // rpc_system_app_set_error_code( + // subghz->rpc_ctx, RpcAppSystemErrorCodeInternalParse); + // rpc_system_app_set_error_text( + // subghz->rpc_ctx, "Error in protocol parameters description"); + // break; - // Stop transmission - if(state == SubGhzRpcStateTx) { - subghz_txrx_stop(subghz->txrx); - subghz_blink_stop(subghz); - result = true; - } - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); - rpc_system_app_confirm(subghz->rpc_ctx, result); + // default: //if(SubGhzTxRxStartTxStateOk) + // result = true; + // subghz_blink_start(subghz); + // scene_manager_set_scene_state( + // subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateTx); + // break; + // } + // } + + // // Stop transmission + // if(state == SubGhzRpcStateTx) { + // subghz_txrx_stop(subghz->txrx); + // subghz_blink_stop(subghz); + // result = true; + // } + // scene_manager_set_scene_state( + // subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); + // rpc_system_app_confirm(subghz->rpc_ctx, result); } else if(event.event == SubGhzCustomEventSceneRpcLoad) { bool result = false; if(state == SubGhzRpcStateIdle) { @@ -139,6 +150,19 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { } rpc_system_app_confirm(subghz->rpc_ctx, result); } + } else if(event.type == SceneManagerEventTypeTick) { + // if hardware TX finished then stop TX correctly + if(subghz_devices_is_async_complete_tx(subghz->txrx->radio_device)) { + bool result = false; + if(state == SubGhzRpcStateTx) { + subghz_txrx_stop(subghz->txrx); + subghz_blink_stop(subghz); + result = true; + } + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); + rpc_system_app_confirm(subghz->rpc_ctx, result); + } } return consumed; }