MycilaJSY 13.0.0
Arduino / ESP32 library for the JSY1031, JSY-MK-163, JSY-MK-193, JSY-MK-194, JSY-MK-227, JSY-MK-229, JSY-MK-333 families single-phase and three-phase AC bidirectional meters from Shenzhen Jiansiyan Technologies Co, Ltd.
Loading...
Searching...
No Matches
MycilaDimmerCycleStealing.h
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright (C) 2023-2025 Mathieu Carbou
4 */
5#pragma once
6
7#include "MycilaDimmer.h"
8#include <driver/gptimer_types.h>
9
10namespace Mycila {
11 class CycleStealingDimmer : public Dimmer {
12 public:
13 virtual ~CycleStealingDimmer() { end(); }
14
18 void setPin(gpio_num_t pin) { _pin = pin; }
19
23 gpio_num_t getPin() const { return _pin; }
24
28 void setSemiPeriod(uint16_t semiPeriod) {
29 if (semiPeriod == 0) {
30 ESP_LOGE("CycleStealing", "setSemiPeriod: semiPeriod must be > 0");
31 }
32 assert(semiPeriod > 0);
33 _semiPeriod = semiPeriod;
34 }
35
39 uint16_t getSemiPeriod() const { return _semiPeriod; }
40
46 void begin() override;
47
53 void end() override;
54
55 const char* type() const override { return "cycle-stealing"; }
56
57 bool calculateMetrics(Metrics& metrics, float gridVoltage, float loadResistance) const override {
58 // return isEnabled() && _calculatePhaseControlMetrics(metrics, _dutyCycleFire, gridVoltage, loadResistance);
59 return isEnabled();
60 }
61
80 static void onZeroCross(int16_t delayUntilZero, void* args);
81
82#ifdef MYCILA_JSON_SUPPORT
88 void toJson(const JsonObject& root) const override {
89 Dimmer::toJson(root);
90 root["dimmer_pin"] = _pin;
91 root["dimmer_semi_period"] = _semiPeriod;
92 }
93#endif
94
95 protected:
96 bool _apply() override;
97
98 bool _calculateHarmonics(float* array, size_t n) const override {
99 for (size_t i = 0; i < n; i++) {
100 array[i] = 0.0f;
101 }
102 return true;
103 }
104
105 private:
106 gpio_num_t _pin = GPIO_NUM_NC;
107 bool _running = false;
108
109 static bool _fireTimerISR(gptimer_handle_t timer, const gptimer_alarm_event_data_t* event, void* arg);
110 static void _registerDimmer(Mycila::CycleStealingDimmer* dimmer);
111 static void _unregisterDimmer(Mycila::CycleStealingDimmer* dimmer);
112 };
113} // namespace Mycila
void begin() override
Enable a dimmer on a specific GPIO pin.
void end() override
Disable the dimmer.
static void onZeroCross(int16_t delayUntilZero, void *args)
void setPin(gpio_num_t pin)
Set the GPIO pin to use for the dimmer.
uint16_t getSemiPeriod() const
Get the semi-period of the grid frequency in us.
void setSemiPeriod(uint16_t semiPeriod)
Set the semi-period of the grid frequency in us. It cannot be zero and it is required for proper dimm...
gpio_num_t getPin() const
Get the GPIO pin used for the dimmer.
bool isEnabled() const
Check if the dimmer is enabled (if it was able to initialize correctly).