drumz/src/input/encoder.cpp

82 lines
1.8 KiB
C++

#include <Arduino.h>
#include <Versatile_RotaryEncoder.h>
#include <ui/display.hpp>
#include <audio/tone_generator.hpp>
#ifndef ENCODER_A_PIN
#define ENCODER_A_PIN 12
#endif
#ifndef ENCODER_B_PIN
#define ENCODER_B_PIN 13
#endif
#ifndef ENTER_BUTTON_PIN
#define ENTER_BUTTON_PIN 14
#endif
namespace Encoder
{
void pollEncoder(void *pvParameters);
void handlePress();
void handleRelease();
void handleRotate(int8_t rotation);
Versatile_RotaryEncoder *encoder;
void init()
{
pinMode(ENTER_BUTTON_PIN, INPUT);
pinMode(ENCODER_A_PIN, INPUT);
pinMode(ENCODER_B_PIN, INPUT);
encoder = new Versatile_RotaryEncoder(ENCODER_A_PIN, ENCODER_B_PIN, ENTER_BUTTON_PIN);
encoder->setHandlePress(handlePress);
encoder->setHandlePressRelease(handleRelease);
encoder->setHandleRotate(handleRotate);
xTaskCreate(pollEncoder, "pollEncoder", 2048, NULL, 1, NULL);
}
void pollEncoder(void *pvParameters)
{
while (true)
{
encoder->ReadEncoder();
delay(1);
}
}
void handlePress()
{
Serial.println("Encoder pressed");
Display::setLabelText("Button pressed.");
}
void handleRelease()
{
Serial.println("Encoder released");
}
void handleRotate(int8_t rotation)
{
Serial.print("Encoder rotated by ");
Serial.println(rotation);
int frequency = ToneGenerator::getFrequency();
if (rotation > 0)
{
frequency += 10;
}
else if (rotation < 0)
{
frequency -= 10;
}
ToneGenerator::setFrequency(frequency);
Serial.print("Frequency: ");
Serial.println(frequency);
Display::setLabelText("Frequency: " + String(frequency) + "Hz");
}
}