subgh rpc refactor to "one click send signal"

This commit is contained in:
Dmitry422
2026-02-05 18:04:42 +07:00
parent 97eaee54c8
commit 80158e84a2

View File

@@ -1,6 +1,9 @@
#include "../subghz_i.h" #include "../subghz_i.h"
#include <lib/subghz/blocks/custom_btn.h> #include <lib/subghz/blocks/custom_btn.h>
#include <lib/subghz/blocks/generic.h>
//#include <lib/subghz/devices/devices.c>
#include "applications/main/subghz/helpers/subghz_txrx_i.h"
typedef enum { typedef enum {
SubGhzRpcStateIdle, SubGhzRpcStateIdle,
@@ -52,9 +55,13 @@ bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) {
} else if(event.event == SubGhzCustomEventSceneRpcButtonPress) { } else if(event.event == SubGhzCustomEventSceneRpcButtonPress) {
bool result = false; bool result = false;
if(state == SubGhzRpcStateLoaded) { 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( switch(
subghz_txrx_tx_start(subghz->txrx, subghz_txrx_get_fff_data(subghz->txrx))) { subghz_txrx_tx_start(subghz->txrx, subghz_txrx_get_fff_data(subghz->txrx))) {
case SubGhzTxRxStartTxStateErrorOnlyRx: case SubGhzTxRxStartTxStateErrorOnlyRx:
subghz_block_generic_global.endless_tx = false;
rpc_system_app_set_error_code( rpc_system_app_set_error_code(
subghz->rpc_ctx, RpcAppSystemErrorCodeRegionLock); subghz->rpc_ctx, RpcAppSystemErrorCodeRegionLock);
rpc_system_app_set_error_text( 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"); "Transmission on this frequency is restricted in your settings");
break; break;
case SubGhzTxRxStartTxStateErrorParserOthers: case SubGhzTxRxStartTxStateErrorParserOthers:
subghz_block_generic_global.endless_tx = false;
rpc_system_app_set_error_code( rpc_system_app_set_error_code(
subghz->rpc_ctx, RpcAppSystemErrorCodeInternalParse); subghz->rpc_ctx, RpcAppSystemErrorCodeInternalParse);
rpc_system_app_set_error_text( 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) { } else if(event.event == SubGhzCustomEventSceneRpcButtonRelease) {
bool result = false; bool result = false;
if(state == SubGhzRpcStateTx) { if(state == SubGhzRpcStateTx) {
subghz_txrx_stop(subghz->txrx); // user release button
subghz_blink_stop(subghz); // set endless TX to OFF and switch off TX in section event.type == SceneManagerEventTypeTick
subghz_block_generic_global.endless_tx = false;
result = true; result = true;
} }
scene_manager_set_scene_state( // scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); // subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle);
rpc_system_app_confirm(subghz->rpc_ctx, result); 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) // USELESS PART
result = true; // } else if(event.event == SubGhzCustomEventSceneRpcButtonPressRelease) {
subghz_blink_start(subghz); // bool result = false;
scene_manager_set_scene_state( // if(state == SubGhzRpcStateLoaded) {
subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateTx); // switch(
break; // 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 // default: //if(SubGhzTxRxStartTxStateOk)
if(state == SubGhzRpcStateTx) { // result = true;
subghz_txrx_stop(subghz->txrx); // subghz_blink_start(subghz);
subghz_blink_stop(subghz); // scene_manager_set_scene_state(
result = true; // subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateTx);
} // break;
scene_manager_set_scene_state( // }
subghz->scene_manager, SubGhzSceneRpc, SubGhzRpcStateIdle); // }
rpc_system_app_confirm(subghz->rpc_ctx, result);
// // 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) { } else if(event.event == SubGhzCustomEventSceneRpcLoad) {
bool result = false; bool result = false;
if(state == SubGhzRpcStateIdle) { 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); 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; return consumed;
} }