drumduino.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #ifndef DRUMDUINO_H
  2. #define DRUMDUINO_H
  3. #include <QtWidgets/QMainWindow>
  4. #include "ui_drumduino.h"
  5. #include "midi.h"
  6. #include "serial.h"
  7. #include "qcustomplot.h"
  8. #include "settings.h"
  9. enum { BufferSize = 512 };
  10. enum State {
  11. StateAwait,
  12. StateScan,
  13. StateMask,
  14. };
  15. class DrumduinoThread;
  16. class Channel;
  17. struct DrumduinoProc {
  18. uint64_t frameCounter;
  19. std::array<std::array<byte, PORT_CNT* CHAN_CNT>, BufferSize> frameBuffer;
  20. std::array<State, PORT_CNT* CHAN_CNT> states;
  21. std::array<uint64_t, PORT_CNT* CHAN_CNT> triggers;
  22. std::array<byte, PORT_CNT* CHAN_CNT> maxs;
  23. std::array<std::array<State, PORT_CNT* CHAN_CNT>, BufferSize> stateBuffer;
  24. DrumduinoProc()
  25. : frameCounter(0)
  26. {
  27. for(auto& fb : frameBuffer) {
  28. fb.fill(0);
  29. }
  30. states.fill(StateAwait);
  31. triggers.fill(0);
  32. maxs.fill(0);
  33. for(auto& sb : stateBuffer) {
  34. sb.fill(StateAwait);
  35. }
  36. }
  37. };
  38. class Drumduino : public QMainWindow
  39. {
  40. Q_OBJECT
  41. public:
  42. Drumduino(QWidget* parent = 0);
  43. ~Drumduino();
  44. private:
  45. Ui::drumduinoClass ui;
  46. std::array<Channel*, PORT_CNT* CHAN_CNT> _channels;
  47. std::shared_ptr<Serial> _serial;
  48. std::shared_ptr<MidiOut> _midiOut;
  49. DrumduinoThread* _drumduinoThread;
  50. Settings _settings;
  51. DrumduinoProc _proc;
  52. private:
  53. bool readFrame(std::array<byte, PORT_CNT* CHAN_CNT>& frame);
  54. private:
  55. bool eventFilter(QObject* o, QEvent* e)
  56. {
  57. auto dial = qobject_cast<QDial*>(o);
  58. if(dial && e->type() == QEvent::Paint) {
  59. QPaintEvent* paintEvent = static_cast<QPaintEvent*>(e);
  60. QStylePainter p(dial);
  61. QStyleOptionSlider option;
  62. option.initFrom(dial);
  63. option.minimum = dial->minimum();
  64. option.maximum = dial->maximum();
  65. option.sliderPosition = dial->value();
  66. option.sliderValue = dial->value();
  67. option.singleStep = dial->singleStep();
  68. option.pageStep = dial->pageStep();
  69. option.upsideDown = !dial->invertedAppearance();
  70. option.notchTarget = 0;
  71. option.dialWrapping = dial->wrapping();
  72. option.subControls = QStyle::SC_All;
  73. option.activeSubControls = QStyle::SC_None;
  74. //option.subControls &= ~QStyle::SC_DialTickmarks;
  75. //option.tickPosition = QSlider::TicksAbove;
  76. option.tickPosition = QSlider::NoTicks;
  77. option.tickInterval = dial->notchSize();
  78. p.drawComplexControl(QStyle::CC_Dial, option);
  79. p.drawText(dial->rect(), Qt::AlignCenter, QString::number(dial->value()));
  80. return true;
  81. }
  82. return QMainWindow::eventFilter(o, e);
  83. }
  84. #if 0
  85. public:
  86. std::vector<QCustomPlot*> _plots;
  87. bool _updateGraph;
  88. qint64 _lasttime;
  89. qint64 _startTime;
  90. private:
  91. uint64_t _currentFrame;
  92. std::array<std::array<byte, BufferSize>, PORT_CNT* CHAN_CNT> _frameBuffer;
  93. std::array<std::array<State, BufferSize>, PORT_CNT* CHAN_CNT> _stateBuffer;
  94. std::array<State, PORT_CNT* CHAN_CNT> _states;
  95. std::array<uint64_t, PORT_CNT* CHAN_CNT> _triggers;
  96. std::array<byte, PORT_CNT* CHAN_CNT> _max;
  97. std::array<byte, PORT_CNT* CHAN_CNT> _maxVal;
  98. public:
  99. void serialRead();
  100. void updateGraph();
  101. void handleFrame(const std::array<byte, PORT_CNT* CHAN_CNT>& frame, const uint64_t currentIndex);
  102. #endif
  103. };
  104. class DrumduinoThread : public QThread
  105. {
  106. Q_OBJECT
  107. private:
  108. Drumduino* _drumduino;
  109. bool _run;
  110. std::function<void()> _fnCall;
  111. public:
  112. DrumduinoThread(Drumduino* drumduino, std::function<void()> fnCall)
  113. : QThread(drumduino)
  114. , _drumduino(drumduino)
  115. , _run(true)
  116. , _fnCall(fnCall)
  117. {}
  118. void run() Q_DECL_OVERRIDE {
  119. for(; _run;)
  120. {
  121. _fnCall();
  122. }
  123. }
  124. void stop()
  125. {
  126. _run = false;
  127. }
  128. };
  129. #endif // DRUMDUINO_H