ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
max6956.cpp
Go to the documentation of this file.
1#include "max6956.h"
2#include "esphome/core/log.h"
3
4namespace esphome::max6956 {
5
6static const char *const TAG = "max6956";
7
12
15const uint8_t MASK_CONFIG_CURRENT = 0x40;
16const uint8_t MASK_CURRENT_PIN = 0x0F;
17
18/**************************************
19 * MAX6956 *
20 **************************************/
22 uint8_t configuration;
23 if (!this->read_reg_(MAX6956_CONFIGURATION, &configuration)) {
24 this->mark_failed();
25 return;
26 }
27
30
33 this->read_reg_(MAX6956_CONFIGURATION, &configuration);
34 ESP_LOGD(TAG, "Initial reg[0x%.2X]=0x%.2X", MAX6956_CONFIGURATION, configuration);
35 configuration = configuration | MASK_NORMAL_OPERATION;
36 this->write_reg_(MAX6956_CONFIGURATION, configuration);
37
38 ESP_LOGCONFIG(TAG, "Enabling normal operation");
39 ESP_LOGD(TAG, "setup reg[0x%.2X]=0x%.2X", MAX6956_CONFIGURATION, configuration);
40}
41
42bool MAX6956::digital_read(uint8_t pin) {
43 uint8_t reg_addr = MAX6956_1PORT_VALUE_START + pin;
44 uint8_t value = 0;
45 this->read_reg_(reg_addr, &value);
46 return (value & MASK_1PORT_VALUE);
47}
48
49void MAX6956::digital_write(uint8_t pin, bool value) {
50 uint8_t reg_addr = MAX6956_1PORT_VALUE_START + pin;
51 this->write_reg_(reg_addr, value);
52}
53
55 uint8_t reg_addr = MAX6956_PORT_CONFIG_START + (pin - MAX6956_MIN) / 4;
56 uint8_t config = 0;
57 uint8_t shift = 2 * (pin % 4);
59
60 if (flags == gpio::FLAG_INPUT) {
62 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLUP)) {
64 } else if (flags == gpio::FLAG_OUTPUT) {
66 }
67
68 this->read_reg_(reg_addr, &config);
69 config &= ~(MASK_PORT_CONFIG << shift);
70 config |= (mode << shift);
71 this->write_reg_(reg_addr, config);
72}
73
75 uint8_t reg_addr = MAX6956_PORT_CONFIG_START + (pin - MAX6956_MIN) / 4;
76 uint8_t config = 0;
77 uint8_t shift = 2 * (pin % 4);
79
80 if (flags == max6956::FLAG_LED) {
82 }
83
84 this->read_reg_(reg_addr, &config);
85 config &= ~(MASK_PORT_CONFIG << shift);
86 config |= (mode << shift);
87 this->write_reg_(reg_addr, config);
88}
89
90void MAX6956::set_brightness_global(uint8_t current) {
91 if (current > 15) {
92 ESP_LOGE(TAG, "Global brightness out off range (%u)", current);
93 return;
94 }
95 global_brightness_ = current;
96}
97
99
101
103 uint8_t reg_addr = MAX6956_CONFIGURATION;
104 uint8_t config = 0;
105
106 this->read_reg_(reg_addr, &config);
107 config &= ~MASK_CONFIG_CURRENT;
108 config |= brightness_mode_ << 6;
109 this->write_reg_(reg_addr, config);
110}
111
112void MAX6956::set_pin_brightness(uint8_t pin, float brightness) {
113 if (pin < MAX6956_MIN || pin > MAX6956_MAX)
114 return;
115 uint8_t reg_addr = MAX6956_CURRENT_START + (pin - MAX6956_MIN) / 2;
116 uint8_t config = 0;
117 uint8_t shift = 4 * (pin % 2);
118 uint8_t bright = roundf(brightness * 15);
119
120 if (prev_bright_[pin - MAX6956_MIN] == bright)
121 return;
122
123 prev_bright_[pin - MAX6956_MIN] = bright;
124
125 this->read_reg_(reg_addr, &config);
126 config &= ~(MASK_CURRENT_PIN << shift);
127 config |= (bright << shift);
128 this->write_reg_(reg_addr, config);
129}
130
131bool MAX6956::read_reg_(uint8_t reg, uint8_t *value) {
132 if (this->is_failed())
133 return false;
134
135 return this->read_byte(reg, value);
136}
137
138bool MAX6956::write_reg_(uint8_t reg, uint8_t value) {
139 if (this->is_failed())
140 return false;
141
142 return this->write_byte(reg, value);
143}
144
146 ESP_LOGCONFIG(TAG, "MAX6956");
147
149 ESP_LOGCONFIG(TAG,
150 " Current mode: global\n"
151 " Brightness: %u",
153 } else {
154 ESP_LOGCONFIG(TAG, " Current mode: segment");
155 }
156}
157
158/**************************************
159 * MAX6956GPIOPin *
160 **************************************/
163bool MAX6956GPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) != this->inverted_; }
164void MAX6956GPIOPin::digital_write(bool value) { this->parent_->digital_write(this->pin_, value != this->inverted_); }
165size_t MAX6956GPIOPin::dump_summary(char *buffer, size_t len) const {
166 return buf_append_printf(buffer, len, 0, "%u via Max6956", this->pin_);
167}
168
169} // namespace esphome::max6956
BedjetMode mode
BedJet operating mode.
void mark_failed()
Mark this component as failed.
bool is_failed() const
Definition component.h:272
bool write_byte(uint8_t a_register, uint8_t data) const
Definition i2c.h:265
bool read_byte(uint8_t a_register, uint8_t *data)
Definition i2c.h:240
size_t dump_summary(char *buffer, size_t len) const override
Definition max6956.cpp:165
void digital_write(bool value) override
Definition max6956.cpp:164
void pin_mode(gpio::Flags flags) override
Definition max6956.cpp:162
bool read_reg_(uint8_t reg, uint8_t *value)
Definition max6956.cpp:131
void digital_write(uint8_t pin, bool value)
Definition max6956.cpp:49
void set_brightness_global(uint8_t current)
Definition max6956.cpp:90
void dump_config() override
Definition max6956.cpp:145
bool digital_read(uint8_t pin)
Definition max6956.cpp:42
void set_pin_brightness(uint8_t pin, float brightness)
Definition max6956.cpp:112
max6956::MAX6956CURRENTMODE brightness_mode_
Definition max6956.h:65
void setup() override
Definition max6956.cpp:21
void pin_mode(uint8_t pin, gpio::Flags flags)
Definition max6956.cpp:54
bool write_reg_(uint8_t reg, uint8_t value)
Definition max6956.cpp:138
void set_brightness_mode(max6956::MAX6956CURRENTMODE brightness_mode)
Definition max6956.cpp:100
uint16_t flags
@ FLAG_OUTPUT
Definition gpio.h:28
@ FLAG_PULLUP
Definition gpio.h:30
@ FLAG_INPUT
Definition gpio.h:27
@ MAX6956_GLOBAL_CURRENT
Definition max6956.h:24
@ MAX6956_CONFIGURATION
Definition max6956.h:25
@ MAX6956_1PORT_VALUE_START
Definition max6956.h:30
@ MAX6956_PORT_CONFIG_START
Definition max6956.h:28
@ MAX6956_CURRENT_START
Definition max6956.h:29
const uint32_t MASK_INDIVIDUAL_CURRENT
Definition max6956.cpp:10
const uint32_t MASK_NORMAL_OPERATION
Definition max6956.cpp:11
const uint32_t MASK_1PORT_VALUE
Definition max6956.cpp:13
MAX6956GPIOMode
Modes for MAX6956 pins.
Definition max6956.h:10
const uint8_t MASK_CONFIG_CURRENT
Definition max6956.cpp:15
const uint8_t MASK_CURRENT_PIN
Definition max6956.cpp:16
const uint32_t MASK_PORT_CONFIG
Definition max6956.cpp:14
const uint32_t MASK_TRANSITION_DETECTION
Masks for MAX6956 Configuration register.
Definition max6956.cpp:9
const void size_t len
Definition hal.h:64
static void uint32_t