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.

176 lines
4.9KB

  1. #include "Squinky.hpp"
  2. #include "WidgetComposite.h"
  3. #include "ThreadPriority.h"
  4. struct ThreadBoostModule : Module
  5. {
  6. enum ParamIds
  7. {
  8. THREAD_BOOST_PARAM,
  9. NUM_PARAMS
  10. };
  11. enum InputIds
  12. {
  13. NUM_INPUTS
  14. };
  15. enum OutputIds
  16. {
  17. NUM_OUTPUTS
  18. };
  19. enum LightIds
  20. {
  21. NORMAL_LIGHT,
  22. BOOSTED_LIGHT,
  23. REALTIME_LIGHT,
  24. ERROR_LIGHT,
  25. NUM_LIGHTS
  26. };
  27. ThreadBoostModule();
  28. /**
  29. * Overrides of Module functions
  30. */
  31. void step() override;
  32. private:
  33. int boostState = 0;
  34. void lightOnly(LightIds l)
  35. {
  36. for (int i = NORMAL_LIGHT; i < NUM_LIGHTS; ++i) {
  37. bool b = (i == l);
  38. lights[i].value = b;
  39. }
  40. }
  41. };
  42. ThreadBoostModule::ThreadBoostModule() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS)
  43. {
  44. }
  45. void ThreadBoostModule::step()
  46. {
  47. float x = params[THREAD_BOOST_PARAM].value + .5f;
  48. int i = std::floor(x);
  49. if (i != boostState) {
  50. switch (i) {
  51. case 0:
  52. ThreadPriority::restore();
  53. lightOnly(NORMAL_LIGHT);
  54. break;
  55. case 1:
  56. {
  57. bool b = ThreadPriority::boostNormal();
  58. if (b) {
  59. lightOnly(BOOSTED_LIGHT);
  60. } else {
  61. lightOnly(ERROR_LIGHT);
  62. }
  63. break;
  64. }
  65. case 2:
  66. {
  67. bool b = ThreadPriority::boostRealtime();
  68. if (b) {
  69. lightOnly(REALTIME_LIGHT);
  70. } else {
  71. lightOnly(ERROR_LIGHT);
  72. }
  73. break;
  74. }
  75. }
  76. boostState = i;
  77. }
  78. }
  79. ////////////////////
  80. // module widget
  81. ////////////////////
  82. struct ThreadBoostWidget : ModuleWidget
  83. {
  84. ThreadBoostWidget(ThreadBoostModule *);
  85. };
  86. /**
  87. * Widget constructor will describe my implementation structure and
  88. * provide meta-data.
  89. * This is not shared by all modules in the DLL, just one
  90. */
  91. ThreadBoostWidget::ThreadBoostWidget(ThreadBoostModule *module)
  92. : ModuleWidget(module)
  93. {
  94. box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
  95. {
  96. SVGPanel *panel = new SVGPanel();
  97. panel->box.size = box.size;
  98. panel->setBackground(SVG::load(assetPlugin(plugin, "res/thread_booster_panel.svg")));
  99. addChild(panel);
  100. }
  101. addParam(ParamWidget::create<NKK>(
  102. Vec(30, 140), module, ThreadBoostModule::THREAD_BOOST_PARAM, 0.0f, 2.0f, 0.0f));
  103. const int ledX = 10;
  104. const int labelX = 16;
  105. const int ledY = 200;
  106. const int labelY = ledY - 5;
  107. const int deltaY = 30;
  108. Label* label;
  109. addChild(ModuleLightWidget::create<MediumLight<GreenLight>>(
  110. Vec(ledX, ledY), module, ThreadBoostModule::NORMAL_LIGHT));
  111. label = new Label();
  112. label->box.pos = Vec(labelX, labelY);
  113. label->text = "Normal";
  114. label->color = COLOR_BLACK;
  115. addChild(label);
  116. addChild(ModuleLightWidget::create<MediumLight<GreenLight>>(
  117. Vec(ledX, ledY + deltaY), module, ThreadBoostModule::BOOSTED_LIGHT));
  118. label = new Label();
  119. label->box.pos = Vec(labelX, labelY + deltaY);
  120. label->text = "Boost";
  121. label->color = COLOR_BLACK;
  122. addChild(label);
  123. addChild(ModuleLightWidget::create<MediumLight<GreenLight>>(
  124. Vec(ledX, ledY + 2 * deltaY), module, ThreadBoostModule::REALTIME_LIGHT));
  125. label = new Label();
  126. label->box.pos = Vec(labelX, labelY + 2 * deltaY);
  127. label->text = "Real-time";
  128. label->color = COLOR_BLACK;
  129. addChild(label);
  130. addChild(ModuleLightWidget::create<MediumLight<RedLight>>(
  131. Vec(ledX, ledY + 3 * deltaY), module, ThreadBoostModule::ERROR_LIGHT));
  132. label = new Label();
  133. label->box.pos = Vec(labelX, labelY + 3 * deltaY);
  134. label->text = "Error";
  135. label->color = COLOR_BLACK;
  136. addChild(label);
  137. // screws
  138. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
  139. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
  140. addChild(Widget::create<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  141. addChild(Widget::create<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  142. }
  143. // Specify the Module and ModuleWidget subclass, human-readable
  144. // manufacturer name for categorization, module slug (should never
  145. // change), human-readable module name, and any number of tags
  146. // (found in `include/tags.hpp`) separated by commas.
  147. RACK_PLUGIN_MODEL_INIT(squinkylabs_plug1, ThreadBoost) {
  148. Model *modelThreadBoostModule = Model::create<ThreadBoostModule, ThreadBoostWidget>("Squinky Labs",
  149. "squinkylabs-booster",
  150. "Thread Booster", UTILITY_TAG);
  151. return modelThreadBoostModule;
  152. }