ESPHome 2026.4.3
Loading...
Searching...
No Matches
cc1101.h
Go to the documentation of this file.
1#pragma once
2
4#include "esphome/core/hal.h"
7#include "cc1101defs.h"
8#include <vector>
9
10namespace esphome::cc1101 {
11
13
15 public:
16 virtual void on_packet(const std::vector<uint8_t> &packet, float freq_offset, float rssi, uint8_t lqi) = 0;
17};
18
20 public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
21 spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_1MHZ> {
22 public:
24
25 void setup() override;
26 void loop() override;
27 void dump_config() override;
28
29 // Actions
30 void begin_tx();
31 void begin_rx();
32 void reset();
33 void set_idle();
34
35 // GDO Pin Configuration
36 void set_gdo0_pin(InternalGPIOPin *pin) { this->gdo0_pin_ = pin; }
37
38 // Configuration Setters
39 void set_output_power(float value);
41 void set_dc_blocking_filter(bool value);
42
43 // Tuner settings
44 void set_frequency(float value);
45 void set_if_frequency(float value);
46 void set_filter_bandwidth(float value);
47 void set_channel(uint8_t value);
48 void set_channel_spacing(float value);
49 void set_fsk_deviation(float value);
50 void set_msk_deviation(uint8_t value);
51 void set_symbol_rate(float value);
52 void set_sync_mode(SyncMode value);
53 void set_carrier_sense_above_threshold(bool value);
55 void set_manchester(bool value);
56 void set_num_preamble(uint8_t value);
57 void set_sync1(uint8_t value);
58 void set_sync0(uint8_t value);
59
60 // AGC settings
61 void set_magn_target(MagnTarget value);
62 void set_max_lna_gain(MaxLnaGain value);
64 void set_carrier_sense_abs_thr(int8_t value);
66 void set_lna_priority(bool value);
69 void set_freeze(Freeze value);
70 void set_wait_time(WaitTime value);
71 void set_hyst_level(HystLevel value);
72
73 // Packet mode settings
74 void set_packet_mode(bool value);
75 void set_packet_length(uint8_t value);
76 void set_crc_enable(bool value);
77 void set_whitening(bool value);
78
79 // Packet mode operations
80 CC1101Error transmit_packet(const std::vector<uint8_t> &packet);
81 void register_listener(CC1101Listener *listener) { this->listeners_.push_back(listener); }
82 Trigger<std::vector<uint8_t>, float, float, uint8_t> *get_packet_trigger() { return &this->packet_trigger_; }
83
84 protected:
85 uint16_t chip_id_{0};
86 bool initialized_{false};
87
90 uint8_t pa_table_[PA_TABLE_SIZE]{};
91
92 CC1101State state_;
93
94 // GDO pin for packet reception
96 static void IRAM_ATTR gpio_intr(CC1101Component *arg);
97
98 // Packet handling
99 void call_listeners_(const std::vector<uint8_t> &packet, float freq_offset, float rssi, uint8_t lqi);
101 std::vector<uint8_t> packet_;
102 std::vector<CC1101Listener *> listeners_;
103
104 // Low-level Helpers
105 uint8_t strobe_(Command cmd);
106 void write_(Register reg);
107 void write_(Register reg, uint8_t value);
108 void write_(Register reg, const uint8_t *buffer, size_t length);
109 void read_(Register reg);
110 void read_(Register reg, uint8_t *buffer, size_t length);
111
112 // State Management
113 bool wait_for_state_(State target_state, uint32_t timeout_ms = 100);
114 bool enter_calibrated_(State target_state, Command cmd);
115 void enter_idle_();
116 bool enter_rx_();
117 bool enter_tx_();
118};
119
120// Action Wrappers
121template<typename... Ts> class BeginTxAction : public Action<Ts...>, public Parented<CC1101Component> {
122 public:
123 void play(const Ts &...x) override { this->parent_->begin_tx(); }
124};
125
126template<typename... Ts> class BeginRxAction : public Action<Ts...>, public Parented<CC1101Component> {
127 public:
128 void play(const Ts &...x) override { this->parent_->begin_rx(); }
129};
130
131template<typename... Ts> class ResetAction : public Action<Ts...>, public Parented<CC1101Component> {
132 public:
133 void play(const Ts &...x) override { this->parent_->reset(); }
134};
135
136template<typename... Ts> class SetIdleAction : public Action<Ts...>, public Parented<CC1101Component> {
137 public:
138 void play(const Ts &...x) override { this->parent_->set_idle(); }
139};
140
141template<typename... Ts> class SendPacketAction : public Action<Ts...>, public Parented<CC1101Component> {
142 public:
143 void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) { this->data_func_ = func; }
144 void set_data_static(const uint8_t *data, size_t len) {
145 this->data_static_ = data;
146 this->data_static_len_ = len;
147 }
148
149 void play(const Ts &...x) override {
150 if (this->data_func_) {
151 auto data = this->data_func_(x...);
152 this->parent_->transmit_packet(data);
153 } else if (this->data_static_ != nullptr) {
154 std::vector<uint8_t> data(this->data_static_, this->data_static_ + this->data_static_len_);
155 this->parent_->transmit_packet(data);
156 }
157 }
158
159 protected:
160 std::function<std::vector<uint8_t>(Ts...)> data_func_{};
161 const uint8_t *data_static_{nullptr};
163};
164
165template<typename... Ts> class SetSymbolRateAction : public Action<Ts...>, public Parented<CC1101Component> {
166 public:
167 TEMPLATABLE_VALUE(float, symbol_rate)
168 void play(const Ts &...x) override { this->parent_->set_symbol_rate(this->symbol_rate_.value(x...)); }
169};
170
171template<typename... Ts> class SetFrequencyAction : public Action<Ts...>, public Parented<CC1101Component> {
172 public:
174 void play(const Ts &...x) override { this->parent_->set_frequency(this->frequency_.value(x...)); }
175};
176
177template<typename... Ts> class SetOutputPowerAction : public Action<Ts...>, public Parented<CC1101Component> {
178 public:
179 TEMPLATABLE_VALUE(float, output_power)
180 void play(const Ts &...x) override { this->parent_->set_output_power(this->output_power_.value(x...)); }
181};
182
183template<typename... Ts> class SetModulationTypeAction : public Action<Ts...>, public Parented<CC1101Component> {
184 public:
186 void play(const Ts &...x) override { this->parent_->set_modulation_type(this->modulation_type_.value(x...)); }
187};
188
189template<typename... Ts> class SetRxAttenuationAction : public Action<Ts...>, public Parented<CC1101Component> {
190 public:
192 void play(const Ts &...x) override { this->parent_->set_rx_attenuation(this->rx_attenuation_.value(x...)); }
193};
194
195template<typename... Ts> class SetDcBlockingFilterAction : public Action<Ts...>, public Parented<CC1101Component> {
196 public:
197 TEMPLATABLE_VALUE(bool, dc_blocking_filter)
198 void play(const Ts &...x) override { this->parent_->set_dc_blocking_filter(this->dc_blocking_filter_.value(x...)); }
199};
200
201template<typename... Ts> class SetManchesterAction : public Action<Ts...>, public Parented<CC1101Component> {
202 public:
203 TEMPLATABLE_VALUE(bool, manchester)
204 void play(const Ts &...x) override { this->parent_->set_manchester(this->manchester_.value(x...)); }
205};
206
207template<typename... Ts> class SetFilterBandwidthAction : public Action<Ts...>, public Parented<CC1101Component> {
208 public:
209 TEMPLATABLE_VALUE(float, filter_bandwidth)
210 void play(const Ts &...x) override { this->parent_->set_filter_bandwidth(this->filter_bandwidth_.value(x...)); }
211};
212
213template<typename... Ts> class SetFskDeviationAction : public Action<Ts...>, public Parented<CC1101Component> {
214 public:
215 TEMPLATABLE_VALUE(float, fsk_deviation)
216 void play(const Ts &...x) override { this->parent_->set_fsk_deviation(this->fsk_deviation_.value(x...)); }
217};
218
219template<typename... Ts> class SetMskDeviationAction : public Action<Ts...>, public Parented<CC1101Component> {
220 public:
221 TEMPLATABLE_VALUE(uint8_t, msk_deviation)
222 void play(const Ts &...x) override { this->parent_->set_msk_deviation(this->msk_deviation_.value(x...)); }
223};
224
225template<typename... Ts> class SetChannelAction : public Action<Ts...>, public Parented<CC1101Component> {
226 public:
227 TEMPLATABLE_VALUE(uint8_t, channel)
228 void play(const Ts &...x) override { this->parent_->set_channel(this->channel_.value(x...)); }
229};
230
231template<typename... Ts> class SetChannelSpacingAction : public Action<Ts...>, public Parented<CC1101Component> {
232 public:
233 TEMPLATABLE_VALUE(float, channel_spacing)
234 void play(const Ts &...x) override { this->parent_->set_channel_spacing(this->channel_spacing_.value(x...)); }
235};
236
237template<typename... Ts> class SetIfFrequencyAction : public Action<Ts...>, public Parented<CC1101Component> {
238 public:
239 TEMPLATABLE_VALUE(float, if_frequency)
240 void play(const Ts &...x) override { this->parent_->set_if_frequency(this->if_frequency_.value(x...)); }
241};
242
243} // namespace esphome::cc1101
uint16_le_t frequency
Definition bl0942.h:6
virtual void play(const Ts &...x)=0
Helper class to easily give an object a parent of type T.
Definition helpers.h:1998
void play(const Ts &...x) override
Definition cc1101.h:128
void play(const Ts &...x) override
Definition cc1101.h:123
void set_packet_mode(bool value)
Definition cc1101.cpp:666
Trigger< std::vector< uint8_t >, float, float, uint8_t > * get_packet_trigger()
Definition cc1101.h:82
void set_max_dvga_gain(MaxDvgaGain value)
Definition cc1101.cpp:603
void set_whitening(bool value)
Definition cc1101.cpp:715
void set_carrier_sense_above_threshold(bool value)
Definition cc1101.cpp:542
void write_(Register reg)
Definition cc1101.cpp:335
void set_sync0(uint8_t value)
Definition cc1101.cpp:582
void set_freeze(Freeze value)
Definition cc1101.cpp:645
void call_listeners_(const std::vector< uint8_t > &packet, float freq_offset, float rssi, uint8_t lqi)
Definition cc1101.cpp:162
void set_rx_attenuation(RxAttenuation value)
Definition cc1101.cpp:437
InternalGPIOPin * gdo0_pin_
Definition cc1101.h:95
void set_symbol_rate(float value)
Definition cc1101.cpp:523
void register_listener(CC1101Listener *listener)
Definition cc1101.h:81
uint8_t strobe_(Command cmd)
Definition cc1101.cpp:324
void set_sync_mode(SyncMode value)
Definition cc1101.cpp:535
void set_fsk_deviation(float value)
Definition cc1101.cpp:504
void set_msk_deviation(uint8_t value)
Definition cc1101.cpp:515
void set_carrier_sense_rel_thr(CarrierSenseRelThr value)
Definition cc1101.cpp:617
uint8_t pa_table_[PA_TABLE_SIZE]
Definition cc1101.h:90
void set_lna_priority(bool value)
Definition cc1101.cpp:624
void set_output_power(float value)
Definition cc1101.cpp:409
void set_modulation_type(Modulation value)
Definition cc1101.cpp:549
void set_if_frequency(float value)
Definition cc1101.cpp:465
void set_frequency(float value)
Definition cc1101.cpp:451
void set_num_preamble(uint8_t value)
Definition cc1101.cpp:568
void set_hyst_level(HystLevel value)
Definition cc1101.cpp:659
void set_filter_bandwidth(float value)
Definition cc1101.cpp:472
void set_filter_length_fsk_msk(FilterLengthFskMsk value)
Definition cc1101.cpp:631
void set_crc_enable(bool value)
Definition cc1101.cpp:708
static void IRAM_ATTR gpio_intr(CC1101Component *arg)
Definition cc1101.cpp:105
void set_carrier_sense_abs_thr(int8_t value)
Definition cc1101.cpp:610
bool enter_calibrated_(State target_state, Command cmd)
Definition cc1101.cpp:297
void set_magn_target(MagnTarget value)
Definition cc1101.cpp:589
void set_channel_spacing(float value)
Definition cc1101.cpp:492
CC1101Error transmit_packet(const std::vector< uint8_t > &packet)
Definition cc1101.cpp:373
void set_gdo0_pin(InternalGPIOPin *pin)
Definition cc1101.h:36
void set_wait_time(WaitTime value)
Definition cc1101.cpp:652
std::vector< CC1101Listener * > listeners_
Definition cc1101.h:102
void set_dc_blocking_filter(bool value)
Definition cc1101.cpp:444
void set_packet_length(uint8_t value)
Definition cc1101.cpp:695
void set_manchester(bool value)
Definition cc1101.cpp:561
std::vector< uint8_t > packet_
Definition cc1101.h:101
void set_channel(uint8_t value)
Definition cc1101.cpp:483
void set_filter_length_ask_ook(FilterLengthAskOok value)
Definition cc1101.cpp:638
void set_max_lna_gain(MaxLnaGain value)
Definition cc1101.cpp:596
void set_sync1(uint8_t value)
Definition cc1101.cpp:575
bool wait_for_state_(State target_state, uint32_t timeout_ms=100)
Definition cc1101.cpp:284
Trigger< std::vector< uint8_t >, float, float, uint8_t > packet_trigger_
Definition cc1101.h:100
virtual void on_packet(const std::vector< uint8_t > &packet, float freq_offset, float rssi, uint8_t lqi)=0
void play(const Ts &...x) override
Definition cc1101.h:133
std::function< std::vector< uint8_t >(Ts...)> data_func_
Definition cc1101.h:160
void set_data_static(const uint8_t *data, size_t len)
Definition cc1101.h:144
void play(const Ts &...x) override
Definition cc1101.h:149
void set_data_template(std::function< std::vector< uint8_t >(Ts...)> func)
Definition cc1101.h:143
TEMPLATABLE_VALUE(uint8_t, channel) void play(const Ts &...x) override
Definition cc1101.h:227
TEMPLATABLE_VALUE(float, channel_spacing) void play(const Ts &...x) override
Definition cc1101.h:233
TEMPLATABLE_VALUE(bool, dc_blocking_filter) void play(const Ts &...x) override
Definition cc1101.h:197
TEMPLATABLE_VALUE(float, filter_bandwidth) void play(const Ts &...x) override
Definition cc1101.h:209
TEMPLATABLE_VALUE(float, frequency) void play(const Ts &...x) override
Definition cc1101.h:173
TEMPLATABLE_VALUE(float, fsk_deviation) void play(const Ts &...x) override
Definition cc1101.h:215
void play(const Ts &...x) override
Definition cc1101.h:138
TEMPLATABLE_VALUE(float, if_frequency) void play(const Ts &...x) override
Definition cc1101.h:239
TEMPLATABLE_VALUE(bool, manchester) void play(const Ts &...x) override
Definition cc1101.h:203
TEMPLATABLE_VALUE(Modulation, modulation_type) void play(const Ts &...x) override
Definition cc1101.h:185
TEMPLATABLE_VALUE(uint8_t, msk_deviation) void play(const Ts &...x) override
Definition cc1101.h:221
TEMPLATABLE_VALUE(float, output_power) void play(const Ts &...x) override
Definition cc1101.h:179
TEMPLATABLE_VALUE(RxAttenuation, rx_attenuation) void play(const Ts &...x) override
Definition cc1101.h:191
TEMPLATABLE_VALUE(float, symbol_rate) void play(const Ts &...x) override
Definition cc1101.h:167
The SPIDevice is what components using the SPI will create.
Definition spi.h:429
std::string size_t len
Definition helpers.h:1045
static void uint32_t
uint16_t length
Definition tt21100.cpp:0
uint16_t x
Definition tt21100.cpp:5