21 void setPin(gpio_num_t pin) { _pin = pin; }
26 gpio_num_t
getPin()
const {
return _pin; }
34 uint16_t
getFiringDelay()
const {
return _delay > _semiPeriod ? _semiPeriod : _delay; }
41 float getPhaseAngle()
const {
return _delay >= _semiPeriod ? 180 : 180 * _delay / _semiPeriod; }
49 bool begin()
override;
58 const char* type()
const override {
return "thyristor"; }
60 bool calculateMetrics(Metrics& metrics,
float gridVoltage,
float loadResistance)
const override {
61 return isEnabled() && _calculatePhaseControlMetrics(metrics, _dutyCycleFire, gridVoltage, loadResistance);
74 static void onZeroCross(int16_t delayUntilZero,
void* args);
76#ifdef MYCILA_JSON_SUPPORT
82 void toJson(
const JsonObject& root)
const override {
91 bool _apply()
override {
92 if (!_online || !_semiPeriod || _dutyCycleFire == 0) {
96 if (_dutyCycleFire == 1) {
100 _delay = (1.0f - _dutyCycleFire) *
static_cast<float>(_semiPeriod);
104 bool _calculateHarmonics(
float* array,
size_t n)
const override {
105 return _calculatePhaseControlHarmonics(_dutyCycleFire, array, n);
109 gpio_num_t _pin = GPIO_NUM_NC;
110 uint16_t _delay = UINT16_MAX;
112 struct RegisteredDimmer {
113 ThyristorDimmer* dimmer =
nullptr;
114 RegisteredDimmer* prev =
nullptr;
115 RegisteredDimmer* next =
nullptr;
116 uint16_t alarm_count = UINT16_MAX;
119 static struct RegisteredDimmer* dimmers;
120 static bool _fireTimerISR(gptimer_handle_t timer,
const gptimer_alarm_event_data_t* event,
void* arg);
121 static void _registerDimmer(Mycila::ThyristorDimmer* dimmer);
122 static void _unregisterDimmer(Mycila::ThyristorDimmer* dimmer);