summaryrefslogtreecommitdiffstats
path: root/servers
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2014-01-13 05:08:51 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2014-01-13 05:08:51 -0600
commitc912b0f1d3994cde07d472e2c53f0375518a74df (patch)
treeb2def2445d01a2f8151c54c855c5db252b0d2e74 /servers
parent06f302400e33d8f1b8175a08ccd6630b7ae4ee40 (diff)
downloadulab-c912b0f1d3994cde07d472e2c53f0375518a74df.tar.gz
ulab-c912b0f1d3994cde07d472e2c53f0375518a74df.zip
Add serial console server
Diffstat (limited to 'servers')
-rw-r--r--servers/logic_analyzer_server_lin/src/logic_analyzer_server.cpp46
-rw-r--r--servers/serial_server_lin/AUTHORS1
-rw-r--r--servers/serial_server_lin/COPYING340
-rw-r--r--servers/serial_server_lin/ChangeLog1
-rw-r--r--servers/serial_server_lin/INSTALL167
-rw-r--r--servers/serial_server_lin/Makefile.am22
-rw-r--r--servers/serial_server_lin/Makefile.cvs10
-rw-r--r--servers/serial_server_lin/NEWS0
-rw-r--r--servers/serial_server_lin/README0
-rw-r--r--servers/serial_server_lin/TODO0
m---------servers/serial_server_lin/admin0
m---------servers/serial_server_lin/cmake0
-rw-r--r--servers/serial_server_lin/config.h.in262
-rw-r--r--servers/serial_server_lin/configure.files2
-rw-r--r--servers/serial_server_lin/configure.in.in6
-rw-r--r--servers/serial_server_lin/debian/changelog5
-rw-r--r--servers/serial_server_lin/debian/compat1
-rw-r--r--servers/serial_server_lin/debian/control12
-rw-r--r--servers/serial_server_lin/debian/copyright31
-rwxr-xr-xservers/serial_server_lin/debian/rules24
-rw-r--r--servers/serial_server_lin/debian/ulab-serialserver.init108
-rw-r--r--servers/serial_server_lin/doc/Makefile.am6
-rw-r--r--servers/serial_server_lin/doc/en/Makefile.am2
-rw-r--r--servers/serial_server_lin/po/Makefile.am2
-rw-r--r--servers/serial_server_lin/src/Makefile.am11
-rw-r--r--servers/serial_server_lin/src/main.cpp64
-rw-r--r--servers/serial_server_lin/src/serial_server.cpp353
-rw-r--r--servers/serial_server_lin/src/serial_server.h99
-rw-r--r--servers/serial_server_lin/stamp-h.in0
-rw-r--r--servers/serial_server_lin/subdirs3
30 files changed, 1555 insertions, 23 deletions
diff --git a/servers/logic_analyzer_server_lin/src/logic_analyzer_server.cpp b/servers/logic_analyzer_server_lin/src/logic_analyzer_server.cpp
index 1e846d5..a0f764c 100644
--- a/servers/logic_analyzer_server_lin/src/logic_analyzer_server.cpp
+++ b/servers/logic_analyzer_server_lin/src/logic_analyzer_server.cpp
@@ -234,36 +234,36 @@ void LogicAnalyzerSocket::commandLoop() {
}
writeEndOfFrame();
}
- }
- else if (instrumentCommand == "GETTRACESAMPLECOUNT") { // Want to get number of samples in a trace
- TQ_INT32 samples = gpmc_sample_count();
- if (samples > 0) {
- ds << TQString("ACK");
- ds << samples;
- writeEndOfFrame();
- }
- else {
- ds << TQString("NCK");
- writeEndOfFrame();
+ else if (instrumentCommand == "GETTRACESAMPLECOUNT") { // Want to get number of samples in a trace
+ TQ_INT32 samples = gpmc_sample_count();
+ if (samples > 0) {
+ ds << TQString("ACK");
+ ds << samples;
+ writeEndOfFrame();
+ }
+ else {
+ ds << TQString("NCK");
+ writeEndOfFrame();
+ }
}
- }
- else if (instrumentCommand == "GETNUMBEROFCHANNELS") { // Want the number of channels available
- TQ_INT32 channels = gpmc_channel_count();
- if (channels > 0) {
- ds << TQString("ACK");
- ds << channels;
- writeEndOfFrame();
+ else if (instrumentCommand == "GETNUMBEROFCHANNELS") { // Want the number of channels available
+ TQ_INT32 channels = gpmc_channel_count();
+ if (channels > 0) {
+ ds << TQString("ACK");
+ ds << channels;
+ writeEndOfFrame();
+ }
+ else {
+ ds << TQString("NCK");
+ writeEndOfFrame();
+ }
}
else {
+ printf("[WARNING] Received unknown command %s from host %s\n\r", instrumentCommand.ascii(), m_remoteHost.ascii()); fflush(stdout);
ds << TQString("NCK");
writeEndOfFrame();
}
}
- else {
- printf("[WARNING] Received unknown command %s from host %s\n\r", instrumentCommand.ascii(), m_remoteHost.ascii()); fflush(stdout);
- ds << TQString("NCK");
- writeEndOfFrame();
- }
transferred_data = true;
}
diff --git a/servers/serial_server_lin/AUTHORS b/servers/serial_server_lin/AUTHORS
new file mode 100644
index 0000000..ad19bbe
--- /dev/null
+++ b/servers/serial_server_lin/AUTHORS
@@ -0,0 +1 @@
+Timothy Pearson <kb9vqf@pearsoncomputing.net>
diff --git a/servers/serial_server_lin/COPYING b/servers/serial_server_lin/COPYING
new file mode 100644
index 0000000..5b6e7c6
--- /dev/null
+++ b/servers/serial_server_lin/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/servers/serial_server_lin/ChangeLog b/servers/serial_server_lin/ChangeLog
new file mode 100644
index 0000000..323fd37
--- /dev/null
+++ b/servers/serial_server_lin/ChangeLog
@@ -0,0 +1 @@
+2012-05-17 - Initial Release \ No newline at end of file
diff --git a/servers/serial_server_lin/INSTALL b/servers/serial_server_lin/INSTALL
new file mode 100644
index 0000000..02a4a07
--- /dev/null
+++ b/servers/serial_server_lin/INSTALL
@@ -0,0 +1,167 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 4. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/servers/serial_server_lin/Makefile.am b/servers/serial_server_lin/Makefile.am
new file mode 100644
index 0000000..8a2284f
--- /dev/null
+++ b/servers/serial_server_lin/Makefile.am
@@ -0,0 +1,22 @@
+SUBDIRS = $(TOPSUBDIRS)
+
+$(top_srcdir)/configure.in: configure.in.in $(top_srcdir)/subdirs
+ cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure.in ;
+
+$(top_srcdir)/subdirs:
+ cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common subdirs
+
+$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in
+ @cd $(top_srcdir) && cat admin/acinclude.m4.in admin/libtool.m4.in > acinclude.m4
+
+MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files
+
+package-messages:
+ cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common package-messages
+ $(MAKE) -C po merge
+
+EXTRA_DIST = admin COPYING configure.in.in
+
+dist-hook:
+ cd $(top_distdir) && perl admin/am_edit -padmin
+ cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs
diff --git a/servers/serial_server_lin/Makefile.cvs b/servers/serial_server_lin/Makefile.cvs
new file mode 100644
index 0000000..4c0afd1
--- /dev/null
+++ b/servers/serial_server_lin/Makefile.cvs
@@ -0,0 +1,10 @@
+all:
+ @echo "This Makefile is only for the CVS repository"
+ @echo "This will be deleted before making the distribution"
+ @echo ""
+ $(MAKE) -f admin/Makefile.common cvs
+
+dist:
+ $(MAKE) -f admin/Makefile.common dist
+
+.SILENT:
diff --git a/servers/serial_server_lin/NEWS b/servers/serial_server_lin/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/servers/serial_server_lin/NEWS
diff --git a/servers/serial_server_lin/README b/servers/serial_server_lin/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/servers/serial_server_lin/README
diff --git a/servers/serial_server_lin/TODO b/servers/serial_server_lin/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/servers/serial_server_lin/TODO
diff --git a/servers/serial_server_lin/admin b/servers/serial_server_lin/admin
new file mode 160000
+Subproject bae6da3fa84fa5d9cce73cf89968d61f1766e91
diff --git a/servers/serial_server_lin/cmake b/servers/serial_server_lin/cmake
new file mode 160000
+Subproject d29f6d6b10fe1748c2a5fb1f9f2cdcecc473d35
diff --git a/servers/serial_server_lin/config.h.in b/servers/serial_server_lin/config.h.in
new file mode 100644
index 0000000..d6de502
--- /dev/null
+++ b/servers/serial_server_lin/config.h.in
@@ -0,0 +1,262 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to 1 if you have the <Carbon/Carbon.h> header file. */
+#undef HAVE_CARBON_CARBON_H
+
+/* Define if you have the CoreAudio API */
+#undef HAVE_COREAUDIO
+
+/* Define to 1 if you have the <crt_externs.h> header file. */
+#undef HAVE_CRT_EXTERNS_H
+
+/* Defines if your system has the crypt function */
+#undef HAVE_CRYPT
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have libjpeg */
+#undef HAVE_LIBJPEG
+
+/* Define if you have libpng */
+#undef HAVE_LIBPNG
+
+/* Define if you have a working libpthread (will enable threaded code) */
+#undef HAVE_LIBPTHREAD
+
+/* Define if you have libz */
+#undef HAVE_LIBZ
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if your system needs _NSGetEnviron to set up the environment */
+#undef HAVE_NSGETENVIRON
+
+/* Define if you have res_init */
+#undef HAVE_RES_INIT
+
+/* Define if you have the res_init prototype */
+#undef HAVE_RES_INIT_PROTO
+
+/* Define if you have a STL implementation by SGI */
+#undef HAVE_SGI_STL
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have strlcat */
+#undef HAVE_STRLCAT
+
+/* Define if you have the strlcat prototype */
+#undef HAVE_STRLCAT_PROTO
+
+/* Define if you have strlcpy */
+#undef HAVE_STRLCPY
+
+/* Define if you have the strlcpy prototype */
+#undef HAVE_STRLCPY_PROTO
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Suffix for lib directories */
+#undef KDELIBSUFF
+
+/* Define a safe value for MAXPATHLEN */
+#undef KDEMAXPATHLEN
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `char *', as computed by sizeof. */
+#undef SIZEOF_CHAR_P
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Defined if compiling without arts */
+#undef WITHOUT_ARTS
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+
+
+
+/*
+ * AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
+ * that defines bzero.
+ */
+
+#if defined(_AIX)
+#include <strings.h>
+#endif
+
+
+
+#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
+# include <sys/time.h>
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+
+
+
+#if !defined(HAVE_RES_INIT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+int res_init(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCAT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcat(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCPY_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcpy(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+/*
+ * On HP-UX, the declaration of vsnprintf() is needed every time !
+ */
+
+#if !defined(HAVE_VSNPRINTF) || defined(hpux)
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
+#ifdef __cplusplus
+extern "C"
+#endif
+int snprintf(char *str, size_t n, char const *fmt, ...);
+#endif
+
+
+
+#if defined(__SVR4) && !defined(__svr4__)
+#define __svr4__ 1
+#endif
+
+
+/* type to use in place of socklen_t if not defined */
+#undef kde_socklen_t
+
+/* type to use in place of socklen_t if not defined (deprecated, use
+ kde_socklen_t) */
+#undef ksize_t
diff --git a/servers/serial_server_lin/configure.files b/servers/serial_server_lin/configure.files
new file mode 100644
index 0000000..030bce8
--- /dev/null
+++ b/servers/serial_server_lin/configure.files
@@ -0,0 +1,2 @@
+./admin/configure.in.min
+configure.in.in
diff --git a/servers/serial_server_lin/configure.in.in b/servers/serial_server_lin/configure.in.in
new file mode 100644
index 0000000..18b1486
--- /dev/null
+++ b/servers/serial_server_lin/configure.in.in
@@ -0,0 +1,6 @@
+#MIN_CONFIG(3.2.0)
+
+AM_INIT_AUTOMAKE(autostart, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+
diff --git a/servers/serial_server_lin/debian/changelog b/servers/serial_server_lin/debian/changelog
new file mode 100644
index 0000000..002c848
--- /dev/null
+++ b/servers/serial_server_lin/debian/changelog
@@ -0,0 +1,5 @@
+ulab-serialserver (0.5-0ubuntu0) karmic; urgency=low
+
+ * Karmic rebuild
+
+ -- Timothy Pearson <kb9vqf@pearsoncomputing.net> Thu, 02 July 2009 16:08:00 -0600
diff --git a/servers/serial_server_lin/debian/compat b/servers/serial_server_lin/debian/compat
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/servers/serial_server_lin/debian/compat
@@ -0,0 +1 @@
+5
diff --git a/servers/serial_server_lin/debian/control b/servers/serial_server_lin/debian/control
new file mode 100644
index 0000000..76e7707
--- /dev/null
+++ b/servers/serial_server_lin/debian/control
@@ -0,0 +1,12 @@
+Source: ulab-serialserver
+Section: tde
+Priority: optional
+Maintainer: Timothy Pearson <kb9vqf@pearsoncomputing.net>
+Build-Depends: debhelper (>= 5), cdbs, tdelibs14-trinity-dev, libldap2-dev, libtdekrb-trinity-dev, libtqtrla-dev, automake, autoconf, libtool, libltdl-dev
+Standards-Version: 3.8.4
+
+Package: ulab-serialserver
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, libtqt3-mt-mysql
+Description: uLab Serial Server
+ uLab Serial Server
diff --git a/servers/serial_server_lin/debian/copyright b/servers/serial_server_lin/debian/copyright
new file mode 100644
index 0000000..540709e
--- /dev/null
+++ b/servers/serial_server_lin/debian/copyright
@@ -0,0 +1,31 @@
+This package was debianized by Timothy Pearson <kb9vqf@pearsoncomputing.net> on
+Thu, 17 May 2012 19:52:51 +0100.
+
+It was downloaded from http://www.trinitydesktop.org
+
+Upstream Author: Timothy Pearson <kb9vqf@pearsoncomputing.net>
+
+copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
+
+License:
+
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This package 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2012, Timothy Pearson <kb9vqf@pearsoncomputing.net> and
+is licensed under the GPL, see above.
+
diff --git a/servers/serial_server_lin/debian/rules b/servers/serial_server_lin/debian/rules
new file mode 100755
index 0000000..242fb2c
--- /dev/null
+++ b/servers/serial_server_lin/debian/rules
@@ -0,0 +1,24 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/simple-patchsys.mk
+include /usr/share/cdbs/1/class/autotools.mk
+include /usr/share/cdbs/1/rules/debhelper.mk
+
+DEB_CONFIGURE_INCLUDEDIR := /opt/trinity/include/tde
+DEB_CONFIGURE_MANDIR := /opt/trinity/share/man
+DEB_CONFIGURE_PREFIX := /opt/trinity
+DEB_CONFIGURE_INFODIR := /opt/trinity/share/info
+
+cdbs_configure_flags := --with-qt-dir=/usr/share/qt3 --disable-rpath --with-xinerama $(cdbs_kde_enable_final) $(cdbs_kde_enable_debug)
+
+post-patches:: debian/stamp-bootstrap
+
+debian/stamp-bootstrap:
+ ! [ -f /usr/share/libtool/ltmain.sh ] || \
+ cp -f /usr/share/libtool/ltmain.sh admin/ltmain.sh
+ ! [ -f /usr/share/libtool/config/ltmain.sh ] || \
+ cp -f /usr/share/libtool/config/ltmain.sh admin/ltmain.sh
+ cp -f /usr/share/aclocal/libtool.m4 admin/libtool.m4.in
+
+ make -f admin/Makefile.common cvs
+ touch debian/stamp-bootstrap
diff --git a/servers/serial_server_lin/debian/ulab-serialserver.init b/servers/serial_server_lin/debian/ulab-serialserver.init
new file mode 100644
index 0000000..b2c1e35
--- /dev/null
+++ b/servers/serial_server_lin/debian/ulab-serialserver.init
@@ -0,0 +1,108 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ulab-fpgaserver
+# Required-Start: $local_fs $remote_fs
+# Required-Stop: $local_fs $remote_fs
+# Should-Start: console-screen kbd acpid hal krb5-kdc nis
+# Should-Stop: console-screen kbd
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: uLab FPGA Server
+# Description: uLab FPGA Server
+### END INIT INFO
+# /etc/init.d/ulab-fpgaserver: start or stop the uLab FPGA Server
+#
+# description: uLab FPGA Server
+#
+
+. /lib/lsb/init-functions
+
+set -e
+
+PATH=/opt/trinity/bin:/usr/bin:/sbin:/usr/sbin:/bin
+DAEMON=/opt/trinity/bin/ulab_fpgaserver
+PIDFILE=/var/run/ulab_fpgaserver.pid
+UPGRADEFILE=/var/run/ulab_fpgaserver.upgrade
+
+DESC="uLab FPGA Server"
+
+# If we upgraded the daemon, we can't use the --exec argument to
+# start-stop-daemon since the inode will have changed. The risk here is that
+# in a situation where the daemon died, its pidfile was not cleaned up, and
+# some other process is now running under that pid, start-stop-daemon will send
+# signals to an innocent process. However, this seems like a corner case.
+# C'est la vie!
+if [ -e $UPGRADEFILE ]; then
+ SSD_ARGS="--pidfile $PIDFILE --startas $DAEMON"
+else
+ SSD_ARGS="--pidfile $PIDFILE --exec $DAEMON"
+fi
+
+stillrunning () {
+ if expr "$(cat /proc/$DAEMONPID/cmdline 2> /dev/null)" : "$DAEMON" > /dev/null 2>&1; then
+ true
+ else
+ # if the daemon does not remove its own pidfile, we will
+ rm -f $PIDFILE $UPGRADEFILE
+ false
+ fi;
+}
+
+case "$1" in
+ start)
+ log_action_begin_msg "Starting $DESC"
+ if start-stop-daemon --background --start --make-pidfile --quiet $SSD_ARGS -- $ARG; then
+ log_action_end_msg 0
+ else
+ log_warning_msg "already running"
+ log_action_end_msg 0
+ fi
+ ;;
+
+ restart)
+ /etc/init.d/ulab-fpgaserver stop
+ if [ -f $PIDFILE ]; then
+ if stillrunning; then
+ exit 1
+ fi
+ fi
+ /etc/init.d/ulab-fpgaserver start
+ ;;
+
+ reload)
+ log_action_begin_msg "Reloading $DESC"
+ if start-stop-daemon --stop --signal 1 --quiet $SSD_ARGS; then
+ log_action_end_msg 0
+ else
+ log_failure_msg "not running"
+ log_action_end_msg 1
+ fi
+ ;;
+
+ force-reload)
+ /etc/init.d/ulab-fpgaserver reload
+ ;;
+
+ stop)
+ log_action_begin_msg "Stopping $DESC"
+ if [ ! -f $PIDFILE ]; then
+ log_failure_msg "Not running ($PIDFILE not found)"
+ log_action_end_msg 0
+ exit 0
+ else
+ if start-stop-daemon --stop --quiet $SSD_ARGS; then
+ log_action_end_msg 0
+ else
+ log_failure_msg "not running"
+ log_action_end_msg 1
+ fi
+ fi
+ ;;
+
+ *)
+ echo "Usage: /etc/init.d/ulab-fpgaserver {start|stop|restart|reload|force-reload}"
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/servers/serial_server_lin/doc/Makefile.am b/servers/serial_server_lin/doc/Makefile.am
new file mode 100644
index 0000000..faa0ae8
--- /dev/null
+++ b/servers/serial_server_lin/doc/Makefile.am
@@ -0,0 +1,6 @@
+# the SUBDIRS is filled automatically by am_edit. If files are
+# in this directory they are installed into the english dir
+
+KDE_LANG = en
+KDE_DOCS = autostart
+SUBDIRS = $(AUTODIRS)
diff --git a/servers/serial_server_lin/doc/en/Makefile.am b/servers/serial_server_lin/doc/en/Makefile.am
new file mode 100644
index 0000000..e7a9eb0
--- /dev/null
+++ b/servers/serial_server_lin/doc/en/Makefile.am
@@ -0,0 +1,2 @@
+KDE_DOCS = ldap
+KDE_LANG = en
diff --git a/servers/serial_server_lin/po/Makefile.am b/servers/serial_server_lin/po/Makefile.am
new file mode 100644
index 0000000..898f985
--- /dev/null
+++ b/servers/serial_server_lin/po/Makefile.am
@@ -0,0 +1,2 @@
+POFILES = AUTO
+# noinst_HEADERS = ldap.pot
diff --git a/servers/serial_server_lin/src/Makefile.am b/servers/serial_server_lin/src/Makefile.am
new file mode 100644
index 0000000..643df79
--- /dev/null
+++ b/servers/serial_server_lin/src/Makefile.am
@@ -0,0 +1,11 @@
+INCLUDES= $(all_includes) $(KDE_INCLUDES)/tde -I/usr/include/sasl
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+
+bin_PROGRAMS = ulab_serialserver
+
+ulab_serialserver_SOURCES = main.cpp serial_server.cpp
+
+ulab_serialserver_METASOURCES = AUTO
+ulab_serialserver_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIB_QT) -lDCOP $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx $(LIB_TDEIO) -ltdetexteditor -ltdekrbsocket -ltqtrla
+
+KDE_OPTIONS = nofinal
diff --git a/servers/serial_server_lin/src/main.cpp b/servers/serial_server_lin/src/main.cpp
new file mode 100644
index 0000000..22810a0
--- /dev/null
+++ b/servers/serial_server_lin/src/main.cpp
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2014 by Timothy Pearson *
+ * kb9vqf@pearsoncomputing.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <pwd.h>
+#include <limits.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <tqdatetime.h>
+#include <tqfile.h>
+#include <tqdir.h>
+
+#include <tdeapplication.h>
+#include <tdestartupinfo.h>
+#include <tdecmdlineargs.h>
+#include <tdeaboutdata.h>
+#include <ksimpleconfig.h>
+
+#include "serial_server.h"
+
+static const char description[] = I18N_NOOP("uLab Serial Server");
+
+static const char version[] = "v0.0.1";
+
+int main(int argc, char *argv[])
+{
+ TDEAboutData aboutData( "ulab_serial_server", I18N_NOOP("uLab Serial Server"),
+ version, description, TDEAboutData::License_GPL,
+ "(c) 2014, Timothy Pearson");
+ aboutData.addAuthor("Timothy Pearson",0, "kb9vqf@pearsoncomputing.net");
+ TDECmdLineArgs::init( argc, argv, &aboutData );
+ TDEApplication::disableAutoDcopRegistration();
+
+ TDEApplication app(false, false);
+
+ TDEStartupInfo::appStarted();
+
+ KSimpleConfig config(TQDir::currentDirPath() + "/ulab_serialserver.conf", false);
+ config.setGroup("Server");
+ SerialServer serialsvr(0, config.readNumEntry("port", 4018), &config);
+ return app.exec();
+
+}
diff --git a/servers/serial_server_lin/src/serial_server.cpp b/servers/serial_server_lin/src/serial_server.cpp
new file mode 100644
index 0000000..384409e
--- /dev/null
+++ b/servers/serial_server_lin/src/serial_server.cpp
@@ -0,0 +1,353 @@
+/*
+ * Remote Laboratory Serial Server
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (c) 2014 Timothy Pearson
+ * Raptor Engineering
+ * http://www.raptorengineeringinc.com
+ */
+
+#include <stdio.h> /* perror() */
+#include <stdlib.h> /* atoi() */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <unistd.h> /* read() */
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+#include <sys/signal.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <math.h>
+
+#include <tqtimer.h>
+
+#include <tdelocale.h>
+
+#include "serial_server.h"
+
+#define FLUSH_IN 0
+#define FLUSH_OUT 1
+#define FLUSH_BOTH 2
+
+#define ABORT_SOCKET(s) s->close(); \
+ s->disconnect(); \
+ delete s; \
+ s = NULL;
+
+/* exception handling */
+struct exit_exception {
+ int c;
+ exit_exception(int c):c(c) { }
+};
+
+/*
+ The SerialSocket class provides a socket that is connected with a client.
+ For every client that connects to the server, the server creates a new
+ instance of this class.
+*/
+SerialSocket::SerialSocket(int sock, TQObject *parent, const char *name) :
+ TDEKerberosServerSocket(parent, name), m_criticalSection(0), m_pollInterval(10), enableDebug(false), m_loopTimer(NULL), m_config(static_cast<SerialServer*>(parent)->m_config) {
+
+ // Read settings
+ m_config->setGroup("Tuning");
+ m_pollInterval = m_config->readNumEntry("pollInterval", m_pollInterval);
+ enableDebug = m_config->readBoolEntry("enableDebug", enableDebug);
+
+ // Initialize timers
+ m_kerberosInitTimer = new TQTimer();
+ connect(m_kerberosInitTimer, SIGNAL(timeout()), this, SLOT(finishKerberosHandshake()));
+
+ setServiceName("ulab");
+
+ line = 0;
+ connect(this, SIGNAL(connectionClosed()), SLOT(connectionClosedHandler()));
+ connect(this, SIGNAL(connectionClosed()), parent, SLOT(remoteConnectionClosed()));
+ setSocket(sock);
+}
+
+SerialSocket::~SerialSocket() {
+ if (m_kerberosInitTimer) {
+ m_kerberosInitTimer->stop();
+ delete m_kerberosInitTimer;
+ m_kerberosInitTimer = NULL;
+ }
+ if (m_loopTimer) {
+ m_loopTimer->stop();
+ delete m_loopTimer;
+ m_loopTimer = NULL;
+ }
+}
+
+void SerialSocket::close() {
+ if (state() == TQSocket::Connected) {
+ TDEKerberosServerSocket::close();
+ connectionClosedHandler();
+ TQTimer::singleShot(0, parent(), SLOT(remoteConnectionClosed()));
+ }
+}
+
+void SerialSocket::connectionClosedHandler() {
+ if (enableDebug) {
+ printf("[DEBUG] Connection from %s closed\n\r", m_remoteHost.ascii()); fflush(stdout);
+ }
+
+ if (m_criticalSection > 0) {
+ throw exit_exception(-1);
+ }
+}
+
+void SerialSocket::initiateKerberosHandshake() {
+ setUsingKerberos(true);
+ m_kerberosInitTimer->start(100, TRUE);
+}
+
+void SerialSocket::finishKerberosHandshake() {
+ if (kerberosStatus() == TDEKerberosServerSocket::KerberosInitializing) {
+ m_kerberosInitTimer->start(100, TRUE);
+ return;
+ }
+ if (kerberosStatus() == TDEKerberosServerSocket::KerberosInUse) {
+ m_config->setGroup("Security");
+ TQString masterUser = m_config->readEntry("masteruser");
+ TQString masterRealm = m_config->readEntry("masterrealm");
+ if (masterRealm == "") {
+ masterRealm = "(NULL)";
+ }
+ if ((m_authenticatedUserName != masterUser) || (m_authenticatedRealmName != masterRealm)) {
+ if (enableDebug) {
+ printf("[DEBUG] Connection from %s closed due to authentication failure (attempted connection as user %s@%s)\n\r", m_remoteHost.ascii(), m_authenticatedUserName.ascii(), m_authenticatedRealmName.ascii()); fflush(stdout);
+ }
+ close();
+ return;
+ }
+ if (setupSerial() != 0) {
+ if (enableDebug) {
+ printf("[DEBUG] Connection from %s closed due to serial port initialization failure\n\r", m_remoteHost.ascii()); fflush(stdout);
+ }
+ close();
+ return;
+ }
+
+ TQDataStream ds(this);
+ ds.setPrintableData(true);
+ ds << TQString("OK");
+ writeEndOfFrame();
+
+ // Inform user of baudrate
+ TQString infoString;
+ infoString = TQString("Serial connection established with a baudrate of %1\rReady for data").arg(m_baudRate);
+ TQByteArray data;
+ data.duplicate(infoString.ascii(), strlen(infoString.ascii()));
+ ds << TQString("DATA");
+ ds << data;
+ writeEndOfFrame();
+
+ enterCommandLoop();
+ return;
+ }
+ else {
+ if (enableDebug) {
+ printf("[DEBUG] Connection from %s closed due to Kerberos failure\n\r", m_remoteHost.ascii()); fflush(stdout);
+ }
+ close();
+ return;
+ }
+}
+
+int SerialSocket::setupSerial() {
+ struct termios oldtio, newtio;
+
+ m_config->setGroup("Serial");
+ TQString serialDevice = m_config->readEntry("serialdevice", "/dev/ttyS0");
+ m_baudRate = m_config->readEntry("baudrate", "9600");
+
+ m_fd_tty = ::open(serialDevice.ascii(), O_RDWR | O_NOCTTY | O_NONBLOCK | O_APPEND);
+ if (m_fd_tty < 0) {
+ printf("[FAIL] Unable to open serial device %s\n\r", serialDevice.ascii()); fflush(stdout);
+ return 1;
+ }
+
+ tcgetattr(m_fd_tty, &oldtio); // Save current port settings
+
+ long serialBaud;
+ if (m_baudRate == "1200") {
+ serialBaud = B1200;
+ }
+ else if (m_baudRate == "9600") {
+ serialBaud = B9600;
+ }
+ else if (m_baudRate == "19200") {
+ serialBaud = B19200;
+ }
+ else if (m_baudRate == "115200") {
+ serialBaud = B115200;
+ }
+ else {
+ printf("[WARNING] Invalid baudrate %s specified, selecting 9600 instead\n\r", m_baudRate.ascii()); fflush(stdout);
+ serialBaud = B9600;
+ }
+
+ bzero(&newtio, sizeof(newtio));
+ newtio.c_cflag = serialBaud | CS8 | CLOCAL | CREAD;
+ newtio.c_iflag = IGNPAR;
+ newtio.c_oflag = 0;
+
+ // Set input mode (non-canonical, no echo,...)
+ newtio.c_lflag = 0;
+
+ newtio.c_cc[VTIME] = 0; // Inter-character timer unused
+ newtio.c_cc[VMIN] = 0; // Blocking read unused
+
+ tcflush(m_fd_tty, TCIFLUSH);
+ tcsetattr(m_fd_tty, TCSANOW, &newtio);
+
+ return 0;
+}
+
+void SerialSocket::commandLoop() {
+ int cc;
+ int ret;
+ char buffer[1024];
+ bool transferred_data;
+ TQString instrumentCommand;
+
+ m_criticalSection++;
+ try {
+ transferred_data = false;
+ if (state() == TQSocket::Connected) {
+ if (canReadFrame()) {
+ TQDataStream ds(this);
+ ds.setPrintableData(true);
+ ds >> instrumentCommand;
+
+ if (instrumentCommand != "") {
+ if ((instrumentCommand == "SEND")) { // Send data to serial port
+ TQByteArray data;
+ ds >> data;
+ ret = write(m_fd_tty, data.data(), data.size());
+ while ((ret < 0) && (errno == EAGAIN)) {
+ usleep(1000);
+ ret = write(m_fd_tty, data.data(), data.size());
+ }
+ ioctl(m_fd_tty, TCFLSH, FLUSH_OUT);
+ if (ret >= 0) {
+ ds << TQString("ACK");
+ if (enableDebug) {
+ printf("[DEBUG] Wrote %d bytes to the serial port\n\r", ret); fflush(stdout);
+ }
+ }
+ else {
+ ds << TQString("NCK");
+ }
+ writeEndOfFrame();
+ }
+ else if ((instrumentCommand == "PING")) {
+ ds << TQString("PONG");
+ writeEndOfFrame();
+ }
+ else {
+ printf("[WARNING] Received unknown command %s from host %s\n\r", instrumentCommand.ascii(), m_remoteHost.ascii()); fflush(stdout);
+ ds << TQString("NCK");
+ writeEndOfFrame();
+ }
+ }
+
+ transferred_data = true;
+ }
+ cc = read(m_fd_tty, buffer, 1024);
+ if (cc > 0) {
+ TQDataStream ds(this);
+ ds.setPrintableData(true);
+ ds >> instrumentCommand;
+
+ TQByteArray data;
+ data.duplicate(buffer, cc);
+ ds << TQString("DATA");
+ ds << data;
+ writeEndOfFrame();
+
+ transferred_data = true;
+ if (enableDebug) {
+ printf("[DEBUG] Got %d bytes from the serial port\n\r", cc); fflush(stdout);
+ }
+ }
+ }
+ m_criticalSection--;
+ if (transferred_data) {
+ if (m_loopTimer) m_loopTimer->start(0, TRUE);
+ }
+ else {
+ if (m_loopTimer) m_loopTimer->start(m_pollInterval, TRUE);
+ }
+ return;
+ }
+ catch (...) {
+ m_criticalSection--;
+ return;
+ }
+}
+
+int SerialSocket::enterCommandLoop() {
+ if (!m_loopTimer) {
+ m_loopTimer = new TQTimer();
+ connect(m_loopTimer, SIGNAL(timeout()), this, SLOT(commandLoop()));
+ }
+ if (m_loopTimer) m_loopTimer->start(0, TRUE);
+ return 0;
+}
+
+/*
+ The SerialServer class handles new connections to the server. For every
+ client that connects, it creates a new SerialSocket -- that instance is now
+ responsible for the communication with that client.
+*/
+SerialServer::SerialServer(TQObject* parent, int port, KSimpleConfig* config) :
+ TQServerSocket( port, 1, parent ), m_config(config), m_numberOfConnections(0) {
+
+ if ( !ok() ) {
+ printf("[ERROR] Failed to bind to port %d\n\r", port);
+ exit(1);
+ }
+
+ printf("[INFO] Server started on port %d\n\r", port); fflush(stdout);
+}
+
+SerialServer::~SerialServer() {
+ //
+}
+
+void SerialServer::newConnection(int socket) {
+ SerialSocket *s = new SerialSocket(socket, this);
+ s->m_remoteHost = s->peerAddress().toString();
+ printf("[DEBUG] New connection from %s\n\r", s->m_remoteHost.ascii()); fflush(stdout);
+ if (m_numberOfConnections > 0) {
+ printf("[DEBUG] Connection from %s closed due to multiple access attempt\n\r", s->m_remoteHost.ascii()); fflush(stdout);
+ ABORT_SOCKET(s)
+ return;
+ }
+ connect(s, SIGNAL(connectionClosed()), s, SLOT(deleteLater()));
+ s->initiateKerberosHandshake();
+ emit newConnect(s);
+}
+
+void SerialServer::remoteConnectionClosed() {
+ m_numberOfConnections--;
+}
diff --git a/servers/serial_server_lin/src/serial_server.h b/servers/serial_server_lin/src/serial_server.h
new file mode 100644
index 0000000..0c4a49a
--- /dev/null
+++ b/servers/serial_server_lin/src/serial_server.h
@@ -0,0 +1,99 @@
+/*
+ * Remote Laboratory Serial Server
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * (c) 2012-2013 Timothy Pearson
+ * Raptor Engineering
+ * http://www.raptorengineeringinc.com
+ */
+
+#include <tqsocket.h>
+#include <tqserversocket.h>
+#include <tqapplication.h>
+#include <tqvbox.h>
+#include <tqtextview.h>
+#include <tqlabel.h>
+#include <tqpushbutton.h>
+#include <tqtextstream.h>
+
+#include <ksimpleconfig.h>
+
+#include <tdekrbserversocket.h>
+
+#include <tqtrla.h>
+
+#define MAGIC_NUMBER 1
+#define PROTOCOL_VERSION 1
+
+class SerialSocket : public TDEKerberosServerSocket
+{
+ Q_OBJECT
+
+ public:
+ SerialSocket(int sock, TQObject *parent=0, const char *name=0);
+ ~SerialSocket();
+
+ public:
+ void close();
+ void initiateKerberosHandshake();
+ int enterCommandLoop();
+
+ private slots:
+ void finishKerberosHandshake();
+ void connectionClosedHandler();
+ int setupSerial();
+ void commandLoop();
+
+ private:
+ int line;
+ int m_criticalSection;
+ int m_pollInterval;
+ bool enableDebug;
+ TQString m_remoteHost;
+ TQString m_baudRate;
+ int m_fd_tty;
+
+ TQTimer* m_kerberosInitTimer;
+ TQTimer* m_loopTimer;
+
+ KSimpleConfig* m_config;
+
+ friend class SerialServer;
+};
+
+class SerialServer : public TQServerSocket
+{
+ Q_OBJECT
+
+ public:
+ SerialServer(TQObject* parent=0, int port=0, KSimpleConfig* config=0);
+ ~SerialServer();
+
+ void newConnection(int socket);
+
+ private slots:
+ void remoteConnectionClosed();
+
+ signals:
+ void newConnect(SerialSocket*);
+
+ private:
+ KSimpleConfig* m_config;
+ int m_numberOfConnections;
+
+ friend class SerialSocket;
+
+}; \ No newline at end of file
diff --git a/servers/serial_server_lin/stamp-h.in b/servers/serial_server_lin/stamp-h.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/servers/serial_server_lin/stamp-h.in
diff --git a/servers/serial_server_lin/subdirs b/servers/serial_server_lin/subdirs
new file mode 100644
index 0000000..0e67810
--- /dev/null
+++ b/servers/serial_server_lin/subdirs
@@ -0,0 +1,3 @@
+doc
+po
+src