#include "subghz_threshold_rssi.h" #include <float_tools.h> #include "../subghz_i.h" #define TAG "SubGhzThresholdRssi" #define THRESHOLD_RSSI_LOW_COUNT 10 struct SubGhzThresholdRssi { float threshold_rssi; uint8_t threshold_rssi_low_count; }; SubGhzThresholdRssi* subghz_threshold_rssi_alloc(void) { SubGhzThresholdRssi* instance = malloc(sizeof(SubGhzThresholdRssi)); instance->threshold_rssi = SUBGHZ_RAW_THRESHOLD_MIN; instance->threshold_rssi_low_count = THRESHOLD_RSSI_LOW_COUNT; return instance; } void subghz_threshold_rssi_free(SubGhzThresholdRssi* instance) { furi_assert(instance); free(instance); } void subghz_threshold_rssi_set(SubGhzThresholdRssi* instance, float rssi) { furi_assert(instance); instance->threshold_rssi = rssi; } float subghz_threshold_rssi_get(SubGhzThresholdRssi* instance) { furi_assert(instance); return instance->threshold_rssi; } SubGhzThresholdRssiData subghz_threshold_get_rssi_data(SubGhzThresholdRssi* instance, float rssi) { furi_assert(instance); SubGhzThresholdRssiData ret = {.rssi = rssi, .is_above = false}; if(float_is_equal(instance->threshold_rssi, SUBGHZ_RAW_THRESHOLD_MIN)) { ret.is_above = true; } else { if(rssi < instance->threshold_rssi) { instance->threshold_rssi_low_count++; if(instance->threshold_rssi_low_count > THRESHOLD_RSSI_LOW_COUNT) { instance->threshold_rssi_low_count = THRESHOLD_RSSI_LOW_COUNT; } ret.is_above = false; } else { instance->threshold_rssi_low_count = 0; } if(instance->threshold_rssi_low_count == THRESHOLD_RSSI_LOW_COUNT) { ret.is_above = false; } else { ret.is_above = true; } } return ret; }