From c087d997f31ceb8aad7d16737193656f2633cfd8 Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Sat, 30 Aug 2025 13:02:59 +0200 Subject: [PATCH] Auto-buzz on startup --- Drivers/DRV2605/Source/Drv2605.cpp | 37 +++++++++++++++++++++++------- Drivers/DRV2605/Source/Drv2605.h | 17 +++++++++++++- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/Drivers/DRV2605/Source/Drv2605.cpp b/Drivers/DRV2605/Source/Drv2605.cpp index 2613f09b..a554ce02 100644 --- a/Drivers/DRV2605/Source/Drv2605.cpp +++ b/Drivers/DRV2605/Source/Drv2605.cpp @@ -18,15 +18,8 @@ bool Drv2605::init() { writeRegister(Register::RealtimePlaybackInput, 0x00); // Disable - writeRegister(Register::WaveSequence1, 1); // Strong click - writeRegister(Register::WaveSequence2, 0); // End sequence - writeRegister(Register::OverdriveTimeOffset, 0); // No overdrive - - writeRegister(Register::SustainTimeOffsetPostivie, 0); - writeRegister(Register::SustainTimeOffsetNegative, 0); - writeRegister(Register::BrakeTimeOffset, 0); - writeRegister(Register::AudioInputLevelMax, 0x64); + setWaveFormForClick(); // ERM open loop @@ -43,6 +36,34 @@ bool Drv2605::init() { return true; } +void Drv2605::setWaveFormForBuzz() { + writeRegister(Register::WaveSequence1, 1); // Strong click + writeRegister(Register::WaveSequence2, 1); // Strong click + writeRegister(Register::WaveSequence3, 1); // Strong click + writeRegister(Register::WaveSequence4, 0); // End sequence + + writeRegister(Register::OverdriveTimeOffset, 0); // No overdrive + + writeRegister(Register::SustainTimeOffsetPostivie, 0); + writeRegister(Register::SustainTimeOffsetNegative, 0); + writeRegister(Register::BrakeTimeOffset, 0); + + writeRegister(Register::AudioInputLevelMax, 0x64); +} + +void Drv2605::setWaveFormForClick() { + writeRegister(Register::WaveSequence1, 1); // Strong click + writeRegister(Register::WaveSequence2, 0); // End sequence + + writeRegister(Register::OverdriveTimeOffset, 0); // No overdrive + + writeRegister(Register::SustainTimeOffsetPostivie, 0); + writeRegister(Register::SustainTimeOffsetNegative, 0); + writeRegister(Register::BrakeTimeOffset, 0); + + writeRegister(Register::AudioInputLevelMax, 0x64); +} + void Drv2605::setWaveForm(uint8_t slot, uint8_t waveform) { writeRegister8(static_cast(Register::WaveSequence1) + slot, waveform); } diff --git a/Drivers/DRV2605/Source/Drv2605.h b/Drivers/DRV2605/Source/Drv2605.h index 0219d517..b29461ec 100644 --- a/Drivers/DRV2605/Source/Drv2605.h +++ b/Drivers/DRV2605/Source/Drv2605.h @@ -7,6 +7,8 @@ class Drv2605 : public tt::hal::i2c::I2cDevice { static constexpr auto* TAG = "DRV2605"; static constexpr auto ADDRESS = 0x5A; + bool autoPlayStartupBuzz; + // Chip IDs enum class ChipId { DRV2604 = 0x04, // Has RAM. Doesn't havew licensed ROM library. @@ -61,10 +63,15 @@ class Drv2605 : public tt::hal::i2c::I2cDevice { public: - explicit Drv2605(i2c_port_t port) : I2cDevice(port, ADDRESS) { + explicit Drv2605(i2c_port_t port, bool autoPlayStartupBuzz = true) : I2cDevice(port, ADDRESS), autoPlayStartupBuzz(autoPlayStartupBuzz) { if (!init()) { TT_LOG_E(TAG, "Failed to initialize DRV2605"); } + + if (autoPlayStartupBuzz) { + setWaveFormForBuzz(); + startPlayback(); + } } std::string getName() const final { return "DRV2605"; } @@ -72,6 +79,14 @@ public: bool init(); + void setWaveFormForBuzz(); + void setWaveFormForClick(); + + /** + * + * @param slot a value from 0 to 7 + * @param waveform + */ void setWaveForm(uint8_t slot, uint8_t waveform); void selectLibrary(uint8_t library); void startPlayback();