commit 4b37577c4a451c41c5784b2d6c2b1ba3368bd94a
parent 0546d1df93c943d1b5c2838809b086c73e28b173
Author: Matt Demanett <matt@demanett.net>
Date: Tue, 17 Dec 2019 00:13:00 -0500
SWITCH: add lights to indicate state. #95
Diffstat:
4 files changed, 61 insertions(+), 18 deletions(-)
diff --git a/res-src/Switch-src.svg b/res-src/Switch-src.svg
@@ -48,6 +48,10 @@
<circle cx="0" cy="0" r="10.5" stroke-width="3" stroke="#f00" fill="none" />
</g>
</symbol>
+
+ <symbol id="light" viewBox="0 0 6.4px 6.4px">
+ <rect width="6.4" height="6.4" fill="#0f0" />
+ </symbol>
</defs>
<rect width="100%" height="100%" fill="#ddd" />
@@ -83,16 +87,16 @@
<g transform="translate(0 79)">
<g transform="translate(5.5 0)">
- <rect width="34" height="10" fill="#fafafa" transform="translate(0 29)" />
- <rect width="34" height="35" rx="5" fill="#fafafa" />
+ <rect width="34" height="74" rx="5" fill="#fafafa" />
+ <rect width="34" height="10" fill="#fafafa" transform="translate(0 64)" />
<use id="HIGH1_INPUT" xlink:href="#input" transform="translate(5 3)" />
- <text font-size="5pt" letter-spacing="2px" transform="translate(6.0 35)">HIGH</text>
+ <text font-size="5pt" letter-spacing="1px" transform="translate(11.0 35)">HIGH</text>
+ <use id="HIGH1_LIGHT" xlink:href="#light" transform="translate(2 29.3)" />
</g>
<g transform="translate(5.5 36)">
- <rect width="34" height="10" fill="#fafafa" transform="translate(0 28)" />
- <rect width="34" height="35" rx="5" fill="#fafafa" />
<use id="LOW1_INPUT" xlink:href="#input" transform="translate(5 3)" />
- <text font-size="5pt" letter-spacing="2px" transform="translate(8.0 35)">LOW</text>
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11.0 35)">LOW</text>
+ <use id="LOW1_LIGHT" xlink:href="#light" transform="translate(2 29.3)" />
</g>
<g transform="translate(5.5 77)">
<rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" />
@@ -104,16 +108,16 @@
<g transform="translate(0 196)">
<g transform="translate(5.5 0)">
- <rect width="34" height="10" fill="#fafafa" transform="translate(0 29)" />
- <rect width="34" height="35" rx="5" fill="#fafafa" />
+ <rect width="34" height="74" rx="5" fill="#fafafa" />
+ <rect width="34" height="10" fill="#fafafa" transform="translate(0 64)" />
<use id="HIGH2_INPUT" xlink:href="#input" transform="translate(5 3)" />
- <text font-size="5pt" letter-spacing="2px" transform="translate(6.0 35)">HIGH</text>
+ <text font-size="5pt" letter-spacing="1px" transform="translate(11.0 35)">HIGH</text>
+ <use id="HIGH2_LIGHT" xlink:href="#light" transform="translate(2 29.3)" />
</g>
<g transform="translate(5.5 36)">
- <rect width="34" height="10" fill="#fafafa" transform="translate(0 28)" />
- <rect width="34" height="35" rx="5" fill="#fafafa" />
<use id="LOW2_INPUT" xlink:href="#input" transform="translate(5 3)" />
- <text font-size="5pt" letter-spacing="2px" transform="translate(8.0 35)">LOW</text>
+ <text font-size="5pt" letter-spacing="2px" transform="translate(11.0 35)">LOW</text>
+ <use id="LOW2_LIGHT" xlink:href="#light" transform="translate(2 29.3)" />
</g>
<g transform="translate(5.5 77)">
<rect width="34" height="10" fill="#bbb" transform="translate(0 -3)" />
diff --git a/res/Switch.svg b/res/Switch.svg
Binary files differ.
diff --git a/src/Switch.cpp b/src/Switch.cpp
@@ -7,10 +7,6 @@ void bogaudio::Switch::reset() {
}
}
-bool bogaudio::Switch::active() {
- return outputs[OUT1_OUTPUT].isConnected() || outputs[OUT2_OUTPUT].isConnected();
-}
-
int bogaudio::Switch::channels() {
return inputs[GATE_INPUT].getChannels();
}
@@ -26,6 +22,13 @@ void bogaudio::Switch::modulate() {
_latch = params[LATCH_PARAM].getValue() > 0.5f;
}
+void bogaudio::Switch::processAll(const ProcessArgs& args) {
+ _high1LightSum = 0;
+ _low1LightSum = 0;
+ _high2LightSum = 0;
+ _low2LightSum = 0;
+}
+
void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) {
bool triggered = _trigger[c].process(params[GATE_PARAM].getValue() + inputs[GATE_INPUT].getVoltage(c));
if (_latch) {
@@ -38,6 +41,9 @@ void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) {
}
if (_latchedHigh[c] || _trigger[c].isHigh()) {
+ ++_high1LightSum;
+ ++_high2LightSum;
+
if (_channels == 1) {
outputs[OUT1_OUTPUT].setChannels(inputs[HIGH1_INPUT].getChannels());
outputs[OUT1_OUTPUT].writeVoltages(inputs[HIGH1_INPUT].getVoltages());
@@ -54,6 +60,9 @@ void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) {
}
}
else {
+ ++_low1LightSum;
+ ++_low2LightSum;
+
if (_channels == 1) {
outputs[OUT1_OUTPUT].setChannels(inputs[LOW1_INPUT].getChannels());
outputs[OUT1_OUTPUT].writeVoltages(inputs[LOW1_INPUT].getVoltages());
@@ -71,6 +80,13 @@ void bogaudio::Switch::processChannel(const ProcessArgs& args, int c) {
}
}
+void bogaudio::Switch::postProcess(const ProcessArgs& args) {
+ lights[HIGH1_LIGHT].value = _high1LightSum / (float)_channels;
+ lights[LOW1_LIGHT].value = _low1LightSum / (float)_channels;
+ lights[HIGH2_LIGHT].value = _high2LightSum / (float)_channels;
+ lights[LOW2_LIGHT].value = _low2LightSum / (float)_channels;
+}
+
struct SwitchWidget : ModuleWidget {
static constexpr int hp = 3;
@@ -100,6 +116,11 @@ struct SwitchWidget : ModuleWidget {
auto out1OutputPosition = Vec(10.5, 174.0);
auto out2OutputPosition = Vec(10.5, 291.0);
+
+ auto high1LightPosition = Vec(7.5, 126.3);
+ auto low1LightPosition = Vec(7.5, 162.3);
+ auto high2LightPosition = Vec(7.5, 243.3);
+ auto low2LightPosition = Vec(7.5, 279.3);
// end generated by svg_widgets.rb
addParam(createParam<Button18>(gateParamPosition, module, bogaudio::Switch::GATE_PARAM));
@@ -113,6 +134,11 @@ struct SwitchWidget : ModuleWidget {
addOutput(createOutput<Port24>(out1OutputPosition, module, bogaudio::Switch::OUT1_OUTPUT));
addOutput(createOutput<Port24>(out2OutputPosition, module, bogaudio::Switch::OUT2_OUTPUT));
+
+ addChild(createLight<SmallLight<GreenLight>>(high1LightPosition, module, bogaudio::Switch::HIGH1_LIGHT));
+ addChild(createLight<SmallLight<GreenLight>>(low1LightPosition, module, bogaudio::Switch::LOW1_LIGHT));
+ addChild(createLight<SmallLight<GreenLight>>(high2LightPosition, module, bogaudio::Switch::HIGH2_LIGHT));
+ addChild(createLight<SmallLight<GreenLight>>(low2LightPosition, module, bogaudio::Switch::LOW2_LIGHT));
}
};
diff --git a/src/Switch.hpp b/src/Switch.hpp
@@ -28,23 +28,36 @@ struct Switch : BGModule {
NUM_OUTPUTS
};
+ enum LightsIds {
+ HIGH1_LIGHT,
+ LOW1_LIGHT,
+ HIGH2_LIGHT,
+ LOW2_LIGHT,
+ NUM_LIGHTS
+ };
+
Trigger _trigger[maxChannels];
bool _latchedHigh[maxChannels] {};
bool _latch = false;
+ int _high1LightSum = 0;
+ int _low1LightSum = 0;
+ int _high2LightSum = 0;
+ int _low2LightSum = 0;
Switch() {
- config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS);
+ config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
configParam(GATE_PARAM, 0.0f, 10.0f, 0.0f, "Gate");
configParam(LATCH_PARAM, 0.0f, 1.0f, 0.0f, "Latch");
reset();
}
void reset() override;
- bool active() override;
int channels() override;
void channelsChanged(int before, int after) override;
void modulate() override;
+ void processAll(const ProcessArgs& args) override;
void processChannel(const ProcessArgs& args, int _c) override;
+ void postProcess(const ProcessArgs& args) override;
};
} // namespace bogaudio