Bluenet  5.7.0
Bluenet, firmware for nRF52 smart home devices
Loading...
Searching...
No Matches
cs_RecognizeSwitch.h
Go to the documentation of this file.
1
8#pragma once
9
12
14private:
15 // Keep up whether this class is running (started).
16 bool _running = false;
17
18 // Keep up number of detect() calls to skip.
19 // This is used to prevent multiple switch detections in a row, and to prevent switch detections on init.
21
22 // Threshold above which buffers are considered to be different.
24
25 // Threshold below which buffers are considered to be similar.
27
28 // Alternative to thresholdSimilar.
29 float _thresholdRatio = 100.0;
30
31 const static uint8_t _numBuffersRequired = 4;
32
33 const static uint8_t _numStoredBuffers = _numBuffersRequired;
34
35 // Store the samples and meta data of the last detection.
40
42
47 const CircularBuffer<adc_buffer_id_t>& bufQueue, adc_channel_id_t voltageChannelId, uint8_t iteration);
48
56
57 /*
58 * Calculate the difference between 2 buffers.
59 *
60 * Start at sample <shift> and iterates over <numSamples> samples.
61 */
62 inline float calcDiff(
63 const CircularBuffer<adc_buffer_id_t>& bufQueue,
64 const adc_channel_id_t voltageChannelId,
65 const adc_buffer_id_t bufIndex1,
66 const adc_buffer_id_t bufIndex2,
67 const adc_sample_value_id_t startIndex,
68 const adc_sample_value_id_t numSamples);
69
70 bool ignoreSample(const adc_sample_value_t value1, const adc_sample_value_t value2);
72 const adc_sample_value_t value0, const adc_sample_value_t value1, const adc_sample_value_t value2);
73
75 bool aboveThreshold, const CircularBuffer<adc_buffer_id_t>& bufQueue, adc_channel_id_t voltageChannelId);
76
77public:
78 // Gets a static singleton (no dynamic memory allocation)
80 static RecognizeSwitch instance;
81 return instance;
82 }
83
87
90 void init();
91
94 void deinit();
95
100 void configure(float threshold);
101
104 void start();
105
108 void stop();
109
112 void skip(uint16_t num);
113
121 bool detect(const CircularBuffer<adc_buffer_id_t>& bufQueue, adc_channel_id_t voltageChannelId);
122
130 void getLastDetection(PowerSamplesType type, uint8_t index, cs_result_t& result);
131};
static constexpr adc_sample_value_id_t getChannelLength()
Get number of samples for each channel in a buffer.
Definition: cs_AdcBuffer.h:109
Circular Buffer implementation.
Definition: cs_CircularBuffer.h:27
Authors: Crownstone Team Copyright: Crownstone (https://crownstone.rocks) Date: March 23,...
Definition: cs_RecognizeSwitch.h:13
float _thresholdSimilar
Definition: cs_RecognizeSwitch.h:26
void configure(float threshold)
Configure threshold.
void getLastDetection(PowerSamplesType type, uint8_t index, cs_result_t &result)
Get the samples of the last (almost) detected switch event.
float _thresholdDifferent
Definition: cs_RecognizeSwitch.h:23
bool detect(const CircularBuffer< adc_buffer_id_t > &bufQueue, adc_channel_id_t voltageChannelId)
Recognize switch event.
bool ignoreSample(const adc_sample_value_t value0, const adc_sample_value_t value1, const adc_sample_value_t value2)
void init()
Initialize: set initial values and allocate buffers.
void skip(uint16_t num)
Don't detect anything for num detect() calls.
cs_power_samples_header_t _lastAlmostDetection
Definition: cs_RecognizeSwitch.h:37
bool ignoreSample(const adc_sample_value_t value1, const adc_sample_value_t value2)
void setLastDetection(bool aboveThreshold, const CircularBuffer< adc_buffer_id_t > &bufQueue, adc_channel_id_t voltageChannelId)
FoundSwitch detect(const CircularBuffer< adc_buffer_id_t > &bufQueue, adc_channel_id_t voltageChannelId, uint8_t iteration)
Check if a switch is detected in the given buffers.
cs_power_samples_header_t _lastDetection
Definition: cs_RecognizeSwitch.h:36
void deinit()
Deinitialize: deallocate buffers.
void stop()
Stop detecting.
RecognizeSwitch()
Constructor: sets some default config values.
FoundSwitch detectSwitch(const CircularBuffer< adc_buffer_id_t > &bufQueue, adc_channel_id_t voltageChannelId)
Check if a switch is detected in the given buffers.
int16_t _lastAlmostDetectionSamples[_numStoredBuffers *AdcBuffer::getChannelLength()]
Definition: cs_RecognizeSwitch.h:39
static const uint8_t _numBuffersRequired
Definition: cs_RecognizeSwitch.h:31
static const uint8_t _numStoredBuffers
Definition: cs_RecognizeSwitch.h:33
int16_t _lastDetectionSamples[_numStoredBuffers *AdcBuffer::getChannelLength()]
Definition: cs_RecognizeSwitch.h:38
FoundSwitch
Definition: cs_RecognizeSwitch.h:41
@ False
Definition: cs_RecognizeSwitch.h:41
@ Almost
Definition: cs_RecognizeSwitch.h:41
@ True
Definition: cs_RecognizeSwitch.h:41
bool _running
Definition: cs_RecognizeSwitch.h:16
void start()
Start detecting.
float _thresholdRatio
Definition: cs_RecognizeSwitch.h:29
float calcDiff(const CircularBuffer< adc_buffer_id_t > &bufQueue, const adc_channel_id_t voltageChannelId, const adc_buffer_id_t bufIndex1, const adc_buffer_id_t bufIndex2, const adc_sample_value_id_t startIndex, const adc_sample_value_id_t numSamples)
uint8_t _skipSwitchDetectionTriggers
Definition: cs_RecognizeSwitch.h:20
static RecognizeSwitch & getInstance()
Definition: cs_RecognizeSwitch.h:79
#define SWITCHCRAFT_THRESHOLD
Definition: cs_Config.h:193
PowerSamplesType
Definition: cs_Packets.h:455
uint8_t adc_buffer_id_t
Definition: cs_Typedefs.h:30
int16_t adc_sample_value_t
Definition: cs_Typedefs.h:34
uint8_t adc_channel_id_t
Definition: cs_Typedefs.h:31
uint16_t adc_sample_value_id_t
Definition: cs_Typedefs.h:33
Definition: cs_Packets.h:464
Definition: cs_PacketsInternal.h:46