diff --git a/modules/catkin_ws/src/wiringPi/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/COPYING.LESSER
new file mode 100644
index 0000000000000000000000000000000000000000..65c5ca88a67c30becee01c5a8816d964b03862f9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/COPYING.LESSER
@@ -0,0 +1,165 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/modules/catkin_ws/src/wiringPi/INSTALL b/modules/catkin_ws/src/wiringPi/INSTALL
new file mode 100644
index 0000000000000000000000000000000000000000..8e0c43cf3994eab0b51fe83854ca624058331215
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/INSTALL
@@ -0,0 +1,36 @@
+
+How to install wiringPi
+=======================
+
+The easiest way is to use the supplied 'build' script:
+
+  ./build
+
+that should do a complete install or upgrade of wiringPi for you.
+
+That will install a dynamic library.
+
+Some distributions do not have /usr/local/lib in the default LD_LIBRARY_PATH. To
+fix this, you need to edit /etc/ld.so.conf and add in a single line:
+
+  /usr/local/lib
+
+then run the ldconfig command.
+
+  sudo ldconfig
+
+If you want to install a static library, you may need to do this manually:
+
+  cd wiringPi
+  make static
+  sudo make install-static
+
+
+To un-install wiringPi:
+
+  ./build uninstall
+
+Gordon Henderson
+
+projects@drogon.net
+https://projects.drogon.net/
diff --git a/modules/catkin_ws/src/wiringPi/Makefile b/modules/catkin_ws/src/wiringPi/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..a02d1a3b6c5f7472e39a4ee3dce031afbee4bbf7
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/Makefile
@@ -0,0 +1,22 @@
+clean:
+	make -C wiringPi clean
+	make -C devLib clean
+	make -C gpio clean
+	make -C examples clean
+	make -C examples/Gertboard clean
+	make -C examples/PiFace clean
+	make -C examples/q2w clean
+	make -C examples/PiGlow clean
+	
+install:
+	make -C wiringPi
+	make -C wiringPi install
+	make -C devLib
+	make -C devLib install
+	make -C gpio
+	make -C gpio install
+	mkdir -p /usr/share/wiringPi/examples/Gertboard
+	mkdir -p /usr/share/wiringPi/examples/PiFace
+	mkdir -p /usr/share/wiringPi/examples/PiGlow
+	mkdir -p /usr/share/wiringPi/examples/q2w
+	find examples -exec install -m 0644 -D -t /usr/share/wiringPi/examples {} \;
diff --git a/modules/catkin_ws/src/wiringPi/People b/modules/catkin_ws/src/wiringPi/People
new file mode 100644
index 0000000000000000000000000000000000000000..b339494e17b7f1e7bf03d63c415be4004b9aba11
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/People
@@ -0,0 +1,33 @@
+
+Just a quick note to some people who've provided help, suggestions,
+bug-fixes, etc. along the way...
+
+Nick Lott: (And others)
+  Hints about making it work with C++
+
+Philipp Stefan Neininger:
+  Minor bug in the Makefile to do with cross compiling
+
+Chris McSweeny
+  Hints and tips about the use of arithmetic in gettimeofday()
+    inside the dealyMicrosecondsHard() function.
+  And spotting a couple of schoolboy errors in the (experimental)
+  softServo code, prompting me to completely re-write it.
+
+Armin (Via projects website)
+  Some pointers about the i2c-dev.h files.
+
+Arno Wagner
+  Suggestions for the mmap calls in wiringPiSetup()
+
+CHARLES Thibaut:
+  A small issue in softTone
+
+Xian Stannard
+  Fixing some typos in the man page!
+
+Andre Crone
+  Suggested the __WIRING_PI.H__ round wiringPi.h
+
+Rik Teerling
+  Pointing out some silly mistooks in the I2C code...
diff --git a/modules/catkin_ws/src/wiringPi/README.TXT b/modules/catkin_ws/src/wiringPi/README.TXT
new file mode 100644
index 0000000000000000000000000000000000000000..7789b2eba205801581acb565686f402ff62a0479
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/README.TXT
@@ -0,0 +1,26 @@
+
+wiringPi README
+===============
+
+Please note that the official way to get wiringPi is via git from
+git.drogon.net and not GitHub.
+
+ie.
+
+  git clone git://git.drogon.net/wiringPi
+
+The version of wiringPi held on GitHub by "Gadgetoid" is used to build the
+wiringPython, Ruby, Perl, etc. wrappers for these other languages. This
+version may lag the official Drogon release.  Pull requests may not be
+accepted to Github....
+
+Please see
+
+  http://wiringpi.com/
+
+for the official documentation, etc. and the best way to submit bug reports, etc.
+is by sending an email to projects@drogon.net
+
+Thanks!
+
+  -Gordon
diff --git a/modules/catkin_ws/src/wiringPi/build b/modules/catkin_ws/src/wiringPi/build
new file mode 100755
index 0000000000000000000000000000000000000000..bac483a475e7072b85df09d7df5737e694b7811a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/build
@@ -0,0 +1,103 @@
+#!/bin/sh
+
+check_make_ok() {
+  if [ $? != 0 ]; then
+    echo ""
+    echo "Make Failed..."
+    echo "Please check the messages and fix any problems. If you're still stuck,"
+    echo "then please email all the output and as many details as you can to"
+    echo "  projects@drogon.net"
+    echo ""
+    exit 1
+  fi
+}
+
+if [ x$1 = "xclean" ]; then
+  cd wiringPi
+  echo -n "wiringPi:   "	; make clean
+  cd ../devLib
+  echo -n "DevLib:     "	; make clean
+  cd ../gpio
+  echo -n "gpio:       "	; make clean
+  cd ../examples
+  echo -n "Examples:   "	; make clean
+  cd Gertboard
+  echo -n "Gertboard:  "	; make clean
+  cd ../PiFace
+  echo -n "PiFace:     "	; make clean
+  cd ../q2w
+  echo -n "Quick2Wire: "	; make clean
+  cd ../PiGlow
+  echo -n "PiGlow:     "	; make clean
+  exit
+fi
+
+if [ x$1 = "xuninstall" ]; then
+  cd wiringPi
+  echo -n "wiringPi: " ; sudo make uninstall
+  cd ../devLib
+  echo -n "DevLib:   " ; sudo make uninstall
+  cd ../gpio
+  echo -n "gpio:     " ; sudo make uninstall
+  exit
+fi
+
+
+  echo "wiringPi Build script"
+  echo "====================="
+  echo
+
+  echo
+  echo "WiringPi Library"
+  cd wiringPi
+  sudo make uninstall
+  if [ x$1 = "xstatic" ]; then
+    make static
+    check_make_ok
+    sudo make install-static
+  else
+    make
+    check_make_ok
+    sudo make install
+  fi
+  check_make_ok
+
+  echo
+  echo "WiringPi Devices Library"
+  cd ../devLib
+  sudo make uninstall
+  if [ x$1 = "xstatic" ]; then
+    make static
+    check_make_ok
+    sudo make install-static
+  else
+    make
+    check_make_ok
+    sudo make install
+  fi
+  check_make_ok
+
+  echo
+  echo "GPIO Utility"
+  cd ../gpio
+  make
+  check_make_ok
+  sudo make install
+  check_make_ok
+
+# echo
+# echo "Examples"
+# cd ../examples
+# make
+# cd ..
+
+echo
+echo All Done.
+echo ""
+echo "NOTE: To compile programs with wiringPi, you need to add:"
+echo "    -lwiringPi"
+echo "  to your compile line(s) To use the Gertboard, MaxDetect, etc."
+echo "  code (the devLib), you need to also add:"
+echo "    -lwiringPiDev"
+echo "  to your compile line(s)."
+echo ""
diff --git a/modules/catkin_ws/src/wiringPi/devLib/Makefile b/modules/catkin_ws/src/wiringPi/devLib/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..4ba17746d7c58d8e2af36041c3c6f84994e515d8
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/Makefile
@@ -0,0 +1,134 @@
+# Makefile:
+#	wiringPi device - Wiring Compatable library for the Raspberry Pi
+#
+#	Copyright (c) 2012-2013 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	https://projects.drogon.net/raspberry-pi/wiringpi/
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+DYN_VERS_MAJ=2
+DYN_VERS_MIN=0
+
+VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN)
+DESTDIR=/usr
+PREFIX=/local
+
+STATIC=libwiringPiDev.a
+DYNAMIC=libwiringPiDev.so.$(VERSION)
+
+#DEBUG	= -g -O0
+DEBUG	= -O2
+CC	= gcc
+INCLUDE	= -I.
+CFLAGS	= $(DEBUG) -Wformat=2 -Wall $(INCLUDE) -Winline -pipe -fPIC
+
+LIBS    =
+
+###############################################################################
+
+SRC	=	ds1302.c maxdetect.c  piNes.c		\
+		gertboard.c piFace.c			\
+		lcd128x64.c lcd.c			\
+		piGlow.c
+
+OBJ	=	$(SRC:.c=.o)
+
+all:		$(DYNAMIC)
+
+static:		$(STATIC)
+
+$(STATIC):	$(OBJ)
+	@echo "[Link (Static)]"
+	@ar rcs $(STATIC) $(OBJ)
+	@ranlib $(STATIC)
+#	@size   $(STATIC)
+
+$(DYNAMIC):	$(OBJ)
+	@echo "[Link (Dynamic)]"
+	@$(CC) -shared -Wl,-soname,libwiringPiDev.so -o libwiringPiDev.so.$(VERSION) -lpthread $(OBJ)
+
+.c.o:
+	@echo [Compile] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+.PHONY:	clean
+clean:
+	@echo "[Clean]"
+	@rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPiDev.*
+
+.PHONY:	tags
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+
+.PHONY:	install-headers
+install-headers:
+	@echo "[Install Headers]"
+	@install -m 0755 -d			$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 ds1302.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 maxdetect.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 piNes.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 gertboard.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 piFace.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 lcd128x64.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 lcd.h			$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 piGlow.h		$(DESTDIR)$(PREFIX)/include
+
+.PHONY:	install
+install:	$(DYNAMIC) install-headers
+	@echo "[Install Dynamic Lib]"
+	@install -m 0755 -d						$(DESTDIR)$(PREFIX)/lib
+	@install -m 0755 libwiringPiDev.so.$(VERSION)			$(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)
+	@ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION)	$(DESTDIR)/lib/libwiringPiDev.so
+	@ldconfig
+
+.PHONY:	install-static
+install-static:	$(STATIC) install-headers
+	@echo "[Install Static Lib]"
+	@install -m 0755 -d			$(DESTDIR)$(PREFIX)/lib
+	@install -m 0755 libwiringPiDev.a	$(DESTDIR)$(PREFIX)/lib
+
+.PHONY:	uninstall
+uninstall:
+	@echo "[UnInstall]"
+	@rm -f $(DESTDIR)$(PREFIX)/include/ds1302.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/maxdetect.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/piNes.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/gertboard.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/piFace.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/lcd128x64.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/lcd.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/piGlow.h
+	@rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.*
+	@ldconfig
+
+
+.PHONY:	depend
+depend:
+	makedepend -Y $(SRC)
+
+# DO NOT DELETE
+
+ds1302.o: ds1302.h
+maxdetect.o: maxdetect.h
+piNes.o: piNes.h
+gertboard.o: gertboard.h
+piFace.o: piFace.h
+lcd128x64.o: font.h lcd128x64.h
+lcd.o: lcd.h
+piGlow.o: piGlow.h
diff --git a/modules/catkin_ws/src/wiringPi/devLib/ds1302.c b/modules/catkin_ws/src/wiringPi/devLib/ds1302.c
new file mode 100644
index 0000000000000000000000000000000000000000..cf64de77d7a7607bf271df680253291976af6ec0
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/ds1302.c
@@ -0,0 +1,240 @@
+/*
+ * ds1302.c:
+ *	Real Time clock
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdarg.h>
+
+#include <wiringPi.h>
+
+#include "ds1302.h"
+
+// Register defines
+
+#define	RTC_SECS	 0
+#define	RTC_MINS	 1
+#define	RTC_HOURS	 2
+#define	RTC_DATE	 3
+#define	RTC_MONTH	 4
+#define	RTC_DAY		 5
+#define	RTC_YEAR	 6
+#define	RTC_WP		 7
+#define	RTC_TC		 8
+#define	RTC_BM		31
+
+
+// Locals
+
+static int dPin, cPin, sPin ;
+
+/*
+ * dsShiftIn:
+ *	Shift a number in from the chip, LSB first. Note that the data is
+ *	sampled on the trailing edge of the last clock, so it's valid immediately.
+ *********************************************************************************
+ */
+
+static unsigned int dsShiftIn (void)
+{
+  uint8_t value = 0 ;
+  int i ;
+
+  pinMode (dPin, INPUT) ;	delayMicroseconds (1) ;
+
+  for (i = 0 ; i < 8 ; ++i)
+  {
+    value |= (digitalRead (dPin) << i) ;
+    digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ;
+    digitalWrite (cPin, LOW) ;	delayMicroseconds (1) ;
+  }
+
+  return value;
+}
+
+
+/*
+ * dsShiftOut:
+ *	A normal LSB-first shift-out, just slowed down a bit - the Pi is
+ *	a bit faster than the chip can handle.
+ *********************************************************************************
+ */
+
+static void dsShiftOut (unsigned int data)
+{
+  int i ;
+
+  pinMode (dPin, OUTPUT) ;
+
+  for (i = 0 ; i < 8 ; ++i)
+  {
+    digitalWrite (dPin, data & (1 << i)) ;	delayMicroseconds (1) ;
+    digitalWrite (cPin, HIGH) ;			delayMicroseconds (1) ;
+    digitalWrite (cPin, LOW) ;			delayMicroseconds (1) ;
+  }
+}
+
+
+/*
+ * ds1302regRead: ds1302regWrite:
+ *	Read/Write a value to an RTC Register or RAM location on the chip
+ *********************************************************************************
+ */
+
+static unsigned int ds1302regRead (const int reg)
+{
+  unsigned int data ;
+
+  digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
+    dsShiftOut (reg) ;
+    data = dsShiftIn () ;
+  digitalWrite (sPin, LOW)  ; delayMicroseconds (1) ;
+
+  return data ;
+}
+
+static void ds1302regWrite (const int reg, const unsigned int data)
+{
+  digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
+    dsShiftOut (reg) ;
+    dsShiftOut (data) ;
+  digitalWrite (sPin, LOW)  ; delayMicroseconds (1) ;
+}
+
+
+/*
+ * ds1302rtcWrite: ds1302rtcRead:
+ *	Writes/Reads the data to/from the RTC register
+ *********************************************************************************
+ */
+
+unsigned int ds1302rtcRead (const int reg)
+{
+  return ds1302regRead (0x81 | ((reg & 0x1F) << 1)) ;
+}
+
+void ds1302rtcWrite (int reg, unsigned int data)
+{
+  ds1302regWrite (0x80 | ((reg & 0x1F) << 1), data) ;
+}
+
+
+/*
+ * ds1302ramWrite: ds1302ramRead:
+ *	Writes/Reads the data to/from the RTC register
+ *********************************************************************************
+ */
+
+unsigned int ds1302ramRead (const int addr)
+{
+  return ds1302regRead (0xC1 | ((addr & 0x1F) << 1)) ;
+}
+
+void ds1302ramWrite (const int addr, const unsigned int data)
+{
+  ds1302regWrite ( 0xC0 | ((addr & 0x1F) << 1), data) ;
+}
+
+/*
+ * ds1302clockRead:
+ *	Read all 8 bytes of the clock in a single operation
+ *********************************************************************************
+ */
+
+void ds1302clockRead (int clockData [8])
+{
+  int i ;
+  unsigned int regVal = 0x81 | ((RTC_BM & 0x1F) << 1) ;
+
+  digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
+
+  dsShiftOut (regVal) ;
+  for (i = 0 ; i < 8 ; ++i)
+    clockData [i] = dsShiftIn () ;
+
+  digitalWrite (sPin, LOW) ;  delayMicroseconds (1) ;
+}
+
+
+/*
+ * ds1302clockWrite:
+ *	Write all 8 bytes of the clock in a single operation
+ *********************************************************************************
+ */
+
+void ds1302clockWrite (const int clockData [8])
+{
+  int i ;
+  unsigned int regVal = 0x80 | ((RTC_BM & 0x1F) << 1) ;
+
+  digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ;
+
+  dsShiftOut (regVal) ;
+  for (i = 0 ; i < 8 ; ++i)
+    dsShiftOut (clockData [i]) ;
+
+  digitalWrite (sPin, LOW) ;  delayMicroseconds (1) ;
+}
+
+
+/*
+ * ds1302trickleCharge:
+ *	Set the bits on the trickle charger.
+ *	Probably best left alone...
+ *********************************************************************************
+ */
+
+void ds1302trickleCharge (const int diodes, const int resistors)
+{
+  if (diodes + resistors == 0)
+    ds1302rtcWrite (RTC_TC, 0x5C) ;	// Disabled
+  else
+    ds1302rtcWrite (RTC_TC, 0xA0 | ((diodes & 3) << 2) | (resistors & 3)) ;
+}
+
+
+
+
+/*
+ * ds1302setup:
+ *	Initialise the chip & remember the pins we're using
+ *********************************************************************************
+ */
+
+void ds1302setup (const int clockPin, const int dataPin, const int csPin)
+{
+  dPin = dataPin ;
+  cPin = clockPin ;
+  sPin = csPin ;
+
+  digitalWrite (dPin, LOW) ;
+  digitalWrite (cPin, LOW) ;
+  digitalWrite (sPin, LOW) ;
+
+  pinMode (dPin, OUTPUT) ;
+  pinMode (cPin, OUTPUT) ;
+  pinMode (sPin, OUTPUT) ;
+
+  ds1302rtcWrite (RTC_WP, 0) ;	// Remove write-protect
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/ds1302.h b/modules/catkin_ws/src/wiringPi/devLib/ds1302.h
new file mode 100644
index 0000000000000000000000000000000000000000..e82b3ed092b2dca77841cc7d03c0e01ecf2d35c5
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/ds1302.h
@@ -0,0 +1,44 @@
+/*
+ * ds1302.h:
+ *	Real Time clock
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern unsigned int ds1302rtcRead       (const int reg) ;
+extern void         ds1302rtcWrite      (const int reg, const unsigned int data) ;
+
+extern unsigned int ds1302ramRead       (const int addr) ;
+extern void         ds1302ramWrite      (const int addr, const unsigned int data) ;
+
+extern void         ds1302clockRead     (int clockData [8]) ;
+extern void         ds1302clockWrite    (const int clockData [8]) ;
+
+extern void         ds1302trickleCharge (const int diodes, const int resistors) ;
+
+extern void         ds1302setup         (const int clockPin, const int dataPin, const int csPin) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/devLib/ds1302.o b/modules/catkin_ws/src/wiringPi/devLib/ds1302.o
new file mode 100644
index 0000000000000000000000000000000000000000..ef4586fb29150252ddae1d0741bfe0de56053272
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/ds1302.o differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/font.h b/modules/catkin_ws/src/wiringPi/devLib/font.h
new file mode 100644
index 0000000000000000000000000000000000000000..ce99e1687f80d16090b52248f64530d7c04c535a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/font.h
@@ -0,0 +1,2577 @@
+/**********************************************/
+/*                                            */
+/*       Font file generated by cpi2fnt       */
+/*       ------------------------------       */
+/*       Combined with the alpha-numeric      */
+/*       portion of Greg Harp's old PEARL     */
+/*       font (from earlier versions of       */
+/*       linux-m86k) by John Shifflett        */
+/*                                            */
+/**********************************************/
+
+static const int fontHeight = 8 ;
+static const int fontWidth  = 8 ;
+
+static unsigned char font [] =
+{
+   /* 0 0x00 '^@' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 1 0x01 '^A' */
+   0x7e, /* 01111110 */
+   0x81, /* 10000001 */
+   0xa5, /* 10100101 */
+   0x81, /* 10000001 */
+   0xbd, /* 10111101 */
+   0x99, /* 10011001 */
+   0x81, /* 10000001 */
+   0x7e, /* 01111110 */
+
+   /* 2 0x02 '^B' */
+   0x7e, /* 01111110 */
+   0xff, /* 11111111 */
+   0xdb, /* 11011011 */
+   0xff, /* 11111111 */
+   0xc3, /* 11000011 */
+   0xe7, /* 11100111 */
+   0xff, /* 11111111 */
+   0x7e, /* 01111110 */
+
+   /* 3 0x03 '^C' */
+   0x6c, /* 01101100 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0x7c, /* 01111100 */
+   0x38, /* 00111000 */
+   0x10, /* 00010000 */
+   0x00, /* 00000000 */
+
+   /* 4 0x04 '^D' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x7c, /* 01111100 */
+   0xfe, /* 11111110 */
+   0x7c, /* 01111100 */
+   0x38, /* 00111000 */
+   0x10, /* 00010000 */
+   0x00, /* 00000000 */
+
+   /* 5 0x05 '^E' */
+   0x38, /* 00111000 */
+   0x7c, /* 01111100 */
+   0x38, /* 00111000 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0xd6, /* 11010110 */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+
+   /* 6 0x06 '^F' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x7c, /* 01111100 */
+   0xfe, /* 11111110 */
+   0xfe, /* 11111110 */
+   0x7c, /* 01111100 */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+
+   /* 7 0x07 '^G' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 8 0x08 '^H' */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xe7, /* 11100111 */
+   0xc3, /* 11000011 */
+   0xc3, /* 11000011 */
+   0xe7, /* 11100111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+
+   /* 9 0x09 '^I' */
+   0x00, /* 00000000 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x42, /* 01000010 */
+   0x42, /* 01000010 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 10 0x0a '^J' */
+   0xff, /* 11111111 */
+   0xc3, /* 11000011 */
+   0x99, /* 10011001 */
+   0xbd, /* 10111101 */
+   0xbd, /* 10111101 */
+   0x99, /* 10011001 */
+   0xc3, /* 11000011 */
+   0xff, /* 11111111 */
+
+   /* 11 0x0b '^K' */
+   0x0f, /* 00001111 */
+   0x07, /* 00000111 */
+   0x0f, /* 00001111 */
+   0x7d, /* 01111101 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x78, /* 01111000 */
+
+   /* 12 0x0c '^L' */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+
+   /* 13 0x0d '^M' */
+   0x3f, /* 00111111 */
+   0x33, /* 00110011 */
+   0x3f, /* 00111111 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x70, /* 01110000 */
+   0xf0, /* 11110000 */
+   0xe0, /* 11100000 */
+
+   /* 14 0x0e '^N' */
+   0x7f, /* 01111111 */
+   0x63, /* 01100011 */
+   0x7f, /* 01111111 */
+   0x63, /* 01100011 */
+   0x63, /* 01100011 */
+   0x67, /* 01100111 */
+   0xe6, /* 11100110 */
+   0xc0, /* 11000000 */
+
+   /* 15 0x0f '^O' */
+   0x18, /* 00011000 */
+   0xdb, /* 11011011 */
+   0x3c, /* 00111100 */
+   0xe7, /* 11100111 */
+   0xe7, /* 11100111 */
+   0x3c, /* 00111100 */
+   0xdb, /* 11011011 */
+   0x18, /* 00011000 */
+
+   /* 16 0x10 '^P' */
+   0x80, /* 10000000 */
+   0xe0, /* 11100000 */
+   0xf8, /* 11111000 */
+   0xfe, /* 11111110 */
+   0xf8, /* 11111000 */
+   0xe0, /* 11100000 */
+   0x80, /* 10000000 */
+   0x00, /* 00000000 */
+
+   /* 17 0x11 '^Q' */
+   0x02, /* 00000010 */
+   0x0e, /* 00001110 */
+   0x3e, /* 00111110 */
+   0xfe, /* 11111110 */
+   0x3e, /* 00111110 */
+   0x0e, /* 00001110 */
+   0x02, /* 00000010 */
+   0x00, /* 00000000 */
+
+   /* 18 0x12 '^R' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+
+   /* 19 0x13 '^S' */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+
+   /* 20 0x14 '^T' */
+   0x7f, /* 01111111 */
+   0xdb, /* 11011011 */
+   0xdb, /* 11011011 */
+   0x7b, /* 01111011 */
+   0x1b, /* 00011011 */
+   0x1b, /* 00011011 */
+   0x1b, /* 00011011 */
+   0x00, /* 00000000 */
+
+   /* 21 0x15 '^U' */
+   0x3e, /* 00111110 */
+   0x61, /* 01100001 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x86, /* 10000110 */
+   0x7c, /* 01111100 */
+
+   /* 22 0x16 '^V' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x7e, /* 01111110 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 23 0x17 '^W' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+
+   /* 24 0x18 '^X' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 25 0x19 '^Y' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 26 0x1a '^Z' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0xfe, /* 11111110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 27 0x1b '^[' */
+   0x00, /* 00000000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 28 0x1c '^\' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 29 0x1d '^]' */
+   0x00, /* 00000000 */
+   0x24, /* 00100100 */
+   0x66, /* 01100110 */
+   0xff, /* 11111111 */
+   0x66, /* 01100110 */
+   0x24, /* 00100100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 30 0x1e '^^' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 31 0x1f '^_' */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0x7e, /* 01111110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 32 0x20 ' ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 33 0x21 '!' */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 34 0x22 '"' */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 35 0x23 '#' */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+
+   /* 36 0x24 '$' */
+   0x18, /* 00011000 */
+   0x3e, /* 00111110 */
+   0x60, /* 01100000 */
+   0x3c, /* 00111100 */
+   0x06, /* 00000110 */
+   0x7c, /* 01111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 37 0x25 '%' */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xcc, /* 11001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x66, /* 01100110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 38 0x26 '&' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x68, /* 01101000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 39 0x27 ''' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 40 0x28 '(' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+
+   /* 41 0x29 ')' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+
+   /* 42 0x2a '*' */
+   0x00, /* 00000000 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0xff, /* 11111111 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 43 0x2b '+' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 44 0x2c ',' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+
+   /* 45 0x2d '-' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 46 0x2e '.' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 47 0x2f '/' */
+   0x03, /* 00000011 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 48 0x30 '0' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xde, /* 11011110 */
+   0xfe, /* 11111110 */
+   0xf6, /* 11110110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 49 0x31 '1' */
+   0x18, /* 00011000 */
+   0x78, /* 01111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 50 0x32 '2' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 51 0x33 '3' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0x06, /* 00000110 */
+   0x1c, /* 00011100 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 52 0x34 '4' */
+   0x1c, /* 00011100 */
+   0x3c, /* 00111100 */
+   0x6c, /* 01101100 */
+   0xcc, /* 11001100 */
+   0xfe, /* 11111110 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+
+   /* 53 0x35 '5' */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 54 0x36 '6' */
+   0x38, /* 00111000 */
+   0x60, /* 01100000 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 55 0x37 '7' */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0x60, /* 01100000 */
+   0x00, /* 00000000 */
+
+   /* 56 0x38 '8' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 57 0x39 '9' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 58 0x3a ':' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 59 0x3b ';' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+
+   /* 60 0x3c '<' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+
+   /* 61 0x3d '=' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 62 0x3e '>' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+
+   /* 63 0x3f '?' */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 64 0x40 '@' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xde, /* 11011110 */
+   0xde, /* 11011110 */
+   0xde, /* 11011110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 65 0x41 'A' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 66 0x42 'B' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 67 0x43 'C' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 68 0x44 'D' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 69 0x45 'E' */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xf8, /* 11111000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 70 0x46 'F' */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xf8, /* 11111000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 71 0x47 'G' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xce, /* 11001110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 72 0x48 'H' */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 73 0x49 'I' */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 74 0x4a 'J' */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 75 0x4b 'K' */
+   0xc6, /* 11000110 */
+   0xcc, /* 11001100 */
+   0xd8, /* 11011000 */
+   0xf0, /* 11110000 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 76 0x4c 'L' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 77 0x4d 'M' */
+   0x82, /* 10000010 */
+   0xc6, /* 11000110 */
+   0xee, /* 11101110 */
+   0xfe, /* 11111110 */
+   0xd6, /* 11010110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 78 0x4e 'N' */
+   0xc6, /* 11000110 */
+   0xe6, /* 11100110 */
+   0xf6, /* 11110110 */
+   0xde, /* 11011110 */
+   0xce, /* 11001110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 79 0x4f 'O' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 80 0x50 'P' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 81 0x51 'Q' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xf6, /* 11110110 */
+   0xde, /* 11011110 */
+   0x7c, /* 01111100 */
+   0x06, /* 00000110 */
+
+   /* 82 0x52 'R' */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 83 0x53 'S' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0x60, /* 01100000 */
+   0x38, /* 00111000 */
+   0x0c, /* 00001100 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 84 0x54 'T' */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 85 0x55 'U' */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 86 0x56 'V' */
+   0xc3, /* 11000011 */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 87 0x57 'W' */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xd6, /* 11010110 */
+   0xfe, /* 11111110 */
+   0xee, /* 11101110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 88 0x58 'X' */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0xc3, /* 11000011 */
+   0x00, /* 00000000 */
+
+   /* 89 0x59 'Y' */
+   0xc3, /* 11000011 */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 90 0x5a 'Z' */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 91 0x5b '[' */
+   0x3c, /* 00111100 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 92 0x5c '\' */
+   0xc0, /* 11000000 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x06, /* 00000110 */
+   0x03, /* 00000011 */
+   0x00, /* 00000000 */
+
+   /* 93 0x5d ']' */
+   0x3c, /* 00111100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 94 0x5e '^' */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 95 0x5f '_' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+
+   /* 96 0x60 '`' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 97 0x61 'a' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0x06, /* 00000110 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 98 0x62 'b' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 99 0x63 'c' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 100 0x64 'd' */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 101 0x65 'e' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 102 0x66 'f' */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x60, /* 01100000 */
+   0xf0, /* 11110000 */
+   0x60, /* 01100000 */
+   0x60, /* 01100000 */
+   0x60, /* 01100000 */
+   0x00, /* 00000000 */
+
+   /* 103 0x67 'g' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0x7c, /* 01111100 */
+
+   /* 104 0x68 'h' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 105 0x69 'i' */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 106 0x6a 'j' */
+   0x06, /* 00000110 */
+   0x00, /* 00000000 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+
+   /* 107 0x6b 'k' */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xcc, /* 11001100 */
+   0xd8, /* 11011000 */
+   0xf0, /* 11110000 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+
+   /* 108 0x6c 'l' */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 109 0x6d 'm' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xec, /* 11101100 */
+   0xfe, /* 11111110 */
+   0xd6, /* 11010110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 110 0x6e 'n' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 111 0x6f 'o' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 112 0x70 'p' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfc, /* 11111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfc, /* 11111100 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+
+   /* 113 0x71 'q' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+
+   /* 114 0x72 'r' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xdc, /* 11011100 */
+   0xe6, /* 11100110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 115 0x73 's' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x06, /* 00000110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 116 0x74 't' */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x7c, /* 01111100 */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x36, /* 00110110 */
+   0x1c, /* 00011100 */
+   0x00, /* 00000000 */
+
+   /* 117 0x75 'u' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 118 0x76 'v' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 119 0x77 'w' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xd6, /* 11010110 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+
+   /* 120 0x78 'x' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 121 0x79 'y' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xc3, /* 11000011 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+
+   /* 122 0x7a 'z' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x0c, /* 00001100 */
+   0x38, /* 00111000 */
+   0x60, /* 01100000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 123 0x7b '{' */
+   0x0e, /* 00001110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x70, /* 01110000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x0e, /* 00001110 */
+   0x00, /* 00000000 */
+
+   /* 124 0x7c '|' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 125 0x7d '}' */
+   0x70, /* 01110000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x0e, /* 00001110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x70, /* 01110000 */
+   0x00, /* 00000000 */
+
+   /* 126 0x7e '~' */
+   0x72, /* 01110010 */
+   0x9c, /* 10011100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 127 0x7f '' */
+   0x00, /* 00000000 */
+   0x10, /* 00010000 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 128 0x80 'Ä' */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x0c, /* 00001100 */
+   0x78, /* 01111000 */
+
+   /* 129 0x81 'Å' */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 130 0x82 'Ç' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 131 0x83 'É' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 132 0x84 'Ñ' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 133 0x85 'Ö' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 134 0x86 'Ü' */
+   0x30, /* 00110000 */
+   0x30, /* 00110000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 135 0x87 'á' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x7e, /* 01111110 */
+   0x0c, /* 00001100 */
+   0x38, /* 00111000 */
+
+   /* 136 0x88 'à' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 137 0x89 'â' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 138 0x8a 'ä' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 139 0x8b 'ã' */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 140 0x8c 'å' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 141 0x8d 'ç' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 142 0x8e 'é' */
+   0xc6, /* 11000110 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 143 0x8f 'è' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 144 0x90 'ê' */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xf8, /* 11111000 */
+   0xc0, /* 11000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 145 0x91 'ë' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0xd8, /* 11011000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 146 0x92 'í' */
+   0x3e, /* 00111110 */
+   0x6c, /* 01101100 */
+   0xcc, /* 11001100 */
+   0xfe, /* 11111110 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xce, /* 11001110 */
+   0x00, /* 00000000 */
+
+   /* 147 0x93 'ì' */
+   0x7c, /* 01111100 */
+   0x82, /* 10000010 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 148 0x94 'î' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 149 0x95 'ï' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 150 0x96 'ñ' */
+   0x78, /* 01111000 */
+   0x84, /* 10000100 */
+   0x00, /* 00000000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 151 0x97 'ó' */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 152 0x98 'ò' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7e, /* 01111110 */
+   0x06, /* 00000110 */
+   0xfc, /* 11111100 */
+
+   /* 153 0x99 'ô' */
+   0xc6, /* 11000110 */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 154 0x9a 'ö' */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 155 0x9b 'õ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 156 0x9c 'ú' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x64, /* 01100100 */
+   0xf0, /* 11110000 */
+   0x60, /* 01100000 */
+   0x66, /* 01100110 */
+   0xfc, /* 11111100 */
+   0x00, /* 00000000 */
+
+   /* 157 0x9d 'ù' */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 158 0x9e 'û' */
+   0xf8, /* 11111000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xfa, /* 11111010 */
+   0xc6, /* 11000110 */
+   0xcf, /* 11001111 */
+   0xc6, /* 11000110 */
+   0xc7, /* 11000111 */
+
+   /* 159 0x9f 'ü' */
+   0x0e, /* 00001110 */
+   0x1b, /* 00011011 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0xd8, /* 11011000 */
+   0x70, /* 01110000 */
+   0x00, /* 00000000 */
+
+   /* 160 0xa0 '†' */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x7c, /* 01111100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 161 0xa1 '°' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x38, /* 00111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 162 0xa2 '¢' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+
+   /* 163 0xa3 '£' */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 164 0xa4 '§' */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0xdc, /* 11011100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x00, /* 00000000 */
+
+   /* 165 0xa5 '•' */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0xe6, /* 11100110 */
+   0xf6, /* 11110110 */
+   0xde, /* 11011110 */
+   0xce, /* 11001110 */
+   0x00, /* 00000000 */
+
+   /* 166 0xa6 '¶' */
+   0x3c, /* 00111100 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x3e, /* 00111110 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 167 0xa7 'ß' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 168 0xa8 '®' */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x63, /* 01100011 */
+   0x3e, /* 00111110 */
+   0x00, /* 00000000 */
+
+   /* 169 0xa9 '©' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 170 0xaa '™' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0x06, /* 00000110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 171 0xab '´' */
+   0x63, /* 01100011 */
+   0xe6, /* 11100110 */
+   0x6c, /* 01101100 */
+   0x7e, /* 01111110 */
+   0x33, /* 00110011 */
+   0x66, /* 01100110 */
+   0xcc, /* 11001100 */
+   0x0f, /* 00001111 */
+
+   /* 172 0xac '¨' */
+   0x63, /* 01100011 */
+   0xe6, /* 11100110 */
+   0x6c, /* 01101100 */
+   0x7a, /* 01111010 */
+   0x36, /* 00110110 */
+   0x6a, /* 01101010 */
+   0xdf, /* 11011111 */
+   0x06, /* 00000110 */
+
+   /* 173 0xad '≠' */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 174 0xae 'Æ' */
+   0x00, /* 00000000 */
+   0x33, /* 00110011 */
+   0x66, /* 01100110 */
+   0xcc, /* 11001100 */
+   0x66, /* 01100110 */
+   0x33, /* 00110011 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 175 0xaf 'Ø' */
+   0x00, /* 00000000 */
+   0xcc, /* 11001100 */
+   0x66, /* 01100110 */
+   0x33, /* 00110011 */
+   0x66, /* 01100110 */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 176 0xb0 '∞' */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+   0x22, /* 00100010 */
+   0x88, /* 10001000 */
+
+   /* 177 0xb1 '±' */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+   0x55, /* 01010101 */
+   0xaa, /* 10101010 */
+
+   /* 178 0xb2 '≤' */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+   0x77, /* 01110111 */
+   0xdd, /* 11011101 */
+
+   /* 179 0xb3 '≥' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 180 0xb4 '¥' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 181 0xb5 'µ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 182 0xb6 '∂' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf6, /* 11110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 183 0xb7 '∑' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 184 0xb8 '∏' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 185 0xb9 'π' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf6, /* 11110110 */
+   0x06, /* 00000110 */
+   0xf6, /* 11110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 186 0xba '∫' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 187 0xbb 'ª' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x06, /* 00000110 */
+   0xf6, /* 11110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 188 0xbc 'º' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf6, /* 11110110 */
+   0x06, /* 00000110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 189 0xbd 'Ω' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 190 0xbe 'æ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 191 0xbf 'ø' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xf8, /* 11111000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 192 0xc0 '¿' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 193 0xc1 '¡' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 194 0xc2 '¬' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 195 0xc3 '√' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 196 0xc4 'ƒ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 197 0xc5 '≈' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 198 0xc6 '∆' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 199 0xc7 '«' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x37, /* 00110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 200 0xc8 '»' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x37, /* 00110111 */
+   0x30, /* 00110000 */
+   0x3f, /* 00111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 201 0xc9 '…' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x3f, /* 00111111 */
+   0x30, /* 00110000 */
+   0x37, /* 00110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 202 0xca ' ' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf7, /* 11110111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 203 0xcb 'À' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xf7, /* 11110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 204 0xcc 'Ã' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x37, /* 00110111 */
+   0x30, /* 00110000 */
+   0x37, /* 00110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 205 0xcd 'Õ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 206 0xce 'Œ' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xf7, /* 11110111 */
+   0x00, /* 00000000 */
+   0xf7, /* 11110111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 207 0xcf 'œ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 208 0xd0 '–' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 209 0xd1 '—' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 210 0xd2 '“' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 211 0xd3 '”' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x3f, /* 00111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 212 0xd4 '‘' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 213 0xd5 '’' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 214 0xd6 '÷' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x3f, /* 00111111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 215 0xd7 '◊' */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0xff, /* 11111111 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+
+   /* 216 0xd8 'ÿ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0xff, /* 11111111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 217 0xd9 'Ÿ' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xf8, /* 11111000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 218 0xda '⁄' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x1f, /* 00011111 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 219 0xdb '€' */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+
+   /* 220 0xdc '‹' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+
+   /* 221 0xdd '›' */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+   0xf0, /* 11110000 */
+
+   /* 222 0xde 'fi' */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+   0x0f, /* 00001111 */
+
+   /* 223 0xdf 'fl' */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0xff, /* 11111111 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 224 0xe0 '‡' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0xc8, /* 11001000 */
+   0xdc, /* 11011100 */
+   0x76, /* 01110110 */
+   0x00, /* 00000000 */
+
+   /* 225 0xe1 '·' */
+   0x78, /* 01111000 */
+   0xcc, /* 11001100 */
+   0xcc, /* 11001100 */
+   0xd8, /* 11011000 */
+   0xcc, /* 11001100 */
+   0xc6, /* 11000110 */
+   0xcc, /* 11001100 */
+   0x00, /* 00000000 */
+
+   /* 226 0xe2 '‚' */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0xc0, /* 11000000 */
+   0x00, /* 00000000 */
+
+   /* 227 0xe3 '„' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x00, /* 00000000 */
+
+   /* 228 0xe4 '‰' */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+
+   /* 229 0xe5 'Â' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xd8, /* 11011000 */
+   0xd8, /* 11011000 */
+   0xd8, /* 11011000 */
+   0x70, /* 01110000 */
+   0x00, /* 00000000 */
+
+   /* 230 0xe6 'Ê' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x7c, /* 01111100 */
+   0xc0, /* 11000000 */
+
+   /* 231 0xe7 'Á' */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+
+   /* 232 0xe8 'Ë' */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x3c, /* 00111100 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+
+   /* 233 0xe9 'È' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xfe, /* 11111110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+
+   /* 234 0xea 'Í' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0xee, /* 11101110 */
+   0x00, /* 00000000 */
+
+   /* 235 0xeb 'Î' */
+   0x0e, /* 00001110 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x3e, /* 00111110 */
+   0x66, /* 01100110 */
+   0x66, /* 01100110 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+
+   /* 236 0xec 'Ï' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0xdb, /* 11011011 */
+   0xdb, /* 11011011 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 237 0xed 'Ì' */
+   0x06, /* 00000110 */
+   0x0c, /* 00001100 */
+   0x7e, /* 01111110 */
+   0xdb, /* 11011011 */
+   0xdb, /* 11011011 */
+   0x7e, /* 01111110 */
+   0x60, /* 01100000 */
+   0xc0, /* 11000000 */
+
+   /* 238 0xee 'Ó' */
+   0x1e, /* 00011110 */
+   0x30, /* 00110000 */
+   0x60, /* 01100000 */
+   0x7e, /* 01111110 */
+   0x60, /* 01100000 */
+   0x30, /* 00110000 */
+   0x1e, /* 00011110 */
+   0x00, /* 00000000 */
+
+   /* 239 0xef 'Ô' */
+   0x00, /* 00000000 */
+   0x7c, /* 01111100 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0xc6, /* 11000110 */
+   0x00, /* 00000000 */
+
+   /* 240 0xf0 '' */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0xfe, /* 11111110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 241 0xf1 'Ò' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x7e, /* 01111110 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 242 0xf2 'Ú' */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 243 0xf3 'Û' */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x18, /* 00011000 */
+   0x0c, /* 00001100 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+
+   /* 244 0xf4 'Ù' */
+   0x0e, /* 00001110 */
+   0x1b, /* 00011011 */
+   0x1b, /* 00011011 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+
+   /* 245 0xf5 'ı' */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0xd8, /* 11011000 */
+   0xd8, /* 11011000 */
+   0x70, /* 01110000 */
+
+   /* 246 0xf6 'ˆ' */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x7e, /* 01111110 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 247 0xf7 '˜' */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0x76, /* 01110110 */
+   0xdc, /* 11011100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 248 0xf8 '¯' */
+   0x38, /* 00111000 */
+   0x6c, /* 01101100 */
+   0x6c, /* 01101100 */
+   0x38, /* 00111000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 249 0xf9 '˘' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 250 0xfa '˙' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x18, /* 00011000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 251 0xfb '˚' */
+   0x0f, /* 00001111 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0x0c, /* 00001100 */
+   0xec, /* 11101100 */
+   0x6c, /* 01101100 */
+   0x3c, /* 00111100 */
+   0x1c, /* 00011100 */
+
+   /* 252 0xfc '¸' */
+   0x6c, /* 01101100 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x36, /* 00110110 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 253 0xfd '˝' */
+   0x78, /* 01111000 */
+   0x0c, /* 00001100 */
+   0x18, /* 00011000 */
+   0x30, /* 00110000 */
+   0x7c, /* 01111100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 254 0xfe '˛' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x3c, /* 00111100 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+   /* 255 0xff 'ˇ' */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+   0x00, /* 00000000 */
+
+};
diff --git a/modules/catkin_ws/src/wiringPi/devLib/gertboard.c b/modules/catkin_ws/src/wiringPi/devLib/gertboard.c
new file mode 100644
index 0000000000000000000000000000000000000000..5aeaef7c637ceb95a148a4e4e368a7883d7c814a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/gertboard.c
@@ -0,0 +1,164 @@
+/*
+ * gertboard.c:
+ *	Access routines for the SPI devices on the Gertboard
+ *	Copyright (c) 2012 Gordon Henderson
+ *
+ *	The Gertboard has:
+ *
+ *		An MCP3002 dual-channel A to D convertor connected
+ *		to the SPI bus, selected by chip-select A, and:
+ *
+ *		An MCP4802 dual-channel D to A convertor connected
+ *		to the SPI bus, selected via chip-select B.
+ *
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/spi/spidev.h>
+
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+
+#include "gertboard.h"
+
+// The A-D convertor won't run at more than 1MHz @ 3.3v
+
+#define	SPI_ADC_SPEED	1000000
+#define	SPI_DAC_SPEED	1000000
+#define	SPI_A2D		      0
+#define	SPI_D2A		      1
+
+
+/*
+ * gertboardAnalogWrite:
+ *	Write an 8-bit data value to the MCP4802 Analog to digital
+ *	convertor on the Gertboard.
+ *********************************************************************************
+ */
+
+void gertboardAnalogWrite (const int chan, const int value)
+{
+  uint8_t spiData [2] ;
+  uint8_t chanBits, dataBits ;
+
+  if (chan == 0)
+    chanBits = 0x30 ;
+  else
+    chanBits = 0xB0 ;
+
+  chanBits |= ((value >> 4) & 0x0F) ;
+  dataBits  = ((value << 4) & 0xF0) ;
+
+  spiData [0] = chanBits ;
+  spiData [1] = dataBits ;
+
+  wiringPiSPIDataRW (SPI_D2A, spiData, 2) ;
+}
+
+
+/*
+ * gertboardAnalogRead:
+ *	Return the analog value of the given channel (0/1).
+ *	The A/D is a 10-bit device
+ *********************************************************************************
+ */
+
+int gertboardAnalogRead (const int chan)
+{
+  uint8_t spiData [2] ;
+
+  uint8_t chanBits ;
+
+  if (chan == 0)
+    chanBits = 0b11010000 ;
+  else
+    chanBits = 0b11110000 ;
+
+  spiData [0] = chanBits ;
+  spiData [1] = 0 ;
+
+  wiringPiSPIDataRW (SPI_A2D, spiData, 2) ;
+
+  return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ;
+}
+
+
+/*
+ * gertboardSPISetup:
+ *	Initialise the SPI bus, etc.
+ *********************************************************************************
+ */
+
+int gertboardSPISetup (void)
+{
+  if (wiringPiSPISetup (SPI_A2D, SPI_ADC_SPEED) < 0)
+    return -1 ;
+
+  if (wiringPiSPISetup (SPI_D2A, SPI_DAC_SPEED) < 0)
+    return -1 ;
+
+  return 0 ;
+}
+
+
+/*
+ * New wiringPi node extension methods.
+ *********************************************************************************
+ */
+
+static int myAnalogRead (struct wiringPiNodeStruct *node, const int chan)
+{
+  return gertboardAnalogRead (chan - node->pinBase) ;
+}
+
+static void myAnalogWrite (struct wiringPiNodeStruct *node, const int chan, const int value)
+{
+  gertboardAnalogWrite (chan - node->pinBase, value) ;
+}
+
+
+/*
+ * gertboardAnalogSetup:
+ *	Create a new wiringPi device node for the analog devices on the
+ *	Gertboard. We create one node with 2 pins - each pin being read
+ *	and write - although the operations actually go to different
+ *	hardware devices.
+ *********************************************************************************
+ */
+
+int gertboardAnalogSetup (const int pinBase)
+{
+  struct wiringPiNodeStruct *node ;
+  int    x ;
+
+  if (( x = gertboardSPISetup ()) != 0)
+    return  x;
+
+  node = wiringPiNewNode (pinBase, 2) ;
+  node->analogRead  = myAnalogRead ;
+  node->analogWrite = myAnalogWrite ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/gertboard.h b/modules/catkin_ws/src/wiringPi/devLib/gertboard.h
new file mode 100644
index 0000000000000000000000000000000000000000..3fa19197426db87df3c4dfe062b86ee2d08dcdf8
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/gertboard.h
@@ -0,0 +1,45 @@
+/*
+ * gertboard.h:
+ *	Access routines for the SPI devices on the Gertboard
+ *	Copyright (c) 2012 Gordon Henderson
+ *
+ *	The Gertboard has an MCP4802 dual-channel D to A convertor
+ *	connected to the SPI bus, selected via chip-select B.
+ *
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Old routines
+
+extern void gertboardAnalogWrite (const int chan, const int value) ;
+extern int  gertboardAnalogRead  (const int chan) ;
+extern int  gertboardSPISetup    (void) ;
+
+// New
+
+extern int  gertboardAnalogSetup (const int pinBase) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/devLib/gertboard.o b/modules/catkin_ws/src/wiringPi/devLib/gertboard.o
new file mode 100644
index 0000000000000000000000000000000000000000..5057c20bcb8ca8093383fc0076a19dbe9b5631ee
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/gertboard.o differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd.c b/modules/catkin_ws/src/wiringPi/devLib/lcd.c
new file mode 100644
index 0000000000000000000000000000000000000000..6c0e474948fded0be758e0cb8cb227afdf120189
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/lcd.c
@@ -0,0 +1,495 @@
+/*
+ * lcd.c:
+ *	Text-based LCD driver.
+ *	This is designed to drive the parallel interface LCD drivers
+ *	based in the Hitachi HD44780U controller and compatables.
+ *
+ * Copyright (c) 2012 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <wiringPi.h>
+
+#include "lcd.h"
+
+#ifndef	TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+// HD44780U Commands
+
+#define	LCD_CLEAR	0x01
+#define	LCD_HOME	0x02
+#define	LCD_ENTRY	0x04
+#define	LCD_CTRL	0x08
+#define	LCD_CDSHIFT	0x10
+#define	LCD_FUNC	0x20
+#define	LCD_CGRAM	0x40
+#define	LCD_DGRAM	0x80
+
+// Bits in the entry register
+
+#define	LCD_ENTRY_SH		0x01
+#define	LCD_ENTRY_ID		0x02
+
+// Bits in the control register
+
+#define	LCD_BLINK_CTRL		0x01
+#define	LCD_CURSOR_CTRL		0x02
+#define	LCD_DISPLAY_CTRL	0x04
+
+// Bits in the function register
+
+#define	LCD_FUNC_F	0x04
+#define	LCD_FUNC_N	0x08
+#define	LCD_FUNC_DL	0x10
+
+#define	LCD_CDSHIFT_RL	0x04
+
+struct lcdDataStruct
+{
+  int bits, rows, cols ;
+  int rsPin, strbPin ;
+  int dataPins [8] ;
+  int cx, cy ;
+} ;
+
+struct lcdDataStruct *lcds [MAX_LCDS] ;
+
+static int lcdControl ;
+
+// Row offsets
+
+static const int rowOff [4] = { 0x00, 0x40, 0x14, 0x54 } ;
+
+
+/*
+ * strobe:
+ *	Toggle the strobe (Really the "E") pin to the device.
+ *	According to the docs, data is latched on the falling edge.
+ *********************************************************************************
+ */
+
+static void strobe (const struct lcdDataStruct *lcd)
+{
+
+// Note timing changes for new version of delayMicroseconds ()
+
+  digitalWrite (lcd->strbPin, 1) ; delayMicroseconds (50) ;
+  digitalWrite (lcd->strbPin, 0) ; delayMicroseconds (50) ;
+}
+
+
+/*
+ * sentDataCmd:
+ *	Send an data or command byte to the display.
+ *********************************************************************************
+ */
+
+static void sendDataCmd (const struct lcdDataStruct *lcd, unsigned char data)
+{
+  register unsigned char myData = data ;
+  unsigned char          i, d4 ;
+
+  if (lcd->bits == 4)
+  {
+    d4 = (myData >> 4) & 0x0F;
+    for (i = 0 ; i < 4 ; ++i)
+    {
+      digitalWrite (lcd->dataPins [i], (d4 & 1)) ;
+      d4 >>= 1 ;
+    }
+    strobe (lcd) ;
+
+    d4 = myData & 0x0F ;
+    for (i = 0 ; i < 4 ; ++i)
+    {
+      digitalWrite (lcd->dataPins [i], (d4 & 1)) ;
+      d4 >>= 1 ;
+    }
+  }
+  else
+  {
+    for (i = 0 ; i < 8 ; ++i)
+    {
+      digitalWrite (lcd->dataPins [i], (myData & 1)) ;
+      myData >>= 1 ;
+    }
+  }
+  strobe (lcd) ;
+}
+
+
+/*
+ * putCommand:
+ *	Send a command byte to the display
+ *********************************************************************************
+ */
+
+static void putCommand (const struct lcdDataStruct *lcd, unsigned char command)
+{
+  digitalWrite (lcd->rsPin,   0) ;
+  sendDataCmd  (lcd, command) ;
+  delay (2) ;
+}
+
+static void put4Command (const struct lcdDataStruct *lcd, unsigned char command)
+{
+  register unsigned char myCommand = command ;
+  register unsigned char i ;
+
+  digitalWrite (lcd->rsPin,   0) ;
+
+  for (i = 0 ; i < 4 ; ++i)
+  {
+    digitalWrite (lcd->dataPins [i], (myCommand & 1)) ;
+    myCommand >>= 1 ;
+  }
+  strobe (lcd) ;
+}
+
+
+/*
+ *********************************************************************************
+ * User Callable code below here
+ *********************************************************************************
+ */
+
+/*
+ * lcdHome: lcdClear:
+ *	Home the cursor or clear the screen.
+ *********************************************************************************
+ */
+
+void lcdHome (const int fd)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+
+  putCommand (lcd, LCD_HOME) ;
+  lcd->cx = lcd->cy = 0 ;
+  delay (5) ;
+}
+
+void lcdClear (const int fd)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+
+  putCommand (lcd, LCD_CLEAR) ;
+  putCommand (lcd, LCD_HOME) ;
+  lcd->cx = lcd->cy = 0 ;
+  delay (5) ;
+}
+
+
+/*
+ * lcdDisplay: lcdCursor: lcdCursorBlink:
+ *	Turn the display, cursor, cursor blinking on/off
+ *********************************************************************************
+ */
+
+void lcdDisplay (const int fd, int state)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+
+  if (state)
+    lcdControl |=  LCD_DISPLAY_CTRL ;
+  else
+    lcdControl &= ~LCD_DISPLAY_CTRL ;
+
+  putCommand (lcd, LCD_CTRL | lcdControl) ; 
+}
+
+void lcdCursor (const int fd, int state)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+
+  if (state)
+    lcdControl |=  LCD_CURSOR_CTRL ;
+  else
+    lcdControl &= ~LCD_CURSOR_CTRL ;
+
+  putCommand (lcd, LCD_CTRL | lcdControl) ; 
+}
+
+void lcdCursorBlink (const int fd, int state)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+
+  if (state)
+    lcdControl |=  LCD_BLINK_CTRL ;
+  else
+    lcdControl &= ~LCD_BLINK_CTRL ;
+
+  putCommand (lcd, LCD_CTRL | lcdControl) ; 
+}
+
+
+/*
+ * lcdSendCommand:
+ *	Send any arbitary command to the display
+ *********************************************************************************
+ */
+
+void lcdSendCommand (const int fd, unsigned char command)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+  putCommand (lcd, command) ;
+}
+
+
+/*
+ * lcdPosition:
+ *	Update the position of the cursor on the display.
+ *	Ignore invalid locations.
+ *********************************************************************************
+ */
+
+void lcdPosition (const int fd, int x, int y)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+
+  if ((x > lcd->cols) || (x < 0))
+    return ;
+  if ((y > lcd->rows) || (y < 0))
+    return ;
+
+  putCommand (lcd, x + (LCD_DGRAM | rowOff [y])) ;
+
+  lcd->cx = x ;
+  lcd->cy = y ;
+}
+
+
+/*
+ * lcdCharDef:
+ *	Defines a new character in the CGRAM
+ *********************************************************************************
+ */
+
+void lcdCharDef (const int fd, int index, unsigned char data [8])
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+  int i ;
+
+  putCommand (lcd, LCD_CGRAM | ((index & 7) << 3)) ;
+
+  digitalWrite (lcd->rsPin, 1) ;
+  for (i = 0 ; i < 8 ; ++i)
+    sendDataCmd (lcd, data [i]) ;
+}
+
+
+/*
+ * lcdPutchar:
+ *	Send a data byte to be displayed on the display. We implement a very
+ *	simple terminal here - with line wrapping, but no scrolling. Yet.
+ *********************************************************************************
+ */
+
+void lcdPutchar (const int fd, unsigned char data)
+{
+  struct lcdDataStruct *lcd = lcds [fd] ;
+
+  digitalWrite (lcd->rsPin, 1) ;
+  sendDataCmd  (lcd, data) ;
+
+  if (++lcd->cx == lcd->cols)
+  {
+    lcd->cx = 0 ;
+    if (++lcd->cy == lcd->rows)
+      lcd->cy = 0 ;
+    
+    putCommand (lcd, lcd->cx + (LCD_DGRAM | rowOff [lcd->cy])) ;
+  }
+}
+
+
+/*
+ * lcdPuts:
+ *	Send a string to be displayed on the display
+ *********************************************************************************
+ */
+
+void lcdPuts (const int fd, const char *string)
+{
+  while (*string)
+    lcdPutchar (fd, *string++) ;
+}
+
+
+/*
+ * lcdPrintf:
+ *	Printf to an LCD display
+ *********************************************************************************
+ */
+
+void lcdPrintf (const int fd, const char *message, ...)
+{
+  va_list argp ;
+  char buffer [1024] ;
+
+  va_start (argp, message) ;
+    vsnprintf (buffer, 1023, message, argp) ;
+  va_end (argp) ;
+
+  lcdPuts (fd, buffer) ;
+}
+
+
+/*
+ * lcdInit:
+ *	Take a lot of parameters and initialise the LCD, and return a handle to
+ *	that LCD, or -1 if any error.
+ *********************************************************************************
+ */
+
+int lcdInit (const int rows, const int cols, const int bits,
+	const int rs, const int strb,
+	const int d0, const int d1, const int d2, const int d3, const int d4,
+	const int d5, const int d6, const int d7)
+{
+  static int initialised = 0 ;
+
+  unsigned char func ;
+  int i ;
+  int lcdFd = -1 ;
+  struct lcdDataStruct *lcd ;
+
+  if (initialised == 0)
+  {
+    initialised = 1 ;
+    for (i = 0 ; i < MAX_LCDS ; ++i)
+      lcds [i] = NULL ;
+  }
+
+// Simple sanity checks
+
+  if (! ((bits == 4) || (bits == 8)))
+    return -1 ;
+
+  if ((rows < 0) || (rows > 20))
+    return -1 ;
+
+  if ((cols < 0) || (cols > 20))
+    return -1 ;
+
+// Create a new LCD:
+
+  for (i = 0 ; i < MAX_LCDS ; ++i)
+  {
+    if (lcds [i] == NULL)
+    {
+      lcdFd = i ;
+      break ;
+    }
+  }
+
+  if (lcdFd == -1)
+    return -1 ;
+
+  lcd = (struct lcdDataStruct *)malloc (sizeof (struct lcdDataStruct)) ;
+  if (lcd == NULL)
+    return -1 ;
+
+  lcd->rsPin   = rs ;
+  lcd->strbPin = strb ;
+  lcd->bits    = 8 ;		// For now - we'll set it properly later.
+  lcd->rows    = rows ;
+  lcd->cols    = cols ;
+  lcd->cx      = 0 ;
+  lcd->cy      = 0 ;
+
+  lcd->dataPins [0] = d0 ;
+  lcd->dataPins [1] = d1 ;
+  lcd->dataPins [2] = d2 ;
+  lcd->dataPins [3] = d3 ;
+  lcd->dataPins [4] = d4 ;
+  lcd->dataPins [5] = d5 ;
+  lcd->dataPins [6] = d6 ;
+  lcd->dataPins [7] = d7 ;
+
+  lcds [lcdFd] = lcd ;
+
+  digitalWrite (lcd->rsPin,   0) ; pinMode (lcd->rsPin,   OUTPUT) ;
+  digitalWrite (lcd->strbPin, 0) ; pinMode (lcd->strbPin, OUTPUT) ;
+
+  for (i = 0 ; i < bits ; ++i)
+  {
+    digitalWrite (lcd->dataPins [i], 0) ;
+    pinMode      (lcd->dataPins [i], OUTPUT) ;
+  }
+  delay (35) ; // mS
+
+
+// 4-bit mode?
+//	OK. This is a PIG and it's not at all obvious from the documentation I had,
+//	so I guess some others have worked through either with better documentation
+//	or more trial and error... Anyway here goes:
+//
+//	It seems that the controller needs to see the FUNC command at least 3 times
+//	consecutively - in 8-bit mode. If you're only using 8-bit mode, then it appears
+//	that you can get away with one func-set, however I'd not rely on it...
+//
+//	So to set 4-bit mode, you need to send the commands one nibble at a time,
+//	the same three times, but send the command to set it into 8-bit mode those
+//	three times, then send a final 4th command to set it into 4-bit mode, and only
+//	then can you flip the switch for the rest of the library to work in 4-bit
+//	mode which sends the commands as 2 x 4-bit values.
+
+  if (bits == 4)
+  {
+    func = LCD_FUNC | LCD_FUNC_DL ;			// Set 8-bit mode 3 times
+    put4Command (lcd, func >> 4) ; delay (35) ;
+    put4Command (lcd, func >> 4) ; delay (35) ;
+    put4Command (lcd, func >> 4) ; delay (35) ;
+    func = LCD_FUNC ;					// 4th set: 4-bit mode
+    put4Command (lcd, func >> 4) ; delay (35) ;
+    lcd->bits = 4 ;
+  }
+  else
+  {
+    func = LCD_FUNC | LCD_FUNC_DL ;
+    putCommand  (lcd, func     ) ; delay (35) ;
+    putCommand  (lcd, func     ) ; delay (35) ;
+    putCommand  (lcd, func     ) ; delay (35) ;
+  }
+
+  if (lcd->rows > 1)
+  {
+    func |= LCD_FUNC_N ;
+    putCommand (lcd, func) ; delay (35) ;
+  }
+
+// Rest of the initialisation sequence
+
+  lcdDisplay     (lcdFd, TRUE) ;
+  lcdCursor      (lcdFd, FALSE) ;
+  lcdCursorBlink (lcdFd, FALSE) ;
+  lcdClear       (lcdFd) ;
+
+  putCommand (lcd, LCD_ENTRY   | LCD_ENTRY_ID) ;
+  putCommand (lcd, LCD_CDSHIFT | LCD_CDSHIFT_RL) ;
+
+  return lcdFd ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd.h b/modules/catkin_ws/src/wiringPi/devLib/lcd.h
new file mode 100644
index 0000000000000000000000000000000000000000..0a0e5988c32fa078453c5eb2cbbe934135e2ac63
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/lcd.h
@@ -0,0 +1,52 @@
+/*
+ * lcd.h:
+ *	Text-based LCD driver.
+ *	This is designed to drive the parallel interface LCD drivers
+ *	based in the Hitachi HD44780U controller and compatables.
+ *
+ * Copyright (c) 2012 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#define	MAX_LCDS	8
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void lcdHome        (const int fd) ;
+extern void lcdClear       (const int fd) ;
+extern void lcdDisplay     (const int fd, int state) ;
+extern void lcdCursor      (const int fd, int state) ;
+extern void lcdCursorBlink (const int fd, int state) ;
+extern void lcdSendCommand (const int fd, unsigned char command) ;
+extern void lcdPosition    (const int fd, int x, int y) ;
+extern void lcdCharDef     (const int fd, int index, unsigned char data [8]) ;
+extern void lcdPutchar     (const int fd, unsigned char data) ;
+extern void lcdPuts        (const int fd, const char *string) ;
+extern void lcdPrintf      (const int fd, const char *message, ...) ;
+
+extern int  lcdInit (const int rows, const int cols, const int bits,
+	const int rs, const int strb,
+	const int d0, const int d1, const int d2, const int d3, const int d4,
+	const int d5, const int d6, const int d7) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd.o b/modules/catkin_ws/src/wiringPi/devLib/lcd.o
new file mode 100644
index 0000000000000000000000000000000000000000..97f9fee758a23c83c7ab88544f7baa85bcd8128f
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/lcd.o differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.c b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.c
new file mode 100644
index 0000000000000000000000000000000000000000..accd5c3a75fe3d3d0ceb54a40bbad41a0ca07210
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.c
@@ -0,0 +1,673 @@
+/*
+ * lcd128x64.c:
+ *	Graphics-based LCD driver.
+ *	This is designed to drive the parallel interface LCD drivers
+ *	based on the generic 12864H chips
+ *
+ *	There are many variations on these chips, however they all mostly
+ *	seem to be similar.
+ *	This implementation has the Pins from the Pi hard-wired into it,
+ *	in particular wiringPi pins 0-7 so that we can use
+ *	digitalWriteByete() to speed things up somewhat.
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <wiringPi.h>
+
+#include "font.h"
+#include "lcd128x64.h"
+
+// Size
+
+#define	LCD_WIDTH	128
+#define	LCD_HEIGHT	 64
+
+// Hardware Pins
+//	Note pins 0-7 are the 8-bit data port
+
+#define	CS1		10
+#define	CS2		11
+#define	STROBE		12
+#define	RS		13
+
+// Software copy of the framebuffer
+//	it's 8-bit deep although the display itself is only 1-bit deep.
+
+static unsigned char frameBuffer [LCD_WIDTH * LCD_HEIGHT] ;
+
+static int maxX,    maxY ;
+static int lastX,   lastY ;
+static int xOrigin, yOrigin ;
+static int lcdOrientation = 0 ;
+
+/*
+ * strobe:
+ *	Toggle the strobe (Really the "E") pin to the device.
+ *	According to the docs, data is latched on the falling edge.
+ *********************************************************************************
+ */
+
+static void strobe (void)
+{
+  digitalWrite (STROBE, 1) ; delayMicroseconds (1) ;
+  digitalWrite (STROBE, 0) ; delayMicroseconds (5) ;
+}
+
+
+/*
+ * sentData:
+ *	Send an data or command byte to the display.
+ *********************************************************************************
+ */
+
+static void sendData (const int data, const int chip)
+{
+  digitalWrite     (chip, 0) ;
+  digitalWriteByte (data) ;
+  strobe           () ;
+  digitalWrite     (chip, 1) ;
+}
+
+
+/*
+ * sendCommand:
+ *	Send a command byte to the display
+ *********************************************************************************
+ */
+
+static void sendCommand (const int command, const int chip)
+{
+  digitalWrite (RS, 0) ;
+  sendData     (command, chip) ;
+  digitalWrite (RS, 1) ;
+}
+
+
+/*
+ * setCol: SetLine:
+ *	Set the column and line addresses
+ *********************************************************************************
+ */
+
+static void setCol  (int col, const int chip)
+  { sendCommand (0x40 | (col  & 0x3F), chip) ; }
+
+static void setLine (int line, const int chip)
+  { sendCommand (0xB8 | (line & 0x07), chip) ; }
+
+
+/*
+ * lcd128x64update:
+ *	Copy our software version to the real display
+ *********************************************************************************
+ */
+
+void lcd128x64update (void)
+{
+  int line, x, y, fbLoc ;
+  unsigned char byte ;
+
+// Left side 
+
+  for (line = 0 ; line < 8 ; ++line)
+  {
+    setCol  (0,    CS1) ;
+    setLine (line, CS1) ;
+
+    for (x = 63 ; x >= 0 ; --x)
+    {
+      byte = 0 ;
+      for (y = 0 ; y < 8 ; ++y)
+      {
+	fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ;
+	if (frameBuffer [fbLoc] != 0)
+	  byte |= (1 << y) ;
+      }
+      sendData (byte, CS1) ;
+    }
+  }
+
+// Right side 
+
+  for (line = 0 ; line < 8 ; ++line)
+  {
+    setCol  (0,    CS2) ;
+    setLine (line, CS2) ;
+
+    for (x = 127 ; x >= 64 ; --x)
+    {
+      byte = 0 ;
+      for (y = 0 ; y < 8 ; ++y)
+      {
+	fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ;
+	if (frameBuffer [fbLoc] != 0)
+	  byte |= (1 << y) ;
+      }
+      sendData (byte, CS2) ;
+    }
+  }
+}
+
+
+/*
+ * lcd128x64setOrigin:
+ *	Set the display offset origin
+ *********************************************************************************
+ */
+
+void lcd128x64setOrigin (int x, int y)
+{
+  xOrigin = x ;
+  yOrigin = y ;
+}
+
+
+/*
+ * lcd128x64setOrientation:
+ *	Set the display orientation:
+ *	0: Normal, the display is portrait mode, 0,0 is top left
+ *	1: Landscape
+ *	2: Portrait, flipped
+ *	3: Landscape, flipped
+ *********************************************************************************
+ */
+
+void lcd128x64setOrientation (int orientation)
+{
+  lcdOrientation = orientation & 3 ;
+
+  lcd128x64setOrigin (0,0) ;
+
+  switch (lcdOrientation)
+  {
+    case 0:
+      maxX = LCD_WIDTH ;
+      maxY = LCD_HEIGHT ;
+      break ;
+
+    case 1:
+      maxX = LCD_HEIGHT ;
+      maxY = LCD_WIDTH ;
+      break ;
+
+    case 2:
+      maxX = LCD_WIDTH ;
+      maxY = LCD_HEIGHT ;
+      break ;
+
+    case 3:
+      maxX = LCD_HEIGHT ;
+      maxY = LCD_WIDTH ;
+      break ;
+  }
+}
+
+
+/*
+ * lcd128x64orientCoordinates:
+ *	Adjust the coordinates given to the display orientation
+ *********************************************************************************
+ */
+
+void lcd128x64orientCoordinates (int *x, int *y)
+{
+  register int tmp ;
+
+  *x += xOrigin ;
+  *y += yOrigin ;
+  *y  = maxY - *y - 1 ;
+
+  switch (lcdOrientation)
+  {
+    case 0:
+      break;
+
+    case 1:
+      tmp = maxY - *y - 1 ;
+      *y = *x ;
+      *x = tmp ;
+      break;
+
+    case 2:
+      *x = maxX - *x - 1 ;
+      *y = maxY - *y - 1 ;
+      break;
+
+    case 3:
+      *x = maxX - *x - 1 ;
+      tmp = *y ;
+      *y = *x ;
+      *x = tmp ;
+      break ;
+  }
+}
+
+
+/*
+ * lcd128x64getScreenSize:
+ *	Return the max X & Y screen sizes. Needs to be called again, if you 
+ *	change screen orientation.
+ *********************************************************************************
+ */
+
+void lcd128x64getScreenSize (int *x, int *y)
+{
+  *x = maxX ;
+  *y = maxY ;
+}
+
+
+/*
+ *********************************************************************************
+ * Standard Graphical Functions
+ *********************************************************************************
+ */
+
+
+/*
+ * lcd128x64point:
+ *	Plot a pixel.
+ *********************************************************************************
+ */
+
+void lcd128x64point (int x, int y, int colour)
+{
+  lastX = x ;
+  lastY = y ;
+
+  lcd128x64orientCoordinates (&x, &y) ;
+
+  if ((x < 0) || (x >= LCD_WIDTH) || (y < 0) || (y >= LCD_HEIGHT))
+    return ;
+
+  frameBuffer [x + y * LCD_WIDTH] = colour ;
+}
+
+
+/*
+ * lcd128x64line: lcd128x64lineTo:
+ *	Classic Bressenham Line code
+ *********************************************************************************
+ */
+
+void lcd128x64line (int x0, int y0, int x1, int y1, int colour)
+{
+  int dx, dy ;
+  int sx, sy ;
+  int err, e2 ;
+
+  lastX = x1 ;
+  lastY = y1 ;
+
+  dx = abs (x1 - x0) ;
+  dy = abs (y1 - y0) ;
+
+  sx = (x0 < x1) ? 1 : -1 ;
+  sy = (y0 < y1) ? 1 : -1 ;
+
+  err = dx - dy ;
+ 
+  for (;;)
+  {
+    lcd128x64point (x0, y0, colour) ;
+
+    if ((x0 == x1) && (y0 == y1))
+      break ;
+
+    e2 = 2 * err ;
+
+    if (e2 > -dy)
+    {
+      err -= dy ;
+      x0  += sx ;
+    }
+
+    if (e2 < dx)
+    {
+      err += dx ;
+      y0  += sy ;
+    }
+  }
+
+}
+
+void lcd128x64lineTo (int x, int y, int colour)
+{
+  lcd128x64line (lastX, lastY, x, y, colour) ;
+}
+
+
+/*
+ * lcd128x64rectangle:
+ *	A rectangle is a spoilt days fishing
+ *********************************************************************************
+ */
+
+void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled)
+{
+  register int x ;
+
+  if (filled)
+  {
+    /**/ if (x1 == x2)
+      lcd128x64line (x1, y1, x2, y2, colour) ;
+    else if (x1 < x2)
+      for (x = x1 ; x <= x2 ; ++x)
+	lcd128x64line (x, y1, x, y2, colour) ;
+    else
+      for (x = x2 ; x <= x1 ; ++x)
+	lcd128x64line (x, y1, x, y2, colour) ;
+  }
+  else
+  {
+    lcd128x64line   (x1, y1, x2, y1, colour) ;
+    lcd128x64lineTo (x2, y2, colour) ;
+    lcd128x64lineTo (x1, y2, colour) ;
+    lcd128x64lineTo (x1, y1, colour) ;
+  }
+}
+
+
+/*
+ * lcd128x64circle:
+ *      This is the midpoint circle algorithm.
+ *********************************************************************************
+ */
+
+void lcd128x64circle (int x, int y, int r, int colour, int filled)
+{
+  int ddF_x = 1 ;
+  int ddF_y = -2 * r ;
+
+  int f = 1 - r ;
+  int x1 = 0 ;
+  int y1 = r ;
+
+  if (filled)
+  {
+    lcd128x64line (x, y + r, x, y - r, colour) ;
+    lcd128x64line (x + r, y, x - r, y, colour) ;
+  }
+  else
+  {
+    lcd128x64point (x, y + r, colour) ;
+    lcd128x64point (x, y - r, colour) ;
+    lcd128x64point (x + r, y, colour) ;
+    lcd128x64point (x - r, y, colour) ;
+  }
+
+  while (x1 < y1)
+  {
+    if (f >= 0)
+    {
+      y1-- ;
+      ddF_y += 2 ;
+      f += ddF_y ;
+    }
+    x1++ ;
+    ddF_x += 2 ;
+    f += ddF_x ;
+    if (filled)
+    {
+      lcd128x64line (x + x1, y + y1, x - x1, y + y1, colour) ;
+      lcd128x64line (x + x1, y - y1, x - x1, y - y1, colour) ;
+      lcd128x64line (x + y1, y + x1, x - y1, y + x1, colour) ;
+      lcd128x64line (x + y1, y - x1, x - y1, y - x1, colour) ;
+    }
+    else
+    {
+      lcd128x64point (x + x1, y + y1, colour) ; lcd128x64point (x - x1, y + y1, colour) ;
+      lcd128x64point (x + x1, y - y1, colour) ; lcd128x64point (x - x1, y - y1, colour) ;
+      lcd128x64point (x + y1, y + x1, colour) ; lcd128x64point (x - y1, y + x1, colour) ;
+      lcd128x64point (x + y1, y - x1, colour) ; lcd128x64point (x - y1, y - x1, colour) ;
+    }
+  }
+}
+
+
+/*
+ * lcd128x64ellipse:
+ *	Fast ellipse drawing algorithm by 
+ *      John Kennedy
+ *	Mathematics Department
+ *	Santa Monica College
+ *	1900 Pico Blvd.
+ *	Santa Monica, CA 90405
+ *	jrkennedy6@gmail.com
+ *	-Confirned in email this algorithm is in the public domain -GH-
+ *********************************************************************************
+ */
+
+static void plot4ellipsePoints (int cx, int cy, int x, int y, int colour, int filled)
+{
+  if (filled)
+  {
+    lcd128x64line (cx + x, cy + y, cx - x, cy + y, colour) ;
+    lcd128x64line (cx - x, cy - y, cx + x, cy - y, colour) ;
+  }
+  else
+  {
+    lcd128x64point (cx + x, cy + y, colour) ;
+    lcd128x64point (cx - x, cy + y, colour) ;
+    lcd128x64point (cx - x, cy - y, colour) ;
+    lcd128x64point (cx + x, cy - y, colour) ;
+  }
+}
+
+void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled)
+{
+  int x, y ;
+  int xChange, yChange, ellipseError ;
+  int twoAsquare, twoBsquare ;
+  int stoppingX, stoppingY ;
+
+  twoAsquare = 2 * xRadius * xRadius ;
+  twoBsquare = 2 * yRadius * yRadius ;
+
+  x = xRadius ;
+  y = 0 ;
+
+  xChange = yRadius * yRadius * (1 - 2 * xRadius) ;
+  yChange = xRadius * xRadius ;
+
+  ellipseError = 0 ;
+  stoppingX    = twoBsquare * xRadius ;
+  stoppingY    = 0 ;
+
+  while (stoppingX >= stoppingY)	// 1st set of points
+  {
+    plot4ellipsePoints (cx, cy, x, y, colour, filled) ;
+    ++y ;
+    stoppingY    += twoAsquare ;
+    ellipseError += yChange ;
+    yChange      += twoAsquare ;
+
+    if ((2 * ellipseError + xChange) > 0 )
+    {
+      --x ;
+      stoppingX    -= twoBsquare ;
+      ellipseError += xChange ;
+      xChange      += twoBsquare ;
+    }
+  }
+
+  x = 0 ;
+  y = yRadius ;
+
+  xChange = yRadius * yRadius ;
+  yChange = xRadius * xRadius * (1 - 2 * yRadius) ;
+
+  ellipseError = 0 ;
+  stoppingX    = 0 ;
+  stoppingY    = twoAsquare * yRadius ;
+
+  while (stoppingX <= stoppingY)	//2nd set of points
+  {
+    plot4ellipsePoints (cx, cy, x, y, colour, filled) ;
+    ++x ;
+    stoppingX    += twoBsquare ;
+    ellipseError += xChange ;
+    xChange      += twoBsquare ;
+
+    if ((2 * ellipseError + yChange) > 0 )
+    {
+      --y ;
+      stoppingY -= twoAsquare ;
+      ellipseError += yChange ;
+      yChange += twoAsquare ;
+    }
+  }
+}
+
+
+/*
+ * lcd128x64putchar:
+ *	Print a single character to the screen
+ *********************************************************************************
+ */
+
+void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol)
+{
+  int y1, y2 ;
+
+  unsigned char line ;
+  unsigned char *fontPtr ;
+
+// Can't print if we're offscreen
+
+//if ((x < 0) || (x >= (maxX - fontWidth)) || (y < 0) || (y >= (maxY - fontHeight)))
+//  return ;
+
+  fontPtr = font + c * fontHeight ;
+
+  for (y1 = fontHeight - 1 ; y1 >= 0 ; --y1)
+  {
+    y2 = y + y1 ;
+    line = *fontPtr++ ;
+    lcd128x64point (x + 0, y2, (line & 0x80) == 0 ? bgCol : fgCol) ;
+    lcd128x64point (x + 1, y2, (line & 0x40) == 0 ? bgCol : fgCol) ;
+    lcd128x64point (x + 2, y2, (line & 0x20) == 0 ? bgCol : fgCol) ;
+    lcd128x64point (x + 3, y2, (line & 0x10) == 0 ? bgCol : fgCol) ;
+    lcd128x64point (x + 4, y2, (line & 0x08) == 0 ? bgCol : fgCol) ;
+    lcd128x64point (x + 5, y2, (line & 0x04) == 0 ? bgCol : fgCol) ;
+    lcd128x64point (x + 6, y2, (line & 0x02) == 0 ? bgCol : fgCol) ;
+    lcd128x64point (x + 7, y2, (line & 0x01) == 0 ? bgCol : fgCol) ;
+  }
+}
+
+
+/*
+ * lcd128x64puts:
+ *	Send a string to the display. Obeys \n and \r formatting
+ *********************************************************************************
+ */
+
+void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol)
+{
+  int c, mx, my ;
+
+  mx = x ; my = y ;
+
+  while (*str)
+  {
+    c = *str++ ;
+
+    if (c == '\r')
+    {
+      mx = x ;
+      continue ;
+    }
+
+    if (c == '\n')
+    {
+      mx  = x ;
+      my -= fontHeight ;
+      continue ;
+    }
+
+    lcd128x64putchar (mx, my, c, bgCol, fgCol) ;
+
+    mx += fontWidth ;
+    if (mx >= (maxX - fontWidth))
+    {
+      mx  = 0 ;
+      my -= fontHeight ;
+    }
+  }
+}
+
+
+/*
+ * lcd128x64clear:
+ *	Clear the display to the given colour.
+ *********************************************************************************
+ */
+
+void lcd128x64clear (int colour)
+{
+  register int i ;
+  register unsigned char *ptr = frameBuffer ;
+
+  for (i = 0 ; i < (maxX * maxY) ; ++i)
+    *ptr++ = colour ;
+}
+
+
+
+
+/*
+ * lcd128x64setup:
+ *	Initialise the display and GPIO.
+ *********************************************************************************
+ */
+
+int lcd128x64setup (void)
+{
+  int i ;
+
+  for (i = 0 ; i < 8 ; ++i)
+    pinMode (i, OUTPUT) ;
+
+  digitalWrite (CS1,    1) ;
+  digitalWrite (CS2,    1) ;
+  digitalWrite (STROBE, 0) ;
+  digitalWrite (RS,     1) ;
+
+  pinMode (CS1,    OUTPUT) ;
+  pinMode (CS2,    OUTPUT) ;
+  pinMode (STROBE, OUTPUT) ;
+  pinMode (RS,     OUTPUT) ;
+
+  sendCommand (0x3F, CS1) ;	// Display ON
+  sendCommand (0xC0, CS1) ;	// Set display start line to 0
+
+  sendCommand (0x3F, CS2) ;	// Display ON
+  sendCommand (0xC0, CS2) ;	// Set display start line to 0
+
+  lcd128x64clear          (0) ;
+  lcd128x64setOrientation (0) ;
+  lcd128x64update         () ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.h b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.h
new file mode 100644
index 0000000000000000000000000000000000000000..b448bbc83f1f0b5b5d3ed82ae1e4fdc3b143b703
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.h
@@ -0,0 +1,39 @@
+/*
+ * lcd128x64.h:
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+extern void lcd128x64setOrigin         (int x, int y) ;
+extern void lcd128x64setOrientation    (int orientation) ;
+extern void lcd128x64orientCoordinates (int *x, int *y) ;
+extern void lcd128x64getScreenSize     (int *x, int *y) ;
+extern void lcd128x64point             (int  x, int  y, int colour) ;
+extern void lcd128x64line              (int x0, int y0, int x1, int y1, int colour) ;
+extern void lcd128x64lineTo            (int  x, int  y, int colour) ;
+extern void lcd128x64rectangle         (int x1, int y1, int x2, int y2, int colour, int filled) ;
+extern void lcd128x64circle            (int  x, int  y, int  r, int colour, int filled) ;
+extern void lcd128x64ellipse           (int cx, int cy, int xRadius, int yRadius, int colour, int filled) ;
+extern void lcd128x64putchar           (int  x, int  y, int c, int bgCol, int fgCol) ;
+extern void lcd128x64puts              (int  x, int  y, const char *str, int bgCol, int fgCol) ;
+extern void lcd128x64update            (void) ;
+extern void lcd128x64clear             (int colour) ;
+
+extern int  lcd128x64setup             (void) ;
diff --git a/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.o b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.o
new file mode 100644
index 0000000000000000000000000000000000000000..3efe19e452fa56c4822a502af4403b6d75fed381
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/lcd128x64.o differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/libwiringPiDev.so.2.0 b/modules/catkin_ws/src/wiringPi/devLib/libwiringPiDev.so.2.0
new file mode 100755
index 0000000000000000000000000000000000000000..445f4b488f0dbc0bb236fc36f1c0ba6d1476e284
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/libwiringPiDev.so.2.0 differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/maxdetect.c b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.c
new file mode 100755
index 0000000000000000000000000000000000000000..23eabf80a2f35836736fcec3949485c5de34f9c6
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.c
@@ -0,0 +1,165 @@
+/*
+ * maxdetect.c:
+ *	Driver for the MaxDetect series sensors
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+//#include <stdio.h>
+//#include <stdlib.h>
+//#include <unistd.h>
+
+#include <wiringPi.h>
+
+#include "maxdetect.h"
+
+#ifndef	TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+
+/*
+ * maxDetectLowHighWait:
+ *	Wait for a transition from high to low on the bus
+ *********************************************************************************
+ */
+
+static void maxDetectLowHighWait (const int pin)
+{
+  unsigned int timeOut = millis () + 2000 ;
+
+  while (digitalRead (pin) == HIGH)
+    if (millis () > timeOut)
+      return ;
+
+  while (digitalRead (pin) == LOW)
+    if (millis () > timeOut)
+      return ;
+}
+
+
+/*
+ * maxDetectClockByte:
+ *	Read in a single byte from the MaxDetect bus
+ *********************************************************************************
+ */
+
+static unsigned int maxDetectClockByte (const int pin)
+{
+  unsigned int byte = 0 ;
+  int bit ;
+
+  for (bit = 0 ; bit < 8 ; ++bit)
+  {
+    maxDetectLowHighWait (pin) ;
+
+// bit starting now - we need to time it.
+
+    delayMicroseconds (30) ;
+    byte <<= 1 ;
+    if (digitalRead (pin) == HIGH)	// It's a 1
+      byte |= 1 ;
+  }
+
+  return byte ;
+}
+
+
+/*
+ * maxDetectRead:
+ *	Read in and return the 4 data bytes from the MaxDetect sensor.
+ *	Return TRUE/FALSE depending on the checksum validity
+ *********************************************************************************
+ */
+
+int maxDetectRead (const int pin, unsigned char buffer [4])
+{
+  int i ;
+  unsigned int checksum ;
+  unsigned char localBuf [5] ;
+
+// Wake up the RHT03 by pulling the data line low, then high
+//	Low for 10mS, high for 40uS.
+
+  pinMode      (pin, OUTPUT) ;
+  digitalWrite (pin, 0) ; delay             (10) ;
+  digitalWrite (pin, 1) ; delayMicroseconds (40) ;
+  pinMode      (pin, INPUT) ;
+
+// Now wait for sensor to pull pin low
+
+  maxDetectLowHighWait (pin) ;
+
+// and read in 5 bytes (40 bits)
+
+  for (i = 0 ; i < 5 ; ++i)
+    localBuf [i] = maxDetectClockByte (pin) ;
+
+  checksum = 0 ;
+  for (i = 0 ; i < 4 ; ++i)
+  {
+    buffer [i] = localBuf [i] ;
+    checksum += localBuf [i] ;
+  }
+  checksum &= 0xFF ;
+
+  return checksum == localBuf [4] ;
+}
+
+
+/*
+ * readRHT03:
+ *	Read the Temperature & Humidity from an RHT03 sensor
+ *********************************************************************************
+ */
+
+int readRHT03 (const int pin, int *temp, int *rh)
+{
+  static unsigned int nextTime   = 0 ;
+  static          int lastTemp   = 0 ;
+  static          int lastRh     = 0 ;
+  static          int lastResult = TRUE ;
+
+  unsigned char buffer [4] ;
+
+// Don't read more than once a second
+
+  if (millis () < nextTime)
+  {
+    *temp = lastTemp ;
+    *rh   = lastRh ;
+    return lastResult ;
+  }
+  
+  lastResult = maxDetectRead (pin, buffer) ;
+
+  if (lastResult)
+  {
+    *temp      = lastTemp   = (buffer [2] * 256 + buffer [3]) ;
+    *rh        = lastRh     = (buffer [0] * 256 + buffer [1]) ;
+    nextTime   = millis () + 2000 ;
+    return TRUE ;
+  }
+  else
+  {
+    return FALSE ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/maxdetect.h b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.h
new file mode 100755
index 0000000000000000000000000000000000000000..a1fd742e42f40780c097fac02fa026c0827a148e
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.h
@@ -0,0 +1,40 @@
+/*
+ * maxdetect.h:
+ *	Driver for the MaxDetect series sensors
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Main generic function
+
+int maxDetectRead (const int pin, unsigned char buffer [4]) ;
+
+// Individual sensors
+
+int readRHT03 (const int pin, int *temp, int *rh) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/devLib/maxdetect.o b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.o
new file mode 100644
index 0000000000000000000000000000000000000000..924f414a6ca9a33a4791cd54c4fd69830e8133b0
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/maxdetect.o differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piFace.c b/modules/catkin_ws/src/wiringPi/devLib/piFace.c
new file mode 100644
index 0000000000000000000000000000000000000000..4475c7f5b28581e9c8a45f55ccce612758e9e14c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/piFace.c
@@ -0,0 +1,112 @@
+/*
+ * piFace.:
+ *	This file to interface with the PiFace peripheral device which
+ *	has an MCP23S17 GPIO device connected via the SPI bus.
+ *
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+#include <stdint.h>
+
+#include <wiringPi.h>
+#include <mcp23s17.h>
+
+#include "piFace.h"
+
+
+/*
+ * myDigitalWrite:
+ *	Perform the digitalWrite function on the PiFace board
+ *********************************************************************************
+ */
+
+void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  digitalWrite (pin + 16, value) ;
+}
+
+
+/*
+ * myDigitalRead:
+ *	Perform the digitalRead function on the PiFace board
+ *	With a slight twist - if we read from base + 8, then we
+ *	read from the output latch...
+ *********************************************************************************
+ */
+
+int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  if ((pin - node->pinBase) >= 8)
+    return digitalRead (pin + 8) ;
+  else
+    return digitalRead (pin + 16 + 8) ;
+}
+
+
+/*
+ * myPullUpDnControl:
+ *	Perform the pullUpDnControl function on the PiFace board
+ *********************************************************************************
+ */
+
+void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud)
+{
+  pullUpDnControl (pin + 16 + 8, pud) ;
+}
+
+
+/*
+ * piFaceSetup
+ *	We're going to create an instance of the mcp23s17 here, then
+ *	provide our own read/write routines on-top of it...
+ *	The supplied PiFace code (in Pithon) treats it as an 8-bit device
+ *	where you write the output ports and read the input port using the
+ *	same pin numbers, however I have had a request to be able to read
+ *	the output port, so reading 8..15 will read the output latch.
+ *********************************************************************************
+ */
+
+int piFaceSetup (const int pinBase)
+{
+  int    i ;
+  struct wiringPiNodeStruct *node ;
+
+// Create an mcp23s17 instance:
+
+   mcp23s17Setup (pinBase + 16, 0, 0) ;
+
+// Set the direction bits
+
+  for (i = 0 ; i < 8 ; ++i)
+  {
+    pinMode (pinBase + 16 +     i, OUTPUT) ;	// Port A is the outputs
+    pinMode (pinBase + 16 + 8 + i, INPUT) ;	// Port B inputs.
+  }
+
+  node = wiringPiNewNode (pinBase, 16) ;
+  node->digitalRead     = myDigitalRead ;
+  node->digitalWrite    = myDigitalWrite ;
+  node->pullUpDnControl = myPullUpDnControl ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piFace.h b/modules/catkin_ws/src/wiringPi/devLib/piFace.h
new file mode 100644
index 0000000000000000000000000000000000000000..49653144ec2892b8b19c0d6f69eec2c168f076b4
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/piFace.h
@@ -0,0 +1,32 @@
+/*
+ * piFace.h:
+ *	Control the PiFace Interface board for the Raspberry Pi
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int  piFaceSetup (const int pinBase) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piFace.o b/modules/catkin_ws/src/wiringPi/devLib/piFace.o
new file mode 100644
index 0000000000000000000000000000000000000000..cb2516fe77c25f4adee5e4806ec33ed7a42cd119
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/piFace.o differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piGlow.c b/modules/catkin_ws/src/wiringPi/devLib/piGlow.c
new file mode 100644
index 0000000000000000000000000000000000000000..44e3db8e5638e3d3edb3a7e2b292b8bf4e8d3425
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/piGlow.c
@@ -0,0 +1,118 @@
+/*
+ * piGlow.c:
+ *	Easy access to the Pimoroni PiGlow board.
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <sn3218.h>
+
+#include "piGlow.h"
+
+#define	PIGLOW_BASE	577
+
+static int leg0 [6] = {  6,  7,  8,  5,  4,  9 } ;
+static int leg1 [6] = { 17, 16, 15, 13, 11, 10 } ;
+static int leg2 [6] = {  0,  1,  2,  3, 14, 12 } ;
+
+
+/*
+ * piGlow1:
+ *	Light up an individual LED
+ *********************************************************************************
+ */
+
+void piGlow1 (const int leg, const int ring, const int intensity)
+{
+  int *legLeds ;
+
+  if ((leg  < 0) || (leg  > 2)) return ;
+  if ((ring < 0) || (ring > 5)) return ;
+
+  /**/ if (leg == 0)
+    legLeds = leg0 ;
+  else if (leg == 1)
+    legLeds = leg1 ;
+  else
+    legLeds = leg2 ;
+
+  analogWrite (PIGLOW_BASE + legLeds [ring], intensity) ;
+}
+
+/*
+ * piGlowLeg:
+ *	Light up all 6 LEDs on a leg
+ *********************************************************************************
+ */
+
+void piGlowLeg (const int leg, const int intensity)
+{
+  int  i ;
+  int *legLeds ;
+
+  if ((leg < 0) || (leg > 2))
+    return ;
+
+  /**/ if (leg == 0)
+    legLeds = leg0 ;
+  else if (leg == 1)
+    legLeds = leg1 ;
+  else
+    legLeds = leg2 ;
+
+  for (i = 0 ; i < 6 ; ++i)
+    analogWrite (PIGLOW_BASE + legLeds [i], intensity) ;
+}
+
+
+/*
+ * piGlowRing:
+ *	Light up 3 LEDs in a ring. Ring 0 is the outermost, 5 the innermost
+ *********************************************************************************
+ */
+
+void piGlowRing (const int ring, const int intensity)
+{
+  if ((ring < 0) || (ring > 5))
+    return ;
+
+  analogWrite (PIGLOW_BASE + leg0 [ring], intensity) ;
+  analogWrite (PIGLOW_BASE + leg1 [ring], intensity) ;
+  analogWrite (PIGLOW_BASE + leg2 [ring], intensity) ;
+}
+
+/*
+ * piGlowSetup:
+ *	Initialise the board & remember the pins we're using
+ *********************************************************************************
+ */
+
+void piGlowSetup (int clear)
+{
+  sn3218Setup (PIGLOW_BASE) ;
+
+  if (clear)
+  {
+    piGlowLeg (0, 0) ;
+    piGlowLeg (1, 0) ;
+    piGlowLeg (2, 0) ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piGlow.h b/modules/catkin_ws/src/wiringPi/devLib/piGlow.h
new file mode 100644
index 0000000000000000000000000000000000000000..a4d89d01baf3a1102374d361a22accd9574d664b
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/piGlow.h
@@ -0,0 +1,45 @@
+/*
+ * piglow.h:
+ *	Easy access to the Pimoroni PiGlow board.
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#define	PIGLOW_RED	0
+#define	PIGLOW_ORANGE	1
+#define	PIGLOW_YELLOW	2
+#define	PIGLOW_GREEN	3
+#define	PIGLOW_BLUE	4
+#define	PIGLOW_WHITE	5
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void piGlow1     (const int leg,  const int ring, const int intensity) ;
+extern void piGlowLeg   (const int leg,  const int intensity) ;
+extern void piGlowRing  (const int ring, const int intensity) ;
+extern void piGlowSetup (int clear) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piGlow.o b/modules/catkin_ws/src/wiringPi/devLib/piGlow.o
new file mode 100644
index 0000000000000000000000000000000000000000..d5f04a6a48200162f01b3ebc5925a524290a17be
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/piGlow.o differ
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piNes.c b/modules/catkin_ws/src/wiringPi/devLib/piNes.c
new file mode 100644
index 0000000000000000000000000000000000000000..a115050e8a96102801aff480b0a0a2b27e7fcf20
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/piNes.c
@@ -0,0 +1,113 @@
+/*
+ * piNes.c:
+ *	Driver for the NES Joystick controller on the Raspberry Pi
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+
+#include "piNes.h"
+
+#define	MAX_NES_JOYSTICKS	8
+
+#define	NES_RIGHT	0x01
+#define	NES_LEFT	0x02
+#define	NES_DOWN	0x04
+#define	NES_UP		0x08
+#define	NES_START	0x10
+#define	NES_SELECT	0x20
+#define	NES_B		0x40
+#define	NES_A		0x80
+
+
+#define	PULSE_TIME	25
+
+// Data to store the pins for each controller
+
+struct nesPinsStruct
+{
+  unsigned int cPin, dPin, lPin ;
+} ;
+
+static struct nesPinsStruct nesPins [MAX_NES_JOYSTICKS] ;
+
+static int joysticks = 0 ;
+
+
+/*
+ * setupNesJoystick:
+ *	Create a new NES joystick interface, program the pins, etc.
+ *********************************************************************************
+ */
+
+int setupNesJoystick (int dPin, int cPin, int lPin)
+{
+  if (joysticks == MAX_NES_JOYSTICKS)
+    return -1 ;
+
+  nesPins [joysticks].dPin = dPin ;
+  nesPins [joysticks].cPin = cPin ;
+  nesPins [joysticks].lPin = lPin ;
+
+  digitalWrite (lPin, LOW) ;
+  digitalWrite (cPin, LOW) ;
+
+  pinMode (lPin, OUTPUT) ;
+  pinMode (cPin, OUTPUT) ;
+  pinMode (dPin, INPUT) ;
+
+  return joysticks++ ;
+}
+
+
+/*
+ * readNesJoystick:
+ *	Do a single scan of the NES Joystick.
+ *********************************************************************************
+ */
+
+unsigned int readNesJoystick (int joystick)
+{
+  unsigned int value = 0 ;
+  int  i ;
+
+  struct nesPinsStruct *pins = &nesPins [joystick] ;
+ 
+// Toggle Latch - which presents the first bit
+
+  digitalWrite (pins->lPin, HIGH) ; delayMicroseconds (PULSE_TIME) ;
+  digitalWrite (pins->lPin, LOW)  ; delayMicroseconds (PULSE_TIME) ;
+
+// Read first bit
+
+  value = digitalRead (pins->dPin) ;
+
+// Now get the next 7 bits with the clock
+
+  for (i = 0 ; i < 7 ; ++i)
+  {
+    digitalWrite (pins->cPin, HIGH) ; delayMicroseconds (PULSE_TIME) ;
+    digitalWrite (pins->cPin, LOW)  ; delayMicroseconds (PULSE_TIME) ;
+    value = (value << 1) | digitalRead (pins->dPin) ;
+  }
+
+  return value ^ 0xFF ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piNes.h b/modules/catkin_ws/src/wiringPi/devLib/piNes.h
new file mode 100644
index 0000000000000000000000000000000000000000..897f1815915e83b7572a0ae61f29b1cad51bf76b
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/devLib/piNes.h
@@ -0,0 +1,45 @@
+/*
+ * piNes.h:
+ *	Driver for the NES Joystick controller on the Raspberry Pi
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#define	MAX_NES_JOYSTICKS	8
+
+#define	NES_RIGHT	0x01
+#define	NES_LEFT	0x02
+#define	NES_DOWN	0x04
+#define	NES_UP		0x08
+#define	NES_START	0x10
+#define	NES_SELECT	0x20
+#define	NES_B		0x40
+#define	NES_A		0x80
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int          setupNesJoystick (int dPin, int cPin, int lPin) ;
+extern unsigned int  readNesJoystick (int joystick) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/devLib/piNes.o b/modules/catkin_ws/src/wiringPi/devLib/piNes.o
new file mode 100644
index 0000000000000000000000000000000000000000..a080524846d668b735113e77e539d0ccc1096f7e
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/devLib/piNes.o differ
diff --git a/modules/catkin_ws/src/wiringPi/examples/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/examples/COPYING.LESSER
new file mode 100644
index 0000000000000000000000000000000000000000..65c5ca88a67c30becee01c5a8816d964b03862f9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/COPYING.LESSER
@@ -0,0 +1,165 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/7segments.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/7segments.c
new file mode 100644
index 0000000000000000000000000000000000000000..8797e492fc578357f66b0393bc2cf5769b44cbdb
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/7segments.c
@@ -0,0 +1,221 @@
+/*
+ * 7segments.c:
+ *	Simple test program to see if we can drive a 7-segment LED
+ *	display using the GPIO and little else on the Raspberry Pi
+ *
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ */
+
+#undef	PHOTO_HACK
+
+#include <wiringPi.h>
+
+#include <stdio.h>
+#include <time.h>
+#include <ctype.h>
+#include <string.h>
+
+/*
+ *  Segment mapping
+ *
+ *	 --a--
+ *	|     |
+ *	f     b
+ *	|     |
+ *	 --g--
+ *	|     |
+ *	e     c
+ *	|     |
+ *	 --d--  p
+ */
+
+// GPIO Pin Mapping
+
+static int digits   [6] = {  7, 11, 10, 13, 12, 14    } ;
+static int segments [7] = {  6,  5,  4,  3,  2,  1, 0 } ;
+
+
+static const int segmentDigits [] =
+{
+// a  b  c  d  e  f  g     Segments
+// 6  5  4  3  2  1  0,	// wiringPi pin No.
+
+   1, 1, 1, 1, 1, 1, 0,	// 0
+   0, 1, 1, 0, 0, 0, 0,	// 1
+   1, 1, 0, 1, 1, 0, 1,	// 2
+   1, 1, 1, 1, 0, 0, 1,	// 3
+   0, 1, 1, 0, 0, 1, 1,	// 4
+   1, 0, 1, 1, 0, 1, 1,	// 5
+   1, 0, 1, 1, 1, 1, 1,	// 6
+   1, 1, 1, 0, 0, 0, 0,	// 7
+   1, 1, 1, 1, 1, 1, 1,	// 8
+   1, 1, 1, 1, 0, 1, 1,	// 9
+   1, 1, 1, 0, 1, 1, 1,	// A
+   0, 0, 1, 1, 1, 1, 1,	// b
+   1, 0, 0, 1, 1, 1, 0,	// C
+   0, 1, 1, 1, 1, 0, 1,	// d
+   1, 0, 0, 1, 1, 1, 1,	// E
+   1, 0, 0, 0, 1, 1, 1,	// F
+   0, 0, 0, 0, 0, 0, 0,	// blank
+} ;
+ 
+
+// display:
+//	A global variable which is written to by the main program and
+//	read from by the thread that updates the display. Only the first
+//	6 characters are used.
+
+char display [8] ;
+
+
+/*
+ * displayDigits:
+ *	This is our thread that's run concurrently with the main program.
+ *	Essentially sit in a loop, parsing and displaying the data held in
+ *	the "display" global.
+ *********************************************************************************
+ */
+
+PI_THREAD (displayDigits)
+{
+  int digit, segment ;
+  int index, d, segVal ;
+
+  piHiPri (50) ;
+
+  for (;;)
+  {
+    for (digit = 0 ; digit < 6 ; ++digit)
+    {
+      for (segment = 0 ; segment < 7 ; ++segment)
+      {
+	d = toupper (display [digit]) ;
+	/**/ if ((d >= '0') && (d <= '9'))	// Digit
+	  index = d - '0' ;
+	else if ((d >= 'A') && (d <= 'F'))	// Hex
+	  index = d - 'A' + 10 ;
+	else
+	  index = 16 ;				// Blank
+
+	segVal = segmentDigits [index * 7 + segment] ;
+
+	digitalWrite (segments [segment], segVal) ;
+      }
+      digitalWrite (digits [digit], 1) ;
+      delay (2) ;
+      digitalWrite (digits [digit], 0) ;
+    }
+  }
+}
+
+
+/*
+ * setup:
+ *	Initialise the hardware and start the thread
+ *********************************************************************************
+ */
+
+void setup (void)
+{
+  int i, c ;
+
+  wiringPiSetup () ;
+
+// 7 segments
+
+  for (i = 0 ; i < 7 ; ++i)
+    { digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; }
+
+// 6 digits
+
+  for (i = 0 ; i < 6 ; ++i)
+    { digitalWrite (digits [i], 0) ;   pinMode (digits [i],   OUTPUT) ; }
+
+  strcpy (display, "      ") ;
+  piThreadCreate (displayDigits) ;
+  delay (10) ; // Just to make sure it's started
+
+// Quick countdown LED test sort of thing
+
+  c = 999999 ;
+  for (i = 0 ; i < 10 ; ++i)
+  {
+    sprintf (display, "%06d", c) ;
+    delay (400) ;
+    c -= 111111 ;
+  }
+
+  strcpy (display, "      ") ;
+  delay (400) ;
+
+#ifdef PHOTO_HACK
+  sprintf (display, "%s", "123456") ;
+  for (;;)
+    delay (1000) ;
+#endif
+
+}
+
+
+/*
+ * teenager:
+ *	No explanation needed. (Nor one given!)
+ *********************************************************************************
+ */
+
+void teenager (void)
+{
+  char *message = "      feedbeef      babe      cafe      b00b      " ;
+  int i ;
+
+  for (i = 0 ; i < strlen (message) - 4 ; ++i)
+  {
+    strncpy (display, &message [i], 6) ;
+    delay (200) ;
+  }
+  delay (1000) ;
+  for (i = 0 ; i < 3 ; ++i)
+  {
+    strcpy (display, "    ") ;
+    delay (150) ;
+    strcpy (display, " b00b ") ;
+    delay (250) ;
+  }
+  delay (1000) ;
+  strcpy (display, "      ") ;
+  delay (1000) ;
+}
+
+
+/*
+ *********************************************************************************
+ * main:
+ *	Let the fun begin
+ *********************************************************************************
+ */
+
+int main (void)
+{
+  struct tm *t ;
+  time_t     tim ;
+
+  setup    () ;
+  teenager () ;
+
+  tim = time (NULL) ;
+  for (;;)
+  {
+    while (time (NULL) == tim)
+      delay (5) ;
+
+    tim = time (NULL) ;
+    t   = localtime (&tim) ;
+
+    sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
+
+    delay (500) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/Makefile b/modules/catkin_ws/src/wiringPi/examples/Gertboard/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..75692611550d4ab154e17478eca0a67206ad3507
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/Makefile
@@ -0,0 +1,74 @@
+#
+# Makefile:
+#	Gertboard - Examples using wiringPi
+#
+#	Copyright (c) 2013 Gordon Henderson
+#################################################################################
+
+#DEBUG	= -g -O0
+DEBUG	= -O3
+CC	= gcc
+INCLUDE	= -I/usr/local/include
+CFLAGS	= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
+
+LDFLAGS	= -L/usr/local/lib
+LDLIBS    = -lwiringPi -lwiringPiDev -lpthread -lm
+
+# Should not alter anything below this line
+###############################################################################
+
+SRC	=	gertboard.c				\
+		buttons.c 7segments.c			\
+		voltmeter.c temperature.c vumeter.c	\
+		record.c
+
+OBJ	=	$(SRC:.c=.o)
+
+BINS	=	$(SRC:.c=)
+
+all:	$(BINS)
+
+gertboard:	gertboard.o
+	@echo [link]
+	@$(CC) -o $@ gertboard.o $(LDFLAGS) $(LDLIBS)
+
+buttons:	buttons.o
+	@echo [link]
+	@$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS)
+
+7segments:	7segments.o
+	@echo [link]
+	@$(CC) -o $@ 7segments.o $(LDFLAGS) $(LDLIBS)
+
+voltmeter:	voltmeter.o
+	@echo [link]
+	@$(CC) -o $@ voltmeter.o $(LDFLAGS) $(LDLIBS)
+
+temperature:	temperature.o
+	@echo [link]
+	@$(CC) -o $@ temperature.o $(LDFLAGS) $(LDLIBS)
+
+vumeter:	vumeter.o
+	@echo [link]
+	@$(CC) -o $@ vumeter.o $(LDFLAGS) $(LDLIBS)
+
+record:	record.o
+	@echo [link]
+	@$(CC) -o $@ record.o $(LDFLAGS) $(LDLIBS)
+
+.c.o:
+	@echo [CC] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+clean:
+	@echo [Clean]
+	@rm -f $(OBJ) *~ core tags $(BINS)
+
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+depend:
+	makedepend -Y $(SRC)
+
+# DO NOT DELETE
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/buttons.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/buttons.c
new file mode 100644
index 0000000000000000000000000000000000000000..5f76764121c1d0918874e0b06293e544bc985ab7
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/buttons.c
@@ -0,0 +1,83 @@
+/*
+ * buttons.c:
+ *	Read the Gertboard buttons. Each one will act as an on/off
+ *	tiggle switch for 3 different LEDs
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+
+// Array to keep track of our LEDs
+
+int leds [] = { 0, 0, 0 } ;
+
+// scanButton:
+//	See if a button is pushed, if so, then flip that LED and
+//	wait for the button to be let-go
+
+void scanButton (int button)
+{
+  if (digitalRead (button) == HIGH)	// Low is pushed
+    return ;
+
+  leds [button] ^= 1 ; // Invert state
+  digitalWrite (4 + button, leds [button]) ;
+
+  while (digitalRead (button) == LOW)	// Wait for release
+    delay (10) ;
+}
+
+int main (void)
+{
+  int i ;
+
+  printf ("Raspberry Pi Gertboard Button Test\n") ;
+
+  wiringPiSetup () ;
+
+// Setup the outputs:
+//	Pins 3, 4, 5, 6 and 7 output:
+//	We're not using 3 or 4, but make sure they're off anyway
+//	(Using same hardware config as blink12.c)
+
+  for (i = 3 ; i < 8 ; ++i)
+  {
+    pinMode      (i, OUTPUT) ;
+    digitalWrite (i, 0) ;
+  }
+
+// Setup the inputs
+
+  for (i = 0 ; i < 3 ; ++i)
+  {
+    pinMode         (i, INPUT) ;
+    pullUpDnControl (i, PUD_UP) ;
+    leds [i] = 0 ;
+  }
+
+  for (;;)
+  {
+    for (i = 0 ; i < 3 ; ++i)
+      scanButton (i) ;
+    delay (1) ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/gertboard.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/gertboard.c
new file mode 100644
index 0000000000000000000000000000000000000000..aefcb1244fef781f056a9e28bde353bd31b4719d
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/gertboard.c
@@ -0,0 +1,96 @@
+/*
+ * gertboard.c:
+ *	Simple test for the SPI bus on the Gertboard
+ *
+ *	Hardware setup:
+ *		D/A port 0 jumpered to A/D port 0.
+ *
+ *	We output a sine wave on D/A port 0 and sample A/D port 0. We then
+ *	plot the input value on the terminal as a sort of vertical scrolling
+ *	oscilloscipe.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <stdlib.h>
+#include <math.h>
+
+// Gertboard D to A is an 8-bit unit.
+
+#define	B_SIZE	256
+
+#include <wiringPi.h>
+#include <gertboard.h>
+
+int main (void)
+{
+  double angle ;
+  int i, inputValue ;
+  int  buffer [B_SIZE] ;
+  int   cols ;
+  struct winsize w ;
+
+
+  printf ("Raspberry Pi Gertboard SPI test program\n") ;
+  printf ("=======================================\n") ;
+
+  ioctl (fileno (stdin), TIOCGWINSZ, &w);
+  cols = w.ws_col - 2 ;
+
+// Always initialise wiringPi. Use wiringPiSys() if you don't need
+//	(or want) to run as root
+
+  wiringPiSetupSys () ;
+
+// Initialise the Gertboard analog hardware at pin 100
+
+  gertboardAnalogSetup (100) ;
+
+// Generate a Sine Wave and store in our buffer
+
+  for (i = 0 ; i < B_SIZE ; ++i)
+  {
+    angle = ((double)i / (double)B_SIZE) * M_PI * 2.0 ;
+    buffer [i] = (int)rint ((sin (angle)) * 127.0 + 128.0) ;
+  }
+
+// Loop, output the sine wave on analog out port 0, read it into A-D port 0
+//	and display it on the screen
+
+  for (;;)
+  {
+    for (i = 0 ; i < B_SIZE ; ++i)
+    {
+      analogWrite (100, buffer [i]) ;
+
+      inputValue = analogRead (100) ;
+
+// We don't need to wory about the scale or sign - the analog hardware is
+//	a 10-bit value, so 0-1023. Just scale this to our terminal
+
+      printf ("%*s\n", (inputValue * cols) / 1023, "*") ;
+      delay (2) ;
+    }
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/record.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/record.c
new file mode 100644
index 0000000000000000000000000000000000000000..71d87184e6abaf4ce5bd86540d9dd5ad7f250e89
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/record.c
@@ -0,0 +1,60 @@
+/*
+ * record.c:
+ *	Record some audio via the Gertboard
+ *
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <sys/time.h>
+
+#include <wiringPi.h>
+#include <gertboard.h>
+
+#define	B_SIZE	40000
+
+int main ()
+{
+  int i ;
+  struct timeval tStart, tEnd, tTaken ;
+  unsigned char buffer [B_SIZE] ;
+
+  printf ("\n") ;
+  printf ("Gertboard demo: Recorder\n") ;
+  printf ("========================\n") ;
+
+// Always initialise wiringPi. Use wiringPiSys() if you don't need
+//	(or want) to run as root
+
+  wiringPiSetupSys () ;
+
+// Initialise the Gertboard analog hardware at pin 100
+
+  gertboardAnalogSetup (100) ;
+
+  gettimeofday (&tStart, NULL) ;
+
+  for (i = 0 ; i < B_SIZE ; ++i)
+    buffer [i] = analogRead (100) >> 2 ;
+
+  gettimeofday (&tEnd, NULL) ;
+  
+  timersub (&tEnd, &tStart, &tTaken) ;
+
+  printf ("Time taken for %d  reads: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ;
+
+  gettimeofday (&tStart, NULL) ;
+
+  for (i = 0 ; i < B_SIZE ; ++i)
+   analogWrite (100, buffer [i]) ;
+
+  gettimeofday (&tEnd, NULL) ;
+  
+  timersub (&tEnd, &tStart, &tTaken) ;
+
+  printf ("Time taken for %d writes: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ;
+
+  return 0 ;
+}
+
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/temperature.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/temperature.c
new file mode 100644
index 0000000000000000000000000000000000000000..5985a122cf3a4067a98f12bc9dd61490ecc7800c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/temperature.c
@@ -0,0 +1,78 @@
+/*
+ * temperature.c:
+ *	Demonstrate use of the Gertboard A to D converter to make
+ *	a simple thermometer using the LM35.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+
+#include <wiringPi.h>
+#include <gertboard.h>
+
+int main ()
+{
+  int x1, x2 ;
+  double v1, v2 ;
+
+  printf ("\n") ;
+  printf ("Gertboard demo: Simple Thermemeter\n") ;
+  printf ("==================================\n") ;
+
+// Always initialise wiringPi. Use wiringPiSys() if you don't need
+//	(or want) to run as root
+
+  wiringPiSetupSys () ;
+
+// Initialise the Gertboard analog hardware at pin 100
+
+  gertboardAnalogSetup (100) ;
+
+  printf ("\n") ;
+  printf ("| Channel 0 | Channel 1 | Temperature 1 | Temperature 2 |\n") ;
+
+  for (;;)
+  {
+
+// Read the 2 channels:
+
+    x1 = analogRead (100) ;
+    x2 = analogRead (101) ;
+
+// Convert to a voltage:
+
+    v1 = (double)x1 / 1023.0 * 3.3 ;
+    v2 = (double)x2 / 1023.0 * 3.3 ;
+
+// Print
+
+    printf ("|    %6.3f |    %6.3f |", v1, v2) ;
+
+// Print Temperature of both channels by converting the LM35 reading
+//	to a temperature. Fortunately these are easy: 0.01 volts per C.
+
+    printf ("          %4.1f |          %4.1f |\r", v1 * 100.0, v2 * 100.0) ;
+    fflush (stdout) ;
+  }
+
+  return 0 ;
+}
+
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/voltmeter.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/voltmeter.c
new file mode 100644
index 0000000000000000000000000000000000000000..c4d2113f16a7cc6dbdea50328712a6a2fbf358fc
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/voltmeter.c
@@ -0,0 +1,73 @@
+/*
+ * voltmeter.c:
+ *	Demonstrate use of the Gertboard A to D converter to make
+ *	a simple voltmeter.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+
+#include <wiringPi.h>
+#include <gertboard.h>
+
+int main ()
+{
+  int x1, x2 ;
+  double v1, v2 ;
+
+  printf ("\n") ;
+  printf ("Gertboard demo: Simple Voltmeters\n") ;
+  printf ("=================================\n") ;
+
+// Always initialise wiringPi. Use wiringPiSys() if you don't need
+//	(or want) to run as root
+
+  wiringPiSetupSys () ;
+
+// Initialise the Gertboard analog hardware at pin 100
+
+  gertboardAnalogSetup (100) ;
+
+  printf ("\n") ;
+  printf ("| Channel 0 | Channel 1 |\n") ;
+
+  for (;;)
+  {
+
+// Read the 2 channels:
+
+    x1 = analogRead (100) ;
+    x2 = analogRead (101) ;
+
+// Convert to a voltage:
+
+    v1 = (double)x1 / 1023.0 * 3.3 ;
+    v2 = (double)x2 / 1023.0 * 3.3 ;
+
+// Print
+
+    printf ("|    %6.3f |    %6.3f |\r", v1, v2) ;
+    fflush (stdout) ;
+  }
+
+  return 0 ;
+}
+
diff --git a/modules/catkin_ws/src/wiringPi/examples/Gertboard/vumeter.c b/modules/catkin_ws/src/wiringPi/examples/Gertboard/vumeter.c
new file mode 100644
index 0000000000000000000000000000000000000000..9643ace970e2765cf6a090f571bf4328231aedf5
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Gertboard/vumeter.c
@@ -0,0 +1,152 @@
+/*
+ * vumeter.c:
+ *	Simple VU meter
+ *
+ * Heres the theory:
+ *	We will sample at 4000 samples/sec and put the data into a
+ *	low-pass filter with a depth of 1000 samples. This will give
+ *	us 1/4 a second of lag on the signal, but I think it might
+ *	produce a more pleasing output.
+ *
+ *	The input of the microphone should be at mid-pont with no
+ *	sound input, but we might have to sample that too, to get
+ *	our reference zero...
+ *
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include <wiringPi.h>
+#include <gertboard.h>
+
+#ifndef	TRUE
+#define	TRUE	(1==1)
+#define	FALSE	(!TRUE)
+#endif
+
+#define	B_SIZE	1000
+#define	S_SIZE	 128
+
+static int buffer [B_SIZE] ;
+static int bPtr = 0 ;
+
+/*
+ * ledPercent:
+ *	Output the given value as a percentage on the LEDs
+ *********************************************************************************
+ */
+
+static void ledPercent (int percent)
+{
+  unsigned int output = 0 ;
+
+  if (percent > 11) output |= 0x01 ;
+  if (percent > 22) output |= 0x02 ;
+  if (percent > 33) output |= 0x04 ;
+  if (percent > 44) output |= 0x08 ;
+  if (percent > 55) output |= 0x10 ;
+  if (percent > 66) output |= 0x20 ;
+  if (percent > 77) output |= 0x40 ;
+  if (percent > 88) output |= 0x80 ;
+
+  digitalWriteByte (output) ;
+}
+
+static unsigned int tPeriod, tNextSampleTime ;
+
+/*
+ * sample:
+ *	Get a sample from the Gertboard. If not enough time has elapsed
+ *	since the last sample, then wait...
+ *********************************************************************************
+ */
+
+static void sample (void)
+{
+  unsigned int tFuture ;
+
+// Calculate the future sample time
+
+  tFuture = tPeriod + tNextSampleTime ;
+
+// Wait until the next sample time
+
+  while (micros () < tNextSampleTime)
+    ;
+  
+  buffer [bPtr] = gertboardAnalogRead (0) ;
+
+  tNextSampleTime = tFuture ;
+}
+
+
+int main ()
+{
+  int quietLevel, min, max ;
+  int i, sum ;
+  unsigned int tStart, tEnd ;
+
+  printf ("\n") ;
+  printf ("Gertboard demo: VU Meter\n") ;
+  printf ("========================\n") ;
+
+  wiringPiSetup     () ;
+  gertboardSPISetup () ;
+
+  ledPercent (0) ;
+  for (i = 0 ; i < 8 ; ++i)
+    pinMode (i, OUTPUT) ;
+
+  for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr)
+    buffer [bPtr] = 99 ;
+
+  tPeriod = 1000000 / 1000 ;
+
+  printf ("Shhhh.... ") ; fflush (stdout) ;
+  delay (1000) ;
+  printf ("Sampling quiet... ") ; fflush (stdout) ;
+
+  tStart = micros () ;
+
+  tNextSampleTime = micros () ;
+  for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr)
+    sample () ;
+
+  tEnd = micros () ;
+
+  quietLevel = 0 ;
+  max =    0 ;
+  min = 1024 ;
+  for (i = 0 ; i < B_SIZE ; ++i)
+  {
+    quietLevel += buffer [i] ;
+    if (buffer [i] > max) max = buffer [i] ;
+    if (buffer [i] < min) min = buffer [i] ;
+  }
+  quietLevel /= B_SIZE ;
+
+  printf ("Done. Quiet level is: %d [%d:%d] [%d:%d]\n", quietLevel, min, max, quietLevel - min, max - quietLevel) ;
+
+  printf ("Time taken for %d reads: %duS\n", B_SIZE, tEnd - tStart) ;
+
+  for (bPtr = 0 ;;)
+  {
+    sample () ;
+    sum = 0 ;
+    for (i = 0 ; i < S_SIZE ; ++i)
+      sum += buffer [i] ;
+    sum /= S_SIZE ;
+    sum = abs (quietLevel - sum) ;
+    sum = (sum * 1000) / quietLevel ;
+    ledPercent (sum) ;
+    if (++bPtr > S_SIZE)
+      bPtr = 0 ;
+  }
+
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/Makefile b/modules/catkin_ws/src/wiringPi/examples/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..c9967dc4bf0c5be1c488888b34b7ba1803fd7914
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/Makefile
@@ -0,0 +1,168 @@
+#
+# Makefile:
+#	wiringPi - Wiring Compatable library for the Raspberry Pi
+#	https://projects.drogon.net/wiring-pi
+#
+#	Copyright (c) 2012 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	Wiring Compatable library for the Raspberry Pi
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+
+#DEBUG	= -g -O0
+DEBUG	= -O3
+CC	= gcc
+INCLUDE	= -I/usr/local/include
+CFLAGS	= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
+
+LDFLAGS	= -L/usr/local/lib
+LDLIBS    = -lwiringPi -lwiringPiDev -lpthread -lm
+
+# Should not alter anything below this line
+###############################################################################
+
+SRC	=	blink.c blink8.c blink12.c					\
+		blink12drcs.c							\
+		pwm.c								\
+		speed.c wfi.c isr.c isr-osc.c					\
+		lcd.c lcd-adafruit.c clock.c					\
+		nes.c								\
+		softPwm.c softTone.c 						\
+		delayTest.c serialRead.c serialTest.c okLed.c ds1302.c		\
+		lowPower.c							\
+		rht03.c piglow.c
+
+OBJ	=	$(SRC:.c=.o)
+
+BINS	=	$(SRC:.c=)
+
+all:	
+	@cat README.TXT
+	@echo "    $(BINS)" | fmt
+	@echo ""
+
+really-all:	$(BINS)
+
+blink:	blink.o
+	@echo [link]
+	@$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS)
+
+blink8:	blink8.o
+	@echo [link]
+	@$(CC) -o $@ blink8.o $(LDFLAGS) $(LDLIBS)
+
+blink12drcs:	blink12drcs.o
+	@echo [link]
+	@$(CC) -o $@ blink12drcs.o $(LDFLAGS) $(LDLIBS)
+
+blink12:	blink12.o
+	@echo [link]
+	@$(CC) -o $@ blink12.o $(LDFLAGS) $(LDLIBS)
+
+speed:	speed.o
+	@echo [link]
+	@$(CC) -o $@ speed.o $(LDFLAGS) $(LDLIBS)
+
+lcd:	lcd.o
+	@echo [link]
+	@$(CC) -o $@ lcd.o $(LDFLAGS) $(LDLIBS)
+
+lcd-adafruit:	lcd-adafruit.o
+	@echo [link]
+	@$(CC) -o $@ lcd-adafruit.o $(LDFLAGS) $(LDLIBS)
+
+clock:	clock.o
+	@echo [link]
+	@$(CC) -o $@ clock.o $(LDFLAGS) $(LDLIBS)
+
+wfi:	wfi.o
+	@echo [link]
+	@$(CC) -o $@ wfi.o $(LDFLAGS) $(LDLIBS)
+
+isr:	isr.o
+	@echo [link]
+	@$(CC) -o $@ isr.o $(LDFLAGS) $(LDLIBS)
+
+isr-osc:	isr-osc.o
+	@echo [link]
+	@$(CC) -o $@ isr-osc.o $(LDFLAGS) $(LDLIBS)
+
+nes:	nes.o
+	@echo [link]
+	@$(CC) -o $@ nes.o $(LDFLAGS) $(LDLIBS) 
+
+rht03:	rht03.o
+	@echo [link]
+	@$(CC) -o $@ rht03.o $(LDFLAGS) $(LDLIBS) 
+
+pwm:	pwm.o
+	@echo [link]
+	@$(CC) -o $@ pwm.o $(LDFLAGS) $(LDLIBS)
+
+softPwm:	softPwm.o
+	@echo [link]
+	@$(CC) -o $@ softPwm.o $(LDFLAGS) $(LDLIBS)
+
+softTone:	softTone.o
+	@echo [link]
+	@$(CC) -o $@ softTone.o $(LDFLAGS) $(LDLIBS)
+
+delayTest:	delayTest.o
+	@echo [link]
+	@$(CC) -o $@ delayTest.o $(LDFLAGS) $(LDLIBS)
+
+serialRead:	serialRead.o
+	@echo [link]
+	@$(CC) -o $@ serialRead.o $(LDFLAGS) $(LDLIBS)
+
+serialTest:	serialTest.o
+	@echo [link]
+	@$(CC) -o $@ serialTest.o $(LDFLAGS) $(LDLIBS)
+
+okLed:	okLed.o
+	@echo [link]
+	@$(CC) -o $@ okLed.o $(LDFLAGS) $(LDLIBS)
+
+tone:	tone.o
+	@echo [link]
+	@$(CC) -o $@ tone.o $(LDFLAGS) $(LDLIBS)
+
+ds1302:	ds1302.o
+	@echo [link]
+	@$(CC) -o $@ ds1302.o $(LDFLAGS) $(LDLIBS)
+
+piglow:	piglow.o
+	@echo [link]
+	@$(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS)
+
+
+.c.o:
+	@echo [CC] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+clean:
+	@echo "[Clean]"
+	@rm -f $(OBJ) *~ core tags $(BINS)
+
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+depend:
+	makedepend -Y $(SRC)
+
+# DO NOT DELETE
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/Makefile b/modules/catkin_ws/src/wiringPi/examples/PiFace/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..0bde334ffdb7974d0c23f54509d63836a69f15ec
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/Makefile
@@ -0,0 +1,85 @@
+#
+# Makefile:
+#	wiringPi - Wiring Compatable library for the Raspberry Pi
+#	https://projects.drogon.net/wiring-pi
+#
+#	Copyright (c) 2012 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	Wiring Compatable library for the Raspberry Pi
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+
+#DEBUG	= -g -O0
+DEBUG	= -O3
+CC	= gcc
+INCLUDE	= -I/usr/local/include
+CFLAGS	= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
+
+LDFLAGS	= -L/usr/local/lib
+LDLIBS    = -lwiringPi -lwiringPiDev -lpthread -lm
+
+# Should not alter anything below this line
+###############################################################################
+
+SRC	=	blink.c buttons.c reaction.c ladder.c metro.c motor.c
+
+OBJ	=	$(SRC:.c=.o)
+
+BINS	=	$(SRC:.c=)
+
+all:	$(BINS)
+
+blink:	blink.o
+	@echo [link]
+	@$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS)
+
+buttons:	buttons.o
+	@echo [link]
+	@$(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS)
+
+reaction:	reaction.o
+	@echo [link]
+	@$(CC) -o $@ reaction.o $(LDFLAGS) $(LDLIBS)
+
+ladder:	ladder.o
+	@echo [link]
+	@$(CC) -o $@ ladder.o $(LDFLAGS) $(LDLIBS)
+
+metro:	metro.o
+	@echo [link]
+	@$(CC) -o $@ metro.o $(LDFLAGS) $(LDLIBS)
+
+motor:	motor.o
+	@echo [link]
+	@$(CC) -o $@ motor.o $(LDFLAGS) $(LDLIBS)
+
+.c.o:
+	@echo [CC] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+clean:
+	@echo "[Clean]"
+	@rm -f $(OBJ) *~ core tags $(BINS)
+
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+depend:
+	makedepend -Y $(SRC)
+
+# DO NOT DELETE
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/blink.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/blink.c
new file mode 100644
index 0000000000000000000000000000000000000000..ffb8a2e34535a2ae1ecdc45a5e3779b1490f71d8
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/blink.c
@@ -0,0 +1,59 @@
+/*
+ * blink.c:
+ *	Simple "blink" test for the PiFace interface board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+
+#include <wiringPi.h>
+#include <piFace.h>
+
+// Use 200 as the pin-base for the PiFace board, and pick a pin
+//	for the LED that's not connected to a relay
+
+#define	PIFACE	200
+#define	LED	(PIFACE+2)
+
+int main (int argc, char *argv [])
+{
+  printf ("Raspberry Pi PiFace Blink\n") ;
+  printf ("=========================\n") ;
+
+// Always initialise wiringPi. Use wiringPiSys() if you don't need
+//	(or want) to run as root
+
+  wiringPiSetupSys () ;
+
+// Setup the PiFace board
+
+  piFaceSetup (PIFACE) ;
+
+  for (;;)
+  {
+    digitalWrite (LED, HIGH) ;	// On
+    delay (500) ;		// mS
+    digitalWrite (LED, LOW) ;	// Off
+    delay (500) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/buttons.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/buttons.c
new file mode 100644
index 0000000000000000000000000000000000000000..147a4bdbfcd01f86c77414897b0bb6ad71f59d14
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/buttons.c
@@ -0,0 +1,103 @@
+/*
+ * buttons.c:
+ *	Simple test for the PiFace interface board.
+ *
+ *	Read the buttons and output the same to the LEDs
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+
+#include <wiringPi.h>
+#include <piFace.h>
+
+int outputs [4] = { 0,0,0,0 } ;
+
+// Use 200 as the pin-base for the PiFace board
+
+#define	PIFACE_BASE	200
+
+
+/*
+ * scanButton:
+ *	Read the guiven button - if it's pressed, then flip the state
+ *	of the correspoinding output pin
+ *********************************************************************************
+ */
+
+void scanButton (int button)
+{
+  if (digitalRead (PIFACE_BASE + button) == LOW)
+  {
+    outputs [button] ^= 1 ;
+    digitalWrite (PIFACE_BASE + button, outputs [button]) ;
+    printf ("Button %d pushed - output now: %s\n",
+		button, (outputs [button] == 0) ? "Off" : "On") ;
+  }
+
+  while (digitalRead (PIFACE_BASE + button) == LOW)
+    delay (1) ;
+}
+
+
+/*
+ * start here
+ *********************************************************************************
+ */
+
+int main (void)
+{
+  int pin, button ;
+
+  printf ("Raspberry Pi wiringPi + PiFace test program\n") ;
+  printf ("===========================================\n") ;
+  printf ("\n") ;
+  printf (
+"This program reads the buttons and uses them to toggle the first 4\n"
+"outputs. Push a button once to turn an output on, and push it again to\n"
+"turn it off again.\n\n") ;
+
+// Always initialise wiringPi. Use wiringPiSys() if you don't need
+//	(or want) to run as root
+
+  wiringPiSetupSys () ;
+
+  piFaceSetup (PIFACE_BASE) ;
+
+// Enable internal pull-ups & start with all off
+
+  for (pin = 0 ; pin < 8 ; ++pin)
+  {
+    pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ;
+    digitalWrite    (PIFACE_BASE + pin, 0) ;
+  }
+
+// Loop, scanning the buttons
+
+  for (;;)
+  {
+    for (button = 0 ; button < 4 ; ++button)
+      scanButton (button) ;
+    delay (5) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/ladder.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/ladder.c
new file mode 100755
index 0000000000000000000000000000000000000000..4f08a6f55a57025eaea7280d2a32117578ac5ab5
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/ladder.c
@@ -0,0 +1,337 @@
+/*
+ * ladder.c:
+ *
+ *	Gordon Henderson, June 2012
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <math.h>
+
+#include <wiringPi.h>
+#include <piFace.h>
+
+#ifndef	TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+#undef	DEBUG
+
+#define	NUM_LEDS	 8
+
+
+// Map the LEDs to the hardware pins
+//	using PiFace pin numbers here
+
+#define	PIFACE	200
+
+const int ledMap [NUM_LEDS] =
+{
+//  0, 1, 2, 3, 4, 5, 6, 7, 8
+    200, 201, 202, 203, 204, 205, 206, 207
+} ;
+
+
+// Some constants for our circuit simulation
+
+const double vBatt      =      9.0 ;	// Volts (ie. a PP3)
+const double capacitor  =      0.001 ;	// 1000uF
+const double rCharge    =   2200.0 ;	// ohms
+const double rDischarge =  68000.0 ;	// ohms
+const double timeInc    =      0.01 ;	// Seconds
+
+double vCharge, vCap, vCapLast ;
+
+
+
+/*
+ * setup:
+ *	Program the GPIO correctly and initialise the lamps
+ ***********************************************************************
+ */
+
+void setup (void)
+{
+  int i ;
+
+  wiringPiSetupSys () ;
+
+  if (piFaceSetup (200) == -1)
+    exit (1) ;
+
+// Enable internal pull-ups
+
+  for (i = 0 ; i < 8 ; ++i)
+    pullUpDnControl (PIFACE + i, PUD_UP) ;
+
+// Calculate the actual charging voltage - standard calculation of
+//	vCharge = r2 / (r1 + r2) * vBatt
+//
+//
+//   -----+--- vBatt
+//        |
+//        R1
+//        |
+//        +---+---- vCharge
+//        |   |
+//        R2  C
+//        |   |
+//   -----+---+-----
+
+  vCharge = rDischarge / (rCharge + rDischarge) * vBatt ;
+
+// Start with no charge
+
+  vCap    = vCapLast = 0.0 ;
+}
+
+
+/*
+ * introLeds
+ *	Put a little pattern on the LEDs to start with
+ *********************************************************************************
+ */
+
+void introLeds (void)
+{
+  int i, j ;
+
+
+  printf ("Pi Ladder\n") ;
+  printf ("=========\n\n") ;
+  printf ("       vBatt: %6.2f volts\n", vBatt) ;
+  printf ("     rCharge: %6.0f ohms\n", rCharge) ;
+  printf ("  rDischarge: %6.0f ohms\n", rDischarge) ;
+  printf ("     vCharge: %6.2f volts\n", vCharge) ;
+  printf ("   capacitor: %6.0f uF\n", capacitor * 1000.0) ;
+
+// Flash 3 times:
+
+  for (j = 0 ; j < 3 ; ++j)
+  {
+    for (i = 0 ; i < NUM_LEDS ; ++i)
+      digitalWrite (ledMap [i], 1) ;
+    delay (500) ;
+    for (i = 0 ; i < NUM_LEDS ; ++i)
+      digitalWrite (ledMap [i], 0) ;
+    delay (100) ;
+  }
+
+// All On
+
+  for (i = 0 ; i < NUM_LEDS ; ++i)
+    digitalWrite (ledMap [i], 1) ;
+  delay (500) ;
+
+// Countdown...
+
+  for (i = NUM_LEDS - 1 ; i >= 0 ; --i)
+  {
+    digitalWrite (ledMap [i], 0) ;
+    delay (100) ;
+  }
+  delay (500) ;
+}
+
+
+/*
+ * winningLeds
+ *	Put a little pattern on the LEDs to start with
+ *********************************************************************************
+ */
+
+void winningLeds (void)
+{
+  int i, j ;
+
+// Flash 3 times:
+
+  for (j = 0 ; j < 3 ; ++j)
+  {
+    for (i = 0 ; i < NUM_LEDS ; ++i)
+      digitalWrite (ledMap [i], 1) ;
+    delay (500) ;
+    for (i = 0 ; i < NUM_LEDS ; ++i)
+      digitalWrite (ledMap [i], 0) ;
+    delay (100) ;
+  }
+
+// All On
+
+  for (i = 0 ; i < NUM_LEDS ; ++i)
+    digitalWrite (ledMap [i], 1) ;
+  delay (500) ;
+
+// Countup...
+
+  for (i = 0 ; i < NUM_LEDS ; ++i)
+  {
+    digitalWrite (ledMap [i], 0) ;
+    delay (100) ;
+  }
+  delay (500) ;
+}
+
+
+/*
+ * chargeCapacitor: dischargeCapacitor:
+ *	Add or remove charge to the capacitor.
+ *	Standard capacitor formulae.
+ *********************************************************************************
+ */
+
+void chargeCapacitor (void)
+{
+  vCap = (vCapLast - vCharge) *
+	exp (- timeInc / (rCharge * capacitor)) + vCharge ;
+
+#ifdef	DEBUG
+  printf ("+vCap: %7.4f\n", vCap) ;
+#endif
+
+  vCapLast = vCap ;
+}
+
+void dischargeCapacitor (void)
+{
+  vCap = vCapLast *
+	exp (- timeInc / (rDischarge * capacitor)) ;
+
+#ifdef	DEBUG
+  printf ("-vCap: %7.4f\n", vCap) ;
+#endif
+
+  vCapLast = vCap ;
+}
+
+
+/*
+ * ledBargraph:
+ *	Output the supplied number as a bargraph on the LEDs
+ *********************************************************************************
+ */
+
+void ledBargraph (double value, int topLedOn)
+{
+  int topLed = (int)floor (value / vCharge * (double)NUM_LEDS) + 1 ;
+  int i ;
+
+  if (topLed > NUM_LEDS)
+    topLed = NUM_LEDS ;
+
+  if (!topLedOn)
+    --topLed ;
+
+  for (i = 0 ; i < topLed ; ++i)
+    digitalWrite (ledMap [i], 1) ;
+
+  for (i = topLed ; i < NUM_LEDS ; ++i)
+    digitalWrite (ledMap [i], 0) ;
+}
+
+
+/*
+ * ledOnAction:
+ *	Make sure the leading LED is on and check the button
+ *********************************************************************************
+ */
+
+void ledOnAction (void)
+{
+  if (digitalRead (PIFACE) == LOW)
+  {
+    chargeCapacitor () ;
+    ledBargraph (vCap, TRUE) ;
+  }
+}
+
+
+/*
+ * ledOffAction:
+ *	Make sure the leading LED is off and check the button
+ *********************************************************************************
+ */
+
+void ledOffAction (void)
+{
+  dischargeCapacitor () ;
+
+// Are we still pushing the button?
+
+  if (digitalRead (PIFACE) == LOW)
+  {
+    vCap = vCapLast = 0.0 ;
+    ledBargraph (vCap, FALSE) ;
+
+// Wait until we release the button
+
+    while (digitalRead (PIFACE) == LOW)
+      delay (10) ;
+  }
+}
+
+
+/*
+ ***********************************************************************
+ * The main program
+ ***********************************************************************
+ */
+
+int main (void)
+{
+  unsigned int then, ledOnTime, ledOffTime ;
+  unsigned int ourDelay = (int)(1000.0 * timeInc) ;
+  
+  setup     () ;
+  introLeds () ;
+
+// Setup the LED times - TODO reduce the ON time as the game progresses
+
+  ledOnTime  = 1000 ;
+  ledOffTime = 1000 ;
+
+// This is our Gate/Squarewave loop
+
+  for (;;)
+  {
+
+// LED ON:
+
+    (void)ledBargraph (vCap, TRUE) ;
+    then = millis () + ledOnTime ;
+    while (millis () < then)
+    {
+      ledOnAction () ;
+      delay       (ourDelay) ;
+    }
+
+// Have we won yet?
+//	We need vCap to be in the top NUM_LEDS of the vCharge
+
+    if (vCap > ((double)(NUM_LEDS - 1) / (double)NUM_LEDS * vCharge))	// Woo hoo!
+    {
+      winningLeds () ;
+      while (digitalRead (PIFACE) == HIGH)
+	delay (10) ;
+      while (digitalRead (PIFACE) == LOW)
+	delay (10) ;
+      vCap = vCapLast = 0.0 ;
+    }
+
+// LED OFF:
+
+    (void)ledBargraph (vCap, FALSE) ;
+    then = millis () + ledOffTime ;
+    while (millis () < then)
+    {
+      ledOffAction () ;
+      delay        (ourDelay) ;
+    }
+
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/metro.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/metro.c
new file mode 100644
index 0000000000000000000000000000000000000000..a4a8c1d011d7d378f079d2867d37e6ddb3da53dc
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/metro.c
@@ -0,0 +1,111 @@
+/*
+ * metronome.c:
+ *	Simple test for the PiFace interface board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <wiringPi.h>
+#include <piFace.h>
+
+#define	PIFACE	200
+
+/*
+ * middleA:
+ *	Play middle A (on the relays - yea!)
+ *********************************************************************************
+ */
+
+static void middleA (void)
+{
+  unsigned int next ;
+
+  for (;;)
+  {
+    next = micros () + 1136 ;
+    digitalWrite (PIFACE + 0, 0)  ;
+    digitalWrite (PIFACE + 1, 0)  ;
+    while (micros () < next)
+      delayMicroseconds (1) ;
+    
+    next = micros () + 1137 ;
+    digitalWrite (PIFACE + 0, 1)  ;
+    digitalWrite (PIFACE + 1, 1)  ;
+    while (micros () < next)
+      delayMicroseconds (1) ;
+    
+  }
+}
+
+
+int main (int argc, char *argv [])
+{
+  int bpm, msPerBeat, state = 0 ;
+  unsigned int end ;
+
+  printf ("Raspberry Pi PiFace Metronome\n") ;
+  printf ("=============================\n") ;
+
+  piHiPri (50) ;
+
+  wiringPiSetupSys () ;	// Needed for timing functions
+  piFaceSetup      (PIFACE) ;
+
+  if (argc != 2)
+  {
+    printf ("Usage: %s <beates per minute>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  if (strcmp (argv [1], "a") == 0)
+    middleA () ;
+
+  bpm = atoi (argv [1]) ;
+
+  if ((bpm < 40) || (bpm > 208))
+  {
+    printf ("%s range is 40 through 208 beats per minute\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  msPerBeat = 60000 / bpm  ;
+
+// Main loop:
+//	Put some random LED pairs up for a few seconds, then blank ...
+
+  for (;;)
+  {
+    end = millis ()  + msPerBeat ;
+
+    digitalWrite (PIFACE + 0, state)  ;
+    digitalWrite (PIFACE + 1, state)  ;
+
+    while (millis () < end)
+      delayMicroseconds (500) ;
+
+    state ^= 1 ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/motor.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/motor.c
new file mode 100644
index 0000000000000000000000000000000000000000..14f55397e992fbbd8b5d7d18cf694e10645702f3
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/motor.c
@@ -0,0 +1,120 @@
+/*
+ * motor.c:
+ *	Use the PiFace board to demonstrate an H bridge
+ *	circuit via the 2 relays.
+ *	Then add on an external transsitor to help with PWM.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <piFace.h>
+#include <softPwm.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+int outputs [2] = { 0,0 } ;
+
+#define	PIFACE_BASE	200
+#define PWM_OUT_PIN	204
+#define	PWM_UP		202
+#define	PWM_DOWN	203
+
+void scanButton (int button)
+{
+  if (digitalRead (PIFACE_BASE + button) == LOW)
+  {
+    outputs [button] ^= 1 ;
+    digitalWrite (PIFACE_BASE + button, outputs [button]) ;
+    printf ("Button %d pushed - output now: %s\n",
+		button, (outputs [button] == 0) ? "Off" : "On") ;
+  }
+
+  while (digitalRead (PIFACE_BASE + button) == LOW)
+    delay (1) ;
+}
+
+
+int main (void)
+{
+  int pin, button ;
+  int pwmValue = 0 ;
+
+  printf ("Raspberry Pi PiFace - Motor control\n") ;
+  printf ("==================================\n") ;
+  printf ("\n") ;
+  printf (
+"This program is designed to be used with a motor connected to the relays\n"
+"in an H-Bridge type configuration with optional speeed control via PWM.\n"
+"\n"
+"Use the leftmost buttons to turn each relay on and off, and the rigthmost\n"
+"buttons to increase ot decrease the PWM output on the control pin (pin\n"
+"4)\n\n") ;
+
+  wiringPiSetup () ;
+  piFaceSetup (PIFACE_BASE) ;
+  softPwmCreate (PWM_OUT_PIN, 100, 100) ;
+
+// Enable internal pull-ups & start with all off
+
+  for (pin = 0 ; pin < 8 ; ++pin)
+  {
+    pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ;
+    digitalWrite    (PIFACE_BASE + pin, 0) ;
+  }
+
+  for (;;)
+  {
+    for (button = 0 ; button < 2 ; ++button)
+      scanButton (button) ;
+
+    if (digitalRead (PWM_UP) == LOW)
+    {
+      pwmValue += 10 ;
+      if (pwmValue > 100)
+	pwmValue = 100 ;
+
+      softPwmWrite (PWM_OUT_PIN, pwmValue) ;
+      printf ("PWM -> %3d\n", pwmValue) ;
+
+      while (digitalRead (PWM_UP) == LOW)
+	delay (5) ;
+    }
+
+    if (digitalRead (PWM_DOWN) == LOW)
+    {
+      pwmValue -= 10 ;
+      if (pwmValue < 0)
+	pwmValue = 0 ;
+
+      softPwmWrite (PWM_OUT_PIN, pwmValue) ;
+      printf ("PWM -> %3d\n", pwmValue) ;
+
+      while (digitalRead (PWM_DOWN) == LOW)
+	delay (5) ;
+    }
+
+    delay (5) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiFace/reaction.c b/modules/catkin_ws/src/wiringPi/examples/PiFace/reaction.c
new file mode 100644
index 0000000000000000000000000000000000000000..508450801c0b8454ab0854b09e45ac52175f2f98
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiFace/reaction.c
@@ -0,0 +1,194 @@
+/*
+ * reaction.c:
+ *	Simple test for the PiFace interface board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include <wiringPi.h>
+#include <piFace.h>
+
+
+int outputs [4] = { 0,0,0,0 } ;
+
+#define	PIFACE	200
+
+/*
+ * light:
+ *	Light up the given LED - actually lights up a pair
+ *********************************************************************************
+ */
+
+void light (int led, int value)
+{
+  led *= 2 ;
+  digitalWrite (PIFACE + led + 0, value) ;
+  digitalWrite (PIFACE + led + 1, value) ;
+}
+
+/*
+ * lightAll:
+ *	All On or Off
+ *********************************************************************************
+ */
+
+void lightAll (int onoff)
+{
+  light (0, onoff) ;
+  light (1, onoff) ;
+  light (2, onoff) ;
+  light (3, onoff) ;
+}
+
+
+/*
+ * waitForNoButtons:
+ *	Wait for all buttons to be released
+ *********************************************************************************
+ */
+
+void waitForNoButtons (void)
+{
+  int i, button ;
+
+  for (;;)
+  {
+    button = 0 ;
+    for (i = 0 ; i < 4 ; ++i)
+      button += digitalRead (PIFACE + i) ;
+
+    if (button == 4)
+      break ;
+  }
+}
+
+
+void scanButton (int button)
+{
+  if (digitalRead (PIFACE + button) == LOW)
+  {
+    outputs [button] ^= 1 ;
+    digitalWrite (PIFACE + button, outputs [button]) ;
+  }
+
+  while (digitalRead (PIFACE + button) == LOW)
+    delay (1) ;
+}
+
+
+int main (void)
+{
+  int i, j ;
+  int led, button ;
+  unsigned int start, stop ;
+
+  printf ("Raspberry Pi PiFace Reaction Timer\n") ;
+  printf ("==================================\n") ;
+
+  if (piFaceSetup (PIFACE) == -1)
+    exit (1) ;
+
+// Enable internal pull-ups
+
+  for (i = 0 ; i < 8 ; ++i)
+    pullUpDnControl (PIFACE + i, PUD_UP) ;
+
+
+// Main game loop:
+//	Put some random LED pairs up for a few seconds, then blank ...
+
+  for (;;)
+  {
+    printf ("Press any button to start ... \n") ; fflush (stdout) ;
+
+    for (;;)
+    {
+      led = rand () % 4 ;
+      light (led, 1) ;
+      delay (10) ;
+      light (led, 0) ;
+
+      button = 0 ;
+      for (j = 0 ; j < 4 ; ++j)
+	button += digitalRead (PIFACE + j) ;
+
+      if (button != 4)
+	break ;
+    }
+
+    waitForNoButtons () ;
+
+    printf ("Wait for it ... ") ; fflush (stdout) ;
+
+    led = rand () % 4 ;
+    delay (rand () % 500 + 1000) ;
+    light (led, 1) ;
+
+    start = millis () ;
+    for (button = -1 ; button == -1 ; )
+    {
+      for (j = 0 ; j < 4 ; ++j)
+	if (digitalRead (PIFACE + j) == 0)	// Pushed
+	{
+	  button = j ;
+	  break ;
+	}
+    }
+    stop = millis () ;
+    button = 3 - button ; // Correct for the buttons/LEDs reversed
+
+    light (led, 0) ;
+
+    waitForNoButtons () ;
+
+    light (led, 1) ;
+
+    if (button == led)
+    {
+      printf ("You got it in %3d mS\n", stop - start) ;
+    }
+    else
+    {
+      printf ("Missed: You pushed %d - LED was %d\n", button, led) ;
+      for (;;)
+      {
+	light (button, 1) ;
+	delay (100) ;
+	light (button, 0) ;
+	delay (100) ;
+	i = 0 ;
+	for (j = 0 ; j < 4 ; ++j)
+	  i += digitalRead (PIFACE + j) ;
+	if (i != 4)
+	  break ;
+      }
+
+      waitForNoButtons () ;
+    }
+    light (led, 0) ;
+    delay (4000) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/Makefile b/modules/catkin_ws/src/wiringPi/examples/PiGlow/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..8d31141a08944cea35c14e1614e7c1edb416fd56
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/Makefile
@@ -0,0 +1,79 @@
+#
+# Makefile:
+#	wiringPi - Wiring Compatable library for the Raspberry Pi
+#	https://projects.drogon.net/wiring-pi
+#
+#	Copyright (c) 2012-2013 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	Wiring Compatable library for the Raspberry Pi
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+
+#DEBUG	= -g -O0
+DEBUG	= -O3
+CC	= gcc
+INCLUDE	= -I/usr/local/include
+CFLAGS	= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
+
+LDFLAGS	= -L/usr/local/lib
+LDLIBS    = -lwiringPi -lwiringPiDev -lpthread -lm
+
+# Should not alter anything below this line
+###############################################################################
+
+SRC	=	piGlow0.c piGlow1.c piglow.c
+
+OBJ	=	$(SRC:.c=.o)
+
+BINS	=	$(SRC:.c=)
+
+all:	$(BINS)
+
+piGlow0:	piGlow0.o
+	@echo [link]
+	@$(CC) -o $@ piGlow0.o $(LDFLAGS) $(LDLIBS)
+
+piGlow1:	piGlow1.o
+	@echo [link]
+	@$(CC) -o $@ piGlow1.o $(LDFLAGS) $(LDLIBS)
+
+piglow:	piglow.o
+	@echo [link]
+	@$(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS)
+
+.c.o:
+	@echo [CC] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+clean:
+	@echo "[Clean]"
+	@rm -f $(OBJ) *~ core tags $(BINS)
+
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+install:	piglow
+	@echo Installing piglow into /usr/local/bin
+	@cp -a piglow /usr/local/bin/piglow
+	@chmod 755 /usr/local/bin/piglow
+	@echo Done. Remember to load the I2C drivers!
+
+depend:
+	makedepend -Y $(SRC)
+
+# DO NOT DELETE
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow0.c b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow0.c
new file mode 100644
index 0000000000000000000000000000000000000000..d3fe4b9697c6fb131b7c50de34d6f4b0ce2e915c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow0.c
@@ -0,0 +1,51 @@
+/*
+ * piglow.c:
+ *	Very simple demonstration of the PiGlow board.
+ *	This uses the SN3218 directly - soon there will be a new PiGlow
+ *	devLib device which will handle the PiGlow board on a more easy
+ *	to use manner...
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <sn3218.h>
+
+#define	LED_BASE	533
+
+int main (void)
+{
+  int i, j ;
+
+  wiringPiSetupSys () ;
+
+  sn3218Setup (LED_BASE) ;
+
+  for (;;)
+  {
+    for (i = 0 ; i < 256 ; ++i)
+      for (j = 0 ; j < 18 ; ++j)
+	analogWrite (LED_BASE + j, i) ;
+
+    for (i = 255 ; i >= 0 ; --i)
+      for (j = 0 ; j < 18 ; ++j)
+	analogWrite (LED_BASE + j, i) ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow1.c b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow1.c
new file mode 100644
index 0000000000000000000000000000000000000000..a00b31e30f3fbb98bb1e55d5dee6d68674cef6b9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piGlow1.c
@@ -0,0 +1,258 @@
+/*
+ * piGlow1.c:
+ *	Very simple demonstration of the PiGlow board.
+ *	This uses the piGlow devLib.
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <poll.h>
+
+#include <wiringPi.h>
+#include <piGlow.h>
+
+#define	PIGLOW_BASE	533
+
+#ifndef	TRUE
+#  define TRUE  (1==1)
+#  define FALSE (!TRUE)
+#endif
+
+
+/*
+ * keypressed: clearKeypressed:
+ *	Simple but effective ways to tell if the enter key has been pressed
+ *********************************************************************************
+ */
+
+static int keypressed (void)
+{
+  struct pollfd polls ;
+
+  polls.fd     = fileno (stdin) ;
+  polls.events = POLLIN ;
+
+  return poll (&polls, 1, 0) != 0 ;
+}
+
+static void clearKeypressed (void)
+{
+  while (keypressed ())
+    (void)getchar () ;
+}
+
+
+/*
+ * pulseLed:
+ *	Pulses the LED at position leg, ring from off to a max. value,
+ *	then off again
+ *********************************************************************************
+ */
+
+static void pulseLed (int leg, int ring)
+{
+  int i ;
+
+  for (i = 0 ; i < 140 ; ++i)
+  {
+    piGlow1 (leg, ring, i) ;
+    delay (1) ;
+  }
+  delay (10) ;
+  for (i = 140 ; i >= 0 ; --i)
+  {
+    piGlow1 (leg, ring, i) ;
+    delay (1) ;
+  }
+}
+
+/*
+ * pulseLeg:
+ *	Same as above, but a whole leg at a time
+ *********************************************************************************
+ */
+
+static void pulseLeg (int leg)
+{
+  int i ;
+
+  for (i = 0 ; i < 140 ; ++i)
+  {
+    piGlowLeg (leg, i) ; delay (1) ;
+  }
+  delay (10) ;
+  for (i = 140 ; i >= 0 ; --i)
+  {
+    piGlowLeg (leg, i) ; delay (1) ;
+  }
+}
+
+
+/*
+ * pulse Ring:
+ *	Same as above, but a whole ring at a time
+ *********************************************************************************
+ */
+
+static void pulseRing (int ring)
+{
+  int i ;
+
+  for (i = 0 ; i < 140 ; ++i)
+  {
+    piGlowRing (ring, i) ; delay (1) ;
+  }
+  delay (10) ;
+  for (i = 140 ; i >= 0 ; --i)
+  {
+    piGlowRing (ring, i) ; delay (1) ;
+  }
+}
+
+#define	LEG_STEPS	3
+
+static int legSequence [] =
+{
+   4, 12, 99,
+  99,  4, 12, 
+  12, 99,  4,
+} ;
+  
+
+#define	RING_STEPS	16
+
+static int ringSequence [] =
+{
+   0,  0,  0,  0,  0, 64,
+   0,  0,  0,  0, 64, 64,
+   0,  0,  0, 64, 64,  0,
+   0,  0, 64, 64,  0,  0,
+   0, 64, 64,  0,  0,  0,
+  64, 64,  0,  0,  0,  0,
+  64,  0,  0,  0,  0,  0,
+   0,  0,  0,  0,  0,  0,
+  64,  0,  0,  0,  0,  0,
+  64, 64,  0,  0,  0,  0,
+   0, 64, 64,  0,  0,  0,
+   0,  0, 64, 64,  0,  0,
+   0,  0,  0, 64, 64,  0,
+   0,  0,  0,  0, 64, 64,
+   0,  0,  0,  0,  0, 64,
+   0,  0,  0,  0,  0,  0,
+} ;
+
+/*
+ * main:
+ *	Our little demo prgoram
+ *********************************************************************************
+ */
+
+int main (void)
+{
+  int i ;
+  int step, ring, leg ;
+
+// Always initialise wiringPi:
+//	Use the Sys method if you don't need to run as root
+
+  wiringPiSetupSys () ;
+
+// Initialise the piGlow devLib with our chosen pin base
+
+  piGlowSetup (1) ;
+
+// LEDs, one at a time
+
+  printf ("LEDs, one at a time\n") ;
+  for (; !keypressed () ;)
+    for (leg = 0 ; leg < 3 ; ++leg)
+    {
+      for (ring = 0 ; ring < 6 ; ++ring)
+      {
+	pulseLed (leg, ring) ;
+	if (keypressed ())
+	  break ;
+      }
+      if (keypressed ())
+	break ;
+    }
+  clearKeypressed () ;
+
+// Rings, one at a time
+
+  printf ("Rings, one at a time\n") ;
+  for (; !keypressed () ;)
+    for (ring = 0 ; ring < 6 ; ++ring)
+    {
+      pulseRing (ring) ;
+      if (keypressed ())
+	break ;
+    }
+  clearKeypressed () ;
+
+// Legs, one at a time
+
+  printf ("Legs, one at a time\n") ;
+  for (; !keypressed () ;)
+    for (leg = 0 ; leg < 3 ; ++leg)
+    {
+      pulseLeg (leg) ;
+      if (keypressed ())
+	break ;
+    }
+  clearKeypressed () ;
+
+  delay (1000) ;
+
+// Sequence - alternating rings, legs and random
+
+  printf ("Sequence now\n") ;
+  for (; !keypressed () ;)
+  {
+    for (i = 0 ; i < 20 ; ++i)
+      for (step = 0 ; step < LEG_STEPS ; ++step)
+      {
+	for (leg = 0 ; leg < 3 ; ++leg)
+	  piGlowLeg (leg, legSequence [step * 3 + leg]) ;
+	delay (80) ;
+      }
+
+    for (i = 0 ; i < 10 ; ++i)
+      for (step = 0 ; step < RING_STEPS ; ++step)
+      {
+	for (ring = 0 ; ring < 6 ; ++ring)
+	  piGlowRing (ring, ringSequence [step * 6 + ring]) ;
+	delay (80) ;
+      }
+
+    for (i = 0 ; i < 1000 ; ++i)
+    {
+      leg  = random () % 3 ;
+      ring = random () % 6 ;
+      piGlow1 (leg, ring, random () % 256) ;
+      delay (5) ; 
+      piGlow1 (leg, ring, 0) ;
+    }
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/PiGlow/piglow.c b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piglow.c
new file mode 100644
index 0000000000000000000000000000000000000000..e6a2db3671677bfbaea22c1ef01ea51ac90c4a11
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/PiGlow/piglow.c
@@ -0,0 +1,176 @@
+/*
+ * piglow.c:
+ *	Very simple demonstration of the PiGlow board.
+ *	This uses the piGlow devLib.
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifndef	TRUE
+#  define TRUE  (1==1)
+#  define FALSE (!TRUE)
+#endif
+
+#include <wiringPi.h>
+#include <piGlow.h>
+
+static void failUsage (void)
+{
+  fprintf (stderr, "Usage examples:\n") ;
+  fprintf (stderr, "  piglow off         # All off\n") ;
+  fprintf (stderr, "  piglow red 50      # Light the 3 red LEDs to 50%%\n") ;
+  fprintf (stderr, "     colours are: red, yellow, orange, green, blue and white\n") ;
+  fprintf (stderr, "  piglow all 75      # Light all to 75%%\n") ;
+  fprintf (stderr, "  piglow leg 0 25    # Light leg 0 to 25%%\n") ;
+  fprintf (stderr, "  piglow ring 3 100  # Light ring 3 to 100%%\n") ;
+  fprintf (stderr, "  piglow led 2 5 100 # Light the single LED on Leg 2, ring 5 to 100%%\n") ;
+
+  exit (EXIT_FAILURE) ;
+}
+
+static int getPercent (char *typed)
+{
+  int percent ;
+
+  percent = atoi (typed) ;
+  if ((percent < 0) || (percent > 100))
+  {
+    fprintf (stderr, "piglow: percent value out of range\n") ;
+    exit (EXIT_FAILURE) ;
+  }
+  return (percent * 255) / 100 ;
+}
+
+
+/*
+ * main:
+ *	Our little demo prgoram
+ *********************************************************************************
+ */
+
+int main (int argc, char *argv [])
+{
+  int percent ;
+  int ring, leg ;
+
+// Always initialise wiringPi:
+//	Use the Sys method if you don't need to run as root
+
+  wiringPiSetupSys () ;
+
+// Initialise the piGlow devLib
+
+  piGlowSetup (FALSE) ;
+
+  if (argc == 1)
+    failUsage () ;
+
+  if ((argc == 2) && (strcasecmp (argv [1], "off") == 0))
+  {
+    for (leg = 0 ; leg < 3 ; ++leg)
+      piGlowLeg (leg, 0) ;
+    return 0 ;
+  }
+
+  if (argc == 3)
+  {
+    percent = getPercent (argv [2]) ;
+
+    /**/ if (strcasecmp (argv [1], "red") == 0)
+      piGlowRing (PIGLOW_RED, percent) ;
+    else if (strcasecmp (argv [1], "yellow") == 0)
+      piGlowRing (PIGLOW_YELLOW, percent) ;
+    else if (strcasecmp (argv [1], "orange") == 0)
+      piGlowRing (PIGLOW_ORANGE, percent) ;
+    else if (strcasecmp (argv [1], "green") == 0)
+      piGlowRing (PIGLOW_GREEN, percent) ;
+    else if (strcasecmp (argv [1], "blue") == 0)
+      piGlowRing (PIGLOW_BLUE, percent) ;
+    else if (strcasecmp (argv [1], "white") == 0)
+      piGlowRing (PIGLOW_WHITE, percent) ;
+    else if (strcasecmp (argv [1], "all") == 0)
+      for (ring = 0 ; ring < 6 ; ++ring)
+	piGlowRing (ring, percent) ;
+    else
+    {
+      fprintf (stderr, "piglow: invalid colour\n") ;
+      exit (EXIT_FAILURE) ;
+    }
+    return 0 ;
+  }
+
+  if (argc == 4)
+  {
+    /**/ if (strcasecmp (argv [1], "leg") == 0)
+    {
+      leg = atoi (argv [2]) ;
+      if ((leg < 0) || (leg > 2))
+      {
+	fprintf (stderr, "piglow: leg value out of range\n") ;
+	exit (EXIT_FAILURE) ;
+      }
+      percent = getPercent (argv [3]) ;
+      piGlowLeg (leg, percent) ;
+    }
+    else if (strcasecmp (argv [1], "ring") == 0)
+    {
+      ring = atoi (argv [2]) ;
+      if ((ring < 0) || (ring > 5))
+      {
+	fprintf (stderr, "piglow: ring value out of range\n") ;
+	exit (EXIT_FAILURE) ;
+      }
+      percent = getPercent (argv [3]) ;
+      piGlowRing (ring, percent) ;
+    }
+    return 0 ;
+  }
+
+  if (argc == 5)
+  {
+    if (strcasecmp (argv [1], "led") != 0)
+      failUsage () ;
+
+    leg = atoi (argv [2]) ;
+    if ((leg < 0) || (leg > 2))
+    {
+      fprintf (stderr, "piglow: leg value out of range\n") ;
+      exit (EXIT_FAILURE) ;
+    }
+    ring = atoi (argv [3]) ;
+    if ((ring < 0) || (ring > 5))
+    {
+      fprintf (stderr, "piglow: ring value out of range\n") ;
+      exit (EXIT_FAILURE) ;
+    }
+    percent = getPercent (argv [4]) ;
+    piGlow1 (leg, ring, percent) ;
+    return 0 ;
+  }
+
+  failUsage () ;
+  return 0 ; 
+}
+
+
diff --git a/modules/catkin_ws/src/wiringPi/examples/README.TXT b/modules/catkin_ws/src/wiringPi/examples/README.TXT
new file mode 100644
index 0000000000000000000000000000000000000000..33263b1c57ff3667a55f4258b6654a1783f902d0
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/README.TXT
@@ -0,0 +1,18 @@
+
+wiringPi Examples
+=================
+
+There are now too many examples to compile them all in a sensible time,
+and you probably don't want to compile or run them all anyway, so they
+have been separated out.
+
+To compile an individual example, just type
+
+    make exampleName
+
+To really compile everything:
+
+    make really-all
+
+The individual tests are:
+
diff --git a/modules/catkin_ws/src/wiringPi/examples/blink.c b/modules/catkin_ws/src/wiringPi/examples/blink.c
new file mode 100644
index 0000000000000000000000000000000000000000..c27a20e3004f1d3082acbe6cb76dcc48af97acaa
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/blink.c
@@ -0,0 +1,48 @@
+/*
+ * blink.c:
+ *	Standard "blink" program in wiringPi. Blinks an LED connected
+ *	to the first GPIO pin.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+
+// LED Pin - wiringPi pin 0 is BCM_GPIO 17.
+
+#define	LED	0
+
+int main (void)
+{
+  printf ("Raspberry Pi blink\n") ;
+
+  wiringPiSetup () ;
+  pinMode (LED, OUTPUT) ;
+
+  for (;;)
+  {
+    digitalWrite (LED, HIGH) ;	// On
+    delay (500) ;		// mS
+    digitalWrite (LED, LOW) ;	// Off
+    delay (500) ;
+  }
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/blink.rtb b/modules/catkin_ws/src/wiringPi/examples/blink.rtb
new file mode 100644
index 0000000000000000000000000000000000000000..eb7d26c77711abc7436f256f854c6e83b5696c66
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/blink.rtb
@@ -0,0 +1,30 @@
+// blink.rtb:
+//    Blink program in Return to Basic
+//
+// Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+//**********************************************************************
+// This file is part of wiringPi:
+//	https://projects.drogon.net/raspberry-pi/wiringpi/
+//
+//    wiringPi 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 3 of the License, or
+//    (at your option) any later version.
+//
+//    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+//
+PinMode (0, 1) // Output
+CYCLE 
+  DigitalWrite (0, 1) // Pin 0 ON
+  WAIT (0.5) // 0.5 seconds
+  DigitalWrite (0, 0)
+  WAIT (0.5)
+REPEAT 
+END 
diff --git a/modules/catkin_ws/src/wiringPi/examples/blink.sh b/modules/catkin_ws/src/wiringPi/examples/blink.sh
new file mode 100644
index 0000000000000000000000000000000000000000..77553836ec7aa7911fd165efe891f1f26573a4c0
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/blink.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# blink.sh:
+#	Standard "blink" program in wiringPi. Blinks an LED connected
+#	to the first GPIO pin.
+#
+# Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+#######################################################################
+# This file is part of wiringPi:
+#	https://projects.drogon.net/raspberry-pi/wiringpi/
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#######################################################################
+
+# LED Pin - wiringPi pin 0 is BCM_GPIO 17.
+
+PIN=0
+
+gpio mode $PIN out
+
+while true; do
+  gpio write $PIN 1
+  sleep 0.5
+  gpio write $PIN 0
+  sleep 0.5
+done
diff --git a/modules/catkin_ws/src/wiringPi/examples/blink12.c b/modules/catkin_ws/src/wiringPi/examples/blink12.c
new file mode 100644
index 0000000000000000000000000000000000000000..c9b3d506ef285135de119a7ded768511dc1e42ab
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/blink12.c
@@ -0,0 +1,111 @@
+/*
+ * blink12.c:
+ *	Simple sequence over the first 12 GPIO pins - LEDs
+ *	Aimed at the Gertboard, but it's fairly generic.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+
+// Simple sequencer data
+//	Triplets of LED, On/Off and delay
+
+int data [] =
+{
+            0, 1, 1,
+            1, 1, 1,
+  0, 0, 0,  2, 1, 1,
+  1, 0, 0,  3, 1, 1,
+  2, 0, 0,  4, 1, 1,
+  3, 0, 0,  5, 1, 1,
+  4, 0, 0,  6, 1, 1,
+  5, 0, 0,  7, 1, 1,
+  6, 0, 0, 11, 1, 1,
+  7, 0, 0, 10, 1, 1,
+ 11, 0, 0, 13, 1, 1,
+ 10, 0, 0, 12, 1, 1,
+ 13, 0, 1,
+ 12, 0, 1,
+
+  0, 0, 1,	// Extra delay
+
+// Back again
+
+           12, 1, 1,
+           13, 1, 1,
+ 12, 0, 0, 10, 1, 1,
+ 13, 0, 0, 11, 1, 1,
+ 10, 0, 0,  7, 1, 1,
+ 11, 0, 0,  6, 1, 1,
+  7, 0, 0,  5, 1, 1,
+  6, 0, 0,  4, 1, 1,
+  5, 0, 0,  3, 1, 1,
+  4, 0, 0,  2, 1, 1,
+  3, 0, 0,  1, 1, 1,
+  2, 0, 0,  0, 1, 1,
+  1, 0, 1,
+  0, 0, 1,
+
+  0, 0, 1,	// Extra delay
+
+  0, 9, 0,	// End marker
+
+} ;
+
+
+int main (void)
+{
+  int pin ;
+  int dataPtr ;
+  int l, s, d ;
+
+  printf ("Raspberry Pi - 12-LED Sequence\n") ;
+  printf ("==============================\n") ;
+  printf ("\n") ;
+  printf ("Connect LEDs up to the first 8 GPIO pins, then pins 11, 10, 13, 12 in\n") ;
+  printf ("    that order, then sit back and watch the show!\n") ;
+
+  wiringPiSetup () ;
+
+  for (pin = 0 ; pin < 14 ; ++pin)
+    pinMode (pin, OUTPUT) ;
+
+  dataPtr = 0 ;
+
+  for (;;)
+  {
+    l = data [dataPtr++] ;	// LED
+    s = data [dataPtr++] ;	// State
+    d = data [dataPtr++] ;	// Duration (10ths)
+
+    if (s == 9)			// 9 -> End Marker
+    {
+      dataPtr = 0 ;
+      continue ;
+    }
+
+    digitalWrite (l, s) ;
+    delay        (d * 100) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/blink12drcs.c b/modules/catkin_ws/src/wiringPi/examples/blink12drcs.c
new file mode 100644
index 0000000000000000000000000000000000000000..6ee11fd1b915e77b15eae26e076180b18e45e82c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/blink12drcs.c
@@ -0,0 +1,125 @@
+/*
+ * blink12drcs.c:
+ *	Simple sequence over the first 12 GPIO pins - LEDs
+ *	Aimed at the Gertboard, but it's fairly generic.
+ *	This version uses DRC totalk to the ATmega on the Gertboard
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+#include <drcSerial.h>
+
+#define	GERT_BASE	100
+
+static int pinMap [] =
+{
+  0, 1, 2, 3,		// Pi Native
+  GERT_BASE + 2, GERT_BASE + 3, GERT_BASE + 4, GERT_BASE + 5,
+  GERT_BASE + 6, GERT_BASE + 7, GERT_BASE + 8, GERT_BASE + 9,
+} ;
+
+// Simple sequencer data
+//	Triplets of LED, On/Off and delay
+
+
+int data [] =
+{
+               0, 1, 1,
+               1, 1, 1,
+   0, 0, 0,    2, 1, 1,
+   1, 0, 0,    3, 1, 1,
+   2, 0, 0,    4, 1, 1,
+   3, 0, 0,    5, 1, 1,
+   4, 0, 0,    6, 1, 1,
+   5, 0, 0,    7, 1, 1,
+   6, 0, 0,    8, 1, 1,
+   7, 0, 0,    9, 1, 1,
+   8, 0, 0,   10, 1, 1,
+   9, 0, 0,   11, 1, 1,
+  10, 0, 1,
+  11, 0, 1,
+
+  0, 0, 1,	// Extra delay
+
+// Back again
+
+              11, 1, 1,
+              10, 1, 1,
+  11, 0, 0,    9, 1, 1,
+  10, 0, 0,    8, 1, 1,
+   9, 0, 0,    7, 1, 1,
+   8, 0, 0,    6, 1, 1,
+   7, 0, 0,    5, 1, 1,
+   6, 0, 0,    4, 1, 1,
+   5, 0, 0,    3, 1, 1,
+   4, 0, 0,    2, 1, 1,
+   3, 0, 0,    1, 1, 1,
+   2, 0, 0,    0, 1, 1,
+   1, 0, 1,
+   0, 0, 1,
+
+   0, 0, 1,	// Extra delay
+
+   0, 9, 0,	// End marker
+
+} ;
+
+
+int main (void)
+{
+  int pin ;
+  int dataPtr ;
+  int l, s, d ;
+
+  printf ("Raspberry Pi - 12-LED Sequence\n") ;
+  printf ("==============================\n") ;
+  printf ("\n") ;
+  printf ("Connect LEDs up to the first 4 Pi pins and 8 pins on the ATmega\n") ;
+  printf ("    from PD2 through PB1 in that order,\n") ;
+  printf ("  then sit back and watch the show!\n") ;
+
+  wiringPiSetup  () ;
+  drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ;
+
+  for (pin = 0 ; pin < 12 ; ++pin)
+    pinMode (pinMap [pin], OUTPUT) ;
+
+  dataPtr = 0 ;
+
+  for (;;)
+  {
+    l = data [dataPtr++] ;	// LED
+    s = data [dataPtr++] ;	// State
+    d = data [dataPtr++] ;	// Duration (10ths)
+
+    if (s == 9)			// 9 -> End Marker
+    {
+      dataPtr = 0 ;
+      continue ;
+    }
+
+    digitalWrite (pinMap [l], s) ;
+    delay        (d * analogRead (GERT_BASE) / 4) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/blink6drcs.c b/modules/catkin_ws/src/wiringPi/examples/blink6drcs.c
new file mode 100644
index 0000000000000000000000000000000000000000..32f4921e1c257b238270397a85f9ce5c6ff9fe8d
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/blink6drcs.c
@@ -0,0 +1,115 @@
+/*
+ * blink6drcs.c:
+ *	Simple sequence over 6 pins on a remote DRC board.
+ *	Aimed at the Gertduino, but it's fairly generic.
+ *	This version uses DRC to talk to the ATmega on the Gertduino
+ *
+ * Copyright (c) 2012-2014 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+#include <drcSerial.h>
+
+#define	GERT_BASE	100
+
+static int pinMap [] =
+{
+  GERT_BASE + 6, GERT_BASE + 5, GERT_BASE + 3, GERT_BASE + 10, GERT_BASE + 9, GERT_BASE + 13,
+} ;
+
+// Simple sequencer data
+//	Triplets of LED, On/Off and delay
+
+
+int data [] =
+{
+               0, 1, 1,
+               1, 1, 1,
+   0, 0, 0,    2, 1, 1,
+   1, 0, 0,    3, 1, 1,
+   2, 0, 0,    4, 1, 1,
+   3, 0, 0,    5, 1, 1,
+   4, 0, 1,
+   5, 0, 1,
+
+   0, 0, 1,	// Extra delay
+
+// Back again
+
+               5, 1, 1,
+               4, 1, 1,
+   5, 0, 0,    3, 1, 1,
+   4, 0, 0,    2, 1, 1,
+   3, 0, 0,    1, 1, 1,
+   2, 0, 0,    0, 1, 1,
+   1, 0, 1,
+   0, 0, 1,
+
+   0, 0, 1,	// Extra delay
+
+   0, 9, 0,	// End marker
+
+} ;
+
+
+int main (void)
+{
+  int pin ;
+  int dataPtr ;
+  int l, s, d ;
+
+  printf ("Raspberry Pi - 6-LED Sequence\n") ;
+  printf ("=============================\n") ;
+  printf ("\n") ;
+  printf ("  Use the 2 buttons to temporarily speed up the sequence\n") ;
+
+  wiringPiSetupSys  () ;	// Not using the Pi's GPIO here
+  drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ;
+
+  for (pin = 0 ; pin < 6 ; ++pin)
+    pinMode (pinMap [pin], OUTPUT) ;
+
+  pinMode (GERT_BASE + 16, INPUT) ;	// Buttons
+  pinMode (GERT_BASE + 17, INPUT) ;
+
+  pullUpDnControl (GERT_BASE + 16, PUD_UP) ;
+  pullUpDnControl (GERT_BASE + 17, PUD_UP) ;
+
+  dataPtr = 0 ;
+
+  for (;;)
+  {
+    l = data [dataPtr++] ;	// LED
+    s = data [dataPtr++] ;	// State
+    d = data [dataPtr++] ;	// Duration (10ths)
+
+    if (s == 9)			// 9 -> End Marker
+    {
+      dataPtr = 0 ;
+      continue ;
+    }
+
+    digitalWrite (pinMap [l], s) ;
+    delay        (d * digitalRead (GERT_BASE + 16) * 15 + digitalRead (GERT_BASE + 17) * 20) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/blink8.c b/modules/catkin_ws/src/wiringPi/examples/blink8.c
new file mode 100644
index 0000000000000000000000000000000000000000..602d3c05965402d782f956f121d64bb962fb6c04
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/blink8.c
@@ -0,0 +1,57 @@
+/*
+ * blink8.c:
+ *	Simple sequence over the first 8 GPIO pins - LEDs
+ *	Aimed at the Gertboard, but it's fairly generic.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+
+int main (void)
+{
+  int i, led ;
+
+  printf ("Raspberry Pi - 8-LED Sequencer\n") ;
+  printf ("==============================\n") ;
+  printf ("\n") ;
+  printf ("Connect LEDs to the first 8 GPIO pins and watch ...\n") ;
+
+  wiringPiSetup () ;
+
+  for (i = 0 ; i < 8 ; ++i)
+    pinMode (i, OUTPUT) ;
+
+  for (;;)
+  {
+    for (led = 0 ; led < 8 ; ++led)
+    {
+      digitalWrite (led, 1) ;
+      delay (100) ;
+    }
+
+    for (led = 0 ; led < 8 ; ++led)
+    {
+      digitalWrite (led, 0) ;
+      delay (100) ;
+    }
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/clock.c b/modules/catkin_ws/src/wiringPi/examples/clock.c
new file mode 100644
index 0000000000000000000000000000000000000000..9a53210a5347ace87cc6ee873a0960bef6796b76
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/clock.c
@@ -0,0 +1,201 @@
+/*
+ * clock.c:
+ *	Demo of the 128x64 graphics based LCD driver.
+ *	This is designed to drive the parallel interface LCD drivers
+ *	based on the popular 12864H controller chip.
+ *
+ *	This test program assumes the following:
+ *		(Which is currently hard-wired into the driver)
+ *
+ *	GPIO 0-7 is connected to display data pins 0-7.
+ *	GPIO 10 is CS1
+ *	GPIO 11 is CS2
+ *	GPIO 12 is STROBE
+ *	GPIO 10 is RS
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <math.h>
+
+#include <wiringPi.h>
+#include <lcd128x64.h>
+
+#ifndef	TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+double clockRadius ;
+double thickness, barLen ;
+int maxX, maxY ;
+
+double rads (double degs)
+{
+  return degs * M_PI / 180.0 ;
+}
+
+void drawClockHands (void)
+{
+  time_t t ;
+  struct tm *now ;
+  double angle, p, x0, y0, x1, y1 ;
+  int h24, h, m, s ;
+  char text [20] ;
+
+  time (&t) ;
+  now = localtime (&t) ;
+
+  h24 = now->tm_hour ;
+  m   = now->tm_min ;
+  s   = now->tm_sec ;
+
+  h = h24 ;
+  if (h > 12)
+    h -= 12 ;
+
+// Hour hand
+
+  angle = h * 30 + m * 0.5 ;
+  x0 = sin (rads (angle)) * (clockRadius * 0.75) ;
+  y0 = cos (rads (angle)) * (clockRadius * 0.75) ;
+  for (p = -3.0 ; p <= 3.0 ; p += 0.2)
+  {
+    x1 = sin (rads (angle + p)) * (clockRadius * 0.7) ;
+    y1 = cos (rads (angle + p)) * (clockRadius * 0.7) ;
+    lcd128x64line (0, 0, x1, y1, 1) ;
+    lcd128x64lineTo (x0, y0, 1) ;
+  }
+
+// Minute hand
+
+  angle = m * 6 ;
+  x0 = sin (rads (angle)) * (clockRadius * 0.9) ;
+  y0 = cos (rads (angle)) * (clockRadius * 0.9) ;
+  for (p = -1.0 ; p <= 1.0 ; p += 0.2)
+  {
+    x1 = sin (rads (angle + p)) * (clockRadius * 0.85) ;
+    y1 = cos (rads (angle + p)) * (clockRadius * 0.85) ;
+    lcd128x64line (0, 0, x1, y1, 1) ;
+    lcd128x64lineTo (x0, y0, 1) ;
+  }
+
+// Second hand
+
+  angle = s * 6 ;
+  x0 = sin (rads (angle)) * (clockRadius * 0.2) ;
+  y0 = cos (rads (angle)) * (clockRadius * 0.2) ;
+  x1 = sin (rads (angle)) * (clockRadius * 0.95) ;
+  y1 = cos (rads (angle)) * (clockRadius * 0.95) ;
+  lcd128x64line (0 - x0, 0 - y0, x1, y1, 1) ;
+  lcd128x64circle (0, 0, clockRadius * 0.1,  0, 1) ;
+  lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ;
+
+// Text:
+
+  sprintf (text, "%02d:%02d:%02d", h24, m, s) ;
+  lcd128x64puts (32, 24, text, 0, 1) ;
+
+  sprintf (text, "%2d/%2d/%2d", now->tm_mday, now->tm_mon + 1, now->tm_year - 100) ;
+  lcd128x64puts (32, -23, text, 0, 1) ;
+}
+
+void drawClockFace (void)
+{
+  int m ;
+  double d, px1, py1, px2, py2 ;
+
+  lcd128x64clear (0) ;
+  lcd128x64circle (0,0, clockRadius, 1, TRUE) ;
+  lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ;
+
+// The four big indicators for 12,15,30 and 45
+
+  lcd128x64rectangle (- 3,  clockRadius - barLen, 3,  clockRadius,     1, TRUE) ;	// 12
+  lcd128x64rectangle (clockRadius - barLen, 3,  clockRadius, -3, 1, TRUE) ;	// 3
+  lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ;	// 6
+  lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ;	// 9
+
+
+// Smaller 5 and 1 minute ticks
+
+  for (m = 0 ; m < 60 ; ++m)
+  {
+    px1 = sin (rads (m * 6)) * clockRadius ;
+    py1 = cos (rads (m * 6)) * clockRadius ;
+    if ((m % 5) == 0)
+      d = barLen ;
+    else 
+      d = barLen / 2.0 ;
+
+    px2 = sin (rads (m * 6)) * (clockRadius - d) ;
+    py2 = cos (rads (m * 6)) * (clockRadius - d) ;
+    lcd128x64line (px1, py1, px2, py2, 1) ;
+  }
+}
+
+void setup (void)
+{
+  lcd128x64getScreenSize (&maxX, &maxY) ;
+  clockRadius = maxY / 2 - 1 ;
+  thickness = maxX / 48 ;
+  barLen = thickness * 4 ;
+  lcd128x64setOrigin (32, 32) ;
+}
+
+
+
+
+/*
+ ***********************************************************************
+ * The main program
+ ***********************************************************************
+ */
+
+int main (int argc, char *argv [])
+{
+  time_t now ;
+
+  wiringPiSetup () ;
+
+  lcd128x64setup () ;
+
+  setup () ;
+  for (;;)
+  {
+    drawClockFace  () ;
+    drawClockHands () ;
+    lcd128x64update () ;
+
+    now = time (NULL) ;
+    while (time (NULL) == now)
+      delay (10) ;
+  }
+  
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/delayTest.c b/modules/catkin_ws/src/wiringPi/examples/delayTest.c
new file mode 100644
index 0000000000000000000000000000000000000000..4c8b6ca40495b362be10241364bef35f186c9d98
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/delayTest.c
@@ -0,0 +1,107 @@
+/*
+ * delayTest.c:
+ *	Just a little test program I'm using to experiment with
+ *	various timings and latency, etc.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <wiringPi.h>
+
+#include <sys/time.h>
+
+#define	CYCLES	1000
+
+int main()
+{
+  int x ;
+  struct timeval t1, t2 ;
+  int t ;
+  int max, min ;
+  int del ;
+  int underRuns, overRuns, exactRuns, total ;
+  int descheds ;
+
+  if (wiringPiSetup () == -1)
+    return 1 ;
+
+  piHiPri (10) ; sleep (1) ;
+
+// Baseline test
+
+  gettimeofday (&t1, NULL) ;
+  gettimeofday (&t2, NULL) ;
+
+  t = t2.tv_usec - t1.tv_usec ;
+  printf ("Baseline test: %d\n", t);
+
+  for (del = 1 ; del < 200 ; ++del)
+  {
+    underRuns = overRuns = exactRuns = total = 0 ;
+    descheds = 0 ;
+    max = del ;
+    min = del ;
+
+    for (x = 0 ; x < CYCLES ; ++x)
+    {
+      for (;;)				// Repeat this if we get a delay over 999uS
+      {					// -> High probability Linux has deschedulled us
+	gettimeofday (&t1, NULL) ;
+	  delayMicroseconds (del) ;
+	gettimeofday (&t2, NULL) ;
+
+	if (t2.tv_usec < t1.tv_usec)	// Counter wrapped
+	  t = (1000000 + t2.tv_usec) - t1.tv_usec;
+	else
+	  t = t2.tv_usec - t1.tv_usec ;
+	if (t > 999)
+	{
+	  ++descheds ;
+	  continue ;
+	}
+	else
+	  break ;
+      }
+
+      if (t > max)
+      {
+        max = t ;
+	++overRuns ;
+      }
+      else if (t < min)
+      {
+	min = t ;
+	++underRuns ;
+      }
+      else
+	++exactRuns ;
+
+      total += t ;
+    }
+    printf ("Delay: %3d. Min: %3d, Max: %3d, Unders: %3d, Overs: %3d, Exacts: %3d, Average: %3d,  Descheds: %2d\n",
+	del, min, max, underRuns, overRuns, exactRuns, total / CYCLES,  descheds) ;
+    fflush (stdout) ;
+    delay (1) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/ds1302.c b/modules/catkin_ws/src/wiringPi/examples/ds1302.c
new file mode 100644
index 0000000000000000000000000000000000000000..f1e9e205724df1f863319ef340bd1a513aa01fd1
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/ds1302.c
@@ -0,0 +1,238 @@
+/*
+ * ds1302.c:
+ *	Real Time clock
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <time.h>
+
+#include <wiringPi.h>
+#include <ds1302.h>
+
+// Register defines
+
+#define	RTC_SECS	 0
+#define	RTC_MINS	 1
+#define	RTC_HOURS	 2
+#define	RTC_DATE	 3
+#define	RTC_MONTH	 4
+#define	RTC_DAY		 5
+#define	RTC_YEAR	 6
+#define	RTC_WP		 7
+#define	RTC_TC		 8
+#define	RTC_BM		31
+
+
+static unsigned int masks [] = { 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x07, 0xFF } ;
+
+
+/*
+ * bcdToD: dToBCD:
+ *	BCD decode/encode
+ *********************************************************************************
+ */
+
+static int bcdToD (unsigned int byte, unsigned int mask)
+{
+  unsigned int b1, b2 ;
+  byte &= mask ;
+  b1 = byte & 0x0F ;
+  b2 = ((byte >> 4) & 0x0F) * 10 ;
+  return b1 + b2 ;
+}
+
+static unsigned int dToBcd (unsigned int byte)
+{
+  return ((byte / 10) << 4) + (byte % 10) ;
+}
+
+
+/*
+ * ramTest:
+ *	Simple test of the 31 bytes of RAM inside the DS1302 chip
+ *********************************************************************************
+ */
+
+static int ramTestValues [] =
+  { 0x00, 0xFF, 0xAA, 0x55, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0xF0, 0x0F, -1 } ;
+
+static int ramTest (void)
+{
+  int addr ;
+  int got ;
+  int i = 0 ;
+  int errors = 0 ;
+  int testVal ;
+
+  printf ("DS1302 RAM TEST\n") ;
+
+  testVal = ramTestValues [i] ;
+
+  while (testVal != -1)
+  {
+    for (addr = 0 ; addr < 31 ; ++addr)
+      ds1302ramWrite (addr, testVal) ;
+
+    for (addr = 0 ; addr < 31 ; ++addr)
+      if ((got = ds1302ramRead (addr)) != testVal)
+      {
+	printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n",
+		addr, testVal, got) ;
+	++errors ;
+      }
+    testVal = ramTestValues [++i] ;
+  }
+
+  for (addr = 0 ; addr < 31 ; ++addr)
+    ds1302ramWrite (addr, addr) ;
+
+  for (addr = 0 ; addr < 31 ; ++addr)
+    if ((got = ds1302ramRead (addr)) != addr)
+    {
+      printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n",
+	      addr, addr, got) ;
+      ++errors ;
+    }
+
+  if (errors == 0)
+    printf ("-- DS1302 RAM TEST: OK\n") ;
+  else
+    printf ("-- DS1302 RAM TEST FAILURE. %d errors.\n", errors) ;
+
+  return 0 ;
+}
+
+/*
+ * setLinuxClock:
+ *	Set the Linux clock from the hardware
+ *********************************************************************************
+ */
+
+static int setLinuxClock (void)
+{
+  char dateTime [20] ;
+  char command [64] ;
+  int  clock [8] ;
+
+
+  printf ("Setting the Linux Clock from the DS1302... ") ; fflush (stdout) ;
+
+  ds1302clockRead (clock) ;
+
+// [MMDDhhmm[[CC]YY][.ss]]
+
+  sprintf (dateTime, "%02d%02d%02d%02d%02d%02d.%02d",
+	bcdToD (clock [RTC_MONTH], masks [RTC_MONTH]),
+	bcdToD (clock [RTC_DATE],  masks [RTC_DATE]),
+	bcdToD (clock [RTC_HOURS], masks [RTC_HOURS]),
+	bcdToD (clock [RTC_MINS],  masks [RTC_MINS]),
+	20,
+	bcdToD (clock [RTC_YEAR],  masks [RTC_YEAR]),
+	bcdToD (clock [RTC_SECS],  masks [RTC_SECS])) ;
+
+  sprintf (command, "/bin/date %s", dateTime) ;
+  system (command) ;
+
+  return 0 ;
+}
+
+
+/*
+ * setDSclock:
+ *	Set the DS1302 block from Linux time
+ *********************************************************************************
+ */
+
+static int setDSclock (void)
+{
+  struct tm t ;
+  time_t now ;
+  int clock [8] ;
+
+  printf ("Setting the clock in the DS1302 from Linux time... ") ;
+
+  now = time (NULL) ;
+  gmtime_r (&now, &t) ;
+
+  clock [ 0] = dToBcd (t.tm_sec) ;	// seconds
+  clock [ 1] = dToBcd (t.tm_min) ;	// mins
+  clock [ 2] = dToBcd (t.tm_hour) ;	// hours
+  clock [ 3] = dToBcd (t.tm_mday) ;	// date
+  clock [ 4] = dToBcd (t.tm_mon + 1) ;	// months 0-11 --> 1-12
+  clock [ 5] = dToBcd (t.tm_wday + 1) ;	// weekdays (sun 0)
+  clock [ 6] = dToBcd (t.tm_year - 100) ;       // years
+  clock [ 7] = 0 ;			// W-Protect off
+
+  ds1302clockWrite (clock) ;
+
+  printf ("OK\n") ;
+
+  return 0 ;
+}
+
+
+
+
+int main (int argc, char *argv [])
+{
+  int i ;
+  int clock [8] ;
+
+  wiringPiSetup () ;
+  ds1302setup   (0, 1, 2) ;
+
+  if (argc == 2)
+  {
+    /**/ if (strcmp (argv [1], "-slc") == 0)
+      return setLinuxClock () ;
+    else if (strcmp (argv [1], "-sdsc") == 0)
+      return setDSclock () ;
+    else if (strcmp (argv [1], "-rtest") == 0)
+      return ramTest () ;
+    else
+    {
+      printf ("Usage: ds1302 [-slc | -sdsc | -rtest]\n") ;
+      return EXIT_FAILURE ;
+    }
+  }
+
+  for (i = 0 ;; ++i)
+  {
+    printf ("%5d:  ", i) ;
+
+    ds1302clockRead (clock) ;
+    printf (" %2d:%02d:%02d",
+	bcdToD (clock [2], masks [2]), bcdToD (clock [1], masks [1]), bcdToD (clock [0], masks [0])) ;
+
+    printf (" %2d/%02d/%04d",
+	bcdToD (clock [3], masks [3]), bcdToD (clock [4], masks [4]), bcdToD (clock [6], masks [6]) + 2000) ;
+      
+    printf ("\n") ;
+
+    delay (200) ;
+  }
+ 
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/header.h b/modules/catkin_ws/src/wiringPi/examples/header.h
new file mode 100644
index 0000000000000000000000000000000000000000..82f723d3c3669ec9934e0728b6ed3bc22d29fafe
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/header.h
@@ -0,0 +1,23 @@
+/*
+ * file.c:
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
diff --git a/modules/catkin_ws/src/wiringPi/examples/isr-osc.c b/modules/catkin_ws/src/wiringPi/examples/isr-osc.c
new file mode 100644
index 0000000000000000000000000000000000000000..a872ee3abdb6feb8ae2dddc01900ae399cc0ffa7
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/isr-osc.c
@@ -0,0 +1,118 @@
+/*
+ * isr-osc.c:
+ *	Wait for Interrupt test program - ISR method - interrupt oscillator
+ *
+ *	How to test:
+ *
+ *	IMPORTANT: To run this test we connect 2 GPIO pins together, but
+ *	before we do that YOU must make sure that they are both setup
+ *	the right way. If they are set to outputs and one is high and one low,
+ *	then you connect the wire, you'll create a short and that won't be good.
+ *
+ *	Before making the connection, type:
+ *		gpio mode 0 output
+ *		gpio write 0 0
+ *		gpio mode 1 input
+ *	then you can connect them together.
+ *
+ *	Run the program, then:
+ *		gpio write 0 1
+ *		gpio write 0 0
+ *
+ *	at which point it will trigger an interrupt and the program will
+ *	then do the up/down toggling for itself and run at full speed, and
+ *	it will report the number of interrupts recieved every second.
+ *
+ *	Copyright (c) 2013 Gordon Henderson. projects@drogon.net
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <wiringPi.h>
+
+
+// What GPIO input are we using?
+//	This is a wiringPi pin number
+
+#define	OUT_PIN		0
+#define	IN_PIN		1
+
+// globalCounter:
+//	Global variable to count interrupts
+//	Should be declared volatile to make sure the compiler doesn't cache it.
+
+static volatile int globalCounter = 0 ;
+
+/*
+ * myInterrupt:
+ *********************************************************************************
+ */
+
+void myInterrupt (void)
+{
+  digitalWrite (OUT_PIN, 1) ;
+  ++globalCounter ;
+  digitalWrite (OUT_PIN, 0) ;
+}
+
+
+/*
+ *********************************************************************************
+ * main
+ *********************************************************************************
+ */
+
+int main (void)
+{
+  int myCounter   = 0 ;
+  int lastCounter = 0 ;
+
+  if (wiringPiSetup () < 0)
+  {
+    fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+
+  pinMode (OUT_PIN, OUTPUT) ;
+  pinMode (IN_PIN,  INPUT) ;
+
+  if (wiringPiISR (IN_PIN, INT_EDGE_FALLING, &myInterrupt) < 0)
+  {
+    fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+
+  for (;;)
+  {
+    printf ("Waiting ... ") ; fflush (stdout) ;
+
+    while (myCounter == globalCounter)
+      delay (1000) ;
+
+    printf (" Done. counter: %6d: %6d\n",
+		globalCounter, myCounter - lastCounter) ;
+    lastCounter = myCounter ;
+    myCounter   = globalCounter ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/isr.c b/modules/catkin_ws/src/wiringPi/examples/isr.c
new file mode 100644
index 0000000000000000000000000000000000000000..abc6aec994fcdf7f774f186ce6d75d298d96bd3a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/isr.c
@@ -0,0 +1,110 @@
+/*
+ * isr.c:
+ *	Wait for Interrupt test program - ISR method
+ *
+ *	How to test:
+ *	  Use the SoC's pull-up and pull down resistors that are avalable
+ *	on input pins. So compile & run this program (via sudo), then
+ *	in another terminal:
+ *		gpio mode 0 up
+ *		gpio mode 0 down
+ *	at which point it should trigger an interrupt. Toggle the pin
+ *	up/down to generate more interrupts to test.
+ *
+ * Copyright (c) 2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <wiringPi.h>
+
+
+// globalCounter:
+//	Global variable to count interrupts
+//	Should be declared volatile to make sure the compiler doesn't cache it.
+
+static volatile int globalCounter [8] ;
+
+
+/*
+ * myInterrupt:
+ *********************************************************************************
+ */
+
+void myInterrupt0 (void) { ++globalCounter [0] ; }
+void myInterrupt1 (void) { ++globalCounter [1] ; }
+void myInterrupt2 (void) { ++globalCounter [2] ; }
+void myInterrupt3 (void) { ++globalCounter [3] ; }
+void myInterrupt4 (void) { ++globalCounter [4] ; }
+void myInterrupt5 (void) { ++globalCounter [5] ; }
+void myInterrupt6 (void) { ++globalCounter [6] ; }
+void myInterrupt7 (void) { ++globalCounter [7] ; }
+
+
+/*
+ *********************************************************************************
+ * main
+ *********************************************************************************
+ */
+
+int main (void)
+{
+  int gotOne, pin ;
+  int myCounter [8] ;
+
+  for (pin = 0 ; pin < 8 ; ++pin) 
+    globalCounter [pin] = myCounter [pin] = 0 ;
+
+  wiringPiSetup () ;
+
+  wiringPiISR (0, INT_EDGE_FALLING, &myInterrupt0) ;
+  wiringPiISR (1, INT_EDGE_FALLING, &myInterrupt1) ;
+  wiringPiISR (2, INT_EDGE_FALLING, &myInterrupt2) ;
+  wiringPiISR (3, INT_EDGE_FALLING, &myInterrupt3) ;
+  wiringPiISR (4, INT_EDGE_FALLING, &myInterrupt4) ;
+  wiringPiISR (5, INT_EDGE_FALLING, &myInterrupt5) ;
+  wiringPiISR (6, INT_EDGE_FALLING, &myInterrupt6) ;
+  wiringPiISR (7, INT_EDGE_FALLING, &myInterrupt7) ;
+
+  for (;;)
+  {
+    gotOne = 0 ;
+    printf ("Waiting ... ") ; fflush (stdout) ;
+
+    for (;;)
+    {
+      for (pin = 0 ; pin < 8 ; ++pin)
+      {
+	if (globalCounter [pin] != myCounter [pin])
+	{
+	  printf (" Int on pin %d: Counter: %5d\n", pin, globalCounter [pin]) ;
+	  myCounter [pin] = globalCounter [pin] ;
+	  ++gotOne ;
+	}
+      }
+      if (gotOne != 0)
+	break ;
+    }
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/lcd-adafruit.c b/modules/catkin_ws/src/wiringPi/examples/lcd-adafruit.c
new file mode 100644
index 0000000000000000000000000000000000000000..47c9b9b25c7c1b00a06cef8c5141175e4afdf0c4
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/lcd-adafruit.c
@@ -0,0 +1,347 @@
+/*
+ * lcd-adafruit.c:
+ *	Text-based LCD driver test code
+ *	This is designed to drive the Adafruit RGB LCD Plate
+ *	with the additional 5 buttons for the Raspberry Pi
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+
+#include <wiringPi.h>
+#include <mcp23017.h>
+#include <lcd.h>
+
+#ifndef	TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+
+// Defines for the Adafruit Pi LCD interface board
+
+#define	AF_BASE		100
+#define	AF_RED		(AF_BASE + 6)
+#define	AF_GREEN	(AF_BASE + 7)
+#define	AF_BLUE		(AF_BASE + 8)
+
+#define	AF_E		(AF_BASE + 13)
+#define	AF_RW		(AF_BASE + 14)
+#define	AF_RS		(AF_BASE + 15)
+
+#define	AF_DB4		(AF_BASE + 12)
+#define	AF_DB5		(AF_BASE + 11)
+#define	AF_DB6		(AF_BASE + 10)
+#define	AF_DB7		(AF_BASE +  9)
+
+#define	AF_SELECT	(AF_BASE +  0)
+#define	AF_RIGHT	(AF_BASE +  1)
+#define	AF_DOWN		(AF_BASE +  2)
+#define	AF_UP		(AF_BASE +  3)
+#define	AF_LEFT		(AF_BASE +  4)
+
+
+// User-Defined character test
+
+static unsigned char newChar [8] = 
+{
+  0b00100,
+  0b00100,
+  0b00000,
+  0b00100,
+  0b01110,
+  0b11011,
+  0b11011,
+  0b10001,
+} ;
+
+// Global lcd handle:
+
+static int lcdHandle ;
+
+/*
+ * usage:
+ *********************************************************************************
+ */
+
+int usage (const char *progName)
+{
+  fprintf (stderr, "Usage: %s colour\n", progName) ;
+  return EXIT_FAILURE ;
+}
+
+
+/*
+ * scrollMessage:
+ *********************************************************************************
+ */
+
+static const char *message =
+  "                    "
+  "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/"
+  "                    " ;
+
+void scrollMessage (int line, int width)
+{
+  char buf [32] ;
+  static int position = 0 ;
+  static int timer = 0 ;
+
+  if (millis () < timer)
+    return ;
+
+  timer = millis () + 200 ;
+
+  strncpy (buf, &message [position], width) ;
+  buf [width] = 0 ;
+  lcdPosition (lcdHandle, 0, line) ;
+  lcdPuts (lcdHandle, buf) ;
+
+  if (++position == (strlen (message) - width))
+    position = 0 ;
+}
+
+
+/*
+ * setBacklightColour:
+ *	The colour outputs are inverted.
+ *********************************************************************************
+ */
+
+static void setBacklightColour (int colour)
+{
+  colour &= 7 ;
+
+  digitalWrite (AF_RED,   !(colour & 1)) ;
+  digitalWrite (AF_GREEN, !(colour & 2)) ;
+  digitalWrite (AF_BLUE,  !(colour & 4)) ;
+}
+
+
+/*
+ * adafruitLCDSetup:
+ *	Setup the Adafruit board by making sure the additional pins are
+ *	set to the correct modes, etc.
+ *********************************************************************************
+ */
+
+static void adafruitLCDSetup (int colour)
+{
+  int i ;
+
+//	Backlight LEDs
+
+  pinMode (AF_RED,   OUTPUT) ;
+  pinMode (AF_GREEN, OUTPUT) ;
+  pinMode (AF_BLUE,  OUTPUT) ;
+  setBacklightColour (colour) ;
+
+//	Input buttons
+
+  for (i = 0 ; i <= 4 ; ++i)
+  {
+    pinMode (AF_BASE + i, INPUT) ;
+    pullUpDnControl (AF_BASE + i, PUD_UP) ;	// Enable pull-ups, switches close to 0v
+  }
+
+// Control signals
+
+  pinMode (AF_RW, OUTPUT) ; digitalWrite (AF_RW, LOW) ;	// Not used with wiringPi - always in write mode
+
+// The other control pins are initialised with lcdInit ()
+
+  lcdHandle = lcdInit (2, 16, 4, AF_RS, AF_E, AF_DB4,AF_DB5,AF_DB6,AF_DB7, 0,0,0,0) ;
+
+  if (lcdHandle < 0)
+  {
+    fprintf (stderr, "lcdInit failed\n") ;
+    exit (EXIT_FAILURE) ;
+  }
+}
+
+
+/*
+ * waitForEnter:
+ *	On the Adafruit display, wait for the select button
+ *********************************************************************************
+ */
+
+static void waitForEnter (void)
+{
+  printf ("Press SELECT to continue: ") ; fflush (stdout) ;
+
+  while (digitalRead (AF_SELECT) == HIGH)	// Wait for push
+    delay (1) ;
+
+  while (digitalRead (AF_SELECT) == LOW)	// Wait for release
+    delay (1) ;
+
+  printf ("OK\n") ;
+}
+
+
+/*
+ * speedTest:
+ *	Test the update speed of the display
+ *********************************************************************************
+ */
+
+static void speedTest (void)
+{
+  unsigned int start, end, taken ;
+  int times ;
+
+  lcdClear (lcdHandle) ;
+  start = millis () ;
+  for (times = 0 ; times < 10 ; ++times)
+  {
+    lcdPuts (lcdHandle, "0123456789ABCDEF") ;
+    lcdPuts (lcdHandle, "0123456789ABCDEF") ;
+  }
+  end   = millis () ;
+  taken = (end - start) / 10;
+
+  lcdClear (lcdHandle) ;
+  lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Speed: %dmS", taken) ;
+  lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "For full update") ;
+
+  waitForEnter () ;
+
+  lcdClear (lcdHandle) ;
+  lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Time: %dmS", taken / 32) ;
+  lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "Per character") ;
+
+  waitForEnter () ;
+
+  lcdClear (lcdHandle) ;
+  lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "%d cps...", 32000 / taken) ;
+
+  waitForEnter () ;
+}
+
+
+/*
+ * The works
+ *********************************************************************************
+ */
+
+int main (int argc, char *argv[])
+{
+  int colour ;
+  int cols = 16 ;
+  int waitForRelease = FALSE ;
+
+  struct tm *t ;
+  time_t tim ;
+
+  char buf [32] ;
+
+  if (argc != 2)
+    return usage (argv [0]) ;
+
+  printf ("Raspberry Pi Adafruit LCD test\n") ;
+  printf ("==============================\n") ;
+
+  colour = atoi (argv [1]) ;
+
+  wiringPiSetupSys () ;
+  mcp23017Setup (AF_BASE, 0x20) ;
+
+  adafruitLCDSetup (colour) ;
+
+  lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ;
+  lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "  wiringpi.com  ") ;
+
+  waitForEnter () ;
+
+  lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "Adafruit RGB LCD") ;
+
+  waitForEnter () ;
+
+  lcdCharDef  (lcdHandle, 2, newChar) ;
+
+  lcdClear    (lcdHandle) ;
+  lcdPosition (lcdHandle, 0, 0) ;
+  lcdPuts     (lcdHandle, "User Char: ") ;
+  lcdPutchar  (lcdHandle, 2) ;
+
+  lcdCursor      (lcdHandle, TRUE) ;
+  lcdCursorBlink (lcdHandle, TRUE) ;
+
+  waitForEnter () ;
+
+  lcdCursor      (lcdHandle, FALSE) ;
+  lcdCursorBlink (lcdHandle, FALSE) ;
+
+  speedTest () ;
+
+  lcdClear (lcdHandle) ;
+
+  for (;;)
+  {
+    scrollMessage (0, cols) ;
+    
+    tim = time (NULL) ;
+    t = localtime (&tim) ;
+
+    sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
+
+    lcdPosition (lcdHandle, (cols - 8) / 2, 1) ;
+    lcdPuts     (lcdHandle, buf) ;
+
+// Check buttons to cycle colour
+
+// If Up or Down are still pushed, then skip
+
+    if (waitForRelease)
+    {
+      if ((digitalRead (AF_UP) == LOW) || (digitalRead (AF_DOWN) == LOW))
+	continue ;
+      else
+	waitForRelease = FALSE ;
+    }
+
+    if (digitalRead (AF_UP) == LOW)	// Pushed
+    {
+      colour = colour + 1 ;
+      if (colour == 8)
+	colour = 0 ;
+      setBacklightColour (colour) ;
+      waitForRelease = TRUE ;
+    }
+
+    if (digitalRead (AF_DOWN) == LOW)	// Pushed
+    {
+      colour = colour - 1 ;
+      if (colour == -1)
+	colour = 7 ;
+      setBacklightColour (colour) ;
+      waitForRelease = TRUE ;
+    }
+
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/lcd.c b/modules/catkin_ws/src/wiringPi/examples/lcd.c
new file mode 100644
index 0000000000000000000000000000000000000000..510f5620469f49e06e7593e07cdb64fa10e01ef1
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/lcd.c
@@ -0,0 +1,286 @@
+/*
+ * lcd.c:
+ *	Text-based LCD driver.
+ *	This is designed to drive the parallel interface LCD drivers
+ *	based in the Hitachi HD44780U controller and compatables.
+ *
+ *	This test program assumes the following:
+ *
+ *	8-bit displays:
+ *		GPIO 0-7 is connected to display data pins 0-7.
+ *		GPIO 11 is the RS pin.
+ *		GPIO 10 is the Strobe/E pin.
+ *
+ *	For 4-bit interface:
+ *		GPIO 4-7 is connected to display data pins 4-7.
+ *		GPIO 11 is the RS pin.
+ *		GPIO 10 is the Strobe/E pin.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+
+#include <wiringPi.h>
+#include <lcd.h>
+
+#ifndef	TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+static unsigned char newChar [8] = 
+{
+  0b11111,
+  0b10001,
+  0b10001,
+  0b10101,
+  0b11111,
+  0b10001,
+  0b10001,
+  0b11111,
+} ;
+
+
+// Global lcd handle:
+
+static int lcdHandle ;
+
+/*
+ * usage:
+ *********************************************************************************
+ */
+
+int usage (const char *progName)
+{
+  fprintf (stderr, "Usage: %s bits cols rows\n", progName) ;
+  return EXIT_FAILURE ;
+}
+
+
+/*
+ * scrollMessage:
+ *********************************************************************************
+ */
+
+static const char *message =
+  "                    "
+  "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/"
+  "                    " ;
+
+void scrollMessage (int line, int width)
+{
+  char buf [32] ;
+  static int position = 0 ;
+  static int timer = 0 ;
+
+  if (millis () < timer)
+    return ;
+
+  timer = millis () + 200 ;
+
+  strncpy (buf, &message [position], width) ;
+  buf [width] = 0 ;
+  lcdPosition (lcdHandle, 0, line) ;
+  lcdPuts     (lcdHandle, buf) ;
+
+  if (++position == (strlen (message) - width))
+    position = 0 ;
+}
+
+
+/*
+ * pingPong:
+ *	Bounce a character - only on 4-line displays
+ *********************************************************************************
+ */
+
+static void pingPong (int lcd, int cols)
+{
+  static int position = 0 ;
+  static int dir      = 0 ;
+
+  if (dir == 0)		// Setup
+  {
+    dir = 1 ;
+    lcdPosition (lcdHandle, 0, 3) ;
+    lcdPutchar  (lcdHandle, '*') ;
+    return ;
+  }
+
+  lcdPosition (lcdHandle, position, 3) ;
+  lcdPutchar (lcdHandle, ' ') ;
+  position += dir ;
+
+  if (position == cols)
+  {
+    dir = -1 ;
+    --position ;
+  }
+  
+  if (position < 0)
+  {
+    dir = 1 ;
+    ++position ;
+  }
+
+  lcdPosition (lcdHandle, position, 3) ;
+  lcdPutchar  (lcdHandle, '#') ;
+}
+
+
+/*
+ * waitForEnter:
+ *********************************************************************************
+ */
+
+static void waitForEnter (void)
+{
+  printf ("Press ENTER to continue: ") ;
+  (void)fgetc (stdin) ;
+}
+
+
+/*
+ * The works
+ *********************************************************************************
+ */
+
+int main (int argc, char *argv[])
+{
+  int i ;
+  int lcd ;
+  int bits, rows, cols ;
+
+  struct tm *t ;
+  time_t tim ;
+
+  char buf [32] ;
+
+  if (argc != 4)
+    return usage (argv [0]) ;
+
+  printf ("Raspberry Pi LCD test\n") ;
+  printf ("=====================\n") ;
+
+  bits = atoi (argv [1]) ;
+  cols = atoi (argv [2]) ;
+  rows = atoi (argv [3]) ;
+
+  if (!((rows == 1) || (rows == 2) || (rows == 4)))
+  {
+    fprintf (stderr, "%s: rows must be 1, 2 or 4\n", argv [0]) ;
+    return EXIT_FAILURE ;
+  }
+
+  if (!((cols == 16) || (cols == 20)))
+  {
+    fprintf (stderr, "%s: cols must be 16 or 20\n", argv [0]) ;
+    return EXIT_FAILURE ;
+  }
+
+  wiringPiSetup () ;
+
+  if (bits == 4)
+    lcdHandle = lcdInit (rows, cols, 4, 11,10, 4,5,6,7,0,0,0,0) ;
+  else
+    lcdHandle = lcdInit (rows, cols, 8, 11,10, 0,1,2,3,4,5,6,7) ;
+
+  if (lcdHandle < 0)
+  {
+    fprintf (stderr, "%s: lcdInit failed\n", argv [0]) ;
+    return -1 ;
+  }
+
+  lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ;
+  lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "  wiringpi.com  ") ;
+
+  waitForEnter () ;
+
+  if (rows > 1)
+  {
+    lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "  wiringpi.com  ") ;
+
+    if (rows == 4)
+    {
+      lcdPosition (lcdHandle, 0, 2) ;
+      for (i = 0 ; i < ((cols - 1) / 2) ; ++i)
+        lcdPuts (lcdHandle, "=-") ;
+      lcdPuts (lcdHandle, "=3") ;
+
+      lcdPosition (lcdHandle, 0, 3) ;
+      for (i = 0 ; i < ((cols - 1) / 2) ; ++i)
+        lcdPuts (lcdHandle, "-=") ;
+      lcdPuts (lcdHandle, "-4") ;
+    }
+  }
+
+  waitForEnter () ;
+
+  lcdCharDef  (lcdHandle, 2, newChar) ;
+
+  lcdClear    (lcdHandle) ;
+  lcdPosition (lcdHandle, 0, 0) ;
+  lcdPuts     (lcdHandle, "User Char: ") ;
+  lcdPutchar  (lcdHandle, 2) ;
+
+  lcdCursor      (lcdHandle, TRUE) ;
+  lcdCursorBlink (lcdHandle, TRUE) ;
+
+  waitForEnter () ;
+
+  lcdCursor      (lcdHandle, FALSE) ;
+  lcdCursorBlink (lcdHandle, FALSE) ;
+  lcdClear       (lcdHandle) ;
+
+  for (;;)
+  {
+    scrollMessage (0, cols) ;
+    
+    if (rows == 1)
+      continue ;
+
+    tim = time (NULL) ;
+    t = localtime (&tim) ;
+
+    sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
+
+    lcdPosition (lcdHandle, (cols - 8) / 2, 1) ;
+    lcdPuts     (lcdHandle, buf) ;
+
+    if (rows == 2)
+      continue ;
+
+    sprintf (buf, "%02d/%02d/%04d", t->tm_mday, t->tm_mon + 1, t->tm_year+1900) ;
+
+    lcdPosition (lcdHandle, (cols - 10) / 2, 2) ;
+    lcdPuts     (lcdHandle, buf) ;
+
+    pingPong (lcd, cols) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/lowPower.c b/modules/catkin_ws/src/wiringPi/examples/lowPower.c
new file mode 100644
index 0000000000000000000000000000000000000000..e901e7faadc16f4f6831b715e2fc3ae917bfc014
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/lowPower.c
@@ -0,0 +1,68 @@
+/*
+ * lowPower.c:
+ *	Check the Pi's LOW-Power signal.
+ *
+ *	This is a demonstration program that could be turned into some sort
+ *	of logger via e.g. syslog - however it's also probably something
+ *	that might be better handled by a future kernel - who knows.
+ *
+ * Copyright (c) 2014 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <time.h>
+#include <wiringPi.h>
+
+
+#define	LOW_POWER	35
+
+/*
+ * lowPower:
+ *	This is an ISR that waits for the low-power signal going low and
+ *	prints the result.
+ *********************************************************************************
+ */
+
+void lowPower (void)
+{
+  time_t t ;
+
+  time (&t) ;
+  printf ("%s: LOW POWER DETECTED\n", ctime (&t)) ;
+}
+
+
+/*
+ *********************************************************************************
+ * main
+ *********************************************************************************
+ */
+
+int main (void)
+{
+  wiringPiSetupGpio () ;	// GPIO mode as it's an internal pin
+
+  wiringPiISR (LOW_POWER, INT_EDGE_FALLING, &lowPower) ;
+
+  for (;;)
+    delay (1000) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/nes.c b/modules/catkin_ws/src/wiringPi/examples/nes.c
new file mode 100644
index 0000000000000000000000000000000000000000..31908e8a0efbe5ff0e149731039a7cd4cdda3bd1
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/nes.c
@@ -0,0 +1,67 @@
+/*
+ * nes.c:
+ *	Test program for an old NES controller connected to the Pi.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <wiringPi.h>
+#include <piNes.h>
+
+#define	BLANK	"|      "
+
+int main ()
+{
+  int joystick ;
+  unsigned int buttons ;
+
+  if (wiringPiSetup () == -1)
+  {
+    fprintf (stdout, "oops: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+
+  if ((joystick = setupNesJoystick (2, 1, 0)) == -1)
+  {
+    fprintf (stdout, "Unable to setup joystick\n") ;
+    return 1 ;
+  }
+
+  for (;;)
+  {
+    buttons = readNesJoystick (joystick) ;
+
+    if ((buttons & NES_UP)     != 0) printf ("|  UP  " ) ; else printf (BLANK) ;
+    if ((buttons & NES_DOWN)   != 0) printf ("| DOWN " ) ; else printf (BLANK) ;
+    if ((buttons & NES_LEFT)   != 0) printf ("| LEFT " ) ; else printf (BLANK) ;
+    if ((buttons & NES_RIGHT)  != 0) printf ("|RIGHT " ) ; else printf (BLANK) ;
+    if ((buttons & NES_SELECT) != 0) printf ("|SELECT" ) ; else printf (BLANK) ;
+    if ((buttons & NES_START)  != 0) printf ("|START " ) ; else printf (BLANK) ;
+    if ((buttons & NES_A)      != 0) printf ("|  A   " ) ; else printf (BLANK) ;
+    if ((buttons & NES_B)      != 0) printf ("|  B   " ) ; else printf (BLANK) ;
+    printf ("|\n") ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/okLed.c b/modules/catkin_ws/src/wiringPi/examples/okLed.c
new file mode 100644
index 0000000000000000000000000000000000000000..930f266b5c4a387870bd81982382f0cafa95b1a7
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/okLed.c
@@ -0,0 +1,82 @@
+/*
+ * okLed.c:
+ *      Make the OK LED on the Pi Pulsate...
+ *
+ * Originally posted to the Raspberry Pi forums:
+ *  http://www.raspberrypi.org/phpBB3/viewtopic.php?p=162581#p162581
+ *
+ * Compile this and store it somewhere, then kick it off at boot time
+ *    e.g. by putting it in /etc/rc.local and running it in the
+ *    background &
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <math.h>
+
+#include <wiringPi.h>
+#include <softPwm.h>
+
+// The OK/Act LED is connected to BCM_GPIO pin 16
+
+#define OK_LED  16
+
+int main ()
+{
+  int fd, i ;
+
+  wiringPiSetupGpio () ;
+
+// Change the trigger on the OK/Act LED to "none"
+
+  if ((fd = open ("/sys/class/leds/led0/trigger", O_RDWR)) < 0)
+  {
+    fprintf (stderr, "Unable to change LED trigger: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+  write (fd, "none\n", 5) ;
+  close (fd) ;
+
+  softPwmCreate (OK_LED, 0, 100) ;
+
+  for (;;)
+  {
+    for (i = 0 ; i <= 100 ; ++i)
+    {
+      softPwmWrite (OK_LED, i) ;
+      delay (10) ;
+    }
+    delay (50) ;
+
+    for (i = 100 ; i >= 0 ; --i)
+    {
+      softPwmWrite (OK_LED, i) ;
+      delay (10) ;
+    }
+    delay (10) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/pwm.c b/modules/catkin_ws/src/wiringPi/examples/pwm.c
new file mode 100644
index 0000000000000000000000000000000000000000..816c8322e357db2f56458a1bd4689aa61f75c64f
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/pwm.c
@@ -0,0 +1,58 @@
+/*
+ * pwm.c:
+ *	This tests the hardware PWM channel.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+int main (void)
+{
+  int bright ;
+
+  printf ("Raspberry Pi wiringPi PWM test program\n") ;
+
+  if (wiringPiSetup () == -1)
+    exit (1) ;
+
+  pinMode (1, PWM_OUTPUT) ;
+
+  for (;;)
+  {
+    for (bright = 0 ; bright < 1024 ; ++bright)
+    {
+      pwmWrite (1, bright) ;
+      delay (1) ;
+    }
+
+    for (bright = 1023 ; bright >= 0 ; --bright)
+    {
+      pwmWrite (1, bright) ;
+      delay (1) ;
+    }
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/Makefile b/modules/catkin_ws/src/wiringPi/examples/q2w/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..150c825f6ac7ed46cdcb95fb4ecd908254066968
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/Makefile
@@ -0,0 +1,81 @@
+#
+# Makefile:
+#	wiringPi - Wiring Compatable library for the Raspberry Pi
+#	https://projects.drogon.net/wiring-pi
+#
+#	Copyright (c) 2012-2013 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	Wiring Compatable library for the Raspberry Pi
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+
+#DEBUG	= -g -O0
+DEBUG	= -O3
+CC	= gcc
+INCLUDE	= -I/usr/local/include
+CFLAGS	= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
+
+LDFLAGS	= -L/usr/local/lib
+LDLIBS    = -lwiringPi -lwiringPiDev -lpthread -lm
+
+###############################################################################
+
+SRC	=	blink.c button.c blink-io.c volts.c bright.c
+
+OBJ	=	$(SRC:.c=.o)
+
+BINS	=	$(SRC:.c=)
+
+all:	$(BINS)
+
+blink:	blink.o
+	@echo [link]
+	@$(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS)
+
+blink-io:	blink-io.o
+	@echo [link]
+	@$(CC) -o $@ blink-io.o $(LDFLAGS) $(LDLIBS)
+
+button:	button.o
+	@echo [link]
+	@$(CC) -o $@ button.o $(LDFLAGS) $(LDLIBS)
+
+volts:	volts.o
+	@echo [link]
+	@$(CC) -o $@ volts.o $(LDFLAGS) $(LDLIBS)
+
+bright:	bright.o
+	@echo [link]
+	@$(CC) -o $@ bright.o $(LDFLAGS) $(LDLIBS)
+
+
+.c.o:
+	@echo [CC] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+clean:
+	@echo "[Clean]"
+	@rm -f $(OBJ) *~ core tags $(BINS)
+
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+depend:
+	makedepend -Y $(SRC)
+
+# DO NOT DELETE
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/binary.c b/modules/catkin_ws/src/wiringPi/examples/q2w/binary.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c987c6ac2506eed6d57cd15096c5b2766ade27f
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/binary.c
@@ -0,0 +1,79 @@
+/*
+ * binary.c:
+ *      Using the Quick 2 wire 16-bit GPIO expansion board to output
+ *	a binary counter.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+#include <mcp23017.h>
+
+#define	Q2W_BASE	100
+
+int main (void)
+{
+  int i, bit ;
+
+// Enable the on-goard GPIO
+
+  wiringPiSetup () ;
+
+// Add in the mcp23017 on the q2w board
+
+  mcp23017Setup (Q2W_BASE, 0x20) ;
+
+  printf ("Raspberry Pi - quite2Wire MCP23017 Test\n") ;
+
+// On-board button Input:
+
+  pinMode (0, INPUT) ;
+
+// First 10 pins on q2w board as outputs:
+
+  for (i = 0 ; i < 10 ; ++i)
+    pinMode (Q2W_BASE + i, OUTPUT) ;
+
+// Last pin as an input with the internal pull-up enabled
+
+  pinMode         (Q2W_BASE + 15, INPUT) ;
+  pullUpDnControl (Q2W_BASE + 15, PUD_UP) ;
+
+// Loop, outputting a binary number,
+//	Go faster with the button, or stop if the
+//	on-board button is pushed
+
+  for (;;)
+  {
+    for (i = 0 ; i < 1024 ; ++i)
+    {
+      for (bit = 0 ; bit < 10 ; ++bit)
+        digitalWrite (Q2W_BASE + bit, i & (1 << bit)) ;
+
+      while (digitalRead (0) == HIGH)		// While pushed
+	delay (1) ;
+
+      if (digitalRead (Q2W_BASE + 15) == HIGH)	// Not Pushed
+	delay (100) ;
+    }
+  }
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/blink-io.c b/modules/catkin_ws/src/wiringPi/examples/q2w/blink-io.c
new file mode 100644
index 0000000000000000000000000000000000000000..4dd427657059aa478c920fa58ee64f345bfe6ea9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/blink-io.c
@@ -0,0 +1,61 @@
+/*
+ * blink-io.c:
+ *	Simple "blink" test for the Quick2Wire 16-pin IO board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+#include <mcp23017.h>
+
+#define	LED		1
+#define	Q2W_BASE	100
+
+int main (void)
+{
+
+// Enable the on-goard GPIO
+
+  wiringPiSetup () ;
+
+// Add in the mcp23017 on the q2w board
+
+  mcp23017Setup (Q2W_BASE, 0x20) ;
+
+  printf ("Raspberry Pi - Quick2Wire MCP23017 Blink Test\n") ;
+
+// Blink the on-board LED as well as one on the mcp23017
+
+  pinMode (LED, OUTPUT) ;
+  pinMode (Q2W_BASE + 0, OUTPUT) ;
+
+  for (;;)
+  {
+    digitalWrite (LED,          HIGH) ;
+    digitalWrite (Q2W_BASE + 0, HIGH) ;
+    delay (500) ;
+    digitalWrite (LED,          LOW) ;
+    digitalWrite (Q2W_BASE + 0, LOW) ;
+    delay (500) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/blink.c b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.c
new file mode 100644
index 0000000000000000000000000000000000000000..62b694a7cf29b7eb261faae7d7956d34ec6d3d8b
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.c
@@ -0,0 +1,50 @@
+/*
+ * blink.c:
+ *	Simple "blink" test for the Quick2Wire interface board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+
+#define	LED	1
+
+int main (void)
+{
+
+// Enable the on-goard GPIO
+
+  wiringPiSetup () ;
+
+  printf ("Raspberry Pi - Quick2Wire Mainboard LED Blink Test\n") ;
+
+  pinMode (LED, OUTPUT) ;
+
+  for (;;)
+  {
+    digitalWrite (LED, HIGH) ;
+    delay (500) ;
+    digitalWrite (LED, LOW) ;
+    delay (500) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/blink.sh b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.sh
new file mode 100755
index 0000000000000000000000000000000000000000..2dee6c736702d4d8d59cfd9cc83b8546612e2197
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/blink.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# blink.sh:
+#	Standard "blink" program in wiringPi. Blinks an LED connected
+#	to the LED on the Quick2Wire board
+#
+# Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+#######################################################################
+# This file is part of wiringPi:
+#	https://projects.drogon.net/raspberry-pi/wiringpi/
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#######################################################################
+
+# LED Pin - wiringPi pin 1 is BCM_GPIO 18.
+
+LED=1
+
+gpio mode $LED out
+
+while true; do
+  gpio write $LED 1
+  sleep 0.5
+  gpio write $LED 0
+  sleep 0.5
+done
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/bright.c b/modules/catkin_ws/src/wiringPi/examples/q2w/bright.c
new file mode 100644
index 0000000000000000000000000000000000000000..231883416a6200d09cdf3158da7b791c6a9a6d01
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/bright.c
@@ -0,0 +1,59 @@
+/*
+ * bright.c:
+ *	Vary the Q2W LED brightness with the analog card
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+#include <pcf8591.h>
+
+#define	LED		  1
+#define Q2W_ABASE       120
+
+int main (void)
+{
+  int value ;
+
+// Enable the on-goard GPIO
+
+  wiringPiSetup () ;
+
+// Add in the pcf8591 on the q2w board
+
+  pcf8591Setup (Q2W_ABASE, 0x48) ;
+
+  printf ("Raspberry Pi - Quick2Wire Analog Test\n") ;
+
+// Setup the LED
+
+  pinMode  (LED, PWM_OUTPUT) ;
+  pwmWrite (LED, 0) ;
+
+  for (;;)
+  {
+    value = analogRead  (Q2W_ABASE + 0) ;
+    pwmWrite (LED, value * 4) ;
+    delay (10) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/button.c b/modules/catkin_ws/src/wiringPi/examples/q2w/button.c
new file mode 100644
index 0000000000000000000000000000000000000000..1781f02fdad4e16cdc72b080289e6d5d68898d6f
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/button.c
@@ -0,0 +1,63 @@
+/*
+ * button.c:
+ *	Simple button test for the Quick2Wire interface board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+
+#define	BUTTON	0
+#define	LED1	1
+#define	LED2	7
+
+int main (void)
+{
+
+// Enable the on-goard GPIO
+
+  wiringPiSetup () ;
+
+  printf ("Raspberry Pi - Quick2Wire Mainboard Button & LED Test\n") ;
+
+  pinMode (BUTTON, INPUT) ;
+  pinMode (LED1, OUTPUT) ;
+  pinMode (LED2, OUTPUT) ;
+
+  digitalWrite (LED1, HIGH) ;		// On-board LED on
+  digitalWrite (LED2, LOW) ;		// 2nd LED off
+
+  for (;;)
+  {
+    if (digitalRead (BUTTON) == HIGH)	// Swap LED states
+    {
+      digitalWrite (LED1, LOW) ;
+      digitalWrite (LED2, HIGH) ;
+      while (digitalRead (BUTTON) == HIGH)
+	delay (1) ;
+      digitalWrite (LED1, HIGH) ;
+      digitalWrite (LED2, LOW) ;
+    }
+    delay (1) ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/q2w/volts.c b/modules/catkin_ws/src/wiringPi/examples/q2w/volts.c
new file mode 100644
index 0000000000000000000000000000000000000000..e0910933feca9859ae90781aa9150ee3a8fe0f80
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/q2w/volts.c
@@ -0,0 +1,62 @@
+/*
+ * volts.c:
+ *	Read in all 4 analogs on the Q2W analog board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <wiringPi.h>
+#include <pcf8591.h>
+
+#define	LED		1
+#define Q2W_ABASE       120
+
+int main (void)
+{
+  int value, pin ;
+
+// Enable the on-goard GPIO
+
+  wiringPiSetup () ;
+
+  pinMode (LED, OUTPUT) ;	// On-board LED
+
+// Add in the pcf8591 on the q2w board
+
+  pcf8591Setup (Q2W_ABASE, 0x48) ;
+
+  printf ("Raspberry Pi - Quick2Wire Voltmeter\n") ;
+
+  for (;;)
+  {
+    for (pin = 0 ; pin < 4 ; ++pin)
+    {
+      value = analogRead  (Q2W_ABASE + pin) ;
+      printf ("  %5.2f", (double)value * 3.3 / 255.0) ;
+    }
+    printf ("\r") ; fflush (stdout) ;
+
+    delay (100) ;
+    digitalWrite (LED, !digitalRead (LED)) ;	// Flicker the LED
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/rht03.c b/modules/catkin_ws/src/wiringPi/examples/rht03.c
new file mode 100644
index 0000000000000000000000000000000000000000..566e954c4ac3fb1de8e17ad846b91335f1c865ff
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/rht03.c
@@ -0,0 +1,69 @@
+/*
+ * rht03.c:
+ *	Driver for the MaxDetect series sensors
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+
+#include <wiringPi.h>
+#include <maxdetect.h>
+
+#define	RHT03_PIN	0
+
+/*
+ ***********************************************************************
+ * The main program
+ ***********************************************************************
+ */
+
+int main (void)
+{
+  int temp, rh ;
+  int newTemp, newRh ;
+
+  temp = rh = newTemp = newRh = 0 ;
+
+  wiringPiSetup () ;
+  piHiPri       (55) ;
+
+  for (;;)
+  {
+    delay (100) ;
+
+    if (!readRHT03 (RHT03_PIN, &newTemp, &newRh))
+      continue ;
+
+    if ((temp != newTemp) || (rh != newRh))
+    {
+      temp = newTemp ;
+      rh   = newRh ;
+      if ((temp & 0x8000) != 0)	// Negative
+      {
+	temp &= 0x7FFF ;
+	temp = -temp ;
+      }
+      printf ("Temp: %5.1f, RH: %5.1f%%\n", temp / 10.0, rh / 10.0) ;
+    }
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/serialRead.c b/modules/catkin_ws/src/wiringPi/examples/serialRead.c
new file mode 100644
index 0000000000000000000000000000000000000000..9ee11ac290938cb7a1a1006b64319e6b1fb5f4a7
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/serialRead.c
@@ -0,0 +1,48 @@
+/*
+ * serial.c:
+ *	Example program to read bytes from the Serial line
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <wiringSerial.h>
+
+int main ()
+{
+  int fd ;
+
+  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)
+  {
+    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+
+// Loop, getting and printing characters
+
+  for (;;)
+  {
+    putchar (serialGetchar (fd)) ;
+    fflush (stdout) ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/serialTest.c b/modules/catkin_ws/src/wiringPi/examples/serialTest.c
new file mode 100644
index 0000000000000000000000000000000000000000..0d6da5f08c752cf09e0e23792affdfc2eafa52eb
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/serialTest.c
@@ -0,0 +1,75 @@
+/*
+ * serialTest.c:
+ *	Very simple program to test the serial port. Expects
+ *	the port to be looped back to itself
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <wiringPi.h>
+#include <wiringSerial.h>
+
+int main ()
+{
+  int fd ;
+  int count ;
+  unsigned int nextTime ;
+
+  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)
+  {
+    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+
+  if (wiringPiSetup () == -1)
+  {
+    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+
+  nextTime = millis () + 300 ;
+
+  for (count = 0 ; count < 256 ; )
+  {
+    if (millis () > nextTime)
+    {
+      printf ("\nOut: %3d: ", count) ;
+      fflush (stdout) ;
+      serialPutchar (fd, count) ;
+      nextTime += 300 ;
+      ++count ;
+    }
+
+    delay (3) ;
+
+    while (serialDataAvail (fd))
+    {
+      printf (" -> %3d", serialGetchar (fd)) ;
+      fflush (stdout) ;
+    }
+  }
+
+  printf ("\n") ;
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/servo.c b/modules/catkin_ws/src/wiringPi/examples/servo.c
new file mode 100644
index 0000000000000000000000000000000000000000..aa1ab05245293a12254832bef6083af957021e8b
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/servo.c
@@ -0,0 +1,57 @@
+/*
+ * servo.c:
+ *	Test of the softServo code.
+ *	Do not use this code - use the servoBlaster kernel module instead
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <wiringPi.h>
+#include <softServo.h>
+
+int main ()
+{
+  if (wiringPiSetup () == -1)
+  {
+    fprintf (stdout, "oops: %s\n", strerror (errno)) ;
+    return 1 ;
+  }
+
+  softServoSetup (0, 1, 2, 3, 4, 5, 6, 7) ;
+
+  softServoWrite (0,  0) ;
+/*
+  softServoWrite (1, 1000) ;
+  softServoWrite (2, 1100) ;
+  softServoWrite (3, 1200) ;
+  softServoWrite (4, 1300) ;
+  softServoWrite (5, 1400) ;
+  softServoWrite (6, 1500) ;
+  softServoWrite (7, 2200) ;
+*/
+
+  for (;;)
+    delay (10) ;
+
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/softPwm.c b/modules/catkin_ws/src/wiringPi/examples/softPwm.c
new file mode 100644
index 0000000000000000000000000000000000000000..11f7ad0a85537423b6947265a9f660e4060b9753
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/softPwm.c
@@ -0,0 +1,89 @@
+/*
+ * softPwm.c:
+ *	Test of the software PWM driver. Needs 8 LEDs connected
+ *	to the Pi - e.g. Ladder board.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <wiringPi.h>
+#include <softPwm.h>
+
+#define RANGE		100
+#define	NUM_LEDS	  8
+
+int ledMap [NUM_LEDS] = { 0, 1, 2, 3, 4, 5, 6, 7 } ;
+
+int values [NUM_LEDS] = { 0, 25, 50, 75, 100, 75, 50, 25 } ;
+
+int main ()
+{
+  int i, j ;
+  char buf [80] ;
+
+  wiringPiSetup ()  ;
+
+  for (i = 0 ; i < NUM_LEDS ; ++i)
+  {
+    softPwmCreate (ledMap [i], 0, RANGE) ;
+    printf ("%3d, %3d, %3d\n", i, ledMap [i], values [i]) ;
+  }
+
+  fgets (buf, 80, stdin) ;
+
+// Bring all up one by one:
+
+  for (i = 0 ; i < NUM_LEDS ; ++i)
+    for (j = 0 ; j <= 100 ; ++j)
+    {
+      softPwmWrite (ledMap [i], j) ;
+      delay (10) ;
+    }
+
+  fgets (buf, 80, stdin) ;
+
+// All Down
+
+  for (i = 100 ; i > 0 ; --i)
+  {
+    for (j = 0 ; j < NUM_LEDS ; ++j)
+      softPwmWrite (ledMap [j], i) ;
+    delay (10) ;
+  }
+
+  fgets (buf, 80, stdin) ;
+
+  for (;;)
+  {
+    for (i = 0 ; i < NUM_LEDS ; ++i)
+      softPwmWrite (ledMap [i], values [i]) ;
+
+    delay (50) ;
+
+    i = values [0] ;
+    for (j = 0 ; j < NUM_LEDS - 1 ; ++j)
+      values [j] = values [j + 1] ;
+    values [NUM_LEDS - 1] = i ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/softTone.c b/modules/catkin_ws/src/wiringPi/examples/softTone.c
new file mode 100644
index 0000000000000000000000000000000000000000..2f46783e9ac915e451b21b687f33da8d19dd050c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/softTone.c
@@ -0,0 +1,54 @@
+/*
+ * softTone.c:
+ *	Test of the softTone module in wiringPi
+ *	Plays a scale out on pin 3 - connect pizeo disc to pin 3 & 0v
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+#include <wiringPi.h>
+#include <softTone.h>
+
+#define	PIN	3
+
+int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 } ;
+
+int main ()
+{
+  int i ;
+
+  wiringPiSetup () ;
+
+  softToneCreate (PIN) ;
+
+  for (;;)
+  {
+    for (i = 0 ; i < 8 ; ++i)
+    {
+      printf ("%3d\n", i) ;
+      softToneWrite (PIN, scale [i]) ;
+      delay (500) ;
+    }
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/speed.c b/modules/catkin_ws/src/wiringPi/examples/speed.c
new file mode 100644
index 0000000000000000000000000000000000000000..0a42b36291473907b133c0e67967900a0938eada
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/speed.c
@@ -0,0 +1,95 @@
+/*
+ * speed.c:
+ *	Simple program to measure the speed of the various GPIO
+ *	access mechanisms.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson. <projects@drogon.net>
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#define	FAST_COUNT	10000000
+#define	SLOW_COUNT	 1000000
+#define	PASSES		       5
+
+void speedTest (int pin, int maxCount)
+{
+  int count, sum, perSec, i ;
+  unsigned int start, end ;
+
+  sum = 0 ;
+
+  for (i = 0 ; i < PASSES ; ++i)
+  {
+    start = millis () ;
+    for (count = 0 ; count < maxCount ; ++count)
+      digitalWrite (pin, 1) ;
+    end = millis () ;
+    printf (" %6d", end - start) ;
+    fflush (stdout) ;
+    sum += (end - start) ;
+  }
+
+  digitalWrite (pin, 0) ;
+  printf (". Av: %6dmS", sum / PASSES) ;
+  perSec = (int)(double)maxCount / (double)((double)sum / (double)PASSES) * 1000.0 ;
+  printf (": %7d/sec\n", perSec) ;
+}
+
+
+int main (void)
+{
+  printf ("Raspberry Pi wiringPi GPIO speed test program\n") ;
+  printf ("=============================================\n") ;
+
+// Start the standard way
+
+  printf ("\nNative wiringPi method: (%8d iterations)\n", FAST_COUNT) ;
+  wiringPiSetup () ;
+  pinMode (0, OUTPUT) ;
+  speedTest (0, FAST_COUNT) ;
+
+// GPIO
+
+  printf ("\nNative GPIO method: (%8d iterations)\n", FAST_COUNT) ;
+  wiringPiSetupGpio () ;
+  pinMode (17, OUTPUT) ;
+  speedTest (17, FAST_COUNT) ;
+
+// Phys
+
+  printf ("\nPhysical pin GPIO method: (%8d iterations)\n", FAST_COUNT) ;
+  wiringPiSetupPhys () ;
+  pinMode (11, OUTPUT) ;
+  speedTest (11, FAST_COUNT) ;
+
+// Switch to SYS mode:
+
+  system ("/usr/local/bin/gpio export 17 out") ;
+  printf ("\n/sys/class/gpio method: (%8d iterations)\n", SLOW_COUNT) ;
+  wiringPiSetupSys () ;
+  speedTest (17, SLOW_COUNT) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/spiSpeed.c b/modules/catkin_ws/src/wiringPi/examples/spiSpeed.c
new file mode 100644
index 0000000000000000000000000000000000000000..0208f0a2bb9da6ea98c637b53e84c9454d94c8dc
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/spiSpeed.c
@@ -0,0 +1,118 @@
+/*
+ * spiSpeed.c:
+ *	Code to measure the SPI speed/latency.
+ *	Copyright (c) 2014 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+//#include <fcntl.h>
+//#include <sys/ioctl.h>
+//#include <linux/spi/spidev.h>
+
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+
+#define	TRUE	(1==1)
+#define	FALSE	(!TRUE)
+
+#define	SPI_CHAN		0
+#define	NUM_TIMES		100
+#define	MAX_SIZE		(1024*1024)
+
+static int myFd ;
+
+
+void spiSetup (int speed)
+{
+  if ((myFd = wiringPiSPISetup (SPI_CHAN, speed)) < 0)
+  {
+    fprintf (stderr, "Can't open the SPI bus: %s\n", strerror (errno)) ;
+    exit (EXIT_FAILURE) ;
+  }
+}
+
+
+int main (void)
+{
+  int speed, times, size ;
+  unsigned int start, end ;
+  int spiFail ;
+  unsigned char *myData ;
+  double timePerTransaction, perfectTimePerTransaction, dataSpeed ;
+
+  if ((myData = malloc (MAX_SIZE)) == NULL)
+  {
+    fprintf (stderr, "Unable to allocate buffer: %s\n", strerror (errno)) ;
+    exit (EXIT_FAILURE) ;
+  }
+
+  wiringPiSetup () ;
+
+  for (speed = 1 ; speed <= 32 ; speed *= 2)
+  {
+    printf ("+-------+--------+----------+----------+-----------+------------+\n") ;
+    printf ("|   MHz |   Size | mS/Trans |      TpS |    Mb/Sec | Latency mS |\n") ;
+    printf ("+-------+--------+----------+----------+-----------+------------+\n") ;
+
+    spiFail = FALSE ;
+    spiSetup (speed * 1000000) ;
+    for (size = 1 ; size <= MAX_SIZE ; size *= 2)
+    {
+      printf ("| %5d | %6d ", speed, size) ;
+
+      start = millis () ;
+      for (times = 0 ; times < NUM_TIMES ; ++times)
+	if (wiringPiSPIDataRW (SPI_CHAN, myData, size) == -1)
+	{
+	  printf ("SPI failure: %s\n", strerror (errno)) ;
+	  spiFail = TRUE ;
+	  break ;
+	}
+      end = millis () ;
+
+      if (spiFail)
+	break ;
+
+      timePerTransaction        = ((double)(end - start) / (double)NUM_TIMES) / 1000.0 ;
+      dataSpeed                 =  (double)(size * 8)    / (1024.0 * 1024.0) / timePerTransaction  ;
+      perfectTimePerTransaction = ((double)(size * 8))   / ((double)(speed * 1000000)) ;
+
+      printf ("| %8.3f ", timePerTransaction * 1000.0) ;
+      printf ("| %8.1f ", 1.0 / timePerTransaction) ;
+      printf ("| %9.5f ", dataSpeed) ;
+      printf ("|   %8.5f ", (timePerTransaction - perfectTimePerTransaction) * 1000.0) ;
+      printf ("|\n") ;
+
+    }
+
+    close (myFd) ;
+    printf ("+-------+--------+----------+----------+-----------+------------+\n") ;
+    printf ("\n") ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/examples/wfi.c b/modules/catkin_ws/src/wiringPi/examples/wfi.c
new file mode 100644
index 0000000000000000000000000000000000000000..6bb68927edd4503bfd5057b57addfc989f81b49a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/examples/wfi.c
@@ -0,0 +1,161 @@
+/*
+ * wfi.c:
+ *	Wait for Interrupt test program
+ *
+ *	This program demonstrates the use of the waitForInterrupt()
+ *	function in wiringPi. It listens to a button input on
+ *	BCM_GPIO pin 17 (wiringPi pin 0)
+ *
+ *	The biggest issue with this method is that it really only works
+ *	well in Sys mode.
+ *
+ *	Jan 2013: This way of doing things is sort of deprecated now, see
+ *	the wiringPiISR() function instead and the isr.c test program here.
+ *
+ * Copyright (c) 2012-2013 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <wiringPi.h>
+
+// A 'key' which we can lock and unlock - values are 0 through 3
+//	This is interpreted internally as a pthread_mutex by wiringPi
+//	which is hiding some of that to make life simple.
+
+#define	COUNT_KEY	0
+
+// What BCM_GPIO input are we using?
+
+#define	BUTTON_PIN	17
+
+// Debounce time in mS
+
+#define	DEBOUNCE_TIME	100
+
+
+// globalCounter:
+//	Global variable to count interrupts
+//	Should be declared volatile to make sure the compiler doesn't cache it.
+
+static volatile int globalCounter = 0 ;
+
+
+/*
+ * waitForIt:
+ *	This is a thread created using the wiringPi simplified threading
+ *	mechanism. It will wait on an interrupt on the button and increment
+ *	a counter.
+ *********************************************************************************
+ */
+
+PI_THREAD (waitForIt)
+{
+  int state = 0 ;
+  int debounceTime = 0 ;
+
+  (void)piHiPri (10) ;	// Set this thread to be high priority
+
+  for (;;)
+  {
+    if (waitForInterrupt (BUTTON_PIN, -1) > 0)	// Got it
+    {
+// Bouncing?
+
+      if (millis () < debounceTime)
+      {
+	debounceTime = millis () + DEBOUNCE_TIME ;
+	continue ;
+      }
+
+// We have a valid one
+
+      state ^= 1 ;
+
+      piLock (COUNT_KEY) ;
+	++globalCounter ;
+      piUnlock (COUNT_KEY) ;
+
+// Wait for key to be released
+
+      while (digitalRead (BUTTON_PIN) == LOW)
+	delay (1) ;
+
+      debounceTime = millis () + DEBOUNCE_TIME ;
+    }
+  }
+}
+
+
+/*
+ * setup:
+ *	Demo a crude but effective way to initialise the hardware
+ *********************************************************************************
+ */
+
+void setup (void)
+{
+
+// Use the gpio program to initialise the hardware
+//	(This is the crude, but effective)
+
+  system ("gpio edge 17 falling") ;
+
+// Setup wiringPi
+
+  wiringPiSetupSys () ;
+
+// Fire off our interrupt handler
+
+  piThreadCreate (waitForIt) ;
+
+}
+
+
+/*
+ * main
+ *********************************************************************************
+ */
+
+int main (void)
+{
+  int lastCounter = 0 ;
+  int myCounter   = 0 ;
+
+  setup () ;
+
+  for (;;)
+  {
+    printf ("Waiting ... ") ; fflush (stdout) ;
+
+    while (myCounter == lastCounter)
+    {
+      piLock (COUNT_KEY) ;
+	myCounter = globalCounter ;
+      piUnlock (COUNT_KEY) ;
+      delay (500) ;
+    }
+
+    printf (" Done. myCounter: %5d\n", myCounter) ;
+    lastCounter = myCounter ;
+  }
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/gpio/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/gpio/COPYING.LESSER
new file mode 100644
index 0000000000000000000000000000000000000000..65c5ca88a67c30becee01c5a8816d964b03862f9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/COPYING.LESSER
@@ -0,0 +1,165 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/modules/catkin_ws/src/wiringPi/gpio/Makefile b/modules/catkin_ws/src/wiringPi/gpio/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..37b4887dcba284e13cc8ececca945e0a076d709d
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/Makefile
@@ -0,0 +1,87 @@
+#
+# Makefile:
+#	The gpio command:
+#	  A swiss-army knige of GPIO shenanigans.
+#	https://projects.drogon.net/wiring-pi
+#
+#	Copyright (c) 2012-2013 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	Wiring Compatable library for the Raspberry Pi
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+DESTDIR=/usr
+PREFIX=/local
+
+#DEBUG	= -g -O0
+DEBUG	= -O2
+CC	= gcc
+INCLUDE	= -I$(DESTDIR)$(PREFIX)/include
+CFLAGS	= $(DEBUG) -Wall $(INCLUDE) -Winline -pipe
+
+LDFLAGS	= -L$(DESTDIR)$(PREFIX)/lib
+LIBS    = -lwiringPi -lwiringPiDev -lpthread -lm
+
+# May not need to  alter anything below this line
+###############################################################################
+
+SRC	=	gpio.c extensions.c readall.c pins.c
+
+OBJ	=	$(SRC:.c=.o)
+
+all:		gpio
+
+gpio:	$(OBJ)
+	@echo [Link]
+	@$(CC) -o $@ $(OBJ) $(LDFLAGS) $(LIBS)
+	
+.c.o:
+	@echo [Compile] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+.PHONY:	clean
+clean:
+	@echo "[Clean]"
+	@rm -f $(OBJ) gpio *~ core tags *.bak
+
+.PHONY:	tags
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+.PHONY:	install
+install:
+	@echo "[Install]"
+	@cp gpio		$(DESTDIR)$(PREFIX)/bin
+	@chown root.root	$(DESTDIR)$(PREFIX)/bin/gpio
+	@chmod 4755		$(DESTDIR)$(PREFIX)/bin/gpio
+	@mkdir -p		$(DESTDIR)$(PREFIX)/man/man1
+	@cp gpio.1		$(DESTDIR)$(PREFIX)/man/man1
+
+.PHONY:	uninstall
+uninstall:
+	@echo "[UnInstall]"
+	@rm -f $(DESTDIR)$(PREFIX)/bin/gpio
+	@rm -f $(DESTDIR)$(PREFIX)/man/man1/gpio.1
+
+.PHONY:	depend
+depend:
+	makedepend -Y $(SRC)
+
+# DO NOT DELETE
+
+gpio.o: extensions.h
+extensions.o: extensions.h
diff --git a/modules/catkin_ws/src/wiringPi/gpio/extensions.c b/modules/catkin_ws/src/wiringPi/gpio/extensions.c
new file mode 100644
index 0000000000000000000000000000000000000000..96d6255f7930f5e75daaf0a3d77ade5ba9cd5c04
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/extensions.c
@@ -0,0 +1,700 @@
+/*
+ * extensions.c:
+ *	Part of the GPIO program to test, peek, poke and otherwise
+ *	noodle with the GPIO hardware on the Raspberry Pi.
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+#include <wiringPi.h>
+
+#include <mcp23008.h>
+#include <mcp23016.h>
+#include <mcp23017.h>
+#include <mcp23s08.h>
+#include <mcp23s17.h>
+#include <sr595.h>
+#include <pcf8591.h>
+#include <pcf8574.h>
+#include <max31855.h>
+#include <max5322.h>
+#include <mcp3002.h>
+#include <mcp3004.h>
+#include <mcp4802.h>
+#include <mcp3422.h>
+#include <sn3218.h>
+#include <drcSerial.h>
+
+#include "extensions.h"
+
+extern int wiringPiDebug ;
+
+#ifndef TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+// Local structure to hold details
+
+struct extensionFunctionStruct
+{
+  const char *name ;
+  int	(*function)(char *progName, int pinBase, char *params) ;
+} ;
+
+
+/*
+ * extractInt:
+ *	Check & return an integer at the given location (prefixed by a :)
+ *********************************************************************************
+ */
+
+static char *extractInt (char *progName, char *p, int *num)
+{
+  if (*p != ':')
+  {
+    fprintf (stderr, "%s: colon expected\n", progName) ;
+    return NULL ;
+  }
+
+  ++p ;
+
+  if (!isdigit (*p))
+  {
+    fprintf (stderr, "%s: digit expected\n", progName) ;
+    return NULL ;
+  }
+
+  *num = strtol (p, NULL, 0) ;
+  while (isdigit (*p))
+    ++p ;
+
+  return p ;
+}
+
+
+/*
+ * extractStr:
+ *	Check & return a string at the given location (prefixed by a :)
+ *********************************************************************************
+ */
+
+static char *extractStr (char *progName, char *p, char **str)
+{
+  char *q, *r ;
+
+  if (*p != ':')
+  {
+    fprintf (stderr, "%s: colon expected\n", progName) ;
+    return NULL ;
+  }
+
+  ++p ;
+
+  if (!isprint (*p))
+  {
+    fprintf (stderr, "%s: character expected\n", progName) ;
+    return NULL ;
+  }
+
+  q = p ;
+  while ((*q != 0) && (*q != ':'))
+    ++q ;
+
+  *str = r = calloc (q - p + 2, 1) ;	// Zeros it
+
+  while (p != q)
+    *r++ = *p++ ;
+    
+  return p ;
+}
+
+
+
+/*
+ * doExtensionMcp23008:
+ *	MCP23008 - 8-bit I2C GPIO expansion chip
+ *	mcp23002:base:i2cAddr
+ *********************************************************************************
+ */
+
+static int doExtensionMcp23008 (char *progName, int pinBase, char *params)
+{
+  int i2c ;
+
+  if ((params = extractInt (progName, params, &i2c)) == NULL)
+    return FALSE ;
+
+  if ((i2c < 0x03) || (i2c > 0x77))
+  {
+    fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
+    return FALSE ;
+  }
+
+  mcp23008Setup (pinBase, i2c) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp23016:
+ *	MCP230016- 16-bit I2C GPIO expansion chip
+ *	mcp23016:base:i2cAddr
+ *********************************************************************************
+ */
+
+static int doExtensionMcp23016 (char *progName, int pinBase, char *params)
+{
+  int i2c ;
+
+  if ((params = extractInt (progName, params, &i2c)) == NULL)
+    return FALSE ;
+
+  if ((i2c < 0x03) || (i2c > 0x77))
+  {
+    fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
+    return FALSE ;
+  }
+
+  mcp23016Setup (pinBase, i2c) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp23017:
+ *	MCP230017- 16-bit I2C GPIO expansion chip
+ *	mcp23017:base:i2cAddr
+ *********************************************************************************
+ */
+
+static int doExtensionMcp23017 (char *progName, int pinBase, char *params)
+{
+  int i2c ;
+
+  if ((params = extractInt (progName, params, &i2c)) == NULL)
+    return FALSE ;
+
+  if ((i2c < 0x03) || (i2c > 0x77))
+  {
+    fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
+    return FALSE ;
+  }
+
+  mcp23017Setup (pinBase, i2c) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp23s08:
+ *	MCP23s08 - 8-bit SPI GPIO expansion chip
+ *	mcp23s08:base:spi:port
+ *********************************************************************************
+ */
+
+static int doExtensionMcp23s08 (char *progName, int pinBase, char *params)
+{
+  int spi, port ;
+
+  if ((params = extractInt (progName, params, &spi)) == NULL)
+    return FALSE ;
+
+  if ((spi < 0) || (spi > 1))
+  {
+    fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ;
+    return FALSE ;
+  }
+
+  if ((params = extractInt (progName, params, &port)) == NULL)
+    return FALSE ;
+
+  if ((port < 0) || (port > 7))
+  {
+    fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ;
+    return FALSE ;
+  }
+
+  mcp23s08Setup (pinBase, spi, port) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp23s17:
+ *	MCP23s17 - 16-bit SPI GPIO expansion chip
+ *	mcp23s17:base:spi:port
+ *********************************************************************************
+ */
+
+static int doExtensionMcp23s17 (char *progName, int pinBase, char *params)
+{
+  int spi, port ;
+
+  if ((params = extractInt (progName, params, &spi)) == NULL)
+    return FALSE ;
+
+  if ((spi < 0) || (spi > 1))
+  {
+    fprintf (stderr, "%s: SPI address (%d) out of range\n", progName, spi) ;
+    return FALSE ;
+  }
+
+  if ((params = extractInt (progName, params, &port)) == NULL)
+    return FALSE ;
+
+  if ((port < 0) || (port > 7))
+  {
+    fprintf (stderr, "%s: port address (%d) out of range\n", progName, port) ;
+    return FALSE ;
+  }
+
+  mcp23s17Setup (pinBase, spi, port) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionSr595:
+ *	Shift Register 74x595
+ *	sr595:base:pins:data:clock:latch
+ *********************************************************************************
+ */
+
+static int doExtensionSr595 (char *progName, int pinBase, char *params)
+{
+  int pins, data, clock, latch ;
+
+// Extract pins
+
+  if ((params = extractInt (progName, params, &pins)) == NULL)
+    return FALSE ;
+
+  if ((pins < 8) || (pins > 32))
+  {
+    fprintf (stderr, "%s: pin count (%d) out of range - 8-32 expected.\n", progName, pins) ;
+    return FALSE ;
+  }
+
+  if ((params = extractInt (progName, params, &data)) == NULL)
+    return FALSE ;
+
+  if ((params = extractInt (progName, params, &clock)) == NULL)
+    return FALSE ;
+
+  if ((params = extractInt (progName, params, &latch)) == NULL)
+    return FALSE ;
+
+  sr595Setup (pinBase, pins, data, clock, latch) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionPcf8574:
+ *	Digital IO (Crude!)
+ *	pcf8574:base:i2cAddr
+ *********************************************************************************
+ */
+
+static int doExtensionPcf8574 (char *progName, int pinBase, char *params)
+{
+  int i2c ;
+
+  if ((params = extractInt (progName, params, &i2c)) == NULL)
+    return FALSE ;
+
+  if ((i2c < 0x03) || (i2c > 0x77))
+  {
+    fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
+    return FALSE ;
+  }
+
+  pcf8574Setup (pinBase, i2c) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionPcf8591:
+ *	Analog IO
+ *	pcf8591:base:i2cAddr
+ *********************************************************************************
+ */
+
+static int doExtensionPcf8591 (char *progName, int pinBase, char *params)
+{
+  int i2c ;
+
+  if ((params = extractInt (progName, params, &i2c)) == NULL)
+    return FALSE ;
+
+  if ((i2c < 0x03) || (i2c > 0x77))
+  {
+    fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
+    return FALSE ;
+  }
+
+  pcf8591Setup (pinBase, i2c) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMax31855:
+ *	Analog IO
+ *	max31855:base:spiChan
+ *********************************************************************************
+ */
+
+static int doExtensionMax31855 (char *progName, int pinBase, char *params)
+{
+  int spi ;
+
+  if ((params = extractInt (progName, params, &spi)) == NULL)
+    return FALSE ;
+
+  if ((spi < 0) || (spi > 1))
+  {
+    fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
+    return FALSE ;
+  }
+
+  max31855Setup (pinBase, spi) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp3002:
+ *	Analog IO
+ *	mcp3002:base:spiChan
+ *********************************************************************************
+ */
+
+static int doExtensionMcp3002 (char *progName, int pinBase, char *params)
+{
+  int spi ;
+
+  if ((params = extractInt (progName, params, &spi)) == NULL)
+    return FALSE ;
+
+  if ((spi < 0) || (spi > 1))
+  {
+    fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
+    return FALSE ;
+  }
+
+  mcp3002Setup (pinBase, spi) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp3004:
+ *	Analog IO
+ *	mcp3004:base:spiChan
+ *********************************************************************************
+ */
+
+static int doExtensionMcp3004 (char *progName, int pinBase, char *params)
+{
+  int spi ;
+
+  if ((params = extractInt (progName, params, &spi)) == NULL)
+    return FALSE ;
+
+  if ((spi < 0) || (spi > 1))
+  {
+    fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
+    return FALSE ;
+  }
+
+  mcp3004Setup (pinBase, spi) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMax5322:
+ *	Analog O
+ *	max5322:base:spiChan
+ *********************************************************************************
+ */
+
+static int doExtensionMax5322 (char *progName, int pinBase, char *params)
+{
+  int spi ;
+
+  if ((params = extractInt (progName, params, &spi)) == NULL)
+    return FALSE ;
+
+  if ((spi < 0) || (spi > 1))
+  {
+    fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
+    return FALSE ;
+  }
+
+  max5322Setup (pinBase, spi) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp4802:
+ *	Analog IO
+ *	mcp4802:base:spiChan
+ *********************************************************************************
+ */
+
+static int doExtensionMcp4802 (char *progName, int pinBase, char *params)
+{
+  int spi ;
+
+  if ((params = extractInt (progName, params, &spi)) == NULL)
+    return FALSE ;
+
+  if ((spi < 0) || (spi > 1))
+  {
+    fprintf (stderr, "%s: SPI channel (%d) out of range\n", progName, spi) ;
+    return FALSE ;
+  }
+
+  mcp4802Setup (pinBase, spi) ;
+
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionSn3218:
+ *	Analog Output (LED Driver)
+ *	sn3218:base
+ *********************************************************************************
+ */
+
+static int doExtensionSn3218 (char *progName, int pinBase, char *params)
+{
+  sn3218Setup (pinBase) ;
+  return TRUE ;
+}
+
+
+/*
+ * doExtensionMcp3422:
+ *	Analog IO
+ *	mcp3422:base:i2cAddr
+ *********************************************************************************
+ */
+
+static int doExtensionMcp3422 (char *progName, int pinBase, char *params)
+{
+  int i2c, sampleRate, gain ;
+
+  if ((params = extractInt (progName, params, &i2c)) == NULL)
+    return FALSE ;
+
+  if ((i2c < 0x03) || (i2c > 0x77))
+  {
+    fprintf (stderr, "%s: i2c address (0x%X) out of range\n", progName, i2c) ;
+    return FALSE ;
+  }
+
+  if ((params = extractInt (progName, params, &sampleRate)) == NULL)
+    return FALSE ;
+
+  if ((sampleRate < 0) || (sampleRate > 3))
+  {
+    fprintf (stderr, "%s: sample rate (%d) out of range\n", progName, sampleRate) ;
+    return FALSE ;
+  }
+
+  if ((params = extractInt (progName, params, &gain)) == NULL)
+    return FALSE ;
+
+  if ((gain < 0) || (gain > 3))
+  {
+    fprintf (stderr, "%s: gain (%d) out of range\n", progName, gain) ;
+    return FALSE ;
+  }
+
+  mcp3422Setup (pinBase, i2c, sampleRate, gain) ;
+
+  return TRUE ;
+}
+
+/*
+ * doExtensionDrcS:
+ *	Interface to a DRC Serial system
+ *	drcs:base:pins:serialPort:baud
+ *********************************************************************************
+ */
+
+static int doExtensionDrcS (char *progName, int pinBase, char *params)
+{
+  char *port ;
+  int pins, baud ;
+
+  if ((params = extractInt (progName, params, &pins)) == NULL)
+    return FALSE ;
+
+  if ((pins < 1) || (pins > 100))
+  {
+    fprintf (stderr, "%s: pins (%d) out of range (2-100)\n", progName, pins) ;
+    return FALSE ;
+  }
+  
+  if ((params = extractStr (progName, params, &port)) == NULL)
+    return FALSE ;
+
+  if (strlen (port) == 0)
+  {
+    fprintf (stderr, "%s: serial port device name required\n", progName) ;
+    return FALSE ;
+  }
+
+  if ((params = extractInt (progName, params, &baud)) == NULL)
+    return FALSE ;
+
+  if ((baud < 1) || (baud > 4000000))
+  {
+    fprintf (stderr, "%s: baud rate (%d) out of range\n", progName, baud) ;
+    return FALSE ;
+  }
+
+  drcSetupSerial (pinBase, pins, port, baud) ;
+
+  return TRUE ;
+}
+
+
+
+/*
+ * Function list
+ *********************************************************************************
+ */
+
+struct extensionFunctionStruct extensionFunctions [] = 
+{
+  { "mcp23008",		&doExtensionMcp23008 	},
+  { "mcp23016",		&doExtensionMcp23016 	},
+  { "mcp23017",		&doExtensionMcp23017 	},
+  { "mcp23s08",		&doExtensionMcp23s08 	},
+  { "mcp23s17",		&doExtensionMcp23s17 	},
+  { "sr595",		&doExtensionSr595	},
+  { "pcf8574",		&doExtensionPcf8574	},
+  { "pcf8591",		&doExtensionPcf8591	},
+  { "mcp3002",		&doExtensionMcp3002	},
+  { "mcp3004",		&doExtensionMcp3004	},
+  { "mcp4802",		&doExtensionMcp4802	},
+  { "mcp3422",		&doExtensionMcp3422	},
+  { "max31855",		&doExtensionMax31855	},
+  { "max5322",		&doExtensionMax5322	},
+  { "sn3218",		&doExtensionSn3218	},
+  { "drcs",		&doExtensionDrcS	},
+  { NULL,		NULL		 	},
+} ;
+
+
+/*
+ * doExtension:
+ *	Load in a wiringPi extension
+ *********************************************************************************
+ */
+
+int doExtension (char *progName, char *extensionData)
+{
+  char *p ;
+  char *extension = extensionData ;
+  struct extensionFunctionStruct *extensionFn ;
+  int pinBase = 0 ;
+
+// Get the extension extension name by finding the first colon
+
+  p = extension ;
+  while (*p != ':')
+  {
+    if (!*p)	// ran out of characters
+    {
+      fprintf (stderr, "%s: extension name not terminated by a colon\n", progName) ;
+      return FALSE ;
+    }
+    ++p ;
+  }
+
+  *p++ = 0 ;
+
+  if (!isdigit (*p))
+  {
+    fprintf (stderr, "%s: pinBase number expected after extension name\n", progName) ;
+    return FALSE ;
+  }
+
+  while (isdigit (*p))
+  {
+    if (pinBase > 1000000000)
+    {
+      fprintf (stderr, "%s: pinBase too large\n", progName) ;
+      return FALSE ;
+    }
+
+    pinBase = pinBase * 10 + (*p - '0') ;
+    ++p ;
+  }
+
+  if (pinBase < 64)
+  {
+    fprintf (stderr, "%s: pinBase (%d) too small. Minimum is 64.\n", progName, pinBase) ;
+    return FALSE ;
+  }
+
+// Search for extensions:
+
+  for (extensionFn = extensionFunctions ; extensionFn->name != NULL ; ++extensionFn)
+  {
+    if (strcmp (extensionFn->name, extension) == 0)
+      return extensionFn->function (progName, pinBase, p) ;
+  }
+
+  fprintf (stderr, "%s: extension %s not found\n", progName, extension) ;
+  return FALSE ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/gpio/extensions.h b/modules/catkin_ws/src/wiringPi/gpio/extensions.h
new file mode 100644
index 0000000000000000000000000000000000000000..5d2712348ca53f4596946f2c8223b92086ffa821
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/extensions.h
@@ -0,0 +1,26 @@
+/*
+ * extensions.h:
+ *	Part of the GPIO program to test, peek, poke and otherwise
+ *	noodle with the GPIO hardware on the Raspberry Pi.
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+extern int doExtension (char *progName, char *extensionData) ;
diff --git a/modules/catkin_ws/src/wiringPi/gpio/extensions.o b/modules/catkin_ws/src/wiringPi/gpio/extensions.o
new file mode 100644
index 0000000000000000000000000000000000000000..fd7d06e442a7d111f4cffe03ddef9d0b6dbb7fdb
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/gpio/extensions.o differ
diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio b/modules/catkin_ws/src/wiringPi/gpio/gpio
new file mode 100755
index 0000000000000000000000000000000000000000..477efde624dbf2ac47b5806040a14645817dabc4
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/gpio/gpio differ
diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio.1 b/modules/catkin_ws/src/wiringPi/gpio/gpio.1
new file mode 100644
index 0000000000000000000000000000000000000000..e7131c1c033820d37f095970b8b86fea3964e351
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/gpio.1
@@ -0,0 +1,371 @@
+.TH "GPIO" "March 2013" "Command-Line access to Raspberry Pi's GPIO"
+
+.SH NAME
+gpio \- Command-line access to Raspberry Pi's GPIO
+
+.SH SYNOPSIS
+.B gpio
+.B \-v
+.PP
+.B gpio
+.B [ \-g | \-1 ]
+.B mode/read/write/aread/awrite/wb/pwm/clock ...
+.PP
+.B gpio
+.B [ \-x extension:params ]
+.B mode/read/write/aread/awrite/pwm/pwmTone ...
+.PP
+.B gpio
+.B [ \-p ]
+.B read/write/toggle/wb
+.B ...
+.PP
+.B gpio
+.B readall/reset
+.PP
+.B gpio
+.B unexportall/exports
+.PP
+.B gpio
+.B export/edge/unexport
+.B ...
+.PP
+.B gpio
+.B wfi
+.B ...
+.PP
+.B gpio
+.B drive
+group value
+.PP
+.B gpio
+.B usbp
+high | low
+.PP
+.B gpio
+.B pwm-bal/pwm-ms
+.PP
+.B gpio
+.B pwmr
+range
+.PP
+.B gpio
+.B load \ i2c/spi ...
+.PP
+.B gpio
+.B gbr
+channel
+.PP
+.B gpio
+.B gbw
+channel value
+
+.SH DESCRIPTION
+
+.B GPIO
+is a swiss army knife of a command line tool to allow the user easy
+access to the GPIO pins on the Raspberry Pi and the SPI A/D and D/A
+converters on the Gertboard. It's designed for simple testing and
+diagnostic purposes, but can be used in shell scripts for general if
+somewhat slow control of the GPIO pins.
+
+It can also control the IO's on the PiFace IO board and load the SPI and I2C
+kernel modules if required.
+
+Additionally, it can be used to set the exports in the \fI/sys/class/gpio\fR
+system directory to allow subsequent programs to use the \fR/sys/class/gpio\fR
+interface without needing to be run as root.
+
+.SH OPTIONS
+
+.TP
+.B \-v
+Output the current version including the board revision of the Raspberry Pi.
+
+.TP
+.B \-g
+Use the BCM_GPIO pins numbers rather than wiringPi pin numbers.
+\fINote:\fR The BCM_GPIO pin numbers are always used with the 
+export and edge commands.
+
+.TP
+.B \-1
+Use the physical pin numbers rather than wiringPi pin numbers.
+\fINote:\fR that this applies to the P1 connector only. It is not possible to
+use pins on the Revision 2 P5 connector this way, and as with \-g the
+BCM_GPIO pin numbers are always used with the export and edge commands.
+
+.TP
+.B \-x extension
+This causes the named extension to be initialised. Extensions
+comprise of a name (e.g. mcp23017) followed by a colon, then the
+pin-base, then more optional parameters depending on the extension type.
+See the web page on http://wiringpi.com/the-gpio-utility/
+
+.TP
+.B \-p
+Use the PiFace interface board and its corresponding pin numbers. The PiFace
+will always appear at pin number 200 in the gpio command. You can assign any
+pin numbers you like in your own programs though.
+
+.TP
+.B read <pin>
+Read the digital value of the given pin and print 0 or 1 to represent the
+respective logic levels.
+
+.TP
+.B write <pin> <value>
+Write the given value (0 or 1) to the pin. You need to set the pin
+to output mode first.
+
+.TP
+.B aread <pin>
+Read the analog value of the given pin. This needs to be uses in
+conjunction with a -x flag to add in an extension that handles analog
+inputs.  respective logic levels.
+
+e.g. gpio -x mcp3002:200:0 aread 200
+
+will read the first analog input on an mcp3002 SPI ADC chip.
+
+.TP
+.B awrite <pin> <value>
+Write the analog value to the given pin. This needs to be used in
+conjunction with a -x flag to add in an extension that handles analog
+inputs.  respective logic levels.
+
+e.g. gpio -x mcp4802:200:0 awrite 200 128
+
+will write the value 128 to the first DAC port on an mcp4802 chip on
+the Pi's SPI bus 0.
+
+
+.TP
+.B wb <value>
+Write the given byte to the 8 main GPIO pins. You can prefix it with 0x
+to specify a hexadecimal number. You need to set pins to output mode
+first.
+
+.TP
+.B readall
+Output a table of all GPIO pins values. The values represent the actual values read
+if the pin is in input mode, or the last value written if the pin is in output
+mode.
+
+The readall command is usable with an extension module (via the -x parameter),
+but it's unable to determine pin modes or states, so will perform both a
+digital and analog read on each pin in-turn.
+
+.TP
+.B reset
+Resets the GPIO - As much as it's possible to do. All pins are set to
+input mode and all the internal pull-up/down resistors are disconnected
+(tristate mode).
+
+The reset command is usable with an extension module (via the -x parameter),
+but it's limited to turning the pin into input mode (if applicable) and
+removing any pull up/down resistor.
+
+.TP
+.B pwm <pin> <value>
+Write a PWM value (0-1023) to the given pin. The pin needs to be put
+into PWM mode first.
+
+.TP
+.B clock <pin> <frequency>
+Set the output frequency on the given pin. The pin needs to be put into
+clock mode first.
+
+.TP
+.B mode <pin> <mode>
+Set a pin into \fIinput\fR, \fIoutput\fR or \fIpwm\fR mode. Can also
+use the literals \fIup\fR, \fIdown\fR or \fItri\fR to set the internal
+pull-up, pull-down or tristate (off) controls.
+
+.TP
+.B unexportall
+Un-Export all the GPIO pins in the /sys/class/gpio directory.
+
+.TP
+.B exports
+Print a list (if any) of all the exported GPIO pins and their current values.
+
+.TP
+.B export
+Export a GPIO pin in the \fI/sys/class/gpio\fR directory. Use like the
+mode command above however only \fIin\fR and \fIout\fR are supported at
+this time. Note that the pin number is the \fBBCM_GPIO\fR number and
+not the wiringPi number.
+
+Once a GPIO pin has been exported, the \fBgpio\fR program changes the
+ownership of the \fI/sys/class/gpio/gpioX/value\fR and if present in
+later kernels, the \fI/sys/class/gpio/gpioX/edge\fR pseudo files to
+that of the user running the \fBgpio\fR program. This means that you
+can have a small script of gpio exports to setup the gpio pins as your
+program requires without the need to run anything as root, or with the
+sudo command.
+
+.TP
+.B edge
+This exports a GPIO pin in the \fI/sys/class/gpio\fR directory, set
+the direction to input and set the edge interrupt method to \fInone\fR,
+\fIrising\fR, \fIfalling\fR or \fIboth\fR.  Use like the export command
+above and note that \fBBCM_GPIO\fR pin number is used not not wiringPi pin
+numbering.
+
+Like the export commands above, ownership is set to that of the 
+calling user, allowing subsequent access from user programs without
+requiring root/sudo.
+
+.TP
+.B unexport
+Un-Export a GPIO pin in the /sys/class/gpio directory.
+
+.TP
+.B wfi <pin> <mode>
+This set the given pin to the supplied interrupt mode: rising, falling
+or both then waits for the interrupt to happen. It's a non-busy wait,
+so does not consume and CPU while it's waiting.
+
+.TP
+.B drive
+group value
+
+Change the pad driver value for the given pad group to the supplied drive
+value. Group is 0, 1 or 2 and value is 0-7. Do not use unless you are
+absolutely sure you know what you're doing.
+
+.TP
+.B usbp
+high | low
+
+Change the USB current limiter to high (1.2 amps) or low (the default, 600mA)
+This is only applicable to the model B+
+
+.TP
+.B pwm-bal/pwm-ms 
+Change the PWM mode to balanced (the default) or mark:space ratio (traditional)
+
+.TP
+.B pwmr
+Change the PWM range register. The default is 1024.
+
+.TP
+.B load i2c [baudrate]
+This loads the i2c or drivers into the kernel and changes the permissions
+on the associated /dev/ entries so that the current user has access to
+them. Optionally it will set the I2C baudrate to that supplied in Kb/sec
+(or as close as the Pi can manage) The default speed is 100Kb/sec.
+
+.TP
+.B load spi [buffer size in KB]
+This loads the spi drivers into the kernel and changes the permissions
+on the associated /dev/ entries so that the current user has access to
+them. Optionally it will set the SPI buffer size to that supplied. The
+default is 4KB.
+
+.TP
+.B gbr
+channel
+
+This reads the analog to digital converter on the Gertboard on the given
+channel. The board jumpers need to be in-place to do this operation.
+
+.TP
+.B gbw
+channel value
+
+This writes the supplied value to the output channel on the Gertboards
+SPI digital to analogue converter.
+The board jumpers need to be in-place to do this operation.
+
+
+.SH "WiringPi vs. BCM_GPIO Pin numbering"
+
+.PP
+.TS
+c c c c l.
+WiringPi	GPIO-r1	GPIO-r2	P1-Phys	Function
+_
+ 0	17	17	11	
+ 1	18	18	12	(PWM)
+ 2	21	27	13
+ 3	22	22	15
+ 4	23	23	16
+ 5	24	24	18
+ 6	25	25	22
+ 7	4	4	7
+ 8	0	2	3	I2C: SDA0
+ 9	1	3	5	I2C: SCL0
+10	8	8	24	SPI: CE0
+11	7	7	26	SPI: CE1
+12	10	10	19	SPI: MOSI
+13	9	9	21	SPI: MISO
+14	11	11	23	SPI: SCLK
+15	14	14	8	TxD
+16	15	16	10	RxD
+17	-	28
+18	-	29
+19	-	30
+20	-	31
+.TE
+
+Note that "r1" and "r2" above refers to the board revision. Normally
+wiringPi detects the correct board revision with use for it's own
+numbering scheme, but if you are using a Revision 2 board with some
+of the pins which change numbers between revisions you will need
+to alter your software.
+
+.SH FILES
+
+.TP 2.2i
+.I gpio
+executable
+
+.SH EXAMPLES
+.TP 2.2i
+gpio mode 4 output # Set pin 4 to output
+.PP
+gpio -g mode 23 output # Set GPIO pin 23 to output (same as WiringPi pin 4)
+.PP
+gpio mode 1 pwm # Set pin 1 to PWM mode
+.PP
+gpio pwm 1 512 # Set pin 1 to PWM value 512 - half brightness
+.PP
+gpio export 17 out # Set GPIO Pin 17 to output
+.PP
+gpio export 0 in # Set GPIO Pin 0 (SDA0) to input.
+.PP
+gpio -g read 0 # Read GPIO Pin 0 (SDA0)
+
+.SH "NOTES"
+
+When using the \fIexport\fR, \fIedge\fR or \fIunexport\fR commands, the
+pin numbers are \fBalways\fR native BCM_GPIO numbers and never wiringPi
+pin numbers.
+
+.SH "SEE ALSO"
+
+.LP
+WiringPi's home page
+.IP
+http://wiringpi.com/
+
+.SH AUTHOR
+
+Gordon Henderson
+
+.SH "REPORTING BUGS"
+
+Please report bugs to <projects@drogon.net>
+
+.SH COPYRIGHT
+
+Copyright (c) 2012-2013 Gordon Henderson
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+.SH TRADEMARKS AND ACKNOWLEDGEMENTS
+
+Raspberry Pi is a trademark of the Raspberry Pi Foundation. See
+http://raspberrypi.org/ for full details.
diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio.c b/modules/catkin_ws/src/wiringPi/gpio/gpio.c
new file mode 100755
index 0000000000000000000000000000000000000000..8567e77cb4c9c83e79dde05738e865d2c4418cac
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/gpio.c
@@ -0,0 +1,1477 @@
+/*
+ * gpio.c:
+ *	Swiss-Army-Knife, Set-UID command-line interface to the Raspberry
+ *	Pi's GPIO.
+ *	Copyright (c) 2012-2014 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <wiringPi.h>
+
+#include <gertboard.h>
+#include <piFace.h>
+
+#include "extensions.h"
+
+extern int wiringPiDebug ;
+
+// External functions I can't be bothered creating a separate .h file for:
+
+extern void doReadall    (void) ;
+extern void doPins       (void) ;
+
+#ifndef TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+/*
+	2.31 : ODROID-C1/ODROID-C2 wiringPi support
+	2.33 : ODROID-C1/ODROID-C2 GPIO sysfs irq support
+*/
+#define	VERSION			"2.33"
+#define	PI_USB_POWER_CONTROL	38
+#define	I2CDETECT		"/usr/sbin/i2cdetect"
+
+int wpMode ;
+int piModel = PI_MODEL_UNKNOWN;
+
+char *usage = "Usage: gpio -v\n"
+              "       gpio -h\n"
+              "       gpio [-g|-1] [-x extension:params] ...\n"
+              "       gpio [-p] <read/write/wb> ...\n"
+              "       gpio <read/write/aread/awritewb/pwm/clock/mode> ...\n"
+	      "       gpio readall/reset\n"
+	      "       gpio unexportall/exports\n"
+	      "       gpio export/edge/unexport ...\n"
+	      "       gpio wfi <pin> <mode>\n"
+	      "       gpio drive <group> <value>\n"
+	      "       gpio pwm-bal/pwm-ms \n"
+	      "       gpio pwmr <range> \n"
+	      "       gpio pwmc <divider> \n"
+	      "       gpio load spi/i2c\n"
+	      "       gpio i2cd/i2cdetect\n"
+	      "       gpio usbp high/low\n"
+	      "       gpio gbr <channel>\n"
+	      "       gpio gbw <channel> <value>" ;	// No trailing newline needed here.
+
+
+#ifdef	NOT_FOR_NOW
+/*
+ * decodePin:
+ *	Decode a pin "number" which can actually be a pin name to represent
+ *	one of the Pi's on-board pins.
+ *********************************************************************************
+ */
+
+static int decodePin (const char *str)
+{
+
+// The first case - see if it's a number:
+
+  if (isdigit (str [0]))
+    return atoi (str) ;
+
+  return 0 ;
+}
+#endif
+
+
+/*
+ * changeOwner:
+ *	Change the ownership of the file to the real userId of the calling
+ *	program so we can access it.
+ *********************************************************************************
+ */
+
+static void changeOwner (char *cmd, char *file)
+{
+  uid_t uid = getuid () ;
+  uid_t gid = getgid () ;
+
+  if (chown (file, uid, gid) != 0)
+  {
+    if (errno == ENOENT)	// Warn that it's not there
+      fprintf (stderr, "%s: Warning: File not present: %s\n", cmd, file) ;
+    else
+    {
+      fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ;
+      exit (1) ;
+    }
+  }
+}
+
+
+/*
+ * moduleLoaded:
+ *	Return true/false if the supplied module is loaded
+ *********************************************************************************
+ */
+
+static int moduleLoaded (char *modName)
+{
+  int len   = strlen (modName) ;
+  int found = FALSE ;
+  FILE *fd = fopen ("/proc/modules", "r") ;
+  char line [80] ;
+
+  if (fd == NULL)
+  {
+    fprintf (stderr, "gpio: Unable to check modules: %s\n", strerror (errno)) ;
+    exit (1) ;
+  }
+
+  while (fgets (line, 80, fd) != NULL)
+  {
+    if (strncmp (line, modName, len) != 0)
+      continue ;
+
+    found = TRUE ;
+    break ;
+  }
+
+  fclose (fd) ;
+
+  return found ;
+}
+
+
+/*
+ * doLoad:
+ *	Load either the spi or i2c modules and change device ownerships, etc.
+ *********************************************************************************
+ */
+
+static void _doLoadUsage (char *argv [])
+{
+  fprintf (stderr, "Usage: %s load <spi/i2c> [SPI bufferSize in KB | I2C baudrate in Kb/sec]\n", argv [0]) ;
+  exit (1) ;
+}
+
+static void doLoad (int argc, char *argv [])
+{
+  char *module1, *module2 ;
+  char cmd [80] ;
+  char *file1, *file2 ;
+  char args1 [32], args2 [32] ;
+
+  if (argc < 3)
+    _doLoadUsage (argv) ;
+
+  args1 [0] = args2 [0] = 0 ;
+
+  /**/ if (strcasecmp (argv [2], "spi") == 0)
+  {
+    module1 = "spidev" ;
+    module2 = "spi_bcm2708" ;
+    file1  = "/dev/spidev0.0" ;
+    file2  = "/dev/spidev0.1" ;
+    if (argc == 4)
+      sprintf (args1, " bufsiz=%d", atoi (argv [3]) * 1024) ;
+    else if (argc > 4)
+      _doLoadUsage (argv) ;
+  }
+  else if (strcasecmp (argv [2], "i2c") == 0)
+  {
+    module1 = "i2c_dev" ;
+    module2 = "i2c_bcm2708" ;
+    file1  = "/dev/i2c-0" ;
+    file2  = "/dev/i2c-1" ;
+    if (argc == 4)
+      sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ;
+    else if (argc > 4)
+      _doLoadUsage (argv) ;
+  }
+  else
+    _doLoadUsage (argv) ;
+
+  if (piModel == PI_MODEL_ODROIDC  ||
+      piModel == PI_MODEL_ODROIDC2 ||
+      piModel == PI_MODEL_ODROIDXU_34)  {
+    if (strcasecmp (argv [2], "i2c") == 0)  {
+      if (piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2)  {
+        module1 = "aml-i2c";
+        file1 = "/dev/i2c-1";
+        file2 = "/dev/i2c-2";
+
+        if (!moduleLoaded(module1))  {
+          sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s", module1) ;
+          system (cmd) ;
+        }
+      }
+      else {
+        file1 = "/dev/i2c-4";	/* i2c smbus : 0x12c70000 */
+        file2 = "/dev/i2c-1";	/* hsi2c : 0x12cb0000 */
+      }
+
+      sleep (1) ;	// To let things get settled
+      changeOwner (argv [0], file1) ;
+      changeOwner (argv [0], file2) ;
+    }
+    else  {
+      if (piModel == PI_MODEL_ODROIDC2) {
+          fprintf (stderr, "ODROID-C2 : H/W SPI not support!\n") ;
+          return;
+      }
+      if (piModel == PI_MODEL_ODROIDC)  {
+        file1 = "/dev/spidev0.0";
+        module1 = "spidev";
+        module2 = "spicc";
+        if (!moduleLoaded(module1))  {
+          sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s%s", module1, args1) ;
+          system (cmd) ;
+        }
+        if (!moduleLoaded(module2))  {
+          sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s", module2) ;
+          system (cmd) ;
+        }
+        if (!moduleLoaded (module2))
+        {
+          fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ;
+          exit (1) ;
+        }
+
+        sleep (1) ;	// To let things get settled
+        changeOwner (argv [0], file1) ;
+      }
+      else {
+        module1 = "spidev";
+        file1 = "/dev/spidev1.0";
+
+        if (!moduleLoaded (module1))
+        {
+          fprintf (stderr, "%s: Unable to load %s\n", argv [0], module1) ;
+          fprintf (stderr, "\nYou need modified dtb file for spidev.\n");
+          fprintf (stderr, "\nstep 1)\n");
+          fprintf (stderr, "  - install device-tree-compiler.\n");
+          fprintf (stderr, "    sudo apt-get install device-tree-compiler\n");
+          fprintf (stderr, "\nstep 2)\n");
+          fprintf (stderr, "  - modified dtb file.\n");
+          fprintf (stderr, "    sudo -s\n");
+          fprintf (stderr, "    fdtput -c /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev\n");
+          fprintf (stderr, "    fdtput -t s /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev compatible \"spidev\"\n");
+          fprintf (stderr, "    fdtput -t x /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev reg 0\n");
+          fprintf (stderr, "    fdtput -t i /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev spi-max-frequency 20000000\n");
+          fprintf (stderr, "    fdtput -c /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev/controller-data\n");
+          fprintf (stderr, "    fdtput -t x /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev/controller-data cs-gpio 0x44, 0x5, 0x0\n");
+          fprintf (stderr, "    fdtput -t x /media/boot/exynos5422-odroidxu3.dtb /spi@12d30000/spidev/controller-data samsung,spi-feedback-delay 0\n");
+          fprintf (stderr, "\nstep 3)\n");
+          fprintf (stderr, "  - reboot system.\n");
+          fprintf (stderr, "    sudo reboot\n");
+          fprintf (stderr, "\nstep 4)\n");
+          fprintf (stderr, "  - check your SPI node.\n");
+          fprintf (stderr, "    ls /dev/spidev1.0\n");
+          // fdtput
+          exit (1) ;
+        }
+
+        sleep (1) ;	// To let things get settled
+        changeOwner (argv [0], file1) ;
+      }
+    }
+  }
+  else  {
+    if (!moduleLoaded (module1))
+    {
+      sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s%s", module1, args1) ;
+      system (cmd) ;
+    }
+
+    if (!moduleLoaded (module2))
+    {
+      sprintf (cmd, "PATH=/bin:/usr/bin:/sbin:/usr/local/bin modprobe %s%s", module2, args2) ;
+      system (cmd) ;
+    }
+
+    if (!moduleLoaded (module2))
+    {
+      fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ;
+      exit (1) ;
+    }
+    sleep (1) ;	// To let things get settled
+
+    changeOwner (argv [0], file1) ;
+    changeOwner (argv [0], file2) ;
+  }
+}
+
+
+/*
+ * doI2Cdetect:
+ *	Run the i2cdetect command with the right runes for this Pi revision
+ *********************************************************************************
+ */
+
+static void doI2Cdetect (int argc, char *argv [])
+{
+  int port = piBoardRev () == 1 ? 0 : 1 ;
+  char command [128] ;
+  struct stat statBuf ;
+
+  if (stat (I2CDETECT, &statBuf) < 0)
+  {
+    fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ;
+    return ;
+  }
+
+  if (!moduleLoaded ("i2c_dev"))
+  {
+    fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ;
+    return ;
+  }
+
+  sprintf (command, "%s -y %d", I2CDETECT, port) ;
+  if (system (command) < 0)
+    fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ;
+
+}
+
+
+/*
+ * doExports:
+ *	List all GPIO exports
+ *********************************************************************************
+ */
+
+static void doExports (int argc, char *argv [])
+{
+  int fd ;
+  int i, l, first ;
+  char fName [128] ;
+  char buf [16] ;
+
+  // ODROIDC GPIO Max 128, ODROIDXU_34 GPIO Max 256
+  for (first = 0, i = 0 ; i < 256 ; ++i)	// Crude, but effective
+  {
+
+// Try to read the direction
+
+    sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ;
+    if ((fd = open (fName, O_RDONLY)) == -1)
+      continue ;
+
+    if (first == 0)
+    {
+      ++first ;
+      printf ("GPIO Pins exported:\n") ;
+    }
+
+    printf ("%4d: ", i) ;
+
+    if ((l = read (fd, buf, 16)) == 0)
+      sprintf (buf, "%s", "?") ;
+ 
+    buf [l] = 0 ;
+    if ((buf [strlen (buf) - 1]) == '\n')
+      buf [strlen (buf) - 1] = 0 ;
+
+    printf ("%-3s", buf) ;
+
+    close (fd) ;
+
+// Try to Read the value
+
+    sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ;
+    if ((fd = open (fName, O_RDONLY)) == -1)
+    {
+      printf ("No Value file (huh?)\n") ;
+      continue ;
+    }
+
+    if ((l = read (fd, buf, 16)) == 0)
+      sprintf (buf, "%s", "?") ;
+
+    buf [l] = 0 ;
+    if ((buf [strlen (buf) - 1]) == '\n')
+      buf [strlen (buf) - 1] = 0 ;
+
+    printf ("  %s", buf) ;
+
+// Read any edge trigger file
+
+    sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ;
+    if ((fd = open (fName, O_RDONLY)) == -1)
+    {
+      printf ("\n") ;
+      continue ;
+    }
+
+    if ((l = read (fd, buf, 16)) == 0)
+      sprintf (buf, "%s", "?") ;
+
+    buf [l] = 0 ;
+    if ((buf [strlen (buf) - 1]) == '\n')
+      buf [strlen (buf) - 1] = 0 ;
+
+    printf ("  %-8s\n", buf) ;
+
+    close (fd) ;
+  }
+}
+
+
+/*
+ * doExport:
+ *	gpio export pin mode
+ *	This uses the /sys/class/gpio device interface.
+ *********************************************************************************
+ */
+
+void doExport (int argc, char *argv [])
+{
+  FILE *fd ;
+  int pin ;
+  char *mode ;
+  char fName [128] ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  mode = argv [3] ;
+
+  sprintf (fName, "/sys/class/%s/export", "gpio");
+
+  if ((fd = fopen (fName, "w")) == NULL)
+  {
+    fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
+    exit (1) ;
+  }
+
+  fprintf (fd, "%d\n", pin) ;
+  fclose (fd) ;
+
+  sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ;
+
+  if ((fd = fopen (fName, "w")) == NULL)
+  {
+    fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
+    exit (1) ;
+  }
+
+  /**/ if ((strcasecmp (mode, "in")  == 0) || (strcasecmp (mode, "input")  == 0))
+    fprintf (fd, "in\n") ;
+  else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0))
+    fprintf (fd, "out\n") ;
+  else
+  {
+    fprintf (stderr, "%s: Invalid mode: %s. Should be in or out\n", argv [1], mode) ;
+    exit (1) ;
+  }
+
+  fclose (fd) ;
+
+// Change ownership so the current user can actually use it!
+
+  sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ;
+
+  changeOwner (argv [0], fName) ;
+
+  sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ;
+
+  changeOwner (argv [0], fName) ;
+
+}
+
+
+/*
+ * doWfi:
+ *	gpio wfi pin mode
+ *	Wait for Interrupt on a given pin.
+ *	Slight cheat here - it's easier to actually use ISR now (which calls
+ *	gpio to set the pin modes!) then we simply sleep, and expect the thread
+ *	to exit the program. Crude but effective.
+ *********************************************************************************
+ */
+
+static void wfi (void)
+  { exit (0) ; }
+
+void doWfi (int argc, char *argv [])
+{
+  int pin, mode ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin  = atoi (argv [2]) ;
+
+  /**/ if (strcasecmp (argv [3], "rising")  == 0) mode = INT_EDGE_RISING ;
+  else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ;
+  else if (strcasecmp (argv [3], "both")    == 0) mode = INT_EDGE_BOTH ;
+  else
+  {
+    fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ;
+    exit (1) ;
+  }
+
+  if (wiringPiISR (pin, mode, &wfi) < 0)
+  {
+    fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ;
+    exit (1) ;
+  }
+
+  for (;;)
+    delay (9999) ;
+}
+
+
+
+/*
+ * doEdge:
+ *	gpio edge pin mode
+ *	Easy access to changing the edge trigger on a GPIO pin
+ *	This uses the /sys/class/gpio device interface.
+ *********************************************************************************
+ */
+
+void doEdge (int argc, char *argv [])
+{
+  FILE *fd ;
+  int pin ;
+  char *mode ;
+  char fName [128] ;
+
+  // Reset irq gpio
+  doUnexport(3, argv);      // unexport argc == 3
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin  = atoi (argv [2]) ;
+  mode = argv [3] ;
+
+// Export the pin and set direction to input
+
+  sprintf (fName, "/sys/class/%s/export", "gpio");
+
+  if ((fd = fopen (fName, "w")) == NULL)
+  {
+    fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ;
+    exit (1) ;
+  }
+  fprintf (fd, "%d\n", pin) ;
+  fclose (fd) ;
+
+  sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin);
+
+  if ((fd = fopen (fName, "w")) == NULL)
+  {
+    fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
+    exit (1) ;
+  }
+
+  fprintf (fd, "in\n") ;
+  fclose (fd) ;
+
+  sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin);
+
+  if ((fd = fopen (fName, "w")) == NULL)
+  {
+    fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ;
+    exit (1) ;
+  }
+
+  /**/ if (strcasecmp (mode, "none")    == 0) fprintf (fd, "none\n") ;
+  else if (strcasecmp (mode, "rising")  == 0) fprintf (fd, "rising\n") ;
+  else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ;
+  else if (strcasecmp (mode, "both")    == 0) fprintf (fd, "both\n") ;
+  else
+  {
+    fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ;
+    exit (1) ;
+  }
+
+// Change ownership of the value and edge files, so the current user can actually use it!
+
+  sprintf (fName, "/sys/class/gpio/gpio%d/value", pin);
+
+  changeOwner (argv [0], fName) ;
+
+  sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin);
+
+  changeOwner (argv [0], fName) ;
+
+  fclose (fd) ;
+}
+
+
+/*
+ * doUnexport:
+ *	gpio unexport pin
+ *	This uses the /sys/class/gpio device interface.
+ *********************************************************************************
+ */
+
+void doUnexport (int argc, char *argv [])
+{
+  FILE *fd ;
+  int pin ;
+  char fName [128] ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  sprintf (fName, "/sys/class/%s/unexport", "gpio") ;
+
+  if ((fd = fopen (fName, "w")) == NULL)
+  {
+    fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  fprintf (fd, "%d\n", pin) ;
+  fclose (fd) ;
+}
+
+
+/*
+ * doUnexportAll:
+ *	gpio unexportall
+ *	Un-Export all the GPIO pins.
+ *	This uses the /sys/class/gpio device interface.
+ *********************************************************************************
+ */
+
+void doUnexportall (char *progName)
+{
+  FILE *fd ;
+  int pin ;
+
+  // ODROIDC GPIO Max 128, ODROIDXU_34 GPIO Max 256
+  for (pin = 0 ; pin < 256 ; ++pin)
+  {
+    if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL)
+    {
+      fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ;
+      exit (1) ;
+    }
+    fprintf (fd, "%d\n", pin) ;
+    fclose (fd) ;
+  }
+}
+
+
+/*
+ * doResetExternal:
+ *	Load readallExternal, we try to do this with an external device.
+ *********************************************************************************
+ */
+
+static void doResetExternal (void)
+{
+  int pin ;
+
+  for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin)
+  {
+    pinMode         (pin, INPUT) ;
+    pullUpDnControl (pin, PUD_OFF) ;
+  }
+}
+
+
+/*
+ * doReset:
+ *	Reset the GPIO pins - as much as we can do
+ *********************************************************************************
+ */
+
+static void doReset (char *progName)
+{
+  int model, rev, mem, maker, overVolted ;
+  int pin, endPin ;
+
+  printf ("GPIO Reset is dangerous!\n") ;
+  printf (" - Do Not rely on this to do anything sensible!\n") ;
+
+  if (wiringPiNodes != NULL)	// External
+  {
+    doResetExternal () ;
+    return ;
+  }
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+
+  /**/ if ((model == PI_MODEL_A)  || (model == PI_MODEL_B))
+    endPin = 16 ;
+  else if ((model == PI_MODEL_BP)       ||
+           (model == PI_MODEL_ODROIDC)  ||
+           (model == PI_MODEL_ODROIDC2) ||
+           (model == PI_MODEL_ODROIDXU_34))
+    endPin = 39 ;
+  else if (model == PI_MODEL_CM)
+  {
+    printf (" - Don't know how to reset a comput module:\n") ;
+    printf ("   Write a shell-script to reset the pins to the state you need.\n") ;
+    return ;
+  }
+  else
+  {
+    printf ("Oops - unable to determine board type... model: %d\n", model) ;
+    return ;
+  }
+
+  for (pin = 0 ; pin <= endPin ; ++pin)
+  {
+    if (wpiPinToGpio (pin) == -1)
+      continue ;
+
+    digitalWrite    (pin, LOW) ;
+    pinMode         (pin, INPUT) ;
+    pullUpDnControl (pin, PUD_OFF) ;
+  }
+}
+
+
+/*
+ * doMode:
+ *	gpio mode pin mode ...
+ *********************************************************************************
+ */
+
+void doMode (int argc, char *argv [])
+{
+  int pin ;
+  char *mode ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  mode = argv [3] ;
+
+  /**/ if (strcasecmp (mode, "in")      == 0) pinMode         (pin, INPUT) ;
+  else if (strcasecmp (mode, "input")   == 0) pinMode         (pin, INPUT) ;
+  else if (strcasecmp (mode, "out")     == 0) pinMode         (pin, OUTPUT) ;
+  else if (strcasecmp (mode, "output")  == 0) pinMode         (pin, OUTPUT) ;
+  else if (strcasecmp (mode, "pwm")     == 0) pinMode         (pin, PWM_OUTPUT) ;
+  else if (strcasecmp (mode, "pwmTone") == 0) pinMode         (pin, PWM_TONE_OUTPUT) ;
+  else if (strcasecmp (mode, "clock")   == 0) pinMode         (pin, GPIO_CLOCK) ;
+  else if (strcasecmp (mode, "up")      == 0) pullUpDnControl (pin, PUD_UP) ;
+  else if (strcasecmp (mode, "down")    == 0) pullUpDnControl (pin, PUD_DOWN) ;
+  else if (strcasecmp (mode, "tri")     == 0) pullUpDnControl (pin, PUD_OFF) ;
+  else if (strcasecmp (mode, "off")     == 0) pullUpDnControl (pin, PUD_OFF) ;
+
+// Undocumented
+
+  else if (strcasecmp (mode, "alt0")    == 0) pinModeAlt (pin, 0b100) ;
+  else if (strcasecmp (mode, "alt1")    == 0) pinModeAlt (pin, 0b101) ;
+  else if (strcasecmp (mode, "alt2")    == 0) pinModeAlt (pin, 0b110) ;
+  else if (strcasecmp (mode, "alt3")    == 0) pinModeAlt (pin, 0b111) ;
+  else if (strcasecmp (mode, "alt4")    == 0) pinModeAlt (pin, 0b011) ;
+  else if (strcasecmp (mode, "alt5")    == 0) pinModeAlt (pin, 0b010) ;
+  else
+  {
+    fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ;
+    exit (1) ;
+  }
+}
+
+
+/*
+ * doPadDrive:
+ *	gpio drive group value
+ *********************************************************************************
+ */
+
+static void doPadDrive (int argc, char *argv [])
+{
+  int group, val ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  group = atoi (argv [2]) ;
+  val   = atoi (argv [3]) ;
+
+  if ((group < 0) || (group > 2))
+  {
+    fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ;
+    exit (1) ;
+  }
+
+  if ((val < 0) || (val > 7))
+  {
+    fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ;
+    exit (1) ;
+  }
+
+  setPadDrive (group, val) ;
+}
+
+
+/*
+ * doUsbP:
+ *	Control USB Power - High (1.2A) or Low (600mA)
+ *	gpio usbp high/low
+ *********************************************************************************
+ */
+
+static void doUsbP (int argc, char *argv [])
+{
+  int model, rev, mem, maker, overVolted ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
+    exit (1) ;
+  }
+
+// Make sure we're on a B+
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+
+  if (model != PI_MODEL_BP)
+  {
+    fprintf (stderr, "USB power contol is applicable to B+ boards only.\n") ;
+    exit (1) ;
+  }
+    
+// Need to force BCM_GPIO mode:
+
+  wiringPiSetupGpio () ;
+
+  if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0))
+  {
+    digitalWrite (PI_USB_POWER_CONTROL, 1) ;
+    pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
+    printf ("Switched to HIGH current USB (1.2A)\n") ;
+    return ;
+  }
+
+  if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0))
+  {
+    digitalWrite (PI_USB_POWER_CONTROL, 0) ;
+    pinMode (PI_USB_POWER_CONTROL, OUTPUT) ;
+    printf ("Switched to LOW current USB (600mA)\n") ;
+    return ;
+  }
+
+  fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ;
+  exit (1) ;
+}
+
+
+/*
+ * doGbw:
+ *	gpio gbw channel value
+ *	Gertboard Write - To the Analog output
+ *********************************************************************************
+ */
+
+static void doGbw (int argc, char *argv [])
+{
+  int channel, value ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s gbw <channel> <value>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  channel = atoi (argv [2]) ;
+  value   = atoi (argv [3]) ;
+
+  if ((channel < 0) || (channel > 1))
+  {
+    fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  if ((value < 0) || (value > 255))
+  {
+    fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  if (gertboardAnalogSetup (64) < 0)
+  {
+    fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
+    exit (1) ;
+  }
+
+  analogWrite (64 + channel, value) ;
+}
+
+
+/*
+ * doGbr:
+ *	gpio gbr channel
+ *	From the analog input
+ *********************************************************************************
+ */
+
+static void doGbr (int argc, char *argv [])
+{
+  int channel ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s gbr <channel>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  channel = atoi (argv [2]) ;
+
+  if ((channel < 0) || (channel > 1))
+  {
+    fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  if (gertboardAnalogSetup (64) < 0)
+  {
+    fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ;
+    exit (1) ;
+  }
+
+  printf ("%d\n", analogRead (64 + channel)) ;
+}
+
+
+/*
+ * doWrite:
+ *	gpio write pin value
+ *********************************************************************************
+ */
+
+static void doWrite (int argc, char *argv [])
+{
+  int pin, val ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0))
+    val = 1 ;
+  else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0))
+    val = 0 ;
+  else
+    val = atoi (argv [3]) ;
+
+  /**/ if (val == 0)
+    digitalWrite (pin, LOW) ;
+  else
+    digitalWrite (pin, HIGH) ;
+}
+
+
+/*
+ * doAwriterite:
+ *	gpio awrite pin value
+ *********************************************************************************
+ */
+
+static void doAwrite (int argc, char *argv [])
+{
+  int pin, val ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  val = atoi (argv [3]) ;
+
+  analogWrite (pin, val) ;
+}
+
+
+/*
+ * doWriteByte:
+ *	gpio write value
+ *********************************************************************************
+ */
+
+static void doWriteByte (int argc, char *argv [])
+{
+  int val ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s wb value\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  val = (int)strtol (argv [2], NULL, 0) ;
+
+  digitalWriteByte (val) ;
+}
+
+
+/*
+ * doRead:
+ *	Read a pin and return the value
+ *********************************************************************************
+ */
+
+void doRead (int argc, char *argv []) 
+{
+  int pin, val ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s read pin\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+  val = digitalRead (pin) ;
+
+  printf ("%s\n", val == 0 ? "0" : "1") ;
+}
+
+
+/*
+ * doAread:
+ *	Read an analog pin and return the value
+ *********************************************************************************
+ */
+
+void doAread (int argc, char *argv []) 
+{
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  printf ("%d\n", analogRead (atoi (argv [2]))) ;
+}
+
+
+/*
+ * doToggle:
+ *	Toggle an IO pin
+ *********************************************************************************
+ */
+
+void doToggle (int argc, char *argv [])
+{
+  int pin ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  digitalWrite (pin, !digitalRead (pin)) ;
+}
+
+
+/*
+ * doPwmTone:
+ *	Output a tone in a PWM pin
+ *********************************************************************************
+ */
+
+void doPwmTone (int argc, char *argv [])
+{
+  int pin, freq ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s pwmTone <pin> <freq>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+  freq = atoi (argv [3]) ;
+
+  pwmToneWrite (pin, freq) ;
+}
+
+
+/*
+ * doClock:
+ *	Output a clock on a pin
+ *********************************************************************************
+ */
+
+void doClock (int argc, char *argv [])
+{
+  int pin, freq ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s clock <pin> <freq>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  freq = atoi (argv [3]) ;
+
+  gpioClockSet (pin, freq) ;
+}
+
+
+/*
+ * doPwm:
+ *	Output a PWM value on a pin
+ *********************************************************************************
+ */
+
+void doPwm (int argc, char *argv [])
+{
+  int pin, val ;
+
+  if (argc != 4)
+  {
+    fprintf (stderr, "Usage: %s pwm <pin> <value>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pin = atoi (argv [2]) ;
+
+  val = atoi (argv [3]) ;
+
+  pwmWrite (pin, val) ;
+}
+
+
+/*
+ * doPwmMode: doPwmRange: doPwmClock:
+ *	Change the PWM mode, range and clock divider values
+ *********************************************************************************
+ */
+
+static void doPwmMode (int mode)
+{
+  pwmSetMode (mode) ;
+}
+
+static void doPwmRange (int argc, char *argv [])
+{
+  unsigned int range ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s pwmr <range>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  range = (unsigned int)strtoul (argv [2], NULL, 10) ;
+
+  if (range == 0)
+  {
+    fprintf (stderr, "%s: range must be > 0\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pwmSetRange (range) ;
+}
+
+static void doPwmClock (int argc, char *argv [])
+{
+  unsigned int clock ;
+
+  if (argc != 3)
+  {
+    fprintf (stderr, "Usage: %s pwmc <clock>\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  clock = (unsigned int)strtoul (argv [2], NULL, 10) ;
+
+  if ((clock < 1) || (clock > 4095))
+  {
+    fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ;
+    exit (1) ;
+  }
+
+  pwmSetClock (clock) ;
+}
+
+
+/*
+ * main:
+ *	Start here
+ *********************************************************************************
+ */
+
+int main (int argc, char *argv [])
+{
+  int i ;
+  int model, rev, mem, maker, overVolted ;
+
+  if (getenv ("WIRINGPI_DEBUG") != NULL)
+  {
+    printf ("gpio: wiringPi debug mode enabled\n") ;
+    wiringPiDebug = TRUE ;
+  }
+
+  if (argc == 1)
+  {
+    fprintf (stderr, "%s\n", usage) ;
+    return 1 ;
+  }
+
+// Help
+
+  if (strcasecmp (argv [1], "-h") == 0)
+  {
+    printf ("%s: %s\n", argv [0], usage) ;
+    return 0 ;
+  }
+
+// Sort of a special:
+
+  if (strcmp (argv [1], "-R") == 0)
+  {
+    printf ("%d\n", piBoardRev ()) ;
+    return 0 ;
+  }
+
+// Version & Warranty
+
+  if (strcmp (argv [1], "-V") == 0)
+  {
+    printf ("%d\n", piBoardRev ()) ;
+    return 0 ;
+  }
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+  piModel = model;
+
+  if (strcmp (argv [1], "-v") == 0)
+  {
+    printf ("gpio version: %s\n", VERSION) ;
+    printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ;
+    printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
+    printf ("For details type: %s -warranty\n", argv [0]) ;
+    printf ("\n") ;
+    if (model == PI_MODEL_UNKNOWN)
+    {
+      printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ;
+      printf ("    projects@drogon.net\n") ;
+      printf ("with a copy of your /proc/cpuinfo if possible\n") ;
+    }
+    else if ( model == PI_MODEL_ODROIDC     ||
+              model == PI_MODEL_ODROIDXU_34 ||
+              model == PI_MODEL_ODROIDC2      )
+    {
+      printf ("Hardkernel ODROID Details:\n") ;
+      printf ("  Type: %s, Revision: %s, Memory: %dMB, Maker: %s\n",
+      piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker]) ;
+    }
+    else
+    {
+      printf ("Raspberry Pi Details:\n") ;
+      printf ("  Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", 
+      piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ;
+    }
+    return 0 ;
+  }
+
+  if (strcasecmp (argv [1], "-warranty") == 0)
+  {
+    printf ("gpio version: %s\n", VERSION) ;
+    printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ;
+    printf ("\n") ;
+    printf ("    This program is free software; you can redistribute it and/or modify\n") ;
+    printf ("    it under the terms of the GNU Leser General Public License as published\n") ;
+    printf ("    by the Free Software Foundation, either version 3 of the License, or\n") ;
+    printf ("    (at your option) any later version.\n") ;
+    printf ("\n") ;
+    printf ("    This program is distributed in the hope that it will be useful,\n") ;
+    printf ("    but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ;
+    printf ("    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n") ;
+    printf ("    GNU Lesser General Public License for more details.\n") ;
+    printf ("\n") ;
+    printf ("    You should have received a copy of the GNU Lesser General Public License\n") ;
+    printf ("    along with this program. If not, see <http://www.gnu.org/licenses/>.\n") ;
+    printf ("\n") ;
+    return 0 ;
+  }
+
+  if (geteuid () != 0)
+  {
+    fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ;
+    return 1 ;
+  }
+
+// Initial test for /sys/class/gpio operations:
+
+  /**/ if (strcasecmp (argv [1], "exports"    ) == 0)	{ doExports     (argc, argv) ;	return 0 ; }
+  else if (strcasecmp (argv [1], "export"     ) == 0)	{ doExport      (argc, argv) ;	return 0 ; }
+  else if (strcasecmp (argv [1], "edge"       ) == 0)	{ doEdge        (argc, argv) ;	return 0 ; }
+  else if (strcasecmp (argv [1], "unexport"   ) == 0)	{ doUnexport    (argc, argv) ;	return 0 ; }
+  else if (strcasecmp (argv [1], "unexportall") == 0)	{ doUnexportall (argv [0]) ;	return 0 ; }
+
+// Check for load command:
+
+  if (strcasecmp (argv [1], "load" ) == 0)	{ doLoad     (argc, argv) ; return 0 ; }
+
+// Gertboard commands
+
+  if (strcasecmp (argv [1], "gbr" ) == 0)	{ doGbr (argc, argv) ; return 0 ; }
+  if (strcasecmp (argv [1], "gbw" ) == 0)	{ doGbw (argc, argv) ; return 0 ; }
+
+// Check for -g argument
+
+  /**/ if (strcasecmp (argv [1], "-g") == 0)
+  {
+    wiringPiSetupGpio () ;
+
+    for (i = 2 ; i < argc ; ++i)
+      argv [i - 1] = argv [i] ;
+    --argc ;
+    wpMode = WPI_MODE_GPIO ;
+  }
+
+// Check for -1 argument
+
+  else if (strcasecmp (argv [1], "-1") == 0)
+  {
+    wiringPiSetupPhys () ;
+
+    for (i = 2 ; i < argc ; ++i)
+      argv [i - 1] = argv [i] ;
+    --argc ;
+    wpMode = WPI_MODE_PHYS ;
+  }
+
+// Check for -p argument for PiFace
+
+  else if (strcasecmp (argv [1], "-p") == 0)
+  {
+    piFaceSetup (200) ;
+
+    for (i = 2 ; i < argc ; ++i)
+      argv [i - 1] = argv [i] ;
+    --argc ;
+    wpMode = WPI_MODE_PIFACE ;
+  }
+
+// Default to wiringPi mode
+
+  else
+  {
+    wiringPiSetup () ;
+    wpMode = WPI_MODE_PINS ;
+  }
+
+// Check for -x argument to load in a new extension
+
+  if (strcasecmp (argv [1], "-x") == 0)
+  {
+    if (argc < 3)
+    {
+      fprintf (stderr, "%s: -x missing extension specification.\n", argv [0]) ;
+      exit (EXIT_FAILURE) ;
+    }
+
+    if (!doExtension (argv [0], argv [2]))	// Prints its own error messages
+      exit (EXIT_FAILURE) ;
+
+    for (i = 3 ; i < argc ; ++i)
+      argv [i - 2] = argv [i] ;
+    argc -= 2 ;
+  }
+
+  if (argc <= 1)
+  {
+    fprintf (stderr, "%s: no command given\n", argv [0]) ;
+    exit (EXIT_FAILURE) ;
+  }
+
+// Core wiringPi functions
+
+  /**/ if (strcasecmp (argv [1], "mode"   ) == 0) doMode      (argc, argv) ;
+  else if (strcasecmp (argv [1], "read"   ) == 0) doRead      (argc, argv) ;
+  else if (strcasecmp (argv [1], "write"  ) == 0) doWrite     (argc, argv) ;
+  else if (strcasecmp (argv [1], "pwm"    ) == 0) doPwm       (argc, argv) ;
+  else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite    (argc, argv) ;
+  else if (strcasecmp (argv [1], "aread"  ) == 0) doAread     (argc, argv) ;
+
+// GPIO Nicies
+
+  else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle    (argc, argv) ;
+
+// Pi Specifics
+
+  else if (strcasecmp (argv [1], "pwm-bal"  ) == 0) doPwmMode    (PWM_MODE_BAL) ;
+  else if (strcasecmp (argv [1], "pwm-ms"   ) == 0) doPwmMode    (PWM_MODE_MS) ;
+  else if (strcasecmp (argv [1], "pwmr"     ) == 0) doPwmRange   (argc, argv) ;
+  else if (strcasecmp (argv [1], "pwmc"     ) == 0) doPwmClock   (argc, argv) ;
+  else if (strcasecmp (argv [1], "pwmTone"  ) == 0) doPwmTone    (argc, argv) ;
+  else if (strcasecmp (argv [1], "drive"    ) == 0) doPadDrive   (argc, argv) ;
+  else if (strcasecmp (argv [1], "usbp"     ) == 0) doUsbP       (argc, argv) ;
+  else if (strcasecmp (argv [1], "readall"  ) == 0) doReadall    () ;
+  else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall    () ;
+  else if (strcasecmp (argv [1], "pins"     ) == 0) doPins       () ;
+  else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect  (argc, argv) ;
+  else if (strcasecmp (argv [1], "i2cd"     ) == 0) doI2Cdetect  (argc, argv) ;
+  else if (strcasecmp (argv [1], "reset"    ) == 0) doReset      (argv [0]) ;
+  else if (strcasecmp (argv [1], "wb"       ) == 0) doWriteByte  (argc, argv) ;
+  else if (strcasecmp (argv [1], "clock"    ) == 0) doClock      (argc, argv) ;
+  else if (strcasecmp (argv [1], "wfi"      ) == 0) doWfi        (argc, argv) ;
+  else
+  {
+    fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ;
+    exit (EXIT_FAILURE) ;
+  }
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/gpio/gpio.o b/modules/catkin_ws/src/wiringPi/gpio/gpio.o
new file mode 100644
index 0000000000000000000000000000000000000000..4246715057cf41d1fd0910f7952b41567237be7a
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/gpio/gpio.o differ
diff --git a/modules/catkin_ws/src/wiringPi/gpio/pins.c b/modules/catkin_ws/src/wiringPi/gpio/pins.c
new file mode 100644
index 0000000000000000000000000000000000000000..19fcc1af927f958345377e732acd1c56d7c84650
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/pins.c
@@ -0,0 +1,33 @@
+/*
+ * pins.c:
+ *	Just display a handy Pi pinnout diagram.
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+
+void doPins (void)
+{
+  printf ("The pins command has been deprecated - sorry. Please use the\n") ;
+  printf ("  gpio readall\n") ;
+  printf ("command to get a list of the pinnouts for your Pi.\n") ;
+}
+
diff --git a/modules/catkin_ws/src/wiringPi/gpio/pins.o b/modules/catkin_ws/src/wiringPi/gpio/pins.o
new file mode 100644
index 0000000000000000000000000000000000000000..eb996a8ebdbd77ef4c51baa9c9c36981c01d65ff
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/gpio/pins.o differ
diff --git a/modules/catkin_ws/src/wiringPi/gpio/pintest b/modules/catkin_ws/src/wiringPi/gpio/pintest
new file mode 100755
index 0000000000000000000000000000000000000000..83ca12a51817381e530f01d4e7756f94f7957b19
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/pintest
@@ -0,0 +1,193 @@
+#!/bin/bash
+#
+# pintest
+#	Test the Pi's GPIO port
+# Copyright (c) 2013 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	Wiring Compatable library for the Raspberry Pi
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+
+# logErr pin, expected got
+################################################################################
+
+logErr ()
+{
+  if [ $errs = 0 ]; then
+    echo ""
+  fi
+  echo " --> Pin $1 failure. Expected $2, got $3"
+  let errs+=1
+}
+
+
+# printErrorCount
+################################################################################
+
+printErrCount()
+{
+  if [ $errs = 0 ]; then
+    echo "No faults detected."
+  elif [ $errs = 1 ]; then
+    echo "One fault detected."
+  else
+    echo "$errs faults detected"
+  fi
+}
+
+
+# testPins start end
+################################################################################
+
+testPins()
+{
+  start=$1
+    end=$2
+   errs=0
+
+  printf "%30s %2d:%2d: "  "$3" $1 $2
+
+# Set range to inputs
+
+  for i in `seq $start $end`; do
+    gpio mode $i in
+  done
+
+# Enable internal pull-ups and expect to read high
+
+  for i in `seq $start $end`; do
+    gpio mode $i up
+    if [ `gpio read $i` = 0 ]; then
+      logErr $i 1 0
+    fi
+  done
+
+# Enable internal pull-downs and expect to read low
+
+  for i in `seq $start $end`; do
+    gpio mode $i down
+    if [ `gpio read $i` = 1 ]; then
+      echo "Pin $i failure - expected 0, got 1"
+      let errs+=1
+    fi
+  done
+
+# Remove the internal pull up/downs
+
+  for i in `seq $start $end`; do
+    gpio mode $i tri
+  done
+
+  if [ $errs = 0 ]; then
+    echo " OK"
+  else
+    printErrCount
+  fi
+
+  let totErrs+=errs
+}
+
+
+intro()
+{
+  revision=`gpio -V`
+  cat <<EOF
+PinTest
+=======
+
+This is a simple utility to test the GPIO pins on your revision $revision
+Raspberry Pi.
+
+NOTE: All GPIO peripherals must be removed to perform this test. This
+  includes serial, I2C and SPI connections. You may get incorrect results
+  if something is connected and it interferes with the test.
+
+This test can only test the input side of things. It uses the internal
+pull-up and pull-down resistors to simulate inputs. It does not test
+the output drivers.
+
+You will need to reboot your Pi after this test if you wish to use the 
+serial port as it will be left in GPIO mode rather than serial mode.
+
+Please make sure everything is removed and press the ENTER key to continue,
+EOF
+
+  echo -n "or Control-C to abort... "
+  read a
+}
+
+
+# Start here
+################################################################################
+
+intro
+gpio unexportall
+gpio reset
+
+   errs=0
+totErrs=0
+
+echo ""
+
+# Main pins
+
+testPins 0 7 "The main 8 GPIO pins"
+
+# P5 pins, if a rev 2:
+
+if [ $revision = 2 ]; then
+  testPins 17 20 "The 4 pins on the P5 connector"
+fi
+
+# SPI
+
+testPins 10 14 "The 5 SPI pins"
+
+# Serial
+
+testPins 15 16 "The serial pins"
+
+# I2C - Needs somewhat different testing
+#	due to the on-board pull-up's
+
+echo -n "                  The I2C pins  8: 9: "
+errs=0
+gpio mode 8 in
+gpio mode 9 in
+
+if [ `gpio read 8` = 0 ]; then
+  echo "Pin 8 failure - expected 1, got 0"
+  let errs+=1
+fi
+
+if [ `gpio read 9` = 0 ]; then
+  echo "Pin 9 failure - expected 1, got 0"
+  let errs+=1
+fi
+
+if [ $errs = 0 ]; then
+  echo " OK"
+else
+  printErrCount
+fi
+
+echo ""
+if [ $totErrs != 0 ]; then
+  echo ""
+  echo "Faults detected! Output of 'readall':"
+  gpio readall
+fi
diff --git a/modules/catkin_ws/src/wiringPi/gpio/readall.c b/modules/catkin_ws/src/wiringPi/gpio/readall.c
new file mode 100755
index 0000000000000000000000000000000000000000..f05b2982620076af549f57c1075315dbde78e85a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/readall.c
@@ -0,0 +1,629 @@
+/*
+ * readall.c:
+ *	The readall functions - getting a bit big, so split them out.
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <wiringPi.h>
+
+extern int wpMode ;
+
+#ifndef TRUE
+#  define       TRUE    (1==1)
+#  define       FALSE   (1==2)
+#endif
+
+/*
+ * doReadallExternal:
+ *	A relatively crude way to read the pins on an external device.
+ *	We don't know the input/output mode of pins, but we can tell
+ *	if it's an analog pin or a digital one...
+ *********************************************************************************
+ */
+
+static void doReadallExternal (void)
+{
+  int pin ;
+
+  printf ("+------+---------+--------+\n") ;
+  printf ("|  Pin | Digital | Analog |\n") ;
+  printf ("+------+---------+--------+\n") ;
+
+  for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin)
+    printf ("| %4d |  %4d   |  %4d  |\n", pin, digitalRead (pin), analogRead (pin)) ;
+
+  printf ("+------+---------+--------+\n") ;
+}
+
+
+/*
+ * doReadall:
+ *	Read all the GPIO pins
+ *	We also want to use this to read the state of pins on an externally
+ *	connected device, so we need to do some fiddling with the internal
+ *	wiringPi node structures - since the gpio command can only use
+ *	one external device at a time, we'll use that to our advantage...
+ *********************************************************************************
+ */
+
+static char *alts [] =
+{
+  "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"
+} ;
+
+static int physToWpi [64] = 
+{
+  -1,           // 0
+  -1, -1,       // 1, 2
+   8, -1,
+   9, -1,
+   7, 15,
+  -1, 16,
+   0,  1,
+   2, -1,
+   3,  4,
+  -1,  5,
+  12, -1,
+  13,  6,
+  14, 10,
+  -1, 11,       // 25, 26
+  30, 31,	// Actually I2C, but not used
+  21, -1,
+  22, 26,
+  23, -1,
+  24, 27,
+  25, 28,
+  -1, 29,
+  -1, -1,
+  -1, -1,
+  -1, -1,
+  -1, -1,
+  -1, -1,
+  17, 18,
+  19, 20,
+  -1, -1, -1, -1, -1, -1, -1, -1, -1
+} ;
+
+static char *physNames [64] = 
+{
+  NULL,
+
+  "   3.3v", "5v     ",
+  "  SDA.1", "5V     ",
+  "  SCL.1", "0v     ",
+  "GPIO. 7", "TxD    ",
+  "     0v", "RxD    ",
+  "GPIO. 0", "GPIO. 1",
+  "GPIO. 2", "0v     ",
+  "GPIO. 3", "GPIO. 4",
+  "   3.3v", "GPIO. 5",
+  "   MOSI", "0v     ",
+  "   MISO", "GPIO. 6",
+  "   SCLK", "CE0    ",
+  "     0v", "CE1    ",
+  "  SDA.0", "SCL.0  ",
+  "GPIO.21", "0v     ",
+  "GPIO.22", "GPIO.26",
+  "GPIO.23", "0v     ",
+  "GPIO.24", "GPIO.27",
+  "GPIO.25", "GPIO.28",
+  "     0v", "GPIO.29",
+       NULL, NULL,
+       NULL, NULL,
+       NULL, NULL,
+       NULL, NULL,
+       NULL, NULL,
+  "GPIO.17", "GPIO.18",
+  "GPIO.19", "GPIO.20",
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+} ;
+
+static char *physNamesOdroidc [64] =
+{
+  NULL,
+
+  "    3.3v", "5v      ",
+  "   SDA.1", "5V      ",
+  "   SCL.1", "0v      ",
+  "GPIO. 83", "TxD1    ",
+  "      0v", "RxD1    ",
+  "GPIO. 88", "GPIO. 87",
+  "GPIO.116", "0v      ",
+  "GPIO.115", "GPIO.104",
+  "    3.3v", "GPIO.102",
+  "    MOSI", "0v      ",
+  "    MISO", "GPIO.103",
+  "    SCLK", "CE0     ",
+  "      0v", "GPIO.118",
+  "   SDA.2", "SCL.2   ",
+  "GPIO.101", "0v      ",
+  "GPIO.100", "GPIO. 99",
+  "GPIO.108", "0v      ",
+  "GPIO.97 ", "GPIO. 98",
+  "   AIN.1", "1v8     ",
+  "      0v", "AIN.0   ",
+
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,
+} ;
+
+static char *physNamesOdroidc2_Rev1_1 [64] =
+{
+  NULL,
+
+  "    3.3v", "5v      ",
+  "   SDA.1", "5V      ",
+  "   SCL.1", "0v      ",
+  "GPIO.249", "TxD1    ",
+  "      0v", "RxD1    ",
+  "GPIO.247", "GPIO.238",
+  "GPIO.239", "0v      ",
+  "GPIO.237", "GPIO.236",
+  "    3.3v", "GPIO.233",
+  "GPIO.235", "0v      ",
+  "GPIO.232", "GPIO.231",
+  "GPIO.230", "GPIO.229",
+  "      0v", "GPIO.225",
+  "   SDA.2", "SCL.2   ",
+  "GPIO.228", "0v      ",
+  "GPIO.219", "GPIO.224",
+  "GPIO.234", "0v      ",
+  "GPIO.214", "GPIO.218",
+  "   AIN.1", "1v8     ",
+  "      0v", "AIN.0   ",
+
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,
+} ;
+
+static char *physNamesOdroidc2_Rev1_0 [64] =
+{
+  NULL,
+
+  "    3.3v", "5v      ",
+  "   SDA.1", "5V      ",
+  "   SCL.1", "0v      ",
+  "GPIO.214", "--------",
+  "      0v", "--------",
+  "GPIO.219", "GPIO.218",
+  "GPIO.247", "0v      ",
+  "--------", "GPIO.235",
+  "    3.3v", "GPIO.233",
+  "GPIO.238", "0v      ",
+  "GPIO.237", "GPIO.234",
+  "GPIO.236", "GPIO.248",
+  "      0v", "GPIO.249",
+  "   SDA.2", "SCL.2   ",
+  "GPIO.232", "0v      ",
+  "GPIO.231", "GPIO.230",
+  "GPIO.239", "0v      ",
+  "GPIO.228", "GPIO.229",
+  "   AIN.1", "1v8     ",
+  "      0v", "AIN.0   ",
+
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,
+} ;
+
+static char *physNamesOdroidXU [64] =
+{
+  NULL,
+
+  "    3.3v", "5v      ",
+  "I2C1.SDA", "5V      ",
+  "I2C1.SCL", "0v      ",
+  "GPIO. 18", "UART0.TX",
+  "      0v", "UART0.RX",
+  "GPIO.174", "GPIO.173",
+  "GPIO. 21", "0v      ",
+  "GPIO. 22", "GPIO. 19",
+  "    3.3v", "GPIO. 23",
+  "    MOSI", "0v      ",
+  "    MISO", "GPIO. 24",
+  "    SCLK", "CE0     ",
+  "      0v", "GPIO. 25",
+  "I2C5.SDA", "I2C5.SCL",
+  "GPIO. 28", "0v      ",
+  "GPIO. 30", "GPIO. 29",
+  "GPIO. 31", "0v      ",
+  "POWER ON", "GPIO. 33",
+  "   AIN.0", "1v8     ",
+  "      0v", "AIN.3   ",
+
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
+   NULL,NULL,NULL,
+} ;
+
+/*
+ * readallPhys:
+ *	Given a physical pin output the data on it and the next pin:
+ *| BCM | wPi |   Name  | Mode | Val| Physical |Val | Mode | Name    | wPi | BCM |
+ *********************************************************************************
+ */
+
+static void readallPhys (int physPin)
+{
+  int pin ;
+
+  if (physPinToGpio (physPin) == -1)
+    printf (" |     |    ") ;
+  else
+    printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ;
+
+  printf (" | %s", physNames [physPin]) ;
+
+  if (physToWpi [physPin] == -1)
+    printf (" |      |  ") ;
+  else
+  {
+    /**/ if (wpMode == WPI_MODE_GPIO)
+      pin = physPinToGpio (physPin) ;
+    else if (wpMode == WPI_MODE_PHYS)
+      pin = physPin ;
+    else
+      pin = physToWpi [physPin] ;
+
+    printf (" | %4s", alts [getAlt (pin)]) ;
+    printf (" | %d", digitalRead (pin)) ;
+  }
+
+// Pin numbers:
+
+  printf (" | %2d", physPin) ;
+  ++physPin ;
+  printf (" || %-2d", physPin) ;
+
+// Same, reversed
+
+  if (physToWpi [physPin] == -1)
+    printf (" |   |     ") ;
+  else
+  {
+    /**/ if (wpMode == WPI_MODE_GPIO)
+      pin = physPinToGpio (physPin) ;
+    else if (wpMode == WPI_MODE_PHYS)
+      pin = physPin ;
+    else
+      pin = physToWpi [physPin] ;
+
+    printf (" | %d", digitalRead (pin)) ;
+    printf (" | %-4s", alts [getAlt (pin)]) ;
+  }
+
+  printf (" | %-5s", physNames [physPin]) ;
+
+  if (physToWpi     [physPin] == -1)
+    printf (" |     |    ") ;
+  else
+    printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ;
+
+  printf (" |\n") ;
+}
+
+
+void cmReadall (void)
+{
+  int pin ;
+
+  printf ("+-----+------+-------+      +-----+------+-------+\n") ;
+  printf ("| Pin | Mode | Value |      | Pin | Mode | Value |\n") ;
+  printf ("+-----+------+-------+      +-----+------+-------+\n") ;
+
+  for (pin = 0 ; pin < 28 ; ++pin)
+  {
+    printf ("| %3d ", pin) ;
+    printf ("| %-4s ", alts [getAlt (pin)]) ;
+    printf ("| %s  ", digitalRead (pin) == HIGH ? "High" : "Low ") ;
+    printf ("|      ") ;
+    printf ("| %3d ", pin + 28) ;
+    printf ("| %-4s ", alts [getAlt (pin + 28)]) ;
+    printf ("| %s  ", digitalRead (pin + 28) == HIGH ? "High" : "Low ") ;
+    printf ("|\n") ;
+  }
+
+  printf ("+-----+------+-------+      +-----+------+-------+\n") ;
+}
+
+
+/*
+ * abReadall:
+ *	Read all the pins on the model A or B.
+ *********************************************************************************
+ */
+
+void abReadall (int model, int rev)
+{
+  int pin ;
+  char *type ;
+
+  if (model == PI_MODEL_A)
+    type = " A" ;
+  else
+    if (rev == PI_VERSION_2)
+      type = "B2" ;
+    else
+      type = "B1" ;
+
+  printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ;
+  printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
+  printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
+  for (pin = 1 ; pin <= 26 ; pin += 2)
+    readallPhys (pin) ;
+
+  if (rev == PI_VERSION_2) // B version 2
+  {
+    printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
+    for (pin = 51 ; pin <= 54 ; pin += 2)
+      readallPhys (pin) ;
+  }
+
+  printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
+  printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
+  printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ;
+}
+
+
+/*
+ * piPlusReadall:
+ *	Read all the pins on the model A+ or the B+
+ *********************************************************************************
+ */
+
+void piPlusReadall (int model)
+{
+  int pin ;
+
+  if (model == PI_MODEL_AP)
+    printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ;
+  else
+    printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ;
+
+  printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
+  printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
+  for (pin = 1 ; pin <= 40 ; pin += 2)
+    readallPhys (pin) ;
+  printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ;
+  printf (" | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |\n") ;
+
+  if (model == PI_MODEL_AP)
+    printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ;
+  else
+    printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ;
+}
+
+static void readallPhysOdroidC (int physPin, int model, int rev)
+{
+  int pin ;
+
+  if     ((physPinToGpio (physPin) == -1)  && (physToWpi [physPin] == -1))
+    printf (" |      |    ");
+  else if (physPinToGpio (physPin) != -1)
+    printf (" |  %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]);
+  else
+    printf (" |      | %3d", physToWpi [physPin]);
+
+  if (model == PI_MODEL_ODROIDC)
+	printf (" | %s", physNamesOdroidc [physPin]) ;
+  else {
+	if (rev == PI_VERSION_1)
+		printf (" | %s", physNamesOdroidc2_Rev1_0 [physPin]) ;
+	else
+		printf (" | %s", physNamesOdroidc2_Rev1_1 [physPin]) ;
+  }
+
+  if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
+    printf (" |      |  ");
+  else
+  {
+    /**/ if (wpMode == WPI_MODE_GPIO)
+      pin = physPinToGpio (physPin) ;
+    else if (wpMode == WPI_MODE_PHYS)
+      pin = physPin ;
+    else
+      pin = physToWpi [physPin] ;
+
+	if( physPinToGpio (physPin) == -1 )	{
+	    printf (" |      |  ") ;
+	}
+	else	{
+	    printf (" | %4s", alts [getAlt (pin)]) ;
+	    printf (" | %d", digitalRead (pin)) ;
+	}
+  }
+
+// Pin numbers:
+
+  printf (" | %2d", physPin) ;
+  ++physPin ;
+  printf (" || %-2d", physPin) ;
+
+// Same, reversed
+
+  if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
+    printf (" |   |     ");
+  else
+  {
+    /**/ if (wpMode == WPI_MODE_GPIO)
+      pin = physPinToGpio (physPin) ;
+    else if (wpMode == WPI_MODE_PHYS)
+      pin = physPin ;
+    else
+      pin = physToWpi [physPin] ;
+
+	if (physPinToGpio (physPin) == -1)	{
+	    printf (" |   |     ") ;
+	}
+	else	{
+	    printf (" | %d", digitalRead (pin)) ;
+	    printf (" | %-4s", alts [getAlt (pin)]) ;
+	}
+  }
+
+  if (model == PI_MODEL_ODROIDC)
+	  printf (" | %-6s", physNamesOdroidc [physPin]) ;
+  else {
+	if (rev == PI_VERSION_1)
+		printf (" | %-6s", physNamesOdroidc2_Rev1_0 [physPin]) ;
+	else
+		printf (" | %-6s", physNamesOdroidc2_Rev1_1 [physPin]) ;
+  }
+
+  if     ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
+    printf (" |     |     ");
+  else if (physPinToGpio (physPin) != -1)
+    printf (" | %-3d |  %-3d", physToWpi [physPin], physPinToGpio (physPin));
+  else
+    printf (" | %-3d |     ", physToWpi [physPin]);
+
+  printf (" |\n") ;
+}
+
+void ReadallOdroidC (int model, int rev)
+{
+  int pin ;
+
+  if(model == PI_MODEL_ODROIDC2)
+	printf (" +------+-----+----------+------+ Model  ODROID-C2 +------+----------+-----+------+\n") ;
+  else
+	printf (" +------+-----+----------+------+- Model ODROID-C -+------+----------+-----+------+\n") ;
+
+  printf (" | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode |   Name   | wPi | GPIO |\n") ;
+  printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ;
+  for (pin = 1 ; pin <= 40 ; pin += 2)
+    readallPhysOdroidC (pin, model, rev) ;
+  printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ;
+}
+
+static void readallPhysOdroidXU (int physPin)
+{
+  int pin ;
+
+  if     ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
+    printf (" |      |    ") ;
+  else if (physPinToGpio (physPin) != -1)
+    printf (" |  %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]);
+  else
+    printf (" |      | %3d", physToWpi [physPin]);
+
+  printf (" | %s", physNamesOdroidXU [physPin]) ;
+
+  if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
+    printf (" |      |  ") ;
+  else
+  {
+    /**/ if (wpMode == WPI_MODE_GPIO)
+      pin = physPinToGpio (physPin) ;
+    else if (wpMode == WPI_MODE_PHYS)
+      pin = physPin ;
+    else
+      pin = physToWpi [physPin] ;
+
+    printf (" | %4s", alts [getAlt (pin)]) ;
+    printf (" | %d", digitalRead (pin)) ;
+  }
+
+// Pin numbers:
+
+  printf (" | %2d", physPin) ;
+  ++physPin ;
+  printf (" || %-2d", physPin) ;
+
+// Same, reversed
+
+  if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
+    printf (" |   |     ") ;
+  else
+  {
+    /**/ if (wpMode == WPI_MODE_GPIO)
+      pin = physPinToGpio (physPin) ;
+    else if (wpMode == WPI_MODE_PHYS)
+      pin = physPin ;
+    else
+      pin = physToWpi [physPin] ;
+
+    printf (" | %d", digitalRead (pin)) ;
+    printf (" | %-4s", alts [getAlt (pin)]) ;
+  }
+
+  printf (" | %-6s", physNamesOdroidXU [physPin]) ;
+
+  if     ((physPinToGpio (physPin) == -1) && (physToWpi [physPin] == -1))
+    printf (" |     |     ") ;
+  else if (physPinToGpio (physPin) != -1)
+    printf (" | %-3d |  %-3d", physToWpi [physPin], physPinToGpio (physPin));
+  else
+    printf (" | %-3d |     ", physToWpi [physPin]);
+
+  printf (" |\n") ;
+}
+
+void ReadallOdroidXU (void)
+{
+  int pin ;
+
+  printf (" +------+-----+----------+------ Model ODROID-XU3/4 ------+----------+-----+------+\n") ;
+  printf (" | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode |   Name   | wPi | GPIO |\n") ;
+  printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ;
+  for (pin = 1 ; pin <= 40 ; pin += 2)
+    readallPhysOdroidXU (pin) ;
+  printf (" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n") ;
+}
+
+void doReadall (void)
+{
+  int model, rev, mem, maker, overVolted ;
+
+  if (wiringPiNodes != NULL)	// External readall
+  {
+    doReadallExternal () ;
+    return ;
+  }
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+
+  /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B))
+    abReadall (model, rev) ;
+  else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP))
+    piPlusReadall (model) ;
+  else if (model == PI_MODEL_CM)
+    cmReadall () ;
+  else if (model == PI_MODEL_ODROIDC || model == PI_MODEL_ODROIDC2)
+    ReadallOdroidC (model, rev);
+  else if (model == PI_MODEL_ODROIDXU_34)
+    ReadallOdroidXU();
+  else
+    printf ("Oops - unable to determine board type... model: %d\n", model) ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/gpio/readall.o b/modules/catkin_ws/src/wiringPi/gpio/readall.o
new file mode 100644
index 0000000000000000000000000000000000000000..857e25e18132f7e867ea0a3d927d5de9b0080521
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/gpio/readall.o differ
diff --git a/modules/catkin_ws/src/wiringPi/gpio/test.sh b/modules/catkin_ws/src/wiringPi/gpio/test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a7c2bb22658514d64ade4cb02d919740d1c5a4c0
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/gpio/test.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+#
+# test.sh:
+#	Simple test: Assumes LEDs on Pins 0-7 and lights them
+#	in-turn.
+#################################################################################
+# This file is part of wiringPi:
+#	Wiring Compatable library for the Raspberry Pi
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+# Simple test - assumes LEDs on Pins 0-7.
+
+for i in `seq 0 7`;
+do
+  gpio mode $i out
+done
+
+while true;
+do
+  for i in `seq 0 7`;
+  do
+    gpio write $i 1
+    sleep 0.1
+  done
+
+  for i in `seq 0 7`;
+  do
+    gpio write $i 0
+    sleep 0.1
+  done
+done
diff --git a/modules/catkin_ws/src/wiringPi/pins/Makefile b/modules/catkin_ws/src/wiringPi/pins/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..fd34ee930ac8fc730b659b1713652d2a0ad70a7c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/pins/Makefile
@@ -0,0 +1,18 @@
+
+SRC	=	pins.tex
+
+
+all:		${SRC}
+	@echo	Generating DVI
+	@latex  pins.tex
+
+pins.dvi:	pins.tex
+	@latex  pins.tex
+
+pdf:	pins.dvi
+	@dvipdf pins.dvi
+
+
+.PHONY:	clean
+clean:
+	@rm -f *.dvi *.aux *.log *.ps *.toc *.bak *~
diff --git a/modules/catkin_ws/src/wiringPi/pins/pins.pdf b/modules/catkin_ws/src/wiringPi/pins/pins.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..bd9629d62044179a5532a68a0eb0dbd7b3ac2dd1
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/pins/pins.pdf differ
diff --git a/modules/catkin_ws/src/wiringPi/pins/pins.tex b/modules/catkin_ws/src/wiringPi/pins/pins.tex
new file mode 100644
index 0000000000000000000000000000000000000000..c3753e9e60931593075f77e68d6a5e73f3de9964
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/pins/pins.tex
@@ -0,0 +1,116 @@
+\documentclass[12pt,a4paper]{article}
+\parskip 1ex
+\parindent 0em
+\thispagestyle{empty}
+\pagestyle{plain}
+\pagenumbering{arabic}
+\setlength{\topmargin}{0pt}
+\setlength{\headheight}{0pt}
+\setlength{\headsep}{0pt}
+\setlength{\topskip}{0pt}
+\setlength{\textheight}{240mm}
+\setlength{\footskip}{5ex}
+\setlength{\oddsidemargin}{0pt}
+\setlength{\evensidemargin}{0pt}
+\setlength{\textwidth}{160mm}
+\usepackage[dvips]{graphics,color}
+\usepackage{helvet}
+\renewcommand{\familydefault}{\sfdefault}
+\begin{document}
+\begin{sffamily}
+\definecolor{rtb-black}{rgb}  {0.0, 0.0, 0.0}
+\definecolor{rtb-navy}{rgb}   {0.0, 0.0, 0.5}
+\definecolor{rtb-green}{rgb}  {0.0, 0.5, 0.0}
+\definecolor{rtb-teal}{rgb}   {0.0, 0.5, 0.5}
+\definecolor{rtb-maroon}{rgb} {0.5, 0.0, 0.0}
+\definecolor{rtb-purple}{rgb} {0.5, 0.0, 0.5}
+\definecolor{rtb-olive}{rgb}  {0.5, 0.5, 0.0}
+\definecolor{rtb-silver}{rgb} {0.7, 0.7, 0.7}
+\definecolor{rtb-grey}{rgb}   {0.5, 0.5, 0.5}
+\definecolor{rtb-blue}{rgb}   {0.0, 0.0, 1.0}
+\definecolor{rtb-lime}{rgb}   {0.0, 1.0, 0.0}
+\definecolor{rtb-aqua}{rgb}   {0.0, 1.0, 1.0}
+\definecolor{rtb-red}{rgb}    {1.0, 0.0, 0.0}
+\definecolor{rtb-fuchsia}{rgb}{1.0, 0.0, 1.0}
+\definecolor{rtb-yellow}{rgb} {1.0, 1.0, 0.0}
+\definecolor{rtb-white}{rgb}  {1.0, 1.0, 1.0}
+
+\begin{center}
+\bfseries{WiringPi: GPIO Pin Numbering Tables}\\
+\tt{http://wiringpi.com/}
+\end{center}
+
+\begin{center}
+\begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|}
+\hline
+\multicolumn{8}{|c|}{\bfseries{P1: The Main GPIO connector}}\\
+\hline
+\hline
+WiringPi Pin	& BCM GPIO	& Name	& \multicolumn{2}{|c||}{Header}	& Name	& BCM GPIO	& WiringPi Pin\\
+\hline
+\hline
+	& 			& \textcolor{rtb-red}{3.3v}	& \raggedleft{1} &  2 & \textcolor{rtb-maroon}{5v}	& 	& \\
+\hline
+8	& Rv1:0 - Rv2:2		& \textcolor{rtb-aqua}{SDA}	& \raggedleft{3} &  4 & \textcolor{rtb-maroon}{5v}	& 	& \\
+\hline
+9	& Rv1:1 - Rv2:3		& \textcolor{rtb-aqua}{SCL}	& \raggedleft{5} &  6 & \textcolor{rtb-black}{0v}	& 	& \\
+\hline
+7	& 4			& \textcolor{rtb-green}{GPIO7}	& \raggedleft{7} &  8 & \textcolor{rtb-yellow}{TxD}	& 14    & 15\\
+\hline
+	& 			& \textcolor{rtb-black}{0v}	& \raggedleft{9} & 10 & \textcolor{rtb-yellow}{RxD}	& 15	& 16\\
+\hline
+0	& 17			& \textcolor{rtb-green}{GPIO0}	& \raggedleft{11} & 12 & \textcolor{rtb-green}{GPIO1}	& 18	& 1\\
+\hline
+2	& Rv1:21 - Rv2:27	& \textcolor{rtb-green}{GPIO2}	& \raggedleft{13} & 14 & \textcolor{rtb-black}{0v}	& 	& \\
+\hline
+3	& 22			& \textcolor{rtb-green}{GPIO3}	& \raggedleft{15} & 16 & \textcolor{rtb-green}{GPIO4}	& 23	& 4\\
+\hline
+	& 			& \textcolor{rtb-red}{3.3v}	& \raggedleft{17} & 18 & \textcolor{rtb-green}{GPIO5}	& 24	& 5\\
+\hline
+12	& 10			& \textcolor{rtb-teal}{MOSI}	& \raggedleft{19} & 20 & \textcolor{rtb-black}{0v}	& 	& \\
+\hline
+13	& 9			& \textcolor{rtb-teal}{MISO}	& \raggedleft{21} & 22 & \textcolor{rtb-green}{GPIO6}	& 25	& 6\\
+\hline
+14	& 11			& \textcolor{rtb-teal}{SCLK}	& \raggedleft{23} & 24 & \textcolor{rtb-teal}{CE0}	& 8	& 10\\
+\hline
+	& 			& \textcolor{rtb-black}{0v}	& \raggedleft{25} & 26 & \textcolor{rtb-teal}{CE1}	& 7	& 11\\
+\hline
+\hline
+WiringPi Pin	& BCM GPIO	& Name	& \multicolumn{2}{|c||}{Header}	& Name	& BCM GPIO	& WiringPi Pin\\
+\hline
+\end{tabular}
+\end{center}
+
+Note the differences between Revision 1 and Revision 2 Raspberry
+Pi's. The Revision 2 is readily identifiable by the presence of the 2
+mounting holes.
+
+The revision 2 Raspberry Pi has an additional GPIO connector, P5, which is next to the main P1 GPIO
+connector:
+
+\begin{center}
+\begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|}
+\hline
+\multicolumn{8}{|c|}{\bfseries{P5: Secondary GPIO connector (Rev. 2 Pi only)}}\\
+\hline
+\hline
+WiringPi Pin	& BCM GPIO	& Name	& \multicolumn{2}{|c||}{Header}	& Name	& BCM GPIO	& WiringPi Pin\\
+\hline
+\hline
+	& 		& \textcolor{rtb-maroon}{5v}	& \raggedleft{1} &  2 & \textcolor{rtb-red}{3.3v}	& 	&	\\
+\hline
+17	& 28		& \textcolor{rtb-green}{GPIO8}	& \raggedleft{3} &  4 & \textcolor{rtb-green}{GPIO9}	& 29	& 18	\\
+\hline
+19	& 30		& \textcolor{rtb-green}{GPIO10}	& \raggedleft{5} &  6 & \textcolor{rtb-green}{GPIO11}	& 31	& 20	\\
+\hline
+	& 		& \textcolor{rtb-black}{0v}	& \raggedleft{7} &  8 & \textcolor{rtb-black}{0v}	& 	&	\\
+\hline
+\hline
+WiringPi Pin	& BCM GPIO	& Name	& \multicolumn{2}{|c||}{Header}	& Name	& BCM GPIO	& WiringPi Pin\\
+\hline
+\end{tabular}
+\end{center}
+
+
+\end{sffamily}
+\end{document}
diff --git a/modules/catkin_ws/src/wiringPi/postinstall-pak b/modules/catkin_ws/src/wiringPi/postinstall-pak
new file mode 100644
index 0000000000000000000000000000000000000000..469eb470f73bc58e4dd4b0c669af66b206f1cda8
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/postinstall-pak
@@ -0,0 +1,7 @@
+#!/bin/bash
+echo
+echo "WiringPi for C1 is now installed"
+echo "Please check the wiki: http://odroid.com/dokuwiki/doku.php?id=en:odroid-c1"
+echo "For extra references:"
+echo "Github: https://github.com/hardkernel/wiringPi"
+echo "Examples folder is copied to /usr/share/wiringPi/examples"
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/COPYING.LESSER b/modules/catkin_ws/src/wiringPi/wiringPi/COPYING.LESSER
new file mode 100644
index 0000000000000000000000000000000000000000..65c5ca88a67c30becee01c5a8816d964b03862f9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/COPYING.LESSER
@@ -0,0 +1,165 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/Makefile b/modules/catkin_ws/src/wiringPi/wiringPi/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..4e3342e03ca354c531fc3f687885a360ca7a9432
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/Makefile
@@ -0,0 +1,193 @@
+# ;
+# Makefile:
+#	wiringPi - Wiring Compatable library for the Raspberry Pi
+#
+#	Copyright (c) 2012 Gordon Henderson
+#################################################################################
+# This file is part of wiringPi:
+#	https://projects.drogon.net/raspberry-pi/wiringpi/
+#
+#    wiringPi 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 3 of the License, or
+#    (at your option) any later version.
+#
+#    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+#################################################################################
+
+DYN_VERS_MAJ=2
+DYN_VERS_MIN=0
+
+VERSION=$(DYN_VERS_MAJ).$(DYN_VERS_MIN)
+DESTDIR=/usr
+PREFIX=/local
+
+STATIC=libwiringPi.a
+DYNAMIC=libwiringPi.so.$(VERSION)
+
+#DEBUG	= -g -O0
+DEBUG	= -O2
+CC	= gcc
+INCLUDE	= -I.
+DEFS	= -D_GNU_SOURCE
+CFLAGS	= $(DEBUG) $(DEFS) -Wformat=2 -Wall -Winline $(INCLUDE) -pipe -fPIC
+
+LIBS    =
+
+# Should not alter anything below this line
+###############################################################################
+
+SRC	=	wiringPi.c						\
+		wiringSerial.c wiringShift.c				\
+		piHiPri.c piThread.c					\
+		wiringPiSPI.c wiringPiI2C.c				\
+		softPwm.c softTone.c					\
+		mcp23008.c mcp23016.c mcp23017.c			\
+		mcp23s08.c mcp23s17.c					\
+		sr595.c							\
+		pcf8574.c pcf8591.c					\
+		mcp3002.c mcp3004.c mcp4802.c mcp3422.c			\
+		max31855.c max5322.c					\
+		sn3218.c						\
+		drcSerial.c
+
+OBJ	=	$(SRC:.c=.o)
+
+all:		$(DYNAMIC)
+
+static:		$(STATIC)
+
+$(STATIC):	$(OBJ)
+	@echo "[Link (Static)]"
+	@ar rcs $(STATIC) $(OBJ)
+	@ranlib $(STATIC)
+#	@size   $(STATIC)
+
+$(DYNAMIC):	$(OBJ)
+	@echo "[Link (Dynamic)]"
+	@$(CC) -shared -Wl,-soname,libwiringPi.so -o libwiringPi.so.$(VERSION) -lpthread $(OBJ)
+
+.c.o:
+	@echo [Compile] $<
+	@$(CC) -c $(CFLAGS) $< -o $@
+
+.PHONY:	clean
+clean:
+	@echo "[Clean]"
+	@rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.*
+
+.PHONY:	tags
+tags:	$(SRC)
+	@echo [ctags]
+	@ctags $(SRC)
+
+
+.PHONY:	install-headers
+install-headers:
+	@echo "[Install Headers]"
+	@install -m 0755 -d			$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 wiringPi.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 wiringSerial.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 wiringShift.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 softPwm.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 softTone.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 wiringPiSPI.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 wiringPiI2C.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 drcSerial.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp23008.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp23016.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp23017.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp23s08.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp23s17.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 max31855.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 max5322.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp3002.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp3004.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp4802.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 mcp3422.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 sr595.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 pcf8574.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 pcf8591.h		$(DESTDIR)$(PREFIX)/include
+	@install -m 0644 sn3218.h		$(DESTDIR)$(PREFIX)/include
+
+.PHONY:	install
+install:	$(DYNAMIC) install-headers
+	@echo "[Install Dynamic Lib]"
+	@install -m 0755 -d						$(DESTDIR)$(PREFIX)/lib
+	@install -m 0755 libwiringPi.so.$(VERSION)			$(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)
+	@ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION)	$(DESTDIR)/lib/libwiringPi.so
+	@ldconfig
+
+.PHONY:	install-static
+install-static:	$(STATIC) install-headers
+	@echo "[Install Static Lib]"
+	@install -m 0755 -d			$(DESTDIR)$(PREFIX)/lib
+	@install -m 0755 libwiringPi.a		$(DESTDIR)$(PREFIX)/lib
+
+.PHONY:	uninstall
+uninstall:
+	@echo "[UnInstall]"
+	@rm -f $(DESTDIR)$(PREFIX)/include/wiringPi.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/wiringSerial.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/wiringShift.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/softPwm.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/softTone.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/wiringPiSPI.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/wiringPiI2C.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/drcSerial.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23008.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23016.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23017.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23s08.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp23s17.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/max31855.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/max5322.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp3002.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp3004.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp4802.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/mcp3422.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/sr595.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/pcf8574.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/pcf8591.h
+	@rm -f $(DESTDIR)$(PREFIX)/include/sn3218.h
+	@rm -f $(DESTDIR)$(PREFIX)/lib/libwiringPi.*
+	@ldconfig
+
+
+.PHONY:	depend
+depend:
+	makedepend -Y $(SRC) $(SRC_I2C)
+
+# DO NOT DELETE
+
+wiringPi.o: softPwm.h softTone.h wiringPi.h
+wiringSerial.o: wiringSerial.h
+wiringShift.o: wiringPi.h wiringShift.h
+piHiPri.o: wiringPi.h
+piThread.o: wiringPi.h
+wiringPiSPI.o: wiringPi.h wiringPiSPI.h
+wiringPiI2C.o: wiringPi.h wiringPiI2C.h
+softPwm.o: wiringPi.h softPwm.h
+softTone.o: wiringPi.h softTone.h
+mcp23008.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23008.h
+mcp23016.o: wiringPi.h wiringPiI2C.h mcp23016.h mcp23016reg.h
+mcp23017.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23017.h
+mcp23s08.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s08.h
+mcp23s17.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s17.h
+sr595.o: wiringPi.h sr595.h
+pcf8574.o: wiringPi.h wiringPiI2C.h pcf8574.h
+pcf8591.o: wiringPi.h wiringPiI2C.h pcf8591.h
+mcp3002.o: wiringPi.h wiringPiSPI.h mcp3002.h
+mcp3004.o: wiringPi.h wiringPiSPI.h mcp3004.h
+mcp4802.o: wiringPi.h wiringPiSPI.h mcp4802.h
+mcp3422.o: wiringPi.h wiringPiI2C.h mcp3422.h
+max31855.o: wiringPi.h wiringPiSPI.h max31855.h
+max5322.o: wiringPi.h wiringPiSPI.h max5322.h
+sn3218.o: wiringPi.h wiringPiI2C.h sn3218.h
+drcSerial.o: wiringPi.h wiringSerial.h drcSerial.h
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.c b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.c
new file mode 100644
index 0000000000000000000000000000000000000000..6491a98c3ad4fd03860ee3ee9e215d2c8a8c9ad9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.c
@@ -0,0 +1,201 @@
+/*
+ * drcSerial.c:
+ *	Extend wiringPi with the DRC Serial protocol (e.g. to Arduino)
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+#include <errno.h>
+
+#include "wiringPi.h"
+#include "wiringSerial.h"
+
+#include "drcSerial.h"
+
+#ifndef	TRUE
+#  define	TRUE	(1==1)
+#  define	FALSE	(1==2)
+#endif
+
+
+/*
+ * myPinMode:
+ *	Change the pin mode on the remote DRC device
+ *********************************************************************************
+ */
+
+static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  /**/ if (mode == OUTPUT)
+    serialPutchar (node->fd, 'o') ;       // Input
+  else if (mode == PWM_OUTPUT)
+    serialPutchar (node->fd, 'p') ;       // PWM
+  else
+    serialPutchar (node->fd, 'i') ;       // Default to input
+
+  serialPutchar (node->fd, pin - node->pinBase) ;
+}
+
+
+/*
+ * myPullUpDnControl:
+ *	ATmegas only have pull-up's on of off. No pull-downs.
+ *********************************************************************************
+ */
+
+static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+
+// Force pin into input mode
+
+  serialPutchar (node->fd, 'i' ) ;
+  serialPutchar (node->fd, pin - node->pinBase) ;
+
+  /**/ if (mode == PUD_UP)
+  {
+    serialPutchar (node->fd, '1') ;
+    serialPutchar (node->fd, pin - node->pinBase) ;
+  }
+  else if (mode == PUD_OFF)
+  {
+    serialPutchar (node->fd, '0') ;
+    serialPutchar (node->fd, pin - node->pinBase) ;
+  }
+}
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  serialPutchar (node->fd, value == 0 ? '0' : '1') ;
+  serialPutchar (node->fd, pin - node->pinBase) ;
+}
+
+
+/*
+ * myPwmWrite:
+ *********************************************************************************
+ */
+
+static void myPwmWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  serialPutchar (node->fd, 'v') ;
+  serialPutchar (node->fd, pin - node->pinBase) ;
+  serialPutchar (node->fd, value & 0xFF) ;
+}
+
+
+/*
+ * myAnalogRead:
+ *********************************************************************************
+ */
+
+static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int vHi, vLo ;
+
+  serialPutchar (node->fd, 'a') ;
+  serialPutchar (node->fd, pin - node->pinBase) ;
+  vHi = serialGetchar (node->fd) ;
+  vLo = serialGetchar (node->fd) ;
+
+  return (vHi << 8) | vLo ;
+}
+
+
+/*
+ * myDigitalRead:
+ *********************************************************************************
+ */
+
+static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  serialPutchar (node->fd, 'r') ; // Send read command
+  serialPutchar (node->fd, pin - node->pinBase) ;
+  return (serialGetchar (node->fd) == '0') ? 0 : 1 ;
+}
+
+
+/*
+ * drcSetup:
+ *	Create a new instance of an DRC GPIO interface.
+ *	Could be a variable nunber of pins here - we might not know in advance
+ *	if it's an ATmega with 14 pins, or something with less or more!
+ *********************************************************************************
+ */
+
+int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud)
+{
+  int fd ;
+  int ok, tries ;
+  time_t then ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = serialOpen (device, baud)) < 0)
+    return wiringPiFailure (WPI_ALMOST, "Unable to open DRC device (%s): %s", device, strerror (errno)) ;
+
+  delay (10) ;	// May need longer if it's an Uno that reboots on the open...
+
+// Flush any pending input
+
+  while (serialDataAvail (fd))
+    (void)serialGetchar (fd) ;
+
+  ok = FALSE ;
+  for (tries = 1 ; (tries < 5) && (!ok) ; ++tries)
+  {
+    serialPutchar (fd, '@') ;		// Ping
+    then = time (NULL) + 2 ;
+    while (time (NULL) < then)
+      if (serialDataAvail (fd))
+      {
+        if (serialGetchar (fd) == '@')
+        {
+          ok = TRUE ;
+          break ;
+        }
+      }
+  }
+
+  if (!ok)
+  {
+    serialClose (fd) ;
+    return wiringPiFailure (WPI_FATAL, "Unable to communicate with DRC serial device") ;
+  }
+
+  node = wiringPiNewNode (pinBase, numPins) ;
+
+  node->fd              = fd ;
+  node->pinMode         = myPinMode ;
+  node->pullUpDnControl = myPullUpDnControl ;
+  node->analogRead      = myAnalogRead ;
+  node->digitalRead     = myDigitalRead ;
+  node->digitalWrite    = myDigitalWrite ;
+  node->pwmWrite        = myPwmWrite ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.h b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.h
new file mode 100644
index 0000000000000000000000000000000000000000..29e988e1fbab27e7f5e168afa7e2e9d800ec899a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.h
@@ -0,0 +1,33 @@
+/*
+ * drcSerial.h:
+ *	Extend wiringPi with the DRC Serial protocol (e.g. to Arduino)
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.o b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.o
new file mode 100644
index 0000000000000000000000000000000000000000..ba441cc869b08506fea8d047bfda37048a161705
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/drcSerial.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/libwiringPi.so.2.0 b/modules/catkin_ws/src/wiringPi/wiringPi/libwiringPi.so.2.0
new file mode 100755
index 0000000000000000000000000000000000000000..801a295cad6d5acc33144088a4343f6b3b5d6281
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/libwiringPi.so.2.0 differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max31855.c b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.c
new file mode 100644
index 0000000000000000000000000000000000000000..21858391b406e73107565695a5b29bbb13c1909c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.c
@@ -0,0 +1,81 @@
+/*
+ * max31855.c:
+ *	Extend wiringPi with the max31855 SPI Analog to Digital convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+
+#include "max31855.h"
+
+/*
+ * myAnalogRead:
+ *	Return the analog value of the given pin
+ *	Note: The chip really only has one read "channel", but we're faking it
+ *	here so we can read the error registers. Channel 0 will be the data
+ *	channel, and 1 is the error register code.
+ *	Note: Temperature returned is temp in C * 4, so divide result by 4
+ *********************************************************************************
+ */
+
+static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
+{
+  unsigned int spiData ;
+  int temp ;
+  int chan = pin - node->pinBase ;
+
+  wiringPiSPIDataRW (node->fd, (unsigned char *)&spiData, 4) ;
+
+  if (chan == 0)			// Read temp in C
+  {
+    spiData >>= 18 ;
+    temp = spiData & 0x3FFF ;		// Bottom 13 bits
+    if ((spiData & 0x2000) != 0)	// Negative
+      temp = -temp ;
+    return temp ;
+  }
+  else					// Return error bits
+    return spiData & 0x7 ;
+}
+
+
+/*
+ * max31855Setup:
+ *	Create a new wiringPi device node for an max31855 on the Pi's
+ *	SPI interface.
+ *********************************************************************************
+ */
+
+int max31855Setup (const int pinBase, int spiChannel)
+{
+  struct wiringPiNodeStruct *node ;
+
+  if (wiringPiSPISetup (spiChannel, 5000000) < 0)	// 5MHz - prob 4 on the Pi
+    return -1 ;
+
+  node = wiringPiNewNode (pinBase, 2) ;
+
+  node->fd         = spiChannel ;
+  node->analogRead = myAnalogRead ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max31855.h b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.h
new file mode 100644
index 0000000000000000000000000000000000000000..385c4bd361a15a25291da2dfe1476f263fbe6478
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.h
@@ -0,0 +1,33 @@
+/*
+ * max31855.c:
+ *	Extend wiringPi with the MAX31855 SPI Thermocouple driver
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int max31855Setup (int pinBase, int spiChannel) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max31855.o b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.o
new file mode 100644
index 0000000000000000000000000000000000000000..6fec57b600b24b76b0ccf117f6f43a1abebd0616
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/max31855.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max5322.c b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.c
new file mode 100644
index 0000000000000000000000000000000000000000..b7cd6a9497cbe302fd45fbedbdb68916d55e0487
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.c
@@ -0,0 +1,84 @@
+/*
+ * max5322.c:
+ *	Extend wiringPi with the MAX5322 SPI Digital to Analog convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+
+#include "max5322.h"
+
+/*
+ * myAnalogWrite:
+ *	Write analog value on the given pin
+ *********************************************************************************
+ */
+
+static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  unsigned char spiData [2] ;
+  unsigned char chanBits, dataBits ;
+  int chan = pin - node->pinBase ;
+
+  if (chan == 0)
+    chanBits = 0b01000000 ;
+  else
+    chanBits = 0b01010000 ;
+
+  chanBits |= ((value >> 12) & 0x0F) ;
+  dataBits  = ((value      ) & 0xFF) ;
+
+  spiData [0] = chanBits ;
+  spiData [1] = dataBits ;
+
+  wiringPiSPIDataRW (node->fd, spiData, 2) ;
+}
+
+/*
+ * max5322Setup:
+ *	Create a new wiringPi device node for an max5322 on the Pi's
+ *	SPI interface.
+ *********************************************************************************
+ */
+
+int max5322Setup (const int pinBase, int spiChannel)
+{
+  struct wiringPiNodeStruct *node ;
+  unsigned char spiData [2] ;
+
+  if (wiringPiSPISetup (spiChannel, 8000000) < 0)	// 10MHz Max
+    return -1 ;
+
+  node = wiringPiNewNode (pinBase, 2) ;
+
+  node->fd          = spiChannel ;
+  node->analogWrite = myAnalogWrite ;
+
+// Enable both DACs
+
+  spiData [0] = 0b11100000 ;
+  spiData [1] = 0 ;
+  
+  wiringPiSPIDataRW (node->fd, spiData, 2) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max5322.h b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.h
new file mode 100644
index 0000000000000000000000000000000000000000..a217cf88f2bc968692aa93bdde604305594444a6
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.h
@@ -0,0 +1,33 @@
+/*
+ * max5322.h:
+ *	Extend wiringPi with the MAX5322 SPI Digital to Analog convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int max5322Setup (int pinBase, int spiChannel) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/max5322.o b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.o
new file mode 100644
index 0000000000000000000000000000000000000000..157c4dea98aa1d1606cb7005b31605e3dd56c326
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/max5322.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.c
new file mode 100644
index 0000000000000000000000000000000000000000..d21d23786adcc49d95b7bb1d4fb8c1e9a1e5f8c3
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.c
@@ -0,0 +1,149 @@
+/*
+ * mcp23008.c:
+ *	Extend wiringPi with the MCP 23008 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+
+#include "wiringPi.h"
+#include "wiringPiI2C.h"
+#include "mcp23x0817.h"
+
+#include "mcp23008.h"
+
+
+/*
+ * myPinMode:
+ *********************************************************************************
+ */
+
+static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  reg  = MCP23x08_IODIR ;
+  mask = 1 << (pin - node->pinBase) ;
+  old  = wiringPiI2CReadReg8 (node->fd, reg) ;
+
+  if (mode == OUTPUT)
+    old &= (~mask) ;
+  else
+    old |=   mask ;
+
+  wiringPiI2CWriteReg8 (node->fd, reg, old) ;
+}
+
+
+/*
+ * myPullUpDnControl:
+ *********************************************************************************
+ */
+
+static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  reg  = MCP23x08_GPPU ;
+  mask = 1 << (pin - node->pinBase) ;
+
+  old  = wiringPiI2CReadReg8 (node->fd, reg) ;
+
+  if (mode == PUD_UP)
+    old |=   mask ;
+  else
+    old &= (~mask) ;
+
+  wiringPiI2CWriteReg8 (node->fd, reg, old) ;
+}
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  int bit, old ;
+
+  bit  = 1 << ((pin - node->pinBase) & 7) ;
+
+  old = node->data2 ;
+  if (value == LOW)
+    old &= (~bit) ;
+  else
+    old |=   bit ;
+
+  wiringPiI2CWriteReg8 (node->fd, MCP23x08_GPIO, old) ;
+  node->data2 = old ;
+}
+
+
+/*
+ * myDigitalRead:
+ *********************************************************************************
+ */
+
+static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int mask, value ;
+
+  mask  = 1 << ((pin - node->pinBase) & 7) ;
+  value = wiringPiI2CReadReg8 (node->fd, MCP23x08_GPIO) ;
+
+  if ((value & mask) == 0)
+    return LOW ;
+  else 
+    return HIGH ;
+}
+
+
+/*
+ * mcp23008Setup:
+ *	Create a new instance of an MCP23008 I2C GPIO interface. We know it
+ *	has 8 pins, so all we need to know here is the I2C address and the
+ *	user-defined pin base.
+ *********************************************************************************
+ */
+
+int mcp23008Setup (const int pinBase, const int i2cAddress)
+{
+  int fd ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
+    return fd ;
+
+  wiringPiI2CWriteReg8 (fd, MCP23x08_IOCON, IOCON_INIT) ;
+
+  node = wiringPiNewNode (pinBase, 8) ;
+
+  node->fd              = fd ;
+  node->pinMode         = myPinMode ;
+  node->pullUpDnControl = myPullUpDnControl ;
+  node->digitalRead     = myDigitalRead ;
+  node->digitalWrite    = myDigitalWrite ;
+  node->data2           = wiringPiI2CReadReg8 (fd, MCP23x08_OLAT) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.h
new file mode 100644
index 0000000000000000000000000000000000000000..e9299a8cfb5f836739be86311f7ea44f1f2cf9a7
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.h
@@ -0,0 +1,33 @@
+/*
+ * 23008.h:
+ *	Extend wiringPi with the MCP 23008 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp23008Setup (const int pinBase, const int i2cAddress) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.o
new file mode 100644
index 0000000000000000000000000000000000000000..03a0289efb5e21db0906e1cbe9ec48814c15d247
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23008.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.c
new file mode 100644
index 0000000000000000000000000000000000000000..e5cc6328ebdcd8bc9d4b4c1e2b6bf452f177487d
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.c
@@ -0,0 +1,164 @@
+/*
+ * mcp23016.c:
+ *	Extend wiringPi with the MCP 23016 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+
+#include "wiringPi.h"
+#include "wiringPiI2C.h"
+#include "mcp23016.h"
+
+#include "mcp23016reg.h"
+
+
+/*
+ * myPinMode:
+ *********************************************************************************
+ */
+
+static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    reg  = MCP23016_IODIR0 ;
+  else
+  {
+    reg  = MCP23016_IODIR1 ;
+    pin &= 0x07 ;
+  }
+
+  mask = 1 << pin ;
+  old  = wiringPiI2CReadReg8 (node->fd, reg) ;
+
+  if (mode == OUTPUT)
+    old &= (~mask) ;
+  else
+    old |=   mask ;
+
+  wiringPiI2CWriteReg8 (node->fd, reg, old) ;
+}
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  int bit, old ;
+
+  pin -= node->pinBase ;	// Pin now 0-15
+
+  bit = 1 << (pin & 7) ;
+
+  if (pin < 8)			// Bank A
+  {
+    old = node->data2 ;
+
+    if (value == LOW)
+      old &= (~bit) ;
+    else
+      old |=   bit ;
+
+    wiringPiI2CWriteReg8 (node->fd, MCP23016_GP0, old) ;
+    node->data2 = old ;
+  }
+  else				// Bank B
+  {
+    old = node->data3 ;
+
+    if (value == LOW)
+      old &= (~bit) ;
+    else
+      old |=   bit ;
+
+    wiringPiI2CWriteReg8 (node->fd, MCP23016_GP1, old) ;
+    node->data3 = old ;
+  }
+}
+
+
+/*
+ * myDigitalRead:
+ *********************************************************************************
+ */
+
+static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int mask, value, gpio ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    gpio  = MCP23016_GP0 ;
+  else
+  {
+    gpio  = MCP23016_GP1 ;
+    pin  &= 0x07 ;
+  }
+
+  mask  = 1 << pin ;
+  value = wiringPiI2CReadReg8 (node->fd, gpio) ;
+
+  if ((value & mask) == 0)
+    return LOW ;
+  else 
+    return HIGH ;
+}
+
+
+/*
+ * mcp23016Setup:
+ *	Create a new instance of an MCP23016 I2C GPIO interface. We know it
+ *	has 16 pins, so all we need to know here is the I2C address and the
+ *	user-defined pin base.
+ *********************************************************************************
+ */
+
+int mcp23016Setup (const int pinBase, const int i2cAddress)
+{
+  int fd ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
+    return fd ;
+
+  wiringPiI2CWriteReg8 (fd, MCP23016_IOCON0, IOCON_INIT) ;
+  wiringPiI2CWriteReg8 (fd, MCP23016_IOCON1, IOCON_INIT) ;
+
+  node = wiringPiNewNode (pinBase, 16) ;
+
+  node->fd              = fd ;
+  node->pinMode         = myPinMode ;
+  node->digitalRead     = myDigitalRead ;
+  node->digitalWrite    = myDigitalWrite ;
+  node->data2           = wiringPiI2CReadReg8 (fd, MCP23016_OLAT0) ;
+  node->data3           = wiringPiI2CReadReg8 (fd, MCP23016_OLAT1) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.h
new file mode 100644
index 0000000000000000000000000000000000000000..f9b5cc549ed602ba87f44fa329f522b8a492288c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.h
@@ -0,0 +1,33 @@
+/*
+ * mcp23016.h:
+ *	Extend wiringPi with the MCP 23016 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp23016Setup (const int pinBase, const int i2cAddress) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.o
new file mode 100644
index 0000000000000000000000000000000000000000..712d58f4359e6b6a3863b67140672363c694a1d4
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016reg.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016reg.h
new file mode 100644
index 0000000000000000000000000000000000000000..9aea92d518a68526cdb3ecdfb896aacaf12985bb
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23016reg.h
@@ -0,0 +1,48 @@
+/*
+ * mcp23016:
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ *
+ *	Header file for code using the MCP23016 GPIO expander
+ *	chip.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+// MCP23016 Registers
+
+#define	MCP23016_GP0		0x00
+#define	MCP23016_GP1		0x01
+#define	MCP23016_OLAT0		0x02
+#define	MCP23016_OLAT1		0x03
+#define	MCP23016_IPOL0		0x04
+#define	MCP23016_IPOL1		0x05
+#define	MCP23016_IODIR0		0x06
+#define	MCP23016_IODIR1		0x07
+#define	MCP23016_INTCAP0	0x08
+#define	MCP23016_INTCAP1	0x09
+#define	MCP23016_IOCON0		0x0A
+#define	MCP23016_IOCON1		0x0B
+
+// Bits in the IOCON register
+
+#define	IOCON_IARES	0x01
+
+// Default initialisation mode
+
+#define	IOCON_INIT	0
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.c
new file mode 100644
index 0000000000000000000000000000000000000000..51741954b5e637da0b837271d66b011606ad895a
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.c
@@ -0,0 +1,195 @@
+/*
+ * mcp23017.c:
+ *	Extend wiringPi with the MCP 23017 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+
+#include "wiringPi.h"
+#include "wiringPiI2C.h"
+#include "mcp23x0817.h"
+
+#include "mcp23017.h"
+
+
+/*
+ * myPinMode:
+ *********************************************************************************
+ */
+
+static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    reg  = MCP23x17_IODIRA ;
+  else
+  {
+    reg  = MCP23x17_IODIRB ;
+    pin &= 0x07 ;
+  }
+
+  mask = 1 << pin ;
+  old  = wiringPiI2CReadReg8 (node->fd, reg) ;
+
+  if (mode == OUTPUT)
+    old &= (~mask) ;
+  else
+    old |=   mask ;
+
+  wiringPiI2CWriteReg8 (node->fd, reg, old) ;
+}
+
+
+/*
+ * myPullUpDnControl:
+ *********************************************************************************
+ */
+
+static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    reg  = MCP23x17_GPPUA ;
+  else
+  {
+    reg  = MCP23x17_GPPUB ;
+    pin &= 0x07 ;
+  }
+
+  mask = 1 << pin ;
+  old  = wiringPiI2CReadReg8 (node->fd, reg) ;
+
+  if (mode == PUD_UP)
+    old |=   mask ;
+  else
+    old &= (~mask) ;
+
+  wiringPiI2CWriteReg8 (node->fd, reg, old) ;
+}
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  int bit, old ;
+
+  pin -= node->pinBase ;	// Pin now 0-15
+
+  bit = 1 << (pin & 7) ;
+
+  if (pin < 8)			// Bank A
+  {
+    old = node->data2 ;
+
+    if (value == LOW)
+      old &= (~bit) ;
+    else
+      old |=   bit ;
+
+    wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOA, old) ;
+    node->data2 = old ;
+  }
+  else				// Bank B
+  {
+    old = node->data3 ;
+
+    if (value == LOW)
+      old &= (~bit) ;
+    else
+      old |=   bit ;
+
+    wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOB, old) ;
+    node->data3 = old ;
+  }
+}
+
+
+/*
+ * myDigitalRead:
+ *********************************************************************************
+ */
+
+static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int mask, value, gpio ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    gpio  = MCP23x17_GPIOA ;
+  else
+  {
+    gpio  = MCP23x17_GPIOB ;
+    pin  &= 0x07 ;
+  }
+
+  mask  = 1 << pin ;
+  value = wiringPiI2CReadReg8 (node->fd, gpio) ;
+
+  if ((value & mask) == 0)
+    return LOW ;
+  else 
+    return HIGH ;
+}
+
+
+/*
+ * mcp23017Setup:
+ *	Create a new instance of an MCP23017 I2C GPIO interface. We know it
+ *	has 16 pins, so all we need to know here is the I2C address and the
+ *	user-defined pin base.
+ *********************************************************************************
+ */
+
+int mcp23017Setup (const int pinBase, const int i2cAddress)
+{
+  int fd ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
+    return fd ;
+
+  wiringPiI2CWriteReg8 (fd, MCP23x17_IOCON, IOCON_INIT) ;
+
+  node = wiringPiNewNode (pinBase, 16) ;
+
+  node->fd              = fd ;
+  node->pinMode         = myPinMode ;
+  node->pullUpDnControl = myPullUpDnControl ;
+  node->digitalRead     = myDigitalRead ;
+  node->digitalWrite    = myDigitalWrite ;
+  node->data2           = wiringPiI2CReadReg8 (fd, MCP23x17_OLATA) ;
+  node->data3           = wiringPiI2CReadReg8 (fd, MCP23x17_OLATB) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.h
new file mode 100644
index 0000000000000000000000000000000000000000..79b4d7b31f1b17ccf72805f5d721d1d9df30b949
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.h
@@ -0,0 +1,33 @@
+/*
+ * 23017.h:
+ *	Extend wiringPi with the MCP 23017 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp23017Setup (const int pinBase, const int i2cAddress) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.o
new file mode 100644
index 0000000000000000000000000000000000000000..cbb25e9859541b9a4374838761ba80ec9160cb91
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23017.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.c
new file mode 100644
index 0000000000000000000000000000000000000000..d0acb5ee5fa54174645f9b0ed386feb764a73055
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.c
@@ -0,0 +1,189 @@
+/*
+ * mcp23s08.c:
+ *	Extend wiringPi with the MCP 23s08 SPI GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+
+#include "wiringPi.h"
+#include "wiringPiSPI.h"
+#include "mcp23x0817.h"
+
+#include "mcp23s08.h"
+
+#define	MCP_SPEED	4000000
+
+
+
+/*
+ * writeByte:
+ *	Write a byte to a register on the MCP23s08 on the SPI bus.
+ *********************************************************************************
+ */
+
+static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data)
+{
+  uint8_t spiData [4] ;
+
+  spiData [0] = CMD_WRITE | ((devId & 7) << 1) ;
+  spiData [1] = reg ;
+  spiData [2] = data ;
+
+  wiringPiSPIDataRW (spiPort, spiData, 3) ;
+}
+
+/*
+ * readByte:
+ *	Read a byte from a register on the MCP23s08 on the SPI bus.
+ *********************************************************************************
+ */
+
+static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg)
+{
+  uint8_t spiData [4] ;
+
+  spiData [0] = CMD_READ | ((devId & 7) << 1) ;
+  spiData [1] = reg ;
+
+  wiringPiSPIDataRW (spiPort, spiData, 3) ;
+
+  return spiData [2] ;
+}
+
+
+/*
+ * myPinMode:
+ *********************************************************************************
+ */
+
+static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  reg  = MCP23x08_IODIR ;
+  mask = 1 << (pin - node->pinBase) ;
+  old  = readByte (node->data0, node->data1, reg) ;
+
+  if (mode == OUTPUT)
+    old &= (~mask) ;
+  else
+    old |=   mask ;
+
+  writeByte (node->data0, node->data1, reg, old) ;
+}
+
+
+/*
+ * myPullUpDnControl:
+ *********************************************************************************
+ */
+
+static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  reg  = MCP23x08_GPPU ;
+  mask = 1 << (pin - node->pinBase) ;
+
+  old  = readByte (node->data0, node->data1, reg) ;
+
+  if (mode == PUD_UP)
+    old |=   mask ;
+  else
+    old &= (~mask) ;
+
+  writeByte (node->data0, node->data1, reg, old) ;
+}
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  int bit, old ;
+
+  bit  = 1 << ((pin - node->pinBase) & 7) ;
+
+  old = node->data2 ;
+  if (value == LOW)
+    old &= (~bit) ;
+  else
+    old |=   bit ;
+
+  writeByte (node->data0, node->data1, MCP23x08_GPIO, old) ;
+  node->data2 = old ;
+}
+
+
+/*
+ * myDigitalRead:
+ *********************************************************************************
+ */
+
+static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int mask, value ;
+
+  mask  = 1 << ((pin - node->pinBase) & 7) ;
+  value = readByte (node->data0, node->data1, MCP23x08_GPIO) ;
+
+  if ((value & mask) == 0)
+    return LOW ;
+  else 
+    return HIGH ;
+}
+
+
+/*
+ * mcp23s08Setup:
+ *	Create a new instance of an MCP23s08 SPI GPIO interface. We know it
+ *	has 8 pins, so all we need to know here is the SPI address and the
+ *	user-defined pin base.
+ *********************************************************************************
+ */
+
+int mcp23s08Setup (const int pinBase, const int spiPort, const int devId)
+{
+  int    x ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((x = wiringPiSPISetup (spiPort, MCP_SPEED)) < 0)
+    return x ;
+
+  writeByte (spiPort, devId, MCP23x08_IOCON, IOCON_INIT) ;
+
+  node = wiringPiNewNode (pinBase, 8) ;
+
+  node->data0           = spiPort ;
+  node->data1           = devId ;
+  node->pinMode         = myPinMode ;
+  node->pullUpDnControl = myPullUpDnControl ;
+  node->digitalRead     = myDigitalRead ;
+  node->digitalWrite    = myDigitalWrite ;
+  node->data2           = readByte (spiPort, devId, MCP23x08_OLAT) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.h
new file mode 100644
index 0000000000000000000000000000000000000000..ebf93d1981c69c8b82c400ddc906dc6e6861cf33
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.h
@@ -0,0 +1,33 @@
+/*
+ * 23s08.h:
+ *	Extend wiringPi with the MCP 23s08 SPI GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.o
new file mode 100644
index 0000000000000000000000000000000000000000..4e653c774677624b93b18b0b30c2efeb17712570
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s08.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.c
new file mode 100644
index 0000000000000000000000000000000000000000..c2d1be3a966ec1b7cd31f5b777d3d3397a69fb89
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.c
@@ -0,0 +1,236 @@
+/*
+ * mcp23s17.c:
+ *	Extend wiringPi with the MCP 23s17 SPI GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+
+#include "wiringPi.h"
+#include "wiringPiSPI.h"
+#include "mcp23x0817.h"
+
+#include "mcp23s17.h"
+
+#define	MCP_SPEED	4000000
+
+
+
+/*
+ * writeByte:
+ *	Write a byte to a register on the MCP23s17 on the SPI bus.
+ *********************************************************************************
+ */
+
+static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data)
+{
+  uint8_t spiData [4] ;
+
+  spiData [0] = CMD_WRITE | ((devId & 7) << 1) ;
+  spiData [1] = reg ;
+  spiData [2] = data ;
+
+  wiringPiSPIDataRW (spiPort, spiData, 3) ;
+}
+
+/*
+ * readByte:
+ *	Read a byte from a register on the MCP23s17 on the SPI bus.
+ *********************************************************************************
+ */
+
+static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg)
+{
+  uint8_t spiData [4] ;
+
+  spiData [0] = CMD_READ | ((devId & 7) << 1) ;
+  spiData [1] = reg ;
+
+  wiringPiSPIDataRW (spiPort, spiData, 3) ;
+
+  return spiData [2] ;
+}
+
+
+/*
+ * myPinMode:
+ *********************************************************************************
+ */
+
+static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    reg  = MCP23x17_IODIRA ;
+  else
+  {
+    reg  = MCP23x17_IODIRB ;
+    pin &= 0x07 ;
+  }
+
+  mask = 1 << pin ;
+  old  = readByte (node->data0, node->data1, reg) ;
+
+  if (mode == OUTPUT)
+    old &= (~mask) ;
+  else
+    old |=   mask ;
+
+  writeByte (node->data0, node->data1, reg, old) ;
+}
+
+
+/*
+ * myPullUpDnControl:
+ *********************************************************************************
+ */
+
+static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int mask, old, reg ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    reg  = MCP23x17_GPPUA ;
+  else
+  {
+    reg  = MCP23x17_GPPUB ;
+    pin &= 0x07 ;
+  }
+
+  mask = 1 << pin ;
+  old  = readByte (node->data0, node->data1, reg) ;
+
+  if (mode == PUD_UP)
+    old |=   mask ;
+  else
+    old &= (~mask) ;
+
+  writeByte (node->data0, node->data1, reg, old) ;
+}
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  int bit, old ;
+
+  pin -= node->pinBase ;	// Pin now 0-15
+
+  bit = 1 << (pin & 7) ;
+
+  if (pin < 8)			// Bank A
+  {
+    old = node->data2 ;
+
+    if (value == LOW)
+      old &= (~bit) ;
+    else
+      old |=   bit ;
+
+    writeByte (node->data0, node->data1, MCP23x17_GPIOA, old) ;
+    node->data2 = old ;
+  }
+  else				// Bank B
+  {
+    old = node->data3 ;
+
+    if (value == LOW)
+      old &= (~bit) ;
+    else
+      old |=   bit ;
+
+    writeByte (node->data0, node->data1, MCP23x17_GPIOB, old) ;
+    node->data3 = old ;
+  }
+}
+
+
+/*
+ * myDigitalRead:
+ *********************************************************************************
+ */
+
+static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int mask, value, gpio ;
+
+  pin -= node->pinBase ;
+
+  if (pin < 8)		// Bank A
+    gpio  = MCP23x17_GPIOA ;
+  else
+  {
+    gpio  = MCP23x17_GPIOB ;
+    pin  &= 0x07 ;
+  }
+
+  mask  = 1 << pin ;
+  value = readByte (node->data0, node->data1, gpio) ;
+
+  if ((value & mask) == 0)
+    return LOW ;
+  else 
+    return HIGH ;
+}
+
+
+/*
+ * mcp23s17Setup:
+ *	Create a new instance of an MCP23s17 SPI GPIO interface. We know it
+ *	has 16 pins, so all we need to know here is the SPI address and the
+ *	user-defined pin base.
+ *********************************************************************************
+ */
+
+int mcp23s17Setup (const int pinBase, const int spiPort, const int devId)
+{
+  int    x ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((x = wiringPiSPISetup (spiPort, MCP_SPEED)) < 0)
+    return x ;
+
+  writeByte (spiPort, devId, MCP23x17_IOCON,  IOCON_INIT | IOCON_HAEN) ;
+  writeByte (spiPort, devId, MCP23x17_IOCONB, IOCON_INIT | IOCON_HAEN) ;
+
+  node = wiringPiNewNode (pinBase, 16) ;
+
+  node->data0           = spiPort ;
+  node->data1           = devId ;
+  node->pinMode         = myPinMode ;
+  node->pullUpDnControl = myPullUpDnControl ;
+  node->digitalRead     = myDigitalRead ;
+  node->digitalWrite    = myDigitalWrite ;
+  node->data2           = readByte (spiPort, devId, MCP23x17_OLATA) ;
+  node->data3           = readByte (spiPort, devId, MCP23x17_OLATB) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.h
new file mode 100644
index 0000000000000000000000000000000000000000..3b2a8088386535c8dbce2b2f8c7b7cb7ffdae530
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.h
@@ -0,0 +1,33 @@
+/*
+ * 23s17.h:
+ *	Extend wiringPi with the MCP 23s17 SPI GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp23s17Setup (int pinBase, int spiPort, int devId) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.o
new file mode 100644
index 0000000000000000000000000000000000000000..e780bad13ace885dd39f68bd355f999fd2e43140
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23s17.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x08.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x08.h
new file mode 100644
index 0000000000000000000000000000000000000000..c4e6b272ca6d889a2c5152cb3c721ae3214b1fbd
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x08.h
@@ -0,0 +1,73 @@
+/*
+ * mcp23x17:
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ *
+ *	Header file for code using the MCP23x17 GPIO expander chip.
+ *	This comes in 2 flavours: MCP23017 which has an I2C interface,
+ *	an the MXP23S17 which has an SPI interface.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+// MCP23x17 Registers
+
+#define	IODIRA		0x00
+#define	IPOLA		0x02
+#define	GPINTENA	0x04
+#define	DEFVALA		0x06
+#define	INTCONA		0x08
+#define	IOCON		0x0A
+#define	GPPUA		0x0C
+#define	INTFA		0x0E
+#define	INTCAPA		0x10
+#define	GPIOA		0x12
+#define	OLATA		0x14
+
+#define	IODIRB		0x01
+#define	IPOLB		0x03
+#define	GPINTENB	0x05
+#define	DEFVALB		0x07
+#define	INTCONB		0x09
+#define	IOCONB		0x0B
+#define	GPPUB		0x0D
+#define	INTFB		0x0F
+#define	INTCAPB		0x11
+#define	GPIOB		0x13
+#define	OLATB		0x15
+
+// Bits in the IOCON register
+
+#define	IOCON_UNUSED	0x01
+#define	IOCON_INTPOL	0x02
+#define	IOCON_ODR	0x04
+#define	IOCON_HAEN	0x08
+#define	IOCON_DISSLW	0x10
+#define	IOCON_SEQOP	0x20
+#define	IOCON_MIRROR	0x40
+#define	IOCON_BANK_MODE	0x80
+
+// Default initialisation mode
+
+#define	IOCON_INIT	(IOCON_SEQOP)
+
+// SPI Command codes
+
+#define	CMD_WRITE	0x40
+#define CMD_READ	0x41
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x0817.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x0817.h
new file mode 100644
index 0000000000000000000000000000000000000000..58bc038239f6bc4b915db9f01f04d284b38e80dc
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp23x0817.h
@@ -0,0 +1,87 @@
+/*
+ * mcp23xxx:
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ *
+ *	Header file for code using the MCP23x08 and 17 GPIO expander
+ *	chips.
+ *	This comes in 2 flavours: MCP230xx (08/17) which has an I2C
+ *	interface, and the MXP23Sxx (08/17) which has an SPI interface.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+// MCP23x08 Registers
+	
+#define	MCP23x08_IODIR		0x00
+#define	MCP23x08_IPOL		0x01
+#define	MCP23x08_GPINTEN	0x02
+#define	MCP23x08_DEFVAL		0x03
+#define	MCP23x08_INTCON		0x04
+#define	MCP23x08_IOCON		0x05
+#define	MCP23x08_GPPU		0x06
+#define	MCP23x08_INTF		0x07
+#define	MCP23x08_INTCAP		0x08
+#define	MCP23x08_GPIO		0x09
+#define	MCP23x08_OLAT		0x0A
+
+// MCP23x17 Registers
+
+#define	MCP23x17_IODIRA		0x00
+#define	MCP23x17_IPOLA		0x02
+#define	MCP23x17_GPINTENA	0x04
+#define	MCP23x17_DEFVALA	0x06
+#define	MCP23x17_INTCONA	0x08
+#define	MCP23x17_IOCON		0x0A
+#define	MCP23x17_GPPUA		0x0C
+#define	MCP23x17_INTFA		0x0E
+#define	MCP23x17_INTCAPA	0x10
+#define	MCP23x17_GPIOA		0x12
+#define	MCP23x17_OLATA		0x14
+
+#define	MCP23x17_IODIRB		0x01
+#define	MCP23x17_IPOLB		0x03
+#define	MCP23x17_GPINTENB	0x05
+#define	MCP23x17_DEFVALB	0x07
+#define	MCP23x17_INTCONB	0x09
+#define	MCP23x17_IOCONB		0x0B
+#define	MCP23x17_GPPUB		0x0D
+#define	MCP23x17_INTFB		0x0F
+#define	MCP23x17_INTCAPB	0x11
+#define	MCP23x17_GPIOB		0x13
+#define	MCP23x17_OLATB		0x15
+
+// Bits in the IOCON register
+
+#define	IOCON_UNUSED	0x01
+#define	IOCON_INTPOL	0x02
+#define	IOCON_ODR	0x04
+#define	IOCON_HAEN	0x08
+#define	IOCON_DISSLW	0x10
+#define	IOCON_SEQOP	0x20
+#define	IOCON_MIRROR	0x40
+#define	IOCON_BANK_MODE	0x80
+
+// Default initialisation mode
+
+#define	IOCON_INIT	(IOCON_SEQOP)
+
+// SPI Command codes
+
+#define	CMD_WRITE	0x40
+#define CMD_READ	0x41
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.c
new file mode 100644
index 0000000000000000000000000000000000000000..5d4494013c4f1dbf4d63f9da44fe9b3af5baddbe
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.c
@@ -0,0 +1,76 @@
+/*
+ * mcp3002.c:
+ *	Extend wiringPi with the MCP3002 SPI Analog to Digital convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+
+#include "mcp3002.h"
+
+/*
+ * myAnalogRead:
+ *	Return the analog value of the given pin
+ *********************************************************************************
+ */
+
+static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
+{
+  unsigned char spiData [2] ;
+  unsigned char chanBits ;
+  int chan = pin - node->pinBase ;
+
+  if (chan == 0)
+    chanBits = 0b11010000 ;
+  else
+    chanBits = 0b11110000 ;
+
+  spiData [0] = chanBits ;
+  spiData [1] = 0 ;
+
+  wiringPiSPIDataRW (node->fd, spiData, 2) ;
+
+  return ((spiData [0] << 7) | (spiData [1] >> 1)) & 0x3FF ;
+}
+
+
+/*
+ * mcp3002Setup:
+ *	Create a new wiringPi device node for an mcp3002 on the Pi's
+ *	SPI interface.
+ *********************************************************************************
+ */
+
+int mcp3002Setup (const int pinBase, int spiChannel)
+{
+  struct wiringPiNodeStruct *node ;
+
+  if (wiringPiSPISetup (spiChannel, 1000000) < 0)
+    return -1 ;
+
+  node = wiringPiNewNode (pinBase, 2) ;
+
+  node->fd         = spiChannel ;
+  node->analogRead = myAnalogRead ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.h
new file mode 100644
index 0000000000000000000000000000000000000000..0cd727f33ac58709433881d91a3b4e780ec23331
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.h
@@ -0,0 +1,33 @@
+/*
+ * mcp3002.c:
+ *	Extend wiringPi with the MCP3002 SPI Analog to Digital convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp3002Setup (int pinBase, int spiChannel) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.o
new file mode 100644
index 0000000000000000000000000000000000000000..919732166877cd1b9538a16117cef0725ee7c597
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3002.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.c
new file mode 100644
index 0000000000000000000000000000000000000000..82c73dd253165d306c8c2e81db108c11ccbcb53f
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.c
@@ -0,0 +1,76 @@
+/*
+ * mcp3004.c:
+ *	Extend wiringPi with the MCP3004 SPI Analog to Digital convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ *
+ *	Thanks also to "ShorTie" on IRC for some remote debugging help!
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+
+#include "mcp3004.h"
+
+/*
+ * myAnalogRead:
+ *	Return the analog value of the given pin
+ *********************************************************************************
+ */
+
+static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
+{
+  unsigned char spiData [3] ;
+  unsigned char chanBits ;
+  int chan = pin - node->pinBase ;
+
+  chanBits = 0b10000000 | (chan << 4) ;
+
+  spiData [0] = 1 ;		// Start bit
+  spiData [1] = chanBits ;
+  spiData [2] = 0 ;
+
+  wiringPiSPIDataRW (node->fd, spiData, 3) ;
+
+  return ((spiData [1] << 8) | spiData [2]) & 0x3FF ;
+}
+
+
+/*
+ * mcp3004Setup:
+ *	Create a new wiringPi device node for an mcp3004 on the Pi's
+ *	SPI interface.
+ *********************************************************************************
+ */
+
+int mcp3004Setup (const int pinBase, int spiChannel)
+{
+  struct wiringPiNodeStruct *node ;
+
+  if (wiringPiSPISetup (spiChannel, 1000000) < 0)
+    return -1 ;
+
+  node = wiringPiNewNode (pinBase, 8) ;
+
+  node->fd         = spiChannel ;
+  node->analogRead = myAnalogRead ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.h
new file mode 100644
index 0000000000000000000000000000000000000000..a07c0bf01d990c5cde30f33a5afd73a3b5ffc6db
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.h
@@ -0,0 +1,33 @@
+/*
+ * mcp3004.c:
+ *	Extend wiringPi with the MCP3004 SPI Analog to Digital convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp3004Setup (int pinBase, int spiChannel) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.o
new file mode 100644
index 0000000000000000000000000000000000000000..862b16fce398efd8c0a551889d5f44c4e5c80ee7
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3004.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.c
new file mode 100644
index 0000000000000000000000000000000000000000..831aece32956c0c8115a3348336e4e605f241bef
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.c
@@ -0,0 +1,110 @@
+/*
+ * mcp3422.c:
+ *	Extend wiringPi with the MCP3422 I2C ADC chip
+ *	Also works for the MCP3423 and MCP3224 (4 channel) chips
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/spi/spidev.h>
+
+#include <wiringPi.h>
+#include <wiringPiI2C.h>
+
+#include "mcp3422.h"
+
+
+/*
+ * myAnalogRead:
+ *	Read a channel from the device
+ *********************************************************************************
+ */
+
+int myAnalogRead (struct wiringPiNodeStruct *node, int chan)
+{
+  unsigned char config ;
+  unsigned char buffer [4] ;
+  int value = 0 ;
+
+// One-shot mode, trigger plus the other configs.
+
+  config = 0x80 | ((chan - node->pinBase) << 5) | (node->data0 << 2) | (node->data1) ;
+  
+  wiringPiI2CWrite (node->fd, config) ;
+
+  switch (node->data0)	// Sample rate
+  {
+    case MCP3422_SR_3_75:			// 18 bits
+      delay (270) ;
+      read (node->fd, buffer, 4) ;
+      value = ((buffer [0] & 3) << 16) | (buffer [1] << 8) | buffer [0] ;
+      break ;
+
+    case MCP3422_SR_15:				// 16 bits
+      delay ( 70) ;
+      read (node->fd, buffer, 3) ;
+      value = (buffer [0] << 8) | buffer [1] ;
+      break ;
+
+    case MCP3422_SR_60:				// 14 bits
+      delay ( 17) ;
+      read (node->fd, buffer, 3) ;
+      value = ((buffer [0] & 0x3F) << 8) | buffer [1] ;
+      break ;
+
+    case MCP3422_SR_240:			// 12 bits
+      delay (  5) ;
+      read (node->fd, buffer, 3) ;
+      value = ((buffer [0] & 0x0F) << 8) | buffer [0] ;
+      break ;
+  }
+
+  return value ;
+}
+
+
+/*
+ * mcp3422Setup:
+ *	Create a new wiringPi device node for the mcp3422
+ *********************************************************************************
+ */
+
+int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain)
+{
+  int fd ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
+    return fd ;
+
+  node = wiringPiNewNode (pinBase, 4) ;
+
+  node->data0      = sampleRate ;
+  node->data1      = gain ;
+  node->analogRead = myAnalogRead ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.h
new file mode 100644
index 0000000000000000000000000000000000000000..bb4692d841cc6caed92116a37479f4fad6a2d878
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.h
@@ -0,0 +1,43 @@
+/*
+ * mcp3422.c:
+ *	Extend wiringPi with the MCP3422 I2C ADC chip
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#define	MCP3422_SR_3_75	0
+#define	MCP3422_SR_15	1
+#define	MCP3422_SR_60	2
+#define	MCP3422_SR_240	3
+
+#define	MCP3422_GAIN_1	0
+#define	MCP3422_GAIN_2	1
+#define	MCP3422_GAIN_4	2
+#define	MCP3422_GAIN_8	3
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.o
new file mode 100644
index 0000000000000000000000000000000000000000..3ceba46e47d31d53e620b957e5b7fa9d88411dc3
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp3422.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.c b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.c
new file mode 100644
index 0000000000000000000000000000000000000000..5c5c17af5e6a42d04c71c2fe4b5692935bd48ce0
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.c
@@ -0,0 +1,76 @@
+/*
+ * mcp4802.c:
+ *	Extend wiringPi with the MCP4802 SPI Digital to Analog convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+
+#include "mcp4802.h"
+
+/*
+ * myAnalogWrite:
+ *	Write analog value on the given pin
+ *********************************************************************************
+ */
+
+static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  unsigned char spiData [2] ;
+  unsigned char chanBits, dataBits ;
+  int chan = pin - node->pinBase ;
+
+  if (chan == 0)
+    chanBits = 0x30 ;
+  else
+    chanBits = 0xB0 ;
+
+  chanBits |= ((value >> 4) & 0x0F) ;
+  dataBits  = ((value << 4) & 0xF0) ;
+
+  spiData [0] = chanBits ;
+  spiData [1] = dataBits ;
+
+  wiringPiSPIDataRW (node->fd, spiData, 2) ;
+}
+
+/*
+ * mcp4802Setup:
+ *	Create a new wiringPi device node for an mcp4802 on the Pi's
+ *	SPI interface.
+ *********************************************************************************
+ */
+
+int mcp4802Setup (const int pinBase, int spiChannel)
+{
+  struct wiringPiNodeStruct *node ;
+
+  if (wiringPiSPISetup (spiChannel, 1000000) < 0)
+    return -1 ;
+
+  node = wiringPiNewNode (pinBase, 2) ;
+
+  node->fd          = spiChannel ;
+  node->analogWrite = myAnalogWrite ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.h b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.h
new file mode 100644
index 0000000000000000000000000000000000000000..effa0246149fa7720e3c7c58d95658078ece7482
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.h
@@ -0,0 +1,33 @@
+/*
+ * mcp4802.c:
+ *	Extend wiringPi with the MCP4802 SPI Digital to Analog convertor
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int mcp4802Setup (int pinBase, int spiChannel) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.o b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.o
new file mode 100644
index 0000000000000000000000000000000000000000..4da7eca49478f60c72d4e855cd3b2ef2bd882936
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/mcp4802.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.c b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.c
new file mode 100644
index 0000000000000000000000000000000000000000..c172d1cba63c024b9aea0b16c799fd54de98e27b
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.c
@@ -0,0 +1,126 @@
+/*
+ * pcf8574.c:
+ *	Extend wiringPi with the PCF8574 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+
+#include "wiringPi.h"
+#include "wiringPiI2C.h"
+
+#include "pcf8574.h"
+
+
+/*
+ * myPinMode:
+ *	The PCF8574 is an odd chip - the pins are effectively bi-directional,
+ *	however the pins should be drven high when used as an input pin...
+ *	So, we're effectively copying digitalWrite...
+ *********************************************************************************
+ */
+
+static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode)
+{
+  int bit, old ;
+
+  bit  = 1 << ((pin - node->pinBase) & 7) ;
+
+  old = node->data2 ;
+  if (mode == OUTPUT)
+    old &= (~bit) ;	// Write bit to 0
+  else
+    old |=   bit ;	// Write bit to 1
+
+  wiringPiI2CWrite (node->fd, old) ;
+  node->data2 = old ;
+}
+
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  int bit, old ;
+
+  bit  = 1 << ((pin - node->pinBase) & 7) ;
+
+  old = node->data2 ;
+  if (value == LOW)
+    old &= (~bit) ;
+  else
+    old |=   bit ;
+
+  wiringPiI2CWrite (node->fd, old) ;
+  node->data2 = old ;
+}
+
+
+/*
+ * myDigitalRead:
+ *********************************************************************************
+ */
+
+static int myDigitalRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int mask, value ;
+
+  mask  = 1 << ((pin - node->pinBase) & 7) ;
+  value = wiringPiI2CRead (node->fd) ;
+
+  if ((value & mask) == 0)
+    return LOW ;
+  else 
+    return HIGH ;
+}
+
+
+/*
+ * pcf8574Setup:
+ *	Create a new instance of a PCF8574 I2C GPIO interface. We know it
+ *	has 8 pins, so all we need to know here is the I2C address and the
+ *	user-defined pin base.
+ *********************************************************************************
+ */
+
+int pcf8574Setup (const int pinBase, const int i2cAddress)
+{
+  int fd ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
+    return fd ;
+
+  node = wiringPiNewNode (pinBase, 8) ;
+
+  node->fd           = fd ;
+  node->pinMode      = myPinMode ;
+  node->digitalRead  = myDigitalRead ;
+  node->digitalWrite = myDigitalWrite ;
+  node->data2        = wiringPiI2CRead (fd) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.h b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.h
new file mode 100644
index 0000000000000000000000000000000000000000..8e2d8181de75b289f62190fc897e2d22e2748927
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.h
@@ -0,0 +1,33 @@
+/*
+ * pcf8574.h:
+ *	Extend wiringPi with the PCF8574 I2C GPIO expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int pcf8574Setup (const int pinBase, const int i2cAddress) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.o b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.o
new file mode 100644
index 0000000000000000000000000000000000000000..2b38c7fddfd72d2818ed5bf99a9bde2e5e408518
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8574.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.c b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.c
new file mode 100644
index 0000000000000000000000000000000000000000..0c860564fde29f142e64da9f6b443c9cd14cf81d
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.c
@@ -0,0 +1,90 @@
+/*
+ * pcf8591.c:
+ *	Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip
+ *	The chip has 1 8-bit DAC and 4 x 8-bit ADCs
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <unistd.h>
+
+#include "wiringPi.h"
+#include "wiringPiI2C.h"
+
+#include "pcf8591.h"
+
+
+/*
+ * myAnalogWrite:
+ *********************************************************************************
+ */
+
+static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  unsigned char b [2] ;
+  b [0] = 0x40 ;
+  b [1] = value & 0xFF ;
+  write (node->fd, b, 2) ;
+}
+
+
+/*
+ * myAnalogRead:
+ *********************************************************************************
+ */
+
+static int myAnalogRead (struct wiringPiNodeStruct *node, int pin)
+{
+  int x ;
+
+  wiringPiI2CWrite (node->fd, 0x40 | ((pin - node->pinBase) & 3)) ;
+
+  x = wiringPiI2CRead (node->fd) ;	// Throw away the first read
+  x = wiringPiI2CRead (node->fd) ;
+
+  return x ;
+}
+
+
+/*
+ * pcf8591Setup:
+ *	Create a new instance of a PCF8591 I2C GPIO interface. We know it
+ *	has 4 pins, (4 analog inputs and 1 analog output which we'll shadow
+ *	input 0) so all we need to know here is the I2C address and the
+ *	user-defined pin base.
+ *********************************************************************************
+ */
+
+int pcf8591Setup (const int pinBase, const int i2cAddress)
+{
+  int fd ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = wiringPiI2CSetup (i2cAddress)) < 0)
+    return fd ;
+
+  node = wiringPiNewNode (pinBase, 4) ;
+
+  node->fd          = fd ;
+  node->analogRead  = myAnalogRead ;
+  node->analogWrite = myAnalogWrite ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.h b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.h
new file mode 100644
index 0000000000000000000000000000000000000000..6b44ccf905e0b39af8b27eab01c75300189ab67f
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.h
@@ -0,0 +1,33 @@
+/*
+ * pcf8591.h:
+ *	Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int pcf8591Setup (const int pinBase, const int i2cAddress) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.o b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.o
new file mode 100644
index 0000000000000000000000000000000000000000..4db158b8eb13716dd11f97f03004c54782ac3890
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/pcf8591.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.c b/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.c
new file mode 100644
index 0000000000000000000000000000000000000000..d2f3b4e9cc867a58b6d365990bfcdde3c877a9a6
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.c
@@ -0,0 +1,51 @@
+/*
+ * piHiPri:
+ *	Simple way to get your program running at high priority
+ *	with realtime schedulling.
+ *
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <sched.h>
+#include <string.h>
+
+#include "wiringPi.h"
+
+
+/*
+ * piHiPri:
+ *	Attempt to set a high priority schedulling for the running program
+ *********************************************************************************
+ */
+
+int piHiPri (const int pri)
+{
+  struct sched_param sched ;
+
+  memset (&sched, 0, sizeof(sched)) ;
+
+  if (pri > sched_get_priority_max (SCHED_RR))
+    sched.sched_priority = sched_get_priority_max (SCHED_RR) ;
+  else
+    sched.sched_priority = pri ;
+
+  return sched_setscheduler (0, SCHED_RR, &sched) ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.o b/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.o
new file mode 100644
index 0000000000000000000000000000000000000000..15cfa994b10b34524c1dc75a381724f3a3d0852b
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/piHiPri.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piThread.c b/modules/catkin_ws/src/wiringPi/wiringPi/piThread.c
new file mode 100644
index 0000000000000000000000000000000000000000..b0499be495f72af992dac2cffa705f53c6772111
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/piThread.c
@@ -0,0 +1,63 @@
+/*
+ * piThread.c:
+ *	Provide a simplified interface to pthreads
+ *
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <pthread.h>
+#include "wiringPi.h"
+
+static pthread_mutex_t piMutexes [4] ;
+
+
+
+/*
+ * piThreadCreate:
+ *	Create and start a thread
+ *********************************************************************************
+ */
+
+int piThreadCreate (void *(*fn)(void *))
+{
+  pthread_t myThread ;
+
+  return pthread_create (&myThread, NULL, fn, NULL) ;
+}
+
+/*
+ * piLock: piUnlock:
+ *	Activate/Deactivate a mutex.
+ *	We're keeping things simple here and only tracking 4 mutexes which
+ *	is more than enough for out entry-level pthread programming
+ *********************************************************************************
+ */
+
+void piLock (int key)
+{
+  pthread_mutex_lock (&piMutexes [key]) ;
+}
+
+void piUnlock (int key)
+{
+  pthread_mutex_unlock (&piMutexes [key]) ;
+}
+
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/piThread.o b/modules/catkin_ws/src/wiringPi/wiringPi/piThread.o
new file mode 100644
index 0000000000000000000000000000000000000000..ab3aaf50b793ce169fc02b6124f8032089b3d19a
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/piThread.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.c b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.c
new file mode 100644
index 0000000000000000000000000000000000000000..7ceb156b627ad21799597285805bf4262d881353
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.c
@@ -0,0 +1,75 @@
+/*
+ * sn3218.c:
+ *	Extend wiringPi with the SN3218 I2C LEd Driver
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <wiringPi.h>
+#include <wiringPiI2C.h>
+
+#include "sn3218.h"
+
+/*
+ * myAnalogWrite:
+ *	Write analog value on the given pin
+ *********************************************************************************
+ */
+
+static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  int fd   = node->fd ;
+  int chan = 0x01 + (pin - node->pinBase) ;
+  
+  wiringPiI2CWriteReg8 (fd, chan, value & 0xFF) ;	// Value
+  wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ;		// Update
+}
+
+/*
+ * sn3218Setup:
+ *	Create a new wiringPi device node for an sn3218 on the Pi's
+ *	SPI interface.
+ *********************************************************************************
+ */
+
+int sn3218Setup (const int pinBase)
+{
+  int fd ;
+  struct wiringPiNodeStruct *node ;
+
+  if ((fd = wiringPiI2CSetup (0x54)) < 0)
+    return fd ;
+
+// Setup the chip - initialise all 18 LEDs to off
+
+//wiringPiI2CWriteReg8 (fd, 0x17, 0) ;		// Reset
+  wiringPiI2CWriteReg8 (fd, 0x00, 1) ;		// Not Shutdown
+  wiringPiI2CWriteReg8 (fd, 0x13, 0x3F) ;	// Enable LEDs  0- 5
+  wiringPiI2CWriteReg8 (fd, 0x14, 0x3F) ;	// Enable LEDs  6-11
+  wiringPiI2CWriteReg8 (fd, 0x15, 0x3F) ;	// Enable LEDs 12-17
+  wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ;	// Update
+  
+  node = wiringPiNewNode (pinBase, 18) ;
+
+  node->fd          = fd ;
+  node->analogWrite = myAnalogWrite ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.h b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.h
new file mode 100644
index 0000000000000000000000000000000000000000..580d5f96b507de7811e8f03af3e785f75a2ebbe9
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.h
@@ -0,0 +1,33 @@
+/*
+ * sn3218.c:
+ *	Extend wiringPi with the SN3218 I2C LED driver board.
+ *	Copyright (c) 2012-2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int sn3218Setup (int pinBase) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.o b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.o
new file mode 100644
index 0000000000000000000000000000000000000000..a2c6d32712410e33e2ca161db6ed802beab9d138
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/sn3218.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.c b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.c
new file mode 100644
index 0000000000000000000000000000000000000000..3c79ba7b37a57f5c5bb67b131ed62b04396261f5
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.c
@@ -0,0 +1,167 @@
+/*
+ * softPwm.c:
+ *	Provide 2 channels of software driven PWM.
+ *	Copyright (c) 2012-2014 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+
+#include "wiringPi.h"
+#include "softPwm.h"
+
+// MAX_PINS:
+//	This is more than the number of Pi pins because we can actually softPwm
+//	pins that are on GPIO expanders. It's not that efficient and more than 1 or
+//	2 pins on e.g. (SPI) mcp23s17 won't really be that effective, however...
+
+#define	MAX_PINS	1024
+
+// The PWM Frequency is derived from the "pulse time" below. Essentially,
+//	the frequency is a function of the range and this pulse time.
+//	The total period will be range * pulse time in µS, so a pulse time
+//	of 100 and a range of 100 gives a period of 100 * 100 = 10,000 µS
+//	which is a frequency of 100Hz.
+//
+//	It's possible to get a higher frequency by lowering the pulse time,
+//	however CPU uage will skyrocket as wiringPi uses a hard-loop to time
+//	periods under 100µS - this is because the Linux timer calls are just
+//	accurate at all, and have an overhead.
+//
+//	Another way to increase the frequency is to reduce the range - however
+//	that reduces the overall output accuracy...
+
+#define	PULSE_TIME	100
+
+static int marks         [MAX_PINS] ;
+static int range         [MAX_PINS] ;
+static pthread_t threads [MAX_PINS] ;
+
+int newPin = -1 ;
+
+
+/*
+ * softPwmThread:
+ *	Thread to do the actual PWM output
+ *********************************************************************************
+ */
+
+static PI_THREAD (softPwmThread)
+{
+  int pin, mark, space ;
+  struct sched_param param ;
+
+  param.sched_priority = sched_get_priority_max (SCHED_RR) ;
+  pthread_setschedparam (pthread_self (), SCHED_RR, &param) ;
+
+  pin    = newPin ;
+  newPin = -1 ;
+
+  piHiPri (90) ;
+
+  for (;;)
+  {
+    mark  = marks [pin] ;
+    space = range [pin] - mark ;
+
+    if (mark != 0)
+      digitalWrite (pin, HIGH) ;
+    delayMicroseconds (mark * 100) ;
+
+    if (space != 0)
+      digitalWrite (pin, LOW) ;
+    delayMicroseconds (space * 100) ;
+  }
+
+  return NULL ;
+}
+
+
+/*
+ * softPwmWrite:
+ *	Write a PWM value to the given pin
+ *********************************************************************************
+ */
+
+void softPwmWrite (int pin, int value)
+{
+  pin &= (MAX_PINS - 1) ;
+
+  /**/ if (value < 0)
+    value = 0 ;
+  else if (value > range [pin])
+    value = range [pin] ;
+
+  marks [pin] = value ;
+}
+
+
+/*
+ * softPwmCreate:
+ *	Create a new softPWM thread.
+ *********************************************************************************
+ */
+
+int softPwmCreate (int pin, int initialValue, int pwmRange)
+{
+  int res ;
+  pthread_t myThread ;
+
+  if (range [pin] != 0)	// Already running on this pin
+    return -1 ;
+
+  if (range <= 0)
+    return -1 ;
+
+  pinMode      (pin, OUTPUT) ;
+  digitalWrite (pin, LOW) ;
+
+  marks [pin] = initialValue ;
+  range [pin] = pwmRange ;
+
+  newPin = pin ;
+  res    = pthread_create (&myThread, NULL, softPwmThread, NULL) ;
+
+  while (newPin != -1)
+    delay (1) ;
+
+  threads [pin] = myThread ;
+
+  return res ;
+}
+
+
+/*
+ * softPwmStop:
+ *	Stop an existing softPWM thread
+ *********************************************************************************
+ */
+
+void softPwmStop (int pin)
+{
+  if (range [pin] != 0)
+  {
+    pthread_cancel (threads [pin]) ;
+    pthread_join   (threads [pin], NULL) ;
+    range [pin] = 0 ;
+    digitalWrite (pin, LOW) ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.h b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.h
new file mode 100644
index 0000000000000000000000000000000000000000..0351da5d13d3de5f256c4a9bfd293b9ebdb301f5
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.h
@@ -0,0 +1,35 @@
+/*
+ * softPwm.h:
+ *	Provide 2 channels of software driven PWM.
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int  softPwmCreate (int pin, int value, int range) ;
+extern void softPwmWrite  (int pin, int value) ;
+extern void softPwmStop   (int pin) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.o b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.o
new file mode 100644
index 0000000000000000000000000000000000000000..f461408e648898946498f0eaf4c0523e9488d203
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/softPwm.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softServo.c b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.c
new file mode 100644
index 0000000000000000000000000000000000000000..9de9f4faf11a82074b7f794e048431d488ebcaa4
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.c
@@ -0,0 +1,211 @@
+/*
+ * softServo.c:
+ *	Provide N channels of software driven PWM suitable for RC
+ *	servo motors.
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+//#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <sys/time.h>
+#include <pthread.h>
+
+#include "wiringPi.h"
+#include "softServo.h"
+
+// RC Servo motors are a bit of an oddity - designed in the days when 
+//	radio control was experimental and people were tryin to make
+//	things as simple as possible as it was all very expensive...
+//
+// So... To drive an RC Servo motor, you need to send it a modified PWM
+//	signal - it needs anything from 1ms to 2ms - with 1ms meaning
+//	to move the server fully left, and 2ms meaning to move it fully
+//	right. Then you need a long gap before sending the next pulse.
+//	The reason for this is that you send a multiplexed stream of these
+//	pulses up the radio signal into the reciever which de-multiplexes
+//	them into the signals for each individual servo. Typically there
+//	might be 8 channels, so you need at least 8 "slots" of 2mS pulses
+//	meaning the entire frame must fit into a 16mS slot - which would
+//	then be repeated...
+//
+// In practice we have a total slot width of about 20mS - so we're sending 50
+//	updates per second to each servo.
+//
+// In this code, we don't need to be too fussy about the gap as we're not doing
+//	the multipexing, but it does need to be at least 10mS, and preferably 16
+//	from what I've been able to determine.
+
+// WARNING:
+//	This code is really experimental. It was written in response to some people
+//	asking for a servo driver, however while it works, there is too much
+//	jitter to successfully drive a small servo - I have tried it with a micro
+//	servo and it worked, but the servo ran hot due to the jitter in the signal
+//	being sent to it.
+//
+//	If you want servo control for the Pi, then use the servoblaster kernel
+//	module.
+
+#define	MAX_SERVOS	8
+
+static int pinMap     [MAX_SERVOS] ;	// Keep track of our pins
+static int pulseWidth [MAX_SERVOS] ;	// microseconds
+
+
+/*
+ * softServoThread:
+ *	Thread to do the actual Servo PWM output
+ *********************************************************************************
+ */
+
+static PI_THREAD (softServoThread)
+{
+  register int i, j, k, m, tmp ;
+  int lastDelay, pin, servo ;
+
+  int myDelays [MAX_SERVOS] ;
+  int myPins   [MAX_SERVOS] ;
+
+  struct timeval  tNow, tStart, tPeriod, tGap, tTotal ;
+  struct timespec tNs ;
+
+  tTotal.tv_sec  =    0 ;
+  tTotal.tv_usec = 8000 ;
+
+  piHiPri (50) ;
+
+  for (;;)
+  {
+    gettimeofday (&tStart, NULL) ;
+
+    memcpy (myDelays, pulseWidth, sizeof (myDelays)) ;
+    memcpy (myPins,   pinMap,     sizeof (myPins)) ;
+
+// Sort the delays (& pins), shortest first
+
+    for (m = MAX_SERVOS / 2 ; m > 0 ; m /= 2 )
+      for (j = m ; j < MAX_SERVOS ; ++j)
+	for (i = j - m ; i >= 0 ; i -= m)
+	{
+	  k = i + m ;
+	  if (myDelays [k] >= myDelays [i])
+	    break ;
+	  else // Swap
+	  {
+	    tmp = myDelays [i] ; myDelays [i] = myDelays [k] ; myDelays [k] = tmp ;
+	    tmp = myPins   [i] ; myPins   [i] = myPins   [k] ; myPins   [k] = tmp ;
+	  }
+	}
+
+// All on
+
+    lastDelay = 0 ;
+    for (servo = 0 ; servo < MAX_SERVOS ; ++servo)
+    {
+      if ((pin = myPins [servo]) == -1)
+	continue ;
+
+      digitalWrite (pin, HIGH) ;
+      myDelays [servo] = myDelays [servo] - lastDelay ;
+      lastDelay += myDelays [servo] ;
+    }
+
+// Now loop, turning them all off as required
+
+    for (servo = 0 ; servo < MAX_SERVOS ; ++servo)
+    {
+      if ((pin = myPins [servo]) == -1)
+	continue ;
+
+      delayMicroseconds (myDelays [servo]) ;
+      digitalWrite (pin, LOW) ;
+    }
+
+// Wait until the end of an 8mS time-slot
+
+    gettimeofday (&tNow, NULL) ;
+    timersub (&tNow, &tStart, &tPeriod) ;
+    timersub (&tTotal, &tPeriod, &tGap) ;
+    tNs.tv_sec  = tGap.tv_sec ;
+    tNs.tv_nsec = tGap.tv_usec * 1000 ;
+    nanosleep (&tNs, NULL) ;
+  }
+
+  return NULL ;
+}
+
+
+/*
+ * softServoWrite:
+ *	Write a Servo value to the given pin
+ *********************************************************************************
+ */
+
+void softServoWrite (int servoPin, int value)
+{
+  int servo ;
+
+  servoPin &= 63 ;
+
+  /**/ if (value < -250)
+    value = -250 ;
+  else if (value > 1250)
+    value = 1250 ;
+
+  for (servo = 0 ; servo < MAX_SERVOS ; ++servo)
+    if (pinMap [servo] == servoPin)
+      pulseWidth [servo] = value + 1000 ; // uS
+}
+
+
+/*
+ * softServoSetup:
+ *	Setup the software servo system
+ *********************************************************************************
+ */
+
+int softServoSetup (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7)
+{
+  int servo ;
+
+  if (p0 != -1) { pinMode (p0, OUTPUT) ; digitalWrite (p0, LOW) ; }
+  if (p1 != -1) { pinMode (p1, OUTPUT) ; digitalWrite (p1, LOW) ; }
+  if (p2 != -1) { pinMode (p2, OUTPUT) ; digitalWrite (p2, LOW) ; }
+  if (p3 != -1) { pinMode (p3, OUTPUT) ; digitalWrite (p3, LOW) ; }
+  if (p4 != -1) { pinMode (p4, OUTPUT) ; digitalWrite (p4, LOW) ; }
+  if (p5 != -1) { pinMode (p5, OUTPUT) ; digitalWrite (p5, LOW) ; }
+  if (p6 != -1) { pinMode (p6, OUTPUT) ; digitalWrite (p6, LOW) ; }
+  if (p7 != -1) { pinMode (p7, OUTPUT) ; digitalWrite (p7, LOW) ; }
+
+  pinMap [0] = p0 ;
+  pinMap [1] = p1 ;
+  pinMap [2] = p2 ;
+  pinMap [3] = p3 ;
+  pinMap [4] = p4 ;
+  pinMap [5] = p5 ;
+  pinMap [6] = p6 ;
+  pinMap [7] = p7 ;
+
+  for (servo = 0 ; servo < MAX_SERVOS ; ++servo)
+    pulseWidth [servo] = 1500 ;		// Mid point
+  
+  return piThreadCreate (softServoThread) ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softServo.h b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.h
new file mode 100644
index 0000000000000000000000000000000000000000..794cf552c0a70708d04c2777b4fb5642ff278053
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/softServo.h
@@ -0,0 +1,35 @@
+/*
+ * softServo.h:
+ *	Provide N channels of software driven PWM suitable for RC
+ *	servo motors.
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void softServoWrite  (int pin, int value) ;
+extern int softServoSetup   (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softTone.c b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.c
new file mode 100644
index 0000000000000000000000000000000000000000..e2fb73711927adadf33557484ce8b55c84b981f4
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.c
@@ -0,0 +1,150 @@
+/*
+ * softTone.c:
+ *	For that authentic retro sound...
+ *	Er... A little experiment to produce tones out of a Pi using
+ *	one (or 2) GPIO pins and a piezeo "speaker" element.
+ *	(Or a high impedance speaker, but don'y blame me if you blow-up
+ *	the GPIO pins!)
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <pthread.h>
+
+#include "wiringPi.h"
+#include "softTone.h"
+
+#define	MAX_PINS	64
+
+#define	PULSE_TIME	100
+
+static int freqs         [MAX_PINS] ;
+static pthread_t threads [MAX_PINS] ;
+
+static int newPin = -1 ;
+
+
+/*
+ * softToneThread:
+ *	Thread to do the actual PWM output
+ *********************************************************************************
+ */
+
+static PI_THREAD (softToneThread)
+{
+  int pin, freq, halfPeriod ;
+  struct sched_param param ;
+
+  param.sched_priority = sched_get_priority_max (SCHED_RR) ;
+  pthread_setschedparam (pthread_self (), SCHED_RR, &param) ;
+
+  pin    = newPin ;
+  newPin = -1 ;
+
+  piHiPri (50) ;
+
+  for (;;)
+  {
+    freq = freqs [pin] ;
+    if (freq == 0)
+      delay (1) ;
+    else
+    {
+      halfPeriod = 500000 / freq ;
+
+      digitalWrite (pin, HIGH) ;
+      delayMicroseconds (halfPeriod) ;
+
+      digitalWrite (pin, LOW) ;
+      delayMicroseconds (halfPeriod) ;
+    }
+  }
+
+  return NULL ;
+}
+
+
+/*
+ * softToneWrite:
+ *	Write a frequency value to the given pin
+ *********************************************************************************
+ */
+
+void softToneWrite (int pin, int freq)
+{
+  pin &= 63 ;
+
+  /**/ if (freq < 0)
+    freq = 0 ;
+  else if (freq > 5000)	// Max 5KHz
+    freq = 5000 ;
+
+  freqs [pin] = freq ;
+}
+
+
+/*
+ * softToneCreate:
+ *	Create a new tone thread.
+ *********************************************************************************
+ */
+
+int softToneCreate (int pin)
+{
+  int res ;
+  pthread_t myThread ;
+
+  pinMode      (pin, OUTPUT) ;
+  digitalWrite (pin, LOW) ;
+
+  if (threads [pin] != 0)
+    return -1 ;
+
+  freqs [pin] = 0 ;
+
+  newPin = pin ;
+  res    = pthread_create (&myThread, NULL, softToneThread, NULL) ;
+
+  while (newPin != -1)
+    delay (1) ;
+
+  threads [pin] = myThread ;
+
+  return res ;
+}
+
+
+/*
+ * softToneStop:
+ *	Stop an existing softTone thread
+ *********************************************************************************
+ */
+
+void softToneStop (int pin)
+{
+  if (threads [pin] != 0)
+  {
+    pthread_cancel (threads [pin]) ;
+    pthread_join   (threads [pin], NULL) ;
+    threads [pin] = 0 ;
+    digitalWrite (pin, LOW) ;
+  }
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softTone.h b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.h
new file mode 100644
index 0000000000000000000000000000000000000000..a93c5af3326e1828d18662eeff351164742da60c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.h
@@ -0,0 +1,39 @@
+/*
+ * softTone.c:
+ *	For that authentic retro sound...
+ *	Er... A little experiment to produce tones out of a Pi using
+ *	one (or 2) GPIO pins and a piezeo "speaker" element.
+ *	(Or a high impedance speaker, but don'y blame me if you blow-up
+ *	the GPIO pins!)
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int  softToneCreate (int pin) ;
+extern void softToneStop   (int pin) ;
+extern void softToneWrite  (int pin, int freq) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/softTone.o b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.o
new file mode 100644
index 0000000000000000000000000000000000000000..5bbf1c7fbb3051776cc147c16ef3962ba19bb443
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/softTone.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sr595.c b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.c
new file mode 100644
index 0000000000000000000000000000000000000000..87210c28232ecd6538a0fbf0be16c0a797aec153
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.c
@@ -0,0 +1,109 @@
+/*
+ * sr595.c:
+ *	Extend wiringPi with the 74x595 shift register as a GPIO
+ *	expander chip.
+ *	Note that the code can cope with a number of 595's
+ *	daisy-chained together - up to 4 for now as we're storing
+ *	the output "register" in a single unsigned int.
+ *
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+
+#include "wiringPi.h"
+
+#include "sr595.h"
+
+
+/*
+ * myDigitalWrite:
+ *********************************************************************************
+ */
+
+static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value)
+{
+  unsigned int mask ;
+  int  dataPin, clockPin, latchPin ;
+  int  bit, bits, output ;
+
+  pin     -= node->pinBase ;				// Normalise pin number
+  bits     = node->pinMax - node->pinBase + 1 ;		// ie. number of clock pulses
+  dataPin  = node->data0 ;
+  clockPin = node->data1 ;
+  latchPin = node->data2 ;
+  output   = node->data3 ;
+
+  mask = 1 << pin ;
+
+  if (value == LOW)
+    output &= (~mask) ;
+  else
+    output |=   mask ;
+
+  node->data3 = output ;
+
+// A low -> high latch transition copies the latch to the output pins
+
+  digitalWrite (latchPin, LOW) ; delayMicroseconds (1) ;
+    for (bit = bits - 1 ; bit >= 0 ; --bit)
+    {
+      digitalWrite (dataPin, output & (1 << bit)) ;
+
+      digitalWrite (clockPin, HIGH) ; delayMicroseconds (1) ;
+      digitalWrite (clockPin, LOW) ;  delayMicroseconds (1) ;
+    }
+  digitalWrite (latchPin, HIGH) ; delayMicroseconds (1) ;
+}
+
+
+/*
+ * sr595Setup:
+ *	Create a new instance of a 74x595 shift register GPIO expander.
+ *********************************************************************************
+ */
+
+int sr595Setup (const int pinBase, const int numPins,
+	const int dataPin, const int clockPin, const int latchPin) 
+{
+  struct wiringPiNodeStruct *node ;
+
+  node = wiringPiNewNode (pinBase, numPins) ;
+
+  node->data0           = dataPin ;
+  node->data1           = clockPin ;
+  node->data2           = latchPin ;
+  node->data3           = 0 ;		// Output register
+  node->digitalWrite    = myDigitalWrite ;
+
+// Initialise the underlying hardware
+
+  digitalWrite (dataPin,  LOW) ;
+  digitalWrite (clockPin, LOW) ;
+  digitalWrite (latchPin, HIGH) ;
+
+  pinMode (dataPin,  OUTPUT) ;
+  pinMode (clockPin, OUTPUT) ;
+  pinMode (latchPin, OUTPUT) ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sr595.h b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.h
new file mode 100644
index 0000000000000000000000000000000000000000..4a26dc7c60405e058fb52444bbe086aadeebd890
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.h
@@ -0,0 +1,34 @@
+/*
+ * sr595.h:
+ *	Extend wiringPi with the 74x595 shift registers.
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int sr595Setup (const int pinBase, const int numPins,
+	const int dataPin, const int clockPin, const int latchPin) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/sr595.o b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.o
new file mode 100644
index 0000000000000000000000000000000000000000..c78ae47e4c011e43ccc8f804e6fb4f8cdecbcde7
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/sr595.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.c
new file mode 100755
index 0000000000000000000000000000000000000000..6d1c1104ec2e61ed51ca5615212ffc66f1dfe518
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.c
@@ -0,0 +1,3152 @@
+/*
+ * wiringPi:
+ *	Arduino compatable (ish) Wiring library for the Raspberry Pi
+ *	Copyright (c) 2012 Gordon Henderson
+ *	Additional code for pwmSetClock by Chris Hall <chris@kchall.plus.com>
+ *
+ *	Thanks to code samples from Gert Jan van Loo and the
+ *	BCM2835 ARM Peripherals manual, however it's missing
+ *	the clock section /grr/mutter/
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+// Revisions:
+//	19 Jul 2012:
+//		Moved to the LGPL
+//		Added an abstraction layer to the main routines to save a tiny
+//		bit of run-time and make the clode a little cleaner (if a little
+//		larger)
+//		Added waitForInterrupt code
+//		Added piHiPri code
+//
+//	 9 Jul 2012:
+//		Added in support to use the /sys/class/gpio interface.
+//	 2 Jul 2012:
+//		Fixed a few more bugs to do with range-checking when in GPIO mode.
+//	11 Jun 2012:
+//		Fixed some typos.
+//		Added c++ support for the .h file
+//		Added a new function to allow for using my "pin" numbers, or native
+//			GPIO pin numbers.
+//		Removed my busy-loop delay and replaced it with a call to delayMicroseconds
+//
+//	02 May 2012:
+//		Added in the 2 UART pins
+//		Change maxPins to numPins to more accurately reflect purpose
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <poll.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <sys/utsname.h>
+
+#include "softPwm.h"
+#include "softTone.h"
+
+#include "wiringPi.h"
+
+#ifndef	TRUE
+#define	TRUE	(1==1)
+#define	FALSE	(1==2)
+#endif
+
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(x)	(sizeof(x) / sizeof((x)[0]))
+#endif
+
+// Environment Variables
+
+#define	ENV_DEBUG	"WIRINGPI_DEBUG"
+#define	ENV_CODES	"WIRINGPI_CODES"
+
+
+// Mask for the bottom 64 pins which belong to the Raspberry Pi
+//	The others are available for the other devices
+
+#define	PI_GPIO_MASK	(0xFFFFFFC0)
+
+struct wiringPiNodeStruct *wiringPiNodes = NULL ;
+
+// BCM Magic
+
+#define	BCM_PASSWORD		0x5A000000
+
+
+// The BCM2835 has 54 GPIO pins.
+//	BCM2835 data sheet, Page 90 onwards.
+//	There are 6 control registers, each control the functions of a block
+//	of 10 pins.
+//	Each control register has 10 sets of 3 bits per GPIO pin - the ALT values
+//
+//	000 = GPIO Pin X is an input
+//	001 = GPIO Pin X is an output
+//	100 = GPIO Pin X takes alternate function 0
+//	101 = GPIO Pin X takes alternate function 1
+//	110 = GPIO Pin X takes alternate function 2
+//	111 = GPIO Pin X takes alternate function 3
+//	011 = GPIO Pin X takes alternate function 4
+//	010 = GPIO Pin X takes alternate function 5
+//
+// So the 3 bits for port X are:
+//	X / 10 + ((X % 10) * 3)
+
+// Port function select bits
+
+#define	FSEL_INPT		0b000
+#define	FSEL_OUTP		0b001
+#define	FSEL_ALT0		0b100
+#define	FSEL_ALT1		0b101
+#define	FSEL_ALT2		0b110
+#define	FSEL_ALT3		0b111
+#define	FSEL_ALT4		0b011
+#define	FSEL_ALT5		0b010
+
+// Access from ARM Running Linux
+//	Taken from Gert/Doms code. Some of this is not in the manual
+//	that I can find )-:
+
+#define BCM2708_PERI_BASE   0x20000000
+#define GPIO_PADS   (BCM2708_PERI_BASE + 0x00100000)
+#define CLOCK_BASE  (BCM2708_PERI_BASE + 0x00101000)
+#define GPIO_BASE   (BCM2708_PERI_BASE + 0x00200000)
+#define GPIO_TIMER  (BCM2708_PERI_BASE + 0x0000B000)
+#define GPIO_PWM    (BCM2708_PERI_BASE + 0x0020C000)
+
+#define	PAGE_SIZE   (4*1024)
+#define	BLOCK_SIZE  (4*1024)
+
+// PWM
+//	Word offsets into the PWM control region
+
+#define	PWM_CONTROL 0
+#define	PWM_STATUS  1
+#define	PWM0_RANGE  4
+#define	PWM0_DATA   5
+#define	PWM1_RANGE  8
+#define	PWM1_DATA   9
+
+//	Clock regsiter offsets
+
+#define	PWMCLK_CNTL	40
+#define	PWMCLK_DIV	41
+
+#define	PWM0_MS_MODE    0x0080  // Run in MS mode
+#define	PWM0_USEFIFO    0x0020  // Data from FIFO
+#define	PWM0_REVPOLAR   0x0010  // Reverse polarity
+#define	PWM0_OFFSTATE   0x0008  // Ouput Off state
+#define	PWM0_REPEATFF   0x0004  // Repeat last value if FIFO empty
+#define	PWM0_SERIAL     0x0002  // Run in serial mode
+#define	PWM0_ENABLE     0x0001  // Channel Enable
+
+#define	PWM1_MS_MODE    0x8000  // Run in MS mode
+#define	PWM1_USEFIFO    0x2000  // Data from FIFO
+#define	PWM1_REVPOLAR   0x1000  // Reverse polarity
+#define	PWM1_OFFSTATE   0x0800  // Ouput Off state
+#define	PWM1_REPEATFF   0x0400  // Repeat last value if FIFO empty
+#define	PWM1_SERIAL     0x0200  // Run in serial mode
+#define	PWM1_ENABLE     0x0100  // Channel Enable
+
+// Timer
+//	Word offsets
+
+#define	TIMER_LOAD      (0x400 >> 2)
+#define	TIMER_VALUE     (0x404 >> 2)
+#define	TIMER_CONTROL   (0x408 >> 2)
+#define	TIMER_IRQ_CLR   (0x40C >> 2)
+#define	TIMER_IRQ_RAW   (0x410 >> 2)
+#define	TIMER_IRQ_MASK  (0x414 >> 2)
+#define	TIMER_RELOAD    (0x418 >> 2)
+#define	TIMER_PRE_DIV   (0x41C >> 2)
+#define	TIMER_COUNTER   (0x420 >> 2)
+
+// Locals to hold pointers to the hardware
+
+static volatile uint32_t *gpio, *gpio1;
+static volatile uint32_t *pwm ;
+static volatile uint32_t *clk ;
+static volatile uint32_t *pads ;
+
+#ifdef	USE_TIMER
+static volatile uint32_t *timer ;
+static volatile uint32_t *timerIrqRaw ;
+#endif
+
+
+// Data for use with the boardId functions.
+//	The order of entries here to correspond with the PI_MODEL_X
+//	and PI_VERSION_X defines in wiringPi.h
+//	Only intended for the gpio command - use at your own risk!
+
+const char *piModelNames [9] =
+{
+  "Unknown",
+  "Model A",
+  "Model B",
+  "Model B+",
+  "Compute Module",
+  "Model A+",
+  "ODROID-C1/C1+",
+  "ODROID-XU3/4",
+  "ODROID-C2",
+} ;
+
+const char *piRevisionNames [5] =
+{
+  "Unknown",
+  "1",
+  "1.1",
+  "1.2",
+  "2",
+} ;
+
+const char *piMakerNames [5] =
+{
+  "Unknown",
+  "Egoman",
+  "Sony",
+  "Qusda",
+  "Hardkernel",
+} ;
+
+
+// Time for easy calculations
+
+static uint64_t epochMilli, epochMicro ;
+
+// Misc
+
+static int wiringPiMode = WPI_MODE_UNINITIALISED ;
+static volatile int    pinPass = -1 ;
+static pthread_mutex_t pinMutex ;
+
+// Debugging & Return codes
+
+int wiringPiDebug       = FALSE ;
+int wiringPiReturnCodes = FALSE ;
+
+// sysFds:
+//	Map a file descriptor from the /sys/class/gpio/gpioX/value
+
+static int sysFds [64] =
+{
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+} ;
+
+// ISR Data
+
+static void (*isrFunctions [64])(void) ;
+
+
+// Doing it the Arduino way with lookup tables...
+//	Yes, it's probably more innefficient than all the bit-twidling, but it
+//	does tend to make it all a bit clearer. At least to me!
+
+// pinToGpio:
+//	Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin
+//	Cope for 3 different board revisions here.
+
+static int *pinToGpio ;
+static int pin_array_count;
+
+// Revision 1, 1.1:
+
+static int pinToGpioR1 [64] =
+{
+  17, 18, 21, 22, 23, 24, 25, 4,	// From the Original Wiki - GPIO 0 through 7:	wpi  0 -  7
+   0,  1,				// I2C  - SDA1, SCL1				wpi  8 -  9
+   8,  7,				// SPI  - CE1, CE0				wpi 10 - 11
+  10,  9, 11, 				// SPI  - MOSI, MISO, SCLK			wpi 12 - 14
+  14, 15,				// UART - Tx, Rx				wpi 15 - 16
+
+// Padding:
+
+      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 31
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 47
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 63
+} ;
+
+// Revision 2:
+
+static int pinToGpioR2 [64] =
+{
+  17, 18, 27, 22, 23, 24, 25, 4,	// From the Original Wiki - GPIO 0 through 7:	wpi  0 -  7
+   2,  3,				// I2C  - SDA0, SCL0				wpi  8 -  9
+   8,  7,				// SPI  - CE1, CE0				wpi 10 - 11
+  10,  9, 11, 				// SPI  - MOSI, MISO, SCLK			wpi 12 - 14
+  14, 15,				// UART - Tx, Rx				wpi 15 - 16
+  28, 29, 30, 31,			// Rev 2: New GPIOs 8 though 11			wpi 17 - 20
+   5,  6, 13, 19, 26,			// B+						wpi 21, 22, 23, 24, 25
+  12, 16, 20, 21,			// B+						wpi 26, 27, 28, 29
+   0,  1,				// B+						wpi 30, 31
+
+// Padding:
+
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 47
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 63
+} ;
+
+
+// physToGpio:
+//	Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin
+//	Cope for 2 different board revisions here.
+//	Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56
+
+static int *physToGpio ;
+
+static int physToGpioR1 [64] =
+{
+  -1,		// 0
+  -1, -1,	// 1, 2
+   0, -1,
+   1, -1,
+   4, 14,
+  -1, 15,
+  17, 18,
+  21, -1,
+  22, 23,
+  -1, 24,
+  10, -1,
+   9, 25,
+  11,  8,
+  -1,  7,	// 25, 26
+
+                                              -1, -1, -1, -1, -1,	// ... 31
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 47
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 63
+} ;
+
+static int physToGpioR2 [64] =
+{
+  -1,		// 0
+  -1, -1,	// 1, 2
+   2, -1,
+   3, -1,
+   4, 14,
+  -1, 15,
+  17, 18,
+  27, -1,
+  22, 23,
+  -1, 24,
+  10, -1,
+   9, 25,
+  11,  8,
+  -1,  7,	// 25, 26
+
+// B+
+
+   0,  1,
+   5, -1,
+   6, 12,
+  13, -1,
+  19, 16,
+  26, 20,
+  -1, 21,
+
+// the P5 connector on the Rev 2 boards:
+
+  -1, -1,
+  -1, -1,
+  -1, -1,
+  -1, -1,
+  -1, -1,
+  28, 29,
+  30, 31,
+  -1, -1,
+  -1, -1,
+  -1, -1,
+  -1, -1,
+} ;
+
+// gpioToGPFSEL:
+//	Map a BCM_GPIO pin to it's Function Selection
+//	control port. (GPFSEL 0-5)
+//	Groups of 10 - 3 bits per Function - 30 bits per port
+
+static uint8_t gpioToGPFSEL [] =
+{
+  0,0,0,0,0,0,0,0,0,0,
+  1,1,1,1,1,1,1,1,1,1,
+  2,2,2,2,2,2,2,2,2,2,
+  3,3,3,3,3,3,3,3,3,3,
+  4,4,4,4,4,4,4,4,4,4,
+  5,5,5,5,5,5,5,5,5,5,
+} ;
+
+
+// gpioToShift
+//	Define the shift up for the 3 bits per pin in each GPFSEL port
+
+static uint8_t gpioToShift [] =
+{
+  0,3,6,9,12,15,18,21,24,27,
+  0,3,6,9,12,15,18,21,24,27,
+  0,3,6,9,12,15,18,21,24,27,
+  0,3,6,9,12,15,18,21,24,27,
+  0,3,6,9,12,15,18,21,24,27,
+} ;
+
+
+// gpioToGPSET:
+//	(Word) offset to the GPIO Set registers for each GPIO pin
+
+static uint8_t gpioToGPSET [] =
+{
+   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+} ;
+
+// gpioToGPCLR:
+//	(Word) offset to the GPIO Clear registers for each GPIO pin
+
+static uint8_t gpioToGPCLR [] =
+{
+  10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+  11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+} ;
+
+
+// gpioToGPLEV:
+//	(Word) offset to the GPIO Input level registers for each GPIO pin
+
+static uint8_t gpioToGPLEV [] =
+{
+  13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
+  14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
+} ;
+
+
+#ifdef notYetReady
+// gpioToEDS
+//	(Word) offset to the Event Detect Status
+
+static uint8_t gpioToEDS [] =
+{
+  16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+  17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+} ;
+
+// gpioToREN
+//	(Word) offset to the Rising edge ENable register
+
+static uint8_t gpioToREN [] =
+{
+  19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,
+  20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
+} ;
+
+// gpioToFEN
+//	(Word) offset to the Falling edgde ENable register
+
+static uint8_t gpioToFEN [] =
+{
+  22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
+  23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
+} ;
+#endif
+
+
+// GPPUD:
+//	GPIO Pin pull up/down register
+
+#define	GPPUD	37
+
+// gpioToPUDCLK
+//	(Word) offset to the Pull Up Down Clock regsiter
+
+static uint8_t gpioToPUDCLK [] =
+{
+  38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
+  39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,
+} ;
+
+
+// gpioToPwmALT
+//	the ALT value to put a GPIO pin into PWM mode
+
+static uint8_t gpioToPwmALT [] =
+{
+          0,         0,         0,         0,         0,         0,         0,         0,	//  0 ->  7
+          0,         0,         0,         0, FSEL_ALT0, FSEL_ALT0,         0,         0, 	//  8 -> 15
+          0,         0, FSEL_ALT5, FSEL_ALT5,         0,         0,         0,         0, 	// 16 -> 23
+          0,         0,         0,         0,         0,         0,         0,         0,	// 24 -> 31
+          0,         0,         0,         0,         0,         0,         0,         0,	// 32 -> 39
+  FSEL_ALT0, FSEL_ALT0,         0,         0,         0, FSEL_ALT0,         0,         0,	// 40 -> 47
+          0,         0,         0,         0,         0,         0,         0,         0,	// 48 -> 55
+          0,         0,         0,         0,         0,         0,         0,         0,	// 56 -> 63
+} ;
+
+
+// gpioToPwmPort
+//	The port value to put a GPIO pin into PWM mode
+
+static uint8_t gpioToPwmPort [] =
+{
+          0,         0,         0,         0,         0,         0,         0,         0,	//  0 ->  7
+          0,         0,         0,         0, PWM0_DATA, PWM1_DATA,         0,         0, 	//  8 -> 15
+          0,         0, PWM0_DATA, PWM1_DATA,         0,         0,         0,         0, 	// 16 -> 23
+          0,         0,         0,         0,         0,         0,         0,         0,	// 24 -> 31
+          0,         0,         0,         0,         0,         0,         0,         0,	// 32 -> 39
+  PWM0_DATA, PWM1_DATA,         0,         0,         0, PWM1_DATA,         0,         0,	// 40 -> 47
+          0,         0,         0,         0,         0,         0,         0,         0,	// 48 -> 55
+          0,         0,         0,         0,         0,         0,         0,         0,	// 56 -> 63
+
+} ;
+
+// gpioToGpClkALT:
+//	ALT value to put a GPIO pin into GP Clock mode.
+//	On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21
+//	for clocks 0 and 1 respectively, however I'll include the full
+//	list for completeness - maybe one day...
+
+#define	GPIO_CLOCK_SOURCE	1
+
+// gpioToGpClkALT0:
+
+static uint8_t gpioToGpClkALT0 [] =
+{
+          0,         0,         0,         0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0,         0,	//  0 ->  7
+          0,         0,         0,         0,         0,         0,         0,         0, 	//  8 -> 15
+          0,         0,         0,         0, FSEL_ALT5, FSEL_ALT5,         0,         0, 	// 16 -> 23
+          0,         0,         0,         0,         0,         0,         0,         0,	// 24 -> 31
+  FSEL_ALT0,         0, FSEL_ALT0,         0,         0,         0,         0,         0,	// 32 -> 39
+          0,         0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0,         0,         0,         0,	// 40 -> 47
+          0,         0,         0,         0,         0,         0,         0,         0,	// 48 -> 55
+          0,         0,         0,         0,         0,         0,         0,         0,	// 56 -> 63
+} ;
+
+// gpioToClk:
+//	(word) Offsets to the clock Control and Divisor register
+
+static uint8_t gpioToClkCon [] =
+{
+         -1,        -1,        -1,        -1,        28,        30,        32,        -1,	//  0 ->  7
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1, 	//  8 -> 15
+         -1,        -1,        -1,        -1,        28,        30,        -1,        -1, 	// 16 -> 23
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1,	// 24 -> 31
+         28,        -1,        28,        -1,        -1,        -1,        -1,        -1,	// 32 -> 39
+         -1,        -1,        28,        30,        28,        -1,        -1,        -1,	// 40 -> 47
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1,	// 48 -> 55
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1,	// 56 -> 63
+} ;
+
+static uint8_t gpioToClkDiv [] =
+{
+         -1,        -1,        -1,        -1,        29,        31,        33,        -1,	//  0 ->  7
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1, 	//  8 -> 15
+         -1,        -1,        -1,        -1,        29,        31,        -1,        -1, 	// 16 -> 23
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1,	// 24 -> 31
+         29,        -1,        29,        -1,        -1,        -1,        -1,        -1,	// 32 -> 39
+         -1,        -1,        29,        31,        29,        -1,        -1,        -1,	// 40 -> 47
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1,	// 48 -> 55
+         -1,        -1,        -1,        -1,        -1,        -1,        -1,        -1,	// 56 -> 63
+} ;
+
+//
+// For ODROID-C Board
+//
+#define ODROIDC_GPIO_MASK (0xFFFFFF80)
+
+#define ODROIDC_PERI_BASE 0xC1100000
+#define GPIO_REG_OFFSET   0x8000
+#define ODROID_GPIO_BASE  (ODROIDC_PERI_BASE + GPIO_REG_OFFSET)
+
+#define GPIO_PIN_BASE           80
+#define GPIOY_PIN_START         80
+#define GPIOY_PIN_END           96
+#define GPIOX_PIN_START         97
+#define GPIOX_PIN_END           118
+
+#define GPIOX_FSEL_REG_OFFSET   0x0C
+#define GPIOX_OUTP_REG_OFFSET   0x0D
+#define GPIOX_INP_REG_OFFSET    0x0E
+#define GPIOX_PUPD_REG_OFFSET   0x3E
+#define GPIOX_PUEN_REG_OFFSET   0x4C
+
+#define GPIOY_FSEL_REG_OFFSET   0x0F
+#define GPIOY_OUTP_REG_OFFSET   0x10
+#define GPIOY_INP_REG_OFFSET    0x11
+#define GPIOY_PUPD_REG_OFFSET   0x3D
+#define GPIOY_PUEN_REG_OFFSET   0x4B
+
+#define piAinNode0   "/sys/class/saradc/saradc_ch0"
+#define piAinNode1   "/sys/class/saradc/saradc_ch1"
+
+static int adcFds [2] = {
+    -1, -1,
+} ;
+
+//
+// For ODROID-C2 Board
+//
+#define ODROIDC2_GPIO_MASK		(0xFFFFFF00)
+#define ODROIDC2_GPIO_BASE		0xC8834000
+
+#define C2_GPIO_PIN_BASE           136
+#define C2_GPIOY_PIN_START         (C2_GPIO_PIN_BASE + 75)
+#define C2_GPIOY_PIN_END           (C2_GPIO_PIN_BASE + 91)
+#define C2_GPIOX_PIN_START         (C2_GPIO_PIN_BASE + 92)
+#define C2_GPIOX_PIN_END           (C2_GPIO_PIN_BASE + 114)
+
+#define C2_GPIOX_FSEL_REG_OFFSET   0x118
+#define C2_GPIOX_OUTP_REG_OFFSET   0x119
+#define C2_GPIOX_INP_REG_OFFSET    0x11A
+#define C2_GPIOX_PUPD_REG_OFFSET   0x13E
+#define C2_GPIOX_PUEN_REG_OFFSET   0x14C
+
+#define C2_GPIOY_FSEL_REG_OFFSET   0x10F
+#define C2_GPIOY_OUTP_REG_OFFSET   0x110
+#define C2_GPIOY_INP_REG_OFFSET    0x111
+#define C2_GPIOY_PUPD_REG_OFFSET   0x13B
+#define C2_GPIOY_PUEN_REG_OFFSET   0x149
+
+#define C2_piAinNode0   "/sys/class/saradc/ch0"
+#define C2_piAinNode1   "/sys/class/saradc/ch1"
+
+//
+// For ODROID-XU3/4 Board
+//
+#define ODROIDXU_GPIO_MASK  (0xFFFFFF00)
+
+#define ODROIDXU_GPX_BASE   0x13400000  // GPX0,1,2,3
+#define ODROIDXU_GPA_BASE   0x14010000  // GPA0,1,2, GPB0,1,2,3,4
+
+#define GPIO_X1_START       16
+#define GPIO_X1_CON_OFFSET  0x0C20
+#define GPIO_X1_DAT_OFFSET  0x0C24
+#define GPIO_X1_PUD_OFFSET  0x0C28
+#define GPIO_X1_END         23
+
+#define GPIO_X2_START       24
+#define GPIO_X2_CON_OFFSET  0x0C40
+#define GPIO_X2_DAT_OFFSET  0x0C44
+#define GPIO_X2_PUD_OFFSET  0x0C48
+#define GPIO_X2_END         31
+
+#define GPIO_X3_START       32
+#define GPIO_X3_CON_OFFSET  0x0C60
+#define GPIO_X3_DAT_OFFSET  0x0C64
+#define GPIO_X3_PUD_OFFSET  0x0C68
+#define GPIO_X3_END         39
+
+#define GPIO_A0_START       171
+#define GPIO_A0_CON_OFFSET  0x0000
+#define GPIO_A0_DAT_OFFSET  0x0004
+#define GPIO_A0_PUD_OFFSET  0x0008
+#define GPIO_A0_END         178
+
+#define GPIO_A2_START       185
+#define GPIO_A2_CON_OFFSET  0x0040
+#define GPIO_A2_DAT_OFFSET  0x0044
+#define GPIO_A2_PUD_OFFSET  0x0048
+#define GPIO_A2_END         192
+
+#define GPIO_B3_START       207
+#define GPIO_B3_CON_OFFSET  0x00C0
+#define GPIO_B3_DAT_OFFSET  0x00C4
+#define GPIO_B3_PUD_OFFSET  0x00C8
+#define GPIO_B3_END         214
+
+static char *piAinNode0_xu;
+static char *piAinNode1_xu;
+
+static int  piModel = PI_MODEL_UNKNOWN;
+
+static int sysFdData [64] = {
+    -1, -1, -1, -1, -1, -1, -1, -1, // 0...7
+    -1, -1, -1, -1, -1, -1, -1, -1, // 8...15
+    -1, -1, -1, -1, -1, -1, -1, -1, // 16...23
+    -1, -1, -1, -1, -1, -1, -1, -1, // 24...31
+    -1, -1, -1, -1, -1, -1, -1, -1, // 32...39
+    -1, -1, -1, -1, -1, -1, -1, -1, // 40...47
+    -1, -1, -1, -1, -1, -1, -1, -1, // 48...55
+    -1, -1, -1, -1, -1, -1, -1, -1, // 56...63
+};
+
+static int sysFdIrqType [64] = {
+    -1, -1, -1, -1, -1, -1, -1, -1, // 0...7
+    -1, -1, -1, -1, -1, -1, -1, -1, // 8...15
+    -1, -1, -1, -1, -1, -1, -1, -1, // 16...23
+    -1, -1, -1, -1, -1, -1, -1, -1, // 24...31
+    -1, -1, -1, -1, -1, -1, -1, -1, // 32...39
+    -1, -1, -1, -1, -1, -1, -1, -1, // 40...47
+    -1, -1, -1, -1, -1, -1, -1, -1, // 48...55
+    -1, -1, -1, -1, -1, -1, -1, -1, // 56...63
+};
+
+static int gpioToPin(int gpio)
+{
+	int pin;
+
+	if (pinToGpio == NULL) {
+		(void)wiringPiFailure (WPI_FATAL, "%s: wiringPi is not initialized yet\n", __func__);
+		return -1;
+	}
+
+	for (pin = 0; pin < pin_array_count; ++pin) {
+		if (pinToGpio[pin] == gpio)
+			return pin;
+	}
+
+	(void)wiringPiFailure (WPI_FATAL, "%s: could not find the pin of %d gpio\n", __func__, gpio);
+	return -1;
+}
+
+//
+// sysfs FD offset
+//
+static int  gpioFdOffsetXU34(int pin)
+{
+    int offset = -1;
+
+    switch(pin) {
+        case  GPIO_X1_START...GPIO_X1_END:  offset = (pin - GPIO_X1_START) + 0;     break;
+        case  GPIO_X2_START...GPIO_X2_END:  offset = (pin - GPIO_X2_START) + 8;     break;
+        case  GPIO_X3_START...GPIO_X3_END:  offset = (pin - GPIO_X3_START) + 16;    break;
+        case  GPIO_A0_START...GPIO_A0_END:  offset = (pin - GPIO_A0_START) + 24;    break;
+        case  GPIO_A2_START...GPIO_A2_END:  offset = (pin - GPIO_A2_START) + 32;    break;
+        case  GPIO_B3_START...GPIO_B3_END:  offset = (pin - GPIO_B3_START) + 40;    break;
+        default :                           offset = -1;                            break;
+    }
+    return  offset;
+}
+
+//
+// offset to the GPIO Set regsiter
+//
+static int  gpioToGPSETReg (int pin)
+{
+    if(piModel == PI_MODEL_ODROIDXU_34) {
+        switch(pin) {
+            case    GPIO_X1_START...GPIO_X1_END:
+                return  (GPIO_X1_DAT_OFFSET >> 2);
+            case    GPIO_X2_START...GPIO_X2_END:
+                return  (GPIO_X2_DAT_OFFSET >> 2);
+            case    GPIO_X3_START...GPIO_X3_END:
+                return  (GPIO_X3_DAT_OFFSET >> 2);
+            case    GPIO_A0_START...GPIO_A0_END:
+                return  (GPIO_A0_DAT_OFFSET >> 2);
+            case    GPIO_A2_START...GPIO_A2_END:
+                return  (GPIO_A2_DAT_OFFSET >> 2);
+            case    GPIO_B3_START...GPIO_B3_END:
+                return  (GPIO_B3_DAT_OFFSET >> 2);
+            default:
+                break;
+        }
+    }
+    else if (piModel == PI_MODEL_ODROIDC2)	{
+        if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END)
+		return  C2_GPIOX_OUTP_REG_OFFSET;
+        if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END)
+		return  C2_GPIOY_OUTP_REG_OFFSET;
+    }
+    else    {
+        if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END)
+		return  GPIOX_OUTP_REG_OFFSET;
+        if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END)
+		return  GPIOY_OUTP_REG_OFFSET;
+    }
+
+    return  -1;
+}
+
+//
+// offset to the GPIO Input regsiter
+//
+static int  gpioToGPLEVReg (int pin)
+{
+    if(piModel == PI_MODEL_ODROIDXU_34) {
+        switch(pin) {
+            case    GPIO_X1_START...GPIO_X1_END:
+                return  (GPIO_X1_DAT_OFFSET >> 2);
+            case    GPIO_X2_START...GPIO_X2_END:
+                return  (GPIO_X2_DAT_OFFSET >> 2);
+            case    GPIO_X3_START...GPIO_X3_END:
+                return  (GPIO_X3_DAT_OFFSET >> 2);
+            case    GPIO_A0_START...GPIO_A0_END:
+                return  (GPIO_A0_DAT_OFFSET >> 2);
+            case    GPIO_A2_START...GPIO_A2_END:
+                return  (GPIO_A2_DAT_OFFSET >> 2);
+            case    GPIO_B3_START...GPIO_B3_END:
+                return  (GPIO_B3_DAT_OFFSET >> 2);
+            default:
+                break;
+        }
+    }
+    else if (piModel == PI_MODEL_ODROIDC2)	{
+        if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END)
+		return  C2_GPIOX_INP_REG_OFFSET;
+        if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END)
+		return  C2_GPIOY_INP_REG_OFFSET;
+    }
+    else    {
+        if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END)
+		return  GPIOX_INP_REG_OFFSET;
+        if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END)
+		return  GPIOY_INP_REG_OFFSET;
+    }
+
+    return  -1;
+}
+
+//
+// offset to the GPIO Pull up/down enable regsiter
+//
+static int  gpioToPUENReg (int pin)
+{
+	if(piModel == PI_MODEL_ODROIDC2)	{
+		if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END)
+			return  C2_GPIOX_PUEN_REG_OFFSET;
+		if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END)
+			return  C2_GPIOY_PUEN_REG_OFFSET;
+	}
+	else	{
+		if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END)
+			return  GPIOX_PUEN_REG_OFFSET;
+		if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END)
+			return  GPIOY_PUEN_REG_OFFSET;
+	}
+
+    return  -1;
+}
+
+//
+// offset to the GPIO Pull up/down regsiter
+//
+static int  gpioToPUPDReg (int pin)
+{
+    if(piModel == PI_MODEL_ODROIDXU_34) {
+        switch(pin) {
+            case    GPIO_X1_START...GPIO_X1_END:
+                return  (GPIO_X1_PUD_OFFSET >> 2);
+            case    GPIO_X2_START...GPIO_X2_END:
+                return  (GPIO_X2_PUD_OFFSET >> 2);
+            case    GPIO_X3_START...GPIO_X3_END:
+                return  (GPIO_X3_PUD_OFFSET >> 2);
+            case    GPIO_A0_START...GPIO_A0_END:
+                return  (GPIO_A0_PUD_OFFSET >> 2);
+            case    GPIO_A2_START...GPIO_A2_END:
+                return  (GPIO_A2_PUD_OFFSET >> 2);
+            case    GPIO_B3_START...GPIO_B3_END:
+                return  (GPIO_B3_PUD_OFFSET >> 2);
+            default:
+                break;
+        }
+    }
+    else if (piModel == PI_MODEL_ODROIDC2)	{
+        if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END)
+		return	C2_GPIOX_PUPD_REG_OFFSET;
+        if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END)
+		return  C2_GPIOY_PUPD_REG_OFFSET;
+    }
+    else    {
+        if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END)
+		return  GPIOX_PUPD_REG_OFFSET;
+        if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END)
+		return  GPIOY_PUPD_REG_OFFSET;
+    }
+
+    return  -1;
+}
+
+//
+// offset to the GPIO bit
+//
+static int  gpioToShiftReg (int pin)
+{
+    if(piModel == PI_MODEL_ODROIDXU_34) {
+        switch(pin) {
+            case    GPIO_X1_START...GPIO_X1_END:
+                return  (pin - GPIO_X1_START);
+            case    GPIO_X2_START...GPIO_X2_END:
+                return  (pin - GPIO_X2_START);
+            case    GPIO_X3_START...GPIO_X3_END:
+                return  (pin - GPIO_X3_START);
+            case    GPIO_A0_START...GPIO_A0_END:
+                return  (pin - GPIO_A0_START);
+            case    GPIO_A2_START...GPIO_A2_END:
+                return  (pin - GPIO_A2_START);
+            case    GPIO_B3_START...GPIO_B3_END:
+                return  (pin - GPIO_B3_START);
+            default:
+                break;
+        }
+    }
+    else if (piModel == PI_MODEL_ODROIDC2)	{
+        if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END)
+		return  pin - C2_GPIOX_PIN_START;
+        if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END)
+		return  pin - C2_GPIOY_PIN_START;
+    }
+    else    {
+        if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END)
+		return  pin - GPIOX_PIN_START;
+        if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END)
+		return  pin - GPIOY_PIN_START;
+    }
+
+    return  -1;
+}
+
+//
+// offset to the GPIO Function register
+//
+static int  gpioToGPFSELReg (int pin)
+{
+    if(piModel == PI_MODEL_ODROIDXU_34) {
+        switch(pin) {
+            case    GPIO_X1_START...GPIO_X1_END:
+                return  (GPIO_X1_CON_OFFSET >> 2);
+            case    GPIO_X2_START...GPIO_X2_END:
+                return  (GPIO_X2_CON_OFFSET >> 2);
+            case    GPIO_X3_START...GPIO_X3_END:
+                return  (GPIO_X3_CON_OFFSET >> 2);
+            case    GPIO_A0_START...GPIO_A0_END:
+                return  (GPIO_A0_CON_OFFSET >> 2);
+            case    GPIO_A2_START...GPIO_A2_END:
+                return  (GPIO_A2_CON_OFFSET >> 2);
+            case    GPIO_B3_START...GPIO_B3_END:
+                return  (GPIO_B3_CON_OFFSET >> 2);
+            default:
+                break;
+        }
+    }
+    else if (piModel == PI_MODEL_ODROIDC2)	{
+        if(pin >= C2_GPIOX_PIN_START && pin <= C2_GPIOX_PIN_END)
+		return  C2_GPIOX_FSEL_REG_OFFSET;
+        if(pin >= C2_GPIOY_PIN_START && pin <= C2_GPIOY_PIN_END)
+		return  C2_GPIOY_FSEL_REG_OFFSET;
+    }
+    else    {
+        if(pin >= GPIOX_PIN_START && pin <= GPIOX_PIN_END)
+		return  GPIOX_FSEL_REG_OFFSET;
+        if(pin >= GPIOY_PIN_START && pin <= GPIOY_PIN_END)
+		return  GPIOY_FSEL_REG_OFFSET;
+    }
+
+    return  -1;
+}
+
+//
+// pinToGpio:
+//	Take a Wiring pin (0 through X) and re-map it to the ODROID_GPIO pin
+//
+static int pinToGpioOdroidC [64] = {
+    88,  87, 116, 115, 104, 102, 103,  83, // 0..7
+    -1,  -1, 117, 118, 107, 106, 105,  -1, // 8..16
+    -1,  -1,  -1,  -1,  -1, 101, 100, 108, // 16..23
+    97,  -1,  99,  98,  -1,  -1,  -1,  -1, // 24..31
+// Padding:
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 47
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 63
+};
+
+//
+// physToGpio:
+//	Take a physical pin (1 through 40) and re-map it to the ODROID_GPIO pin
+//
+static int physToGpioOdroidC [64] =
+{
+  -1,       // 0
+  -1,  -1,	// 1, 2
+  -1,  -1,
+  -1,  -1,
+  83,  -1,
+  -1,  -1,
+  88,  87,
+ 116,  -1,
+ 115, 104,
+  -1, 102,
+ 107,  -1,
+ 106, 103,
+ 105, 117,
+  -1, 118,	// 25, 26
+
+  -1,  -1,
+ 101,  -1,
+ 100,  99,
+ 108,  -1,
+  97,  98,
+  -1,  -1,
+  -1,  -1, // 39, 40
+
+// Not used
+  -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1,
+} ;
+
+//
+// pinToGpio:
+//	Take a Wiring pin (0 through X) and re-map it to the ODROIDC2_GPIO pin
+//
+static int pinToGpioOdroidC2_Rev1_1 [64] = {
+   247, 238, 239, 237, 236, 233, 231, 249, // 0..7
+    -1,  -1, 229, 225, 235, 232, 230,  -1, // 8..15
+    -1,  -1,  -1,  -1,  -1, 228, 219, 234, // 16..23
+   214,  -1, 224, 218,  -1,  -1,  -1,  -1, // 24..31
+// Padding:
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 47
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 63
+};
+
+
+static int pinToGpioOdroidC2_Rev1_0 [64] = {
+   219, 218, 247,  -1, 235, 233, 234, 214, // 0..7
+    -1,  -1, 248, 249, 238, 237, 236,  -1, // 8..15
+    -1,  -1,  -1,  -1,  -1, 232, 231, 239, // 16..23
+   228,  -1, 230, 229,  -1,  -1,  -1,  -1, // 24..31
+// Padding:
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 47
+  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// ... 63
+};
+
+//
+// physToGpio:
+//	Take a physical pin (1 through 40) and re-map it to the ODROIDC2_GPIO pin
+//
+static int physToGpioOdroidC2_Rev1_1 [64] =
+{
+  -1,       // 0
+  -1,  -1,	// 1, 2
+  -1,  -1,
+  -1,  -1,
+ 249,  -1,
+  -1,  -1,
+ 247, 238,
+ 239,  -1,
+ 237, 236,
+  -1, 233,
+ 235,  -1,
+ 232, 231,
+ 230, 229,
+  -1, 225,	// 25, 26
+
+  -1,  -1,
+ 228,  -1,
+ 219, 224,
+ 234,  -1,
+ 214, 218,
+  -1,  -1,
+  -1,  -1, // 39, 40
+
+// Not used
+  -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1,
+} ;
+
+
+static int physToGpioOdroidC2_Rev1_0 [64] =
+{
+  -1,       // 0
+  -1,  -1,	// 1, 2
+  -1,  -1,
+  -1,  -1,
+ 214,  -1,
+  -1,  -1,
+ 219, 218,
+ 247,  -1,
+  -1, 235,
+  -1, 233,
+ 238,  -1,
+ 237, 234,
+ 236, 248,
+  -1, 249,	// 25, 26
+
+  -1,  -1,
+ 232,  -1,
+ 231, 230,
+ 239,  -1,
+ 228, 229,
+  -1,  -1,
+  -1,  -1, // 39, 40
+
+// Not used
+  -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1, -1, -1,
+  -1, -1, -1, -1, -1, -1,
+} ;
+
+//
+// pinToGpio:
+//	Take a Wiring pin (0 through X) and re-map it to the ODROIDXU_GPIO pin
+//
+static int pinToGpioOdroidXU [64] = {
+   174, 173,    //  0 |  1 : GPA0.3(UART_0.CTSN), GPA0.2(UART_0.RTSN)
+    21,  22,    //  2 |  3 : GPX1.5, GPX1.6
+    19,  23,    //  4 |  5 : GPX1.3, GPX1.7
+    24,  18,    //  6 |  7 : GPX2.0, GPX1.2
+
+   209, 210,    //  8 |  9 : GPB3.2(I2C_1.SDA), GPB3.3(I2C_1.SCL)
+   190,  25,    // 10 | 11 : GPA2.5(SPI_1.CSN), GPX2.1
+   192, 191,    // 12 | 13 : GPA2.7(SPI_1.MOSI), GPA2.6(SPI_1.MISO)
+   189, 172,    // 14 | 15 : GPA2.4(SPI_1.SCLK), GPA0.1(UART_0.TXD)
+   171,  -1,    // 16 | 17 : GPA0.0(UART_0.RXD),
+    -1,  -1,    // 18 | 19
+    -1,  28,    // 20 | 21 :  , GPX2.4
+    30,  31,    // 22 | 23 : GPX2.6, GPX2.7
+    -1,  -1,    // 24 | 25   PWR_ON(INPUT), ADC_0.AIN0
+    29,  33,    // 26 | 27 : GPX2.5, GPX3.1
+    -1,  -1,    // 28 | 29 : REF1.8V OUT, ADC_0.AIN3
+   187, 188,    // 30 | 31 : GPA2.2(I2C_5.SDA), GPA2.3(I2C_5.SCL)
+
+    // Padding:
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// 32...47
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,	// 48...63
+};
+
+//
+// physToGpio:
+//	Take a physical pin (1 through 40) and re-map it to the ODROIDXU_GPIO pin
+//
+static int physToGpioOdroidXU [64] =
+{
+    -1,         //  0
+    -1,  -1,	//  1 |  2 : 3.3V, 5.0V
+   209,  -1,    //  3 |  4 : GPB3.2(I2C_1.SDA), 5.0V
+   210,  -1,    //  5 |  6 : GPB3.3(I2C_1.SCL), GND
+    18, 172,    //  7 |  8 : GPX1.2, GPA0.1(UART_0.TXD)
+    -1, 171,    //  9 | 10 : GND, GPA0.0(UART_0.RXD)
+   174, 173,    // 11 | 12 : GPA0.3(UART_0.CTSN), GPA0.2(UART_0.RTSN)
+    21,  -1,    // 13 | 14 : GPX1.5, GND
+    22,  19,    // 15 | 16 : GPX1.6, GPX1.3
+    -1,  23,    // 17 | 18 : 3.3V, GPX1.7
+   192,  -1,    // 19 | 20 : GPA2.7(SPI_1.MOSI), GND
+   191,  24,    // 21 | 22 : GPA2.6(SPI_1.MISO), GPX2.0
+   189, 190,    // 23 | 24 : GPA2.4(SPI_1.SCLK), GPA2.5(SPI_1.CSN)
+    -1,  25,    // 25 | 26 : GND, GPX2.1
+   187, 188,    // 27 | 28 : GPA2.2(I2C_5.SDA), GPA2.4(I2C_5.SCL)
+    28,  -1,    // 29 | 30 : GPX2.4, GND
+    30,  29,    // 31 | 32 : GPX2.6, GPX2.5
+    31,  -1,    // 33 | 34 : GPX2.7, GND
+    -1,  33,    // 35 | 36 : PWR_ON(INPUT), GPX3.1
+    -1,  -1,    // 37 | 38 : ADC_0.AIN0, 1.8V REF OUT
+    -1,  -1,    // 39 | 40 : GND, AADC_0.AIN3
+
+    // Not used
+    -1, -1, -1, -1, -1, -1, -1, -1, // 41...48
+    -1, -1, -1, -1, -1, -1, -1, -1, // 49...56
+    -1, -1, -1, -1, -1, -1, -1      // 57...63
+} ;
+
+
+/*
+ * Functions
+ *********************************************************************************
+ */
+
+
+/*
+ * wiringPiFailure:
+ *	Fail. Or not.
+ *********************************************************************************
+ */
+
+int wiringPiFailure (int fatal, const char *message, ...)
+{
+  va_list argp ;
+  char buffer [1024] ;
+
+  if (!fatal && wiringPiReturnCodes)
+    return -1 ;
+
+  va_start (argp, message) ;
+    vsnprintf (buffer, 1023, message, argp) ;
+  va_end (argp) ;
+
+  fprintf (stderr, "%s", buffer) ;
+  exit (EXIT_FAILURE) ;
+
+  return 0 ;
+}
+
+const char wpi_mode_str[4][20] = {
+	"WPI_MODE_PINS",
+	"WPI_MODE_GPIO",
+	"WPI_MODE_GPIO_SYS",
+	"WPI_MODE_PHYS",
+};
+
+void wiringPiGpioCheck (const char *call_func, int origPin, int pin)
+{
+    if (wiringPiMode == WPI_MODE_PINS || wiringPiMode == WPI_MODE_PHYS)
+    {
+	// maybe pin is not gpio.
+	if ( pin < 0 ) {
+		(void)wiringPiFailure (WPI_FATAL,
+			"\n**************** %s ****************\n"	\
+			"\nCall Function = %s, wiringPiMode = %s\n"	\
+			"\nError gpio control (OrigPin = %d, pin = %d)\n\n",
+			__func__, call_func, wpi_mode_str[wiringPiMode],
+			origPin, pin);
+	}
+    }
+    else {
+	int i;
+	for(i = 0; i < 64; i++)	{
+		if (origPin == pinToGpio[i])	break;
+	}
+	if (i == 64) {
+		(void)wiringPiFailure (WPI_FATAL,
+			"\n**************** %s ****************\n"	\
+			"\nCall Function = %s, wiringPiMode = %s\n"	\
+			"\nCannot found gpio pin! (OrigPin = %d)\n\n",
+			__func__, call_func, wpi_mode_str[wiringPiMode],
+			origPin);
+	}
+    }
+}
+
+/*
+ * piBoardRev:
+ *	Return a number representing the hardware revision of the board.
+ *
+ *	Revision 1 really means the early Model B's.
+ *	Revision 2 is everything else - it covers the B, B+ and CM.
+ *
+ *	Seems there are some boards with 0000 in them (mistake in manufacture)
+ *	So the distinction between boards that I can see is:
+ *	0000 - Error
+ *	0001 - Not used 
+ *	0002 - Model B,  Rev 1,   256MB, Egoman
+ *	0003 - Model B,  Rev 1.1, 256MB, Egoman, Fuses/D14 removed.
+ *	0004 - Model B,  Rev 2,   256MB, Sony
+ *	0005 - Model B,  Rev 2,   256MB, Qisda
+ *	0006 - Model B,  Rev 2,   256MB, Egoman
+ *	0007 - Model A,  Rev 2,   256MB, Egoman
+ *	0008 - Model A,  Rev 2,   256MB, Sony
+ *	0009 - Model A,  Rev 2,   256MB, Qisda
+ *	000d - Model B,  Rev 2,   512MB, Egoman
+ *	000e - Model B,  Rev 2,   512MB, Sony
+ *	000f - Model B,  Rev 2,   512MB, Qisda
+ *	0010 - Model B+, Rev 1.2, 512MB, Sony
+ *	0011 - Pi CM,    Rev 1.2, 512MB, Sony
+ *	0012 - Model A+  Rev 1.2, 256MB, Sony
+ *
+ *  added :
+ *  000a - Model ODROID C1/C1+, Rev 1.0, 1024M, Hardkernel
+ *  added :
+ *  0100 - Model ODROID XU3/4, Rev 1.0, 2048M, Hardkernel
+ *  added :
+ *  02xx - Model ODROID C2, 2048M, Hardkernel
+ *         Rev 1.0 : /sys/class/odroid/boardrev value is 0 (Dev board)
+ *         Rev 1.1 : /sys/class/odroid/boardrev value is 1 (Mass board)
+ *
+ *	A small thorn is the olde style overvolting - that will add in
+ *		1000000
+ *
+ *	The Pi compute module has an revision of 0011 - since we only check the
+ *	last digit, then it's 1, therefore it'll default to not 2 or 3 for a
+ *	Rev 1, so will appear as a Rev 2. This is fine for the most part, but
+ *	we'll properly detect the Compute Module later and adjust accordingly.
+ *
+ *********************************************************************************
+ */
+
+static void piBoardRevOops (const char *why)
+{
+  fprintf (stderr, "piBoardRev: Unable to determine board revision from /proc/cpuinfo\n") ;
+  fprintf (stderr, " -> %s\n", why) ;
+  fprintf (stderr, " ->  You may want to check:\n") ;
+  fprintf (stderr, " ->  http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ;
+  exit (EXIT_FAILURE) ;
+}
+
+int piBoardRev (void)
+{
+  FILE *cpuFd ;
+  char line [120] ;
+  char *c ;
+  static int  boardRev = -1 ;
+
+  if (boardRev != -1)	// No point checking twice
+    return boardRev ;
+
+  if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
+    piBoardRevOops ("Unable to open /proc/cpuinfo") ;
+
+  while (fgets (line, 120, cpuFd) != NULL)
+    if (strncmp (line, "Revision", 8) == 0)
+      break ;
+
+  fclose (cpuFd) ;
+
+  if (strncmp (line, "Revision", 8) != 0)
+    piBoardRevOops ("No \"Revision\" line") ;
+
+// Chomp trailing CR/NL
+
+  for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
+    *c = 0 ;
+  
+  if (wiringPiDebug)
+    printf ("piboardRev: Revision string: %s\n", line) ;
+
+// Scan to first digit
+
+  for (c = line ; *c ; ++c)
+    if (isdigit (*c))
+      break ;
+
+  if (!isdigit (*c))
+    piBoardRevOops ("No numeric revision string") ;
+
+// Make sure its long enough
+
+  if (strlen (c) < 4)
+    piBoardRevOops ("Bogus \"Revision\" line (too small)") ;
+  
+// If you have overvolted the Pi, then it appears that the revision
+//	has 100000 added to it!
+// The actual condition for it being set is:
+//	 (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0
+
+  if (wiringPiDebug)
+    if (strlen (c) != 4)
+      printf ("piboardRev: This Pi has/is (force_turbo || current_limit_override || temp_limit>85) && over_voltage>0\n") ;
+
+// Isolate  last 4 characters:
+
+  c = c + strlen (c) - 4 ;
+
+  if (wiringPiDebug)
+    printf ("piboardRev: last4Chars are: \"%s\"\n", c) ;
+
+  if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0) ||
+       (strcmp (c, "000a") == 0) || (strcmp (c, "0100") == 0) )
+    boardRev = 1;
+  else
+    boardRev = 2;
+
+  if (strncmp (c, "02", 2) == 0) {
+	int fd = 0;
+	char buf[2];
+
+	if ((fd = open ("/sys/class/odroid/boardrev", O_RDONLY)) < 0) {
+		printf ("ERROR : file not found.(boardrev)\n");
+		boardRev = 1;
+	}
+	else {
+		read (fd, buf, sizeof(buf));
+		close(fd);
+		boardRev = atoi(buf) + 1;
+	}
+  }
+
+  if (wiringPiDebug)
+    printf ("piBoardRev: Returning revision: %d\n", boardRev) ;
+
+  return boardRev ;
+}
+
+
+/*
+ * piBoardId:
+ *	Do more digging into the board revision string as above, but return
+ *	as much details as we can.
+ *	This is undocumented and really only intended for the GPIO command.
+ *	Use at your own risk!
+ *********************************************************************************
+ */
+
+void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted)
+{
+  FILE *cpuFd ;
+  char line [120] ;
+  char *c ;
+
+  (void)piBoardRev () ;	// Call this first to make sure all's OK. Don't care about the result.
+
+  if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL)
+    piBoardRevOops ("Unable to open /proc/cpuinfo") ;
+
+  while (fgets (line, 120, cpuFd) != NULL)
+    if (strncmp (line, "Revision", 8) == 0)
+      break ;
+
+  fclose (cpuFd) ;
+
+  if (strncmp (line, "Revision", 8) != 0)
+    piBoardRevOops ("No \"Revision\" line") ;
+
+// Chomp trailing CR/NL
+
+  for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c)
+    *c = 0 ;
+  
+  if (wiringPiDebug)
+    printf ("piboardId: Revision string: %s\n", line) ;
+
+// Scan to first digit
+
+  for (c = line ; *c ; ++c)
+    if (isdigit (*c))
+      break ;
+
+// Make sure its long enough
+
+  if (strlen (c) < 4)
+    piBoardRevOops ("Bogus \"Revision\" line") ;
+
+// If longer than 4, we'll assume it's been overvolted
+
+  *overVolted = strlen (c) > 4 ;
+  
+// Extract last 4 characters:
+
+  c = c + strlen (c) - 4 ;
+
+// Fill out the replys as appropriate
+
+  /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_1   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
+  else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
+  else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_SONY   ; }
+  else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_QISDA  ; }
+  else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
+  else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
+  else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; }
+  else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_QISDA  ; }
+  else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
+  else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
+  else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
+  else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
+  else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
+  else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_2 ; *mem = 256 ; *maker = PI_MAKER_SONY   ; }
+  else if (strcmp (c, "000a") == 0) {
+    *model = PI_MODEL_ODROIDC;  *rev = PI_VERSION_1;  *mem = 1024;  *maker = PI_MAKER_HARDKERNEL;
+  }
+  else if (strcmp (c, "0100") == 0) {
+    *model = PI_MODEL_ODROIDXU_34;  *rev = PI_VERSION_1;  *mem = 2048;  *maker = PI_MAKER_HARDKERNEL;
+  }
+  else if (strncmp (c, "02", 2) == 0)	{
+    *model = PI_MODEL_ODROIDC2; *mem = 2048;  *maker = PI_MAKER_HARDKERNEL;
+    *rev = piBoardRev ();
+  }
+  else  {
+    *model = 0; *rev = 0; *mem = 0; *maker = 0 ;
+  }
+  piModel = *model;
+}
+
+
+/*
+ * wpiPinToGpio:
+ *	Translate a wiringPi Pin number to native GPIO pin number.
+ *	Provided for external support.
+ *********************************************************************************
+ */
+
+int wpiPinToGpio (int wpiPin)
+{
+  return pinToGpio [wpiPin & 63] ;
+}
+
+
+/*
+ * physPinToGpio:
+ *	Translate a physical Pin number to native GPIO pin number.
+ *	Provided for external support.
+ *********************************************************************************
+ */
+
+int physPinToGpio (int physPin)
+{
+  return physToGpio [physPin & 63] ;
+}
+
+
+/*
+ * setPadDrive:
+ *	Set the PAD driver value
+ *********************************************************************************
+ */
+
+void setPadDrive (int group, int value)
+{
+  uint32_t wrVal ;
+
+  if ( 	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
+  {
+    if ((group < 0) || (group > 2))
+      return ;
+
+    wrVal = BCM_PASSWORD | 0x18 | (value & 7) ;
+    *(pads + group + 11) = wrVal ;
+
+    if (wiringPiDebug)
+    {
+      printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ;
+      printf ("Read : %08X\n", *(pads + group + 11)) ;
+    }
+  }
+}
+
+
+/*
+ * getAlt:
+ *	Returns the ALT bits for a given port. Only really of-use
+ *	for the gpio readall command (I think)
+ *********************************************************************************
+ */
+
+int getAlt (int pin)
+{
+  int fSel, shift, alt ;
+
+  if     ( piModel == PI_MODEL_ODROIDC )
+    pin &= 0x7F;
+  else if( piModel == PI_MODEL_ODROIDXU_34 || piModel == PI_MODEL_ODROIDC2 )
+    pin &= 0xFF;
+  else
+    pin &= 63 ;
+
+  /**/ if (wiringPiMode == WPI_MODE_PINS)
+    pin = pinToGpio [pin] ;
+  else if (wiringPiMode == WPI_MODE_PHYS)
+    pin = physToGpio [pin] ;
+  else if (wiringPiMode != WPI_MODE_GPIO)
+    return 0 ;
+
+  if     ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 )  {
+
+    if(pin < 0)   return  2;  // ALT
+
+    return    (*(gpio + gpioToGPFSELReg(pin)) & (1 << gpioToShiftReg(pin))) ? 0 : 1;
+  }
+  else if ( piModel == PI_MODEL_ODROIDXU_34 )   {
+
+    if(pin < 0)   return  2;  // ALT
+
+    shift = (gpioToShiftReg(pin) * 4);
+
+    if(pin < 100)   // GPX0,1,2,3
+        fSel = (*(gpio  + gpioToGPFSELReg(pin)) & (0xF << shift));
+    else            // GPA0,1,2, GPB0,1,2,3,4
+        fSel = (*(gpio1 + gpioToGPFSELReg(pin)) & (0xF << shift));
+
+    if(fSel & (0xE << shift))   return  2;
+
+    return  (fSel & (0x1 << shift)) ?   1 : 0;
+  }
+  else  {
+    fSel    = gpioToGPFSEL [pin] ;
+    shift   = gpioToShift  [pin] ;
+
+    alt = (*(gpio + fSel) >> shift) & 7 ;
+
+    return alt ;
+  }
+}
+
+
+/*
+ * pwmSetMode:
+ *	Select the native "balanced" mode, or standard mark:space mode
+ *********************************************************************************
+ */
+
+void pwmSetMode (int mode)
+{
+  if ( 	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
+  {
+    if (mode == PWM_MODE_MS)
+      *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ;
+    else
+      *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ;
+  }
+}
+
+
+/*
+ * pwmSetRange:
+ *	Set the PWM range register. We set both range registers to the same
+ *	value. If you want different in your own code, then write your own.
+ *********************************************************************************
+ */
+
+void pwmSetRange (unsigned int range)
+{
+  if ( 	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
+  {
+    *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ;
+    *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ;
+  }
+}
+
+
+/*
+ * pwmSetClock:
+ *	Set/Change the PWM clock. Originally my code, but changed
+ *	(for the better!) by Chris Hall, <chris@kchall.plus.com>
+ *	after further study of the manual and testing with a 'scope
+ *********************************************************************************
+ */
+
+void pwmSetClock (int divisor)
+{
+  uint32_t pwm_control ;
+  divisor &= 4095 ;
+
+  if ( 	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO))
+  {
+    if (wiringPiDebug)
+      printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV));
+
+    pwm_control = *(pwm + PWM_CONTROL) ;		// preserve PWM_CONTROL
+
+// We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY
+// stays high.
+
+    *(pwm + PWM_CONTROL) = 0 ;				// Stop PWM
+
+// Stop PWM clock before changing divisor. The delay after this does need to
+// this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY
+// flag is not working properly in balanced mode. Without the delay when DIV is
+// adjusted the clock sometimes switches to very slow, once slow further DIV
+// adjustments do nothing and it's difficult to get out of this mode.
+
+    *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ;	// Stop PWM Clock
+      delayMicroseconds (110) ;			// prevents clock going sloooow
+
+    while ((*(clk + PWMCLK_CNTL) & 0x80) != 0)	// Wait for clock to be !BUSY
+      delayMicroseconds (1) ;
+
+    *(clk + PWMCLK_DIV)  = BCM_PASSWORD | (divisor << 12) ;
+
+    *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ;	// Start PWM clock
+    *(pwm + PWM_CONTROL) = pwm_control ;		// restore PWM_CONTROL
+
+    if (wiringPiDebug)
+      printf ("Set     to: %d. Now    : 0x%08X\n", divisor, *(clk + PWMCLK_DIV));
+  }
+}
+
+
+/*
+ * gpioClockSet:
+ *	Set the freuency on a GPIO clock pin
+ *********************************************************************************
+ */
+
+void gpioClockSet (int pin, int freq)
+{
+  int divi, divr, divf ;
+
+  if ( 	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  pin &= 63 ;
+
+  /**/ if (wiringPiMode == WPI_MODE_PINS)
+    pin = pinToGpio [pin] ;
+  else if (wiringPiMode == WPI_MODE_PHYS)
+    pin = physToGpio [pin] ;
+  else if (wiringPiMode != WPI_MODE_GPIO)
+    return ;
+  
+  divi = 19200000 / freq ;
+  divr = 19200000 % freq ;
+  divf = (int)((double)divr * 4096.0 / 19200000.0) ;
+
+  if (divi > 4095)
+    divi = 4095 ;
+
+  *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ;		// Stop GPIO Clock
+  while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0)				// ... and wait
+    ;
+
+  *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ;		// Set dividers
+  *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ;	// Start Clock
+}
+
+
+/*
+ * wiringPiFindNode:
+ *      Locate our device node
+ *********************************************************************************
+ */
+
+struct wiringPiNodeStruct *wiringPiFindNode (int pin)
+{
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+
+  while (node != NULL)
+    if ((pin >= node->pinBase) && (pin <= node->pinMax))
+      return node ;
+    else
+      node = node->next ;
+
+  return NULL ;
+}
+
+
+/*
+ * wiringPiNewNode:
+ *	Create a new GPIO node into the wiringPi handling system
+ *********************************************************************************
+ */
+
+static void pinModeDummy             (struct wiringPiNodeStruct *node, int pin, int mode)  { return ; }
+static void pullUpDnControlDummy     (struct wiringPiNodeStruct *node, int pin, int pud)   { return ; }
+static int  digitalReadDummy         (struct wiringPiNodeStruct *node, int pin)            { return LOW ; }
+static void digitalWriteDummy        (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
+static void pwmWriteDummy            (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
+static int  analogReadDummy          (struct wiringPiNodeStruct *node, int pin)            { return 0 ; }
+static void analogWriteDummy         (struct wiringPiNodeStruct *node, int pin, int value) { return ; }
+
+struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins)
+{
+  int    pin ;
+  struct wiringPiNodeStruct *node ;
+
+  if      ( piModel == PI_MODEL_ODROIDC )  {
+    // Minimum pin base is 128
+    if (pinBase < 128)
+        (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 128\n", pinBase) ;
+  }
+  else if ( piModel == PI_MODEL_ODROIDXU_34 || piModel == PI_MODEL_ODROIDC2 )   {
+    // Minimum pin base is 256
+    if (pinBase < 256)
+        (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 256\n", pinBase) ;
+  }
+  else  {
+    // Minimum pin base is 64
+    if (pinBase < 64)
+        (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ;
+  }
+
+// Check all pins in-case there is overlap:
+  for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin)
+    if (wiringPiFindNode (pin) != NULL)
+      (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ;
+
+  node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ;	// calloc zeros
+  if (node == NULL)
+    (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ;
+
+  node->pinBase         = pinBase ;
+  node->pinMax          = pinBase + numPins - 1 ;
+  node->pinMode         = pinModeDummy ;
+  node->pullUpDnControl = pullUpDnControlDummy ;
+  node->digitalRead     = digitalReadDummy ;
+  node->digitalWrite    = digitalWriteDummy ;
+  node->pwmWrite        = pwmWriteDummy ;
+  node->analogRead      = analogReadDummy ;
+  node->analogWrite     = analogWriteDummy ;
+  node->next            = wiringPiNodes ;
+  wiringPiNodes         = node ;
+
+  return node ;
+}
+
+
+#ifdef notYetReady
+/*
+ * pinED01:
+ * pinED10:
+ *	Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0
+ *	Pin must already be in input mode with appropriate pull up/downs set.
+ *********************************************************************************
+ */
+
+void pinEnableED01Pi (int pin)
+{
+  pin = pinToGpio [pin & 63] ;
+}
+#endif
+
+
+/*
+ *********************************************************************************
+ * Core Functions
+ *********************************************************************************
+ */
+
+/*
+ * pinModeAlt:
+ *	This is an un-documented special to let you set any pin to any mode
+ *********************************************************************************
+ */
+
+void pinModeAlt (int pin, int mode)
+{
+  int fSel, shift ;
+
+  if (	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  if ((pin & PI_GPIO_MASK) == 0)		// On-board pin
+  {
+    /**/ if (wiringPiMode == WPI_MODE_PINS)
+      pin = pinToGpio [pin] ;
+    else if (wiringPiMode == WPI_MODE_PHYS)
+      pin = physToGpio [pin] ;
+    else if (wiringPiMode != WPI_MODE_GPIO)
+      return ;
+
+    fSel  = gpioToGPFSEL [pin] ;
+    shift = gpioToShift  [pin] ;
+
+    *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ;
+  }
+}
+
+
+/*
+ * pinMode:
+ *	Sets the mode of a pin to be input, output or PWM output
+ *********************************************************************************
+ */
+
+void pinMode (int pin, int mode)
+{
+  int    fSel, shift, alt ;
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+  int origPin = pin ;
+  unsigned int  gpio_mask = PI_GPIO_MASK;
+
+  if ( piModel == PI_MODEL_ODROIDC  )      gpio_mask = ODROIDC_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDC2 )      gpio_mask = ODROIDC2_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDXU_34 )   gpio_mask = ODROIDXU_GPIO_MASK;
+
+  if ((pin & gpio_mask) == 0)		// On-board pin
+  {
+    /**/ if (wiringPiMode == WPI_MODE_PINS)
+      pin = pinToGpio [pin] ;
+    else if (wiringPiMode == WPI_MODE_PHYS)
+      pin = physToGpio [pin] ;
+    else if (wiringPiMode != WPI_MODE_GPIO)
+      return ;
+
+    wiringPiGpioCheck (__func__, origPin, pin);
+
+    softPwmStop  (origPin) ;
+    softToneStop (origPin) ;
+
+    fSel    = gpioToGPFSEL [pin] ;
+    shift   = gpioToShift  [pin] ;
+
+    if (mode == INPUT) {
+      if      ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 )
+        *(gpio + gpioToGPFSELReg(pin)) = (*(gpio + gpioToGPFSELReg(pin)) |  (1 << gpioToShiftReg(pin)));
+      else if ( piModel == PI_MODEL_ODROIDXU_34 )   {
+        shift = (gpioToShiftReg(pin) * 4);
+        if(pin < 100)
+            *(gpio  + gpioToGPFSELReg(pin)) &= ~(0xF << shift);
+        else
+            *(gpio1 + gpioToGPFSELReg(pin)) &= ~(0xF << shift);
+      }
+      else
+        *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)); // Sets bits to zero = input
+    }
+    else if (mode == OUTPUT)  {
+      if      ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 )
+        *(gpio + gpioToGPFSELReg(pin)) = (*(gpio + gpioToGPFSELReg(pin)) & ~(1 << gpioToShiftReg(pin)));
+      else if ( piModel == PI_MODEL_ODROIDXU_34 )   {
+        shift = (gpioToShiftReg(pin) * 4);
+        if(pin < 100)   {
+            *(gpio  + gpioToGPFSELReg(pin)) &= ~(0xF << shift);
+            *(gpio  + gpioToGPFSELReg(pin)) |=  (0x1 << shift);
+        }
+        else    {
+            *(gpio1 + gpioToGPFSELReg(pin)) &= ~(0xF << shift);
+            *(gpio1 + gpioToGPFSELReg(pin)) |=  (0x1 << shift);
+        }
+      }
+      else
+        *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift);
+    }
+    else if (mode == SOFT_PWM_OUTPUT) {
+      if (piModel == PI_MODEL_ODROIDC  ||
+	  piModel == PI_MODEL_ODROIDC2 ||
+	  piModel == PI_MODEL_ODROIDXU_34 )
+            softPwmCreate (pin,     0, 100);
+      else
+            softPwmCreate (origPin, 0, 100);
+    }
+    else if (mode == SOFT_TONE_OUTPUT)  {
+      if (piModel == PI_MODEL_ODROIDC  ||
+	  piModel == PI_MODEL_ODROIDC2 ||
+	  piModel == PI_MODEL_ODROIDXU_34 )
+            softToneCreate (pin);
+      else
+            softToneCreate (origPin);
+    }
+    else if (mode == PWM_TONE_OUTPUT)
+    {
+      if (piModel == PI_MODEL_ODROIDC  ||
+	  piModel == PI_MODEL_ODROIDC2 ||
+	  piModel == PI_MODEL_ODROIDXU_34 )
+        return;
+
+      pinMode (origPin, PWM_OUTPUT) ;	// Call myself to enable PWM mode
+      pwmSetMode (PWM_MODE_MS) ;
+    }
+    else if (mode == PWM_OUTPUT)
+    {
+      if (piModel == PI_MODEL_ODROIDC  ||
+	  piModel == PI_MODEL_ODROIDC2 ||
+	  piModel == PI_MODEL_ODROIDXU_34 )
+        return;
+
+      if ((alt = gpioToPwmALT [pin]) == 0)	// Not a hardware capable PWM pin
+        return ;
+
+// Set pin to PWM mode
+
+      *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ;
+      delayMicroseconds (110) ;		// See comments in pwmSetClockWPi
+
+      pwmSetMode  (PWM_MODE_BAL) ;	// Pi default mode
+      pwmSetRange (1024) ;		// Default range of 1024
+      pwmSetClock (32) ;		// 19.2 / 32 = 600KHz - Also starts the PWM
+    }
+    else if (mode == GPIO_CLOCK)
+    {
+      if (piModel == PI_MODEL_ODROIDC  ||
+	  piModel == PI_MODEL_ODROIDC2 ||
+	  piModel == PI_MODEL_ODROIDXU_34 )
+        return;
+
+      if ((alt = gpioToGpClkALT0 [pin]) == 0)	// Not a GPIO_CLOCK pin
+        return ;
+
+// Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz
+
+      *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ;
+      delayMicroseconds (110) ;
+      gpioClockSet      (pin, 100000) ;
+    }
+  }
+  else
+  {
+    if ((node = wiringPiFindNode (pin)) != NULL)
+      node->pinMode (node, pin, mode) ;
+    return ;
+  }
+}
+
+
+/*
+ * pullUpDownCtrl:
+ *	Control the internal pull-up/down resistors on a GPIO pin
+ *	The Arduino only has pull-ups and these are enabled by writing 1
+ *	to a port when in input mode - this paradigm doesn't quite apply
+ *	here though.
+ *********************************************************************************
+ */
+
+void pullUpDnControl (int pin, int pud)
+{
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+  unsigned int  gpio_mask = PI_GPIO_MASK;
+  int origPin = pin;
+
+  if ( piModel == PI_MODEL_ODROIDC )        gpio_mask = ODROIDC_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDC2 )       gpio_mask = ODROIDC2_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDXU_34 )    gpio_mask = ODROIDXU_GPIO_MASK;
+
+  if ((pin & gpio_mask) == 0)		// On-Board Pin
+  {
+    /**/ if (wiringPiMode == WPI_MODE_PINS)
+      pin = pinToGpio [pin] ;
+    else if (wiringPiMode == WPI_MODE_PHYS)
+      pin = physToGpio [pin] ;
+    else if (wiringPiMode != WPI_MODE_GPIO)
+      return ;
+
+    wiringPiGpioCheck (__func__, origPin, pin);
+
+    if( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 ) {
+
+      if(pud) {
+        // Enable Pull/Pull-down resister
+        *(gpio + gpioToPUENReg(pin)) = (*(gpio + gpioToPUENReg(pin)) | (1 << gpioToShiftReg(pin)));
+
+        if(pud == PUD_UP)
+          *(gpio + gpioToPUPDReg(pin)) = (*(gpio + gpioToPUPDReg(pin)) |  (1 << gpioToShiftReg(pin)));
+        else
+          *(gpio + gpioToPUPDReg(pin)) = (*(gpio + gpioToPUPDReg(pin)) & ~(1 << gpioToShiftReg(pin)));
+      }
+      else    // Disable Pull/Pull-down resister
+        *(gpio + gpioToPUENReg(pin)) = (*(gpio + gpioToPUENReg(pin)) & ~(1 << gpioToShiftReg(pin)));
+    }
+    else if ( piModel == PI_MODEL_ODROIDXU_34)  {
+      int shift = 0;
+
+      shift = (gpioToShiftReg(pin) * 2);
+
+      if(pud) {
+        if(pin < 100)   {
+            *(gpio  + gpioToPUPDReg(pin)) &= ~(0x3 << shift);
+            if(pud == PUD_UP)
+                *(gpio  + gpioToPUPDReg(pin)) |= (0x3 << shift);
+            else
+                *(gpio  + gpioToPUPDReg(pin)) |= (0x1 << shift);
+        }
+        else    {
+            *(gpio1 + gpioToPUPDReg(pin)) &= ~(0x3 << shift);
+            if(pud == PUD_UP)
+                *(gpio1 + gpioToPUPDReg(pin)) |= (0x3 << shift);
+            else
+                *(gpio1 + gpioToPUPDReg(pin)) |= (0x1 << shift);
+        }
+      }
+      else  {
+        // Disable Pull/Pull-down resister
+        if(pin < 100)
+            *(gpio  + gpioToPUPDReg(pin)) &= ~(0x3 << shift);
+        else
+            *(gpio1 + gpioToPUPDReg(pin)) &= ~(0x3 << shift);
+      }
+    }
+    else  {
+      *(gpio + GPPUD)              = pud & 3;		delayMicroseconds (5) ;
+      *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31);	delayMicroseconds (5) ;
+
+      *(gpio + GPPUD)              = 0 ;		delayMicroseconds (5) ;
+      *(gpio + gpioToPUDCLK [pin]) = 0 ;		delayMicroseconds (5) ;
+    }
+  }
+  else  // Extension module
+  {
+    if ((node = wiringPiFindNode (pin)) != NULL)
+      node->pullUpDnControl (node, pin, pud) ;
+    return ;
+  }
+}
+
+
+/*
+ * digitalRead:
+ *	Read the value of a given Pin, returning HIGH or LOW
+ *********************************************************************************
+ */
+
+int digitalRead (int pin)
+{
+  char c ;
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+  unsigned int  gpio_mask = PI_GPIO_MASK;
+  int origPin = pin;
+
+  if ( piModel == PI_MODEL_ODROIDC )        gpio_mask = ODROIDC_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDC2 )       gpio_mask = ODROIDC2_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDXU_34 )    gpio_mask = ODROIDXU_GPIO_MASK;
+
+  if ((pin & gpio_mask) == 0)		// On-Board Pin
+  {
+    /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS)	// Sys mode
+    {
+      int   fd_pos = gpioToPin(pin);
+
+      if ( sysFds [fd_pos] == -1)
+        return LOW ;
+
+      lseek  (sysFds [fd_pos], 0L, SEEK_SET) ;
+      read   (sysFds [fd_pos], &c, 1) ;
+      return (c == '0') ? LOW : HIGH ;
+    }
+    else if (wiringPiMode == WPI_MODE_PINS)
+      pin = pinToGpio [pin] ;
+    else if (wiringPiMode == WPI_MODE_PHYS)
+      pin = physToGpio [pin] ;
+    else if (wiringPiMode != WPI_MODE_GPIO)
+      return LOW ;
+
+    wiringPiGpioCheck (__func__, origPin, pin);
+
+    if      ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 )  {
+      if ((*(gpio + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin))) != 0)
+        return HIGH ;
+      else
+        return LOW ;
+    }
+    else if ( piModel == PI_MODEL_ODROIDXU_34 ) {
+      if (pin < 100)
+        return  *(gpio  + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin)) ? HIGH : LOW;
+      else
+        return  *(gpio1 + gpioToGPLEVReg(pin)) & (1 << gpioToShiftReg(pin)) ? HIGH : LOW;
+    }
+    else  {
+      if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0)
+        return HIGH ;
+      else
+        return LOW ;
+    }
+  }
+  else
+  {
+    if ((node = wiringPiFindNode (pin)) == NULL)
+      return LOW ;
+    return node->digitalRead (node, pin) ;
+  }
+}
+
+
+/*
+ * digitalWrite:
+ *	Set an output bit
+ *********************************************************************************
+ */
+
+void digitalWrite (int pin, int value)
+{
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+  unsigned int  gpio_mask = PI_GPIO_MASK;
+  int origPin = pin;
+
+  if ( piModel == PI_MODEL_ODROIDC )        gpio_mask = ODROIDC_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDC2 )       gpio_mask = ODROIDC2_GPIO_MASK;
+  if ( piModel == PI_MODEL_ODROIDXU_34 )    gpio_mask = ODROIDXU_GPIO_MASK;
+
+  if ((pin & gpio_mask) == 0)		// On-Board Pin
+  {
+    /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS)	// Sys mode
+    {
+      int   fd_pos = gpioToPin(pin);
+
+      if (sysFds [fd_pos] != -1)
+      {
+        if (value == LOW)
+          write (sysFds [fd_pos], "0\n", 2) ;
+        else
+          write (sysFds [fd_pos], "1\n", 2) ;
+      }
+      return ;
+    }
+    else if (wiringPiMode == WPI_MODE_PINS)
+      pin = pinToGpio [pin] ;
+    else if (wiringPiMode == WPI_MODE_PHYS)
+      pin = physToGpio [pin] ;
+    else if (wiringPiMode != WPI_MODE_GPIO)
+      return ;
+
+    wiringPiGpioCheck (__func__, origPin, pin);
+
+    if      ( piModel == PI_MODEL_ODROIDC || piModel == PI_MODEL_ODROIDC2 )  {
+      if (value == LOW)
+        *(gpio + gpioToGPSETReg(pin)) &= ~(1 << gpioToShiftReg(pin));
+      else
+        *(gpio + gpioToGPSETReg(pin)) |=  (1 << gpioToShiftReg(pin));
+    }
+    else if ( piModel == PI_MODEL_ODROIDXU_34 ) {
+      if (pin < 100)    {
+        if (value == LOW)
+            *(gpio  + gpioToGPLEVReg(pin)) &= ~(1 << gpioToShiftReg(pin));
+        else
+            *(gpio  + gpioToGPLEVReg(pin)) |=  (1 << gpioToShiftReg(pin));
+      }
+      else  {
+        if (value == LOW)
+            *(gpio1 + gpioToGPLEVReg(pin)) &= ~(1 << gpioToShiftReg(pin));
+        else
+            *(gpio1 + gpioToGPLEVReg(pin)) |=  (1 << gpioToShiftReg(pin));
+      }
+    }
+  }
+  else
+  {
+    if ((node = wiringPiFindNode (pin)) != NULL)
+        node->digitalWrite (node, pin, value) ;
+  }
+}
+
+
+/*
+ * pwmWrite:
+ *	Set an output PWM value
+ *********************************************************************************
+ */
+
+void pwmWrite (int pin, int value)
+{
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+  unsigned int  gpio_mask = PI_GPIO_MASK;
+
+  if (	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  if ((pin & gpio_mask) == 0)		// On-Board Pin
+  {
+    /**/ if (wiringPiMode == WPI_MODE_PINS)
+      pin = pinToGpio [pin] ;
+    else if (wiringPiMode == WPI_MODE_PHYS)
+      pin = physToGpio [pin] ;
+    else if (wiringPiMode != WPI_MODE_GPIO)
+      return ;
+
+    *(pwm + gpioToPwmPort [pin]) = value ;
+  }
+  else
+  {
+    if ((node = wiringPiFindNode (pin)) != NULL)
+      node->pwmWrite (node, pin, value) ;
+  }
+}
+
+
+/*
+ * analogRead:
+ *	Read the analog value of a given Pin. 
+ *	There is no on-board Pi analog hardware,
+ *	so this needs to go to a new node.
+ *********************************************************************************
+ */
+
+int analogRead (int pin)
+{
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+  unsigned char value[5] = {0,};
+
+  if (  piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34 )  {
+    if(pin < 2)   {
+      if (adcFds [pin] == -1)
+        return 0;
+      lseek (adcFds [pin], 0L, SEEK_SET);
+      read  (adcFds [pin], &value[0], 4);
+      return  atoi(value);
+    }
+  }
+
+  if ((node = wiringPiFindNode (pin)) == NULL)
+    return 0 ;
+  else
+    return node->analogRead (node, pin) ;
+}
+
+
+/*
+ * analogWrite:
+ *	Write the analog value to the given Pin. 
+ *	There is no on-board Pi analog hardware,
+ *	so this needs to go to a new node.
+ *********************************************************************************
+ */
+
+void analogWrite (int pin, int value)
+{
+  struct wiringPiNodeStruct *node = wiringPiNodes ;
+
+  if ((node = wiringPiFindNode (pin)) == NULL)
+    return ;
+
+  node->analogWrite (node, pin, value) ;
+}
+
+
+/*
+ * pwmToneWrite:
+ *	Pi Specific.
+ *      Output the given frequency on the Pi's PWM pin
+ *********************************************************************************
+ */
+
+void pwmToneWrite (int pin, int freq)
+{
+  int range ;
+
+  if (	piModel == PI_MODEL_ODROIDC  ||
+	piModel == PI_MODEL_ODROIDC2 ||
+	piModel == PI_MODEL_ODROIDXU_34)  {
+	fprintf (stderr, "%s : Unsupport function on %s model\n",
+		__func__, piModelNames [piModel]);
+	exit (EXIT_FAILURE) ;
+  }
+
+  if (freq == 0)
+    pwmWrite (pin, 0) ;             // Off
+  else
+  {
+    range = 600000 / freq ;
+    pwmSetRange (range) ;
+    pwmWrite    (pin, freq / 2) ;
+  }
+}
+
+
+
+/*
+ * digitalWriteByte:
+ *	Pi Specific
+ *	Write an 8-bit byte to the first 8 GPIO pins - try to do it as
+ *	fast as possible.
+ *	However it still needs 2 operations to set the bits, so any external
+ *	hardware must not rely on seeing a change as there will be a change 
+ *	to set the outputs bits to zero, then another change to set the 1's
+ *********************************************************************************
+ */
+
+union	reg_bitfield {
+	unsigned int	wvalue;
+	struct {
+		unsigned int	bit0  : 1;
+		unsigned int	bit1  : 1;
+		unsigned int	bit2  : 1;
+		unsigned int	bit3  : 1;
+		unsigned int	bit4  : 1;
+		unsigned int	bit5  : 1;
+		unsigned int	bit6  : 1;
+		unsigned int	bit7  : 1;
+		unsigned int	bit8  : 1;
+		unsigned int	bit9  : 1;
+		unsigned int	bit10 : 1;
+		unsigned int	bit11 : 1;
+		unsigned int	bit12 : 1;
+		unsigned int	bit13 : 1;
+		unsigned int	bit14 : 1;
+		unsigned int	bit15 : 1;
+		unsigned int	bit16 : 1;
+		unsigned int	bit17 : 1;
+		unsigned int	bit18 : 1;
+		unsigned int	bit19 : 1;
+		unsigned int	bit20 : 1;
+		unsigned int	bit21 : 1;
+		unsigned int	bit22 : 1;
+		unsigned int	bit23 : 1;
+		unsigned int	bit24 : 1;
+		unsigned int	bit25 : 1;
+		unsigned int	bit26 : 1;
+		unsigned int	bit27 : 1;
+		unsigned int	bit28 : 1;
+		unsigned int	bit29 : 1;
+		unsigned int	bit30 : 1;
+		unsigned int	bit31 : 1;
+	} bits;
+};
+
+void digitalWriteByte_XU(int value)
+{
+	union	reg_bitfield	gpx1, gpx2, gpa0;
+
+	/* Read data register */
+	gpx1.wvalue = *(gpio  + (GPIO_X1_DAT_OFFSET >> 2));
+	gpx2.wvalue = *(gpio  + (GPIO_X2_DAT_OFFSET >> 2));
+	gpa0.wvalue = *(gpio1 + (GPIO_A0_DAT_OFFSET >> 2));
+
+	/* Wiring PI GPIO0 = XU3/4 GPA0.3 */
+	gpa0.bits.bit3 = (value & 0x01);
+	/* Wiring PI GPIO1 = XU3/4 GPA0.2 */
+	gpa0.bits.bit2 = (value & 0x02);
+	/* Wiring PI GPIO2 = XU3/4 GPX1.5 */
+	gpx1.bits.bit5 = (value & 0x04);
+	/* Wiring PI GPIO3 = XU3/4 GPX1.6 */
+	gpx1.bits.bit6 = (value & 0x08);
+	/* Wiring PI GPIO4 = XU3/4 GPX1.3 */
+	gpx1.bits.bit3 = (value & 0x10);
+	/* Wiring PI GPIO5 = XU3/4 GPX1.7 */
+	gpx1.bits.bit7 = (value & 0x20);
+	/* Wiring PI GPIO6 = XU3/4 GPX2.0 */
+	gpx2.bits.bit0 = (value & 0x40);
+	/* Wiring PI GPIO7 = XU3/4 GPX1.2 */
+	gpx1.bits.bit2 = (value & 0x80);
+
+	/* update data register */
+	*(gpio  + (GPIO_X1_DAT_OFFSET >> 2)) = gpx1.wvalue;
+	*(gpio  + (GPIO_X2_DAT_OFFSET >> 2)) = gpx2.wvalue;
+	*(gpio1 + (GPIO_A0_DAT_OFFSET >> 2)) = gpa0.wvalue;
+}
+
+void digitalWriteByte_C(int value)
+{
+	union	reg_bitfield	gpiox, gpioy;
+
+	gpiox.wvalue = *(gpio + GPIOX_INP_REG_OFFSET);
+	gpioy.wvalue = *(gpio + GPIOY_INP_REG_OFFSET);
+
+	/* Wiring PI GPIO0 = C1 GPIOY.8 */
+	gpioy.bits.bit8 = (value & 0x01);
+	/* Wiring PI GPIO1 = C1 GPIOY.7 */
+	gpioy.bits.bit7 = (value & 0x02);
+	/* Wiring PI GPIO2 = C1 GPIOX.19 */
+	gpiox.bits.bit19 = (value & 0x04);
+	/* Wiring PI GPIO3 = C1 GPIOX.18 */
+	gpiox.bits.bit18 = (value & 0x08);
+	/* Wiring PI GPIO4 = C1 GPIOX.7 */
+	gpiox.bits.bit7 = (value & 0x10);
+	/* Wiring PI GPIO5 = C1 GPIOX.5 */
+	gpiox.bits.bit5 = (value & 0x20);
+	/* Wiring PI GPIO6 = C1 GPIOX.6 */
+	gpiox.bits.bit6 = (value & 0x40);
+	/* Wiring PI GPIO7 = C1 GPIOY.3 */
+	gpioy.bits.bit3 = (value & 0x80);
+
+	*(gpio + GPIOX_OUTP_REG_OFFSET) = gpiox.wvalue;
+	*(gpio + GPIOY_OUTP_REG_OFFSET) = gpioy.wvalue;
+}
+
+void digitalWriteByte_C2(int value)
+{
+	union	reg_bitfield	gpiox;
+
+	gpiox.wvalue = *(gpio + C2_GPIOX_INP_REG_OFFSET);
+
+	/* Wiring PI GPIO0 = C1 GPIOX.19 */
+	gpiox.bits.bit19 = (value & 0x01);
+	/* Wiring PI GPIO1 = C1 GPIOX.10 */
+	gpiox.bits.bit10 = (value & 0x02);
+	/* Wiring PI GPIO2 = C1 GPIOX.11 */
+	gpiox.bits.bit11 = (value & 0x04);
+	/* Wiring PI GPIO3 = C1 GPIOX.9 */
+	gpiox.bits.bit9 = (value & 0x08);
+	/* Wiring PI GPIO4 = C1 GPIOX.8 */
+	gpiox.bits.bit8 = (value & 0x10);
+	/* Wiring PI GPIO5 = C1 GPIOX.5 */
+	gpiox.bits.bit5 = (value & 0x20);
+	/* Wiring PI GPIO6 = C1 GPIOX.3 */
+	gpiox.bits.bit3 = (value & 0x40);
+	/* Wiring PI GPIO7 = C1 GPIOX.21 */
+	gpiox.bits.bit21 = (value & 0x80);
+
+	*(gpio + C2_GPIOX_OUTP_REG_OFFSET) = gpiox.wvalue;
+}
+
+void digitalWriteByte (int value)
+{
+  uint32_t pinSet = 0 ;
+  uint32_t pinClr = 0 ;
+  int mask = 1 ;
+  int pin ;
+
+  /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS)
+  {
+    for (pin = 0 ; pin < 8 ; ++pin)
+    {
+      digitalWrite (pinToGpio[pin], value & mask) ;
+      mask <<= 1 ;
+    }
+    return ;
+  }
+  else
+  {
+    switch(piModel) {
+    case PI_MODEL_ODROIDC:
+      digitalWriteByte_C(value);
+      return;
+    case PI_MODEL_ODROIDC2:
+      digitalWriteByte_C2(value);
+      return;
+    case PI_MODEL_ODROIDXU_34:
+      digitalWriteByte_XU(value);
+      return;
+    default :
+      break;
+    }
+    for (pin = 0 ; pin < 8 ; ++pin)
+    {
+      if ((value & mask) == 0)
+        pinClr |= (1 << pinToGpio [pin]) ;
+      else
+        pinSet |= (1 << pinToGpio [pin]) ;
+
+      mask <<= 1 ;
+    }
+
+    *(gpio + gpioToGPCLR [0]) = pinClr ;
+    *(gpio + gpioToGPSET [0]) = pinSet ;
+  }
+}
+
+
+/*
+ * waitForInterrupt:
+ *	Pi Specific.
+ *	Wait for Interrupt on a GPIO pin.
+ *	This is actually done via the /sys/class/gpio interface regardless of
+ *	the wiringPi access mode in-use. Maybe sometime it might get a better
+ *	way for a bit more efficiency.
+ *********************************************************************************
+ */
+
+
+int waitForInterrupt (int pin, int mS)
+{
+  int fd, x ;
+  uint8_t c ;
+  struct pollfd polls ;
+
+    if ((fd = sysFds [pin]) == -1)
+      return -2 ;
+
+    // Setup poll structure
+    polls.fd     = fd ;
+    polls.events = POLLPRI ;	// Urgent data!
+
+
+// Wait for it ...
+wait:
+  x = poll (&polls, 1, mS) ;
+
+// Do a dummy read to clear the interrupt
+//	A one character read appars to be enough.
+//	Followed by a seek to reset it.
+
+  (void)read (fd, &c, 1) ;
+  lseek (fd, 0, SEEK_SET) ;
+
+  return x ;
+}
+
+
+/*
+ * interruptHandler:
+ *	This is a thread and gets started to wait for the interrupt we're
+ *	hoping to catch. It will call the user-function when the interrupt
+ *	fires.
+ *********************************************************************************
+ */
+
+static void *interruptHandler (void *arg)
+{
+  int myPin ;
+
+  (void)piHiPri (55) ;	// Only effective if we run as root
+
+  myPin   = pinPass ;
+  pinPass = -1 ;
+
+    for (;;)
+      if (waitForInterrupt (myPin, -1) > 0)
+        isrFunctions [myPin] () ;
+
+  return NULL ;
+}
+
+
+/*
+ * wiringPiISR:
+ *	Pi Specific.
+ *	Take the details and create an interrupt handler that will do a call-
+ *	back to the user supplied function.
+ *********************************************************************************
+ */
+
+int wiringPiISR (int pin, int mode, void (*function)(void))
+{
+  pthread_t threadId ;
+  const char *modeS ;
+  char fName   [64] ;
+  char  pinS [8] ;
+  pid_t pid ;
+  int   count, i ;
+  char  c ;
+  int   bcmGpioPin ;
+
+  /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED)
+    return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ;
+  else if (wiringPiMode == WPI_MODE_PINS)
+    bcmGpioPin = pinToGpio [pin & 63] ;
+  else if (wiringPiMode == WPI_MODE_PHYS)
+    bcmGpioPin = physToGpio [pin & 63] ;
+  else
+    bcmGpioPin = pin ;
+
+  if ( piModel == PI_MODEL_ODROIDC )  {
+    if ((pin < 0) || (pin > 128))
+      return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-128 (%d)\n", pin) ;
+  }
+  else if ( piModel == PI_MODEL_ODROIDXU_34 || piModel == PI_MODEL_ODROIDC2 )   {
+    if ((pin < 0) || (pin > 256))
+      return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-256 (%d)\n", pin) ;
+  }
+  else  {
+    if ((pin < 0) || (pin > 63))
+      return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ;
+  }
+
+// Now export the pin and set the right edge
+//	We're going to use the gpio program to do this, so it assumes
+//	a full installation of wiringPi. It's a bit 'clunky', but it
+//	is a way that will work when we're running in "Sys" mode, as
+//	a non-root user. (without sudo)
+
+  if (mode != INT_EDGE_SETUP)
+  {
+    /**/ if (mode == INT_EDGE_FALLING)
+      modeS = "falling" ;
+    else if (mode == INT_EDGE_RISING)
+      modeS = "rising" ;
+    else
+      modeS = "both" ;
+
+    sprintf (pinS, "%d", bcmGpioPin) ;
+
+    if ((pid = fork ()) < 0)	// Fail
+      return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ;
+
+    if (pid == 0)	// Child, exec
+    {
+      /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0)
+      {
+        execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ;
+        return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ;
+      }
+      else if (access ("/usr/bin/gpio", X_OK) == 0)
+      {
+        execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ;
+        return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ;
+      }
+      else
+        return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ;
+    }
+    else		// Parent, wait
+      wait (NULL) ;
+  }
+
+// Now pre-open the /sys/class node - but it may already be open if
+//	we are in Sys mode...
+
+    if (sysFds [pin] == -1)
+    {
+      sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ;
+
+      if ((sysFds [pin] = open (fName, O_RDWR)) < 0)
+        return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ;
+      sysFdIrqType [pin] = mode;
+    }
+
+  // Clear any initial pending interrupt
+
+    ioctl (sysFds [pin], FIONREAD, &count) ;
+    for (i = 0 ; i < count ; ++i)
+      read (sysFds [pin], &c, 1) ;
+
+    isrFunctions [pin] = function ;
+
+  pthread_mutex_lock (&pinMutex) ;
+    pinPass = pin ;
+    pthread_create (&threadId, NULL, interruptHandler, NULL) ;
+    while (pinPass != -1)
+      delay (1) ;
+  pthread_mutex_unlock (&pinMutex) ;
+
+  return 0 ;
+}
+
+
+/*
+ * initialiseEpoch:
+ *	Initialise our start-of-time variable to be the current unix
+ *	time in milliseconds and microseconds.
+ *********************************************************************************
+ */
+
+static void initialiseEpoch (void)
+{
+  struct timeval tv ;
+
+  gettimeofday (&tv, NULL) ;
+  epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000    + (uint64_t)(tv.tv_usec / 1000) ;
+  epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ;
+}
+
+
+/*
+ * delay:
+ *	Wait for some number of milliseconds
+ *********************************************************************************
+ */
+
+void delay (unsigned int howLong)
+{
+  struct timespec sleeper, dummy ;
+
+  sleeper.tv_sec  = (time_t)(howLong / 1000) ;
+  sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ;
+
+  nanosleep (&sleeper, &dummy) ;
+}
+
+
+/*
+ * delayMicroseconds:
+ *	This is somewhat intersting. It seems that on the Pi, a single call
+ *	to nanosleep takes some 80 to 130 microseconds anyway, so while
+ *	obeying the standards (may take longer), it's not always what we
+ *	want!
+ *
+ *	So what I'll do now is if the delay is less than 100uS we'll do it
+ *	in a hard loop, watching a built-in counter on the ARM chip. This is
+ *	somewhat sub-optimal in that it uses 100% CPU, something not an issue
+ *	in a microcontroller, but under a multi-tasking, multi-user OS, it's
+ *	wastefull, however we've no real choice )-:
+ *
+ *      Plan B: It seems all might not be well with that plan, so changing it
+ *      to use gettimeofday () and poll on that instead...
+ *********************************************************************************
+ */
+
+void delayMicrosecondsHard (unsigned int howLong)
+{
+  struct timeval tNow, tLong, tEnd ;
+
+  gettimeofday (&tNow, NULL) ;
+  tLong.tv_sec  = howLong / 1000000 ;
+  tLong.tv_usec = howLong % 1000000 ;
+  timeradd (&tNow, &tLong, &tEnd) ;
+
+  while (timercmp (&tNow, &tEnd, <))
+    gettimeofday (&tNow, NULL) ;
+}
+
+void delayMicroseconds (unsigned int howLong)
+{
+  struct timespec sleeper ;
+  unsigned int uSecs = howLong % 1000000 ;
+  unsigned int wSecs = howLong / 1000000 ;
+
+  /**/ if (howLong ==   0)
+    return ;
+  else if (howLong  < 100)
+    delayMicrosecondsHard (howLong) ;
+  else
+  {
+    sleeper.tv_sec  = wSecs ;
+    sleeper.tv_nsec = (long)(uSecs * 1000L) ;
+    nanosleep (&sleeper, NULL) ;
+  }
+}
+
+
+/*
+ * millis:
+ *	Return a number of milliseconds as an unsigned int.
+ *********************************************************************************
+ */
+
+unsigned int millis (void)
+{
+  struct timeval tv ;
+  uint64_t now ;
+
+  gettimeofday (&tv, NULL) ;
+  now  = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ;
+
+  return (uint32_t)(now - epochMilli) ;
+}
+
+
+/*
+ * micros:
+ *	Return a number of microseconds as an unsigned int.
+ *********************************************************************************
+ */
+
+unsigned int micros (void)
+{
+  struct timeval tv ;
+  uint64_t now ;
+
+  gettimeofday (&tv, NULL) ;
+  now  = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ;
+
+  return (uint32_t)(now - epochMicro) ;
+}
+
+
+/*
+ * wiringPiSetup:
+ *	Must be called once at the start of your program execution.
+ *
+ * Default setup: Initialises the system into wiringPi Pin mode and uses the
+ *	memory mapped hardware directly.
+ *
+ * Changed now to revert to "gpio" mode if we're running on a Compute Module.
+ *********************************************************************************
+ */
+
+int wiringPiSetup (void)
+{
+  int   fd ;
+  int   boardRev ;
+  int   model, rev, mem, maker, overVolted ;
+
+  if (getenv (ENV_DEBUG) != NULL)
+    wiringPiDebug = TRUE ;
+
+  if (getenv (ENV_CODES) != NULL)
+    wiringPiReturnCodes = TRUE ;
+
+  // Open the master /dev/memory device
+  if (access("/dev/gpiomem",0) == 0) {
+    if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/gpiomem: %s\n", strerror (errno)) ;
+  }
+  else {
+    if (geteuid () != 0)
+      (void)wiringPiFailure (WPI_FATAL, "wiringPiSetup: Must be root. (Did you forget sudo?)\n") ;
+
+    if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ;
+  }
+
+  if (wiringPiDebug)
+    printf ("wiringPi: wiringPiSetup called\n") ;
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+
+  if ( model == PI_MODEL_ODROIDC )  {
+
+     pinToGpio =  pinToGpioOdroidC;
+    pin_array_count = ARRAY_SIZE(pinToGpioOdroidC);
+    physToGpio = physToGpioOdroidC;
+
+  // GPIO:
+
+    gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROID_GPIO_BASE) ;
+    if ((int32_t)gpio == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ;
+
+  // ADC
+  // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1)
+    adcFds [0] = open (piAinNode0, O_RDONLY) ;
+    adcFds [1] = open (piAinNode1, O_RDONLY) ;
+  }
+  else if ( model == PI_MODEL_ODROIDC2 )	{
+
+    if(rev == PI_VERSION_1) {
+	 pinToGpio =  pinToGpioOdroidC2_Rev1_0;
+	 pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_0);
+	physToGpio = physToGpioOdroidC2_Rev1_0;
+    }
+    else {
+	 pinToGpio =  pinToGpioOdroidC2_Rev1_1;
+	 pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_1);
+	physToGpio = physToGpioOdroidC2_Rev1_1;
+    }
+
+  // GPIO:
+    gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROIDC2_GPIO_BASE) ;
+    if ((int32_t)gpio == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ;
+
+  // ADC
+  // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1)
+    adcFds [0] = open (C2_piAinNode0, O_RDONLY) ;
+    adcFds [1] = open (C2_piAinNode1, O_RDONLY) ;
+  }
+  else if ( model == PI_MODEL_ODROIDXU_34 ) {
+  // Check the kernel version and then set the ADC files
+    struct utsname uname_buf;
+
+    uname(&uname_buf);
+    if (strncmp(uname_buf.release, "4.14", 4) == 0) {
+        piAinNode0_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage0_raw";
+        piAinNode1_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage3_raw";
+    } else if (strncmp(uname_buf.release, "4.9", 3) == 0) {
+        piAinNode0_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage0_raw";
+        piAinNode1_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage3_raw";
+    } else { // 3.10 kernel
+        piAinNode0_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw";
+        piAinNode1_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw";
+    }
+
+     pinToGpio =  pinToGpioOdroidXU;
+     pin_array_count = ARRAY_SIZE(pinToGpioOdroidXU);
+    physToGpio = physToGpioOdroidXU;
+
+  // GPIO:
+  //#define ODROIDXU_GPX_BASE   0x13400000  // GPX0,1,2,3
+    gpio  = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROIDXU_GPX_BASE) ;
+    if ((int32_t)gpio == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ;
+
+  //#define ODROIDXU_GPA_BASE   0x14010000  // GPA0,1,2, GPB0,1,2,3,4
+    gpio1 = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ODROIDXU_GPA_BASE) ;
+    if ((int32_t)gpio1 == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ;
+
+  // ADC
+  // ADC Fds[0] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw")
+  // ADC Fds[1] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw")
+    adcFds [0] = open (piAinNode0_xu, O_RDONLY) ;
+    adcFds [1] = open (piAinNode1_xu, O_RDONLY) ;
+  }
+  else  {
+  // GPIO:
+    boardRev = piBoardRev () ;
+
+    /**/ if (boardRev == 1)	// A, B, Rev 1, 1.1
+    {
+       pinToGpio =  pinToGpioR1 ;
+      physToGpio = physToGpioR1 ;
+    }
+    else 				// A, B, Rev 2, B+, CM
+    {
+       pinToGpio =  pinToGpioR2 ;
+      physToGpio = physToGpioR2 ;
+    }
+
+    gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ;
+    if ((int32_t)gpio == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ;
+
+  // PWM
+
+    pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ;
+    if ((int32_t)pwm == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ;
+
+  // Clock control (needed for PWM)
+
+    clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, CLOCK_BASE) ;
+    if ((int32_t)clk == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ;
+
+  // The drive pads
+
+    pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ;
+    if ((int32_t)pads == -1)
+      return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ;
+  }
+
+#ifdef	USE_TIMER
+// The system timer
+
+  timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ;
+  if ((int32_t)timer == -1)
+    return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ;
+
+// Set the timer to free-running, 1MHz.
+//	0xF9 is 249, the timer divide is base clock / (divide+1)
+//	so base clock is 250MHz / 250 = 1MHz.
+
+  *(timer + TIMER_CONTROL) = 0x0000280 ;
+  *(timer + TIMER_PRE_DIV) = 0x00000F9 ;
+  timerIrqRaw = timer + TIMER_IRQ_RAW ;
+#endif
+
+  initialiseEpoch () ;
+
+// If we're running on a compute module, then wiringPi pin numbers don't really many anything...
+
+  if (model == PI_MODEL_CM)
+    wiringPiMode = WPI_MODE_GPIO ;
+  else
+    wiringPiMode = WPI_MODE_PINS ;
+
+  return 0 ;
+}
+
+
+/*
+ * wiringPiSetupGpio:
+ *	Must be called once at the start of your program execution.
+ *
+ * GPIO setup: Initialises the system into GPIO Pin mode and uses the
+ *	memory mapped hardware directly.
+ *********************************************************************************
+ */
+
+int wiringPiSetupGpio (void)
+{
+  (void)wiringPiSetup () ;
+
+  if (wiringPiDebug)
+    printf ("wiringPi: wiringPiSetupGpio called\n") ;
+
+  wiringPiMode = WPI_MODE_GPIO ;
+
+  return 0 ;
+}
+
+
+/*
+ * wiringPiSetupPhys:
+ *	Must be called once at the start of your program execution.
+ *
+ * Phys setup: Initialises the system into Physical Pin mode and uses the
+ *	memory mapped hardware directly.
+ *********************************************************************************
+ */
+
+int wiringPiSetupPhys (void)
+{
+  (void)wiringPiSetup () ;
+
+  if (wiringPiDebug)
+    printf ("wiringPi: wiringPiSetupPhys called\n") ;
+
+  wiringPiMode = WPI_MODE_PHYS ;
+
+  return 0 ;
+}
+
+
+/*
+ * wiringPiSetupSys:
+ *	Must be called once at the start of your program execution.
+ *
+ * Initialisation (again), however this time we are using the /sys/class/gpio
+ *	interface to the GPIO systems - slightly slower, but always usable as
+ *	a non-root user, assuming the devices are already exported and setup correctly.
+ */
+
+int wiringPiSetupSys (void)
+{
+  int boardRev ;
+  int model, rev, mem, maker, overVolted ;
+  int pin, offset;
+  char fName [128] ;
+
+  if (getenv (ENV_DEBUG) != NULL)
+    wiringPiDebug = TRUE ;
+
+  if (getenv (ENV_CODES) != NULL)
+    wiringPiReturnCodes = TRUE ;
+
+  if (wiringPiDebug)
+    printf ("wiringPi: wiringPiSetupSys called\n") ;
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+
+  if ( model == PI_MODEL_ODROIDC )  {
+     pinToGpio =  pinToGpioOdroidC ;
+     pin_array_count = ARRAY_SIZE(pinToGpioOdroidC);
+    physToGpio = physToGpioOdroidC ;
+
+  // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1)
+
+    adcFds [0] = open (piAinNode0, O_RDONLY) ;
+    adcFds [1] = open (piAinNode1, O_RDONLY) ;
+  }
+  else if ( model == PI_MODEL_ODROIDC2 )	{
+    if(rev == PI_VERSION_1) {
+	 pinToGpio =  pinToGpioOdroidC2_Rev1_0;
+	 pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_0);
+	physToGpio = physToGpioOdroidC2_Rev1_0;
+    }
+    else {
+	 pinToGpio =  pinToGpioOdroidC2_Rev1_1;
+	 pin_array_count = ARRAY_SIZE(pinToGpioOdroidC2_Rev1_1);
+	physToGpio = physToGpioOdroidC2_Rev1_1;
+    }
+
+  // ADC sysfs open (/sys/class/saradc/saradc_ch0, ch1)
+
+    adcFds [0] = open (C2_piAinNode0, O_RDONLY) ;
+    adcFds [1] = open (C2_piAinNode1, O_RDONLY) ;
+  }
+  else if ( model == PI_MODEL_ODROIDXU_34 ) {
+  // Check the kernel version and then set the ADC files
+    struct utsname uname_buf;
+
+    uname(&uname_buf);
+    if (strncmp(uname_buf.release, "4.14", 4) == 0) {
+        piAinNode0_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage0_raw";
+        piAinNode1_xu = "/sys/devices/platform/soc/12d10000.adc/iio:device0/in_voltage3_raw";
+    } else if (strncmp(uname_buf.release, "4.9", 3) == 0) {
+        piAinNode0_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage0_raw";
+        piAinNode1_xu = "/sys/devices/platform/soc:/12d10000.adc:/iio:device0/in_voltage3_raw";
+    } else { // 3.10 kernel
+        piAinNode0_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw";
+        piAinNode1_xu = "/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw";
+    }
+
+     pinToGpio =  pinToGpioOdroidXU ;
+     pin_array_count = ARRAY_SIZE(pinToGpioOdroidXU);
+    physToGpio = physToGpioOdroidXU ;
+
+  // ADC
+  // ADC Fds[0] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage0_raw")
+  // ADC Fds[1] = ("/sys/devices/12d10000.adc/iio:device0/in_voltage3_raw")
+    adcFds [0] = open (piAinNode0_xu, O_RDONLY) ;
+    adcFds [1] = open (piAinNode1_xu, O_RDONLY) ;
+  }
+
+// Open and scan the directory, looking for exported GPIOs, and pre-open
+//	the 'value' interface to speed things up for later
+    for (pin = 0 ; pin < 64 ; ++pin)
+    {
+      sprintf (fName, "/sys/class/gpio/gpio%d/value", pinToGpio[pin]) ;
+      sysFds [pin] = open (fName, O_RDWR) ;
+    }
+
+  initialiseEpoch () ;
+
+  wiringPiMode = WPI_MODE_GPIO_SYS ;
+
+  return 0 ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.h
new file mode 100755
index 0000000000000000000000000000000000000000..634615469116d5f7dc4d20f46e89afc021d4b4c7
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.h
@@ -0,0 +1,229 @@
+/*
+ * wiringPi:
+ *	Arduino compatable (ish) Wiring library for the Raspberry Pi
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifndef	__WIRING_PI_H__
+#define	__WIRING_PI_H__
+
+// Handy defines
+
+// Deprecated
+#define	NUM_PINS	17
+
+#define	WPI_MODE_PINS		 0
+#define	WPI_MODE_GPIO		 1
+#define	WPI_MODE_GPIO_SYS	 2
+#define	WPI_MODE_PHYS		 3
+#define	WPI_MODE_PIFACE		 4
+#define	WPI_MODE_UNINITIALISED	-1
+
+// Pin modes
+
+#define	INPUT			 0
+#define	OUTPUT			 1
+#define	PWM_OUTPUT		 2
+#define	GPIO_CLOCK		 3
+#define	SOFT_PWM_OUTPUT		 4
+#define	SOFT_TONE_OUTPUT	 5
+#define	PWM_TONE_OUTPUT		 6
+
+#define	LOW			 0
+#define	HIGH			 1
+
+// Pull up/down/none
+
+#define	PUD_OFF			 0
+#define	PUD_DOWN		 1
+#define	PUD_UP			 2
+
+// PWM
+
+#define	PWM_MODE_MS		0
+#define	PWM_MODE_BAL		1
+
+// Interrupt levels
+
+#define	INT_EDGE_SETUP		0
+#define	INT_EDGE_FALLING	1
+#define	INT_EDGE_RISING		2
+#define	INT_EDGE_BOTH		3
+
+// Pi model types and version numbers
+//	Intended for the GPIO program Use at your own risk.
+
+#define	PI_MODEL_UNKNOWN  0
+#define	PI_MODEL_A        1
+#define	PI_MODEL_B        2
+#define	PI_MODEL_BP       3
+#define	PI_MODEL_CM       4
+#define	PI_MODEL_AP       5
+#define	PI_MODEL_ODROIDC  6
+#define PI_MODEL_ODROIDXU_34    7
+#define	PI_MODEL_ODROIDC2	8
+
+#define	PI_VERSION_UNKNOWN	0
+#define	PI_VERSION_1        1
+#define	PI_VERSION_1_1      2
+#define	PI_VERSION_1_2      3
+#define	PI_VERSION_2        4
+
+#define	PI_MAKER_UNKNOWN    0
+#define	PI_MAKER_EGOMAN     1
+#define	PI_MAKER_SONY       2
+#define	PI_MAKER_QISDA      3
+#define	PI_MAKER_HARDKERNEL 4
+
+extern const char *piModelNames    [9] ;
+extern const char *piRevisionNames [5] ;
+extern const char *piMakerNames    [5] ;
+
+
+//	Intended for the GPIO program Use at your own risk.
+
+// Threads
+
+#define	PI_THREAD(X)	void *X (void *dummy)
+
+// Failure modes
+
+#define	WPI_FATAL	(1==1)
+#define	WPI_ALMOST	(1==2)
+
+
+// wiringPiNodeStruct:
+//	This describes additional device nodes in the extended wiringPi
+//	2.0 scheme of things.
+//	It's a simple linked list for now, but will hopefully migrate to 
+//	a binary tree for efficiency reasons - but then again, the chances
+//	of more than 1 or 2 devices being added are fairly slim, so who
+//	knows....
+
+struct wiringPiNodeStruct
+{
+  int     pinBase ;
+  int     pinMax ;
+
+  int          fd ;	// Node specific
+  unsigned int data0 ;	//  ditto
+  unsigned int data1 ;	//  ditto
+  unsigned int data2 ;	//  ditto
+  unsigned int data3 ;	//  ditto
+
+  void   (*pinMode)         (struct wiringPiNodeStruct *node, int pin, int mode) ;
+  void   (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode) ;
+  int    (*digitalRead)     (struct wiringPiNodeStruct *node, int pin) ;
+  void   (*digitalWrite)    (struct wiringPiNodeStruct *node, int pin, int value) ;
+  void   (*pwmWrite)        (struct wiringPiNodeStruct *node, int pin, int value) ;
+  int    (*analogRead)      (struct wiringPiNodeStruct *node, int pin) ;
+  void   (*analogWrite)     (struct wiringPiNodeStruct *node, int pin, int value) ;
+
+  struct wiringPiNodeStruct *next ;
+} ;
+
+extern struct wiringPiNodeStruct *wiringPiNodes ;
+
+
+// Function prototypes
+//	c++ wrappers thanks to a comment by Nick Lott
+//	(and others on the Raspberry Pi forums)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Data
+
+//extern const char *piModelNames [] ;
+//extern const char *piRevisionNames[] ;
+
+// Internal
+
+extern int wiringPiFailure (int fatal, const char *message, ...) ;
+
+// Core wiringPi functions
+
+extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ;
+extern struct wiringPiNodeStruct *wiringPiNewNode  (int pinBase, int numPins) ;
+
+extern int  wiringPiSetup       (void) ;
+extern int  wiringPiSetupSys    (void) ;
+extern int  wiringPiSetupGpio   (void) ;
+extern int  wiringPiSetupPhys   (void) ;
+
+extern void pinModeAlt          (int pin, int mode) ;
+extern void pinMode             (int pin, int mode) ;
+extern void pullUpDnControl     (int pin, int pud) ;
+extern int  digitalRead         (int pin) ;
+extern void digitalWrite        (int pin, int value) ;
+extern void pwmWrite            (int pin, int value) ;
+extern int  analogRead          (int pin) ;
+extern void analogWrite         (int pin, int value) ;
+
+// PiFace specifics 
+//	(Deprecated)
+
+extern int  wiringPiSetupPiFace (void) ;
+extern int  wiringPiSetupPiFaceForGpioProg (void) ;	// Don't use this - for gpio program only
+
+// On-Board Raspberry Pi hardware specific stuff
+
+extern int  piBoardRev          (void) ;
+extern void piBoardId           (int *model, int *rev, int *mem, int *maker, int *overVolted) ;
+extern int  wpiPinToGpio        (int wpiPin) ;
+extern int  physPinToGpio       (int physPin) ;
+extern void setPadDrive         (int group, int value) ;
+extern int  getAlt              (int pin) ;
+extern void pwmToneWrite        (int pin, int freq) ;
+extern void digitalWriteByte    (int value) ;
+extern void pwmSetMode          (int mode) ;
+extern void pwmSetRange         (unsigned int range) ;
+extern void pwmSetClock         (int divisor) ;
+extern void gpioClockSet        (int pin, int freq) ;
+
+// Interrupts
+//	(Also Pi hardware specific)
+
+extern int  waitForInterrupt    (int pin, int mS) ;
+extern int  wiringPiISR         (int pin, int mode, void (*function)(void)) ;
+
+// Threads
+
+extern int  piThreadCreate      (void *(*fn)(void *)) ;
+extern void piLock              (int key) ;
+extern void piUnlock            (int key) ;
+
+// Schedulling priority
+
+extern int piHiPri (const int pri) ;
+
+// Extras from arduino land
+
+extern void         delay             (unsigned int howLong) ;
+extern void         delayMicroseconds (unsigned int howLong) ;
+extern unsigned int millis            (void) ;
+extern unsigned int micros            (void) ;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.o
new file mode 100644
index 0000000000000000000000000000000000000000..6cabfb0928e2a5a3bcc12437b7e42a0ff5c2d40a
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPi.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.c
new file mode 100755
index 0000000000000000000000000000000000000000..2a12116597362ed93acddaa32c5078ab783ea022
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.c
@@ -0,0 +1,240 @@
+/*
+ * wiringPiI2C.c:
+ *	Simplified I2C access routines
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+/*
+ * Notes:
+ *	The Linux I2C code is actually the same (almost) as the SMBus code.
+ *	SMBus is System Management Bus - and in essentially I2C with some
+ *	additional functionality added, and stricter controls on the electrical
+ *	specifications, etc. however I2C does work well with it and the
+ *	protocols work over both.
+ *
+ *	I'm directly including the SMBus functions here as some Linux distros
+ *	lack the correct header files, and also some header files are GPLv2
+ *	rather than the LGPL that wiringPi is released under - presumably because
+ *	originally no-one expected I2C/SMBus to be used outside the kernel -
+ *	however enter the Raspberry Pi with people now taking directly to I2C
+ *	devices without going via the kernel...
+ *
+ *	This may ultimately reduce the flexibility of this code, but it won't be
+ *	hard to maintain it and keep it current, should things change.
+ *
+ *	Information here gained from: kernel/Documentation/i2c/dev-interface
+ *	as well as other online resources.
+ *********************************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include "wiringPi.h"
+#include "wiringPiI2C.h"
+
+// I2C definitions
+
+#define I2C_SLAVE	0x0703
+#define I2C_SMBUS	0x0720	/* SMBus-level access */
+
+#define I2C_SMBUS_READ	1
+#define I2C_SMBUS_WRITE	0
+
+// SMBus transaction types
+
+#define I2C_SMBUS_QUICK		    0
+#define I2C_SMBUS_BYTE		    1
+#define I2C_SMBUS_BYTE_DATA	    2 
+#define I2C_SMBUS_WORD_DATA	    3
+#define I2C_SMBUS_PROC_CALL	    4
+#define I2C_SMBUS_BLOCK_DATA	    5
+#define I2C_SMBUS_I2C_BLOCK_BROKEN  6
+#define I2C_SMBUS_BLOCK_PROC_CALL   7		/* SMBus 2.0 */
+#define I2C_SMBUS_I2C_BLOCK_DATA    8
+
+// SMBus messages
+
+#define I2C_SMBUS_BLOCK_MAX	32	/* As specified in SMBus standard */	
+#define I2C_SMBUS_I2C_BLOCK_MAX	32	/* Not specified but we use same structure */
+
+// Structures used in the ioctl() calls
+
+union i2c_smbus_data
+{
+  uint8_t  byte ;
+  uint16_t word ;
+  uint8_t  block [I2C_SMBUS_BLOCK_MAX + 2] ;	// block [0] is used for length + one more for PEC
+} ;
+
+struct i2c_smbus_ioctl_data
+{
+  char read_write ;
+  uint8_t command ;
+  int size ;
+  union i2c_smbus_data *data ;
+} ;
+
+static inline int i2c_smbus_access (int fd, char rw, uint8_t command, int size, union i2c_smbus_data *data)
+{
+  struct i2c_smbus_ioctl_data args ;
+
+  args.read_write = rw ;
+  args.command    = command ;
+  args.size       = size ;
+  args.data       = data ;
+  return ioctl (fd, I2C_SMBUS, &args) ;
+}
+
+
+/*
+ * wiringPiI2CRead:
+ *	Simple device read
+ *********************************************************************************
+ */
+
+int wiringPiI2CRead (int fd)
+{
+  union i2c_smbus_data data ;
+
+  if (i2c_smbus_access (fd, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data))
+    return -1 ;
+  else
+    return data.byte & 0xFF ;
+}
+
+
+/*
+ * wiringPiI2CReadReg8: wiringPiI2CReadReg16:
+ *	Read an 8 or 16-bit value from a regsiter on the device
+ *********************************************************************************
+ */
+
+int wiringPiI2CReadReg8 (int fd, int reg)
+{
+  union i2c_smbus_data data;
+
+  if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, &data))
+    return -1 ;
+  else
+    return data.byte & 0xFF ;
+}
+
+int wiringPiI2CReadReg16 (int fd, int reg)
+{
+  union i2c_smbus_data data;
+
+  if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_WORD_DATA, &data))
+    return -1 ;
+  else
+    return data.word & 0xFFFF ;
+}
+
+
+/*
+ * wiringPiI2CWrite:
+ *	Simple device write
+ *********************************************************************************
+ */
+
+int wiringPiI2CWrite (int fd, int data)
+{
+  return i2c_smbus_access (fd, I2C_SMBUS_WRITE, data, I2C_SMBUS_BYTE, NULL) ;
+}
+
+
+/*
+ * wiringPiI2CWriteReg8: wiringPiI2CWriteReg16:
+ *	Write an 8 or 16-bit value to the given register
+ *********************************************************************************
+ */
+
+int wiringPiI2CWriteReg8 (int fd, int reg, int value)
+{
+  union i2c_smbus_data data ;
+
+  data.byte = value ;
+  return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_BYTE_DATA, &data) ;
+}
+
+int wiringPiI2CWriteReg16 (int fd, int reg, int value)
+{
+  union i2c_smbus_data data ;
+
+  data.word = value ;
+  return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_WORD_DATA, &data) ;
+}
+
+
+/*
+ * wiringPiI2CSetupInterface:
+ *	Undocumented access to set the interface explicitly - might be used
+ *	for the Pi's 2nd I2C interface...
+ *********************************************************************************
+ */
+
+int wiringPiI2CSetupInterface (const char *device, int devId)
+{
+  int fd ;
+
+  if ((fd = open (device, O_RDWR)) < 0)
+    return wiringPiFailure (WPI_ALMOST, "Unable to open I2C device: %s\n", strerror (errno)) ;
+
+  if (ioctl (fd, I2C_SLAVE, devId) < 0)
+    return wiringPiFailure (WPI_ALMOST, "Unable to select I2C device: %s\n", strerror (errno)) ;
+
+  return fd ;
+}
+
+
+/*
+ * wiringPiI2CSetup:
+ *	Open the I2C device, and regsiter the target device
+ *********************************************************************************
+ */
+
+int wiringPiI2CSetup (const int devId)
+{
+  const char *device ;
+  int model, rev, mem, maker, overVolted ;
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+
+  if      ( model == PI_MODEL_ODROIDC || model == PI_MODEL_ODROIDC2 )
+    device = "/dev/i2c-1" ;
+  else if ( model == PI_MODEL_ODROIDXU_34 )
+    device = "/dev/i2c-4" ;	/* update 2016/feb/12 Linux */
+  else  {
+    rev = piBoardRev () ;
+
+    if (rev == 1)
+      device = "/dev/i2c-0" ;
+    else
+      device = "/dev/i2c-1" ;
+  }
+
+  return wiringPiI2CSetupInterface (device, devId) ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.h
new file mode 100644
index 0000000000000000000000000000000000000000..6db8c688e49575f31d919ab841f8762576eefbfb
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.h
@@ -0,0 +1,42 @@
+/*
+ * wiringPiI2C.h:
+ *	Simplified I2C access routines
+ *	Copyright (c) 2013 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int wiringPiI2CRead           (int fd) ;
+extern int wiringPiI2CReadReg8       (int fd, int reg) ;
+extern int wiringPiI2CReadReg16      (int fd, int reg) ;
+
+extern int wiringPiI2CWrite          (int fd, int data) ;
+extern int wiringPiI2CWriteReg8      (int fd, int reg, int data) ;
+extern int wiringPiI2CWriteReg16     (int fd, int reg, int data) ;
+
+extern int wiringPiI2CSetupInterface (const char *device, int devId) ;
+extern int wiringPiI2CSetup          (const int devId) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.o
new file mode 100644
index 0000000000000000000000000000000000000000..a46271c7aa58b14656a1a82a36e900c20ca04174
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiI2C.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.c
new file mode 100755
index 0000000000000000000000000000000000000000..749045cdd0893cf1982322cf21f96228f043e336
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.c
@@ -0,0 +1,144 @@
+/*
+ * wiringPiSPI.c:
+ *	Simplified SPI access routines
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+
+#include <stdint.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <linux/spi/spidev.h>
+
+#include "wiringPi.h"
+
+#include "wiringPiSPI.h"
+
+
+// The SPI bus parameters
+//	Variables as they need to be passed as pointers later on
+
+const static char       *spiDev0  = "/dev/spidev0.0" ;
+const static char       *spiDev1  = "/dev/spidev0.1" ;
+const static char       *spiDev0_XU = "/dev/spidev1.0";
+const static uint8_t     spiMode  = 0 ;
+const static uint8_t     spiBPW   = 8 ;
+const static uint16_t    spiDelay = 0 ;
+
+static uint32_t    spiSpeeds [2] ;
+static int         spiFds [2] ;
+
+
+/*
+ * wiringPiSPIGetFd:
+ *	Return the file-descriptor for the given channel
+ *********************************************************************************
+ */
+
+int wiringPiSPIGetFd (int channel)
+{
+  return spiFds [channel & 1] ;
+}
+
+
+/*
+ * wiringPiSPIDataRW:
+ *	Write and Read a block of data over the SPI bus.
+ *	Note the data ia being read into the transmit buffer, so will
+ *	overwrite it!
+ *	This is also a full-duplex operation.
+ *********************************************************************************
+ */
+
+int wiringPiSPIDataRW (int channel, unsigned char *data, int len)
+{
+  struct spi_ioc_transfer spi ;
+
+  channel &= 1 ;
+
+  spi.tx_buf        = (unsigned long)data ;
+  spi.rx_buf        = (unsigned long)data ;
+  spi.len           = len ;
+  spi.delay_usecs   = spiDelay ;
+  spi.speed_hz      = spiSpeeds [channel] ;
+  spi.bits_per_word = spiBPW ;
+
+  return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ;
+}
+
+
+/*
+ * wiringPiSPISetup:
+ *	Open the SPI device, and set it up, etc.
+ *********************************************************************************
+ */
+
+int wiringPiSPISetup (int channel, int speed)
+{
+  int fd ;
+  int model, rev, mem, maker, overVolted ;
+
+  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+
+  channel &= 1 ;
+
+  if (model == PI_MODEL_ODROIDXU_34)    {
+    if (channel)
+      return wiringPiFailure (WPI_ALMOST, "ODROID-XU3/4 cannot support spi-channel 1.\n") ;
+
+    if ((fd = open (spiDev0_XU, O_RDWR)) < 0)
+      return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ;
+  }
+  else if (model == PI_MODEL_ODROIDC)  {
+    if (channel)
+      return wiringPiFailure (WPI_ALMOST, "ODROID-C1/C1+ cannot support spi-channel 1.\n") ;
+
+    if ((fd = open (spiDev0, O_RDWR)) < 0)
+      return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ;
+  }
+  else if (model == PI_MODEL_ODROIDC2)	{
+      return wiringPiFailure (WPI_ALMOST, "ODROID-C2 cannot support spi-channel\n") ;
+  }
+  else  {
+    if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0)
+      return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ;
+  }
+
+  spiSpeeds [channel] = speed ;
+  spiFds    [channel] = fd ;
+
+// Set SPI parameters.
+//	Why are we reading it afterwriting it? I've no idea, but for now I'm blindly
+//	copying example code I've seen online...
+
+  if (ioctl (fd, SPI_IOC_WR_MODE, &spiMode)         < 0)
+    return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ;
+  
+  if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0)
+    return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ;
+
+  if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed)   < 0)
+    return wiringPiFailure (WPI_ALMOST, "SPI Speed Change failure: %s\n", strerror (errno)) ;
+
+  return fd ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.h
new file mode 100644
index 0000000000000000000000000000000000000000..f53697d1ad52ccf9fb06643b965d87056d3d165d
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.h
@@ -0,0 +1,35 @@
+/*
+ * wiringPiSPI.h:
+ *	Simplified SPI access routines
+ *	Copyright (c) 2012 Gordon Henderson
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the
+ *    License, or (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.
+ *    If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int wiringPiSPIGetFd  (int channel) ;
+int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;
+int wiringPiSPISetup  (int channel, int speed) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.o
new file mode 100644
index 0000000000000000000000000000000000000000..73772d7ad792ef86508a25dfff54c2e6db1059b3
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/wiringPiSPI.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca976a996ffb06c89473dde21e6c3b6db0d384c0
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.c
@@ -0,0 +1,213 @@
+/*
+ * wiringSerial.c:
+ *	Handle a serial port
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "wiringSerial.h"
+
+/*
+ * serialOpen:
+ *	Open and initialise the serial port, setting all the right
+ *	port parameters - or as many as are required - hopefully!
+ *********************************************************************************
+ */
+
+int serialOpen (const char *device, const int baud)
+{
+  struct termios options ;
+  speed_t myBaud ;
+  int     status, fd ;
+
+  switch (baud)
+  {
+    case     50:	myBaud =     B50 ; break ;
+    case     75:	myBaud =     B75 ; break ;
+    case    110:	myBaud =    B110 ; break ;
+    case    134:	myBaud =    B134 ; break ;
+    case    150:	myBaud =    B150 ; break ;
+    case    200:	myBaud =    B200 ; break ;
+    case    300:	myBaud =    B300 ; break ;
+    case    600:	myBaud =    B600 ; break ;
+    case   1200:	myBaud =   B1200 ; break ;
+    case   1800:	myBaud =   B1800 ; break ;
+    case   2400:	myBaud =   B2400 ; break ;
+    case   4800:	myBaud =   B4800 ; break ;
+    case   9600:	myBaud =   B9600 ; break ;
+    case  19200:	myBaud =  B19200 ; break ;
+    case  38400:	myBaud =  B38400 ; break ;
+    case  57600:	myBaud =  B57600 ; break ;
+    case 115200:	myBaud = B115200 ; break ;
+    case 230400:	myBaud = B230400 ; break ;
+
+    default:
+      return -2 ;
+  }
+
+  if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
+    return -1 ;
+
+  fcntl (fd, F_SETFL, O_RDWR) ;
+
+// Get and modify current options:
+
+  tcgetattr (fd, &options) ;
+
+    cfmakeraw   (&options) ;
+    cfsetispeed (&options, myBaud) ;
+    cfsetospeed (&options, myBaud) ;
+
+    options.c_cflag |= (CLOCAL | CREAD) ;
+    options.c_cflag &= ~PARENB ;
+    options.c_cflag &= ~CSTOPB ;
+    options.c_cflag &= ~CSIZE ;
+    options.c_cflag |= CS8 ;
+    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
+    options.c_oflag &= ~OPOST ;
+
+    options.c_cc [VMIN]  =   0 ;
+    options.c_cc [VTIME] = 100 ;	// Ten seconds (100 deciseconds)
+
+  tcsetattr (fd, TCSANOW | TCSAFLUSH, &options) ;
+
+  ioctl (fd, TIOCMGET, &status);
+
+  status |= TIOCM_DTR ;
+  status |= TIOCM_RTS ;
+
+  ioctl (fd, TIOCMSET, &status);
+
+  usleep (10000) ;	// 10mS
+
+  return fd ;
+}
+
+
+/*
+ * serialFlush:
+ *	Flush the serial buffers (both tx & rx)
+ *********************************************************************************
+ */
+
+void serialFlush (const int fd)
+{
+  tcflush (fd, TCIOFLUSH) ;
+}
+
+
+/*
+ * serialClose:
+ *	Release the serial port
+ *********************************************************************************
+ */
+
+void serialClose (const int fd)
+{
+  close (fd) ;
+}
+
+
+/*
+ * serialPutchar:
+ *	Send a single character to the serial port
+ *********************************************************************************
+ */
+
+void serialPutchar (const int fd, const unsigned char c)
+{
+  write (fd, &c, 1) ;
+}
+
+
+/*
+ * serialPuts:
+ *	Send a string to the serial port
+ *********************************************************************************
+ */
+
+void serialPuts (const int fd, const char *s)
+{
+  write (fd, s, strlen (s)) ;
+}
+
+/*
+ * serialPrintf:
+ *	Printf over Serial
+ *********************************************************************************
+ */
+
+void serialPrintf (const int fd, const char *message, ...)
+{
+  va_list argp ;
+  char buffer [1024] ;
+
+  va_start (argp, message) ;
+    vsnprintf (buffer, 1023, message, argp) ;
+  va_end (argp) ;
+
+  serialPuts (fd, buffer) ;
+}
+
+
+/*
+ * serialDataAvail:
+ *	Return the number of bytes of data avalable to be read in the serial port
+ *********************************************************************************
+ */
+
+int serialDataAvail (const int fd)
+{
+  int result ;
+
+  if (ioctl (fd, FIONREAD, &result) == -1)
+    return -1 ;
+
+  return result ;
+}
+
+
+/*
+ * serialGetchar:
+ *	Get a single character from the serial device.
+ *	Note: Zero is a valid character and this function will time-out after
+ *	10 seconds.
+ *********************************************************************************
+ */
+
+int serialGetchar (const int fd)
+{
+  uint8_t x ;
+
+  if (read (fd, &x, 1) != 1)
+    return -1 ;
+
+  return ((int)x) & 0xFF ;
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.h
new file mode 100644
index 0000000000000000000000000000000000000000..430dc73118a36c3310bac400b4ff7d7af466c36c
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.h
@@ -0,0 +1,38 @@
+/*
+ * wiringSerial.h:
+ *	Handle a serial port
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int   serialOpen      (const char *device, const int baud) ;
+extern void  serialClose     (const int fd) ;
+extern void  serialFlush     (const int fd) ;
+extern void  serialPutchar   (const int fd, const unsigned char c) ;
+extern void  serialPuts      (const int fd, const char *s) ;
+extern void  serialPrintf    (const int fd, const char *message, ...) ;
+extern int   serialDataAvail (const int fd) ;
+extern int   serialGetchar   (const int fd) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.o
new file mode 100644
index 0000000000000000000000000000000000000000..e7cad0a25271a775178c20858327c8aa15f620b5
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/wiringSerial.o differ
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.c b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.c
new file mode 100644
index 0000000000000000000000000000000000000000..3df94e8ae03017f2e6f9438dfdc6b15cf96ab7d3
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.c
@@ -0,0 +1,83 @@
+/*
+ * wiringShift.c:
+ *	Emulate some of the Arduino wiring functionality. 
+ *
+ * Copyright (c) 2009-2012 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#include <stdint.h>
+
+#include "wiringPi.h"
+#include "wiringShift.h"
+
+/*
+ * shiftIn:
+ *	Shift data in from a clocked source
+ *********************************************************************************
+ */
+
+uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order)
+{
+  uint8_t value = 0 ;
+  int8_t  i ;
+ 
+  if (order == MSBFIRST)
+    for (i = 7 ; i >= 0 ; --i)
+    {
+      digitalWrite (cPin, HIGH) ;
+      value |= digitalRead (dPin) << i ;
+      digitalWrite (cPin, LOW) ;
+    }
+  else
+    for (i = 0 ; i < 8 ; ++i)
+    {
+      digitalWrite (cPin, HIGH) ;
+      value |= digitalRead (dPin) << i ;
+      digitalWrite (cPin, LOW) ;
+    }
+
+  return value;
+}
+
+/*
+ * shiftOut:
+ *	Shift data out to a clocked source
+ *********************************************************************************
+ */
+
+void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val)
+{
+  int8_t i;
+
+  if (order == MSBFIRST)
+    for (i = 7 ; i >= 0 ; --i)
+    {
+      digitalWrite (dPin, val & (1 << i)) ;
+      digitalWrite (cPin, HIGH) ;
+      digitalWrite (cPin, LOW) ;
+    }
+  else
+    for (i = 0 ; i < 8 ; ++i)
+    {
+      digitalWrite (dPin, val & (1 << i)) ;
+      digitalWrite (cPin, HIGH) ;
+      digitalWrite (cPin, LOW) ;
+    }
+}
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.h b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.h
new file mode 100644
index 0000000000000000000000000000000000000000..419ade411f408b09e91fa451dfb0e82922aa4275
--- /dev/null
+++ b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.h
@@ -0,0 +1,41 @@
+/*
+ * wiringShift.h:
+ *	Emulate some of the Arduino wiring functionality. 
+ *
+ * Copyright (c) 2009-2012 Gordon Henderson.
+ ***********************************************************************
+ * This file is part of wiringPi:
+ *	https://projects.drogon.net/raspberry-pi/wiringpi/
+ *
+ *    wiringPi 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 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    wiringPi 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 wiringPi.  If not, see <http://www.gnu.org/licenses/>.
+ ***********************************************************************
+ */
+
+#define	LSBFIRST	0
+#define	MSBFIRST	1
+
+#ifndef	_STDINT_H
+#  include <stdint.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern uint8_t shiftIn      (uint8_t dPin, uint8_t cPin, uint8_t order) ;
+extern void    shiftOut     (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) ;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.o b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.o
new file mode 100644
index 0000000000000000000000000000000000000000..5f83a176a82e8accfc7468ff19e0627daf10c387
Binary files /dev/null and b/modules/catkin_ws/src/wiringPi/wiringPi/wiringShift.o differ