|
@@ -9,18 +9,20 @@ namespace dsp { |
|
|
/** Turns HIGH when value reaches 1.f, turns LOW when value reaches 0.f. */ |
|
|
/** Turns HIGH when value reaches 1.f, turns LOW when value reaches 0.f. */ |
|
|
struct SchmittTrigger { |
|
|
struct SchmittTrigger { |
|
|
enum State { |
|
|
enum State { |
|
|
UNKNOWN, |
|
|
|
|
|
LOW, |
|
|
LOW, |
|
|
HIGH |
|
|
|
|
|
|
|
|
HIGH, |
|
|
|
|
|
UNKNOWN |
|
|
}; |
|
|
}; |
|
|
State state; |
|
|
State state; |
|
|
|
|
|
|
|
|
SchmittTrigger() { |
|
|
SchmittTrigger() { |
|
|
reset(); |
|
|
reset(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void reset() { |
|
|
void reset() { |
|
|
state = UNKNOWN; |
|
|
state = UNKNOWN; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Updates the state of the Schmitt Trigger given a value. |
|
|
/** Updates the state of the Schmitt Trigger given a value. |
|
|
Returns true if triggered, i.e. the value increases from 0 to 1. |
|
|
Returns true if triggered, i.e. the value increases from 0 to 1. |
|
|
If different trigger thresholds are needed, use |
|
|
If different trigger thresholds are needed, use |
|
@@ -51,24 +53,28 @@ struct SchmittTrigger { |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool isHigh() { |
|
|
bool isHigh() { |
|
|
return state == HIGH; |
|
|
return state == HIGH; |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Detects when a boolean changes from false to true */ |
|
|
struct BooleanTrigger { |
|
|
struct BooleanTrigger { |
|
|
bool lastState; |
|
|
|
|
|
|
|
|
bool state; |
|
|
|
|
|
|
|
|
BooleanTrigger() { |
|
|
BooleanTrigger() { |
|
|
reset(); |
|
|
reset(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void reset() { |
|
|
void reset() { |
|
|
lastState = true; |
|
|
|
|
|
|
|
|
state = true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool process(bool state) { |
|
|
bool process(bool state) { |
|
|
bool triggered = (state && !lastState); |
|
|
|
|
|
lastState = state; |
|
|
|
|
|
|
|
|
bool triggered = (state && !this->state); |
|
|
|
|
|
this->state = state; |
|
|
return triggered; |
|
|
return triggered; |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
@@ -76,28 +82,31 @@ struct BooleanTrigger { |
|
|
|
|
|
|
|
|
/** When triggered, holds a high value for a specified time before going low again */ |
|
|
/** When triggered, holds a high value for a specified time before going low again */ |
|
|
struct PulseGenerator { |
|
|
struct PulseGenerator { |
|
|
float time; |
|
|
|
|
|
float triggerDuration; |
|
|
|
|
|
|
|
|
float remaining; |
|
|
|
|
|
|
|
|
PulseGenerator() { |
|
|
PulseGenerator() { |
|
|
reset(); |
|
|
reset(); |
|
|
} |
|
|
} |
|
|
/** Immediately resets the state to LOW */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Immediately disables the pulse */ |
|
|
void reset() { |
|
|
void reset() { |
|
|
time = 0.f; |
|
|
|
|
|
triggerDuration = 0.f; |
|
|
|
|
|
|
|
|
remaining = 0.f; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** Advances the state by `deltaTime`. Returns whether the pulse is in the HIGH state. */ |
|
|
/** Advances the state by `deltaTime`. Returns whether the pulse is in the HIGH state. */ |
|
|
bool process(float deltaTime) { |
|
|
bool process(float deltaTime) { |
|
|
time += deltaTime; |
|
|
|
|
|
return time < triggerDuration; |
|
|
|
|
|
|
|
|
if (remaining > 0.f) { |
|
|
|
|
|
remaining -= deltaTime; |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
return false; |
|
|
} |
|
|
} |
|
|
/** Begins a trigger with the given `triggerDuration`. */ |
|
|
|
|
|
void trigger(float triggerDuration) { |
|
|
|
|
|
// Keep the previous triggerDuration if the existing pulse would be held longer than the currently requested one. |
|
|
|
|
|
if (time + triggerDuration >= this->triggerDuration) { |
|
|
|
|
|
time = 0.f; |
|
|
|
|
|
this->triggerDuration = triggerDuration; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Begins a trigger with the given `duration`. */ |
|
|
|
|
|
void trigger(float duration = 1e-3f) { |
|
|
|
|
|
// Keep the previous pulse if the existing pulse will be held longer than the currently requested one. |
|
|
|
|
|
if (duration > remaining) { |
|
|
|
|
|
remaining = duration; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|