diff options
42 files changed, 472 insertions, 86 deletions
| diff --git a/Makefile.am b/Makefile.am index cf4eaf6..81b09ad 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@  # For futur Boost test    #ACLOCAL_AMFLAGS = -I ./build-aux/ -SUBDIRS = src +SUBDIRS = src udev  dist_doc_DATA = README  man1_MANS = man/aeroup.man  EXTRA_DIST = $(man1_MANS) diff --git a/Makefile.in b/Makefile.in index 186eac8..2f8b27e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -323,7 +323,7 @@ top_srcdir = @top_srcdir@  # For futur Boost test    #ACLOCAL_AMFLAGS = -I ./build-aux/ -SUBDIRS = src +SUBDIRS = src udev  dist_doc_DATA = README  man1_MANS = man/aeroup.man  EXTRA_DIST = $(man1_MANS) @@ -27,3 +27,5 @@ AeroUp NEWS file    * ( commit first version on github )          +### AeroUp news for 0.3.0 : +  * add improved driver support ( with udev linux ) @@ -1,5 +1,5 @@ -README for AeroUp 0.2 -===================== +README for AeroUp 0.3.0 +=======================  AeroUp is an open source and multiplatform tool to control Ultimate (programmable light sequencing juggling props) from Aerotech Projects. @@ -16,6 +16,7 @@ Features  * Get Serial Number command  * Set Serial Number command  * Upload glo sequences command +* improved driver (udev linux)  * checks syntax of .glo files    multithread, multiplatform gui,  and some others original features coming soon... @@ -633,6 +633,8 @@ ac_subst_vars='am__EXEEXT_FALSE  am__EXEEXT_TRUE  LTLIBOBJS  LIBOBJS +UDEV_FALSE +UDEV_TRUE  BOOST_FALSE  BOOST_TRUE  EGREP @@ -5385,7 +5387,8 @@ fi  done -ac_config_files="$ac_config_files Makefile src/Makefile" +ac_config_files="$ac_config_files Makefile src/Makefile udev/Makefile" +   if test "$HAVE_BOOST_REGEX" = yes; then @@ -5397,6 +5400,27 @@ else  fi +# UDEV +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking For Udev" >&5 +$as_echo_n "checking For Udev... " >&6; } + if test -d "/etc/udev/rules.d" ; then +  UDEV_TRUE= +  UDEV_FALSE='#' +else +  UDEV_TRUE='#' +  UDEV_FALSE= +fi + +if test -z "$UDEV_TRUE"; then : +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 +$as_echo "\"yes\"" >&6; } +else +  { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 +$as_echo "\"no\"" >&6; } +fi + + +  cat >confcache <<\_ACEOF  # This file is a shell script that caches the results of configure  # tests run on this system so they can be shared between configure @@ -5538,6 +5562,10 @@ if test -z "${BOOST_TRUE}" && test -z "${BOOST_FALSE}"; then    as_fn_error $? "conditional \"BOOST\" was never defined.  Usually this means the macro was only invoked conditionally." "$LINENO" 5  fi +if test -z "${UDEV_TRUE}" && test -z "${UDEV_FALSE}"; then +  as_fn_error $? "conditional \"UDEV\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi  : "${CONFIG_STATUS=./config.status}"  ac_write_fail=0 @@ -6135,6 +6163,7 @@ do      "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;      "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;      "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; +    "udev/Makefile") CONFIG_FILES="$CONFIG_FILES udev/Makefile" ;;    *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;    esac diff --git a/configure.ac b/configure.ac index 5e50b3c..5c9e857 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@  AC_PREREQ([2.69])  AC_CONFIG_AUX_DIR([build-aux]) -AC_INIT([AeroUp], [0.2], [laurentba<at>larueluberlu.net], , [https://github.com/LaurentBa/AeroUp]) +AC_INIT([AeroUp], [0.3.0], [laurentba<at>larueluberlu.net], , [https://github.com/LaurentBa/AeroUp])  AM_INIT_AUTOMAKE  AC_CONFIG_SRCDIR([src/global.hpp])  AC_CONFIG_HEADERS([src/config.h]) @@ -78,10 +78,19 @@ AC_CHECK_FUNCS([memset regcomp strtol])  AC_CHECK_FUNCS([bzero memset strtol])  AC_CONFIG_FILES([Makefile -                 src/Makefile]) +                 src/Makefile +                 udev/Makefile]) +  AM_CONDITIONAL([BOOST], [test "$HAVE_BOOST_REGEX" = yes]) +# UDEV +AC_MSG_CHECKING([For Udev]) +AM_CONDITIONAL([UDEV], [test -d "/etc/udev/rules.d" ]) +AM_COND_IF([UDEV], [AC_MSG_RESULT(["yes"])], [AC_MSG_RESULT(["no"])]) + + +  AC_OUTPUT  echo \ diff --git a/man/aeroup.man b/man/aeroup.man index ab78499..171037d 100644 --- a/man/aeroup.man +++ b/man/aeroup.man @@ -53,15 +53,41 @@ Set \fIserialNumber\fR on dev \fIserialPort\fR.  .fi  .TP -.nf  \fB\-i\fR, \fB\-\-verify\fR=\fIgloFile\fR  Verify that syntax glo file is valid  .TP -.nf  \fB\-u\fR, \fB\-\-uploadGlo\fR=\fIgloFile\fR,\fIserialPort\fR  Verify that syntax glo file is valid and if this is the case upload it on dev \fIserialPort\fR + +.TP +\fB\-k\fR \fB\-\-symlink\fR  +return the serial name used as symlink of kernel name by udev (work with linux only). see the improved management driver section below. +But you can also use this command to retrieve an more readable id than serial number. + +.TP +Improved management driver (linux only) +note: you may need to update to last  bootloader (aeroup was tested with Club_Ball_Poi_V2.3.hex). +you 'll find it on the Aerotech ltd web page. + +To use the system management driver, you first need to set the apropriate serial number +in your props with the --setSerial option. (See the address table belowx). +And put the file aeroup.rule to your udev rules directory if it wasn't done during installation. +When you plug your props you should now have a corresponding symlink to your /dev directory. + +.nf +================================================ +  Props | Range adress  | id char | Symlinks   +================================================ +  Ball  | 0.0.98.0/24   | b       | /dev/Ball#    +  Staff | 0.0.115.0/24  | s       | /dev/Staff# +  Club  | 0.0.99.0/24   | c       | /dev/Club#     +  Poi   | 0:0:112:0/24  | p       | /Poi/Poi# +================================================ +.fi + +  .TP  .nf  \fB\-P\fR, \fB\-\-thread\fR @@ -121,3 +147,9 @@ License GPLv3+: GNU GPL  version 3 or later <http://gnu.org/licenses/gpl.html>.  This  is  free software: you are free to change and redistribute it.  There is NO WARRANTY, to the extent permitted by law. + + + + + + diff --git a/man/aeroup.man.html b/man/aeroup.man.html index 3a254f5..b99d1d4 100644 --- a/man/aeroup.man.html +++ b/man/aeroup.man.html @@ -9,11 +9,13 @@  <!-- Manpage converted by man2html 3.0.1 -->  SYNOPSIS -       aeroup  [-t  serialPort]  [-o  serialPort]  [-c red,green,blue,serialPort] [-G serialPort] [-S serialNumber,serialPort] [-i gloFile] [-u gloFile,serialPort] [-U gloc‐ -       File,serialPort] [-v] [-P] +       aeroup  [-t  serialPort]  [-o  serialPort]  [-c red,green,blue,serialPort] [-G +       serialPort] [-S serialNumber,serialPort] [-i gloFile] [-u  gloFile,serialPort] +       [-U glocFile,serialPort] [-P] [-v] [-h]  DESCRIPTION -       AeroUp is an open source tool to use with Ultimate (programmable light sequencing juggling props) from Aerotech Projects. +       AeroUp  is  an open source command line tool to control Ultimate (programmable +       light sequencing juggling props) from Aerotech Projects.  OPTIONS         -t, --test=serialPort @@ -24,7 +26,6 @@ OPTIONS         -c, --color=red,green,blue,serialPort                Send a color command on dev serialPort. -              Each sub options have to be separate with a comma without blank.                Colors red, green, blue can be hexadecimal or decimal value in range of [0-255]                hex value have to begin with 0x. @@ -33,20 +34,49 @@ OPTIONS         -S, --setSerial=serialNumber,serialPort                Set serialNumber on dev serialPort. -              32 bits value can be writen in hexadecimal (0x#) binary (0b#) or decimal (#). +              32 bits value can be writen in hexadecimal (0x#) or decimal (#).         -i, --verify=gloFile                Verify that syntax glo file is valid -       -u, --verify=gloFile,serialPort -              Verify that syntax glo file is valid and if this is the case upload it on dev serialPort +       -u, --uploadGlo=gloFile,serialPort +              Verify that syntax glo file is valid and if this is the case upload  it +              on dev serialPort + +       -k --symlink +              return  the  serial  name  used as symlink of kernel name by udev (work +              with linux only). see the improved  management  driver  section  below. +              But  you can also use this command to retrieve an more readable id than + +              ================================================ +                Props | Range adress  | id char | Symlinks +              ================================================ +                Ball  | 0.0.98.0/24   | b       | /dev/Ball# +                Staff | 0.0.115.0/24  | s       | /dev/Staff# +                Club  | 0.0.99.0/24   | c       | /dev/Club# +                Poi   | 0:0:112:0/24  | p       | /Poi/Poi# +              ================================================         -P, --thread                Multithread mode, not implemented yet... -       -u, --verify=glocFile,serialPort +       -U, --uploadGloc=glocFile,serialPort                not implemented yet... +       -v     Verbose mode + +       -h, --help +              Print help + +       --version +              Print version + +       The last bootloader V2.3 from Aerotech needs to be installed first to use Serial number features. +       Each sub options have to be separate with a comma without blank. + +EXAMPLES +       aeroup -t /dev/ttyACM0 +       aeroup -o /dev/ttyACM0 -o /dev/ttyACM1 -t /dev/ttyACM3         aeroup -c 255,69,255,/dev/ttyACM0 27,3,7,/dev/ttyACM1         aeroup -S 0x0b01/dev/ttyACM0         aeroup -G /dev/ttyACM0 @@ -55,13 +85,11 @@ SEE ALSO         AeroUp project page : https://github.com/LaurentBa/AeroUp         AeroWrite project page : https://github.com/LaurentBa/AeroWrite -BUGS -       No known bugs. -  AUTHOR -       Laurent Barattero (laurent@larueluberlu.net.in) +       Written by Laurent Barattero (laurent@larueluberlu.net.in) + -0.8                                                                             December 2013                                                                          <B>man(1)</B> +0.8                                 December 2013                              <B>man(1)</B>  </PRE>  <HR>  <ADDRESS> diff --git a/man/aeroup.man.txt b/man/aeroup.man.txt index 9e88efc..7b93858 100644 --- a/man/aeroup.man.txt +++ b/man/aeroup.man.txt @@ -1,4 +1,4 @@ -man(1)                                                                         AeroUp man page                                                                         man(1) +man(1)                             AeroUp man page                             man(1) @@ -7,13 +7,15 @@ NAME  SYNOPSIS -       aeroup  [-t  serialPort]  [-o  serialPort]  [-c red,green,blue,serialPort] [-G serialPort] [-S serialNumber,serialPort] [-i gloFile] [-u gloFile,serialPort] [-U gloc‐ -       File,serialPort] [-P] [-v] [-h] +       aeroup  [-t  serialPort]  [-o  serialPort]  [-c red,green,blue,serialPort] [-G +       serialPort] [-S serialNumber,serialPort] [-i gloFile] [-u  gloFile,serialPort] +       [-U glocFile,serialPort] [-P] [-v] [-h]  DESCRIPTION -       AeroUp is an open source command line tool to use with Ultimate (programmable light sequencing juggling props) from Aerotech Projects. +       AeroUp  is  an open source command line tool to control Ultimate (programmable +       light sequencing juggling props) from Aerotech Projects.  OPTIONS @@ -27,7 +29,6 @@ OPTIONS         -c, --color=red,green,blue,serialPort                Send a color command on dev serialPort. -              Each sub options have to be separate with a comma without blank.                Colors red, green, blue can be hexadecimal or decimal value in range of [0-255]                hex value have to begin with 0x. @@ -36,24 +37,57 @@ OPTIONS                get serial number on dev serialPort, and print it to standard output. +         -S, --setSerial=serialNumber,serialPort                Set serialNumber on dev serialPort. -              32 bits value can be writen in hexadecimal (0x#) binary (0b#) or decimal (#). +              32 bits value can be writen in hexadecimal (0x#) or decimal (#).         -i, --verify=gloFile                Verify that syntax glo file is valid -       -u, --verify=gloFile,serialPort -              Verify that syntax glo file is valid and if this is the case upload it on dev serialPort +       -u, --uploadGlo=gloFile,serialPort +              Verify that syntax glo file is valid and if this is the case upload  it +              on dev serialPort + + + +       -k --symlink +              return  the  serial  name  used as symlink of kernel name by udev (work +              with linux only). see the improved  management  driver  section  below. +              But  you can also use this command to retrieve an more readable id than +              serial number. + + +       Improved management driver (linux only) +              note: you may need to update to last   bootloader  (aeroup  was  tested +              with  Club_Ball_Poi_V2.3.hex).  you 'll find it on the Aerotech ltd web +              page. + +              To use the system management driver, you first need to set the apropri‐ +              ate  serial  number in your props with the --setSerial option. (See the +              address table belowx).  And put the file aeroup.rule to your udev rules +              directory  if  it  wasn't done during installation.  When you plug your +              props you should now have a corresponding symlink to your  /dev  direc‐ +              tory. + +              ================================================ +                Props | Range adress  | id char | Symlinks +              ================================================ +                Ball  | 0.0.98.0/24   | b       | /dev/Ball# +                Staff | 0.0.115.0/24  | s       | /dev/Staff# +                Club  | 0.0.99.0/24   | c       | /dev/Club# +                Poi   | 0:0:112:0/24  | p       | /Poi/Poi# +              ================================================ +         -P, --thread                Multithread mode, not implemented yet... -       -u, --verify=glocFile,serialPort +       -U, --uploadGloc=glocFile,serialPort                not implemented yet... @@ -67,6 +101,10 @@ OPTIONS         --version                Print version +       The last bootloader V2.3 from Aerotech needs to be installed first to use Serial number features. +       Each sub options have to be separate with a comma without blank. + +  EXAMPLES         aeroup -t /dev/ttyACM0 @@ -81,15 +119,23 @@ SEE ALSO         AeroUp project page : https://github.com/LaurentBa/AeroUp         AeroWrite project page : https://github.com/LaurentBa/AeroWrite +AUTHOR +       Written by Laurent Barattero (laurent@larueluberlu.net.in) + + +COPYRIGHT +       Copyright © 2013 BARATTERO Laurent License GPLv3+: GNU GPL  version 3 or later +       <http://gnu.org/licenses/gpl.html>. +       This  is  free software: you are free to change and redistribute it.  There is +       NO WARRANTY, to the extent permitted by law. + + + -BUGS -       No known bugs. -AUTHOR -       Laurent Barattero (laurent@larueluberlu.net.in) -0.8                                                                             December 2013                                                                          man(1) +0.8                                 December 2013                              man(1) diff --git a/src/Makefile.am b/src/Makefile.am index bf11705..26da352 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,8 +11,7 @@ ext_src += seriallinux.cpp  #echo have not boost  endif -aeroup_SOURCES = \ -								 main.cpp \ +aeroup_SOURCES = main.cpp \  								 ultimate.cpp \  								 serialprop.cpp \  								 optmanager.cpp \ @@ -20,9 +19,11 @@ aeroup_SOURCES = \  								 buffer.cpp \  								 buffermanager.cpp \  								 rules.cpp \ +								 symlink.cpp \  								 ${ext_src}  aeroup_CPPFLAGS = -W -Wall -std=c++11   aeroup_LDFLAGS =    #LIBS +=   #-DSERIAL_BOOST_LIB + diff --git a/src/Makefile.in b/src/Makefile.in index 25f19e1..51fb0db 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -95,8 +95,8 @@ am__installdirs = "$(DESTDIR)$(bindir)"  PROGRAMS = $(bin_PROGRAMS)  am__aeroup_SOURCES_DIST = main.cpp ultimate.cpp serialprop.cpp \  	optmanager.cpp gloseq.cpp buffer.cpp buffermanager.cpp \ -	rules.cpp serialboost.cpp regboost.cpp reglinux.cpp \ -	seriallinux.cpp +	rules.cpp symlink.cpp serialboost.cpp regboost.cpp \ +	reglinux.cpp seriallinux.cpp  @BOOST_TRUE@am__objects_1 = aeroup-serialboost.$(OBJEXT) \  @BOOST_TRUE@	aeroup-regboost.$(OBJEXT)  @BOOST_FALSE@am__objects_2 = aeroup-reglinux.$(OBJEXT) \ @@ -106,7 +106,7 @@ am_aeroup_OBJECTS = aeroup-main.$(OBJEXT) aeroup-ultimate.$(OBJEXT) \  	aeroup-serialprop.$(OBJEXT) aeroup-optmanager.$(OBJEXT) \  	aeroup-gloseq.$(OBJEXT) aeroup-buffer.$(OBJEXT) \  	aeroup-buffermanager.$(OBJEXT) aeroup-rules.$(OBJEXT) \ -	$(am__objects_3) +	aeroup-symlink.$(OBJEXT) $(am__objects_3)  aeroup_OBJECTS = $(am_aeroup_OBJECTS)  aeroup_LDADD = $(LDADD)  aeroup_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(aeroup_LDFLAGS) \ @@ -268,8 +268,7 @@ top_builddir = @top_builddir@  top_srcdir = @top_srcdir@  ext_src = $(am__append_1) $(am__append_2)  #echo have not boost -aeroup_SOURCES = \ -								 main.cpp \ +aeroup_SOURCES = main.cpp \  								 ultimate.cpp \  								 serialprop.cpp \  								 optmanager.cpp \ @@ -277,6 +276,7 @@ aeroup_SOURCES = \  								 buffer.cpp \  								 buffermanager.cpp \  								 rules.cpp \ +								 symlink.cpp \  								 ${ext_src}  aeroup_CPPFLAGS = -W -Wall -std=c++11  @@ -395,6 +395,7 @@ distclean-compile:  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aeroup-serialboost.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aeroup-seriallinux.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aeroup-serialprop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aeroup-symlink.Po@am__quote@  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aeroup-ultimate.Po@am__quote@  .cpp.o: @@ -523,6 +524,20 @@ aeroup-rules.obj: rules.cpp  @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@  @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aeroup_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aeroup-rules.obj `if test -f 'rules.cpp'; then $(CYGPATH_W) 'rules.cpp'; else $(CYGPATH_W) '$(srcdir)/rules.cpp'; fi` +aeroup-symlink.o: symlink.cpp +@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aeroup_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aeroup-symlink.o -MD -MP -MF $(DEPDIR)/aeroup-symlink.Tpo -c -o aeroup-symlink.o `test -f 'symlink.cpp' || echo '$(srcdir)/'`symlink.cpp +@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/aeroup-symlink.Tpo $(DEPDIR)/aeroup-symlink.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='symlink.cpp' object='aeroup-symlink.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aeroup_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aeroup-symlink.o `test -f 'symlink.cpp' || echo '$(srcdir)/'`symlink.cpp + +aeroup-symlink.obj: symlink.cpp +@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aeroup_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aeroup-symlink.obj -MD -MP -MF $(DEPDIR)/aeroup-symlink.Tpo -c -o aeroup-symlink.obj `if test -f 'symlink.cpp'; then $(CYGPATH_W) 'symlink.cpp'; else $(CYGPATH_W) '$(srcdir)/symlink.cpp'; fi` +@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/aeroup-symlink.Tpo $(DEPDIR)/aeroup-symlink.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='symlink.cpp' object='aeroup-symlink.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aeroup_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o aeroup-symlink.obj `if test -f 'symlink.cpp'; then $(CYGPATH_W) 'symlink.cpp'; else $(CYGPATH_W) '$(srcdir)/symlink.cpp'; fi` +  aeroup-serialboost.o: serialboost.cpp  @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(aeroup_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT aeroup-serialboost.o -MD -MP -MF $(DEPDIR)/aeroup-serialboost.Tpo -c -o aeroup-serialboost.o `test -f 'serialboost.cpp' || echo '$(srcdir)/'`serialboost.cpp  @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/aeroup-serialboost.Tpo $(DEPDIR)/aeroup-serialboost.Po diff --git a/src/buffer.cpp b/src/buffer.cpp index 9c0ffec..d342c30 100644 --- a/src/buffer.cpp +++ b/src/buffer.cpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2   + *        Version:  0.3.0.1     *        Created:  28/12/2013 07:06:20   *       Revision:  none   *       Compiler:  gcc diff --git a/src/buffer.hpp b/src/buffer.hpp index eae7080..538dfce 100644 --- a/src/buffer.hpp +++ b/src/buffer.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  28/12/2013 07:01:58   *       Revision:  none   *       Compiler:  gcc diff --git a/src/buffermanager.cpp b/src/buffermanager.cpp index 72ae576..46d412f 100644 --- a/src/buffermanager.cpp +++ b/src/buffermanager.cpp @@ -22,7 +22,7 @@   *    Description:  take the parsed, tokenized lines and manage them.   *                  send also some rules test   * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  30/12/2013 12:12:46   *       Revision:  none   *       Compiler:  gcc diff --git a/src/buffermanager.hpp b/src/buffermanager.hpp index 0b14781..2042329 100644 --- a/src/buffermanager.hpp +++ b/src/buffermanager.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  30/12/2013 12:07:43   *       Revision:  none   *       Compiler:  gcc diff --git a/src/define_ultimate_fct.h b/src/define_ultimate_fct.h index 36fe030..85450ba 100644 --- a/src/define_ultimate_fct.h +++ b/src/define_ultimate_fct.h @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  30/12/2013 12:50:40   *       Revision:  none   *       Compiler:  gcc diff --git a/src/global.hpp b/src/global.hpp index be20d98..da114c1 100644 --- a/src/global.hpp +++ b/src/global.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  20/12/2013 00:09:35   *       Revision:  none   *       Compiler:  gcc diff --git a/src/gloseq.cpp b/src/gloseq.cpp index 370b522..7bdf70a 100644 --- a/src/gloseq.cpp +++ b/src/gloseq.cpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  27/12/2013 10:38:49   *       Revision:  none   *       Compiler:  gcc diff --git a/src/gloseq.hpp b/src/gloseq.hpp index 3487f6b..83d80d0 100644 --- a/src/gloseq.hpp +++ b/src/gloseq.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  27/12/2013 10:40:44   *       Revision:  none   *       Compiler:  gcc diff --git a/src/main.cpp b/src/main.cpp index 920a89b..68d919f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,7 +23,7 @@   *                  lib getopt needed this is for unix users   *   * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  20/12/2013 00:57:44   *       Revision:  none   *       Compiler:  gcc @@ -80,6 +80,7 @@ main ( int argc, char *argv[] )        {"verify", required_argument,    NULL, 'i'},        {"uploadGlo", required_argument, NULL, 'u'},        {"uploadGloc", no_argument,      NULL, 'U'}, +      {"symlink", no_argument,         NULL, 'k'},        {"verbose", no_argument,         NULL, 'v'},        {"thread", no_argument,          NULL,  1 },        {"version", no_argument,     &version,  1 }, @@ -88,7 +89,7 @@ main ( int argc, char *argv[] )      };      /* getopt_long stores the option index here. */      int option_index = 0; -    c = getopt_long (argc, argv, "o:t:c:G:S:u:U:i:vh", +    c = getopt_long (argc, argv, "o:t:c:G:S:u:U:k:i:vh",                       long_options, &option_index);      /* Detect the end of the options. */ @@ -145,6 +146,10 @@ main ( int argc, char *argv[] )         manager.subRoutine(FLAG_UP_GLOC);         break; +     case 'k': +       manager.addItemSymlink(optarg); +       break; +       case 'v':         VERBOSE_AERO = true;         break; @@ -196,6 +201,12 @@ main ( int argc, char *argv[] )    {      return(EXIT_FAILURE);    } +  catch( Symlink::Bad_Symlink ) +  { +    cerr << "Error : Bad Symlink input\n" +         << "'$man aeroup' section 'Improved management driver' may be help you\n"; +    return(EXIT_FAILURE); +  }    catch(...)    {      //return(EXIT_FAILURE); @@ -221,14 +232,16 @@ aeroHelp()         << "  -c, --color=R,G,B,serialPort              Send a color command on dev serialPort.\n"         << "                                            R,G,B can be hex (0x#), dec (#) value,\n"         << "                                            in range of [0-255] (8bit).\n" -       << "  -G, --getSerial=serialPort                get serial number on dev serialPort, and print it to standard output.\n" +       << "  -G, --getSerial=serialPort                Get serial number on dev serialPort, and print it to standard output.\n"         << "  -S, --setSerial=serialNumber,serialPort   Set serialNumber on dev serialPort. the 32 bits serialNumber value\n"         << "                                            can be writen in hex (0x#) or dec (#).\n"         << "  -i, --verify=gloFile                      Verify that syntax glo file is valid.\n" -       << "  -u, --uploadGloc=gloFile,serialPort       Verify that syntax glo file is valid, and if this is the case\n" +       << "  -k --symlink                              Return the serial name used as symlink of kernel name by udev.\n"  +       << "                                            More info in the AeroUp man.\n" +       << "  -u, --uploadGloc=gloFile,serialPort       Verify that syntax glo file is valid, and if this is the case,\n"         << "                                            upload it on dev serialPort.\n"         << "  -P, --thread                              Multithread mode, not implemented yet...\n" -       << "  -U, --uploadGloc=glocFile,serialPort      not implemented yet...\n" +       << "  -U, --uploadGloc=glocFile,serialPort      Not implemented yet...\n"         << "  -v                                        Verbose mode.\n"         << "  -h, --help                                Print help.\n"         << "      --version                             Print version.\n\n" diff --git a/src/main.hpp b/src/main.hpp index d66dfff..351cd10 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  21/12/2013 03:56:20   *       Revision:  none   *       Compiler:  gcc diff --git a/src/optmanager.cpp b/src/optmanager.cpp index 9ea843f..6a82787 100644 --- a/src/optmanager.cpp +++ b/src/optmanager.cpp @@ -27,7 +27,7 @@   *                  for the time being, the value is set to max.   *                  we could test string before conversion.   * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  23/12/2013 23:31:46   *       Revision:  none   *       Compiler:  gcc @@ -112,6 +112,13 @@ OptManager::start()      sendGetSerial(*iter);    } +  // Symlink +  for (vector<string>::iterator iter = symlinkList.begin(); +                      iter != symlinkList.end(); ++iter) +  { +    sendSymlink(*iter); +  } +    // Set serial number    for (vector<optSerial>::iterator iter = setSerialList.begin();                        iter != setSerialList.end(); ++iter) @@ -179,6 +186,20 @@ OptManager::sendGetSerial( std::string port_name)  }  /* + *      Method:  OptManager :: sendSymlink + */ +  void  +OptManager::sendSymlink( std::string port_name) +{ +  string sym_out; +  Ultimate prop(port_name); +  string serial_number = prop.getSerial(); +  sym_out = Symlink::getSym(serial_number); +  cout << sym_out << endl; + +           +} +/*   *      Method:  OptManager :: sendSetSerial   */    void diff --git a/src/optmanager.hpp b/src/optmanager.hpp index 3252a91..2b89933 100644 --- a/src/optmanager.hpp +++ b/src/optmanager.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  23/12/2013 22:59:22   *       Revision:  none   *       Compiler:  gcc @@ -39,9 +39,11 @@  #include <getopt.h>  #include <string>  #include <vector> +  #include "global.hpp"  #include "ultimate.hpp"  #include "gloInterface.hpp" +#include "symlink.hpp"  #define MAX_LEN_OPT 2 @@ -50,6 +52,7 @@  #define FLAG_UP_GLOC  0x4  #define FLAG_COLOR    0x8  #define FLAG_VERIFY   0x10 +#define FLAG_SYMLINK  0x20  /*   *        Class:  OptManager @@ -74,6 +77,9 @@ class OptManager      void addItemVerify(std::string glo_file)                  {verifyList.push_back(glo_file);} +    void addItemSymlink(std::string port_name) +                {symlinkList.push_back(port_name);} +      void subRoutine(const short int FLAG);    private: @@ -82,6 +88,7 @@ class OptManager      void sendStart(std::string port_name);      void sendColor(uint8_t red, uint8_t green, uint8_t blue, std::string port_name);      void sendGetSerial(std::string port_name);  +    void sendSymlink(std::string port_name);       void sendSetSerial(uint32_t i_serialNumber, std::string port);      void sendVerify(std::string fileName);      void sendUpGlo(std::string fileName, std::string port); @@ -134,6 +141,7 @@ class OptManager      std::vector<std::string> verifyList;       std::vector<optSerial> setSerialList;       std::vector<std::string> getSerialList; +    std::vector<std::string> symlinkList;      // end of Structures and variables for opts containers   }; /* -----  end of class OptManager  ----- */ diff --git a/src/regboost.cpp b/src/regboost.cpp index bf3cf87..453bf08 100644 --- a/src/regboost.cpp +++ b/src/regboost.cpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  19/12/2013 05:22:37   *       Revision:  none   *       Compiler:  gcc @@ -34,7 +34,7 @@  using namespace std; -using namespace boost; +//using namespace boost;  RegBoost::RegBoost (  )  { @@ -47,7 +47,7 @@ RegBoost::isValidSyntax ( string &rline )  {    for (int i = 0; i < REG_TAB_LEN; i++)    { -    if ( regex_match(rline.begin(), rline.end(), reg_tab[i]) )  +    if ( boost::regex_match(rline.begin(), rline.end(), reg_tab[i]) )       {        #ifdef DEBUG        cout << rline << " -> ok" << endl; diff --git a/src/regboost.hpp b/src/regboost.hpp index 956be25..3fe5c80 100644 --- a/src/regboost.hpp +++ b/src/regboost.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  19/12/2013 05:23:16   *       Revision:  none   *       Compiler:  gcc diff --git a/src/reglinux.cpp b/src/reglinux.cpp index 854d1b4..60d3f20 100644 --- a/src/reglinux.cpp +++ b/src/reglinux.cpp @@ -21,7 +21,7 @@   *   *    Description:  Regex lib (linux version)    * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  18/01/2014 01:16:04   *       Revision:  none   *       Compiler:  gcc diff --git a/src/reglinux.hpp b/src/reglinux.hpp index 16ffd43..742adcc 100644 --- a/src/reglinux.hpp +++ b/src/reglinux.hpp @@ -21,7 +21,7 @@   *   *    Description:  Regex lib (linux version)   * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  18/01/2014 01:16:31   *       Revision:  none   *       Compiler:  gcc diff --git a/src/rules.cpp b/src/rules.cpp index 741a2cd..c209fba 100644 --- a/src/rules.cpp +++ b/src/rules.cpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  31/12/2013 18:33:14   *       Revision:  none   *       Compiler:  gcc diff --git a/src/rules.hpp b/src/rules.hpp index a658fce..3c7c7e8 100644 --- a/src/rules.hpp +++ b/src/rules.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  31/12/2013 18:32:35   *       Revision:  none   *       Compiler:  gcc diff --git a/src/ruleserror.hpp b/src/ruleserror.hpp index d84192d..3bf3d56 100644 --- a/src/ruleserror.hpp +++ b/src/ruleserror.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  06/01/2014 10:04:32   *       Revision:  none   *       Compiler:  gcc diff --git a/src/serialboost.cpp b/src/serialboost.cpp index 821fed8..bd55630 100644 --- a/src/serialboost.cpp +++ b/src/serialboost.cpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  20/12/2013 00:06:15   *       Revision:  none   *       Compiler:  gcc @@ -32,7 +32,7 @@  #include <serialboost.hpp>  using namespace std; -using namespace boost; +//using namespace boost;  /* @@ -53,7 +53,7 @@ SerialBoost::SerialBoost ( std::string port_name ):          throw;    } -  typedef asio::serial_port_base asio_serial; +  typedef boost::asio::serial_port_base asio_serial;    port.set_option(asio_serial::baud_rate(19200));    port.set_option(asio_serial::flow_control(asio_serial::flow_control::none));    port.set_option(asio_serial::parity( asio_serial::parity::none)); @@ -88,7 +88,7 @@ SerialBoost::~SerialBoost (  )    void  SerialBoost::sendChar(char c)  { -    port.write_some(asio::buffer(&c, 1)); +    port.write_some(boost::asio::buffer(&c, 1));  }  /* @@ -100,7 +100,7 @@ SerialBoost::sendChar(char c)    void  SerialBoost::sendChar(unsigned char c)  { -    port.write_some(asio::buffer(&c, 1)); +    port.write_some(boost::asio::buffer(&c, 1));  } @@ -117,7 +117,7 @@ SerialBoost::sendChar(unsigned char c)    void  SerialBoost::sendString(char* s, int nb_char)  { -  port.write_some(asio::buffer(s, nb_char)); +  port.write_some(boost::asio::buffer(s, nb_char));  }  /* @@ -129,7 +129,7 @@ SerialBoost::sendString(char* s, int nb_char)    void  SerialBoost::sendString(unsigned char* s, int nb_char)  { -  port.write_some(asio::buffer(s, nb_char)); +  port.write_some(boost::asio::buffer(s, nb_char));  }  /*                @@ -141,7 +141,7 @@ SerialBoost::sendString(unsigned char* s, int nb_char)    void  SerialBoost::sendString(const char* s, int nb_char)  { -  port.write_some(asio::buffer(s, nb_char)); +  port.write_some(boost::asio::buffer(s, nb_char));  }  /*                @@ -153,7 +153,7 @@ SerialBoost::sendString(const char* s, int nb_char)    void   SerialBoost::sendString(string s)  { -  port.write_some(asio::buffer(s.c_str(),s.size())); +  port.write_some(boost::asio::buffer(s.c_str(),s.size()));  }  /**  @@ -173,7 +173,7 @@ SerialBoost::readLine()    string result;      for(;;)      { -      asio::read(port, asio::buffer(&c,1)); +      boost::asio::read(port, boost::asio::buffer(&c,1));        switch(c)        {          case '\r': @@ -194,7 +194,7 @@ SerialBoost::readLine()   */  void SerialBoost::getString(char* s, int nb_char)  { -  asio::read(port, asio::buffer(s, nb_char)); +  boost::asio::read(port, boost::asio::buffer(s, nb_char));  } diff --git a/src/serialboost.hpp b/src/serialboost.hpp index 0b5dd9d..18aa1a6 100644 --- a/src/serialboost.hpp +++ b/src/serialboost.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  20/12/2013 00:06:28   *       Revision:  none   *       Compiler:  gcc diff --git a/src/seriallinux.cpp b/src/seriallinux.cpp index 27ba784..9d20618 100644 --- a/src/seriallinux.cpp +++ b/src/seriallinux.cpp @@ -22,7 +22,7 @@   *    Description:  Serial lib linux (termios version)   *                  used if haven't boost   * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  17/01/2014 03:31:32   *       Revision:  none   *       Compiler:  gcc diff --git a/src/seriallinux.hpp b/src/seriallinux.hpp index 82b7475..b515725 100644 --- a/src/seriallinux.hpp +++ b/src/seriallinux.hpp @@ -22,7 +22,7 @@   *    Description:  Serial lib linux (termios version)   *                  used if haven't boost   * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  17/01/2014 03:31:35   *       Revision:  none   *       Compiler:  gcc diff --git a/src/serialprop.cpp b/src/serialprop.cpp index 309a75c..bbcef9a 100644 --- a/src/serialprop.cpp +++ b/src/serialprop.cpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  21/12/2013 01:39:53   *       Revision:  none   *       Compiler:  gcc diff --git a/src/serialprop.hpp b/src/serialprop.hpp index d335c46..a78a0b2 100644 --- a/src/serialprop.hpp +++ b/src/serialprop.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  19/12/2013 23:25:14   *       Revision:  none   *       Compiler:  gcc diff --git a/src/symlink.cpp b/src/symlink.cpp new file mode 100644 index 0000000..2d1216a --- /dev/null +++ b/src/symlink.cpp @@ -0,0 +1,118 @@ +/* + *       Filename:  Symlink.cpp + * + *    Description:  Return a beautiful Symlink for udev + * + *        Version:  0.3.0.1 + *        Created:  19/01/2014 14:51:05 + *       Revision:  none + *       Compiler:  gcc + * + *         Author:  BARATTERO Laurent, laurentba<at>larueluberlu.net + *   Organization:  La rue Luberlu + */ + +#include "symlink.hpp" + +static  uint32_t serialNumber; +static  uint8_t id_prob; +static  uint8_t num; +static  std::stringstream ss; + +const uint8_t BALL  = 0x62; // 'b' +const uint8_t STAFF = 0x73; // 's' +const uint8_t CLUB  = 0x63; // 'c' +const uint8_t POI   = 0x70; // 'p' +const uint32_t PROB_MASK = 0x0000ff00; +const uint32_t NUM_MASK  = 0x000000ff; + + /*  +  *         Name:  Symlink::getSym +  *  Description:  return Symlink  +  */ +  std::string +Symlink::getSym(std::string serial_str) +{ +  /* test entry */ +  if(EOF == sscanf(serial_str.c_str(), "%d", &serialNumber)) +  { +    throw Symlink::Bad_Symlink(); +  } +  //if (serialNumber > 0xffffffff) +  if (serialNumber > 0x0) +  { +    throw Symlink::Bad_Symlink(); +  } + +  ss << std::hex << serial_str ; +  ss >> serialNumber; + +  // comment +  //std::cout << serial_str; +  //std::cout << serialNumber; + +  if((serialNumber & 0xffff0000) != 0) +    Symlink::badSerNum(); + +  id_prob = ((PROB_MASK & serialNumber) >> 8 ); +  num = (NUM_MASK & serialNumber); +   + +  ss << num; +  std::string x; +  ss >> x; +  std::cout << x; +   +  // now we use serial_str for output +  serial_str = Symlink::whatProp(id_prob); +  serial_str += std::to_string(num); + +  //std::cout << serial_str; +     +  return serial_str; +} + + + /*  +  *         Name:  Symlink::whatProp +  *  Description:  send error ( for future)  +  */ +  void +Symlink::badSerNum() +{ +  throw Symlink::Bad_Symlink(); +   +} + + + /*  +  *         Name:  Symlink::whatProp +  *  Description:  addr to symlink  +  */ +  std::string +Symlink::whatProp(uint8_t id) +{ +  switch (id) +  { +    case BALL:	 +      return "Ball"; +    break; + +    case STAFF:	 +      return "Staff"; +    break; + +    case CLUB: +      return "Club"; +    break; + +    case POI:	 +      return "Poi"; +    break; + +    default:	 +    //UdevLink::badSerNum(); +      return "AeroProb"; +    break; +  }	/* -----  end switch  ----- */ +} diff --git a/src/symlink.hpp b/src/symlink.hpp new file mode 100644 index 0000000..6bfe035 --- /dev/null +++ b/src/symlink.hpp @@ -0,0 +1,48 @@ +/* + *       Filename:  Symlink.hpp + * + *    Description:  Return a beautiful Symlink for udev + * + *        Version:  0.3.0.1 + *        Created:  19/01/2014 14:51:08 + *       Revision:  none + *       Compiler:  gcc + * + *         Author:  BARATTERO Laurent, laurentba<at>larueluberlu.net + *   Organization:  La rue Luberlu + */ + +#ifndef  Symlink_INC +#define  Symlink_INC + +#include <stdlib.h> +#include <string> +#include <exception> +#include <sstream>  +#include <unistd.h> +#include <iostream> + +/*  + *         Name:  Symlink + *  Description:  Symlink declaration + */ +namespace Symlink +{ +//  extern uint16_t BALL; +//  extern uint16_t STAFF; +//  extern uint16_t CLUB; +//  extern uint16_t POI; + + + +//  const uint32_t PROB_MASK; +//  const uint32_t NUM_MASK; + +  std::string getSym(std::string serial_str); +  std::string whatProp(uint8_t id); +  void badSerNum(); + +  class Bad_Symlink{}; +} + +#endif   /* ----- #ifndef symlink_INC  ----- */ diff --git a/src/ultimate.cpp b/src/ultimate.cpp index 63df51e..0293ea2 100644 --- a/src/ultimate.cpp +++ b/src/ultimate.cpp @@ -21,7 +21,7 @@   *   *    Description:  Interface for Ultimate props   * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  19/12/2013 20:28:22   *       Revision:  none   *       Compiler:  gcc diff --git a/src/ultimate.hpp b/src/ultimate.hpp index 355bd14..77c5055 100644 --- a/src/ultimate.hpp +++ b/src/ultimate.hpp @@ -21,7 +21,7 @@   *   *    Description:     * - *        Version:  0.2 + *        Version:  0.3.0.1   *        Created:  19/12/2013 20:28:34   *       Revision:  none   *       Compiler:  gcc diff --git a/udev/60-aeroup.rules b/udev/60-aeroup.rules new file mode 100644 index 0000000..a860e8d --- /dev/null +++ b/udev/60-aeroup.rules @@ -0,0 +1,7 @@ +ATTRS{idProduct}=="000a", PROGRAM="/usr/local/bin/aeroup -k /dev/%k", SYMLINK+="%c" + +#PROGRAM="/usr/local/bin/aeroup -G /dev/%k", SYMLINK+="%c" +#ATTRS{idProduct}=="000a" +#ATTRS{idVendor}=="04d8" +#ATTRS{manufacturer}=="Microchip Technology Inc." +#ATTRS{product}=="Aerotech Glo-Ultimate    " diff --git a/udev/Makefile.am b/udev/Makefile.am new file mode 100644 index 0000000..437a621 --- /dev/null +++ b/udev/Makefile.am @@ -0,0 +1,8 @@ +#IS_UDEV_DIR=$(call test uname -e /etc/udev/rules.d) +echo 'print: ; @echo "$(VAR)"' | make -f Makefile -f - print + +if UDEV +udevdir=/etc/udev/rules.d +udev_DATA=60-aeroup.rules +endif + | 
