Description: <short summary of the patch>
 TODO: Put a short summary on the line above and replace this paragraph
 with a longer explanation of this change. Complete the meta-information
 with other relevant fields (see below for details). To make it easier, the
 information below has been extracted from the changelog. Adjust it or drop
 it.
 .
 ola (0.9.0-2) UNRELEASED; urgency=medium
 .
   * debian/compat: bump to compat level 9
   * debian/rules: convert to dh mode
   * debian/control: add missing build-dependencies
   * debian/ola-dev.install: don't install .la files
   * debian/control: make descriptions be policy-compliant, rename ola-dev to
     libola-dev
   * debian/ola.templates: don't state the obvious about dpkg-reconfigure
   * libola1: split off from ola, contains libraries only in multiarch-compliant
     paths
   * debian/ola.postinst: add --home parameter to adduser invocation
   * convert to dpkg-source v3 (quilt) format (let's give that another chance...)
   * debian/source/include-binaries: add, with doxygen/OLA.png
Author: Wouter Verhelst <wouter@debian.org>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: http://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: <YYYY-MM-DD>

--- /dev/null
+++ ola-0.9.0/.travis-ci.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+CPP_LINT_URL="http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py";
+
+if [[ $TASK = 'lint' ]]; then
+  # run the lint tool only if it is the requested task
+  wget -O cpplint.py $CPP_LINT_URL;
+  chmod u+x cpplint.py;
+  ./cpplint.py \
+    --filter=-legal/copyright,-readability/streams,-runtime/arrays \
+    $(find ./ -name "*.h" -or -name "*.cpp" | xargs)
+  if [[ $? -ne 0 ]]; then
+    exit 1;
+  fi;
+else
+  # Otherwise compile and check as normal
+  autoreconf -i && ./configure && make distcheck
+fi
--- /dev/null
+++ ola-0.9.0/.travis.yml
@@ -0,0 +1,25 @@
+language: cpp
+
+script:
+  - "bash -ex .travis-ci.sh"
+
+matrix:
+  include:
+    - compiler: clang
+      env: TASK='compile'
+    - compiler: gcc
+      env: TASK='compile'
+    - env: TASK='lint'
+  fast_finish: true
+
+cache: apt
+
+before_install:
+ - sudo apt-get update -qq
+ - sudo apt-cache search microhttpd
+ - sudo apt-get install -qq protobuf-compiler libprotobuf-lite7 libprotobuf-dev libprotoc-dev bison flex libftdi-dev  libftdi1 libusb-1.0-0-dev liblo-dev libavahi-client-dev uuid-dev libcppunit-dev libcppunit-1.12-1 libncurses5-dev python-protobuf libmicrohttpd-dev
+
+notifications:
+  irc: "chat.freenode.net#openlighting"
+  on_success: change
+  on_failure: change
--- /dev/null
+++ ola-0.9.0/CONTRIBUTING
@@ -0,0 +1,16 @@
+Contributing to Open Lighting Architecture (OLA)
+===============================================================================
+
+There are lots of ways you can help with OLA, such as running a Buildbot or
+writing documentation or user guides.
+
+If you’d like to contribute code (such as a new plugin, extending an existing
+feature or adding a brand new one), our preferred method is by forking us on
+GitHub, committing your code to there, then opening a pull request. We can then
+review and comment on your code if necessary and merge it in. It will also get
+checked automatically by Travis Continuous Integration (you will see a message
+within the pull request showing the status of the Travis tests); hence why we
+prefer pull requests to other methods such as patch submissions.
+
+When writing code, please read the README.developer file which covers coding
+style, the code review process and various other guidelines.
--- ola-0.9.0.orig/INSTALL
+++ ola-0.9.0/INSTALL
@@ -12,8 +12,8 @@ without warranty of any kind.
 Basic Installation
 ==================
 
-   Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package.  The following
+   Briefly, the shell command `./configure && make && make install'
+should configure, build, and install this package.  The following
 more-detailed instructions are generic; see the `README' file for
 instructions specific to this package.  Some packages provide this
 `INSTALL' file but do not implement all of the features documented
--- ola-0.9.0.orig/Makefile.am
+++ ola-0.9.0/Makefile.am
@@ -5,7 +5,7 @@ AUX_DIST                = $(auxdir)/inst
 include aminclude.am
 
 SUBDIRS = include data protoc common ola plugins slp olad python tools \
-          examples debian java man doxygen
+          examples java man doxygen
 
 # We want to build the python code when running distcheck.
 AM_DISTCHECK_CONFIGURE_FLAGS = --enable-python-libs
--- ola-0.9.0.orig/aclocal.m4
+++ ola-0.9.0/aclocal.m4
@@ -573,7 +573,8 @@ to "yes", and re-run configure.
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
-fi])
+fi
+])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
--- /dev/null
+++ ola-0.9.0/common/LICENCE
@@ -0,0 +1,13 @@
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
--- ola-0.9.0.orig/config/config.sub
+++ ola-0.9.0/config/config.sub
@@ -2,7 +2,7 @@
 # Configuration validation subroutine script.
 #   Copyright 1992-2013 Free Software Foundation, Inc.
 
-timestamp='2013-04-24'
+timestamp='2013-08-10'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -257,7 +257,7 @@ case $basic_machine in
 	| avr | avr32 \
 	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
 	| epiphany \
 	| fido | fr30 | frv \
@@ -372,7 +372,7 @@ case $basic_machine in
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
@@ -794,7 +794,7 @@ case $basic_machine in
 		os=-mingw64
 		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -830,7 +830,7 @@ case $basic_machine in
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
 	msys)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-msys
 		;;
 	mvs)
@@ -1546,6 +1546,9 @@ case $basic_machine in
 	c4x-* | tic4x-*)
 		os=-coff
 		;;
+	c8051-*)
+		os=-elf
+		;;
 	hexagon-*)
 		os=-elf
 		;;
--- ola-0.9.0.orig/config/libtool.m4
+++ ola-0.9.0/config/libtool.m4
@@ -1312,7 +1312,7 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
@@ -1324,9 +1324,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
 	    LD="${LD-ld} -m elf_i386_fbsd"
 	    ;;
 	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*)
+	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
+	  powerpc64-*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -1345,7 +1355,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
+	  powerpcle-*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -1688,7 +1701,8 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [d
     ;;
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+	test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
@@ -2512,17 +2526,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -2639,7 +2642,7 @@ linux*oldld* | linux*aout* | linux*coff*
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -2684,6 +2687,18 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -3243,10 +3258,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -3285,11 +3296,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
   else
@@ -4037,7 +4048,7 @@ m4_if([$1], [CXX], [
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -4101,7 +4112,7 @@ m4_if([$1], [CXX], [
 	    ;;
 	esac
 	;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
 	;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -4336,7 +4347,7 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -4578,6 +4589,9 @@ m4_if([$1], [CXX], [
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   *)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -4640,6 +4654,9 @@ dnl Note also adjust exclude_expsyms for
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   esac
 
   _LT_TAGVAR(ld_shlibs, $1)=yes
@@ -4861,7 +4878,7 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
@@ -5038,6 +5055,7 @@ _LT_EOF
 	if test "$aix_use_runtimelinking" = yes; then
 	  shared_flag="$shared_flag "'${wl}-G'
 	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
       else
 	# not using gcc
 	if test "$host_cpu" = ia64; then
@@ -5342,7 +5360,7 @@ _LT_EOF
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -6222,9 +6240,6 @@ if test "$_lt_caught_CXX_error" != yes;
         _LT_TAGVAR(ld_shlibs, $1)=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
@@ -6386,7 +6401,7 @@ if test "$_lt_caught_CXX_error" != yes;
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
--- ola-0.9.0.orig/config/ltmain.sh
+++ ola-0.9.0/config/ltmain.sh
@@ -70,7 +70,7 @@
 #         compiler:		$LTCC
 #         compiler flags:		$LTCFLAGS
 #         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2
+#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1.7
 #         automake:	$automake_version
 #         autoconf:	$autoconf_version
 #
@@ -80,7 +80,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION=2.4.2
+VERSION="2.4.2 Debian-2.4.2-1.7"
 TIMESTAMP=""
 package_revision=1.3337
 
@@ -5851,10 +5851,9 @@ func_mode_link ()
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
       # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
-      # -stdlib=*            select c++ std lib with clang
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-flto*|-fwhopr*|-fuse-linker-plugin|-stdlib=*)
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
         func_quote_for_eval "$arg"
 	arg="$func_quote_for_eval_result"
         func_append compile_command " $arg"
@@ -6125,7 +6124,10 @@ func_mode_link ()
 	case $pass in
 	dlopen) libs="$dlfiles" ;;
 	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
 	esac
       fi
       if test "$linkmode,$pass" = "lib,dlpreopen"; then
@@ -6445,19 +6447,19 @@ func_mode_link ()
 	    # It is a libtool convenience library, so add in its objects.
 	    func_append convenience " $ladir/$objdir/$old_library"
 	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
 	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
 	    func_fatal_error "\`$lib' is not a convenience library"
 	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $deplib"
-	  done
 	  continue
 	fi # $pass = conv
 
@@ -7350,6 +7352,9 @@ func_mode_link ()
 	    revision="$number_minor"
 	    lt_irix_increment=no
 	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
 	  esac
 	  ;;
 	no)
--- ola-0.9.0.orig/config/missing
+++ ola-0.9.0/config/missing
@@ -1,7 +1,7 @@
 #! /bin/sh
 # Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2012-06-26.16; # UTC
+scriptversion=2013-10-28.13; # UTC
 
 # Copyright (C) 1996-2013 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
@@ -160,7 +160,7 @@ give_advice ()
       ;;
    autom4te*)
       echo "You might have modified some maintainer files that require"
-      echo "the 'automa4te' program to be rebuilt."
+      echo "the 'autom4te' program to be rebuilt."
       program_details 'autom4te'
       ;;
     bison*|yacc*)
--- ola-0.9.0.orig/config/test-driver
+++ ola-0.9.0/config/test-driver
@@ -1,7 +1,7 @@
 #! /bin/sh
 # test-driver - basic testsuite driver script.
 
-scriptversion=2012-06-27.10; # UTC
+scriptversion=2013-07-13.22; # UTC
 
 # Copyright (C) 2011-2013 Free Software Foundation, Inc.
 #
@@ -44,13 +44,12 @@ print_usage ()
 Usage:
   test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
               [--expect-failure={yes|no}] [--color-tests={yes|no}]
-              [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
 The '--test-name', '--log-file' and '--trs-file' options are mandatory.
 END
 }
 
-# TODO: better error handling in option parsing (in particular, ensure
-# TODO: $log_file, $trs_file and $test_name are defined).
 test_name= # Used for reporting.
 log_file=  # Where to save the output of the test script.
 trs_file=  # Where to save the metadata of the test run.
@@ -69,10 +68,23 @@ while test $# -gt 0; do
   --enable-hard-errors) enable_hard_errors=$2; shift;;
   --) shift; break;;
   -*) usage_error "invalid option: '$1'";;
+   *) break;;
   esac
   shift
 done
 
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
 if test $color_tests = yes; then
   # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
   red='[0;31m' # Red.
--- ola-0.9.0.orig/configure.ac
+++ ola-0.9.0/configure.ac
@@ -639,7 +639,6 @@ AC_CONFIG_FILES([Makefile
                  common/web/Makefile
                  data/Makefile
                  data/rdm/Makefile
-                 debian/Makefile
                  doxygen/Makefile
                  doxygen/examples/Makefile
                  examples/Makefile
--- /dev/null
+++ ola-0.9.0/examples/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/include/ola/LICENCE
@@ -0,0 +1,13 @@
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
--- /dev/null
+++ ola-0.9.0/include/ola/acn/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/include/ola/e133/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/include/ola/slp/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/include/olad/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/java/src/test/java/ola/OlaClientTest.java
@@ -0,0 +1,191 @@
+package ola;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import ola.proto.Ola.DeviceConfigReply;
+import ola.proto.Ola.DeviceInfoReply;
+import ola.proto.Ola.DmxData;
+import ola.proto.Ola.MergeMode;
+import ola.proto.Ola.PatchAction;
+import ola.proto.Ola.PluginDescriptionReply;
+import ola.proto.Ola.PluginListReply;
+import ola.proto.Ola.RDMResponse;
+import ola.proto.Ola.RegisterAction;
+import ola.proto.Ola.TimeCodeType;
+import ola.proto.Ola.UID;
+import ola.proto.Ola.UIDListReply;
+import ola.proto.Ola.UniverseInfoReply;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test interaction with ola daemon.
+ * Assumes that an ola daemon is running.
+ */
+public class OlaClientTest {
+
+    private OlaClient client;
+
+    @Before
+    public void setup() throws Exception {
+        if (client == null) {
+            client = new OlaClient();
+        }
+    }
+
+    @Test
+    public void testGetPlugins() {
+        PluginListReply reply = client.getPlugins();
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testGetPluginDescription() {
+        PluginDescriptionReply reply = client.getPluginDescription(1);
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testGetDeviceInfo() {
+        DeviceInfoReply reply = client.getDeviceInfo();
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testGetCandidatePorts() {
+        DeviceInfoReply reply = client.getCandidatePorts(0);
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testConfigureDevice() {
+        DeviceConfigReply reply = client.configureDevice(2, new short[] {200,200,200});
+        // TODO verify result..
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testGetUniverseInfo() {
+        UniverseInfoReply reply = client.getUniverseInfo(0);
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testGetUIDs() {
+        UIDListReply reply = client.getUIDs(0);
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testForceDiscovery() {
+        UIDListReply reply = client.forceDiscovery(0, true);
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testGetDmx() {
+        client.sendDmx(0, new short[] {45,12,244});
+        DmxData reply = client.getDmx(0);
+        short[] state = client.convertFromUnsigned(reply.getData());
+        assertEquals(45, state[0]);
+        assertEquals(12, state[1]);
+        assertEquals(244, state[2]);
+
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testPatchPort() {
+        assertTrue(client.patchPort(1, 0, PatchAction.PATCH, 0));
+    }
+
+    @Test
+    public void testSendDmx() {
+        assertTrue(client.sendDmx(0, new short[] {10,23,244}));
+    }
+
+    @Test
+    public void testSetPortPriority() {
+        assertTrue(client.setPortPriority(1, 0, 0 ,0, true));
+    }
+
+    @Test
+    public void testSetUniverseName() {
+        client.setUniverseName(0, "outerspace");
+        UniverseInfoReply reply = client.getUniverseInfo(0);
+        assertEquals(reply.getUniverse(0).getName(), "outerspace");
+    }
+
+    @Test
+    public void testSetMergeMode() {
+        assertTrue(client.setMergeMode(0, MergeMode.HTP));
+    }
+
+    @Test
+    public void testRegisterForDmx() {
+        assertTrue(client.registerForDmx(0, RegisterAction.REGISTER));
+    }
+
+    @Test
+    public void testSetSourceUID() {
+        assertTrue(client.setSourceUID(1, 5));
+    }
+
+    @Test
+    public void testSendTimeCode() {
+        assertTrue(client.sendTimeCode(TimeCodeType.TIMECODE_DF, 10, 1, 1, 1));
+    }
+
+    @Test
+    public void testSendRDMCommand() {
+        UID id = UID.newBuilder()
+                .setDeviceId(1)
+                .setEstaId(9)
+                .build();
+        RDMResponse reply = client.sendRDMCommand(id, 0, 0, false, false, 0, new short[] {1,2,3});
+        assertNotNull(reply);
+        System.out.println(reply);
+    }
+
+    @Test
+    public void testStreamDmx() {
+        client.sendDmx(0, new short[] {9, 9, 9, 9});
+        client.streamDmx(0, new short[] {14, 33, 55, 99});
+        assertTrue(client.sendDmx(0, new short[] {9, 9, 9, 9}));
+    }
+
+
+    @Test
+    public void testSendDmxRepetitive() throws Exception {
+
+        OlaClient client = new OlaClient();
+
+        for (int i = 0; i < 20; i++) {
+            client.sendDmx(0, new short[] {135, 0, 0});
+            Thread.currentThread().sleep(50);
+            client.sendDmx(0, new short[] {135, 0, 135});
+            Thread.currentThread().sleep(50);
+        }
+
+        for (short i = 0; i < 25; i+=3) {
+            client.sendDmx(0, new short[] {i, 0, 0});
+        }
+        for (short i = 0; i < 25; i+=3) {
+            client.sendDmx(0, new short[] {255, i, 0});
+        }
+        for (short i = 0; i < 25; i+=3) {
+            client.sendDmx(0, new short[] {255, 255, i});
+        }
+
+        client.sendDmx(0, new short[] {0, 0, 0});
+    }
+}
--- /dev/null
+++ ola-0.9.0/javascript/ola/common/dmx_constants.js
@@ -0,0 +1,31 @@
+/**
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * DMX constants.
+ * Copyright (C) 2013 Peter Newman
+ */
+
+goog.provide('ola.common.DmxConstants');
+
+/** The first channel number @type {number} */
+ola.common.DmxConstants.MIN_CHANNEL_NUMBER = 1;
+/** The number of channels and max channel number @type {number} */
+ola.common.DmxConstants.MAX_CHANNEL_NUMBER = 512;
+/** The minimum value of a channel @type {number} */
+ola.common.DmxConstants.MIN_CHANNEL_VALUE = 0;
+/** The maximum value of a channel @type {number} */
+ola.common.DmxConstants.MAX_CHANNEL_VALUE = 255;
+/** The channel level at which to change the background colour @type {number} */
+ola.common.DmxConstants.BACKGROUND_CHANGE_CHANNEL_LEVEL = 90;
--- /dev/null
+++ ola-0.9.0/ola/LICENCE
@@ -0,0 +1,13 @@
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
--- /dev/null
+++ ola-0.9.0/olad/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/plugins/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/plugins/ftdidmx/FtdiWidget-ftd2xx.cpp
@@ -0,0 +1,312 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * This class is based on QLCFTDI class from
+ *
+ * Q Light Controller
+ * qlcftdi-ftd2xx.cpp
+ *
+ * Copyright (C) Heikki Junnila
+ *
+ * Only standard CPP conversion was changed and function name changed
+ * to follow OLA coding standards.
+ *
+ * by Rui Barreiros
+ */
+
+#include <strings.h>
+#include <ftdi.h>
+#include <assert.h>
+
+#include <string>
+#include <algorithm>
+#include <vector>
+
+#include "ola/Logging.h"
+#include "ola/BaseTypes.h"
+#include "plugins/ftdidmx/FtdiWidget.h"
+
+namespace ola {
+namespace plugin {
+namespace ftdidmx {
+
+using std::string;
+
+/**
+ * Get some interesting strings from the device.
+ *
+ * @param deviceIndex The device index, whose strings to get
+ * @param vendor Returned vendor string
+ * @param description Returned description string
+ * @param serial Returned serial string
+ * @return FT_OK if strings were extracted successfully
+ */
+static FT_STATUS qlcftdi_get_strings(DWORD deviceIndex,
+                                     string *vendor,
+                                     string *description,
+                                     string *serial) {
+  char cVendor[256];
+  char cVendorId[256];
+  char cDescription[256];
+  char cSerial[256];
+
+  FT_HANDLE handle;
+
+  FT_STATUS status = FT_Open(deviceIndex, &handle);
+  if (status != FT_OK)
+    return status;
+
+  FT_PROGRAM_DATA pData;
+  pData.Signature1 = 0;
+  pData.Signature2 = 0xFFFFFFFF;
+  pData.Version = 0x00000005;
+  pData.Manufacturer = cVendor;
+  pData.ManufacturerId = cVendorId;
+  pData.Description = cDescription;
+  pData.SerialNumber = cSerial;
+  status = FT_EE_Read(handle, &pData);
+  if (status == FT_OK) {
+    *vendor = string(cVendor);
+    *description = string(cDescription);
+    *serial = string(cSerial);
+  }
+
+  FT_Close(handle);
+
+  return status;
+}
+
+FtdiWidget::FtdiWidget(const string& serial,
+                       const string& name,
+                       uint32_t id)
+  : m_serial(serial)
+  , m_name(name)
+  , m_id(id) {
+}
+
+FtdiWidget::~FtdiWidget() {
+  if (IsOpen() == true)
+    Close();
+}
+
+void FtdiWidget::Widgets(FtdiWidgetInfoVector *widgets) {
+  int i = 0;
+  widgets->clear();
+
+  /* Find out the number of FTDI devices present */
+  DWORD num = 0;
+  FT_STATUS status = FT_CreateDeviceInfoList(&num);
+  if (status != FT_OK) {
+    qWarning() << Q_FUNC_INFO << "CreateDeviceInfoList:" << status;
+    return list;
+  } else if (num <= 0) {
+    return list;
+  }
+
+  // Allocate storage for list based on numDevices
+  FT_DEVICE_LIST_INFO_NODE* devInfo = new FT_DEVICE_LIST_INFO_NODE[num];
+
+  // Get the device information list
+  if (FT_GetDeviceInfoList(devInfo, &num) == FT_OK) {
+    for (DWORD i = 0; i < num; i++) {
+      string vendor, description, serial;
+
+      if (qlcftdi_get_strings(i, &vendor, &description, &serial) != FT_OK)
+        continue;
+
+      if (vendor.toUpper().contains("FTDI") == true)
+        widgets->push_back(FtdiWidgetInfo(name, serial, i);
+    }
+  }
+
+  delete [] devInfo;
+}
+
+bool FtdiWidget::Open() {
+  FT_STATUS status = FT_Open(m_id, &m_handle);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::Close() {
+  FT_STATUS status = FT_Close(m_handle);
+  m_handle = NULL;
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::IsOpen() const {
+  return (m_handle != NULL) ? true : false;
+}
+
+bool FtdiWidget::Reset() {
+  FT_STATUS status = FT_ResetDevice(m_handle);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::SetLineProperties() {
+  FT_STATUS status = FT_SetDataCharacteristics(m_handle, 8, 2, 0);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::SetBaudRate() {
+  FT_STATUS status = FT_SetBaudRate(m_handle, 250000);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::SetFlowControl() {
+  FT_STATUS status = FT_SetFlowControl(m_handle, 0, 0, 0);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::ClearRts() {
+  FT_STATUS status = FT_ClrRts(m_handle);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::PurgeBuffers() {
+  FT_STATUS status = FT_Purge(m_handle, FT_PURGE_RX | FT_PURGE_TX);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::SetBreak(bool on) {
+  FT_STATUS status;
+  if (on == true)
+    status = FT_SetBreakOn(m_handle);
+  else
+    status = FT_SetBreakOff(m_handle);
+
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::Write(const DmxBuffer& data) {
+  DWORD written = 0;
+  unsigned char buffer[DMX_UNIVERSE_SIZE + 1];
+  int unsigned length = DMX_UNIVERSE_SIZE;
+  buffer[0] = 0x00;
+
+  data.Get(buffer+1, &length);
+
+  FT_STATUS status = FT_Write(m_handle, buffer, sizeof(buffer), &written);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+bool FtdiWidget::Read(unsigned char *buffer, int size) {
+  DWORD read = 0;
+
+  FT_STATUS status = FT_Read(m_handle, buffer, size, &read);
+  if (status != FT_OK) {
+    OLA_WARN << name() << " " << status;
+    return false;
+  } else {
+    return true;
+  }
+}
+
+/**
+ * Setup our device for DMX send
+ * Mainly used to test if device is working correctly
+ * before AddDevice()
+ */
+bool FtdiWidget::SetupOutput() {
+  // Setup the widget
+  if (Open() == false) {
+    OLA_WARN << "Error Opening widget";
+    return false;
+  }
+
+  if (Reset() == false) {
+    OLA_WARN << "Error Resetting widget";
+    return false;
+  }
+
+  if (SetBaudRate() == false) {
+    OLA_WARN << "Error Setting baudrate";
+    return false;
+  }
+
+  if (SetLineProperties() == false) {
+    OLA_WARN << "Error setting line properties";
+    return false;
+  }
+
+  if (SetFlowControl() == false) {
+    OLA_WARN << "Error setting flow control";
+    return false;
+  }
+
+  if (PurgeBuffers() == false) {
+    OLA_WARN << "Error purging buffers";
+    return false;
+  }
+
+  if (ClearRts() == false) {
+    OLA_WARN << "Error clearing rts";
+    return false;
+  }
+
+  return true;
+}
+}  // namespace ftdidmx
+}  // namespace plugin
+}  // namespace ola
--- /dev/null
+++ ola-0.9.0/plugins/karate/README.protocol
@@ -0,0 +1,48 @@
+The KarateLight uses a very simple protocol to transfer data.
+
+Each command consists of a 4-byte header and up to 60 bytes payload data.
+For larger transfers data has to be send in multiple packets. This limitation
+is due to the fact that the USB-Endpoint-Buffers on the Pic-Microcontroller are
+only 64 bytes large.
+
+After each command send, the controller responds with an ACK-Message using the
+same format convention as for data send to the contoller.
+
+Structure of the 4-Byte-Header:
+Pos     Value
+0       Sync-Byte, always 0xAA for the host, 0x55 for the controller
+1       Command/Staus-Byte. See the command or status list
+2       Checksum-Byte. Contains a simple XOR-Checksum over all bytes, except itself
+3       Lenght-Byte. Number of Payload bytes Transmitted after the header.
+
+Status-List: (Send by the controller to the host)
+CMD_SYS_ACK = 0x01          The command has ben successfully processed
+CMD_SYS_NACK = 0x02         Error: while processing the command
+CMD_SYS_NACK_LENGTH = 0x03  Error: payload-lenght mismatch
+CMD_SYS_NACK_CHECK = 0x03   Error: Checksum mismatch
+CMD_SYS_NIMP = 0xFF         Error: Command not implemented
+CMD_SYS_IR = 0x10           (not used)
+CMD_SYS_DATA = 0x20         Same as ACK, but with payload-data
+
+Command-List: (Send by the host to the controller)
+ID-Code                      Payload   Description
+CMD_GET_VERSION = 0x01       0         Read the Firmware Version
+CMD_GET_HARDWARE = 0x02      0         Read the Hardware Version
+CMD_GET_TLC_PWM_VALUE = 0x14 0         Read the PWM-Callibration Value.
+CMD_SET_TLC_PWM_VALUE = 0x15 2         Set PWM-Callibration Value (only for debugging)
+CMD_SET_DATA_00 = 0x20       32        Send a batch of 32 data bytes (1st. slot)
+...                          32        ... 
+CMD_SET_DATA_0F = 0x2F       32        Send a batch of 32 data bytes (16th. slot)
+CMD_GET_N_CHANNELS = 0x30    0         Read the number of Channels
+CMD_READ_ADC0 = 0x40         0         Read the value of A/D-Channel 0 (may be used for ambient light compensation)
+CMD_READ_EEPROM = 0x50       1         Read a single byte from the eeprom
+CMD_WRITE_EEPROM = 0x51      2         Write a single byte to the eeprom
+CMD_BOOT_REQUEST = 0x80      0         Start bootload-sequence
+CMD_BOOT_START = 0x81        2         Enter bootload-sequence
+
+Example:
+Host Sends "0xAA 0x01 0xAB 0x00" (Read Firmware Version)
+Controller Replies "0x55 0x20 0x44 0x01 0x30" (Send Data, Value = 0x30)
+
+
+For more information please take a look at the firmware. The protocol handler is in the file comm.c.
--- /dev/null
+++ ola-0.9.0/scripts/enforce_licence.py
@@ -0,0 +1,208 @@
+#!/usr/bin/python
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU Library General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# enforce_licence.py
+# Copyright (C) 2013 Simon Newton
+
+import difflib
+import getopt
+import glob
+import os
+import pprint
+import re
+import sys
+import textwrap
+
+CPP, PYTHON = xrange(2)
+
+IGNORED_FILES = [
+  'examples/ola-dmxconsole.cpp',
+  'examples/ola-dmxmonitor.cpp',
+  'include/ola/gen_callbacks.py',
+  'ola/common.h',
+  'tools/ola_trigger/config.tab.cpp',
+  'tools/ola_trigger/config.tab.h',
+  'tools/ola_trigger/lex.yy.cpp',
+]
+
+def Usage(arg0):
+  print textwrap.dedent("""\
+  Usage: %s
+
+  Walk the directory tree from the current directory, and make sure all .cpp
+  and .h files have the appropriate Licence. The licence is determined from the
+  LICENCE file in each branch of the directory tree.
+
+    --diff               Print the diffs.
+    --fix                Fix the files.
+    --help               Display this message.""" % arg0)
+
+def ParseArgs():
+  """Extract the options."""
+  try:
+    opts, args = getopt.getopt(sys.argv[1:], '',
+                               ['diff', 'fix', 'help'])
+  except getopt.GetoptError, err:
+    print str(err)
+    Usage(sys.argv[0])
+    sys.exit(2)
+
+  help = False
+  fix = False
+  diff = False
+  for o, a in opts:
+    if o in ('--diff'):
+      diff = True
+    elif o in ('--fix'):
+      fix = True
+    elif o in ('-h', '--help'):
+      Usage(sys.argv[0])
+      sys.exit()
+
+  if help:
+    Usage(sys.argv[0])
+    sys.exit(0)
+  return diff, fix
+
+def IgnoreFile(file_name):
+  for ignored_file in IGNORED_FILES:
+    if file_name.endswith(ignored_file):
+      return True
+  return False
+
+def TransformLicence(licence):
+  """Wrap a licence in C++ style comments,"""
+  output = []
+  output.append('/*')
+  for l in licence:
+    l = l.strip()
+    if l:
+      output.append(' * %s' % l)
+    else:
+      output.append(' *')
+  output.append(' *')
+  return '\n'.join(output)
+
+def TransformCppToPythonLicence(licence):
+  """Change a C++ licence to Python style"""
+  lines = licence.split('\n')
+  output = []
+  for l in lines[1:]:
+    output.append('#%s' % l[2:])
+  return '\n'.join(output)
+
+def ReplaceHeader(file_name, new_header, lang):
+  f = open(file_name)
+  breaks = 0
+  line = f.readline()
+  while line != '':
+    if lang == CPP and re.match(r'^ \*\s*\n$', line):
+      breaks += 1
+    if lang == PYTHON and re.match(r'^#\s*\n$', line):
+      breaks += 1
+    if breaks == 3:
+      break
+    line = f.readline()
+
+  remainder = f.read()
+  f.close()
+
+  f = open(file_name, 'w')
+  f.write(new_header)
+  f.write('\n')
+  f.write(remainder)
+  f.close()
+
+def GetDirectoryLicences(root_dir):
+  """Walk the directory tree and determine the licence for each directory."""
+  LICENCE_FILE = 'LICENCE'
+  licences = {}
+
+  for dir_name, subdirs, files in os.walk(root_dir):
+    # skip the root_dir since the licence file is different there
+    if dir_name == root_dir:
+      continue
+
+    # don't descend into hidden dirs like .libs and .deps
+    subdirs[:] = [d for d in subdirs if not d.startswith('.')]
+
+    if LICENCE_FILE in files:
+      f = open(os.path.join(dir_name, LICENCE_FILE))
+      lines = f.readlines()
+      f.close()
+      licences[dir_name] = TransformLicence(lines)
+      print 'Adding LICENCE for %s' % dir_name
+
+    # use this licence for all subdirs
+    licence = licences.get(dir_name)
+    if licence is not None:
+      for sub_dir in subdirs:
+        licences[os.path.join(dir_name, sub_dir)] = licence
+  return licences
+
+def CheckLicenceForDir(dir_name, licence, diff, fix):
+  """Check all files in a directory contain the correct licence."""
+  # glob doesn't support { } so we iterate instead
+  for match in ['*.h', '*.cpp']:
+    for file_name in glob.glob(os.path.join(dir_name, match)):
+      # skip the generated protobuf code
+      if '.pb.' in file_name:
+        continue
+      CheckLicenceForFile(file_name, licence, CPP, diff, fix)
+
+  for file_name in glob.glob(os.path.join(dir_name, '*.py')):
+    # skip the generated protobuf code
+    if file_name.endswith('__init__.py') or file_name.endswith('pb2.py'):
+      continue
+    python_licence = TransformCppToPythonLicence(licence)
+    CheckLicenceForFile(file_name, python_licence, PYTHON, diff, fix)
+
+def CheckLicenceForFile(file_name, licence, lang, diff, fix):
+  """Check a file contains the correct licence."""
+  if IgnoreFile(file_name):
+    return
+
+  f = open(file_name)
+  header_size = len(licence)
+  first_line = None
+  if lang == PYTHON:
+    first_line = f.readline()
+  header = f.read(header_size)
+  f.close()
+  if header == licence:
+    return
+
+  if fix:
+    print 'Fixing %s' % file_name
+    if lang == PYTHON:
+      licence = first_line + licence
+    ReplaceHeader(file_name, licence, lang)
+  else:
+    print "File %s does not start with \"%s...\"" % (
+        file_name,
+        licence.split('\n')[(0 if (lang == PYTHON) else 1)])
+    if diff:
+      d = difflib.Differ()
+      result = list(d.compare(header.splitlines(1), licence.splitlines(1)))
+      pprint.pprint(result)
+
+def main():
+  diff, fix = ParseArgs()
+  licences = GetDirectoryLicences(os.getcwd())
+  for dir_name, licence in licences.iteritems():
+    CheckLicenceForDir(dir_name, licence, diff=diff, fix=fix)
+
+if __name__ == '__main__':
+  main()
--- /dev/null
+++ ola-0.9.0/slp/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/tools/e133/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/tools/logic/README.md
@@ -0,0 +1,13 @@
+In order to compile the logic rdm sniffer, you need to set the include path to your SaleaeDeviceSDK. Example:
+
+```
+./configure CPPFLAGS="-I/path/to/your/SaleaeDeviceSdk-1.1.9/include"
+```
+
+The configure script should output something like this:
+
+```
+checking SaleaeDeviceApi.h usability... yes
+checking SaleaeDeviceApi.h presence... yes
+checking for SaleaeDeviceApi.h... yes
+```
--- /dev/null
+++ ola-0.9.0/tools/ola_trigger/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/tools/rdmpro/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/tools/usbpro/LICENCE
@@ -0,0 +1,13 @@
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Library General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--- /dev/null
+++ ola-0.9.0/version.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+VERSION_FILE="include/ola/base/Version.h"
+
+major=`grep OLA_VERSION_MAJOR $VERSION_FILE | cut -d\  -f3`
+minor=`grep OLA_VERSION_MINOR $VERSION_FILE | cut -d\  -f3`
+revision=`grep OLA_VERSION_REVISION $VERSION_FILE | cut -d\  -f3`
+
+echo "$major.$minor.$revision"
--- ola-0.9.0.orig/python/ola/rpc/Makefile.am
+++ ola-0.9.0/python/ola/rpc/Makefile.am
@@ -22,4 +22,4 @@ SimpleRpcControllerTest.sh: Makefile
 	echo "export PYTHONPATH=${top_builddir}/python; $(PYTHON) ${srcdir}/SimpleRpcControllerTest.py; exit \$$?" > SimpleRpcControllerTest.sh
 	chmod +x SimpleRpcControllerTest.sh
 
-CLEANFILES = Rpc_pb2.* SimpleRpcControllerTest.sh
+CLEANFILES = Rpc_pb2.* SimpleRpcControllerTest.sh *pyc
--- ola-0.9.0.orig/tools/rdm/static/rdmtests.html
+++ ola-0.9.0/tools/rdm/static/rdmtests.html
@@ -3,8 +3,8 @@
   <head>
     <link type='text/css' rel='stylesheet' href='/static/jquery-ui-1.8.21.custom.css' />
     <link rel='stylesheet' href='/static/ui.multiselect.css' type='text/css'>
-    <script src='/static/jquery-1.7.2.min.js'></script>
-    <script src='/static/jquery-ui-1.8.21.custom.min.js'></script>
+    <script src='/static/jquery.min.js'></script>
+    <script src='/static/jquery-ui.custom.min.js'></script>
     <script src='/static/ui.multiselect.js'></script>
     <script src='/static/rdm_tests.js'></script>
     <title>RDM Tests</title>
