[FL-2589] RPC App control commands (#1350)
* RPC App control commands * Button release timeout * SubGhz tx fix Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		| @@ -22,3 +22,4 @@ ADD_SCENE(subghz, read_raw, ReadRAW) | ||||
| ADD_SCENE(subghz, more_raw, MoreRAW) | ||||
| ADD_SCENE(subghz, delete_raw, DeleteRAW) | ||||
| ADD_SCENE(subghz, need_saving, NeedSaving) | ||||
| ADD_SCENE(subghz, rpc, Rpc) | ||||
|   | ||||
							
								
								
									
										34
									
								
								applications/subghz/scenes/subghz_scene_rpc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								applications/subghz/scenes/subghz_scene_rpc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #include "../subghz_i.h" | ||||
|  | ||||
| void subghz_scene_rpc_on_enter(void* context) { | ||||
|     SubGhz* subghz = context; | ||||
|     Widget* widget = subghz->widget; | ||||
|  | ||||
|     widget_add_text_box_element( | ||||
|         widget, 0, 0, 128, 28, AlignCenter, AlignCenter, "RPC mode", false); | ||||
|  | ||||
|     notification_message(subghz->notifications, &sequence_display_backlight_on); | ||||
|  | ||||
|     view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdWidget); | ||||
| } | ||||
|  | ||||
| bool subghz_scene_rpc_on_event(void* context, SceneManagerEvent event) { | ||||
|     SubGhz* subghz = context; | ||||
|     bool consumed = false; | ||||
|  | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         consumed = true; | ||||
|         if(event.event == SubGhzCustomEventSceneExit) { | ||||
|             view_dispatcher_stop(subghz->view_dispatcher); | ||||
|         } | ||||
|     } | ||||
|     return consumed; | ||||
| } | ||||
|  | ||||
| void subghz_scene_rpc_on_exit(void* context) { | ||||
|     SubGhz* subghz = context; | ||||
|  | ||||
|     //subghz_rpc_exit_callback(subghz); | ||||
|  | ||||
|     widget_reset(subghz->widget); | ||||
| } | ||||
| @@ -23,6 +23,54 @@ void subghz_tick_event_callback(void* context) { | ||||
|     scene_manager_handle_tick_event(subghz->scene_manager); | ||||
| } | ||||
|  | ||||
| static bool subghz_rpc_command_callback(RpcAppSystemEvent event, const char* arg, void* context) { | ||||
|     furi_assert(context); | ||||
|     SubGhz* subghz = context; | ||||
|  | ||||
|     if(!subghz->rpc_ctx) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     bool result = false; | ||||
|  | ||||
|     if(event == RpcAppEventSessionClose) { | ||||
|         rpc_system_app_set_callback(subghz->rpc_ctx, NULL, NULL); | ||||
|         subghz->rpc_ctx = NULL; | ||||
|         view_dispatcher_send_custom_event(subghz->view_dispatcher, SubGhzCustomEventSceneExit); | ||||
|         if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) { | ||||
|             subghz_tx_stop(subghz); | ||||
|             subghz_sleep(subghz); | ||||
|         } | ||||
|         result = true; | ||||
|     } else if(event == RpcAppEventAppExit) { | ||||
|         view_dispatcher_send_custom_event(subghz->view_dispatcher, SubGhzCustomEventSceneExit); | ||||
|         if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) { | ||||
|             subghz_tx_stop(subghz); | ||||
|             subghz_sleep(subghz); | ||||
|         } | ||||
|         result = true; | ||||
|     } else if(event == RpcAppEventLoadFile) { | ||||
|         if(arg) { | ||||
|             if(subghz_key_load(subghz, arg, false)) { | ||||
|                 string_set_str(subghz->file_path, arg); | ||||
|                 result = true; | ||||
|             } | ||||
|         } | ||||
|     } else if(event == RpcAppEventButtonPress) { | ||||
|         if(subghz->txrx->txrx_state == SubGhzTxRxStateSleep) { | ||||
|             result = subghz_tx_start(subghz, subghz->txrx->fff_data); | ||||
|         } | ||||
|     } else if(event == RpcAppEventButtonRelease) { | ||||
|         if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) { | ||||
|             subghz_tx_stop(subghz); | ||||
|             subghz_sleep(subghz); | ||||
|             result = true; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| SubGhz* subghz_alloc() { | ||||
|     SubGhz* subghz = malloc(sizeof(SubGhz)); | ||||
|  | ||||
| @@ -168,6 +216,11 @@ SubGhz* subghz_alloc() { | ||||
| void subghz_free(SubGhz* subghz) { | ||||
|     furi_assert(subghz); | ||||
|  | ||||
|     if(subghz->rpc_ctx) { | ||||
|         rpc_system_app_set_callback(subghz->rpc_ctx, NULL, NULL); | ||||
|         subghz->rpc_ctx = NULL; | ||||
|     } | ||||
|  | ||||
|     // Packet Test | ||||
|     view_dispatcher_remove_view(subghz->view_dispatcher, SubGhzViewIdTestPacket); | ||||
|     subghz_test_packet_free(subghz->subghz_test_packet); | ||||
| @@ -265,7 +318,12 @@ int32_t subghz_app(void* p) { | ||||
|         subghz->txrx->environment, "/ext/subghz/assets/keeloq_mfcodes_user"); | ||||
|     // Check argument and run corresponding scene | ||||
|     if(p) { | ||||
|         if(subghz_key_load(subghz, p)) { | ||||
|         uint32_t rpc_ctx = 0; | ||||
|         if(sscanf(p, "RPC %lX", &rpc_ctx) == 1) { | ||||
|             subghz->rpc_ctx = (void*)rpc_ctx; | ||||
|             rpc_system_app_set_callback(subghz->rpc_ctx, subghz_rpc_command_callback, subghz); | ||||
|             scene_manager_next_scene(subghz->scene_manager, SubGhzSceneRpc); | ||||
|         } else if(subghz_key_load(subghz, p, true)) { | ||||
|             string_set_str(subghz->file_path, p); | ||||
|  | ||||
|             if((!strcmp(subghz->txrx->decoder_result->protocol->name, "RAW"))) { | ||||
|   | ||||
| @@ -218,7 +218,7 @@ void subghz_dialog_message_show_only_rx(SubGhz* subghz) { | ||||
|     dialog_message_free(message); | ||||
| } | ||||
|  | ||||
| bool subghz_key_load(SubGhz* subghz, const char* file_path) { | ||||
| bool subghz_key_load(SubGhz* subghz, const char* file_path, bool show_dialog) { | ||||
|     furi_assert(subghz); | ||||
|     furi_assert(file_path); | ||||
|  | ||||
| @@ -308,11 +308,15 @@ bool subghz_key_load(SubGhz* subghz, const char* file_path) { | ||||
|  | ||||
|     switch(load_key_state) { | ||||
|     case SubGhzLoadKeyStateParseErr: | ||||
|         dialog_message_show_storage_error(subghz->dialogs, "Cannot parse\nfile"); | ||||
|         if(show_dialog) { | ||||
|             dialog_message_show_storage_error(subghz->dialogs, "Cannot parse\nfile"); | ||||
|         } | ||||
|         return false; | ||||
|  | ||||
|     case SubGhzLoadKeyStateOnlyRx: | ||||
|         subghz_dialog_message_show_only_rx(subghz); | ||||
|         if(show_dialog) { | ||||
|             subghz_dialog_message_show_only_rx(subghz); | ||||
|         } | ||||
|         return false; | ||||
|  | ||||
|     case SubGhzLoadKeyStateOK: | ||||
| @@ -427,7 +431,7 @@ bool subghz_load_protocol_from_file(SubGhz* subghz) { | ||||
|         true); | ||||
|  | ||||
|     if(res) { | ||||
|         res = subghz_key_load(subghz, string_get_cstr(subghz->file_path)); | ||||
|         res = subghz_key_load(subghz, string_get_cstr(subghz->file_path), true); | ||||
|     } | ||||
|  | ||||
|     string_clear(file_path); | ||||
|   | ||||
| @@ -36,6 +36,8 @@ | ||||
| #include <gui/modules/variable_item_list.h> | ||||
| #include <lib/toolbox/path.h> | ||||
|  | ||||
| #include "rpc/rpc_app.h" | ||||
|  | ||||
| #define SUBGHZ_MAX_LEN_NAME 64 | ||||
|  | ||||
| struct SubGhzTxRx { | ||||
| @@ -91,6 +93,8 @@ struct SubGhz { | ||||
|     string_t error_str; | ||||
|     SubGhzSetting* setting; | ||||
|     SubGhzLock lock; | ||||
|  | ||||
|     void* rpc_ctx; | ||||
| }; | ||||
|  | ||||
| bool subghz_set_preset(SubGhz* subghz, const char* preset); | ||||
| @@ -102,7 +106,7 @@ void subghz_sleep(SubGhz* subghz); | ||||
| bool subghz_tx_start(SubGhz* subghz, FlipperFormat* flipper_format); | ||||
| void subghz_tx_stop(SubGhz* subghz); | ||||
| void subghz_dialog_message_show_only_rx(SubGhz* subghz); | ||||
| bool subghz_key_load(SubGhz* subghz, const char* file_path); | ||||
| bool subghz_key_load(SubGhz* subghz, const char* file_path, bool show_dialog); | ||||
| bool subghz_get_next_name_file(SubGhz* subghz, uint8_t max_len); | ||||
| bool subghz_save_protocol_to_file( | ||||
|     SubGhz* subghz, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user