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.

109 lines
3.1KB

  1. #include "NauModular.hpp"
  2. namespace rack_plugin_NauModular {
  3. struct BitHammer : Module{
  4. enum ParamIds{
  5. NUM_PARAMS
  6. };
  7. enum InputIds{
  8. A_INPUT,
  9. B_INPUT,
  10. NUM_INPUTS
  11. };
  12. enum OutputIds{
  13. AND_OUTPUT,
  14. OR_OUTPUT,
  15. XOR_OUTPUT,
  16. LEFT_OUTPUT,
  17. RIGHT_OUTPUT,
  18. NOT_OUTPUT,
  19. NUM_OUTPUTS
  20. };
  21. enum LightIds{
  22. NUM_LIGHTS
  23. };
  24. union Volts2Bits{
  25. float volts;
  26. int bits;
  27. };
  28. BitHammer();
  29. void step() override;
  30. Volts2Bits inA;
  31. Volts2Bits inB;
  32. Volts2Bits outAnd;
  33. Volts2Bits outOr;
  34. Volts2Bits outXor;
  35. Volts2Bits outLeft;
  36. Volts2Bits outRight;
  37. Volts2Bits outNot;
  38. };
  39. BitHammer::BitHammer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS){
  40. }
  41. void BitHammer::step(){
  42. inA.volts = inputs[A_INPUT].value;
  43. inB.volts = inputs[B_INPUT].value;
  44. outAnd.bits = inA.bits & inB.bits;
  45. outOr.bits = inA.bits | inB.bits;
  46. outXor.bits = inA.bits ^ inB.bits;
  47. outNot.bits = ~inA.bits;
  48. outNot.bits &= ~inB.bits;
  49. outLeft.bits = inA.bits &(1<< inB.bits);
  50. outRight.bits = inA.bits >> inB.bits;
  51. outputs[AND_OUTPUT].value = outAnd.volts;
  52. outputs[OR_OUTPUT].value = outOr.volts;
  53. outputs[XOR_OUTPUT].value = outXor.volts;
  54. outputs[NOT_OUTPUT].value = outNot.volts;
  55. outputs[LEFT_OUTPUT].value = outLeft.volts;
  56. outputs[RIGHT_OUTPUT].value = outRight.volts;
  57. }
  58. struct BitHammerWidget : ModuleWidget{
  59. BitHammerWidget(BitHammer *module);
  60. };
  61. BitHammerWidget::BitHammerWidget(BitHammer *module) : ModuleWidget(module){
  62. box.size = Vec(6*RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  63. {
  64. SVGPanel * panel = new SVGPanel();
  65. panel->box.size = box.size;
  66. panel->setBackground(SVG::load(assetPlugin(plugin, "res/BitHammer.svg")));
  67. addChild(panel);
  68. }
  69. addChild(Widget::create<ScrewSilver>(Vec(15,0)));
  70. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30,0)));
  71. addChild(Widget::create<ScrewSilver>(Vec(15,365)));
  72. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30,365)));
  73. addInput(Port::create<PJ301MPort>(Vec(15, 85), Port::INPUT, module, BitHammer::A_INPUT));
  74. addInput(Port::create<PJ301MPort>(Vec(50, 85), Port::INPUT, module, BitHammer::B_INPUT));
  75. addOutput(Port::create<PJ301MPort>(Vec(20, 140), Port::OUTPUT, module, BitHammer::AND_OUTPUT));
  76. addOutput(Port::create<PJ301MPort>(Vec(20, 175), Port::OUTPUT, module, BitHammer::OR_OUTPUT));
  77. addOutput(Port::create<PJ301MPort>(Vec(20, 210), Port::OUTPUT, module, BitHammer::XOR_OUTPUT));
  78. addOutput(Port::create<PJ301MPort>(Vec(20, 245), Port::OUTPUT, module, BitHammer::LEFT_OUTPUT));
  79. addOutput(Port::create<PJ301MPort>(Vec(20, 280), Port::OUTPUT, module, BitHammer::RIGHT_OUTPUT));
  80. addOutput(Port::create<PJ301MPort>(Vec(20, 315), Port::OUTPUT, module, BitHammer::NOT_OUTPUT));
  81. }
  82. } // namespace rack_plugin_NauModular
  83. using namespace rack_plugin_NauModular;
  84. RACK_PLUGIN_MODEL_INIT(NauModular, BitHammer) {
  85. Model *modelBitHammer = Model::create<BitHammer, BitHammerWidget>("NauModular", "BitHammer", "BitHammer", LOGIC_TAG);
  86. return modelBitHammer;
  87. }