ESPHome  2024.11.0
remote_transmitter_libretiny.cpp
Go to the documentation of this file.
1 #include "remote_transmitter.h"
2 #include "esphome/core/log.h"
4 
5 #ifdef USE_LIBRETINY
6 
7 namespace esphome {
8 namespace remote_transmitter {
9 
10 static const char *const TAG = "remote_transmitter";
11 
13  this->pin_->setup();
14  this->pin_->digital_write(false);
15 }
16 
18  ESP_LOGCONFIG(TAG, "Remote Transmitter...");
19  ESP_LOGCONFIG(TAG, " Carrier Duty: %u%%", this->carrier_duty_percent_);
20  LOG_PIN(" Pin: ", this->pin_);
21 }
22 
23 void RemoteTransmitterComponent::calculate_on_off_time_(uint32_t carrier_frequency, uint32_t *on_time_period,
24  uint32_t *off_time_period) {
25  if (carrier_frequency == 0) {
26  *on_time_period = 0;
27  *off_time_period = 0;
28  return;
29  }
30  uint32_t period = (1000000UL + carrier_frequency / 2) / carrier_frequency; // round(1000000/freq)
31  period = std::max(uint32_t(1), period);
32  *on_time_period = (period * this->carrier_duty_percent_) / 100;
33  *off_time_period = period - *on_time_period;
34 }
35 
37  const uint32_t current_time = micros();
38  if (this->target_time_ == 0) {
39  this->target_time_ = current_time;
40  } else {
41  while (this->target_time_ > micros()) {
42  // busy loop that ensures micros is constantly called
43  }
44  }
45 }
46 
47 void RemoteTransmitterComponent::mark_(uint32_t on_time, uint32_t off_time, uint32_t usec) {
48  this->await_target_time_();
49  this->pin_->digital_write(true);
50 
51  const uint32_t target = this->target_time_ + usec;
52  if (this->carrier_duty_percent_ < 100 && (on_time > 0 || off_time > 0)) {
53  while (true) { // Modulate with carrier frequency
54  this->target_time_ += on_time;
55  if (this->target_time_ >= target)
56  break;
57  this->await_target_time_();
58  this->pin_->digital_write(false);
59 
60  this->target_time_ += off_time;
61  if (this->target_time_ >= target)
62  break;
63  this->await_target_time_();
64  this->pin_->digital_write(true);
65  }
66  }
67  this->target_time_ = target;
68 }
69 
70 void RemoteTransmitterComponent::space_(uint32_t usec) {
71  this->await_target_time_();
72  this->pin_->digital_write(false);
73  this->target_time_ += usec;
74 }
75 
76 void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t send_wait) {
77  ESP_LOGD(TAG, "Sending remote code...");
78  uint32_t on_time, off_time;
79  this->calculate_on_off_time_(this->temp_.get_carrier_frequency(), &on_time, &off_time);
80  this->target_time_ = 0;
81  this->transmit_trigger_->trigger();
82  for (uint32_t i = 0; i < send_times; i++) {
83  InterruptLock lock;
84  for (int32_t item : this->temp_.get_data()) {
85  if (item > 0) {
86  const auto length = uint32_t(item);
87  this->mark_(on_time, off_time, length);
88  } else {
89  const auto length = uint32_t(-item);
90  this->space_(length);
91  }
92  App.feed_wdt();
93  }
94  this->await_target_time_(); // wait for duration of last pulse
95  this->pin_->digital_write(false);
96 
97  if (i + 1 < send_times)
98  this->target_time_ += send_wait;
99  }
100  this->complete_trigger_->trigger();
101 }
102 
103 } // namespace remote_transmitter
104 } // namespace esphome
105 
106 #endif
virtual void digital_write(bool value)=0
RemoteTransmitData temp_
Use same vector for all transmits, avoids many allocations.
Definition: remote_base.h:173
void calculate_on_off_time_(uint32_t carrier_frequency, uint32_t *on_time_period, uint32_t *off_time_period)
virtual void setup()=0
uint32_t IRAM_ATTR HOT micros()
Definition: core.cpp:27
void trigger(Ts... x)
Inform the parent automation that the event has triggered.
Definition: automation.h:95
void send_internal(uint32_t send_times, uint32_t send_wait) override
Application App
Global storage of Application pointer - only one Application can exist.
uint16_t length
Definition: tt21100.cpp:12
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
const RawTimings & get_data() const
Definition: remote_base.h:36
void mark_(uint32_t on_time, uint32_t off_time, uint32_t usec)