Merge pull request #958 from Dmitry422/dev

subghz rpc refactor to "send signal by one click"
This commit is contained in:
MMX
2026-02-05 14:17:05 +03:00
committed by GitHub

View File

@@ -1,6 +1,8 @@
#include "../subghz_i.h"
#include <lib/subghz/blocks/custom_btn.h>
#include <lib/subghz/blocks/generic.h>
#include "applications/main/subghz/helpers/subghz_txrx_i.h"
typedef enum {
SubGhzRpcStateIdle,
@@ -52,9 +54,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 +68,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 +87,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 +149,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;
}