ESPHome 2026.11.0-dev
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 // Frequency offset compensation and bit synchronization settings
75 void set_foc_bs_cs_gate(bool value);
76 void set_foc_limit(FocLimit value);
77 void set_foc_pre_k(FocPreK value);
78 void set_foc_post_k(FocPostK value);
79 void set_bs_limit(BsLimit value);
80 void set_bs_pre_ki(BsPreKi value);
81 void set_bs_pre_kp(BsPreKp value);
82 void set_bs_post_ki(BsPostKi value);
83 void set_bs_post_kp(BsPostKp value);
84
85 // Packet mode settings
86 void set_packet_mode(bool value);
87 void set_packet_length(uint8_t value);
88 void set_crc_enable(bool value);
89 void set_whitening(bool value);
90
91 // Packet mode operations
92 CC1101Error transmit_packet(const std::vector<uint8_t> &packet) {
93 return this->transmit_packet(packet.data(), packet.size());
94 }
95 CC1101Error transmit_packet(const uint8_t *data, size_t len);
96 void register_listener(CC1101Listener *listener) { this->listeners_.push_back(listener); }
97 Trigger<std::vector<uint8_t>, float, float, uint8_t> *get_packet_trigger() { return &this->packet_trigger_; }
98
99 protected:
100 uint16_t chip_id_{0};
101 bool initialized_{false};
102
105 uint8_t pa_table_[PA_TABLE_SIZE]{};
106
107 CC1101State state_;
108
109 // GDO pin for packet reception
111 static void IRAM_ATTR gpio_intr(CC1101Component *arg);
112
113 // Packet handling
114 void call_listeners_(const std::vector<uint8_t> &packet, float freq_offset, float rssi, uint8_t lqi);
116 std::vector<uint8_t> packet_;
117 std::vector<CC1101Listener *> listeners_;
118
119 // Low-level Helpers
120 uint8_t strobe_(Command cmd);
121 void write_(Register reg);
122 void write_(Register reg, uint8_t value);
123 void write_(Register reg, const uint8_t *buffer, size_t length);
124 void read_(Register reg);
125 void read_(Register reg, uint8_t *buffer, size_t length);
126
127 // State Management
128 bool wait_for_state_(State target_state, uint32_t timeout_ms = 100);
129 bool enter_calibrated_(State target_state, Command cmd);
130 void enter_idle_();
131 bool enter_rx_();
132 bool enter_tx_();
133};
134
135// Action Wrappers
136template<typename... Ts> class SendPacketAction final : public Action<Ts...>, public Parented<CC1101Component> {
137 TEMPLATABLE_BYTES(data)
138
139 void play(const Ts &...x) override {
140 this->data_.visit([this](const uint8_t *data, size_t len) { this->parent_->transmit_packet(data, len); }, x...);
141 }
142};
143
144} // namespace esphome::cc1101
virtual void play(const Ts &...x)=0
Helper class to easily give an object a parent of type T.
Definition helpers.h:1997
void set_bs_post_kp(BsPostKp value)
Definition cc1101.cpp:757
void set_packet_mode(bool value)
Definition cc1101.cpp:764
Trigger< std::vector< uint8_t >, float, float, uint8_t > * get_packet_trigger()
Definition cc1101.h:97
void set_max_dvga_gain(MaxDvgaGain value)
Definition cc1101.cpp:638
void set_whitening(bool value)
Definition cc1101.cpp:813
void set_carrier_sense_above_threshold(bool value)
Definition cc1101.cpp:577
void write_(Register reg)
Definition cc1101.cpp:356
void set_sync0(uint8_t value)
Definition cc1101.cpp:617
void set_freeze(Freeze value)
Definition cc1101.cpp:680
void call_listeners_(const std::vector< uint8_t > &packet, float freq_offset, float rssi, uint8_t lqi)
Definition cc1101.cpp:177
void set_rx_attenuation(RxAttenuation value)
Definition cc1101.cpp:472
InternalGPIOPin * gdo0_pin_
Definition cc1101.h:110
void set_symbol_rate(float value)
Definition cc1101.cpp:558
void register_listener(CC1101Listener *listener)
Definition cc1101.h:96
void set_bs_pre_ki(BsPreKi value)
Definition cc1101.cpp:736
uint8_t strobe_(Command cmd)
Definition cc1101.cpp:345
void set_sync_mode(SyncMode value)
Definition cc1101.cpp:570
void set_fsk_deviation(float value)
Definition cc1101.cpp:539
void set_bs_pre_kp(BsPreKp value)
Definition cc1101.cpp:743
void set_msk_deviation(uint8_t value)
Definition cc1101.cpp:550
void set_carrier_sense_rel_thr(CarrierSenseRelThr value)
Definition cc1101.cpp:652
uint8_t pa_table_[PA_TABLE_SIZE]
Definition cc1101.h:105
void set_lna_priority(bool value)
Definition cc1101.cpp:659
void set_foc_bs_cs_gate(bool value)
Definition cc1101.cpp:701
void set_foc_pre_k(FocPreK value)
Definition cc1101.cpp:715
void set_output_power(float value)
Definition cc1101.cpp:444
void set_modulation_type(Modulation value)
Definition cc1101.cpp:584
void set_if_frequency(float value)
Definition cc1101.cpp:500
void set_frequency(float value)
Definition cc1101.cpp:486
void set_num_preamble(uint8_t value)
Definition cc1101.cpp:603
void set_hyst_level(HystLevel value)
Definition cc1101.cpp:694
void set_filter_bandwidth(float value)
Definition cc1101.cpp:507
void set_filter_length_fsk_msk(FilterLengthFskMsk value)
Definition cc1101.cpp:666
void set_crc_enable(bool value)
Definition cc1101.cpp:806
static void IRAM_ATTR gpio_intr(CC1101Component *arg)
Definition cc1101.cpp:111
void set_carrier_sense_abs_thr(int8_t value)
Definition cc1101.cpp:645
void set_bs_post_ki(BsPostKi value)
Definition cc1101.cpp:750
bool enter_calibrated_(State target_state, Command cmd)
Definition cc1101.cpp:318
void set_magn_target(MagnTarget value)
Definition cc1101.cpp:624
void set_channel_spacing(float value)
Definition cc1101.cpp:527
CC1101Error transmit_packet(const std::vector< uint8_t > &packet)
Definition cc1101.h:92
void set_gdo0_pin(InternalGPIOPin *pin)
Definition cc1101.h:37
void set_wait_time(WaitTime value)
Definition cc1101.cpp:687
std::vector< CC1101Listener * > listeners_
Definition cc1101.h:117
void set_dc_blocking_filter(bool value)
Definition cc1101.cpp:479
void set_packet_length(uint8_t value)
Definition cc1101.cpp:793
void set_manchester(bool value)
Definition cc1101.cpp:596
std::vector< uint8_t > packet_
Definition cc1101.h:116
void set_channel(uint8_t value)
Definition cc1101.cpp:518
void set_foc_limit(FocLimit value)
Definition cc1101.cpp:708
void set_filter_length_ask_ook(FilterLengthAskOok value)
Definition cc1101.cpp:673
void set_max_lna_gain(MaxLnaGain value)
Definition cc1101.cpp:631
void set_sync1(uint8_t value)
Definition cc1101.cpp:610
bool wait_for_state_(State target_state, uint32_t timeout_ms=100)
Definition cc1101.cpp:305
void set_bs_limit(BsLimit value)
Definition cc1101.cpp:729
void set_foc_post_k(FocPostK value)
Definition cc1101.cpp:722
Trigger< std::vector< uint8_t >, float, float, uint8_t > packet_trigger_
Definition cc1101.h:115
virtual void on_packet(const std::vector< uint8_t > &packet, float freq_offset, float rssi, uint8_t lqi)=0
The SPIDevice is what components using the SPI will create.
Definition spi.h:450
uint32_t buffer
Definition gif.cpp:50
const void size_t len
Definition hal.h:68
static void uint32_t
uint16_t x
Definition tt21100.cpp:5