SensESP 3.2.2
Universal Signal K sensor toolkit ESP32
Loading...
Searching...
No Matches
system_status_led.h
Go to the documentation of this file.
1#ifndef SENSESP_SRC_SENSESP_SYSTEM_SYSTEM_STATUS_LED_H_
2#define SENSESP_SRC_SENSESP_SYSTEM_SYSTEM_STATUS_LED_H_
3
4#include <memory>
5#include <vector>
6
7#include "lambda_consumer.h"
8#include "led_blinker.h"
10
11#include "esp_arduino_version.h"
12#include "esp_idf_version.h"
13
14#if ESP_ARDUINO_VERSION_MAJOR < 3
15#include "pwm_output.h"
16#define rgbLedWrite neopixelWrite
17#endif
18
19
20namespace sensesp {
21
22// LED patterns. It isn't strictly speaking necessary to have these public,
23// but it makes it easier to test the LED functionality.
24extern LEDPattern no_ap_pattern;
25extern LEDPattern wifi_disconnected_pattern;
26extern LEDPattern wifi_connected_pattern;
27extern LEDPattern ws_connecting_pattern;
28extern LEDPattern ws_connected_pattern;
29extern LEDPattern ws_disconnected_pattern;
30extern LEDPattern ws_authorizing_pattern;
31
40 protected:
42
43 std::unique_ptr<LEDBlinker> blinker_;
44
45 virtual void show() = 0;
46
47 virtual void set_brightness(uint8_t brightness) = 0;
48
49 virtual void set_wifi_no_ap();
50 virtual void set_wifi_disconnected();
51 virtual void set_ws_disconnected();
52 virtual void set_ws_authorizing();
53 virtual void set_ws_connecting();
54 virtual void set_ws_connected();
55
56 public:
58 blinker_ = std::unique_ptr<LEDBlinker>(
59 new LEDBlinker(leds_[0], no_ap_pattern, [this]() { this->show(); }));
60
61 event_loop()->onRepeat(5, [this]() {
62 this->blinker_->tick();
63 this->show();
64 });
65 }
66
68 [this](SystemStatus status) {
69 switch (status) {
71 this->set_wifi_no_ap();
72 break;
75 break;
77 this->set_ws_disconnected();
78 break;
80 this->set_ws_connecting();
81 break;
83 this->set_ws_authorizing();
84 break;
86 this->set_ws_connected();
87 break;
88 default:
89 break;
90 }
91 }};
92
96
98};
99
100// TODO: Instead of setting PWM output manually, it would be great to
101// instead implement a single-LED FastLED controller class. That would
102// allow supporting features like dithering etc.
103
109 public:
110 SystemStatusLed(uint8_t pin, uint8_t brightness = 255)
112 pin_{pin},
113 brightness_{brightness} {
114#if ESP_ARDUINO_VERSION_MAJOR >= 3
115 ledcAttach(pin, 2000, 8);
116#endif
117 }
118
119 protected:
120 uint8_t pin_;
121#if ESP_ARDUINO_VERSION_MAJOR < 3
123#endif
124 uint8_t brightness_;
125 void show() override {
126 // Convert RGB to luminance, then apply gamma correction and brightness
127 uint8_t luminance = rgb_to_luminance(leds_[0].r, leds_[0].g, leds_[0].b);
128 uint8_t value = apply_brightness(luminance, brightness_);
129#if ESP_ARDUINO_VERSION_MAJOR >= 3
130 ledcWrite(pin_, value);
131#else
132 pwm_output_.set(value / 255.0);
133#endif
134 }
135
136 void set_brightness(uint8_t brightness) override { brightness_ = brightness; }
137};
138
139// Direct use of FastLED breaks when the WiFi client is enabled. Thus,
140// use the Arduino ESP32 Core native rgbLedWrite function instead. That
141// seems to work with WiFi as well.
142
144 public:
145 RGBSystemStatusLed(uint8_t pin, uint8_t brightness = 40)
146 : BaseSystemStatusLed(), pin_{pin}, brightness_{brightness} {}
147
148 protected:
149 uint8_t pin_;
150 uint8_t brightness_;
157
158 void set_brightness(uint8_t brightness) override { brightness_ = brightness; }
159};
160
161} // namespace sensesp
162
163#endif
virtual void set_brightness(uint8_t brightness)=0
std::unique_ptr< LEDBlinker > blinker_
ValueConsumer< int > & get_delta_tx_count_consumer()
ValueConsumer< SystemStatus > & get_system_status_consumer()
LambdaConsumer< SystemStatus > system_status_consumer_
Blink the LED with a pattern specified by a vector of callback functions.
Provides an easy way of calling a function based on the output of any ValueProducer.
DEPRECATED. Use Android native ledcAttach and ledcWrite instead.
Definition pwm_output.h:33
RGBSystemStatusLed(uint8_t pin, uint8_t brightness=40)
void set_brightness(uint8_t brightness) override
SystemStatusLed(uint8_t pin, uint8_t brightness=255)
void set_brightness(uint8_t brightness) override
A base class for piece of code (like a transform) that accepts data for input. ValueConsumers can acc...
std::shared_ptr< reactesp::EventLoop > event_loop()
Definition sensesp.cpp:9
LEDPattern no_ap_pattern
uint8_t apply_brightness(uint8_t value, uint8_t brightness)
Apply gamma correction and brightness scaling to a color value.
Definition crgb.h:110
uint8_t rgb_to_luminance(uint8_t r, uint8_t g, uint8_t b)
Convert RGB color to perceptual luminance.
Definition crgb.h:125
LEDPattern ws_authorizing_pattern
LEDPattern ws_disconnected_pattern
LEDPattern ws_connected_pattern
LEDPattern wifi_connected_pattern
LEDPattern ws_connecting_pattern
LEDPattern wifi_disconnected_pattern
Minimal RGB color struct.
Definition crgb.h:58
static const CRGB Black
Definition crgb.h:88
#define rgbLedWrite