diff options
| author | cooljqln <cooljqln@noreply.codeberg.org> | 2025-08-15 05:03:17 +0200 |
|---|---|---|
| committer | cooljqln <cooljqln@noreply.codeberg.org> | 2025-08-15 05:03:17 +0200 |
| commit | 28a368ebe07e22fbf071ce882effe9088516a8c6 (patch) | |
| tree | d13241937786b3d422423cc2b804e0ec42b21335 /src/drivers/haptics.cpp | |
| parent | 2b2e595a8fb28e34ec33a98035c31bd4cba76808 (diff) | |
| parent | 73baf2f88f61e307afd6cd17f6727da4e446b64c (diff) | |
| download | tangara-fw-28a368ebe07e22fbf071ce882effe9088516a8c6.tar.gz | |
Merge pull request 'Migrate to the new esp-idf I2C driver' (#424) from jqln/i2c-driver-upgrade into main
Reviewed-on: https://codeberg.org/cool-tech-zone/tangara-fw/pulls/424
Diffstat (limited to 'src/drivers/haptics.cpp')
| -rw-r--r-- | src/drivers/haptics.cpp | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/src/drivers/haptics.cpp b/src/drivers/haptics.cpp index 8e8e5fed..4abf13e4 100644 --- a/src/drivers/haptics.cpp +++ b/src/drivers/haptics.cpp @@ -15,6 +15,7 @@ #include "assert.h" #include "driver/gpio.h" #include "driver/i2c.h" +#include "driver/i2c_master.h" #include "drivers/nvs.hpp" #include "esp_err.h" #include "esp_log.h" @@ -30,6 +31,19 @@ static constexpr char kTag[] = "haptics"; static constexpr uint8_t kHapticsAddress = 0x5A; Haptics::Haptics(NvsStorage& nvs) { + i2c_device_config_t config = { + .dev_addr_length = I2C_ADDR_BIT_LEN_7, + .device_address = kHapticsAddress, + .scl_speed_hz = 100'000, + .scl_wait_us = 0, + .flags = + { + // FIXME: Why does the driver sometimes NACK? + .disable_ack_check = true, + }, + }; + ESP_ERROR_CHECK(i2c_master_bus_add_device(i2c_handle(), &config, &i2c_)); + // Bring the driver out of standby, and put it into calibration mode. WriteRegister(Register::kMode, 0b00000111); @@ -134,13 +148,8 @@ Haptics::Haptics(NvsStorage& nvs) { Haptics::~Haptics() {} void Haptics::WriteRegister(Register reg, uint8_t val) { - uint8_t regRaw = static_cast<uint8_t>(reg); - I2CTransaction transaction; - transaction.start() - .write_addr(kHapticsAddress, I2C_MASTER_WRITE) - .write_ack(regRaw, val) - .stop(); - esp_err_t res = transaction.Execute(1); + uint8_t cmd[] = {static_cast<uint8_t>(reg), val}; + esp_err_t res = i2c_master_transmit(i2c_, cmd, 2, 100); if (res != ESP_OK) { ESP_LOGW(kTag, "write failed: %s", esp_err_to_name(res)); } @@ -148,20 +157,13 @@ void Haptics::WriteRegister(Register reg, uint8_t val) { auto Haptics::ReadRegister(Register reg) -> uint8_t { uint8_t regRaw = static_cast<uint8_t>(reg); - uint8_t ret = 0; - I2CTransaction transaction; - transaction.start() - .write_addr(kHapticsAddress, I2C_MASTER_WRITE) - .write_ack(regRaw) - .start() - .write_addr(kHapticsAddress, I2C_MASTER_READ) - .read(&ret, I2C_MASTER_NACK) - .stop(); - esp_err_t res = transaction.Execute(1); + uint8_t cmd[] = {regRaw}; + uint8_t data[] = {0}; + esp_err_t res = i2c_master_transmit_receive(i2c_, cmd, 1, data, 1, 100); if (res != ESP_OK) { ESP_LOGW(kTag, "read failed: %s", esp_err_to_name(res)); } - return ret; + return data[0]; } auto Haptics::PlayWaveformEffect(Effect effect) -> void { @@ -251,14 +253,6 @@ auto Haptics::Reset() -> void { ModeMask::kDevReset); } -auto Haptics::PowerUp() -> void { - // FIXME: technically overwriting the RESERVED bits of Mode, but eh - uint8_t newMask = static_cast<uint8_t>(Mode::kInternalTrigger) & - (~ModeMask::kStandby) & (~ModeMask::kDevReset); - WriteRegister(Register::kMode, - static_cast<uint8_t>(RegisterDefaults::kMode) | newMask); -} - auto Haptics::EffectToLabel(Effect effect) -> std::string { switch (static_cast<Effect>(effect)) { case Effect::kStrongClick_100Pct: |
