ESPHome 2025.5.0
Loading...
Searching...
No Matches
rotary_encoder.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4
6#include "esphome/core/hal.h"
9
10namespace esphome {
11namespace rotary_encoder {
12
18
26
30
31 volatile int32_t counter{0};
33 int32_t min_value{INT32_MIN};
34 int32_t max_value{INT32_MAX};
35 int32_t last_read{0};
36 uint8_t state{0};
37 bool first_read{true};
38
39 std::array<int8_t, 8> rotation_events{};
41
42 static void gpio_intr(RotaryEncoderSensorStore *arg);
43};
44
46 public:
47 void set_pin_a(InternalGPIOPin *pin_a) { pin_a_ = pin_a; }
48 void set_pin_b(InternalGPIOPin *pin_b) { pin_b_ = pin_b; }
49
58
67
69 void set_value(int value) {
70 this->store_.counter = value;
71 this->loop();
72 }
73
74 void set_reset_pin(GPIOPin *pin_i) { this->pin_i_ = pin_i; }
75 void set_min_value(int32_t min_value);
76 void set_max_value(int32_t max_value);
77 void set_publish_initial_value(bool publish_initial_value) { publish_initial_value_ = publish_initial_value; }
78
79 // ========== INTERNAL METHODS ==========
80 // (In most use cases you won't need these)
81 void setup() override;
82 void dump_config() override;
83 void loop() override;
84
85 float get_setup_priority() const override;
86
87 void add_on_clockwise_callback(std::function<void()> callback) {
88 this->on_clockwise_callback_.add(std::move(callback));
89 }
90
91 void add_on_anticlockwise_callback(std::function<void()> callback) {
92 this->on_anticlockwise_callback_.add(std::move(callback));
93 }
94
95 void register_listener(std::function<void(uint32_t)> listener) { this->listeners_.add(std::move(listener)); }
96
97 protected:
100 GPIOPin *pin_i_{nullptr};
104
106
109 CallbackManager<void(int32_t)> listeners_{};
110};
111
112template<typename... Ts> class RotaryEncoderSetValueAction : public Action<Ts...> {
113 public:
116
117 void play(Ts... x) override { this->encoder_->set_value(this->value_.value(x...)); }
118
119 protected:
121};
122
124 public:
126 parent->add_on_clockwise_callback([this]() { this->trigger(); });
127 }
128};
129
131 public:
133 parent->add_on_anticlockwise_callback([this]() { this->trigger(); });
134 }
135};
136
137} // namespace rotary_encoder
138} // namespace esphome
BedjetMode mode
BedJet operating mode.
virtual void play(Ts... x)=0
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio.h:73
void trigger(Ts... x)
Definition automation.h:96
void set_publish_initial_value(bool publish_initial_value)
void set_value(int value)
Manually set the value of the counter.
CallbackManager< void()> on_anticlockwise_callback_
CallbackManager< void(int32_t)> listeners_
void add_on_anticlockwise_callback(std::function< void()> callback)
bool publish_initial_value_
Index pin, if this is not nullptr, the counter will reset to 0 once this pin is HIGH.
void register_listener(std::function< void(uint32_t)> listener)
void set_resolution(RotaryEncoderResolution mode)
Set the resolution of the rotary encoder.
void add_on_clockwise_callback(std::function< void()> callback)
void set_restore_mode(RotaryEncoderRestoreMode restore_mode)
Set the restore mode of the rotary encoder.
RotaryEncoderSetValueAction(RotaryEncoderSensor *encoder)
TEMPLATABLE_VALUE(int, value) void play(Ts... x) override
Base-class for all sensors.
Definition sensor.h:57
RotaryEncoderResolution
All possible resolutions for the rotary encoder.
@ ROTARY_ENCODER_2_PULSES_PER_CYCLE
increment counter by 1 with every A-B cycle, slow response but accurate
@ ROTARY_ENCODER_4_PULSES_PER_CYCLE
increment counter by 2 with every A-B cycle
RotaryEncoderRestoreMode
All possible restore modes for the rotary encoder.
@ ROTARY_ENCODER_ALWAYS_ZERO
try to restore counter, otherwise set to zero
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
static void gpio_intr(RotaryEncoderSensorStore *arg)
uint16_t x
Definition tt21100.cpp:5