[FL-2927] SubGhz: add RAW Read threshold rssi (#1911)
* SubGhz: add RAW Read threshold rssi * SubGhz: update indicator RSSI * SubGhz: fix record file Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									378bf05068
								
							
						
					
					
						commit
						5c8df66b7c
					
				@ -6,6 +6,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define RAW_FILE_NAME "Raw_signal_"
 | 
					#define RAW_FILE_NAME "Raw_signal_"
 | 
				
			||||||
#define TAG "SubGhzSceneReadRAW"
 | 
					#define TAG "SubGhzSceneReadRAW"
 | 
				
			||||||
 | 
					#define RAW_THRESHOLD_RSSI_LOW_COUNT 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool subghz_scene_read_raw_update_filename(SubGhz* subghz) {
 | 
					bool subghz_scene_read_raw_update_filename(SubGhz* subghz) {
 | 
				
			||||||
    bool ret = false;
 | 
					    bool ret = false;
 | 
				
			||||||
@ -72,24 +73,33 @@ void subghz_scene_read_raw_on_enter(void* context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    switch(subghz->txrx->rx_key_state) {
 | 
					    switch(subghz->txrx->rx_key_state) {
 | 
				
			||||||
    case SubGhzRxKeyStateBack:
 | 
					    case SubGhzRxKeyStateBack:
 | 
				
			||||||
        subghz_read_raw_set_status(subghz->subghz_read_raw, SubGhzReadRAWStatusIDLE, "");
 | 
					        subghz_read_raw_set_status(
 | 
				
			||||||
 | 
					            subghz->subghz_read_raw, SubGhzReadRAWStatusIDLE, "", subghz->txrx->raw_threshold_rssi);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case SubGhzRxKeyStateRAWLoad:
 | 
					    case SubGhzRxKeyStateRAWLoad:
 | 
				
			||||||
        path_extract_filename(subghz->file_path, file_name, true);
 | 
					        path_extract_filename(subghz->file_path, file_name, true);
 | 
				
			||||||
        subghz_read_raw_set_status(
 | 
					        subghz_read_raw_set_status(
 | 
				
			||||||
            subghz->subghz_read_raw,
 | 
					            subghz->subghz_read_raw,
 | 
				
			||||||
            SubGhzReadRAWStatusLoadKeyTX,
 | 
					            SubGhzReadRAWStatusLoadKeyTX,
 | 
				
			||||||
            furi_string_get_cstr(file_name));
 | 
					            furi_string_get_cstr(file_name),
 | 
				
			||||||
 | 
					            subghz->txrx->raw_threshold_rssi);
 | 
				
			||||||
        subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
					        subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case SubGhzRxKeyStateRAWSave:
 | 
					    case SubGhzRxKeyStateRAWSave:
 | 
				
			||||||
        path_extract_filename(subghz->file_path, file_name, true);
 | 
					        path_extract_filename(subghz->file_path, file_name, true);
 | 
				
			||||||
        subghz_read_raw_set_status(
 | 
					        subghz_read_raw_set_status(
 | 
				
			||||||
            subghz->subghz_read_raw, SubGhzReadRAWStatusSaveKey, furi_string_get_cstr(file_name));
 | 
					            subghz->subghz_read_raw,
 | 
				
			||||||
 | 
					            SubGhzReadRAWStatusSaveKey,
 | 
				
			||||||
 | 
					            furi_string_get_cstr(file_name),
 | 
				
			||||||
 | 
					            subghz->txrx->raw_threshold_rssi);
 | 
				
			||||||
        subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
					        subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        subghz_read_raw_set_status(subghz->subghz_read_raw, SubGhzReadRAWStatusStart, "");
 | 
					        subghz_read_raw_set_status(
 | 
				
			||||||
 | 
					            subghz->subghz_read_raw,
 | 
				
			||||||
 | 
					            SubGhzReadRAWStatusStart,
 | 
				
			||||||
 | 
					            "",
 | 
				
			||||||
 | 
					            subghz->txrx->raw_threshold_rssi);
 | 
				
			||||||
        subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
					        subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -273,7 +283,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
 | 
				
			|||||||
            if(subghz->txrx->rx_key_state != SubGhzRxKeyStateIDLE) {
 | 
					            if(subghz->txrx->rx_key_state != SubGhzRxKeyStateIDLE) {
 | 
				
			||||||
                scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
 | 
					                scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                //subghz_get_preset_name(subghz, subghz->error_str);
 | 
					                subghz->txrx->raw_threshold_rssi_low_count = RAW_THRESHOLD_RSSI_LOW_COUNT;
 | 
				
			||||||
                if(subghz_protocol_raw_save_to_file_init(
 | 
					                if(subghz_protocol_raw_save_to_file_init(
 | 
				
			||||||
                       (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result,
 | 
					                       (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result,
 | 
				
			||||||
                       RAW_FILE_NAME,
 | 
					                       RAW_FILE_NAME,
 | 
				
			||||||
@ -319,7 +329,35 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
 | 
				
			|||||||
                subghz->subghz_read_raw,
 | 
					                subghz->subghz_read_raw,
 | 
				
			||||||
                subghz_protocol_raw_get_sample_write(
 | 
					                subghz_protocol_raw_get_sample_write(
 | 
				
			||||||
                    (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result));
 | 
					                    (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result));
 | 
				
			||||||
            subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, furi_hal_subghz_get_rssi());
 | 
					
 | 
				
			||||||
 | 
					            float rssi = furi_hal_subghz_get_rssi();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(subghz->txrx->raw_threshold_rssi == SUBGHZ_RAW_TRESHOLD_MIN) {
 | 
				
			||||||
 | 
					                subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, rssi, true);
 | 
				
			||||||
 | 
					                subghz_protocol_raw_save_to_file_pause(
 | 
				
			||||||
 | 
					                    (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result, false);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                if(rssi < subghz->txrx->raw_threshold_rssi) {
 | 
				
			||||||
 | 
					                    subghz->txrx->raw_threshold_rssi_low_count++;
 | 
				
			||||||
 | 
					                    if(subghz->txrx->raw_threshold_rssi_low_count > RAW_THRESHOLD_RSSI_LOW_COUNT) {
 | 
				
			||||||
 | 
					                        subghz->txrx->raw_threshold_rssi_low_count = RAW_THRESHOLD_RSSI_LOW_COUNT;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, rssi, false);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    subghz->txrx->raw_threshold_rssi_low_count = 0;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if(subghz->txrx->raw_threshold_rssi_low_count == RAW_THRESHOLD_RSSI_LOW_COUNT) {
 | 
				
			||||||
 | 
					                    subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, rssi, false);
 | 
				
			||||||
 | 
					                    subghz_protocol_raw_save_to_file_pause(
 | 
				
			||||||
 | 
					                        (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result, true);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    subghz_read_raw_add_data_rssi(subghz->subghz_read_raw, rssi, true);
 | 
				
			||||||
 | 
					                    subghz_protocol_raw_save_to_file_pause(
 | 
				
			||||||
 | 
					                        (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result, false);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case SubGhzNotificationStateTx:
 | 
					        case SubGhzNotificationStateTx:
 | 
				
			||||||
            notification_message(subghz->notifications, &sequence_blink_magenta_10);
 | 
					            notification_message(subghz->notifications, &sequence_blink_magenta_10);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,41 @@
 | 
				
			|||||||
#include "../subghz_i.h"
 | 
					#include "../subghz_i.h"
 | 
				
			||||||
 | 
					#include <lib/toolbox/value_index.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum SubGhzSettingIndex {
 | 
					enum SubGhzSettingIndex {
 | 
				
			||||||
    SubGhzSettingIndexFrequency,
 | 
					    SubGhzSettingIndexFrequency,
 | 
				
			||||||
    SubGhzSettingIndexHopping,
 | 
					    SubGhzSettingIndexHopping,
 | 
				
			||||||
    SubGhzSettingIndexModulation,
 | 
					    SubGhzSettingIndexModulation,
 | 
				
			||||||
    SubGhzSettingIndexLock,
 | 
					    SubGhzSettingIndexLock,
 | 
				
			||||||
 | 
					    SubGhzSettingIndexRAWThesholdRSSI,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RAW_THRESHOLD_RSSI_COUNT 11
 | 
				
			||||||
 | 
					const char* const raw_theshold_rssi_text[RAW_THRESHOLD_RSSI_COUNT] = {
 | 
				
			||||||
 | 
					    "-----",
 | 
				
			||||||
 | 
					    "-85.0",
 | 
				
			||||||
 | 
					    "-80.0",
 | 
				
			||||||
 | 
					    "-75.0",
 | 
				
			||||||
 | 
					    "-70.0",
 | 
				
			||||||
 | 
					    "-65.0",
 | 
				
			||||||
 | 
					    "-60.0",
 | 
				
			||||||
 | 
					    "-55.0",
 | 
				
			||||||
 | 
					    "-50.0",
 | 
				
			||||||
 | 
					    "-45.0",
 | 
				
			||||||
 | 
					    "-40.0",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					const float raw_theshold_rssi_value[RAW_THRESHOLD_RSSI_COUNT] = {
 | 
				
			||||||
 | 
					    -90.0f,
 | 
				
			||||||
 | 
					    -85.0f,
 | 
				
			||||||
 | 
					    -80.0f,
 | 
				
			||||||
 | 
					    -75.0f,
 | 
				
			||||||
 | 
					    -70.0f,
 | 
				
			||||||
 | 
					    -65.0f,
 | 
				
			||||||
 | 
					    -60.0f,
 | 
				
			||||||
 | 
					    -55.0f,
 | 
				
			||||||
 | 
					    -50.0f,
 | 
				
			||||||
 | 
					    -45.0f,
 | 
				
			||||||
 | 
					    -40.0f,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOPPING_COUNT 2
 | 
					#define HOPPING_COUNT 2
 | 
				
			||||||
@ -136,6 +167,14 @@ static void subghz_scene_receiver_config_set_hopping_running(VariableItem* item)
 | 
				
			|||||||
    subghz->txrx->hopper_state = hopping_value[index];
 | 
					    subghz->txrx->hopper_state = hopping_value[index];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void subghz_scene_receiver_config_set_raw_threshold_rssi(VariableItem* item) {
 | 
				
			||||||
 | 
					    SubGhz* subghz = variable_item_get_context(item);
 | 
				
			||||||
 | 
					    uint8_t index = variable_item_get_current_value_index(item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    variable_item_set_current_value_text(item, raw_theshold_rssi_text[index]);
 | 
				
			||||||
 | 
					    subghz->txrx->raw_threshold_rssi = raw_theshold_rssi_value[index];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) {
 | 
					static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) {
 | 
				
			||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
    SubGhz* subghz = context;
 | 
					    SubGhz* subghz = context;
 | 
				
			||||||
@ -204,6 +243,19 @@ void subghz_scene_receiver_config_on_enter(void* context) {
 | 
				
			|||||||
            subghz_scene_receiver_config_var_list_enter_callback,
 | 
					            subghz_scene_receiver_config_var_list_enter_callback,
 | 
				
			||||||
            subghz);
 | 
					            subghz);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) ==
 | 
				
			||||||
 | 
					       SubGhzCustomEventManagerSet) {
 | 
				
			||||||
 | 
					        item = variable_item_list_add(
 | 
				
			||||||
 | 
					            subghz->variable_item_list,
 | 
				
			||||||
 | 
					            "RSSI Threshold:",
 | 
				
			||||||
 | 
					            RAW_THRESHOLD_RSSI_COUNT,
 | 
				
			||||||
 | 
					            subghz_scene_receiver_config_set_raw_threshold_rssi,
 | 
				
			||||||
 | 
					            subghz);
 | 
				
			||||||
 | 
					        value_index = value_index_float(
 | 
				
			||||||
 | 
					            subghz->txrx->raw_threshold_rssi, raw_theshold_rssi_value, RAW_THRESHOLD_RSSI_COUNT);
 | 
				
			||||||
 | 
					        variable_item_set_current_value_index(item, value_index);
 | 
				
			||||||
 | 
					        variable_item_set_current_value_text(item, raw_theshold_rssi_text[value_index]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList);
 | 
					    view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -178,6 +178,7 @@ SubGhz* subghz_alloc() {
 | 
				
			|||||||
    subghz->txrx->txrx_state = SubGhzTxRxStateSleep;
 | 
					    subghz->txrx->txrx_state = SubGhzTxRxStateSleep;
 | 
				
			||||||
    subghz->txrx->hopper_state = SubGhzHopperStateOFF;
 | 
					    subghz->txrx->hopper_state = SubGhzHopperStateOFF;
 | 
				
			||||||
    subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
					    subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
 | 
				
			||||||
 | 
					    subghz->txrx->raw_threshold_rssi = SUBGHZ_RAW_TRESHOLD_MIN;
 | 
				
			||||||
    subghz->txrx->history = subghz_history_alloc();
 | 
					    subghz->txrx->history = subghz_history_alloc();
 | 
				
			||||||
    subghz->txrx->worker = subghz_worker_alloc();
 | 
					    subghz->txrx->worker = subghz_worker_alloc();
 | 
				
			||||||
    subghz->txrx->fff_data = flipper_format_string_alloc();
 | 
					    subghz->txrx->fff_data = flipper_format_string_alloc();
 | 
				
			||||||
 | 
				
			|||||||
@ -54,6 +54,9 @@ struct SubGhzTxRx {
 | 
				
			|||||||
    uint8_t hopper_timeout;
 | 
					    uint8_t hopper_timeout;
 | 
				
			||||||
    uint8_t hopper_idx_frequency;
 | 
					    uint8_t hopper_idx_frequency;
 | 
				
			||||||
    SubGhzRxKeyState rx_key_state;
 | 
					    SubGhzRxKeyState rx_key_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float raw_threshold_rssi;
 | 
				
			||||||
 | 
					    uint8_t raw_threshold_rssi_low_count;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SubGhzTxRx SubGhzTxRx;
 | 
					typedef struct SubGhzTxRx SubGhzTxRx;
 | 
				
			||||||
 | 
				
			|||||||
@ -23,10 +23,12 @@ typedef struct {
 | 
				
			|||||||
    FuriString* sample_write;
 | 
					    FuriString* sample_write;
 | 
				
			||||||
    FuriString* file_name;
 | 
					    FuriString* file_name;
 | 
				
			||||||
    uint8_t* rssi_history;
 | 
					    uint8_t* rssi_history;
 | 
				
			||||||
 | 
					    uint8_t rssi_curret;
 | 
				
			||||||
    bool rssi_history_end;
 | 
					    bool rssi_history_end;
 | 
				
			||||||
    uint8_t ind_write;
 | 
					    uint8_t ind_write;
 | 
				
			||||||
    uint8_t ind_sin;
 | 
					    uint8_t ind_sin;
 | 
				
			||||||
    SubGhzReadRAWStatus status;
 | 
					    SubGhzReadRAWStatus status;
 | 
				
			||||||
 | 
					    float raw_threshold_rssi;
 | 
				
			||||||
} SubGhzReadRAWModel;
 | 
					} SubGhzReadRAWModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void subghz_read_raw_set_callback(
 | 
					void subghz_read_raw_set_callback(
 | 
				
			||||||
@ -54,21 +56,27 @@ void subghz_read_raw_add_data_statusbar(
 | 
				
			|||||||
        true);
 | 
					        true);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void subghz_read_raw_add_data_rssi(SubGhzReadRAW* instance, float rssi) {
 | 
					void subghz_read_raw_add_data_rssi(SubGhzReadRAW* instance, float rssi, bool trace) {
 | 
				
			||||||
    furi_assert(instance);
 | 
					    furi_assert(instance);
 | 
				
			||||||
    uint8_t u_rssi = 0;
 | 
					    uint8_t u_rssi = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(rssi < -90) {
 | 
					    if(rssi < SUBGHZ_RAW_TRESHOLD_MIN) {
 | 
				
			||||||
        u_rssi = 0;
 | 
					        u_rssi = 0;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        u_rssi = (uint8_t)((rssi + 90) / 2.7);
 | 
					        u_rssi = (uint8_t)((rssi - SUBGHZ_RAW_TRESHOLD_MIN) / 2.7);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with_view_model(
 | 
					    with_view_model(
 | 
				
			||||||
        instance->view,
 | 
					        instance->view,
 | 
				
			||||||
        SubGhzReadRAWModel * model,
 | 
					        SubGhzReadRAWModel * model,
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            model->rssi_curret = u_rssi;
 | 
				
			||||||
 | 
					            if(trace) {
 | 
				
			||||||
                model->rssi_history[model->ind_write++] = u_rssi;
 | 
					                model->rssi_history[model->ind_write++] = u_rssi;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                model->rssi_history[model->ind_write] = u_rssi;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(model->ind_write > SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE) {
 | 
					            if(model->ind_write > SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE) {
 | 
				
			||||||
                model->rssi_history_end = true;
 | 
					                model->rssi_history_end = true;
 | 
				
			||||||
                model->ind_write = 0;
 | 
					                model->ind_write = 0;
 | 
				
			||||||
@ -187,24 +195,53 @@ void subghz_read_raw_draw_scale(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
				
			|||||||
void subghz_read_raw_draw_rssi(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
					void subghz_read_raw_draw_rssi(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
				
			||||||
    int ind = 0;
 | 
					    int ind = 0;
 | 
				
			||||||
    int base = 0;
 | 
					    int base = 0;
 | 
				
			||||||
 | 
					    uint8_t width = 2;
 | 
				
			||||||
    if(model->rssi_history_end == false) {
 | 
					    if(model->rssi_history_end == false) {
 | 
				
			||||||
        for(int i = model->ind_write; i >= 0; i--) {
 | 
					        for(int i = model->ind_write; i >= 0; i--) {
 | 
				
			||||||
            canvas_draw_line(canvas, i, 47, i, 47 - model->rssi_history[i]);
 | 
					            canvas_draw_line(canvas, i, 47, i, 47 - model->rssi_history[i]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        canvas_draw_line(
 | 
				
			||||||
 | 
					            canvas, model->ind_write + 1, 47, model->ind_write + 1, 47 - model->rssi_curret);
 | 
				
			||||||
        if(model->ind_write > 3) {
 | 
					        if(model->ind_write > 3) {
 | 
				
			||||||
            canvas_draw_line(canvas, model->ind_write, 47, model->ind_write, 13);
 | 
					            canvas_draw_line(
 | 
				
			||||||
 | 
					                canvas, model->ind_write - 1, 47, model->ind_write - 1, 47 - model->rssi_curret);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for(uint8_t i = 13; i < 47; i += width * 2) {
 | 
				
			||||||
 | 
					                canvas_draw_line(canvas, model->ind_write, i, model->ind_write, i + width);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            canvas_draw_line(canvas, model->ind_write - 2, 12, model->ind_write + 2, 12);
 | 
					            canvas_draw_line(canvas, model->ind_write - 2, 12, model->ind_write + 2, 12);
 | 
				
			||||||
            canvas_draw_line(canvas, model->ind_write - 1, 13, model->ind_write + 1, 13);
 | 
					            canvas_draw_line(canvas, model->ind_write - 1, 13, model->ind_write + 1, 13);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
 | 
					        int i = 0;
 | 
				
			||||||
        base = SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - model->ind_write;
 | 
					        base = SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - model->ind_write;
 | 
				
			||||||
        for(int i = SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE; i >= 0; i--) {
 | 
					        for(i = SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE; i > 0; i--) {
 | 
				
			||||||
            ind = i - base;
 | 
					            ind = i - base;
 | 
				
			||||||
            if(ind < 0) ind += SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE;
 | 
					            if(ind < 0) ind += SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE;
 | 
				
			||||||
            canvas_draw_line(canvas, i, 47, i, 47 - model->rssi_history[ind]);
 | 
					            canvas_draw_line(canvas, i, 47, i, 47 - model->rssi_history[ind]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        canvas_draw_line(
 | 
					        canvas_draw_line(
 | 
				
			||||||
            canvas, SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE, 47, SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE, 13);
 | 
					            canvas,
 | 
				
			||||||
 | 
					            SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 1,
 | 
				
			||||||
 | 
					            47,
 | 
				
			||||||
 | 
					            SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 1,
 | 
				
			||||||
 | 
					            47 - model->rssi_curret);
 | 
				
			||||||
 | 
					        canvas_draw_line(
 | 
				
			||||||
 | 
					            canvas,
 | 
				
			||||||
 | 
					            SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE + 1,
 | 
				
			||||||
 | 
					            47,
 | 
				
			||||||
 | 
					            SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE + 1,
 | 
				
			||||||
 | 
					            47 - model->rssi_curret);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for(uint8_t i = 13; i < 47; i += width * 2) {
 | 
				
			||||||
 | 
					            canvas_draw_line(
 | 
				
			||||||
 | 
					                canvas,
 | 
				
			||||||
 | 
					                SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE,
 | 
				
			||||||
 | 
					                i,
 | 
				
			||||||
 | 
					                SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE,
 | 
				
			||||||
 | 
					                i + width);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        canvas_draw_line(
 | 
					        canvas_draw_line(
 | 
				
			||||||
            canvas,
 | 
					            canvas,
 | 
				
			||||||
            SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 2,
 | 
					            SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE - 2,
 | 
				
			||||||
@ -220,6 +257,24 @@ void subghz_read_raw_draw_rssi(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void subghz_read_raw_draw_threshold_rssi(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
				
			||||||
 | 
					    uint8_t x = 118;
 | 
				
			||||||
 | 
					    uint8_t y = 48;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(model->raw_threshold_rssi > SUBGHZ_RAW_TRESHOLD_MIN) {
 | 
				
			||||||
 | 
					        uint8_t x = 118;
 | 
				
			||||||
 | 
					        y -= (uint8_t)((model->raw_threshold_rssi - SUBGHZ_RAW_TRESHOLD_MIN) / 2.7);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint8_t width = 3;
 | 
				
			||||||
 | 
					        for(uint8_t i = 0; i < x; i += width * 2) {
 | 
				
			||||||
 | 
					            canvas_draw_line(canvas, i, y, i + width, y);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    canvas_draw_line(canvas, x, y - 2, x, y + 2);
 | 
				
			||||||
 | 
					    canvas_draw_line(canvas, x - 1, y - 1, x - 1, y + 1);
 | 
				
			||||||
 | 
					    canvas_draw_dot(canvas, x - 2, y);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void subghz_read_raw_draw(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
					void subghz_read_raw_draw(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
				
			||||||
    uint8_t graphics_mode = 1;
 | 
					    uint8_t graphics_mode = 1;
 | 
				
			||||||
    canvas_set_color(canvas, ColorBlack);
 | 
					    canvas_set_color(canvas, ColorBlack);
 | 
				
			||||||
@ -278,8 +333,9 @@ void subghz_read_raw_draw(Canvas* canvas, SubGhzReadRAWModel* model) {
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        subghz_read_raw_draw_rssi(canvas, model);
 | 
					        subghz_read_raw_draw_rssi(canvas, model);
 | 
				
			||||||
        subghz_read_raw_draw_scale(canvas, model);
 | 
					        subghz_read_raw_draw_scale(canvas, model);
 | 
				
			||||||
 | 
					        subghz_read_raw_draw_threshold_rssi(canvas, model);
 | 
				
			||||||
        canvas_set_font_direction(canvas, CanvasDirectionBottomToTop);
 | 
					        canvas_set_font_direction(canvas, CanvasDirectionBottomToTop);
 | 
				
			||||||
        canvas_draw_str(canvas, 126, 40, "RSSI");
 | 
					        canvas_draw_str(canvas, 128, 40, "RSSI");
 | 
				
			||||||
        canvas_set_font_direction(canvas, CanvasDirectionLeftToRight);
 | 
					        canvas_set_font_direction(canvas, CanvasDirectionLeftToRight);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -433,7 +489,8 @@ bool subghz_read_raw_input(InputEvent* event, void* context) {
 | 
				
			|||||||
void subghz_read_raw_set_status(
 | 
					void subghz_read_raw_set_status(
 | 
				
			||||||
    SubGhzReadRAW* instance,
 | 
					    SubGhzReadRAW* instance,
 | 
				
			||||||
    SubGhzReadRAWStatus status,
 | 
					    SubGhzReadRAWStatus status,
 | 
				
			||||||
    const char* file_name) {
 | 
					    const char* file_name,
 | 
				
			||||||
 | 
					    float raw_threshold_rssi) {
 | 
				
			||||||
    furi_assert(instance);
 | 
					    furi_assert(instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch(status) {
 | 
					    switch(status) {
 | 
				
			||||||
@ -447,6 +504,7 @@ void subghz_read_raw_set_status(
 | 
				
			|||||||
                model->ind_write = 0;
 | 
					                model->ind_write = 0;
 | 
				
			||||||
                furi_string_reset(model->file_name);
 | 
					                furi_string_reset(model->file_name);
 | 
				
			||||||
                furi_string_set(model->sample_write, "0 spl.");
 | 
					                furi_string_set(model->sample_write, "0 spl.");
 | 
				
			||||||
 | 
					                model->raw_threshold_rssi = raw_threshold_rssi;
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            true);
 | 
					            true);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
@ -536,6 +594,7 @@ SubGhzReadRAW* subghz_read_raw_alloc() {
 | 
				
			|||||||
            model->sample_write = furi_string_alloc();
 | 
					            model->sample_write = furi_string_alloc();
 | 
				
			||||||
            model->file_name = furi_string_alloc();
 | 
					            model->file_name = furi_string_alloc();
 | 
				
			||||||
            model->rssi_history = malloc(SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE * sizeof(uint8_t));
 | 
					            model->rssi_history = malloc(SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE * sizeof(uint8_t));
 | 
				
			||||||
 | 
					            model->raw_threshold_rssi = -127.0f;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        true);
 | 
					        true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,8 @@
 | 
				
			|||||||
#include <gui/view.h>
 | 
					#include <gui/view.h>
 | 
				
			||||||
#include "../helpers/subghz_custom_event.h"
 | 
					#include "../helpers/subghz_custom_event.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SUBGHZ_RAW_TRESHOLD_MIN -90.0f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct SubGhzReadRAW SubGhzReadRAW;
 | 
					typedef struct SubGhzReadRAW SubGhzReadRAW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef void (*SubGhzReadRAWCallback)(SubGhzCustomEvent event, void* context);
 | 
					typedef void (*SubGhzReadRAWCallback)(SubGhzCustomEvent event, void* context);
 | 
				
			||||||
@ -40,11 +42,12 @@ void subghz_read_raw_stop_send(SubGhzReadRAW* instance);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void subghz_read_raw_update_sin(SubGhzReadRAW* instance);
 | 
					void subghz_read_raw_update_sin(SubGhzReadRAW* instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void subghz_read_raw_add_data_rssi(SubGhzReadRAW* instance, float rssi);
 | 
					void subghz_read_raw_add_data_rssi(SubGhzReadRAW* instance, float rssi, bool trace);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void subghz_read_raw_set_status(
 | 
					void subghz_read_raw_set_status(
 | 
				
			||||||
    SubGhzReadRAW* instance,
 | 
					    SubGhzReadRAW* instance,
 | 
				
			||||||
    SubGhzReadRAWStatus status,
 | 
					    SubGhzReadRAWStatus status,
 | 
				
			||||||
    const char* file_name);
 | 
					    const char* file_name,
 | 
				
			||||||
 | 
					    float raw_threshold_rssi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
View* subghz_read_raw_get_view(SubGhzReadRAW* subghz_static);
 | 
					View* subghz_read_raw_get_view(SubGhzReadRAW* subghz_static);
 | 
				
			||||||
 | 
				
			|||||||
@ -2310,6 +2310,7 @@ Function,+,subghz_protocol_raw_file_encoder_worker_set_callback_end,void,"SubGhz
 | 
				
			|||||||
Function,+,subghz_protocol_raw_gen_fff_data,void,"FlipperFormat*, const char*"
 | 
					Function,+,subghz_protocol_raw_gen_fff_data,void,"FlipperFormat*, const char*"
 | 
				
			||||||
Function,+,subghz_protocol_raw_get_sample_write,size_t,SubGhzProtocolDecoderRAW*
 | 
					Function,+,subghz_protocol_raw_get_sample_write,size_t,SubGhzProtocolDecoderRAW*
 | 
				
			||||||
Function,+,subghz_protocol_raw_save_to_file_init,_Bool,"SubGhzProtocolDecoderRAW*, const char*, SubGhzRadioPreset*"
 | 
					Function,+,subghz_protocol_raw_save_to_file_init,_Bool,"SubGhzProtocolDecoderRAW*, const char*, SubGhzRadioPreset*"
 | 
				
			||||||
 | 
					Function,+,subghz_protocol_raw_save_to_file_pause,void,"SubGhzProtocolDecoderRAW*, _Bool"
 | 
				
			||||||
Function,+,subghz_protocol_raw_save_to_file_stop,void,SubGhzProtocolDecoderRAW*
 | 
					Function,+,subghz_protocol_raw_save_to_file_stop,void,SubGhzProtocolDecoderRAW*
 | 
				
			||||||
Function,+,subghz_receiver_alloc_init,SubGhzReceiver*,SubGhzEnvironment*
 | 
					Function,+,subghz_receiver_alloc_init,SubGhzReceiver*,SubGhzEnvironment*
 | 
				
			||||||
Function,+,subghz_receiver_decode,void,"SubGhzReceiver*, _Bool, uint32_t"
 | 
					Function,+,subghz_receiver_decode,void,"SubGhzReceiver*, _Bool, uint32_t"
 | 
				
			||||||
 | 
				
			|||||||
		
		
			
  | 
@ -32,6 +32,7 @@ struct SubGhzProtocolDecoderRAW {
 | 
				
			|||||||
    FuriString* file_name;
 | 
					    FuriString* file_name;
 | 
				
			||||||
    size_t sample_write;
 | 
					    size_t sample_write;
 | 
				
			||||||
    bool last_level;
 | 
					    bool last_level;
 | 
				
			||||||
 | 
					    bool pause;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct SubGhzProtocolEncoderRAW {
 | 
					struct SubGhzProtocolEncoderRAW {
 | 
				
			||||||
@ -158,6 +159,7 @@ bool subghz_protocol_raw_save_to_file_init(
 | 
				
			|||||||
        instance->upload_raw = malloc(SUBGHZ_DOWNLOAD_MAX_SIZE * sizeof(int32_t));
 | 
					        instance->upload_raw = malloc(SUBGHZ_DOWNLOAD_MAX_SIZE * sizeof(int32_t));
 | 
				
			||||||
        instance->file_is_open = RAWFileIsOpenWrite;
 | 
					        instance->file_is_open = RAWFileIsOpenWrite;
 | 
				
			||||||
        instance->sample_write = 0;
 | 
					        instance->sample_write = 0;
 | 
				
			||||||
 | 
					        instance->pause = false;
 | 
				
			||||||
        init = true;
 | 
					        init = true;
 | 
				
			||||||
    } while(0);
 | 
					    } while(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -199,6 +201,14 @@ void subghz_protocol_raw_save_to_file_stop(SubGhzProtocolDecoderRAW* instance) {
 | 
				
			|||||||
    instance->file_is_open = RAWFileIsOpenClose;
 | 
					    instance->file_is_open = RAWFileIsOpenClose;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void subghz_protocol_raw_save_to_file_pause(SubGhzProtocolDecoderRAW* instance, bool pause) {
 | 
				
			||||||
 | 
					    furi_assert(instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(instance->pause != pause) {
 | 
				
			||||||
 | 
					        instance->pause = pause;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t subghz_protocol_raw_get_sample_write(SubGhzProtocolDecoderRAW* instance) {
 | 
					size_t subghz_protocol_raw_get_sample_write(SubGhzProtocolDecoderRAW* instance) {
 | 
				
			||||||
    return instance->sample_write + instance->ind_write;
 | 
					    return instance->sample_write + instance->ind_write;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -234,7 +244,7 @@ void subghz_protocol_decoder_raw_feed(void* context, bool level, uint32_t durati
 | 
				
			|||||||
    furi_assert(context);
 | 
					    furi_assert(context);
 | 
				
			||||||
    SubGhzProtocolDecoderRAW* instance = context;
 | 
					    SubGhzProtocolDecoderRAW* instance = context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(instance->upload_raw != NULL) {
 | 
					    if(!instance->pause && (instance->upload_raw != NULL)) {
 | 
				
			||||||
        if(duration > subghz_protocol_raw_const.te_short) {
 | 
					        if(duration > subghz_protocol_raw_const.te_short) {
 | 
				
			||||||
            if(instance->last_level != level) {
 | 
					            if(instance->last_level != level) {
 | 
				
			||||||
                instance->last_level = (level ? true : false);
 | 
					                instance->last_level = (level ? true : false);
 | 
				
			||||||
 | 
				
			|||||||
@ -103,6 +103,13 @@ void subghz_protocol_encoder_raw_free(void* context);
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
void subghz_protocol_encoder_raw_stop(void* context);
 | 
					void subghz_protocol_encoder_raw_stop(void* context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * pause writing to flash.
 | 
				
			||||||
 | 
					 * @param context Pointer to a SubGhzProtocolEncoderRAW instance
 | 
				
			||||||
 | 
					 * @param pause pause writing
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void subghz_protocol_raw_save_to_file_pause(SubGhzProtocolDecoderRAW* instance, bool pause);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Set callback on completion of file transfer.
 | 
					 * Set callback on completion of file transfer.
 | 
				
			||||||
 * @param instance Pointer to a SubGhzProtocolEncoderRAW instance
 | 
					 * @param instance Pointer to a SubGhzProtocolEncoderRAW instance
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user