subghz_threshold_rssi.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "subghz_threshold_rssi.h"
  2. #include <float_tools.h>
  3. #include "../subghz_i.h"
  4. #define TAG "SubGhzThresholdRssi"
  5. #define THRESHOLD_RSSI_LOW_COUNT 10
  6. struct SubGhzThresholdRssi {
  7. float threshold_rssi;
  8. uint8_t threshold_rssi_low_count;
  9. };
  10. SubGhzThresholdRssi* subghz_threshold_rssi_alloc(void) {
  11. SubGhzThresholdRssi* instance = malloc(sizeof(SubGhzThresholdRssi));
  12. instance->threshold_rssi = SUBGHZ_RAW_THRESHOLD_MIN;
  13. instance->threshold_rssi_low_count = THRESHOLD_RSSI_LOW_COUNT;
  14. return instance;
  15. }
  16. void subghz_threshold_rssi_free(SubGhzThresholdRssi* instance) {
  17. furi_assert(instance);
  18. free(instance);
  19. }
  20. void subghz_threshold_rssi_set(SubGhzThresholdRssi* instance, float rssi) {
  21. furi_assert(instance);
  22. instance->threshold_rssi = rssi;
  23. }
  24. float subghz_threshold_rssi_get(SubGhzThresholdRssi* instance) {
  25. furi_assert(instance);
  26. return instance->threshold_rssi;
  27. }
  28. SubGhzThresholdRssiData subghz_threshold_get_rssi_data(SubGhzThresholdRssi* instance) {
  29. furi_assert(instance);
  30. float rssi = furi_hal_subghz_get_rssi();
  31. SubGhzThresholdRssiData ret = {.rssi = rssi, .is_above = false};
  32. if(float_is_equal(instance->threshold_rssi, SUBGHZ_RAW_THRESHOLD_MIN)) {
  33. ret.is_above = true;
  34. } else {
  35. if(rssi < instance->threshold_rssi) {
  36. instance->threshold_rssi_low_count++;
  37. if(instance->threshold_rssi_low_count > THRESHOLD_RSSI_LOW_COUNT) {
  38. instance->threshold_rssi_low_count = THRESHOLD_RSSI_LOW_COUNT;
  39. }
  40. ret.is_above = false;
  41. } else {
  42. instance->threshold_rssi_low_count = 0;
  43. }
  44. if(instance->threshold_rssi_low_count == THRESHOLD_RSSI_LOW_COUNT) {
  45. ret.is_above = false;
  46. } else {
  47. ret.is_above = true;
  48. }
  49. }
  50. return ret;
  51. }