21 void setPin(gpio_num_t pin) { _pin = pin; }
26 gpio_num_t
getPin()
const {
return _pin; }
32 if (semiPeriod == 0) {
33 ESP_LOGE(
"Thyristor",
"setSemiPeriod: semiPeriod must be > 0");
35 assert(semiPeriod > 0);
36 _semiPeriod = semiPeriod;
50 uint16_t
getFiringDelay()
const {
return _delay > _semiPeriod ? _semiPeriod : _delay; }
57 float getPhaseAngle()
const {
return _delay >= _semiPeriod ? 180 : 180 * _delay / _semiPeriod; }
65 void begin()
override;
74 const char* type()
const override {
return "thyristor"; }
76 bool calculateMetrics(Metrics& metrics,
float gridVoltage,
float loadResistance)
const override {
77 return isEnabled() && _calculatePhaseControlMetrics(metrics, _dutyCycleFire, gridVoltage, loadResistance);
90 static void onZeroCross(int16_t delayUntilZero,
void* args);
92#ifdef MYCILA_JSON_SUPPORT
98 void toJson(
const JsonObject& root)
const override {
100 root[
"dimmer_pin"] = _pin;
101 root[
"dimmer_semi_period"] = _semiPeriod;
108 bool _apply()
override {
109 if (!_online || !_semiPeriod || _dutyCycleFire == 0) {
113 if (_dutyCycleFire == 1) {
117 _delay = (1.0f - _dutyCycleFire) *
static_cast<float>(_semiPeriod);
121 bool _calculateHarmonics(
float* array,
size_t n)
const override {
122 return _calculatePhaseControlHarmonics(_dutyCycleFire, array, n);
126 gpio_num_t _pin = GPIO_NUM_NC;
127 uint16_t _delay = UINT16_MAX;
129 static bool _fireTimerISR(gptimer_handle_t timer,
const gptimer_alarm_event_data_t* event,
void* arg);
130 static void _registerDimmer(Mycila::ThyristorDimmer* dimmer);
131 static void _unregisterDimmer(Mycila::ThyristorDimmer* dimmer);