unleashed-firmware/applications/main/subghz/helpers/subghz_threshold_rssi.c
2024-07-16 01:01:17 +03:00

60 lines
1.8 KiB
C

#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;
}