ESPHome 2026.7.4
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
19class CC1101Component final : public Component,
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 void configure();
29
30 // Actions
31 void begin_tx();
32 void begin_rx();
33 void reset();
34 void set_idle();
35
36 // GDO Pin Configuration
37 void set_gdo0_pin(InternalGPIOPin *pin) { this->gdo0_pin_ = pin; }
38
39 // Configuration Setters
40 void set_output_power(float value);
42 void set_dc_blocking_filter(bool value);
43
44 // Tuner settings
45 void set_frequency(float value);
46 void set_if_frequency(float value);
47 void set_filter_bandwidth(float value);
48 void set_channel(uint8_t value);
49 void set_channel_spacing(float value);
50 void set_fsk_deviation(float value);
51 void set_msk_deviation(uint8_t value);
52 void set_symbol_rate(float value);
53 void set_sync_mode(SyncMode value);
54 void set_carrier_sense_above_threshold(bool value);
56 void set_manchester(bool value);
57 void set_num_preamble(uint8_t value);
58 void set_sync1(uint8_t value);
59 void set_sync0(uint8_t value);
60
61 // AGC settings
62 void set_magn_target(MagnTarget value);
63 void set_max_lna_gain(MaxLnaGain value);
65 void set_carrier_sense_abs_thr(int8_t value);
67 void set_lna_priority(bool value);
70 void set_freeze(Freeze value);
71 void set_wait_time(WaitTime value);
72 void set_hyst_level(HystLevel value);
73
74 // Packet mode settings
75 void set_packet_mode(bool value);
76 void set_packet_length(uint8_t value);
77 void set_crc_enable(bool value);
78 void set_whitening(bool value);
79
80 // Packet mode operations
81 CC1101Error transmit_packet(const std::vector<uint8_t> &packet);
82 void register_listener(CC1101Listener *listener) { this->listeners_.push_back(listener); }
83 Trigger<std::vector<uint8_t>, float, float, uint8_t> *get_packet_trigger() { return &this->packet_trigger_; }
84
85 protected:
86 uint16_t chip_id_{0};
87 bool initialized_{false};
88
91 uint8_t pa_table_[PA_TABLE_SIZE]{};
92
93 CC1101State state_;
94
95 // GDO pin for packet reception
97 static void IRAM_ATTR gpio_intr(CC1101Component *arg);
98
99 // Packet handling
100 void call_listeners_(const std::vector<uint8_t> &packet, float freq_offset, float rssi, uint8_t lqi);
102 std::vector<uint8_t> packet_;
103 std::vector<CC1101Listener *> listeners_;
104
105 // Low-level Helpers
106 uint8_t strobe_(Command cmd);
107 void write_(Register reg);
108 void write_(Register reg, uint8_t value);
109 void write_(Register reg, const uint8_t *buffer, size_t length);
110 void read_(Register reg);
111 void read_(Register reg, uint8_t *buffer, size_t length);
112
113 // State Management
114 bool wait_for_state_(State target_state, uint32_t timeout_ms = 100);
115 bool enter_calibrated_(State target_state, Command cmd);
116 void enter_idle_();
117 bool enter_rx_();
118 bool enter_tx_();
119};
120
121// Action Wrappers
122template<typename... Ts> class BeginTxAction final : public Action<Ts...>, public Parented<CC1101Component> {
123 public:
124 void play(const Ts &...x) override { this->parent_->begin_tx(); }
125};
126
127template<typename... Ts> class BeginRxAction final : public Action<Ts...>, public Parented<CC1101Component> {
128 public:
129 void play(const Ts &...x) override { this->parent_->begin_rx(); }
130};
131
132template<typename... Ts> class ResetAction final : public Action<Ts...>, public Parented<CC1101Component> {
133 public:
134 void play(const Ts &...x) override { this->parent_->reset(); }
135};
136
137template<typename... Ts> class SetIdleAction final : public Action<Ts...>, public Parented<CC1101Component> {
138 public:
139 void play(const Ts &...x) override { this->parent_->set_idle(); }
140};
141
142template<typename... Ts> class SendPacketAction final : public Action<Ts...>, public Parented<CC1101Component> {
143 public:
144 void set_data_template(std::function<std::vector<uint8_t>(Ts...)> func) { this->data_func_ = func; }
145 void set_data_static(const uint8_t *data, size_t len) {
146 this->data_static_ = data;
147 this->data_static_len_ = len;
148 }
149
150 void play(const Ts &...x) override {
151 if (this->data_func_) {
152 auto data = this->data_func_(x...);
153 this->parent_->transmit_packet(data);
154 } else if (this->data_static_ != nullptr) {
155 std::vector<uint8_t> data(this->data_static_, this->data_static_ + this->data_static_len_);
156 this->parent_->transmit_packet(data);
157 }
158 }
159
160 protected:
161 std::function<std::vector<uint8_t>(Ts...)> data_func_{};
162 const uint8_t *data_static_{nullptr};
164};
165
166template<typename... Ts> class SetSymbolRateAction final : public Action<Ts...>, public Parented<CC1101Component> {
167 public:
168 TEMPLATABLE_VALUE(float, symbol_rate)
169 void play(const Ts &...x) override { this->parent_->set_symbol_rate(this->symbol_rate_.value(x...)); }
170};
171
172template<typename... Ts> class SetFrequencyAction final : public Action<Ts...>, public Parented<CC1101Component> {
173 public:
175 void play(const Ts &...x) override { this->parent_->set_frequency(this->frequency_.value(x...)); }
176};
177
178template<typename... Ts> class SetOutputPowerAction final : public Action<Ts...>, public Parented<CC1101Component> {
179 public:
180 TEMPLATABLE_VALUE(float, output_power)
181 void play(const Ts &...x) override { this->parent_->set_output_power(this->output_power_.value(x...)); }
182};
183
184template<typename... Ts> class SetModulationTypeAction final : public Action<Ts...>, public Parented<CC1101Component> {
185 public:
187 void play(const Ts &...x) override { this->parent_->set_modulation_type(this->modulation_type_.value(x...)); }
188};
189
190template<typename... Ts> class SetRxAttenuationAction final : public Action<Ts...>, public Parented<CC1101Component> {
191 public:
193 void play(const Ts &...x) override { this->parent_->set_rx_attenuation(this->rx_attenuation_.value(x...)); }
194};
195
196template<typename... Ts>
197class SetDcBlockingFilterAction final : public Action<Ts...>, public Parented<CC1101Component> {
198 public:
199 TEMPLATABLE_VALUE(bool, dc_blocking_filter)
200 void play(const Ts &...x) override { this->parent_->set_dc_blocking_filter(this->dc_blocking_filter_.value(x...)); }
201};
202
203template<typename... Ts> class SetManchesterAction final : public Action<Ts...>, public Parented<CC1101Component> {
204 public:
205 TEMPLATABLE_VALUE(bool, manchester)
206 void play(const Ts &...x) override { this->parent_->set_manchester(this->manchester_.value(x...)); }
207};
208
209template<typename... Ts> class SetFilterBandwidthAction final : public Action<Ts...>, public Parented<CC1101Component> {
210 public:
211 TEMPLATABLE_VALUE(float, filter_bandwidth)
212 void play(const Ts &...x) override { this->parent_->set_filter_bandwidth(this->filter_bandwidth_.value(x...)); }
213};
214
215template<typename... Ts> class SetFskDeviationAction final : public Action<Ts...>, public Parented<CC1101Component> {
216 public:
217 TEMPLATABLE_VALUE(float, fsk_deviation)
218 void play(const Ts &...x) override { this->parent_->set_fsk_deviation(this->fsk_deviation_.value(x...)); }
219};
220
221template<typename... Ts> class SetMskDeviationAction final : public Action<Ts...>, public Parented<CC1101Component> {
222 public:
223 TEMPLATABLE_VALUE(uint8_t, msk_deviation)
224 void play(const Ts &...x) override { this->parent_->set_msk_deviation(this->msk_deviation_.value(x...)); }
225};
226
227template<typename... Ts> class SetChannelAction final : public Action<Ts...>, public Parented<CC1101Component> {
228 public:
229 TEMPLATABLE_VALUE(uint8_t, channel)
230 void play(const Ts &...x) override { this->parent_->set_channel(this->channel_.value(x...)); }
231};
232
233template<typename... Ts> class SetChannelSpacingAction final : public Action<Ts...>, public Parented<CC1101Component> {
234 public:
235 TEMPLATABLE_VALUE(float, channel_spacing)
236 void play(const Ts &...x) override { this->parent_->set_channel_spacing(this->channel_spacing_.value(x...)); }
237};
238
239template<typename... Ts> class SetIfFrequencyAction final : public Action<Ts...>, public Parented<CC1101Component> {
240 public:
241 TEMPLATABLE_VALUE(float, if_frequency)
242 void play(const Ts &...x) override { this->parent_->set_if_frequency(this->if_frequency_.value(x...)); }
243};
244
245} // 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:1875
void play(const Ts &...x) override
Definition cc1101.h:129
void play(const Ts &...x) override
Definition cc1101.h:124
void set_packet_mode(bool value)
Definition cc1101.cpp:675
Trigger< std::vector< uint8_t >, float, float, uint8_t > * get_packet_trigger()
Definition cc1101.h:83
void set_max_dvga_gain(MaxDvgaGain value)
Definition cc1101.cpp:612
void set_whitening(bool value)
Definition cc1101.cpp:724
void set_carrier_sense_above_threshold(bool value)
Definition cc1101.cpp:551
void write_(Register reg)
Definition cc1101.cpp:344
void set_sync0(uint8_t value)
Definition cc1101.cpp:591
void set_freeze(Freeze value)
Definition cc1101.cpp:654
void call_listeners_(const std::vector< uint8_t > &packet, float freq_offset, float rssi, uint8_t lqi)
Definition cc1101.cpp:171
void set_rx_attenuation(RxAttenuation value)
Definition cc1101.cpp:446
InternalGPIOPin * gdo0_pin_
Definition cc1101.h:96
void set_symbol_rate(float value)
Definition cc1101.cpp:532
void register_listener(CC1101Listener *listener)
Definition cc1101.h:82
uint8_t strobe_(Command cmd)
Definition cc1101.cpp:333
void set_sync_mode(SyncMode value)
Definition cc1101.cpp:544
void set_fsk_deviation(float value)
Definition cc1101.cpp:513
void set_msk_deviation(uint8_t value)
Definition cc1101.cpp:524
void set_carrier_sense_rel_thr(CarrierSenseRelThr value)
Definition cc1101.cpp:626
uint8_t pa_table_[PA_TABLE_SIZE]
Definition cc1101.h:91
void set_lna_priority(bool value)
Definition cc1101.cpp:633
void set_output_power(float value)
Definition cc1101.cpp:418
void set_modulation_type(Modulation value)
Definition cc1101.cpp:558
void set_if_frequency(float value)
Definition cc1101.cpp:474
void set_frequency(float value)
Definition cc1101.cpp:460
void set_num_preamble(uint8_t value)
Definition cc1101.cpp:577
void set_hyst_level(HystLevel value)
Definition cc1101.cpp:668
void set_filter_bandwidth(float value)
Definition cc1101.cpp:481
void set_filter_length_fsk_msk(FilterLengthFskMsk value)
Definition cc1101.cpp:640
void set_crc_enable(bool value)
Definition cc1101.cpp:717
static void IRAM_ATTR gpio_intr(CC1101Component *arg)
Definition cc1101.cpp:105
void set_carrier_sense_abs_thr(int8_t value)
Definition cc1101.cpp:619
bool enter_calibrated_(State target_state, Command cmd)
Definition cc1101.cpp:306
void set_magn_target(MagnTarget value)
Definition cc1101.cpp:598
void set_channel_spacing(float value)
Definition cc1101.cpp:501
CC1101Error transmit_packet(const std::vector< uint8_t > &packet)
Definition cc1101.cpp:382
void set_gdo0_pin(InternalGPIOPin *pin)
Definition cc1101.h:37
void set_wait_time(WaitTime value)
Definition cc1101.cpp:661
std::vector< CC1101Listener * > listeners_
Definition cc1101.h:103
void set_dc_blocking_filter(bool value)
Definition cc1101.cpp:453
void set_packet_length(uint8_t value)
Definition cc1101.cpp:704
void set_manchester(bool value)
Definition cc1101.cpp:570
std::vector< uint8_t > packet_
Definition cc1101.h:102
void set_channel(uint8_t value)
Definition cc1101.cpp:492
void set_filter_length_ask_ook(FilterLengthAskOok value)
Definition cc1101.cpp:647
void set_max_lna_gain(MaxLnaGain value)
Definition cc1101.cpp:605
void set_sync1(uint8_t value)
Definition cc1101.cpp:584
bool wait_for_state_(State target_state, uint32_t timeout_ms=100)
Definition cc1101.cpp:293
Trigger< std::vector< uint8_t >, float, float, uint8_t > packet_trigger_
Definition cc1101.h:101
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:134
std::function< std::vector< uint8_t >(Ts...)> data_func_
Definition cc1101.h:161
void set_data_static(const uint8_t *data, size_t len)
Definition cc1101.h:145
void play(const Ts &...x) override
Definition cc1101.h:150
void set_data_template(std::function< std::vector< uint8_t >(Ts...)> func)
Definition cc1101.h:144
TEMPLATABLE_VALUE(uint8_t, channel) void play(const Ts &...x) override
Definition cc1101.h:229
TEMPLATABLE_VALUE(float, channel_spacing) void play(const Ts &...x) override
Definition cc1101.h:235
TEMPLATABLE_VALUE(bool, dc_blocking_filter) void play(const Ts &...x) override
Definition cc1101.h:199
TEMPLATABLE_VALUE(float, filter_bandwidth) void play(const Ts &...x) override
Definition cc1101.h:211
TEMPLATABLE_VALUE(float, frequency) void play(const Ts &...x) override
Definition cc1101.h:174
TEMPLATABLE_VALUE(float, fsk_deviation) void play(const Ts &...x) override
Definition cc1101.h:217
void play(const Ts &...x) override
Definition cc1101.h:139
TEMPLATABLE_VALUE(float, if_frequency) void play(const Ts &...x) override
Definition cc1101.h:241
TEMPLATABLE_VALUE(bool, manchester) void play(const Ts &...x) override
Definition cc1101.h:205
TEMPLATABLE_VALUE(Modulation, modulation_type) void play(const Ts &...x) override
Definition cc1101.h:186
TEMPLATABLE_VALUE(uint8_t, msk_deviation) void play(const Ts &...x) override
Definition cc1101.h:223
TEMPLATABLE_VALUE(float, output_power) void play(const Ts &...x) override
Definition cc1101.h:180
TEMPLATABLE_VALUE(RxAttenuation, rx_attenuation) void play(const Ts &...x) override
Definition cc1101.h:192
TEMPLATABLE_VALUE(float, symbol_rate) void play(const Ts &...x) override
Definition cc1101.h:168
The SPIDevice is what components using the SPI will create.
Definition spi.h:429
const void size_t len
Definition hal.h:64
static void uint32_t
uint16_t length
Definition tt21100.cpp:0
uint16_t x
Definition tt21100.cpp:5