diff --git a/AUTHORS b/AUTHORS index fb7e730b46..61669a0b8e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -29,3 +29,4 @@ Contributors: Stefan Krüger, added APA102 support to the SPI Plugin Tobi Schäfer, for the MacPort files Stefan S, improved timing with monotonic clock + Markus, improved uartdmx plugin timing behaviour diff --git a/README.md b/README.md deleted file mode 120000 index 100b93820a..0000000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -README \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000000..100b93820a --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +README \ No newline at end of file diff --git a/data/rdm/PidDataTest.py b/data/rdm/PidDataTest.py old mode 100755 new mode 100644 diff --git a/data/rdm/download.sh b/data/rdm/download.sh old mode 100755 new mode 100644 diff --git a/debian/rules b/debian/rules old mode 100755 new mode 100644 diff --git a/doxygen/copy-doc.sh b/doxygen/copy-doc.sh old mode 100755 new mode 100644 diff --git a/examples/testdata/dos_line_endings b/examples/testdata/dos_line_endings index a9164566ef..ccfeea45f2 100644 --- a/examples/testdata/dos_line_endings +++ b/examples/testdata/dos_line_endings @@ -1,6 +1,6 @@ -OLA Show -1 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -463 -1 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -553 -1 208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +OLA Show +1 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +463 +1 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +553 +1 208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/include/ola/gen_callbacks.py b/include/ola/gen_callbacks.py old mode 100755 new mode 100644 diff --git a/include/ola/make_plugin_id.sh b/include/ola/make_plugin_id.sh old mode 100755 new mode 100644 diff --git a/include/ola/rdm/make_rdm_codes.sh b/include/ola/rdm/make_rdm_codes.sh old mode 100755 new mode 100644 diff --git a/include/ola/timecode/make_timecode.sh b/include/ola/timecode/make_timecode.sh old mode 100755 new mode 100644 diff --git a/libola.pc.in b/libola.pc.in index 723c724012..67cf1f5883 100644 --- a/libola.pc.in +++ b/libola.pc.in @@ -1,11 +1,11 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: libola -Version: @VERSION@ -Description: Open Lighting Architecture Client -Requires: protobuf -Libs: -L${libdir} -lola -lolacommon @OLA_CLIENT_LIBS@ -Cflags: -I${includedir} +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libola +Version: @VERSION@ +Description: Open Lighting Architecture Client +Requires: protobuf +Libs: -L${libdir} -lola -lolacommon @OLA_CLIENT_LIBS@ +Cflags: -I${includedir} diff --git a/mac_build.sh b/mac_build.sh old mode 100755 new mode 100644 diff --git a/man/generate-html.sh b/man/generate-html.sh old mode 100755 new mode 100644 diff --git a/olad/www/console_values.html b/olad/www/console_values.html index 182623838b..f8fa1a86d5 100644 --- a/olad/www/console_values.html +++ b/olad/www/console_values.html @@ -1,14 +1,14 @@ - - - DMX Console - - + + + DMX Console + + diff --git a/plugins/uartdmx/UartDmxThread.cpp b/plugins/uartdmx/UartDmxThread.cpp index 8f776b4a78..c19e06987c 100644 --- a/plugins/uartdmx/UartDmxThread.cpp +++ b/plugins/uartdmx/UartDmxThread.cpp @@ -22,7 +22,9 @@ #include #include #include +#include #include "ola/Clock.h" +#include "ola/Constants.h" #include "ola/Logging.h" #include "ola/StringUtils.h" #include "plugins/uartdmx/UartWidget.h" @@ -72,11 +74,20 @@ bool UartDmxThread::WriteDMX(const DmxBuffer &buffer) { * The method called by the thread */ void *UartDmxThread::Run() { - TimeStamp ts1, ts2; - Clock clock; CheckTimeGranularity(); DmxBuffer buffer; + // basic frame time (without break): MAB + (time per bit * bits per slot * (slots per universe + slot for start code)) + MALFT + // the basic_frame_time is in microseconds + int basic_frame_time = DMX_MAB + (DMX_TIME_PER_BIT * DMX_BITS_PER_SLOT * (DMX_UNIVERSE_SIZE + DMX_SLOT_START_CODE)) + m_malft; + + // the maximum time between breaks should be 1 second, and the minimum time 1204 + // the capping of max and min values is done to honor the standard + int basic_frame_time_capped = std::max(std::min(basic_frame_time, DMX_BREAK_TIME_MAX), DMX_BREAK_TIME_MIN); + + // converts the frame time into milliseconds for later use + m_frame_time = static_cast(floor(basic_frame_time_capped / static_cast(ONE_THOUSAND))); + // Setup the widget if (!m_widget->IsOpen()) m_widget->SetupOutput(); @@ -93,28 +104,85 @@ void *UartDmxThread::Run() { buffer.Set(m_buffer); } - if (!m_widget->SetBreak(true)) - goto framesleep; + WriteDMXToUART(buffer); + } + return NULL; +} - if (m_granularity == GOOD) - usleep(m_breakt); +/** + * Write the DMX data to the actual UART interface. + */ +void UartDmxThread::WriteDMXToUART(const DmxBuffer &buffer) { + TimeStamp ts1; + Clock clock; - if (!m_widget->SetBreak(false)) - goto framesleep; + // ensures that ts1 has a valid value for the framesleep if break condition cannot be locked/released + clock.CurrentMonotonicTime(&ts1); - if (m_granularity == GOOD) - usleep(DMX_MAB); + if (!m_widget->SetBreak(true)) { + frameSleep(ts1); + return; + } - if (!m_widget->Write(buffer)) - goto framesleep; + if (m_granularity == GOOD) + usleep(m_breakt); - framesleep: - // Sleep for the remainder of the DMX frame time - usleep(m_malft); + if (!m_widget->SetBreak(false)) { + frameSleep(ts1); + return; } - return NULL; + + // stores the time stamp for the elapsed time calculation during the framesleep + clock.CurrentMonotonicTime(&ts1); + + if (m_granularity == GOOD) + usleep(DMX_MAB); + + m_widget->Write(buffer); + + frameSleep(ts1); } +/** + * Sleeps for the rest of the frame time and tries to recover the granularity if needed. + */ +void UartDmxThread::frameSleep(const TimeStamp &ts1) { + TimeStamp ts2, ts3; + Clock clock; + + clock.CurrentMonotonicTime(&ts2); + TimeInterval elapsed = ts2 - ts1; + + if (m_granularity == GOOD) { + // Sleep for at least the remaining frame time to ensure we start the next frame afresh. + while (elapsed.InMilliSeconds() < m_frame_time) { + usleep(ONE_THOUSAND); + clock.CurrentMonotonicTime(&ts2); + elapsed = ts2 - ts1; + } + } else { + // See if we can drop out of bad mode. + usleep(ONE_THOUSAND); + clock.CurrentMonotonicTime(&ts3); + TimeInterval interval = ts3 - ts2; + + /** + * If sleeping for 1ms takes longer than this, don't trust + * usleep for this session + */ + if (interval.InMilliSeconds() <= BAD_GRANULARITY_LIMIT) { + m_granularity = GOOD; + OLA_INFO << "Switching from BAD to GOOD granularity for UART thread"; + } + + elapsed = ts3 - ts1; + // Sleep for at least the remaining frame time to ensure we start the next frame afresh. + while (elapsed.InMilliSeconds() < m_frame_time) { + clock.CurrentMonotonicTime(&ts2); + elapsed = ts2 - ts1; + } + } +} /** * Check the granularity of usleep. @@ -122,17 +190,19 @@ void *UartDmxThread::Run() { void UartDmxThread::CheckTimeGranularity() { TimeStamp ts1, ts2; Clock clock; - /** If sleeping for 1ms takes longer than this, don't trust - * usleep for this session - */ - const int threshold = 3; clock.CurrentMonotonicTime(&ts1); usleep(1000); clock.CurrentMonotonicTime(&ts2); TimeInterval interval = ts2 - ts1; - m_granularity = interval.InMilliSeconds() > threshold ? BAD : GOOD; + + /** + * If sleeping for 1ms takes longer than this, don't trust + * usleep for this session + */ + m_granularity = (interval.InMilliSeconds() > BAD_GRANULARITY_LIMIT) ? + BAD : GOOD; OLA_INFO << "Granularity for UART thread is " << (m_granularity == GOOD ? "GOOD" : "BAD"); } diff --git a/plugins/uartdmx/UartDmxThread.h b/plugins/uartdmx/UartDmxThread.h index cbd8d8f945..2075b71649 100644 --- a/plugins/uartdmx/UartDmxThread.h +++ b/plugins/uartdmx/UartDmxThread.h @@ -24,6 +24,7 @@ #include "ola/DmxBuffer.h" #include "ola/thread/Thread.h" +#include "ola/Clock.h" namespace ola { namespace plugin { @@ -49,10 +50,20 @@ class UartDmxThread : public ola::thread::Thread { DmxBuffer m_buffer; ola::thread::Mutex m_term_mutex; ola::thread::Mutex m_buffer_mutex; + unsigned int m_frame_time; void CheckTimeGranularity(); + void frameSleep(const TimeStamp &ts1); + void WriteDMXToUART(const DmxBuffer &buffer); + static const uint32_t DMX_MAB = 16; + static const uint32_t BAD_GRANULARITY_LIMIT = 3; + static const int DMX_BREAK_TIME_MIN = 1204; // in microseconds + static const int DMX_BREAK_TIME_MAX = USEC_IN_SECONDS; + static const uint32_t DMX_TIME_PER_BIT = 4; // in microseconds + static const uint32_t DMX_BITS_PER_SLOT = 11; + static const uint32_t DMX_SLOT_START_CODE = 1; DISALLOW_COPY_AND_ASSIGN(UartDmxThread); }; diff --git a/python/examples/ola_artnet_params.py b/python/examples/ola_artnet_params.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_fetch_dmx.py b/python/examples/ola_fetch_dmx.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_patch_unpatch.py b/python/examples/ola_patch_unpatch.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_plugin_info.py b/python/examples/ola_plugin_info.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_rdm_discover.py b/python/examples/ola_rdm_discover.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_rdm_get.py b/python/examples/ola_rdm_get.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_recv_dmx.py b/python/examples/ola_recv_dmx.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_send_dmx.py b/python/examples/ola_send_dmx.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_simple_fade.py b/python/examples/ola_simple_fade.py old mode 100755 new mode 100644 diff --git a/python/examples/ola_universe_info.py b/python/examples/ola_universe_info.py old mode 100755 new mode 100644 diff --git a/python/examples/rdm_compare.py b/python/examples/rdm_compare.py old mode 100755 new mode 100644 diff --git a/python/examples/rdm_snapshot.py b/python/examples/rdm_snapshot.py old mode 100755 new mode 100644 diff --git a/python/ola/DUBDecoderTest.py b/python/ola/DUBDecoderTest.py old mode 100755 new mode 100644 diff --git a/python/ola/MACAddressTest.py b/python/ola/MACAddressTest.py old mode 100755 new mode 100644 diff --git a/python/ola/PidStoreTest.py b/python/ola/PidStoreTest.py old mode 100755 new mode 100644 diff --git a/python/ola/UIDTest.py b/python/ola/UIDTest.py old mode 100755 new mode 100644 diff --git a/python/ola/rpc/SimpleRpcControllerTest.py b/python/ola/rpc/SimpleRpcControllerTest.py old mode 100755 new mode 100644 diff --git a/scripts/enforce_licence.py b/scripts/enforce_licence.py old mode 100755 new mode 100644 diff --git a/scripts/verify_trees.py b/scripts/verify_trees.py old mode 100755 new mode 100644 diff --git a/tools/ola_mon/ola_mon.py b/tools/ola_mon/ola_mon.py old mode 100755 new mode 100644 diff --git a/tools/rdm/launch_tests.py b/tools/rdm/launch_tests.py old mode 100755 new mode 100644 diff --git a/tools/rdm/rdm_model_collector.py b/tools/rdm/rdm_model_collector.py old mode 100755 new mode 100644 diff --git a/tools/rdm/rdm_responder_test.py b/tools/rdm/rdm_responder_test.py old mode 100755 new mode 100644 diff --git a/tools/rdm/setup_patch.py b/tools/rdm/setup_patch.py old mode 100755 new mode 100644 diff --git a/tools/usbpro/download_firmware.sh b/tools/usbpro/download_firmware.sh old mode 100755 new mode 100644