|
@@ -0,0 +1,68 @@ |
|
|
|
|
|
#pragma once |
|
|
|
|
|
|
|
|
|
|
|
#include "math.hpp" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace rack { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Turns high when value reaches the high threshold, turns low when value reaches the low threshold */ |
|
|
|
|
|
struct SchmittTrigger { |
|
|
|
|
|
// UNKNOWN is used to represent a stable state when the previous state is not yet set |
|
|
|
|
|
enum {UNKNOWN, LOW, HIGH} state = UNKNOWN; |
|
|
|
|
|
float low = 0.0; |
|
|
|
|
|
float high = 1.0; |
|
|
|
|
|
void setThresholds(float low, float high) { |
|
|
|
|
|
this->low = low; |
|
|
|
|
|
this->high = high; |
|
|
|
|
|
} |
|
|
|
|
|
/** Returns true if triggered */ |
|
|
|
|
|
bool process(float in) { |
|
|
|
|
|
switch (state) { |
|
|
|
|
|
case LOW: |
|
|
|
|
|
if (in >= high) { |
|
|
|
|
|
state = HIGH; |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
case HIGH: |
|
|
|
|
|
if (in <= low) { |
|
|
|
|
|
state = LOW; |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
if (in >= high) { |
|
|
|
|
|
state = HIGH; |
|
|
|
|
|
} |
|
|
|
|
|
else if (in <= low) { |
|
|
|
|
|
state = LOW; |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
void reset() { |
|
|
|
|
|
state = UNKNOWN; |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** When triggered, holds a high value for a specified time before going low again */ |
|
|
|
|
|
struct PulseGenerator { |
|
|
|
|
|
float time = 0.0; |
|
|
|
|
|
float pulseTime = 0.0; |
|
|
|
|
|
bool process(float deltaTime) { |
|
|
|
|
|
time += deltaTime; |
|
|
|
|
|
return time < pulseTime; |
|
|
|
|
|
} |
|
|
|
|
|
void trigger(float pulseTime) { |
|
|
|
|
|
// Keep the previous pulseTime if the existing pulse would be held longer than the currently requested one. |
|
|
|
|
|
if (time + pulseTime >= this->pulseTime) { |
|
|
|
|
|
time = 0.0; |
|
|
|
|
|
this->pulseTime = pulseTime; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace rack |