Bluenet  5.7.0
Bluenet, firmware for nRF52 smart home devices
Loading...
Searching...
No Matches
cs_RssiAndChannel.h
Go to the documentation of this file.
1/*
2 * Author: Crownstone Team
3 * Copyright: Crownstone (https://crownstone.rocks)
4 * Date: Sep 15, 2021
5 * License: LGPLv3+, Apache License 2.0, and/or MIT (triple-licensed)
6 */
7
8#pragma once
9
10#include <util/cs_Math.h>
11
12// ---------------------------------------------------------------------
13
14uint8_t inline compressChannel(uint8_t channel) {
15 switch (channel) {
16 case 37: return 1;
17 case 38: return 2;
18 case 39: return 3;
19 default: return 0;
20 }
21}
22
23uint8_t inline decompressChannel(uint8_t compressedChannel) {
24 return compressedChannel == 0 ? 0 : compressedChannel + 36;
25}
26
27uint8_t inline compressRssi(int8_t rssi) {
28 if (rssi < 0) {
29 rssi = -rssi;
30 }
31 else {
32 // All positive values are compressed to 0.
33 rssi = 0;
34 }
35
36 return rssi / 2;
37}
38
39int8_t inline decompressRssi(uint8_t compressedRssi) {
40 return -2 * compressedRssi;
41}
42
43// ---------------------------------------------------------------------
44
46public:
47 float _rssi; // signed rssi, usually negative. higher is closer.
48 uint8_t _channel; // 37-39
49
50 rssi_and_channel_float_t(float rssi, uint8_t channel = 0) : _rssi(rssi), _channel(channel) {}
51
52 bool isCloserThan(const rssi_and_channel_float_t& other) { return _rssi > other._rssi; }
53
54 bool isCloserEqual(const rssi_and_channel_float_t& other) { return isCloserThan(other) || _rssi == other._rssi; }
55
56 rssi_and_channel_float_t fallOff(float rate_db_sec, float dt_sec) {
57 return rssi_and_channel_float_t(_rssi - rate_db_sec * dt_sec, _channel);
58 }
59};
60
61// ---------------------------------------------------------------------
62
63struct __attribute__((__packed__)) rssi_and_channel_t {
64 uint8_t channel : 2; // 0 = unknown, 1 = channel 37, 2 = channel 38, 3 = channel 39
65 uint8_t rssiHalved : 6; // half of the absolute value of the original rssi.
66
67 rssi_and_channel_t() = default;
68
69 rssi_and_channel_t(int8_t rssi, uint8_t ch = 0) {
70 channel = compressChannel(ch);
71 rssiHalved = compressRssi(rssi);
72 }
73
74 uint8_t getChannel() const { return decompressChannel(channel); }
75
76 int8_t getRssi() const { return decompressRssi(rssiHalved); }
77
78 rssi_and_channel_float_t toFloat() { return rssi_and_channel_float_t(getRssi(), getChannel()); }
79
80 rssi_and_channel_float_t fallOff(float rate_db_sec, float dt_sec) { return toFloat().fallOff(rate_db_sec, dt_sec); }
81};
Definition: cs_RssiAndChannel.h:45
bool isCloserThan(const rssi_and_channel_float_t &other)
Definition: cs_RssiAndChannel.h:52
uint8_t _channel
Definition: cs_RssiAndChannel.h:48
float _rssi
Definition: cs_RssiAndChannel.h:47
bool isCloserEqual(const rssi_and_channel_float_t &other)
Definition: cs_RssiAndChannel.h:54
rssi_and_channel_float_t(float rssi, uint8_t channel=0)
Definition: cs_RssiAndChannel.h:50
rssi_and_channel_float_t fallOff(float rate_db_sec, float dt_sec)
Definition: cs_RssiAndChannel.h:56
uint8_t compressChannel(uint8_t channel)
Definition: cs_RssiAndChannel.h:14
int8_t decompressRssi(uint8_t compressedRssi)
Definition: cs_RssiAndChannel.h:39
uint8_t decompressChannel(uint8_t compressedChannel)
Definition: cs_RssiAndChannel.h:23
uint8_t compressRssi(int8_t rssi)
Definition: cs_RssiAndChannel.h:27
Definition: cs_RssiAndChannel.h:63
uint8_t rssiHalved
Definition: cs_RssiAndChannel.h:65
rssi_and_channel_float_t toFloat()
Definition: cs_RssiAndChannel.h:78
int8_t getRssi() const
Definition: cs_RssiAndChannel.h:76
rssi_and_channel_t()=default
rssi_and_channel_float_t fallOff(float rate_db_sec, float dt_sec)
Definition: cs_RssiAndChannel.h:80
uint8_t channel
Definition: cs_RssiAndChannel.h:64
rssi_and_channel_t(int8_t rssi, uint8_t ch=0)
Definition: cs_RssiAndChannel.h:69
uint8_t getChannel() const
Definition: cs_RssiAndChannel.h:74