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
MycilaDimmerBurstFire.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 BurstFireDimmer : public Dimmer {
12 public:
13 virtual ~BurstFireDimmer() { 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("MycilaDimmerBurstFire", "setSemiPeriod: semiPeriod must be > 0");
31 }
32 assert(semiPeriod > 0);
33 _semiPeriod = semiPeriod;
34 }
35
39 uint16_t getSemiPeriod() const { return _semiPeriod; }
40
46 virtual void begin();
47
53 virtual void end();
54
55 virtual const char* type() const { return "burst-fire"; }
56
75 static void onZeroCross(int16_t delayUntilZero, void* args);
76
77#ifdef MYCILA_JSON_SUPPORT
83 void toJson(const JsonObject& root) const override {
84 Dimmer::toJson(root);
85 root["dimmer_pin"] = _pin;
86 root["dimmer_semi_period"] = _semiPeriod;
87 }
88#endif
89
90 protected:
91 virtual bool _apply() {
92 // if (!_online || !_semiPeriod || _dutyCycleFire == 0) {
93 // _delay = UINT16_MAX;
94 // return _enabled;
95 // }
96 // if (_dutyCycleFire == 1) {
97 // _delay = 0;
98 // return _enabled;
99 // }
100 // _delay = (1.0f - _dutyCycleFire) * static_cast<float>(_semiPeriod);
101 return _enabled;
102 }
103
104 private:
105 gpio_num_t _pin = GPIO_NUM_NC;
106
107 static bool _fireTimerISR(gptimer_handle_t timer, const gptimer_alarm_event_data_t* event, void* arg);
108 static void _registerDimmer(Mycila::BurstFireDimmer* dimmer);
109 static void _unregisterDimmer(Mycila::BurstFireDimmer* dimmer);
110 };
111} // namespace Mycila
virtual void begin()
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.
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...
virtual void end()
Disable the dimmer.
gpio_num_t getPin() const
Get the GPIO pin used for the dimmer.
uint16_t getSemiPeriod() const
Get the semi-period of the grid frequency in us.