Implement support for multiple hidden parameters

This commit is contained in:
Jan-Henrik 2020-05-09 14:13:30 +02:00
parent 8b4f02e919
commit f741f25f93
3 changed files with 65 additions and 56 deletions

View file

@ -39,9 +39,8 @@
#pragma once #pragma once
#include "stmlib/stmlib.h"
#include "stmlib/dsp/dsp.h" #include "stmlib/dsp/dsp.h"
#include "stmlib/stmlib.h"
enum PotState { enum PotState {
POT_STATE_TRACKING, POT_STATE_TRACKING,
@ -50,6 +49,7 @@ enum PotState {
POT_STATE_CATCHING_UP POT_STATE_CATCHING_UP
}; };
template<size_t hidden_parameter_count>
class PotController { class PotController {
public: public:
PotController() { } PotController() { }
@ -57,35 +57,43 @@ class PotController {
inline void Init( inline void Init(
uint16_t* main_parameter, uint16_t* main_parameter,
uint16_t* hidden_parameter // this pot controller always works on values between 0 and 65535 uint16_t* hidden_parameters[hidden_parameter_count]) // this pot controller always works on values between 0 and 65535
) { {
state_ = POT_STATE_TRACKING; state_ = POT_STATE_TRACKING;
was_catching_up_ = false; was_catching_up_ = false;
main_parameter_ = main_parameter; main_parameter_ = main_parameter;
hidden_parameter_ = hidden_parameter; current_hidden_parameter_ = 0;
for(size_t i = 0; i < hidden_parameter_count; i++)
hidden_parameters_[i] = hidden_parameters[i];
value_ = 0; value_ = 0;
stored_value_ = 0; stored_value_ = 0;
previous_value_ = 0; previous_value_ = 0;
} }
inline void Lock() { inline void Lock(uint8_t selected_parameter)
{
if (selected_parameter > hidden_parameter_count)
return;
if (state_ == POT_STATE_LOCKING || state_ == POT_STATE_HIDDEN_PARAMETER) { if (state_ == POT_STATE_LOCKING || state_ == POT_STATE_HIDDEN_PARAMETER) {
return; return;
} }
if (hidden_parameter_) { if (hidden_parameters_[selected_parameter]) {
current_hidden_parameter_ = selected_parameter;
was_catching_up_ = state_ == POT_STATE_CATCHING_UP; was_catching_up_ = state_ == POT_STATE_CATCHING_UP;
state_ = POT_STATE_LOCKING; state_ = POT_STATE_LOCKING;
} }
} }
inline bool editing_hidden_parameter() const
inline bool editing_hidden_parameter() const { {
return state_ == POT_STATE_HIDDEN_PARAMETER; return state_ == POT_STATE_HIDDEN_PARAMETER;
} }
inline void Unlock() { inline void Unlock()
{
if (state_ == POT_STATE_HIDDEN_PARAMETER || was_catching_up_) { if (state_ == POT_STATE_HIDDEN_PARAMETER || was_catching_up_) {
state_ = POT_STATE_CATCHING_UP; state_ = POT_STATE_CATCHING_UP;
} else { } else {
@ -93,11 +101,13 @@ class PotController {
} }
} }
inline void Realign() { inline void Realign()
{
state_ = POT_STATE_TRACKING; state_ = POT_STATE_TRACKING;
} }
inline void ProcessControlRate(uint16_t adc_value) { inline void ProcessControlRate(uint16_t adc_value)
{
value_ += (adc_value - value_) >> 6; value_ += (adc_value - value_) >> 6;
CONSTRAIN(value_, 0, 65535); CONSTRAIN(value_, 0, 65535);
// approximately this: // approximately this:
@ -108,7 +118,8 @@ class PotController {
} }
} }
inline void ProcessUIRate() { inline void ProcessUIRate()
{
switch (state_) { switch (state_) {
case POT_STATE_TRACKING: case POT_STATE_TRACKING:
previous_value_ = value_; previous_value_ = value_;
@ -118,7 +129,7 @@ class PotController {
if (abs(value_ - previous_value_) > 1966) { if (abs(value_ - previous_value_) > 1966) {
stored_value_ = previous_value_; stored_value_ = previous_value_;
CONSTRAIN(value_, 0, 65535); CONSTRAIN(value_, 0, 65535);
*hidden_parameter_ = value_; *hidden_parameters_[current_hidden_parameter_] = value_;
state_ = POT_STATE_HIDDEN_PARAMETER; state_ = POT_STATE_HIDDEN_PARAMETER;
previous_value_ = value_; previous_value_ = value_;
} }
@ -126,12 +137,11 @@ class PotController {
case POT_STATE_HIDDEN_PARAMETER: case POT_STATE_HIDDEN_PARAMETER:
CONSTRAIN(value_, 0, 65535); CONSTRAIN(value_, 0, 65535);
*hidden_parameter_ = value_; *hidden_parameters_[current_hidden_parameter_] = value_;
previous_value_ = value_; previous_value_ = value_;
break; break;
case POT_STATE_CATCHING_UP: case POT_STATE_CATCHING_UP: {
{
if (abs(value_ - previous_value_) > 327) { if (abs(value_ - previous_value_) > 327) {
int32_t delta = value_ - previous_value_; int32_t delta = value_ - previous_value_;
@ -149,22 +159,19 @@ class PotController {
previous_value_ = value_; previous_value_ = value_;
*main_parameter_ = stored_value_; *main_parameter_ = stored_value_;
} }
} } break;
break;
} }
} }
private: private:
PotState state_; PotState state_;
bool was_catching_up_; bool was_catching_up_;
uint16_t* main_parameter_; uint16_t* main_parameter_;
uint16_t* hidden_parameter_; uint16_t* hidden_parameters_[hidden_parameter_count];
uint8_t current_hidden_parameter_;
int32_t value_; int32_t value_;
int32_t stored_value_; int32_t stored_value_;
int32_t previous_value_; int32_t previous_value_;
DISALLOW_COPY_AND_ASSIGN(PotController); DISALLOW_COPY_AND_ASSIGN(PotController);
}; };

View file

@ -13,7 +13,7 @@ void UI::Poll()
press_time[i] = HAL_GetTick(); press_time[i] = HAL_GetTick();
ignore_release[i] = false; ignore_release[i] = false;
for (size_t j = 0; j < kNumChannels * 2; j++) for (size_t j = 0; j < kNumChannels * 2; j++)
potControllers[j].Lock(); potControllers[j].Lock(i);
} }
if (switches->pressed(Switch(i)) && !ignore_release[i]) { if (switches->pressed(Switch(i)) && !ignore_release[i]) {
bool suppress_release_hidden_parameters = false; bool suppress_release_hidden_parameters = false;

View file

@ -22,8 +22,10 @@ class UI {
queue.Init(); queue.Init();
for (size_t i = 0; i < kNumChannels; i++) { for (size_t i = 0; i < kNumChannels; i++) {
potControllers[i].Init(&volume_pots[i], &volume_att_pots[i]); uint16_t* volume_hidden_params[kNumChannels] = {&volume_att_pots[i], &volume_att_pots[i], &volume_att_pots[i], &volume_att_pots[i]};
potControllers[i + kNumChannels].Init(&pan_pots[i], &pan_att_pots[i]); potControllers[i].Init(&volume_pots[i], volume_hidden_params);
uint16_t* pan_hidden_params[kNumChannels] = {&pan_att_pots[i], &pan_att_pots[i], &pan_att_pots[i], &pan_att_pots[i]};
potControllers[i + kNumChannels].Init(&pan_pots[i], pan_hidden_params);
volume_att_pots[i] = pan_att_pots[i] = 65535; volume_att_pots[i] = pan_att_pots[i] = 65535;
} }
@ -62,5 +64,5 @@ class UI {
uint32_t last_pan_pot_touch[kNumChannels]; uint32_t last_pan_pot_touch[kNumChannels];
uint32_t last_vol_pot_touch[kNumChannels]; uint32_t last_vol_pot_touch[kNumChannels];
PotController potControllers[kNumChannels * 2]; // todo: count PotController<kNumChannels> potControllers[kNumChannels * 2]; // todo: count
}; };