SensESP 2.7.2
Universal Signal K sensor toolkit ESP32
Loading...
Searching...
No Matches
task_queue_producer.h
Go to the documentation of this file.
1#ifndef SENSESP_SYSTEM_TASK_QUEUE_PRODUCER_H_
2#define SENSESP_SYSTEM_TASK_QUEUE_PRODUCER_H_
3
4#include "ReactESP.h"
5#include "observablevalue.h"
6
7namespace sensesp {
8
22template <class T>
24 public:
25 TaskQueueProducer(const T& value, reactesp::ReactESP* consumer_app = ReactESP::app, int queue_size = 1,
26 unsigned int poll_rate = 990)
27 : ObservableValue<T>(value), queue_size_{queue_size} {
28 queue_ = xQueueCreate(queue_size, sizeof(T));
29 if (queue_ == NULL) {
30 debugE("Failed to create queue");
31 }
32
33 // Create a repeat reaction that will poll the queue and emit the values
34 consumer_app->onRepeatMicros(poll_rate, [this]() {
35 T value;
36 while (xQueueReceive(queue_, &value, 0) == pdTRUE) {
37 this->emit(value);
38 }
39 });
40 }
41
42 TaskQueueProducer(const T& value, int queue_size = 1, unsigned int poll_rate = 990)
44
45 bool set(const T& value) {
46 int retval;
47 if (queue_size_ == 1) {
48 retval = xQueueOverwrite(queue_, &value);
49 } else {
50 retval = xQueueSend(queue_, &value, 0);
51 }
52 if (retval != pdTRUE) {
53 return false;
54 }
55 return true;
56 }
57
58 private:
59 int queue_size_;
60 QueueHandle_t queue_;
61};
62
63} // namespace sensesp
64
65#endif // SENSESP_SYSTEM_TASK_QUEUE_PRODUCER_H_
Construct a new transform based on a single function.
A value that notifies its observers if it gets changed.
Producer class that works across task boundaries.
TaskQueueProducer(const T &value, int queue_size=1, unsigned int poll_rate=990)
TaskQueueProducer(const T &value, reactesp::ReactESP *consumer_app=ReactESP::app, int queue_size=1, unsigned int poll_rate=990)
void emit(T new_value)
#define debugE(fmt,...)
Definition local_debug.h:50
ReactESP app