ESPHome 2025.10.0-dev
Loading...
Searching...
No Matches
mcp4461.h
Go to the documentation of this file.
1#pragma once
2
4#include "esphome/core/log.h"
6
7namespace esphome {
8namespace mcp4461 {
9
10struct WiperState {
11 bool enabled = true;
12 uint16_t state = 0;
14 bool terminal_a = true;
15 bool terminal_b = true;
16 bool terminal_w = true;
17 bool terminal_hw = true;
18 bool wiper_lock_active = false;
19 bool update_level = false;
20 bool update_terminal = false;
21};
22
23// default wiper state is 128 / 0x80h
24enum class Mcp4461Commands : uint8_t { WRITE = 0x00, INCREMENT = 0x04, DECREMENT = 0x08, READ = 0x0C };
25
26enum class Mcp4461Addresses : uint8_t {
27 MCP4461_VW0 = 0x00,
28 MCP4461_VW1 = 0x10,
29 MCP4461_VW2 = 0x60,
30 MCP4461_VW3 = 0x70,
31 MCP4461_STATUS = 0x50,
32 MCP4461_TCON0 = 0x40,
33 MCP4461_TCON1 = 0xA0,
34 MCP4461_EEPROM_1 = 0xB0
35};
36
37enum class Mcp4461WiperIdx : uint8_t {
46};
47
48enum class Mcp4461EepromLocation : uint8_t {
54};
55
57
58class Mcp4461Wiper;
59
60// Mcp4461Component
62 public:
63 Mcp4461Component(bool disable_wiper_0, bool disable_wiper_1, bool disable_wiper_2, bool disable_wiper_3)
64 : wiper_0_disabled_(disable_wiper_0),
65 wiper_1_disabled_(disable_wiper_1),
66 wiper_2_disabled_(disable_wiper_2),
67 wiper_3_disabled_(disable_wiper_3) {
68 this->reg_[0].enabled = !wiper_0_disabled_;
69 this->reg_[1].enabled = !wiper_1_disabled_;
70 this->reg_[2].enabled = !wiper_2_disabled_;
71 this->reg_[3].enabled = !wiper_3_disabled_;
72 }
73
74 void setup() override;
75 void dump_config() override;
76 float get_setup_priority() const override { return setup_priority::HARDWARE; }
77 void loop() override;
81 uint16_t get_eeprom_value(Mcp4461EepromLocation location);
85 bool set_eeprom_value(Mcp4461EepromLocation location, uint16_t value);
89 void set_initial_value(Mcp4461WiperIdx wiper, float initial_value);
93 void initialize_terminal_disabled(Mcp4461WiperIdx wiper, char terminal);
96
97 protected:
98 friend class Mcp4461Wiper;
99 bool read_16_(uint8_t address, uint16_t *buf);
101 uint8_t get_wiper_address_(uint8_t wiper);
102 uint16_t read_wiper_level_(uint8_t wiper);
103 uint8_t get_status_register_();
104 uint16_t get_wiper_level_(Mcp4461WiperIdx wiper);
105 bool set_wiper_level_(Mcp4461WiperIdx wiper, uint16_t value);
107 void enable_wiper_(Mcp4461WiperIdx wiper);
111 void enable_terminal_(Mcp4461WiperIdx wiper, char terminal);
112 void disable_terminal_(Mcp4461WiperIdx, char terminal);
113 bool is_writing_();
114 bool is_eeprom_ready_for_writing_(bool wait_if_not_ready);
115 void write_wiper_level_(uint8_t wiper, uint16_t value);
116 bool mcp4461_write_(uint8_t addr, uint16_t data, bool nonvolatile = false);
117 uint8_t calc_terminal_connector_byte_(Mcp4461TerminalIdx terminal_connector);
118 void update_terminal_register_(Mcp4461TerminalIdx terminal_connector);
119 uint8_t get_terminal_register_(Mcp4461TerminalIdx terminal_connector);
120 bool set_terminal_register_(Mcp4461TerminalIdx terminal_connector, uint8_t data);
121
122 // Converts a status to a human readable string
123 static const LogString *get_message_string(int status) {
124 switch (status) {
126 return LOG_STR("I2C error - communication with MCP4461 failed!");
128 return LOG_STR("Status register could not be read");
130 return LOG_STR("Invalid status register value - bits 1,7 or 8 are 0");
132 return LOG_STR("Invalid value for wiper given");
134 return LOG_STR("MCP4461 is write protected. Setting nonvolatile wipers/eeprom values is prohibited.");
136 return LOG_STR("MCP4461 Wiper is already enabled, ignoring cmd to enable.");
138 return LOG_STR("MCP4461 Wiper is disabled. All actions on this wiper are prohibited.");
140 return LOG_STR("MCP4461 Wiper is locked using WiperLock-technology. All actions on this wiper are prohibited.");
142 return LOG_STR("Status OK");
143 default:
144 return LOG_STR("Unknown");
145 }
146 }
147
149 MCP4461_STATUS_OK = 0, // CMD completed successfully
150 MCP4461_FAILED, // component failed
151 MCP4461_STATUS_I2C_ERROR, // Unable to communicate with device
152 MCP4461_STATUS_REGISTER_INVALID, // Status register value was invalid
153 MCP4461_STATUS_REGISTER_ERROR, // Error fetching status register
155 MCP4461_VALUE_INVALID, // Invalid value given for wiper / eeprom
156 MCP4461_WRITE_PROTECTED, // The value was read, but the CRC over the payload (valid and data) does not match
157 MCP4461_WIPER_ENABLED, // The wiper is enabled, discard additional enabling actions
158 MCP4461_WIPER_DISABLED, // The wiper is disabled - all actions for this wiper will be aborted/discarded
159 MCP4461_WIPER_LOCKED, // The wiper is locked using WiperLock-technology - all actions for this wiper will be
160 // aborted/discarded
161 } error_code_{MCP4461_STATUS_OK};
162
165 bool write_protected_{false};
166 bool wiper_0_disabled_{false};
167 bool wiper_1_disabled_{false};
168 bool wiper_2_disabled_{false};
169 bool wiper_3_disabled_{false};
170};
171} // namespace mcp4461
172} // namespace esphome
uint8_t address
Definition bl0906.h:4
uint8_t status
Definition bl0942.h:8
This Class provides the methods to read/write bytes from/to an i2c device.
Definition i2c.h:133
void set_initial_value(Mcp4461WiperIdx wiper, float initial_value)
public function used to set initial value
Definition mcp4461.cpp:39
bool increase_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:324
uint8_t calc_terminal_connector_byte_(Mcp4461TerminalIdx terminal_connector)
Definition mcp4461.cpp:386
uint8_t get_terminal_register_(Mcp4461TerminalIdx terminal_connector)
Definition mcp4461.cpp:400
void update_terminal_register_(Mcp4461TerminalIdx terminal_connector)
Definition mcp4461.cpp:419
uint16_t get_eeprom_value(Mcp4461EepromLocation location)
get eeprom value from location
Definition mcp4461.cpp:522
bool set_eeprom_value(Mcp4461EepromLocation location, uint16_t value)
set eeprom value at specified location
Definition mcp4461.cpp:543
void disable_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:302
void initialize_terminal_disabled(Mcp4461WiperIdx wiper, char terminal)
public function used to set disable terminal config
Definition mcp4461.cpp:44
void enable_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:280
uint16_t read_wiper_level_(uint8_t wiper)
Definition mcp4461.cpp:213
bool mcp4461_write_(uint8_t addr, uint16_t data, bool nonvolatile=false)
Definition mcp4461.cpp:613
bool read_16_(uint8_t address, uint16_t *buf)
Definition mcp4461.cpp:151
enum esphome::mcp4461::Mcp4461Component::ErrorCode MCP4461_STATUS_OK
void enable_terminal_(Mcp4461WiperIdx wiper, char terminal)
Definition mcp4461.cpp:468
bool is_eeprom_ready_for_writing_(bool wait_if_not_ready)
Definition mcp4461.cpp:578
float get_setup_priority() const override
Definition mcp4461.h:76
uint16_t get_wiper_level_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:196
Mcp4461Component(bool disable_wiper_0, bool disable_wiper_1, bool disable_wiper_2, bool disable_wiper_3)
Definition mcp4461.h:63
static const LogString * get_message_string(int status)
Definition mcp4461.h:123
bool update_wiper_level_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:231
uint8_t get_wiper_address_(uint8_t wiper)
Definition mcp4461.cpp:166
void disable_terminal_(Mcp4461WiperIdx, char terminal)
Definition mcp4461.cpp:495
void write_wiper_level_(uint8_t wiper, uint16_t value)
Definition mcp4461.cpp:271
bool decrease_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:355
bool set_terminal_register_(Mcp4461TerminalIdx terminal_connector, uint8_t data)
Definition mcp4461.cpp:446
bool set_wiper_level_(Mcp4461WiperIdx wiper, uint16_t value)
Definition mcp4461.cpp:247
void read_status_register_to_log()
read status register to log
Definition mcp4461.cpp:143
const float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition component.cpp:48
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
optional< float > initial_value
Definition mcp4461.h:13