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
30 bool begin() override;
31
37 void end() override;
38
39 const char* type() const override { return "cycle-stealing"; }
40
41 bool calculateMetrics(Metrics& metrics, float gridVoltage, float loadResistance) const override {
42 // return isEnabled() && _calculatePhaseControlMetrics(metrics, _dutyCycleFire, gridVoltage, loadResistance);
43 return isEnabled();
44 }
45
64 static void onZeroCross(int16_t delayUntilZero, void* args);
65
66#ifdef MYCILA_JSON_SUPPORT
72 void toJson(const JsonObject& root) const override {
73 Dimmer::toJson(root);
74 root["pin"] = _pin;
75 }
76#endif
77
78 protected:
79 bool _apply() override;
80
81 bool _calculateHarmonics(float* array, size_t n) const override {
82 for (size_t i = 0; i < n; i++) {
83 array[i] = 0.0f;
84 }
85 return true;
86 }
87
88 private:
89 gpio_num_t _pin = GPIO_NUM_NC;
90 bool _running = false;
91
92 struct RegisteredDimmer {
93 CycleStealingDimmer* dimmer = nullptr;
94 RegisteredDimmer* prev = nullptr;
95 RegisteredDimmer* next = nullptr;
96 };
97
98 static struct RegisteredDimmer* dimmers;
99 static bool _fireTimerISR(gptimer_handle_t timer, const gptimer_alarm_event_data_t* event, void* arg);
100 static void _registerDimmer(Mycila::CycleStealingDimmer* dimmer);
101 static void _unregisterDimmer(Mycila::CycleStealingDimmer* dimmer);
102 };
103} // namespace Mycila
void end() override
Disable the dimmer.
bool begin() override
Enable a dimmer on a specific GPIO pin.
static void onZeroCross(int16_t delayUntilZero, void *args)
void setPin(gpio_num_t pin)
Set the GPIO pin to use for the dimmer.
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).