From 2f96483ce3c605793d4f03ebeec2db1f7556d86f Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Wed, 18 Nov 2020 23:25:12 +0000 Subject: [PATCH 01/11] Only skip the strncpy warning in GCC 8 upwards; older versions of GCC complain about a non-existent error --- plugins/dummy/DummyPortTest.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/dummy/DummyPortTest.cpp b/plugins/dummy/DummyPortTest.cpp index 0affb178fe..a39bb78152 100644 --- a/plugins/dummy/DummyPortTest.cpp +++ b/plugins/dummy/DummyPortTest.cpp @@ -663,24 +663,28 @@ void DummyPortTest::testParamDescription() { size_t str_len = std::min(sizeof(param_description.description), description.size()); /* - * Some versions of GCC 9 claim that the strncpy overflows the target + * Some versions of GCC 8 onwards claim that the strncpy overflows the target * string. While that's (kindof) true, all that happens is that we drop * the NUL byte, but that's on purpose. * * Disable the warning to avoid it being an issue, but only for this * line. * - * Also, work around clang producing an error on the + * Also, work around clang and older GCC producing an error on the * "stringop-truncation" warning not existing there. */ #ifndef __clang__ +#if __GNUC__ >= 8 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-truncation" -#endif +#endif // __GNUC__ >= 8 +#endif // __clang__ strncpy(param_description.description, description.c_str(), str_len); #ifndef __clang__ +#if __GNUC__ >= 8 #pragma GCC diagnostic pop -#endif +#endif // __GNUC__ >= 8 +#endif // __clang__ unsigned int param_data_length = ( sizeof(param_description) - sizeof(param_description.description) + From 9553c6c610da6ba71b65b0a93e0a1d882521c6f7 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Thu, 19 Nov 2020 00:26:13 +0000 Subject: [PATCH 02/11] Do the simple Python 3 compatibile print fixes; untested and doesn't fix everything, but a step in the right direction --- include/Makefile.mk | 3 +- include/ola/gen_callbacks.py | 209 ++++++++++++++++--------------- scripts/Makefile.mk | 3 +- scripts/enforce_licence.py | 27 ++-- scripts/verify_trees.py | 2 +- tools/Makefile.mk | 3 +- tools/ola_mon/ola_mon.py | 15 +-- tools/rdm/ModelCollector.py | 17 +-- tools/rdm/launch_tests.py | 5 +- tools/rdm/rdm_model_collector.py | 9 +- tools/rdm/rdm_responder_test.py | 5 +- tools/rdm/rdm_test_server.py | 3 +- tools/rdm/setup_patch.py | 5 +- 13 files changed, 160 insertions(+), 146 deletions(-) diff --git a/include/Makefile.mk b/include/Makefile.mk index 08797660e1..58d164cdf7 100644 --- a/include/Makefile.mk +++ b/include/Makefile.mk @@ -1,6 +1,5 @@ include include/ola/Makefile.mk include include/olad/Makefile.mk -# uncomment when include is py3 compatible -# PYTHON_BUILD_DIRS += include +PYTHON_BUILD_DIRS += include diff --git a/include/ola/gen_callbacks.py b/include/ola/gen_callbacks.py index 9061b9a8c7..b31c3ab3c8 100755 --- a/include/ola/gen_callbacks.py +++ b/include/ola/gen_callbacks.py @@ -17,18 +17,27 @@ # Copyright (C) 2010 Simon Newton +from __future__ import print_function +import sys import textwrap +if sys.version_info >= (3, 0): + try: + xrange + except NameError: + xrange = range + + def PrintLongLine(line): optional_nolint = '' if len(line) > 80: optional_nolint = ' // NOLINT(whitespace/line_length)' - print ('%s%s' % (line, optional_nolint)) + print('%s%s' % (line, optional_nolint)) def Header(): - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -143,16 +152,16 @@ def Header(): * @addtogroup callbacks * @{ */ - """) + """)) def Footer(): - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @} */ } // namespace ola - #endif // INCLUDE_OLA_CALLBACK_H_""") + #endif // INCLUDE_OLA_CALLBACK_H_""")) def GenerateBase(number_of_args): @@ -169,79 +178,79 @@ def GenerateBase(number_of_args): arg_types = ', '.join('Arg%d' % i for i in xrange(number_of_args)) # generate the base callback class - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief The base class for all %d argument callbacks. - */""" % number_of_args) + */""" % number_of_args)) PrintLongLine('template ' % (optional_comma, typenames)) - print 'class BaseCallback%d {' % number_of_args - print ' public:' - print ' virtual ~BaseCallback%d() {}' % number_of_args + print('class BaseCallback%d {' % number_of_args) + print(' public:') + print(' virtual ~BaseCallback%d() {}' % number_of_args) PrintLongLine(' virtual ReturnType Run(%s) = 0;' % arg_list) - print '};' - print '' + print('};') + print('') # generate the multi-use version of the callback - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A %d argument callback which can be called multiple times. - */""" % number_of_args) + */""" % number_of_args)) PrintLongLine('template ' % (optional_comma, typenames)) - print ('class Callback%d: public BaseCallback%d {' % - (number_of_args, number_of_args, optional_comma, arg_types)) - print ' public:' - print ' virtual ~Callback%d() {}' % number_of_args + print('class Callback%d: public BaseCallback%d {' % + (number_of_args, number_of_args, optional_comma, arg_types)) + print(' public:') + print(' virtual ~Callback%d() {}' % number_of_args) PrintLongLine(' ReturnType Run(%s) { return this->DoRun(%s); }' % (arg_list, args)) - print ' private:' - print ' virtual ReturnType DoRun(%s) = 0;' % arg_list - print '};' - print '' + print(' private:') + print(' virtual ReturnType DoRun(%s) = 0;' % arg_list) + print('};') + print('') # generate the single-use version of the callback - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A %d argument callback which deletes itself after it's run. - */""" % number_of_args) + */""" % number_of_args)) PrintLongLine('template ' % (optional_comma, typenames)) PrintLongLine("class SingleUseCallback%d: public BaseCallback%d<" "ReturnType%s%s> {" % (number_of_args, number_of_args, optional_comma, arg_types)) - print ' public:' - print ' virtual ~SingleUseCallback%d() {}' % number_of_args - print ' ReturnType Run(%s) {' % arg_list - print ' ReturnType ret = this->DoRun(%s);' % args - print ' delete this;' - print ' return ret;' - print ' }' - print ' private:' - print ' virtual ReturnType DoRun(%s) = 0;' % arg_list - print '};' - print '' + print(' public:') + print(' virtual ~SingleUseCallback%d() {}' % number_of_args) + print(' ReturnType Run(%s) {' % arg_list) + print(' ReturnType ret = this->DoRun(%s);' % args) + print(' delete this;') + print(' return ret;') + print(' }') + print(' private:') + print(' virtual ReturnType DoRun(%s) = 0;' % arg_list) + print('};') + print('') # the void specialization - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A %d arg, single use callback that returns void. - */""" % number_of_args) - print 'template <%s>' % typenames + */""" % number_of_args)) + print('template <%s>' % typenames) PrintLongLine("class SingleUseCallback%d: public BaseCallback%d<" "void%s%s> {" % (number_of_args, optional_comma, arg_types, number_of_args, optional_comma, arg_types)) - print ' public:' - print ' virtual ~SingleUseCallback%d() {}' % number_of_args - print ' void Run(%s) {' % arg_list - print ' this->DoRun(%s);' % args - print ' delete this;' - print ' }' - print ' private:' - print ' virtual void DoRun(%s) = 0;' % arg_list - print '};' - print '' + print(' public:') + print(' virtual ~SingleUseCallback%d() {}' % number_of_args) + print(' void Run(%s) {' % arg_list) + print(' this->DoRun(%s);' % args) + print(' delete this;') + print(' }') + print(' private:') + print(' virtual void DoRun(%s) = 0;' % arg_list) + print('};') + print('') def GenerateHelperFunction(bind_count, @@ -277,85 +286,85 @@ def GenerateHelperFunction(bind_count, 'typename Class, ', 'method', 'Class::*method') # The single use helper function - print textwrap.dedent("""\ + print(textwrap.dedent("""\ /** * @brief A helper function to create a new %s with %d * create-time arguments and %d execution time arguments.""" % - (parent_class, bind_count, exec_count)) + (parent_class, bind_count, exec_count))) if is_method: - print " * @tparam Class the class with the member function." - print " * @tparam ReturnType the return type of the callback." + print(" * @tparam Class the class with the member function.") + print(" * @tparam ReturnType the return type of the callback.") for i in xrange(bind_count): - print " * @tparam A%d a create-time argument type." % i + print(" * @tparam A%d a create-time argument type." % i) for i in xrange(exec_count): - print " * @tparam Arg%d an exec-time argument type." % i + print(" * @tparam Arg%d an exec-time argument type." % i) if is_method: - print " * @param object the object to call the member function on." - print (" * @param method the member function pointer to use when executing " - "the callback.") + print(" * @param object the object to call the member function on.") + print(" * @param method the member function pointer to use when executing " + "the callback.") else: - print (" * @param callback the function pointer to use when executing the " - "callback.") + print(" * @param callback the function pointer to use when executing the " + "callback.") for i in xrange(bind_count): - print " * @param a%d a create-time argument." % i + print(" * @param a%d a create-time argument." % i) if is_method: - print " * @returns The same return value as the member function." + print(" * @returns The same return value as the member function.") else: - print " * @returns The same return value as the function." - print " */" + print(" * @returns The same return value as the function.") + print(" */") PrintLongLine('template <%stypename ReturnType%s%s>' % (optional_class, optional_comma, ', '.join(typenames))) PrintLongLine('inline %s%d* %s(' % (parent_class, exec_count, exec_type_str, function_name)) if is_method: - print ' Class* object,' + print(' Class* object,') if bind_count: - print ' ReturnType (%s)(%s),' % (signature, method_types) + print(' ReturnType (%s)(%s),' % (signature, method_types)) for i in xrange(bind_count): suffix = ',' if i == bind_count - 1: suffix = ') {' - print ' A%d a%d%s' % (i, i, suffix) + print(' A%d a%d%s' % (i, i, suffix)) else: - print ' ReturnType (%s)(%s)) {' % (signature, method_types) + print(' ReturnType (%s)(%s)) {' % (signature, method_types)) padding = '' if is_method: - print ' return new MethodCallback%d_%d,' % (padding, parent_class, exec_count, exec_type_str)) if bind_count > 0 or exec_count > 0: - print ' %sReturnType,' % padding + print(' %sReturnType,' % padding) else: - print ' %sReturnType>(' % padding + print(' %sReturnType>(' % padding) for i in xrange(bind_count): if i == bind_count - 1 and exec_count == 0: suffix = '>(' else: suffix = ',' - print ' %sA%d%s' % (padding, i, suffix) + print(' %sA%d%s' % (padding, i, suffix)) for i in xrange(exec_count): suffix = ',' if i == exec_count - 1: suffix = '>(' - print ' %sArg%d%s' % (padding, i, suffix) + print(' %sArg%d%s' % (padding, i, suffix)) if is_method: - print ' object,' + print(' object,') if bind_count: - print ' %s,' % ptr_name + print(' %s,' % ptr_name) else: - print ' %s);' % ptr_name + print(' %s);' % ptr_name) for i in xrange(bind_count): suffix = ',' if i == bind_count - 1: suffix = ');' - print ' a%d%s' % (i, suffix) - print '}' - print '' - print '' + print(' a%d%s' % (i, suffix)) + print('}') + print('') + print('') def GenerateMethodCallback(bind_count, @@ -392,19 +401,19 @@ def GenerateMethodCallback(bind_count, 'typename Class, ', 'Method', 'MethodCallback') class_param, signature = 'Class *object, ', 'Class::*Method' - print ("""\ + print("""\ /** * @brief A %s callback with %d create-time args and %d exec time args */""" % (method_or_function, bind_count, exec_count)) PrintLongLine('template <%stypename Parent, typename ReturnType%s%s>' % (optional_class, optional_comma, ', '.join(typenames))) - print 'class %s%d_%d: public Parent {' % (class_name, bind_count, exec_count) - print ' public:' + print('class %s%d_%d: public Parent {' % (class_name, bind_count, exec_count)) + print(' public:') if is_method: - print ' typedef ReturnType (%s)(%s);' % (signature, method_types) + print(' typedef ReturnType (%s)(%s);' % (signature, method_types)) else: - print ' typedef ReturnType (*Function)(%s);' % (method_types) + print(' typedef ReturnType (*Function)(%s);' % (method_types)) if bind_count: PrintLongLine(' %s%d_%d(%s%s callback, %s):' % @@ -417,35 +426,35 @@ def GenerateMethodCallback(bind_count, PrintLongLine(' %s%s%d_%d(%s%s callback):' % (optional_explicit, class_name, bind_count, exec_count, class_param, method_or_function)) - print ' Parent(),' + print(' Parent(),') if is_method: - print ' m_object(object),' + print(' m_object(object),') if bind_count: - print ' m_callback(callback),' + print(' m_callback(callback),') for i in xrange(bind_count): suffix = ',' if i == bind_count - 1: suffix = ' {}' - print ' m_a%d(a%d)%s' % (i, i, suffix) + print(' m_a%d(a%d)%s' % (i, i, suffix)) else: - print ' m_callback(callback) {}' - print ' ReturnType DoRun(%s) {' % exec_args + print(' m_callback(callback) {}') + print(' ReturnType DoRun(%s) {' % exec_args) if is_method: PrintLongLine(' return (m_object->*m_callback)(%s);' % ', '.join(method_args)) else: - print ' return m_callback(%s);' % ', '.join(method_args) - print ' }' + print(' return m_callback(%s);' % ', '.join(method_args)) + print(' }') - print ' private:' + print(' private:') if is_method: - print ' Class *m_object;' - print ' %s m_callback;' % method_or_function + print(' Class *m_object;') + print(' %s m_callback;' % method_or_function) for i in xrange(bind_count): - print ' A%d m_a%d;' % (i, i) - print '};' - print '' - print '' + print(' A%d m_a%d;' % (i, i)) + print('};') + print('') + print('') # generate the helper methods GenerateHelperFunction(bind_count, diff --git a/scripts/Makefile.mk b/scripts/Makefile.mk index 199f0f9e58..369b2587aa 100644 --- a/scripts/Makefile.mk +++ b/scripts/Makefile.mk @@ -1,2 +1 @@ -# uncomment when scripts is py3 compatible -# PYTHON_BUILD_DIRS += scripts +PYTHON_BUILD_DIRS += scripts diff --git a/scripts/enforce_licence.py b/scripts/enforce_licence.py index 2e6699474e..9ca58ec952 100755 --- a/scripts/enforce_licence.py +++ b/scripts/enforce_licence.py @@ -16,6 +16,7 @@ # enforce_licence.py # Copyright (C) 2013 Simon Newton +from __future__ import print_function import difflib import getopt import glob @@ -66,7 +67,7 @@ def Usage(arg0): - print textwrap.dedent("""\ + print(textwrap.dedent("""\ Usage: %s Walk the directory tree from the current directory, and make sure all .cpp, @@ -75,7 +76,7 @@ def Usage(arg0): --diff Print the diffs. --fix Fix the files. - --help Display this message.""" % arg0) + --help Display this message.""" % arg0)) def ParseArgs(): @@ -83,8 +84,8 @@ def ParseArgs(): try: opts, args = getopt.getopt(sys.argv[1:], '', ['diff', 'fix', 'help']) - except getopt.GetoptError, err: - print str(err) + except getopt.GetoptError as e: + print(str(e)) Usage(sys.argv[0]) sys.exit(2) @@ -193,7 +194,7 @@ def ReplaceHeader(file_name, new_header, lang): line = f.readline() if breaks < 3: - print "Couldn't find header for %s so couldn't fix it" % file_name + print("Couldn't find header for %s so couldn't fix it" % file_name) f.close() return @@ -234,7 +235,7 @@ def GetDirectoryLicences(root_dir): lines = f.readlines() f.close() licences[dir_name] = TransformLicence(lines) - print 'Found LICENCE for directory %s' % dir_name + print('Found LICENCE for directory %s' % dir_name) # use this licence for all subdirs licence = licences.get(dir_name) @@ -294,22 +295,22 @@ def CheckLicenceForFile(file_name, licence, lang, diff, fix): if header == licence: expected_line = TransformLine(os.path.basename(file_name), lang) if lang != JS and file_name_line.rstrip('\n') != expected_line: - print ("File %s does not have a filename line after the licence; found " - "\"%s\" expected \"%s\"" % - (file_name, file_name_line.rstrip('\n'), expected_line)) + print("File %s does not have a filename line after the licence; found " + "\"%s\" expected \"%s\"" % + (file_name, file_name_line.rstrip('\n'), expected_line)) return 1 return 0 if fix: - print 'Fixing %s' % file_name + print('Fixing %s' % file_name) if lang == PYTHON and first_line is not None: licence = first_line + licence ReplaceHeader(file_name, licence, lang) return 1 else: - print "File %s does not start with \"%s...\"" % ( + print("File %s does not start with \"%s...\"" % ( file_name, - licence.split('\n')[(0 if (lang == PYTHON) else 1)]) + licence.split('\n')[(0 if (lang == PYTHON) else 1)])) if diff: d = difflib.Differ() result = list(d.compare(header.splitlines(1), licence.splitlines(1))) @@ -323,7 +324,7 @@ def main(): errors = 0 for dir_name, licence in licences.iteritems(): errors += CheckLicenceForDir(dir_name, licence, diff=diff, fix=fix) - print 'Found %d files with incorrect licences' % errors + print('Found %d files with incorrect licences' % errors) if errors > 0: sys.exit(1) else: diff --git a/scripts/verify_trees.py b/scripts/verify_trees.py index 018f421232..c4a8d114e2 100755 --- a/scripts/verify_trees.py +++ b/scripts/verify_trees.py @@ -67,7 +67,7 @@ def Usage(arg0): - print (textwrap.dedent("""\ + print(textwrap.dedent("""\ Usage: %s Check for files that exist in treeA but aren't in treeB. This can be used to diff --git a/tools/Makefile.mk b/tools/Makefile.mk index afa5742817..6a1ada14c2 100644 --- a/tools/Makefile.mk +++ b/tools/Makefile.mk @@ -14,5 +14,4 @@ dist_noinst_DATA += \ tools/ola_mon/ola_mon.conf \ tools/ola_mon/ola_mon.py -# uncomment when tools is py3 compatible -# PYTHON_BUILD_DIRS += tools +PYTHON_BUILD_DIRS += tools diff --git a/tools/ola_mon/ola_mon.py b/tools/ola_mon/ola_mon.py index 01ca2f65a3..ded58d1c89 100755 --- a/tools/ola_mon/ola_mon.py +++ b/tools/ola_mon/ola_mon.py @@ -16,6 +16,7 @@ # ola_mon.py # Copyright (C) 2010 Simon Newton +from __future__ import print_function import getopt import httplib import rrdtool @@ -192,15 +193,15 @@ def LoadConfig(config_file): keys = set(['OLAD_SERVERS', 'DATA_DIRECTORY', 'VARIABLES', 'WWW_DIRECTORY', 'CDEFS']) if not keys.issubset(locals.keys()): - print 'Invalid config file' + print('Invalid config file') sys.exit(2) if not len(locals['OLAD_SERVERS']): - print 'No hosts defined' + print('No hosts defined') sys.exit(2) if not len(locals['VARIABLES']): - print 'No variables defined' + print('No variables defined') sys.exit(2) return locals @@ -208,20 +209,20 @@ def LoadConfig(config_file): def Usage(binary): """Display the usage information.""" - print textwrap.dedent("""\ + print(textwrap.dedent("""\ Usage: %s [options] Start the OLAD monitoring system -h, --help Display this help message -c, --config The config file to use - """ % binary) + """ % binary)) def main(): try: opts, args = getopt.getopt(sys.argv[1:], "hc:v", ["help", "config="]) - except getopt.GetoptError, err: - print str(err) + except getopt.GetoptError as e: + print(str(e)) Usage(sys.argv[0]) sys.exit(2) diff --git a/tools/rdm/ModelCollector.py b/tools/rdm/ModelCollector.py index bceff07903..72a14c2364 100644 --- a/tools/rdm/ModelCollector.py +++ b/tools/rdm/ModelCollector.py @@ -15,6 +15,7 @@ # ModelCollector.py # Copyright (C) 2011 Simon Newton +from __future__ import print_function import logging import ola.RDMConstants from ola import PidStore @@ -507,11 +508,11 @@ def _RDMRequestComplete(self, response, unpacked_data, unpack_exception): # description for every slot if (response.response_type == OlaClient.RDM_NACK_REASON and response.pid != self.pid_store.GetName('SLOT_DESCRIPTION').value): - print ('Got nack with reason for pid %s: %s' % - (response.pid, response.nack_reason)) + print('Got nack with reason for pid %s: %s' % + (response.pid, response.nack_reason)) self._NextState() elif unpack_exception: - print unpack_exception + print(unpack_exception) self.wrapper.Stop() else: self._HandleResponse(unpacked_data) @@ -535,11 +536,11 @@ def _QueuedMessageComplete(self, response, unpacked_data, unpack_exception): logging.debug('Device doesn\'t support queued messages') self._NextState() else: - print 'Got nack for 0x%04hx with reason: %s' % ( - response.pid, response.nack_reason) + print('Got nack for 0x%04hx with reason: %s' % + (response.pid, response.nack_reason)) elif unpack_exception: - print 'Invalid Param data: %s' % unpack_exception + print('Invalid Param data: %s' % unpack_exception) self.queued_message_failures += 1 if self.queued_message_failures >= 10: # declare this bad and move on @@ -572,12 +573,12 @@ def _CheckForAckOrNack(self, response): True if this response was an ACK or NACK, False for all other cases. """ if not response.status.Succeeded(): - print response.status.message + print(response.status.message) self.wrapper.Stop() return False if response.response_code != OlaClient.RDM_COMPLETED_OK: - print response.ResponseCodeAsString() + print(response.ResponseCodeAsString()) self.wrapper.Stop() return False diff --git a/tools/rdm/launch_tests.py b/tools/rdm/launch_tests.py index 02485ca74c..2ef9aacc93 100755 --- a/tools/rdm/launch_tests.py +++ b/tools/rdm/launch_tests.py @@ -16,6 +16,7 @@ # launch_tests.py # Copyright (C) 2012 Simon Newton +from __future__ import print_function from optparse import OptionParser import logging import os @@ -78,14 +79,14 @@ def main(): config_dir = tempfile.mkdtemp() if not os.access(config_dir, os.W_OK): - print '%s is not writable' % config_dir + print('%s is not writable' % config_dir) sys.exit() # copy the skeleton configs files over, no symlinks since we don't want to # change the originals when olad writes settings. skel_config = options.skel if not os.path.isdir(skel_config): - print '%s is not a directory' % skel_config + print('%s is not a directory' % skel_config) sys.exit() for file_name in os.listdir(skel_config): diff --git a/tools/rdm/rdm_model_collector.py b/tools/rdm/rdm_model_collector.py index 490a15642b..f9d6b7ca74 100755 --- a/tools/rdm/rdm_model_collector.py +++ b/tools/rdm/rdm_model_collector.py @@ -16,6 +16,7 @@ # rdm_model_collector.py # Copyright (C) 2011 Simon Newton +from __future__ import print_function import getopt import logging import pprint @@ -31,7 +32,7 @@ def Usage(): - print textwrap.dedent("""\ + print(textwrap.dedent("""\ Usage: rdm_model_collector.py --universe Collect information about responders attached to a universe and output in a @@ -43,7 +44,7 @@ def Usage(): -p, --pid-location The directory to read PID definitions from. --skip-queued-messages Don't attempt to fetch queued messages for the device. - -u, --universe Universe number.""") + -u, --universe Universe number.""")) def main(): @@ -52,8 +53,8 @@ def main(): sys.argv[1:], 'dhp:u:', ['debug', 'help', 'skip-queued-messages', 'pid-location=', 'universe=']) - except getopt.GetoptError, err: - print str(err) + except getopt.GetoptError as e: + print(str(e)) Usage() sys.exit(2) diff --git a/tools/rdm/rdm_responder_test.py b/tools/rdm/rdm_responder_test.py index 52afa7cbce..36f04ce1d3 100755 --- a/tools/rdm/rdm_responder_test.py +++ b/tools/rdm/rdm_responder_test.py @@ -16,6 +16,7 @@ # rdm_responder_test.py # Copyright (C) 2010 Simon Newton +from __future__ import print_function from ola.testing.rdm import TestDefinitions, TestRunner from ola.testing.rdm.DMXSender import DMXSender from ola.testing.rdm.TestState import TestState @@ -97,7 +98,7 @@ def ParseOptions(): uid = UID.FromString(args[0]) if uid is None: parser.print_usage() - print 'Invalid UID: %s' % args[0] + print('Invalid UID: %s' % args[0]) sys.exit(2) options.uid = uid @@ -243,7 +244,7 @@ def main(): test_classes = TestRunner.GetTestClasses(TestDefinitions) if options.list_tests: for test_name in sorted(c.__name__ for c in test_classes): - print test_name + print(test_name) sys.exit(0) SetupLogging(options) diff --git a/tools/rdm/rdm_test_server.py b/tools/rdm/rdm_test_server.py index 32b2891b42..13d3de5c73 100755 --- a/tools/rdm/rdm_test_server.py +++ b/tools/rdm/rdm_test_server.py @@ -16,6 +16,7 @@ # rdm_test_server.py # Copyright (C) 2012 Ravindra Nath Kakarla & Simon Newton +from __future__ import print_function import cgi import json import logging @@ -623,7 +624,7 @@ class DownloadModelDataHandler(RequestHandler): """Take the data in the form and return it as a downloadable file.""" def HandleRequest(self, request, response): - print dir(request) + print(dir(request)) model_data = request.PostParam('model_data') or '' logging.info(model_data) diff --git a/tools/rdm/setup_patch.py b/tools/rdm/setup_patch.py index 3658245cde..2b0c6c6a38 100755 --- a/tools/rdm/setup_patch.py +++ b/tools/rdm/setup_patch.py @@ -16,6 +16,7 @@ # setup_patch.py # Copyright (C) 2012 Simon Newton +from __future__ import print_function import logging from ola.ClientWrapper import ClientWrapper from ola.OlaClient import OlaClient, Plugin @@ -148,10 +149,10 @@ def main(): patch_results = PatchPorts() if patch_results.status: - print ('Patched %d of %d ports' % + print('Patched %d of %d ports' % (patch_results.ports_patched, patch_results.ports_found)) else: - print 'Failed to patch' + print('Failed to patch') if __name__ == '__main__': From 3e2376df9fab7b48e7f6d7294b4225446a14c82b Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Fri, 20 Nov 2020 05:05:32 +0000 Subject: [PATCH 03/11] Add most of the E1.37-7 and E1.33 standardised PIDs --- data/rdm/pids.proto | 1075 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1074 insertions(+), 1 deletion(-) diff --git a/data/rdm/pids.proto b/data/rdm/pids.proto index 47b3c77dce..cebb8ef20e 100644 --- a/data/rdm/pids.proto +++ b/data/rdm/pids.proto @@ -4010,6 +4010,1079 @@ pid { } set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } +pid { + name: "SEARCH_DOMAIN" + value: 2049 + get_request { + } + get_response { + field { + type: STRING + name: "search_domain" + min_size: 0 + max_size: 231 + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: STRING + name: "search_domain" + min_size: 0 + max_size: 231 + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "BROKER_STATUS" + value: 2051 + get_request { + } + get_response { + field { + type: BOOL + name: "set_allowed" + } + field { + type: UINT8 + name: "broker_state" + label { + value: 0 + label: "Disabled" + } + label { + value: 1 + label: "Active" + } + label { + value: 2 + label: "Standby" + } + range { + min: 0 + max: 2 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT8 + name: "broker_state" + label { + value: 0 + label: "Disabled" + } + label { + value: 1 + label: "Active" + } + range { + min: 0 + max: 1 + } + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_LIST" + value: 2304 + get_request { + } + get_response { + field { + type: UINT32 + name: "list_change_number" + } + field { + type: GROUP + name: "endpoints" + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT8 + name: "endpoint_type" + label { + value: 0 + label: "Virtual Endpoint" + } + label { + value: 1 + label: "Physical Endpoint" + } + range { + min: 0 + max: 1 + } + } + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_LIST_CHANGE" + value: 2305 + get_request { + } + get_response { + field { + type: UINT32 + name: "list_change_number" + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "IDENTIFY_ENDPOINT" + value: 2306 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: BOOL + name: "identify_state" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: BOOL + name: "identify_state" + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_TO_UNIVERSE" + value: 2307 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT16 + name: "universe" + label { + value: 0 + label: "Unpatched" + } + label { + value: 65535 + label: "Composite" + } + range { + min: 0 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT16 + name: "universe" + label { + value: 0 + label: "Unpatch" + } + range { + min: 0 + max: 63999 + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_MODE" + value: 2308 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT8 + name: "endpoint_mode" + label { + value: 0 + label: "Disabled" + } + label { + value: 1 + label: "Input" + } + label { + value: 2 + label: "Output" + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT8 + name: "endpoint_mode" + label { + value: 0 + label: "Disable" + } + label { + value: 1 + label: "Input" + } + label { + value: 2 + label: "Output" + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_LABEL" + value: 2309 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: STRING + name: "endpoint_label" + max_size: 32 + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: STRING + name: "endpoint_label" + max_size: 32 + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "RDM_TRAFFIC_ENABLE" + value: 2310 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: BOOL + name: "rdm_enabled" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: BOOL + name: "rdm_enabled" + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "DISCOVERY_STATE" + value: 2311 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT16 + name: "device_count" + label { + value: 0 + label: "Incomplete" + } + label { + value: 65535 + label: "Unknown" + } + range { + min: 0 + max: 65535 + } + } + field { + type: UINT8 + name: "discovery_state" + label { + value: 0 + label: "Incomplete" + } + label { + value: 1 + label: "Incremental" + } + label { + value: 2 + label: "Full" + } + label { + value: 4 + label: "Completed" + } + range { + min: 0 + max: 2 + } + range { + min: 4 + max: 4 + } + range { + min: 128 + max: 223 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT8 + name: "discovery_state" + label { + value: 1 + label: "Incremental" + } + label { + value: 2 + label: "Full" + } + label { + value: 4 + label: "Stop" + } + range { + min: 1 + max: 2 + } + range { + min: 4 + max: 4 + } + range { + min: 128 + max: 223 + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "BACKGROUND_DISCOVERY" + value: 2312 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: BOOL + name: "background_discovery" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: BOOL + name: "background_discovery" + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_TIMING" + value: 2313 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT8 + name: "current_setting" + range { + min: 1 + max: 255 + } + } + field { + type: UINT8 + name: "number_of_settings" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + field { + type: UINT8 + name: "timing_setting" + range { + min: 1 + max: 255 + } + } + } + set_response { + field { + type: UINT16 + name: "endpoint_id" + label { + value: 65535 + label: "All Endpoints" + } + range { + min: 1 + max: 63999 + } + range { + min: 65535 + max: 65535 + } + } + } + set_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_TIMING_DESCRIPTION" + value: 2314 + get_request { + field { + type: UINT8 + name: "timing_setting" + range { + min: 1 + max: 255 + } + } + } + get_response { + field { + type: UINT8 + name: "timing_setting" + range { + min: 1 + max: 255 + } + } + field { + type: STRING + name: "description" + max_size: 32 + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_RESPONDERS" + value: 2315 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT32 + name: "list_change_number" + } + field { + type: GROUP + name: "uids" + field { + type: UID + name: "uid" + } + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "ENDPOINT_RESPONDER_LIST_CHANGE" + value: 2316 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UINT32 + name: "list_change_number" + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "BINDING_CONTROL_FIELDS" + value: 2317 + get_request { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UID + name: "uid" + } + } + get_response { + field { + type: UINT16 + name: "endpoint_id" + range { + min: 1 + max: 63999 + } + } + field { + type: UID + name: "uid" + } + field { + type: UINT16 + name: "control_bits" + } + field { + type: UID + name: "binding_uid" + label { + value: 0 + label: "No Information Present" + } + } + } + get_sub_device_range: ROOT_DEVICE +} +pid { + name: "BACKGROUND_QUEUED_STATUS_POLICY" + value: 2318 + get_request { + } + get_response { + field { + type: UINT8 + name: "current_policy_setting" + label { + value: 0 + label: "None" + } + label { + value: 1 + label: "Advisory" + } + label { + value: 2 + label: "Warning" + } + label { + value: 3 + label: "Error" + } + range { + min: 0 + max: 255 + } + } + field { + type: UINT8 + name: "num_policy_settings" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: UINT8 + name: "policy" + label { + value: 0 + label: "None" + } + label { + value: 1 + label: "Advisory" + } + label { + value: 2 + label: "Warning" + } + label { + value: 3 + label: "Error" + } + range { + min: 0 + max: 255 + } + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE +} +pid { + name: "BACKGROUND_QUEUED_STATUS_POLICY_DESCRIPTION" + value: 2319 + get_request { + field { + type: UINT8 + name: "policy_setting" + label { + value: 0 + label: "None" + } + label { + value: 1 + label: "Advisory" + } + label { + value: 2 + label: "Warning" + } + label { + value: 3 + label: "Error" + } + range { + min: 0 + max: 255 + } + } + } + get_response { + field { + type: UINT8 + name: "policy_setting" + } + field { + type: STRING + name: "description" + max_size: 32 + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE +} pid { name: "IDENTIFY_DEVICE" value: 4096 @@ -4548,4 +5621,4 @@ pid { } set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } -version: 1521301591 +version: 1605848134 From 745092a61cbff0334faa83b0fb3e36449b8ce4a5 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Fri, 20 Nov 2020 05:06:35 +0000 Subject: [PATCH 04/11] Remove the E1.37-7 and E1.33 standardised PIDs from the draft list --- data/rdm/draft_pids.proto | 853 +------------------------------------- 1 file changed, 1 insertion(+), 852 deletions(-) diff --git a/data/rdm/draft_pids.proto b/data/rdm/draft_pids.proto index 69a87d8e2a..c2e40fb995 100644 --- a/data/rdm/draft_pids.proto +++ b/data/rdm/draft_pids.proto @@ -1,852 +1 @@ -pid { - name: "BACKGROUND_QUEUED_STATUS_POLICY" - value: 32720 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "current_policy_setting" - } - field { - type: UINT8 - name: "num_policy_settings" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "policy" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "BACKGROUND_QUEUED_STATUS_POLICY_DESCRIPTION" - value: 32721 - get_request { - field { - type: UINT8 - name: "policy_setting" - } - } - get_response { - field { - type: UINT8 - name: "policy_setting" - } - field { - type: STRING - name: "description" - max_size: 32 - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "BACKGROUND_STATUS_TYPE" - value: 32722 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "status_type" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "status_type" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "QUEUED_STATUS_ENDPOINT_COLLECTION" - value: 32723 - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "status_type" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "QUEUED_STATUS_UID_COLLECTION" - value: 32724 - set_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UID - name: "target_uid" - } - field { - type: UINT8 - name: "status_type" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_LIST" - value: 32736 - get_request { - } - get_response { - field { - type: UINT32 - name: "list_change_number" - } - field { - type: GROUP - name: "endpoints" - field { - type: UINT16 - name: "endpoint_id" - } - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_TO_UNIVERSE" - value: 32737 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - } - field { - type: UINT16 - name: "universe" - label { - value: 65535 - label: "Composite" - } - range { - min: 1 - max: 65535 - } - } - field { - type: BOOL - name: "physical" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT16 - name: "universe" - label { - value: 65535 - label: "Composite" - } - range { - min: 1 - max: 63999 - } - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "RDM_TRAFFIC_ENABLE" - value: 32738 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: BOOL - name: "rdm_enabled" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: BOOL - name: "rdm_enabled" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_MODE" - value: 32739 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "endpoint_function" - label { - value: 0 - label: "Disabled" - } - label { - value: 1 - label: "Input" - } - label { - value: 2 - label: "Output" - } - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "endpoint_function" - label { - value: 0 - label: "Disabled" - } - label { - value: 1 - label: "Input" - } - label { - value: 2 - label: "Output" - } - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_LABEL" - value: 32740 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: STRING - name: "endpoint_label" - max_size: 32 - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: STRING - name: "endpoint_label" - max_size: 32 - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "DISCOVERY_STATE" - value: 32741 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT16 - name: "device_count" - label { - value: 65535 - label: "Not Supported" - } - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "discovery_state" - label { - value: 0 - label: "Not Run" - } - label { - value: 1 - label: "Completed" - } - label { - value: 2 - label: "Incremental" - } - label { - value: 3 - label: "Full" - } - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "discovery_state" - label { - value: 0 - label: "Not Run" - } - label { - value: 1 - label: "Completed" - } - label { - value: 2 - label: "Incremental" - } - label { - value: 3 - label: "Full" - } - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_TIMING" - value: 32742 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT8 - name: "current_setting" - } - field { - type: UINT8 - name: "number_of_settings" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: UINT8 - name: "timing_setting" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_TIMING_DESCRIPTION" - value: 32743 - get_request { - field { - type: UINT8 - name: "timing_setting" - } - } - get_response { - field { - type: UINT8 - name: "timing_setting" - } - field { - type: STRING - name: "description" - max_size: 32 - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "BINDING_CONTROL_FIELDS" - value: 32744 - get_request { - field { - type: UID - name: "uid" - } - } - get_response { - field { - type: UID - name: "uid" - } - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT16 - name: "control_bits" - } - field { - type: UID - name: "binding_uid" - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_IDENTIFY" - value: 32745 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: BOOL - name: "identify_state" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: BOOL - name: "identify_state" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "BACKGROUND_DISCOVERY" - value: 32746 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: BOOL - name: "background_discovery" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - field { - type: UINT16 - name: "endpoint_id" - label { - value: 65535 - label: "All Endpoints" - } - range { - min: 0 - max: 65535 - } - } - field { - type: BOOL - name: "background_discovery" - } - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_DEVICE_LIST_CHANGE" - value: 32747 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT32 - name: "list_change_number" - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_DEVICES" - value: 32748 - get_request { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - } - get_response { - field { - type: UINT16 - name: "endpoint_id" - range { - min: 0 - max: 65534 - } - } - field { - type: UINT32 - name: "list_change_number" - } - field { - type: GROUP - name: "uids" - field { - type: UID - name: "uid" - } - } - } - get_sub_device_range: ROOT_DEVICE -} -pid { - name: "TCP_COMMS_STATUS" - value: 32749 - get_request { - } - get_response { - field { - type: IPV4 - name: "controller_ip" - label { - value: 0 - label: "No Connection" - } - } - field { - type: UINT16 - name: "unhealthy_events" - } - field { - type: UINT16 - name: "connection_events" - } - } - get_sub_device_range: ROOT_DEVICE - set_request { - } - set_response { - } - set_sub_device_range: ROOT_DEVICE -} -pid { - name: "ENDPOINT_LIST_CHANGE" - value: 32750 - get_request { - } - get_response { - field { - type: UINT32 - name: "list_change_number" - } - } - get_sub_device_range: ROOT_DEVICE -} -version: 1438559429 +version: 1605848134 From 245c108d978c8fcbdc6626f750f23027cba2135b Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Fri, 20 Nov 2020 05:07:30 +0000 Subject: [PATCH 05/11] Add some more manufacturer-specific PIDs --- data/rdm/manufacturer_pids.proto | 224 ++++++++++++++++++++++++++++++- 1 file changed, 221 insertions(+), 3 deletions(-) diff --git a/data/rdm/manufacturer_pids.proto b/data/rdm/manufacturer_pids.proto index b9169a2ab8..2bc8001f35 100644 --- a/data/rdm/manufacturer_pids.proto +++ b/data/rdm/manufacturer_pids.proto @@ -2559,6 +2559,132 @@ manufacturer { } set_sub_device_range: ROOT_DEVICE } + pid { + name: "AUTO_MODE" + value: 34559 + get_request { + } + get_response { + field { + type: UINT8 + name: "program" + label { + value: 0 + label: "Disabled" + } + label { + value: 6 + label: "1 colour chase, 4 chans" + } + label { + value: 7 + label: "2 colour chase, 4 chans" + } + label { + value: 8 + label: "1 colour chase, 3 chans FW>=1.2" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "speed" + label { + value: 0 + label: "Fastest" + } + label { + value: 9 + label: "Slowest" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "delay" + label { + value: 0 + label: "Shortest" + } + label { + value: 9 + label: "Longest" + } + range { + min: 0 + max: 9 + } + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT8 + name: "program" + label { + value: 0 + label: "Disabled" + } + label { + value: 6 + label: "1 colour chase, 4 chans" + } + label { + value: 7 + label: "2 colour chase, 4 chans" + } + label { + value: 8 + label: "1 colour chase, 3 chans FW>=1.2" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "speed" + label { + value: 0 + label: "Fastest" + } + label { + value: 9 + label: "Slowest" + } + range { + min: 0 + max: 9 + } + } + field { + type: UINT8 + name: "delay" + label { + value: 0 + label: "Shortest" + } + label { + value: 9 + label: "Longest" + } + range { + min: 0 + max: 9 + } + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE + } } manufacturer { manufacturer_id: 18501 @@ -3213,14 +3339,14 @@ manufacturer { get_response { field { type: UINT16 - name: "enabled" + name: "fixture_id" } } get_sub_device_range: ROOT_DEVICE set_request { field { type: UINT16 - name: "enabled" + name: "fixture_id" } } set_response { @@ -6793,6 +6919,72 @@ manufacturer { } set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } + pid { + name: "PT_FEEDBACK" + value: 40960 + get_request { + } + get_response { + field { + type: BOOL + name: "Pan Tilt Feedback" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: BOOL + name: "Pan Tilt Feedback" + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE + } + pid { + name: "OUTPUT_UNIFORMITY" + value: 40969 + get_request { + } + get_response { + field { + type: BOOL + name: "Output Uniformity" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: BOOL + name: "Output Uniformity" + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE + } + pid { + name: "DL_COMPATIBLE_MODE" + value: 40973 + get_request { + } + get_response { + field { + type: BOOL + name: "DL Compatible Mode" + } + } + get_sub_device_range: ROOT_OR_SUBDEVICE + set_request { + field { + type: BOOL + name: "DL Compatible Mode" + } + } + set_response { + } + set_sub_device_range: ROOT_OR_ALL_SUBDEVICE + } pid { name: "TOUCHSCREEN_LOCK" value: 40975 @@ -7341,6 +7533,32 @@ manufacturer { set_sub_device_range: ROOT_OR_ALL_SUBDEVICE } } +manufacturer { + manufacturer_id: 21367 + manufacturer_name: "SWISSON AG" + pid { + name: "SWPID_AUTO_UNIVERSE_NUMBER" + value: 32898 + get_request { + } + get_response { + field { + type: UINT16 + name: "universe_number" + } + } + get_sub_device_range: ROOT_DEVICE + set_request { + field { + type: UINT16 + name: "universe_number" + } + } + set_response { + } + set_sub_device_range: ROOT_DEVICE + } +} manufacturer { manufacturer_id: 22355 manufacturer_name: "Wireless Solution Sweden AB" @@ -9164,4 +9382,4 @@ manufacturer { set_sub_device_range: ROOT_DEVICE } } -version: 1528709287 +version: 1605848134 From 13f248499b3372fa610e95acf84255d19538d3d7 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Fri, 20 Nov 2020 05:43:28 +0000 Subject: [PATCH 06/11] Add some more blob tests to the pack/unpack set --- python/ola/PidStoreTest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/ola/PidStoreTest.py b/python/ola/PidStoreTest.py index 8f93c82d29..9b6a832a0d 100755 --- a/python/ola/PidStoreTest.py +++ b/python/ola/PidStoreTest.py @@ -209,11 +209,13 @@ def testPackUnpack(self): # so test in two halves args = ["42"] blob = pid.Pack(args, PidStore.RDM_GET) + self.assertEqual(blob, binascii.unhexlify("2a")) decoded = pid._requests.get(PidStore.RDM_GET).Unpack(blob)[0] self.assertEqual(decoded['personality'], 42) args = ["42", "7", "UnpackTest"] blob = pid._responses.get(PidStore.RDM_GET).Pack(args)[0] + self.assertEqual(blob, binascii.unhexlify("2a0007556e7061636b54657374")) decoded = pid.Unpack(blob, PidStore.RDM_GET) self.assertEqual(decoded['personality'], 42) self.assertEqual(decoded['slots_required'], 7) @@ -264,6 +266,7 @@ def testPackRanges(self): pid = store.GetName("LANGUAGE_CAPABILITIES") args = ["en"] blob = pid._responses.get(PidStore.RDM_GET).Pack(args)[0] + self.assertEqual(blob, binascii.unhexlify("656e")) decoded = pid.Unpack(blob, PidStore.RDM_GET) self.assertEqual(decoded, {'languages': [{'language': 'en'}]}) From ad84c16fc67cecd76289497bee1874a4dfbede02 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Fri, 20 Nov 2020 16:51:25 +0000 Subject: [PATCH 07/11] Ensure we clean Python 3's __pycache__ too --- data/rdm/Makefile.mk | 5 ++++- include/ola/Makefile.mk | 4 ++++ python/examples/Makefile.mk | 4 +++- python/ola/rpc/Makefile.mk | 7 ++++--- scripts/Makefile.mk | 4 ++++ tools/Makefile.mk | 1 + tools/ola_mon/Makefile.mk | 3 +++ tools/rdm/Makefile.mk | 5 +++-- 8 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 tools/ola_mon/Makefile.mk diff --git a/data/rdm/Makefile.mk b/data/rdm/Makefile.mk index 8e0b28d031..07eea34b5a 100644 --- a/data/rdm/Makefile.mk +++ b/data/rdm/Makefile.mk @@ -30,4 +30,7 @@ data_rdm_PidDataTester_SOURCES = data/rdm/PidDataTest.cpp data_rdm_PidDataTester_CXXFLAGS = $(COMMON_TESTING_FLAGS) -DDATADIR=\"$(srcdir)/data/rdm\" data_rdm_PidDataTester_LDADD = $(COMMON_TESTING_LIBS) -CLEANFILES += data/rdm/PidDataTest.sh +CLEANFILES += \ + data/rdm/*.pyc \ + data/rdm/PidDataTest.sh + data/rdm/__pycache__/* diff --git a/include/ola/Makefile.mk b/include/ola/Makefile.mk index e112a03eb3..0f544b15cd 100644 --- a/include/ola/Makefile.mk +++ b/include/ola/Makefile.mk @@ -46,3 +46,7 @@ built_sources += include/ola/plugin_id.h include/ola/plugin_id.h: include/ola/Makefile.mk include/ola/make_plugin_id.sh common/protocol/Ola.proto mkdir -p $(top_builddir)/include/ola sh $(top_srcdir)/include/ola/make_plugin_id.sh $(top_srcdir)/common/protocol/Ola.proto > $(top_builddir)/include/ola/plugin_id.h + +CLEANFILES += \ + include/ola/*.pyc \ + include/ola/__pycache__/* diff --git a/python/examples/Makefile.mk b/python/examples/Makefile.mk index 0d4bf99692..ec298f2790 100644 --- a/python/examples/Makefile.mk +++ b/python/examples/Makefile.mk @@ -14,4 +14,6 @@ dist_noinst_SCRIPTS += \ python/examples/rdm_compare.py \ python/examples/rdm_snapshot.py -CLEANFILES += python/examples/*.pyc +CLEANFILES += \ + python/examples/*.pyc \ + python/examples/__pycache__/* diff --git a/python/ola/rpc/Makefile.mk b/python/ola/rpc/Makefile.mk index 79d8443bf2..4a56a4c049 100644 --- a/python/ola/rpc/Makefile.mk +++ b/python/ola/rpc/Makefile.mk @@ -28,6 +28,7 @@ python/ola/rpc/SimpleRpcControllerTest.sh: python/ola/rpc/Makefile.mk echo "PYTHONPATH=${top_builddir}/python $(PYTHON) ${srcdir}/python/ola/rpc/SimpleRpcControllerTest.py; exit \$$?" > $(top_builddir)/python/ola/rpc/SimpleRpcControllerTest.sh chmod +x $(top_builddir)/python/ola/rpc/SimpleRpcControllerTest.sh -CLEANFILES += python/ola/rpc/SimpleRpcControllerTest.sh \ - python/ola/rpc/*.pyc \ - python/ola/rpc/__pycache__/* +CLEANFILES += \ + python/ola/rpc/*.pyc \ + python/ola/rpc/SimpleRpcControllerTest.sh \ + python/ola/rpc/__pycache__/* diff --git a/scripts/Makefile.mk b/scripts/Makefile.mk index 369b2587aa..f3ce3f29c2 100644 --- a/scripts/Makefile.mk +++ b/scripts/Makefile.mk @@ -1 +1,5 @@ PYTHON_BUILD_DIRS += scripts + +CLEANFILES += \ + scripts/*.pyc \ + scripts/__pycache__/* diff --git a/tools/Makefile.mk b/tools/Makefile.mk index 6a1ada14c2..b08fe69fba 100644 --- a/tools/Makefile.mk +++ b/tools/Makefile.mk @@ -1,5 +1,6 @@ include tools/ja-rule/Makefile.mk include tools/logic/Makefile.mk +include tools/ola_mon/Makefile.mk include tools/ola_trigger/Makefile.mk include tools/rdm/Makefile.mk diff --git a/tools/ola_mon/Makefile.mk b/tools/ola_mon/Makefile.mk new file mode 100644 index 0000000000..cd7269b7a9 --- /dev/null +++ b/tools/ola_mon/Makefile.mk @@ -0,0 +1,3 @@ +CLEANFILES += \ + tools/ola_mon/*.pyc \ + tools/ola_mon/__pycache__/* diff --git a/tools/rdm/Makefile.mk b/tools/rdm/Makefile.mk index 9f236daaca..b3154d38fc 100644 --- a/tools/rdm/Makefile.mk +++ b/tools/rdm/Makefile.mk @@ -71,8 +71,9 @@ test_scripts += \ endif CLEANFILES += \ - tools/rdm/*.pyc \ - tools/rdm/ResponderTestTest.sh + tools/rdm/*.pyc \ + tools/rdm/ResponderTestTest.sh + tools/rdm/__pycache__/* if INSTALL_RDM_TESTS From 9acab2b7c74611675f16e261a8e0669c45845c62 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Sat, 21 Nov 2020 01:37:52 +0000 Subject: [PATCH 08/11] Add a missing backslash --- data/rdm/Makefile.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/rdm/Makefile.mk b/data/rdm/Makefile.mk index 07eea34b5a..264c778d99 100644 --- a/data/rdm/Makefile.mk +++ b/data/rdm/Makefile.mk @@ -32,5 +32,5 @@ data_rdm_PidDataTester_LDADD = $(COMMON_TESTING_LIBS) CLEANFILES += \ data/rdm/*.pyc \ - data/rdm/PidDataTest.sh + data/rdm/PidDataTest.sh \ data/rdm/__pycache__/* From 087aa76fe7074f1391fe2019859ccbcd0b5cc6e9 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Sat, 21 Nov 2020 01:38:06 +0000 Subject: [PATCH 09/11] Add another missing backslash --- tools/rdm/Makefile.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/rdm/Makefile.mk b/tools/rdm/Makefile.mk index b3154d38fc..41ba175541 100644 --- a/tools/rdm/Makefile.mk +++ b/tools/rdm/Makefile.mk @@ -72,7 +72,7 @@ endif CLEANFILES += \ tools/rdm/*.pyc \ - tools/rdm/ResponderTestTest.sh + tools/rdm/ResponderTestTest.sh \ tools/rdm/__pycache__/* if INSTALL_RDM_TESTS From 3c3db8038345a1047dcb2838bf7aaa1500ab3fb1 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Sun, 22 Nov 2020 01:06:39 +0000 Subject: [PATCH 10/11] Run both versions of flake8 on GitHub Actions --- .github/workflows/annotation.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/annotation.yml b/.github/workflows/annotation.yml index d757086e67..83464258c1 100644 --- a/.github/workflows/annotation.yml +++ b/.github/workflows/annotation.yml @@ -2,10 +2,19 @@ name: annotation on: [push, pull_request] jobs: - flake8-annotation: + flake8-annotation-python2: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - - name: Flake8 with annotations + - name: Flake8 with annotations - Python 2 # Using the flake8 options in the .flake8 file uses: peternewman/actions-flake8@python2 + flake8-annotation-python3: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Flake8 with annotations - Python 3 + # Using the flake8 options in the .flake8 file + uses: TrueBrain/actions-flake8@master + with: + only_warn: 1 From f655acee71bbe17709b20da395b02a67e2f83301 Mon Sep 17 00:00:00 2001 From: Peter Newman Date: Sun, 22 Nov 2020 10:55:35 +0000 Subject: [PATCH 11/11] Release 0.10.8 --- NEWS | 15 ++++++++++----- config/ola_version.m4 | 2 +- debian/changelog | 6 ++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index 594fd913ab..7a9071aa5e 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,11 @@ -x/11/2020 ola-0.10.8 +22/11/2020 ola-0.10.8 Features: * Support DragonFly BSD * Add another Debian test * Add the E1.33 NACK Reasons * Add the E1.37-7 NACK Reasons * Use clock_gettime's CLOCK_MONOTONIC if available + * Collect the PDL size in the model collector API: * Deprecated Clock::CurrentTime and added Clock::CurrentMonotonicTime and @@ -40,23 +41,27 @@ x/11/2020 ola-0.10.8 * Fix a bug with the Python ola_rdm_get and PROXIED_DEVICES display * Renamed RESONSE_INVALID_DESTINATION(sic) to RESPONSE_INVALID_DESTINATION in the ArduinoWidget code - * Fix compatibility with GCC 9 + * Fix compatibility with GCC 9 #1553 Debain #925793 * Ensure the GPIO plugin correctly writes to the last configured pin * Fix compatibility with ncurses 6 * Fix compatibility with Protobuf 3.7 and newer (tested with up to 3.12.2) + #1550, #1634 * Rename CircularDepdendancyException(sic) to CircularDependencyException in the Python RDM Test code, also the relevant comments * Fix a minor longstanding logging bug with Avahi subtype registration errors * Fix Enttec USB Pro Mk2 firmware >=4.15 RDM Discovery #1631 - * Fix compatibility with libmicrohttpd v0.9.71 and newer + * Fix compatibility with libmicrohttpd v0.9.71 and newer #1650 * Fix some Doxygen escaping * Rename AppendMultipler(sic) to AppendMultiplier in the RDM messaging code + * Fix a few edge cases in ola_trigger around whitespace in the config files + * Fix compatibility with clang 7 and newer (tested with up to 11) #1564 Internal: * Replace "readdir_r" with "readdir" since the former has been deprecated * Add a unit test for the functions that used readdir_r before - * Add a new 'make lint' target - * Add a new 'make flake8' target + * Add a new 'make flake8' target #1619 + * Add a new 'make cpplint' target + * Add a new 'make lint' target which runs the flake8 and cpplint runs 13/7/2018 ola-0.10.7 Features: diff --git a/config/ola_version.m4 b/config/ola_version.m4 index 592880fc4a..6840ce7899 100644 --- a/config/ola_version.m4 +++ b/config/ola_version.m4 @@ -19,7 +19,7 @@ # ----------------------------------------------------------------------------- m4_define([ola_major_version], [0]) m4_define([ola_minor_version], [10]) -m4_define([ola_revision_version], [7]) +m4_define([ola_revision_version], [8]) m4_define([ola_version], [ola_major_version.ola_minor_version.ola_revision_version]) diff --git a/debian/changelog b/debian/changelog index fbaab91ea2..2d08b9a0d5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +ola (0.10.8-1) unstable; urgency=low + + * New upstream release + + -- Peter Newman Fri, 22 Nov 2020 10:54:00 +0100 + ola (0.10.7-1) unstable; urgency=low * New upstream release