You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.9KB

  1. #include "FlipFlop.hpp"
  2. void FlipFlop::onReset() {
  3. _flipped1 = false;
  4. _flipped2 = false;
  5. _trigger1.reset();
  6. _resetTrigger1.reset();
  7. _trigger2.reset();
  8. _resetTrigger2.reset();
  9. }
  10. void FlipFlop::step() {
  11. channelStep(
  12. inputs[IN1_INPUT],
  13. inputs[RESET1_INPUT],
  14. outputs[A1_OUTPUT],
  15. outputs[B1_OUTPUT],
  16. _trigger1,
  17. _resetTrigger1,
  18. _flipped1
  19. );
  20. channelStep(
  21. inputs[IN2_INPUT],
  22. inputs[RESET2_INPUT],
  23. outputs[A2_OUTPUT],
  24. outputs[B2_OUTPUT],
  25. _trigger2,
  26. _resetTrigger2,
  27. _flipped2
  28. );
  29. }
  30. void FlipFlop::channelStep(
  31. Input& triggerInput,
  32. Input& resetInput,
  33. Output& aOutput,
  34. Output& bOutput,
  35. PositiveZeroCrossing& trigger,
  36. Trigger& resetTrigger,
  37. bool& flipped
  38. ) {
  39. bool triggered = trigger.next(triggerInput.value);
  40. resetTrigger.process(resetInput.value);
  41. if (resetTrigger.isHigh()) {
  42. flipped = false;
  43. }
  44. else if (triggered) {
  45. flipped = !flipped;
  46. }
  47. if (flipped) {
  48. aOutput.value = 0.0f;
  49. bOutput.value = 5.0f;
  50. }
  51. else {
  52. aOutput.value = 5.0f;
  53. bOutput.value = 0.0f;
  54. }
  55. }
  56. struct FlipFlopWidget : ModuleWidget {
  57. static constexpr int hp = 3;
  58. FlipFlopWidget(FlipFlop* module) : ModuleWidget(module) {
  59. box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT);
  60. {
  61. SVGPanel *panel = new SVGPanel();
  62. panel->box.size = box.size;
  63. panel->setBackground(SVG::load(assetPlugin(plugin, "res/FlipFlop.svg")));
  64. addChild(panel);
  65. }
  66. addChild(Widget::create<ScrewSilver>(Vec(0, 0)));
  67. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 15, 365)));
  68. // generated by svg_widgets.rb
  69. auto in1InputPosition = Vec(10.5, 21.0);
  70. auto reset1InputPosition = Vec(10.5, 56.0);
  71. auto in2InputPosition = Vec(10.5, 172.0);
  72. auto reset2InputPosition = Vec(10.5, 207.0);
  73. auto a1OutputPosition = Vec(10.5, 94.0);
  74. auto b1OutputPosition = Vec(10.5, 129.0);
  75. auto a2OutputPosition = Vec(10.5, 245.0);
  76. auto b2OutputPosition = Vec(10.5, 280.0);
  77. // end generated by svg_widgets.rb
  78. addInput(Port::create<Port24>(in1InputPosition, Port::INPUT, module, FlipFlop::IN1_INPUT));
  79. addInput(Port::create<Port24>(reset1InputPosition, Port::INPUT, module, FlipFlop::RESET1_INPUT));
  80. addInput(Port::create<Port24>(in2InputPosition, Port::INPUT, module, FlipFlop::IN2_INPUT));
  81. addInput(Port::create<Port24>(reset2InputPosition, Port::INPUT, module, FlipFlop::RESET2_INPUT));
  82. addOutput(Port::create<Port24>(a1OutputPosition, Port::OUTPUT, module, FlipFlop::A1_OUTPUT));
  83. addOutput(Port::create<Port24>(b1OutputPosition, Port::OUTPUT, module, FlipFlop::B1_OUTPUT));
  84. addOutput(Port::create<Port24>(a2OutputPosition, Port::OUTPUT, module, FlipFlop::A2_OUTPUT));
  85. addOutput(Port::create<Port24>(b2OutputPosition, Port::OUTPUT, module, FlipFlop::B2_OUTPUT));
  86. }
  87. };
  88. RACK_PLUGIN_MODEL_INIT(Bogaudio, FlipFlop) {
  89. Model *modelFlipFlop = createModel<FlipFlop, FlipFlopWidget>("Bogaudio-FlipFlop", "FlipFlop", "dual stateful logic", LOGIC_TAG, DUAL_TAG);
  90. return modelFlipFlop;
  91. }