ESPHome 2025.9.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 {
5namespace max6956 {
6
7static const char *const TAG = "max6956";
8
10const uint32_t MASK_TRANSITION_DETECTION = 0x80;
11const uint32_t MASK_INDIVIDUAL_CURRENT = 0x40;
12const uint32_t MASK_NORMAL_OPERATION = 0x01;
13
14const uint32_t MASK_1PORT_VALUE = 0x03;
15const uint32_t MASK_PORT_CONFIG = 0x03;
16const uint8_t MASK_CONFIG_CURRENT = 0x40;
17const uint8_t MASK_CURRENT_PIN = 0x0F;
18
19/**************************************
20 * MAX6956 *
21 **************************************/
23 uint8_t configuration;
24 if (!this->read_reg_(MAX6956_CONFIGURATION, &configuration)) {
25 this->mark_failed();
26 return;
27 }
28
31
34 this->read_reg_(MAX6956_CONFIGURATION, &configuration);
35 ESP_LOGD(TAG, "Initial reg[0x%.2X]=0x%.2X", MAX6956_CONFIGURATION, configuration);
36 configuration = configuration | MASK_NORMAL_OPERATION;
37 this->write_reg_(MAX6956_CONFIGURATION, configuration);
38
39 ESP_LOGCONFIG(TAG, "Enabling normal operation");
40 ESP_LOGD(TAG, "setup reg[0x%.2X]=0x%.2X", MAX6956_CONFIGURATION, configuration);
41}
42
43bool MAX6956::digital_read(uint8_t pin) {
44 uint8_t reg_addr = MAX6956_1PORT_VALUE_START + pin;
45 uint8_t value = 0;
46 this->read_reg_(reg_addr, &value);
47 return (value & MASK_1PORT_VALUE);
48}
49
50void MAX6956::digital_write(uint8_t pin, bool value) {
51 uint8_t reg_addr = MAX6956_1PORT_VALUE_START + pin;
52 this->write_reg_(reg_addr, value);
53}
54
55void MAX6956::pin_mode(uint8_t pin, gpio::Flags flags) {
56 uint8_t reg_addr = MAX6956_PORT_CONFIG_START + (pin - MAX6956_MIN) / 4;
57 uint8_t config = 0;
58 uint8_t shift = 2 * (pin % 4);
60
61 if (flags == gpio::FLAG_INPUT) {
63 } else if (flags == (gpio::FLAG_INPUT | gpio::FLAG_PULLUP)) {
65 } else if (flags == gpio::FLAG_OUTPUT) {
67 }
68
69 this->read_reg_(reg_addr, &config);
70 config &= ~(MASK_PORT_CONFIG << shift);
71 config |= (mode << shift);
72 this->write_reg_(reg_addr, config);
73}
74
76 uint8_t reg_addr = MAX6956_PORT_CONFIG_START + (pin - MAX6956_MIN) / 4;
77 uint8_t config = 0;
78 uint8_t shift = 2 * (pin % 4);
80
81 if (flags == max6956::FLAG_LED) {
83 }
84
85 this->read_reg_(reg_addr, &config);
86 config &= ~(MASK_PORT_CONFIG << shift);
87 config |= (mode << shift);
88 this->write_reg_(reg_addr, config);
89}
90
91void MAX6956::set_brightness_global(uint8_t current) {
92 if (current > 15) {
93 ESP_LOGE(TAG, "Global brightness out off range (%u)", current);
94 return;
95 }
96 global_brightness_ = current;
97}
98
100
102
104 uint8_t reg_addr = MAX6956_CONFIGURATION;
105 uint8_t config = 0;
106
107 this->read_reg_(reg_addr, &config);
108 config &= ~MASK_CONFIG_CURRENT;
109 config |= brightness_mode_ << 6;
110 this->write_reg_(reg_addr, config);
111}
112
113void MAX6956::set_pin_brightness(uint8_t pin, float brightness) {
114 uint8_t reg_addr = MAX6956_CURRENT_START + (pin - MAX6956_MIN) / 2;
115 uint8_t config = 0;
116 uint8_t shift = 4 * (pin % 2);
117 uint8_t bright = roundf(brightness * 15);
118
119 if (prev_bright_[pin - MAX6956_MIN] == bright)
120 return;
121
122 prev_bright_[pin - MAX6956_MIN] = bright;
123
124 this->read_reg_(reg_addr, &config);
125 config &= ~(MASK_CURRENT_PIN << shift);
126 config |= (bright << shift);
127 this->write_reg_(reg_addr, config);
128}
129
130bool MAX6956::read_reg_(uint8_t reg, uint8_t *value) {
131 if (this->is_failed())
132 return false;
133
134 return this->read_byte(reg, value);
135}
136
137bool MAX6956::write_reg_(uint8_t reg, uint8_t value) {
138 if (this->is_failed())
139 return false;
140
141 return this->write_byte(reg, value);
142}
143
145 ESP_LOGCONFIG(TAG, "MAX6956");
146
148 ESP_LOGCONFIG(TAG,
149 "current mode: global\n"
150 "global brightness: %u",
152 } else {
153 ESP_LOGCONFIG(TAG, "current mode: segment");
154 }
155}
156
157/**************************************
158 * MAX6956GPIOPin *
159 **************************************/
161void MAX6956GPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); }
162bool MAX6956GPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) != this->inverted_; }
163void MAX6956GPIOPin::digital_write(bool value) { this->parent_->digital_write(this->pin_, value != this->inverted_); }
164std::string MAX6956GPIOPin::dump_summary() const {
165 char buffer[32];
166 snprintf(buffer, sizeof(buffer), "%u via Max6956", pin_);
167 return buffer;
168}
169
170} // namespace max6956
171} // namespace esphome
BedjetMode mode
BedJet operating mode.
virtual void mark_failed()
Mark this component as failed.
bool is_failed() const
bool write_byte(uint8_t a_register, uint8_t data, bool stop=true)
Definition i2c.h:266
bool read_byte(uint8_t a_register, uint8_t *data, bool stop=true)
Definition i2c.h:239
std::string dump_summary() const override
Definition max6956.cpp:164
void digital_write(bool value) override
Definition max6956.cpp:163
void pin_mode(gpio::Flags flags) override
Definition max6956.cpp:161
bool read_reg_(uint8_t reg, uint8_t *value)
Definition max6956.cpp:130
void digital_write(uint8_t pin, bool value)
Definition max6956.cpp:50
void set_brightness_global(uint8_t current)
Definition max6956.cpp:91
void dump_config() override
Definition max6956.cpp:144
bool digital_read(uint8_t pin)
Definition max6956.cpp:43
void set_pin_brightness(uint8_t pin, float brightness)
Definition max6956.cpp:113
max6956::MAX6956CURRENTMODE brightness_mode_
Definition max6956.h:66
void setup() override
Definition max6956.cpp:22
void pin_mode(uint8_t pin, gpio::Flags flags)
Definition max6956.cpp:55
bool write_reg_(uint8_t reg, uint8_t value)
Definition max6956.cpp:137
void set_brightness_mode(max6956::MAX6956CURRENTMODE brightness_mode)
Definition max6956.cpp:101
@ FLAG_OUTPUT
Definition gpio.h:19
@ FLAG_PULLUP
Definition gpio.h:21
@ FLAG_INPUT
Definition gpio.h:18
@ MAX6956_GLOBAL_CURRENT
Definition max6956.h:25
@ MAX6956_CONFIGURATION
Definition max6956.h:26
@ MAX6956_1PORT_VALUE_START
Definition max6956.h:31
@ MAX6956_PORT_CONFIG_START
Definition max6956.h:29
@ MAX6956_CURRENT_START
Definition max6956.h:30
const uint32_t MASK_INDIVIDUAL_CURRENT
Definition max6956.cpp:11
const uint32_t MASK_NORMAL_OPERATION
Definition max6956.cpp:12
const uint32_t MASK_1PORT_VALUE
Definition max6956.cpp:14
MAX6956GPIOMode
Modes for MAX6956 pins.
Definition max6956.h:11
const uint8_t MASK_CONFIG_CURRENT
Definition max6956.cpp:16
const uint8_t MASK_CURRENT_PIN
Definition max6956.cpp:17
const uint32_t MASK_PORT_CONFIG
Definition max6956.cpp:15
const uint32_t MASK_TRANSITION_DETECTION
Masks for MAX6956 Configuration register.
Definition max6956.cpp:10
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7