Skip to content

Commit bd0cfa9

Browse files
authored
Merge branch 'master' into 339-chancheck-offset
2 parents e6d000c + 268c49a commit bd0cfa9

9 files changed

Lines changed: 174 additions & 76 deletions

File tree

src/consts.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static const unsigned char sinetable[] = {
6969
69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 118, 121, 124, 127, 127, 130,
7070
133, 136, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 176, 179, 182, 185, 187, 190, 193, 195,
7171
198, 201, 203, 206, 208, 211, 213, 215, 217, 220, 222, 224, 226, 228, 230, 232, 233, 235, 237, 238, 240, 241,
72-
242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254,
72+
242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 253, 254, 254, 254, 254, 254, 254, 255, 254, 254,
7373
254, 253, 253, 252, 252, 251, 250, 250, 249, 248, 247, 246, 244, 243, 242, 240, 239, 237, 236, 234, 232, 231,
7474
229, 227, 225, 223, 221, 219, 216, 214, 212, 209, 207, 204, 202, 199, 197, 194, 191, 189, 186, 183, 180, 177,
7575
175, 172, 169, 166, 163, 160, 157, 154, 150, 147, 144, 141, 138, 135, 132, 129, 125, 122, 119, 116, 113, 110,
@@ -114,4 +114,7 @@ static const unsigned char PTOHT[] = {0x00, 0x03, 0x05, 0x08, 0x0a, 0x0d, 0x0f,
114114
// Fade rates for the fade fx
115115
static const QList<qreal> FX_FADE_RATES({0.5, 1, 2, 5, 10, 25, 44, 50, 75, 100, 500});
116116

117+
// Dwell times for FX, in seconds
118+
static const QList<uint8_t> FX_DWELL_TIMES({ 0, 1, 2, 3, 4, 5, 7, 10, 15, 20, 30, 60 });
119+
117120
#endif // CONSTS_H

src/sacn/sacneffectengine.cpp

Lines changed: 83 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -284,13 +284,32 @@ void sACNEffectEngine::setRate(qreal hz)
284284

285285
void sACNEffectEngine::timerTick()
286286
{
287-
m_index++;
288287
char line[32];
289288

289+
// Returns true if the tracked value should be incremented
290+
const auto checkDwellTime = [this](quint8 value, quint8 holdValue) {
291+
if (m_dwellTime == 0) return true;
292+
293+
if (value == holdValue)
294+
{
295+
if (m_dwellTimeTracker.elapsed() >= m_dwellTime * 1000)
296+
{
297+
m_dwellTimeTracker.restart();
298+
return true;
299+
}
300+
else
301+
{
302+
return false;
303+
}
304+
}
305+
m_dwellTimeTracker.restart();
306+
return true;
307+
};
308+
290309
switch (m_mode)
291310
{
292311
case FxRamp:
293-
m_data++;
312+
if (checkDwellTime(m_data, 255)) m_data++;
294313
QMetaObject::invokeMethod(
295314
m_sender,
296315
"setLevelRange",
@@ -300,7 +319,7 @@ void sACNEffectEngine::timerTick()
300319
emit fxLevelChange(m_data);
301320
break;
302321
case FxInverseRamp:
303-
m_data--;
322+
if(checkDwellTime(m_data, 255)) m_data--;
304323
QMetaObject::invokeMethod(
305324
m_sender,
306325
"setLevelRange",
@@ -310,8 +329,12 @@ void sACNEffectEngine::timerTick()
310329
emit fxLevelChange(m_data);
311330
break;
312331
case FxSinewave:
313-
if (m_index >= sizeof(sinetable)) m_index = 0;
314-
m_data = sinetable[m_index];
332+
if (checkDwellTime(m_data, 255))
333+
{
334+
m_index++;
335+
if (m_index >= sizeof(sinetable)) m_index = 0;
336+
m_data = sinetable[m_index];
337+
}
315338
QMetaObject::invokeMethod(
316339
m_sender,
317340
"setLevelRange",
@@ -321,68 +344,72 @@ void sACNEffectEngine::timerTick()
321344
emit fxLevelChange(m_data);
322345
break;
323346
case FxChaseSnap:
324-
QMetaObject::invokeMethod(
325-
m_sender,
326-
"setLevelRange",
327-
Q_ARG(quint16, m_start),
328-
Q_ARG(quint16, m_end),
329-
Q_ARG(quint8, 0));
330-
QMetaObject::invokeMethod(
331-
m_sender,
332-
"setLevel",
333-
Q_ARG(quint16, m_index_chase),
334-
Q_ARG(quint8, m_manualLevel));
335-
336-
if (m_index_chase < m_start) m_index_chase = m_start;
337-
338-
if (++m_index_chase > m_end) m_index_chase = m_start;
347+
if (checkDwellTime(m_index_chase, m_index_chase))
348+
{
349+
if (m_index_chase < m_start) m_index_chase = m_start;
350+
if (++m_index_chase > m_end) m_index_chase = m_start;
339351

352+
QMetaObject::invokeMethod(
353+
m_sender,
354+
"setLevelRange",
355+
Q_ARG(quint16, m_start),
356+
Q_ARG(quint16, m_end),
357+
Q_ARG(quint8, 0));
358+
QMetaObject::invokeMethod(
359+
m_sender,
360+
"setLevel",
361+
Q_ARG(quint16, m_index_chase),
362+
Q_ARG(quint8, m_manualLevel));
363+
}
340364
break;
341365

342366
case FxChaseRamp:
343-
if (m_index > std::numeric_limits<decltype(m_data)>::max())
367+
{
368+
if (m_data < 255)
344369
{
345-
m_index = std::numeric_limits<decltype(m_data)>::min();
370+
m_data++;
371+
m_dwellTimeTracker.restart();
372+
}
373+
else if(checkDwellTime(m_data, 255))
374+
{
375+
m_data++;
346376
if (++m_index_chase > m_end) m_index_chase = m_start;
377+
if (m_index_chase < m_start) m_index_chase = m_start;
347378
}
348379

349-
if (m_index_chase < m_start) m_index_chase = m_start;
350-
351-
m_data = m_index;
352-
380+
auto levels = QByteArray(512, 0);
381+
levels[m_index_chase] = m_data;
353382
QMetaObject::invokeMethod(
354-
m_sender,
355-
"setLevelRange",
356-
Q_ARG(quint16, m_start),
357-
Q_ARG(quint16, m_end),
358-
Q_ARG(quint8, 0));
359-
QMetaObject::invokeMethod(m_sender, "setLevel", Q_ARG(quint16, m_index_chase), Q_ARG(quint8, m_data));
383+
m_sender,
384+
"setLevel",
385+
Q_ARG(QByteArray, levels));
360386
emit fxLevelChange(m_data);
361387

362388
break;
363-
389+
}
364390
case FxChaseSine:
365-
if (m_index >= sizeof(sinetable))
391+
{
392+
if (checkDwellTime(m_data, 255))
366393
{
367-
m_index = 0;
368-
if (++m_index_chase > m_end) m_index_chase = m_start;
394+
m_index++;
395+
if (m_index >= sizeof(sinetable))
396+
{
397+
m_index = 0;
398+
if (++m_index_chase > m_end) m_index_chase = m_start;
399+
if (m_index_chase < m_start) m_index_chase = m_start;
400+
}
401+
m_data = sinetable[m_index];
369402
}
370-
371-
if (m_index_chase < m_start) m_index_chase = m_start;
372-
373-
m_data = sinetable[m_index];
374-
403+
auto levels = QByteArray(512, 0);
404+
levels[m_index_chase] = m_data;
375405
QMetaObject::invokeMethod(
376406
m_sender,
377-
"setLevelRange",
378-
Q_ARG(quint16, m_start),
379-
Q_ARG(quint16, m_end),
380-
Q_ARG(quint8, 0));
381-
QMetaObject::invokeMethod(m_sender, "setLevel", Q_ARG(quint16, m_index_chase), Q_ARG(quint8, m_data));
407+
"setLevel",
408+
Q_ARG(QByteArray, levels));
382409
emit fxLevelChange(m_data);
383410

384411
break;
385-
412+
}
386413
case FxManual:
387414
QMetaObject::invokeMethod(
388415
m_sender,
@@ -394,7 +421,7 @@ void sACNEffectEngine::timerTick()
394421
case FxText:
395422
if (m_image)
396423
{
397-
if (m_index > m_imageWidth) m_index = 0;
424+
if (++m_index > m_imageWidth) m_index = 0;
398425

399426
for (int i = 0; i < 16; i++)
400427
{
@@ -427,11 +454,11 @@ void sACNEffectEngine::timerTick()
427454
}
428455
break;
429456
case FxVerticalBar:
430-
if (m_index > 31) m_index = 0;
457+
if (++m_index > 31) m_index = 0;
431458
QMetaObject::invokeMethod(m_sender, "setVerticalBar", Q_ARG(quint16, m_index), Q_ARG(quint8, 255));
432459
break;
433460
case FxHorizontalBar:
434-
if (m_index > 15) m_index = 0;
461+
if (++m_index > 15) m_index = 0;
435462
QMetaObject::invokeMethod(m_sender, "setHorizontalBar", Q_ARG(quint16, m_index), Q_ARG(quint8, 255));
436463
break;
437464
}
@@ -456,3 +483,9 @@ void sACNEffectEngine::slotCountChanged()
456483
{
457484
setEndAddress(m_end);
458485
}
486+
487+
void sACNEffectEngine::setDwellTime(quint16 seconds)
488+
{
489+
m_dwellTime = seconds;
490+
m_dwellTimeTracker.restart();
491+
}

src/sacn/sacneffectengine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public slots:
9494
void setDateStyle(sACNEffectEngine::DateStyle style);
9595

9696
void setRate(qreal hz);
97+
void setDwellTime(quint16 seconds);
9798

9899
void setManualLevel(int level);
99100

@@ -119,6 +120,8 @@ private slots:
119120
QImage m_renderedImage;
120121
quint8 * m_image;
121122
size_t m_imageWidth;
123+
quint16 m_dwellTime = 0;
124+
QElapsedTimer m_dwellTimeTracker;
122125

123126
// Render a single line of variable width text
124127
void renderText(QString text);

src/sacn/sacnsender.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,18 @@ void sACNSentUniverse::setLevel(const quint8 * data, int len, int start)
203203
}
204204
}
205205

206+
void sACNSentUniverse::setLevel(const QByteArray &data)
207+
{
208+
if (isSending())
209+
{
210+
if (memcmp(data.data(), m_slotData, static_cast<size_t>(data.length())) != 0)
211+
{
212+
memcpy(m_slotData, data.data(), static_cast<size_t>(data.length()));
213+
CStreamServer::getInstance()->SetUniverseDirty(m_handle);
214+
}
215+
}
216+
}
217+
206218
void sACNSentUniverse::setVerticalBar(quint16 index, quint8 level)
207219
{
208220
Q_ASSERT(index < 32);

src/sacn/sacnsender.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ public slots:
5858
* @param data - pointer to a data array
5959
*/
6060
void setLevel(const quint8 * data, int len, int start = 0);
61+
/**
62+
* @brief setLevel sets a level range
63+
* @param data - QByteArray of levels
64+
*/
65+
void setLevel(const QByteArray& data);
6166
/**
6267
* @brief sets a vertical bar on a 16x32 grid for the universe
6368
*/

src/ui/transmitwindow.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ transmitwindow::transmitwindow(int universe, QWidget * parent)
7070
ui->dlFadeRate->setMinimum(0);
7171
ui->dlFadeRate->setMaximum(static_cast<int>(FX_FADE_RATES.count() - 1));
7272
ui->dlFadeRate->setValue(0);
73+
on_dlFadeRate_valueChanged(0);
74+
75+
ui->dlDwellTime->setMinimum(0);
76+
ui->dlDwellTime->setMaximum(static_cast<int>(FX_DWELL_TIMES.count() - 1));
77+
ui->dlDwellTime->setValue(0);
78+
on_dlDwellTime_valueChanged(0);
7379

7480
ui->tabWidget->setCurrentIndex(0);
7581

@@ -685,6 +691,14 @@ void transmitwindow::on_dlFadeRate_valueChanged(int value)
685691
if (m_fxEngine) m_fxEngine->setRate(rate);
686692
}
687693

694+
void transmitwindow::on_dlDwellTime_valueChanged(int value)
695+
{
696+
const auto dwell = FX_DWELL_TIMES[value];
697+
ui->lblFadeDwell->setText(tr("Dwell Time %1s").arg(dwell));
698+
699+
if (m_fxEngine) m_fxEngine->setDwellTime(dwell);
700+
}
701+
688702
void transmitwindow::on_sbFadeRangeStart_valueChanged(int value)
689703
{
690704
if (value > ui->sbFadeRangeEnd->value())

src/ui/transmitwindow.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ protected slots:
6161
void on_slChannelCheck_valueChanged(int value);
6262
void on_btnCcBlink_pressed();
6363
void on_dlFadeRate_valueChanged(int value);
64+
void on_dlDwellTime_valueChanged(int value);
6465
void doBlink();
6566
void on_sbFadeRangeStart_valueChanged(int value);
6667
void on_sbFadeRangeEnd_valueChanged(int value);

src/widgets/glscopewidget.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,13 @@ ScopeModel::ScopeModel(QObject * parent)
552552
connect(this, &ScopeModel::queueTriggered, this, &ScopeModel::onQueueTriggered, Qt::QueuedConnection);
553553
}
554554

555-
ScopeModel::~ScopeModel() {}
555+
ScopeModel::~ScopeModel()
556+
{
557+
for (auto& listener : m_listeners)
558+
{
559+
listener->removeDirectCallback(this);
560+
}
561+
}
556562

557563
QVariant ScopeModel::headerData(int section, Qt::Orientation orientation, int role) const
558564
{

ui/transmitwindow.ui

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,30 +1765,51 @@ color: rgb(255, 85, 0);</string>
17651765
</widget>
17661766
</item>
17671767
<item>
1768-
<widget class="QDial" name="dlFadeRate">
1769-
<property name="focusPolicy">
1770-
<enum>Qt::FocusPolicy::NoFocus</enum>
1771-
</property>
1772-
<property name="wrapping">
1773-
<bool>false</bool>
1774-
</property>
1775-
<property name="notchesVisible">
1776-
<bool>true</bool>
1777-
</property>
1778-
</widget>
1779-
</item>
1780-
<item>
1781-
<widget class="QLabel" name="lblFadeSpeed">
1782-
<property name="focusPolicy">
1783-
<enum>Qt::FocusPolicy::NoFocus</enum>
1784-
</property>
1785-
<property name="text">
1786-
<string>Speed - 1Hz</string>
1787-
</property>
1788-
<property name="alignment">
1789-
<set>Qt::AlignmentFlag::AlignCenter</set>
1790-
</property>
1791-
</widget>
1768+
<layout class="QGridLayout" name="gridLayout_2">
1769+
<item row="0" column="0">
1770+
<widget class="QDial" name="dlFadeRate">
1771+
<property name="focusPolicy">
1772+
<enum>Qt::FocusPolicy::NoFocus</enum>
1773+
</property>
1774+
<property name="wrapping">
1775+
<bool>false</bool>
1776+
</property>
1777+
<property name="notchesVisible">
1778+
<bool>true</bool>
1779+
</property>
1780+
</widget>
1781+
</item>
1782+
<item row="0" column="1">
1783+
<widget class="QDial" name="dlDwellTime">
1784+
<property name="notchesVisible">
1785+
<bool>true</bool>
1786+
</property>
1787+
</widget>
1788+
</item>
1789+
<item row="1" column="0">
1790+
<widget class="QLabel" name="lblFadeSpeed">
1791+
<property name="focusPolicy">
1792+
<enum>Qt::FocusPolicy::NoFocus</enum>
1793+
</property>
1794+
<property name="text">
1795+
<string>Speed - 1Hz</string>
1796+
</property>
1797+
<property name="alignment">
1798+
<set>Qt::AlignmentFlag::AlignCenter</set>
1799+
</property>
1800+
</widget>
1801+
</item>
1802+
<item row="1" column="1">
1803+
<widget class="QLabel" name="lblFadeDwell">
1804+
<property name="text">
1805+
<string>Dwell - 0</string>
1806+
</property>
1807+
<property name="alignment">
1808+
<set>Qt::AlignmentFlag::AlignCenter</set>
1809+
</property>
1810+
</widget>
1811+
</item>
1812+
</layout>
17921813
</item>
17931814
<item>
17941815
<spacer name="verticalSpacer_3">

0 commit comments

Comments
 (0)