mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	Added missing dependency of last commit (serial)
Former-commit-id: 2f50af95f36600716e14d5e884ddd7b55ae982fc
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,2 +1,2 @@
 | 
			
		||||
/*.user
 | 
			
		||||
build
 | 
			
		||||
/build
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								dependencies/build/serial/CMakeLists.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								dependencies/build/serial/CMakeLists.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
 | 
			
		||||
project(serialport)
 | 
			
		||||
 | 
			
		||||
include_directories(../../include)
 | 
			
		||||
 | 
			
		||||
## Sources
 | 
			
		||||
set(serial_SRCS
 | 
			
		||||
	src/serial.cc
 | 
			
		||||
	../../include/serial/serial.h
 | 
			
		||||
	../../include/serial/v8stdint.h)
 | 
			
		||||
 | 
			
		||||
if(UNIX)
 | 
			
		||||
	list(APPEND serial_SRCS src/impl/unix.cc)
 | 
			
		||||
else()
 | 
			
		||||
	list(APPEND serial_SRCS src/impl/win.cc)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
## Add serial library
 | 
			
		||||
add_library(${PROJECT_NAME} ${serial_SRCS})
 | 
			
		||||
 | 
			
		||||
if(UNIX AND NOT APPLE)
 | 
			
		||||
	target_link_libraries(${PROJECT_NAME} rt)
 | 
			
		||||
endif()
 | 
			
		||||
							
								
								
									
										204
									
								
								dependencies/build/serial/include/serial/impl/unix.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								dependencies/build/serial/include/serial/impl/unix.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,204 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * \file serial/impl/unix.h
 | 
			
		||||
 * \author  William Woodall <wjwwood@gmail.com>
 | 
			
		||||
 * \author  John Harrison <ash@greaterthaninfinity.com>
 | 
			
		||||
 * \version 0.1
 | 
			
		||||
 *
 | 
			
		||||
 * \section LICENSE
 | 
			
		||||
 *
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2012 William Woodall, John Harrison
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
 * DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * \section DESCRIPTION
 | 
			
		||||
 *
 | 
			
		||||
 * This provides a unix based pimpl for the Serial class. This implementation is
 | 
			
		||||
 * based off termios.h and uses select for multiplexing the IO ports.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(_WIN32)
 | 
			
		||||
 | 
			
		||||
#ifndef SERIAL_IMPL_UNIX_H
 | 
			
		||||
#define SERIAL_IMPL_UNIX_H
 | 
			
		||||
 | 
			
		||||
#include "serial/serial.h"
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace serial {
 | 
			
		||||
 | 
			
		||||
using std::size_t;
 | 
			
		||||
using std::string;
 | 
			
		||||
using std::invalid_argument;
 | 
			
		||||
 | 
			
		||||
using serial::SerialException;
 | 
			
		||||
using serial::IOException;
 | 
			
		||||
 | 
			
		||||
class serial::Serial::SerialImpl {
 | 
			
		||||
public:
 | 
			
		||||
  SerialImpl (const string &port,
 | 
			
		||||
              unsigned long baudrate,
 | 
			
		||||
              bytesize_t bytesize,
 | 
			
		||||
              parity_t parity,
 | 
			
		||||
              stopbits_t stopbits,
 | 
			
		||||
              flowcontrol_t flowcontrol);
 | 
			
		||||
 | 
			
		||||
  virtual ~SerialImpl ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  open ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  close ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  isOpen () const;
 | 
			
		||||
 | 
			
		||||
  size_t
 | 
			
		||||
  available ();
 | 
			
		||||
 | 
			
		||||
  size_t
 | 
			
		||||
  read (uint8_t *buf, size_t size = 1);
 | 
			
		||||
 | 
			
		||||
  size_t
 | 
			
		||||
  write (const uint8_t *data, size_t length);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  flush ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  flushInput ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  flushOutput ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  sendBreak (int duration);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setBreak (bool level);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setRTS (bool level);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setDTR (bool level);
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  waitForChange ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getCTS ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getDSR ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getRI ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getCD ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setPort (const string &port);
 | 
			
		||||
 | 
			
		||||
  string
 | 
			
		||||
  getPort () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setTimeout (Timeout &timeout);
 | 
			
		||||
 | 
			
		||||
  Timeout
 | 
			
		||||
  getTimeout () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setBaudrate (unsigned long baudrate);
 | 
			
		||||
 | 
			
		||||
  unsigned long
 | 
			
		||||
  getBaudrate () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setBytesize (bytesize_t bytesize);
 | 
			
		||||
 | 
			
		||||
  bytesize_t
 | 
			
		||||
  getBytesize () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setParity (parity_t parity);
 | 
			
		||||
 | 
			
		||||
  parity_t
 | 
			
		||||
  getParity () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setStopbits (stopbits_t stopbits);
 | 
			
		||||
 | 
			
		||||
  stopbits_t
 | 
			
		||||
  getStopbits () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setFlowcontrol (flowcontrol_t flowcontrol);
 | 
			
		||||
 | 
			
		||||
  flowcontrol_t
 | 
			
		||||
  getFlowcontrol () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  readLock ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  readUnlock ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  writeLock ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  writeUnlock ();
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  void reconfigurePort ();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  string port_;               // Path to the file descriptor
 | 
			
		||||
  int fd_;                    // The current file descriptor
 | 
			
		||||
 | 
			
		||||
  bool is_open_;
 | 
			
		||||
  bool xonxoff_;
 | 
			
		||||
  bool rtscts_;
 | 
			
		||||
 | 
			
		||||
  Timeout timeout_;         // Timeout for read operations
 | 
			
		||||
  unsigned long baudrate_;    // Baudrate
 | 
			
		||||
 | 
			
		||||
  parity_t parity_;           // Parity
 | 
			
		||||
  bytesize_t bytesize_;       // Size of the bytes
 | 
			
		||||
  stopbits_t stopbits_;       // Stop Bits
 | 
			
		||||
  flowcontrol_t flowcontrol_; // Flow Control
 | 
			
		||||
 | 
			
		||||
  // Mutex used to lock the read functions
 | 
			
		||||
  pthread_mutex_t read_mutex;
 | 
			
		||||
  // Mutex used to lock the write functions
 | 
			
		||||
  pthread_mutex_t write_mutex;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // SERIAL_IMPL_UNIX_H
 | 
			
		||||
 | 
			
		||||
#endif // !defined(_WIN32)
 | 
			
		||||
							
								
								
									
										201
									
								
								dependencies/build/serial/include/serial/impl/win.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								dependencies/build/serial/include/serial/impl/win.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,201 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * \file serial/impl/windows.h
 | 
			
		||||
 * \author  William Woodall <wjwwood@gmail.com>
 | 
			
		||||
 * \author  John Harrison <ash@greaterthaninfinity.com>
 | 
			
		||||
 * \version 0.1
 | 
			
		||||
 *
 | 
			
		||||
 * \section LICENSE
 | 
			
		||||
 *
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2012 William Woodall, John Harrison
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
 * DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * \section DESCRIPTION
 | 
			
		||||
 *
 | 
			
		||||
 * This provides a windows implementation of the Serial class interface.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
 | 
			
		||||
#ifndef SERIAL_IMPL_WINDOWS_H
 | 
			
		||||
#define SERIAL_IMPL_WINDOWS_H
 | 
			
		||||
 | 
			
		||||
#include "serial/serial.h"
 | 
			
		||||
 | 
			
		||||
#include "windows.h"
 | 
			
		||||
 | 
			
		||||
namespace serial {
 | 
			
		||||
 | 
			
		||||
using std::string;
 | 
			
		||||
using std::wstring;
 | 
			
		||||
using std::invalid_argument;
 | 
			
		||||
 | 
			
		||||
using serial::SerialException;
 | 
			
		||||
using serial::IOException;
 | 
			
		||||
 | 
			
		||||
class serial::Serial::SerialImpl {
 | 
			
		||||
public:
 | 
			
		||||
  SerialImpl (const string &port,
 | 
			
		||||
              unsigned long baudrate,
 | 
			
		||||
              bytesize_t bytesize,
 | 
			
		||||
              parity_t parity,
 | 
			
		||||
              stopbits_t stopbits,
 | 
			
		||||
              flowcontrol_t flowcontrol);
 | 
			
		||||
 | 
			
		||||
  virtual ~SerialImpl ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  open ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  close ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  isOpen () const;
 | 
			
		||||
 | 
			
		||||
  size_t
 | 
			
		||||
  available ();
 | 
			
		||||
 | 
			
		||||
  size_t
 | 
			
		||||
  read (uint8_t *buf, size_t size = 1);
 | 
			
		||||
 | 
			
		||||
  size_t
 | 
			
		||||
  write (const uint8_t *data, size_t length);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  flush ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  flushInput ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  flushOutput ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  sendBreak (int duration);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setBreak (bool level);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setRTS (bool level);
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setDTR (bool level);
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  waitForChange ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getCTS ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getDSR ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getRI ();
 | 
			
		||||
 | 
			
		||||
  bool
 | 
			
		||||
  getCD ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setPort (const string &port);
 | 
			
		||||
 | 
			
		||||
  string
 | 
			
		||||
  getPort () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setTimeout (Timeout &timeout);
 | 
			
		||||
 | 
			
		||||
  Timeout
 | 
			
		||||
  getTimeout () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setBaudrate (unsigned long baudrate);
 | 
			
		||||
 | 
			
		||||
  unsigned long
 | 
			
		||||
  getBaudrate () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setBytesize (bytesize_t bytesize);
 | 
			
		||||
 | 
			
		||||
  bytesize_t
 | 
			
		||||
  getBytesize () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setParity (parity_t parity);
 | 
			
		||||
 | 
			
		||||
  parity_t
 | 
			
		||||
  getParity () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setStopbits (stopbits_t stopbits);
 | 
			
		||||
 | 
			
		||||
  stopbits_t
 | 
			
		||||
  getStopbits () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  setFlowcontrol (flowcontrol_t flowcontrol);
 | 
			
		||||
 | 
			
		||||
  flowcontrol_t
 | 
			
		||||
  getFlowcontrol () const;
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  readLock ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  readUnlock ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  writeLock ();
 | 
			
		||||
 | 
			
		||||
  void
 | 
			
		||||
  writeUnlock ();
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
  void reconfigurePort ();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  wstring port_;               // Path to the file descriptor
 | 
			
		||||
  HANDLE fd_;
 | 
			
		||||
 | 
			
		||||
  bool is_open_;
 | 
			
		||||
 | 
			
		||||
  Timeout timeout_;           // Timeout for read operations
 | 
			
		||||
  unsigned long baudrate_;    // Baudrate
 | 
			
		||||
 | 
			
		||||
  parity_t parity_;           // Parity
 | 
			
		||||
  bytesize_t bytesize_;       // Size of the bytes
 | 
			
		||||
  stopbits_t stopbits_;       // Stop Bits
 | 
			
		||||
  flowcontrol_t flowcontrol_; // Flow Control
 | 
			
		||||
 | 
			
		||||
  // Mutex used to lock the read functions
 | 
			
		||||
  HANDLE read_mutex;
 | 
			
		||||
  // Mutex used to lock the write functions
 | 
			
		||||
  HANDLE write_mutex;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // SERIAL_IMPL_WINDOWS_H
 | 
			
		||||
 | 
			
		||||
#endif // if defined(_WIN32)
 | 
			
		||||
							
								
								
									
										700
									
								
								dependencies/build/serial/include/serial/serial.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										700
									
								
								dependencies/build/serial/include/serial/serial.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,700 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * \file serial/serial.h
 | 
			
		||||
 * \author  William Woodall <wjwwood@gmail.com>
 | 
			
		||||
 * \author  John Harrison   <ash.gti@gmail.com>
 | 
			
		||||
 * \version 0.1
 | 
			
		||||
 *
 | 
			
		||||
 * \section LICENSE
 | 
			
		||||
 *
 | 
			
		||||
 * The MIT License
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2012 William Woodall
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
 * copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
 * to deal in the Software without restriction, including without limitation
 | 
			
		||||
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
 * and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
 * Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
 * DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * \section DESCRIPTION
 | 
			
		||||
 *
 | 
			
		||||
 * This provides a cross platform interface for interacting with Serial Ports.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef SERIAL_H
 | 
			
		||||
#define SERIAL_H
 | 
			
		||||
 | 
			
		||||
#include <limits>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <exception>
 | 
			
		||||
#include <stdexcept>
 | 
			
		||||
#include <serial/v8stdint.h>
 | 
			
		||||
 | 
			
		||||
#define THROW(exceptionClass, message) throw exceptionClass(__FILE__, \
 | 
			
		||||
__LINE__, (message) )
 | 
			
		||||
 | 
			
		||||
namespace serial {
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * Enumeration defines the possible bytesizes for the serial port.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
  fivebits = 5,
 | 
			
		||||
  sixbits = 6,
 | 
			
		||||
  sevenbits = 7,
 | 
			
		||||
  eightbits = 8
 | 
			
		||||
} bytesize_t;
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * Enumeration defines the possible parity types for the serial port.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
  parity_none = 0,
 | 
			
		||||
  parity_odd = 1,
 | 
			
		||||
  parity_even = 2
 | 
			
		||||
} parity_t;
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * Enumeration defines the possible stopbit types for the serial port.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
  stopbits_one = 1,
 | 
			
		||||
  stopbits_two = 2,
 | 
			
		||||
  stopbits_one_point_five
 | 
			
		||||
} stopbits_t;
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * Enumeration defines the possible flowcontrol types for the serial port.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
  flowcontrol_none = 0,
 | 
			
		||||
  flowcontrol_software,
 | 
			
		||||
  flowcontrol_hardware
 | 
			
		||||
} flowcontrol_t;
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * Structure for setting the timeout of the serial port, times are
 | 
			
		||||
 * in milliseconds.
 | 
			
		||||
 *
 | 
			
		||||
 * In order to disable the interbyte timeout, set it to Timeout::max().
 | 
			
		||||
 */
 | 
			
		||||
struct Timeout {
 | 
			
		||||
#ifdef max
 | 
			
		||||
# undef max
 | 
			
		||||
#endif
 | 
			
		||||
  static uint32_t max() {return std::numeric_limits<uint32_t>::max();}
 | 
			
		||||
  /*!
 | 
			
		||||
   * Convenience function to generate Timeout structs using a
 | 
			
		||||
   * single absolute timeout.
 | 
			
		||||
   *
 | 
			
		||||
   * \param timeout A long that defines the time in milliseconds until a
 | 
			
		||||
   * timeout occurs after a call to read or write is made.
 | 
			
		||||
   *
 | 
			
		||||
   * \return Timeout struct that represents this simple timeout provided.
 | 
			
		||||
   */
 | 
			
		||||
  static Timeout simpleTimeout(uint32_t timeout) {
 | 
			
		||||
    return Timeout(max(), timeout, 0, timeout, 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*! Number of milliseconds between bytes received to timeout on. */
 | 
			
		||||
  uint32_t inter_byte_timeout;
 | 
			
		||||
  /*! A constant number of milliseconds to wait after calling read. */
 | 
			
		||||
  uint32_t read_timeout_constant;
 | 
			
		||||
  /*! A multiplier against the number of requested bytes to wait after
 | 
			
		||||
   *  calling read.
 | 
			
		||||
   */
 | 
			
		||||
  uint32_t read_timeout_multiplier;
 | 
			
		||||
  /*! A constant number of milliseconds to wait after calling write. */
 | 
			
		||||
  uint32_t write_timeout_constant;
 | 
			
		||||
  /*! A multiplier against the number of requested bytes to wait after
 | 
			
		||||
   *  calling write.
 | 
			
		||||
   */
 | 
			
		||||
  uint32_t write_timeout_multiplier;
 | 
			
		||||
 | 
			
		||||
  explicit Timeout (uint32_t inter_byte_timeout_=0,
 | 
			
		||||
                    uint32_t read_timeout_constant_=0,
 | 
			
		||||
                    uint32_t read_timeout_multiplier_=0,
 | 
			
		||||
                    uint32_t write_timeout_constant_=0,
 | 
			
		||||
                    uint32_t write_timeout_multiplier_=0)
 | 
			
		||||
  : inter_byte_timeout(inter_byte_timeout_),
 | 
			
		||||
    read_timeout_constant(read_timeout_constant_),
 | 
			
		||||
    read_timeout_multiplier(read_timeout_multiplier_),
 | 
			
		||||
    write_timeout_constant(write_timeout_constant_),
 | 
			
		||||
    write_timeout_multiplier(write_timeout_multiplier_)
 | 
			
		||||
  {}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * Class that provides a portable serial port interface.
 | 
			
		||||
 */
 | 
			
		||||
class Serial {
 | 
			
		||||
public:
 | 
			
		||||
  /*!
 | 
			
		||||
   * Creates a Serial object and opens the port if a port is specified,
 | 
			
		||||
   * otherwise it remains closed until serial::Serial::open is called.
 | 
			
		||||
   *
 | 
			
		||||
   * \param port A std::string containing the address of the serial port,
 | 
			
		||||
   *        which would be something like 'COM1' on Windows and '/dev/ttyS0'
 | 
			
		||||
   *        on Linux.
 | 
			
		||||
   *
 | 
			
		||||
   * \param baudrate An unsigned 32-bit integer that represents the baudrate
 | 
			
		||||
   *
 | 
			
		||||
   * \param timeout A serial::Timeout struct that defines the timeout
 | 
			
		||||
   * conditions for the serial port. \see serial::Timeout
 | 
			
		||||
   *
 | 
			
		||||
   * \param bytesize Size of each byte in the serial transmission of data,
 | 
			
		||||
   * default is eightbits, possible values are: fivebits, sixbits, sevenbits,
 | 
			
		||||
   * eightbits
 | 
			
		||||
   *
 | 
			
		||||
   * \param parity Method of parity, default is parity_none, possible values
 | 
			
		||||
   * are: parity_none, parity_odd, parity_even
 | 
			
		||||
   *
 | 
			
		||||
   * \param stopbits Number of stop bits used, default is stopbits_one,
 | 
			
		||||
   * possible values are: stopbits_one, stopbits_one_point_five, stopbits_two
 | 
			
		||||
   *
 | 
			
		||||
   * \param flowcontrol Type of flowcontrol used, default is
 | 
			
		||||
   * flowcontrol_none, possible values are: flowcontrol_none,
 | 
			
		||||
   * flowcontrol_software, flowcontrol_hardware
 | 
			
		||||
   *
 | 
			
		||||
   * \throw serial::PortNotOpenedException
 | 
			
		||||
   * \throw serial::IOException
 | 
			
		||||
   * \throw std::invalid_argument
 | 
			
		||||
   */
 | 
			
		||||
  Serial (const std::string &port = "",
 | 
			
		||||
          uint32_t baudrate = 9600,
 | 
			
		||||
          Timeout timeout = Timeout(),
 | 
			
		||||
          bytesize_t bytesize = eightbits,
 | 
			
		||||
          parity_t parity = parity_none,
 | 
			
		||||
          stopbits_t stopbits = stopbits_one,
 | 
			
		||||
          flowcontrol_t flowcontrol = flowcontrol_none);
 | 
			
		||||
 | 
			
		||||
  /*! Destructor */
 | 
			
		||||
  virtual ~Serial ();
 | 
			
		||||
 | 
			
		||||
  /*!
 | 
			
		||||
   * Opens the serial port as long as the port is set and the port isn't
 | 
			
		||||
   * already open.
 | 
			
		||||
   *
 | 
			
		||||
   * If the port is provided to the constructor then an explicit call to open
 | 
			
		||||
   * is not needed.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::Serial
 | 
			
		||||
   *
 | 
			
		||||
   * \throw std::invalid_argument
 | 
			
		||||
   * \throw serial::SerialException
 | 
			
		||||
   * \throw serial::IOException
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  open ();
 | 
			
		||||
 | 
			
		||||
  /*! Gets the open status of the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \return Returns true if the port is open, false otherwise.
 | 
			
		||||
   */
 | 
			
		||||
  bool
 | 
			
		||||
  isOpen () const;
 | 
			
		||||
 | 
			
		||||
  /*! Closes the serial port. */
 | 
			
		||||
  void
 | 
			
		||||
  close ();
 | 
			
		||||
 | 
			
		||||
  /*! Return the number of characters in the buffer. */
 | 
			
		||||
  size_t
 | 
			
		||||
  available ();
 | 
			
		||||
 | 
			
		||||
  /*! Read a given amount of bytes from the serial port into a given buffer.
 | 
			
		||||
   *
 | 
			
		||||
   * The read function will return in one of three cases:
 | 
			
		||||
   *  * The number of requested bytes was read.
 | 
			
		||||
   *    * In this case the number of bytes requested will match the size_t
 | 
			
		||||
   *      returned by read.
 | 
			
		||||
   *  * A timeout occurred, in this case the number of bytes read will not
 | 
			
		||||
   *    match the amount requested, but no exception will be thrown.  One of
 | 
			
		||||
   *    two possible timeouts occurred:
 | 
			
		||||
   *    * The inter byte timeout expired, this means that number of
 | 
			
		||||
   *      milliseconds elapsed between receiving bytes from the serial port
 | 
			
		||||
   *      exceeded the inter byte timeout.
 | 
			
		||||
   *    * The total timeout expired, which is calculated by multiplying the
 | 
			
		||||
   *      read timeout multiplier by the number of requested bytes and then
 | 
			
		||||
   *      added to the read timeout constant.  If that total number of
 | 
			
		||||
   *      milliseconds elapses after the initial call to read a timeout will
 | 
			
		||||
   *      occur.
 | 
			
		||||
   *  * An exception occurred, in this case an actual exception will be thrown.
 | 
			
		||||
   *
 | 
			
		||||
   * \param buffer An uint8_t array of at least the requested size.
 | 
			
		||||
   * \param size A size_t defining how many bytes to be read.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A size_t representing the number of bytes read as a result of the
 | 
			
		||||
   *         call to read.
 | 
			
		||||
   */
 | 
			
		||||
  size_t
 | 
			
		||||
  read (uint8_t *buffer, size_t size);
 | 
			
		||||
 | 
			
		||||
  /*! Read a given amount of bytes from the serial port into a give buffer.
 | 
			
		||||
   *
 | 
			
		||||
   * \param buffer A reference to a std::vector of uint8_t.
 | 
			
		||||
   * \param size A size_t defining how many bytes to be read.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A size_t representing the number of bytes read as a result of the
 | 
			
		||||
   *         call to read.
 | 
			
		||||
   */
 | 
			
		||||
  size_t
 | 
			
		||||
  read (std::vector<uint8_t> &buffer, size_t size = 1);
 | 
			
		||||
 | 
			
		||||
  /*! Read a given amount of bytes from the serial port into a give buffer.
 | 
			
		||||
   *
 | 
			
		||||
   * \param buffer A reference to a std::string.
 | 
			
		||||
   * \param size A size_t defining how many bytes to be read.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A size_t representing the number of bytes read as a result of the
 | 
			
		||||
   *         call to read.
 | 
			
		||||
   */
 | 
			
		||||
  size_t
 | 
			
		||||
  read (std::string &buffer, size_t size = 1);
 | 
			
		||||
 | 
			
		||||
  /*! Read a given amount of bytes from the serial port and return a string
 | 
			
		||||
   *  containing the data.
 | 
			
		||||
   *
 | 
			
		||||
   * \param size A size_t defining how many bytes to be read.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A std::string containing the data read from the port.
 | 
			
		||||
   */
 | 
			
		||||
  std::string
 | 
			
		||||
  read (size_t size = 1);
 | 
			
		||||
 | 
			
		||||
  /*! Reads in a line or until a given delimiter has been processed.
 | 
			
		||||
   *
 | 
			
		||||
   * Reads from the serial port until a single line has been read.
 | 
			
		||||
   *
 | 
			
		||||
   * \param buffer A std::string reference used to store the data.
 | 
			
		||||
   * \param size A maximum length of a line, defaults to 65536 (2^16)
 | 
			
		||||
   * \param eol A string to match against for the EOL.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A size_t representing the number of bytes read.
 | 
			
		||||
   */
 | 
			
		||||
  size_t
 | 
			
		||||
  readline (std::string &buffer, size_t size = 65536, std::string eol = "\n");
 | 
			
		||||
 | 
			
		||||
  /*! Reads in a line or until a given delimiter has been processed.
 | 
			
		||||
   *
 | 
			
		||||
   * Reads from the serial port until a single line has been read.
 | 
			
		||||
   *
 | 
			
		||||
   * \param size A maximum length of a line, defaults to 65536 (2^16)
 | 
			
		||||
   * \param eol A string to match against for the EOL.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A std::string containing the line.
 | 
			
		||||
   */
 | 
			
		||||
  std::string
 | 
			
		||||
  readline (size_t size = 65536, std::string eol = "\n");
 | 
			
		||||
 | 
			
		||||
  /*! Reads in multiple lines until the serial port times out.
 | 
			
		||||
   *
 | 
			
		||||
   * This requires a timeout > 0 before it can be run. It will read until a
 | 
			
		||||
   * timeout occurs and return a list of strings.
 | 
			
		||||
   *
 | 
			
		||||
   * \param size A maximum length of combined lines, defaults to 65536 (2^16)
 | 
			
		||||
   *
 | 
			
		||||
   * \param eol A string to match against for the EOL.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A vector<string> containing the lines.
 | 
			
		||||
   */
 | 
			
		||||
  std::vector<std::string>
 | 
			
		||||
  readlines (size_t size = 65536, std::string eol = "\n");
 | 
			
		||||
 | 
			
		||||
  /*! Write a string to the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param data A const reference containing the data to be written
 | 
			
		||||
   * to the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param size A size_t that indicates how many bytes should be written from
 | 
			
		||||
   * the given data buffer.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A size_t representing the number of bytes actually written to
 | 
			
		||||
   * the serial port.
 | 
			
		||||
   */
 | 
			
		||||
  size_t
 | 
			
		||||
  write (const uint8_t *data, size_t size);
 | 
			
		||||
 | 
			
		||||
  /*! Write a string to the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param data A const reference containing the data to be written
 | 
			
		||||
   * to the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A size_t representing the number of bytes actually written to
 | 
			
		||||
   * the serial port.
 | 
			
		||||
   */
 | 
			
		||||
  size_t
 | 
			
		||||
  write (const std::vector<uint8_t> &data);
 | 
			
		||||
 | 
			
		||||
  /*! Write a string to the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param data A const reference containing the data to be written
 | 
			
		||||
   * to the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A size_t representing the number of bytes actually written to
 | 
			
		||||
   * the serial port.
 | 
			
		||||
   */
 | 
			
		||||
  size_t
 | 
			
		||||
  write (const std::string &data);
 | 
			
		||||
 | 
			
		||||
  /*! Sets the serial port identifier.
 | 
			
		||||
   *
 | 
			
		||||
   * \param port A const std::string reference containing the address of the
 | 
			
		||||
   * serial port, which would be something like 'COM1' on Windows and
 | 
			
		||||
   * '/dev/ttyS0' on Linux.
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  setPort (const std::string &port);
 | 
			
		||||
 | 
			
		||||
  /*! Gets the serial port identifier.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::setPort
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  std::string
 | 
			
		||||
  getPort () const;
 | 
			
		||||
 | 
			
		||||
  /*! Sets the timeout for reads and writes using the Timeout struct.
 | 
			
		||||
   *
 | 
			
		||||
   * There are two timeout conditions described here:
 | 
			
		||||
   *  * The inter byte timeout:
 | 
			
		||||
   *    * The inter_byte_timeout component of serial::Timeout defines the
 | 
			
		||||
   *      maximum amount of time, in milliseconds, between receiving bytes on
 | 
			
		||||
   *      the serial port that can pass before a timeout occurs.  Setting this
 | 
			
		||||
   *      to zero will prevent inter byte timeouts from occurring.
 | 
			
		||||
   *  * Total time timeout:
 | 
			
		||||
   *    * The constant and multiplier component of this timeout condition,
 | 
			
		||||
   *      for both read and write, are defined in serial::Timeout.  This
 | 
			
		||||
   *      timeout occurs if the total time since the read or write call was
 | 
			
		||||
   *      made exceeds the specified time in milliseconds.
 | 
			
		||||
   *    * The limit is defined by multiplying the multiplier component by the
 | 
			
		||||
   *      number of requested bytes and adding that product to the constant
 | 
			
		||||
   *      component.  In this way if you want a read call, for example, to
 | 
			
		||||
   *      timeout after exactly one second regardless of the number of bytes
 | 
			
		||||
   *      you asked for then set the read_timeout_constant component of
 | 
			
		||||
   *      serial::Timeout to 1000 and the read_timeout_multiplier to zero.
 | 
			
		||||
   *      This timeout condition can be used in conjunction with the inter
 | 
			
		||||
   *      byte timeout condition with out any problems, timeout will simply
 | 
			
		||||
   *      occur when one of the two timeout conditions is met.  This allows
 | 
			
		||||
   *      users to have maximum control over the trade-off between
 | 
			
		||||
   *      responsiveness and efficiency.
 | 
			
		||||
   *
 | 
			
		||||
   * Read and write functions will return in one of three cases.  When the
 | 
			
		||||
   * reading or writing is complete, when a timeout occurs, or when an
 | 
			
		||||
   * exception occurs.
 | 
			
		||||
   *
 | 
			
		||||
   * \param timeout A serial::Timeout struct containing the inter byte
 | 
			
		||||
   * timeout, and the read and write timeout constants and multipliers.
 | 
			
		||||
   *
 | 
			
		||||
   * \see serial::Timeout
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  setTimeout (Timeout &timeout);
 | 
			
		||||
 | 
			
		||||
  /*! Sets the timeout for reads and writes. */
 | 
			
		||||
  void
 | 
			
		||||
  setTimeout (uint32_t inter_byte_timeout, uint32_t read_timeout_constant,
 | 
			
		||||
              uint32_t read_timeout_multiplier, uint32_t write_timeout_constant,
 | 
			
		||||
              uint32_t write_timeout_multiplier)
 | 
			
		||||
  {
 | 
			
		||||
    Timeout timeout(inter_byte_timeout, read_timeout_constant,
 | 
			
		||||
                    read_timeout_multiplier, write_timeout_constant,
 | 
			
		||||
                    write_timeout_multiplier);
 | 
			
		||||
    return setTimeout(timeout);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /*! Gets the timeout for reads in seconds.
 | 
			
		||||
   *
 | 
			
		||||
   * \return A Timeout struct containing the inter_byte_timeout, and read
 | 
			
		||||
   * and write timeout constants and multipliers.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::setTimeout
 | 
			
		||||
   */
 | 
			
		||||
  Timeout
 | 
			
		||||
  getTimeout () const;
 | 
			
		||||
 | 
			
		||||
  /*! Sets the baudrate for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * Possible baudrates depends on the system but some safe baudrates include:
 | 
			
		||||
   * 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 56000,
 | 
			
		||||
   * 57600, 115200
 | 
			
		||||
   * Some other baudrates that are supported by some comports:
 | 
			
		||||
   * 128000, 153600, 230400, 256000, 460800, 921600
 | 
			
		||||
   *
 | 
			
		||||
   * \param baudrate An integer that sets the baud rate for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  setBaudrate (uint32_t baudrate);
 | 
			
		||||
 | 
			
		||||
  /*! Gets the baudrate for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \return An integer that sets the baud rate for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::setBaudrate
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  uint32_t
 | 
			
		||||
  getBaudrate () const;
 | 
			
		||||
 | 
			
		||||
  /*! Sets the bytesize for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param bytesize Size of each byte in the serial transmission of data,
 | 
			
		||||
   * default is eightbits, possible values are: fivebits, sixbits, sevenbits,
 | 
			
		||||
   * eightbits
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  setBytesize (bytesize_t bytesize);
 | 
			
		||||
 | 
			
		||||
  /*! Gets the bytesize for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::setBytesize
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  bytesize_t
 | 
			
		||||
  getBytesize () const;
 | 
			
		||||
 | 
			
		||||
  /*! Sets the parity for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param parity Method of parity, default is parity_none, possible values
 | 
			
		||||
   * are: parity_none, parity_odd, parity_even
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  setParity (parity_t parity);
 | 
			
		||||
 | 
			
		||||
  /*! Gets the parity for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::setParity
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  parity_t
 | 
			
		||||
  getParity () const;
 | 
			
		||||
 | 
			
		||||
  /*! Sets the stopbits for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param stopbits Number of stop bits used, default is stopbits_one,
 | 
			
		||||
   * possible values are: stopbits_one, stopbits_one_point_five, stopbits_two
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  setStopbits (stopbits_t stopbits);
 | 
			
		||||
 | 
			
		||||
  /*! Gets the stopbits for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::setStopbits
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  stopbits_t
 | 
			
		||||
  getStopbits () const;
 | 
			
		||||
 | 
			
		||||
  /*! Sets the flow control for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \param flowcontrol Type of flowcontrol used, default is flowcontrol_none,
 | 
			
		||||
   * possible values are: flowcontrol_none, flowcontrol_software,
 | 
			
		||||
   * flowcontrol_hardware
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  void
 | 
			
		||||
  setFlowcontrol (flowcontrol_t flowcontrol);
 | 
			
		||||
 | 
			
		||||
  /*! Gets the flow control for the serial port.
 | 
			
		||||
   *
 | 
			
		||||
   * \see Serial::setFlowcontrol
 | 
			
		||||
   *
 | 
			
		||||
   * \throw InvalidConfigurationException
 | 
			
		||||
   */
 | 
			
		||||
  flowcontrol_t
 | 
			
		||||
  getFlowcontrol () const;
 | 
			
		||||
 | 
			
		||||
  /*! Flush the input and output buffers */
 | 
			
		||||
  void
 | 
			
		||||
  flush ();
 | 
			
		||||
 | 
			
		||||
  /*! Flush only the input buffer */
 | 
			
		||||
  void
 | 
			
		||||
  flushInput ();
 | 
			
		||||
 | 
			
		||||
  /*! Flush only the output buffer */
 | 
			
		||||
  void
 | 
			
		||||
  flushOutput ();
 | 
			
		||||
 | 
			
		||||
  /*! Sends the RS-232 break signal.  See tcsendbreak(3). */
 | 
			
		||||
  void
 | 
			
		||||
  sendBreak (int duration);
 | 
			
		||||
 | 
			
		||||
  /*! Set the break condition to a given level.  Defaults to true. */
 | 
			
		||||
  void
 | 
			
		||||
  setBreak (bool level = true);
 | 
			
		||||
 | 
			
		||||
  /*! Set the RTS handshaking line to the given level.  Defaults to true. */
 | 
			
		||||
  void
 | 
			
		||||
  setRTS (bool level = true);
 | 
			
		||||
 | 
			
		||||
  /*! Set the DTR handshaking line to the given level.  Defaults to true. */
 | 
			
		||||
  void
 | 
			
		||||
  setDTR (bool level = true);
 | 
			
		||||
 | 
			
		||||
  /*!
 | 
			
		||||
   * Blocks until CTS, DSR, RI, CD changes or something interrupts it.
 | 
			
		||||
   *
 | 
			
		||||
   * Can throw an exception if an error occurs while waiting.
 | 
			
		||||
   * You can check the status of CTS, DSR, RI, and CD once this returns.
 | 
			
		||||
   * Uses TIOCMIWAIT via ioctl if available (mostly only on Linux) with a
 | 
			
		||||
   * resolution of less than +-1ms and as good as +-0.2ms.  Otherwise a
 | 
			
		||||
   * polling method is used which can give +-2ms.
 | 
			
		||||
   *
 | 
			
		||||
   * \return Returns true if one of the lines changed, false if something else
 | 
			
		||||
   * occurred.
 | 
			
		||||
   *
 | 
			
		||||
   * \throw SerialException
 | 
			
		||||
   */
 | 
			
		||||
  bool
 | 
			
		||||
  waitForChange ();
 | 
			
		||||
 | 
			
		||||
  /*! Returns the current status of the CTS line. */
 | 
			
		||||
  bool
 | 
			
		||||
  getCTS ();
 | 
			
		||||
 | 
			
		||||
  /*! Returns the current status of the DSR line. */
 | 
			
		||||
  bool
 | 
			
		||||
  getDSR ();
 | 
			
		||||
 | 
			
		||||
  /*! Returns the current status of the RI line. */
 | 
			
		||||
  bool
 | 
			
		||||
  getRI ();
 | 
			
		||||
 | 
			
		||||
  /*! Returns the current status of the CD line. */
 | 
			
		||||
  bool
 | 
			
		||||
  getCD ();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  // Disable copy constructors
 | 
			
		||||
  Serial(const Serial&);
 | 
			
		||||
  Serial& operator=(const Serial&);
 | 
			
		||||
 | 
			
		||||
  std::string read_cache_; //!< Cache for doing reads in chunks.
 | 
			
		||||
 | 
			
		||||
  // Pimpl idiom, d_pointer
 | 
			
		||||
  class SerialImpl;
 | 
			
		||||
  SerialImpl *pimpl_;
 | 
			
		||||
 | 
			
		||||
  // Scoped Lock Classes
 | 
			
		||||
  class ScopedReadLock;
 | 
			
		||||
  class ScopedWriteLock;
 | 
			
		||||
 | 
			
		||||
  // Read common function
 | 
			
		||||
  size_t
 | 
			
		||||
  read_ (uint8_t *buffer, size_t size);
 | 
			
		||||
  // Write common function
 | 
			
		||||
  size_t
 | 
			
		||||
  write_ (const uint8_t *data, size_t length);
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class SerialException : public std::exception
 | 
			
		||||
{
 | 
			
		||||
  // Disable copy constructors
 | 
			
		||||
  SerialException& operator=(const SerialException&);
 | 
			
		||||
  std::string e_what_;
 | 
			
		||||
public:
 | 
			
		||||
  SerialException (const char *description) {
 | 
			
		||||
      std::stringstream ss;
 | 
			
		||||
      ss << "SerialException " << description << " failed.";
 | 
			
		||||
      e_what_ = ss.str();
 | 
			
		||||
  }
 | 
			
		||||
  SerialException (const SerialException& other) : e_what_(other.e_what_) {}
 | 
			
		||||
  virtual ~SerialException() throw() {}
 | 
			
		||||
  virtual const char* what () const throw () {
 | 
			
		||||
    return e_what_.c_str();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class IOException : public std::exception
 | 
			
		||||
{
 | 
			
		||||
  // Disable copy constructors
 | 
			
		||||
  IOException& operator=(const IOException&);
 | 
			
		||||
  std::string file_;
 | 
			
		||||
  int line_;
 | 
			
		||||
  std::string e_what_;
 | 
			
		||||
  int errno_;
 | 
			
		||||
public:
 | 
			
		||||
  explicit IOException (std::string file, int line, int errnum)
 | 
			
		||||
    : file_(file), line_(line), errno_(errnum) {
 | 
			
		||||
      std::stringstream ss;
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
      char error_str [1024];
 | 
			
		||||
      strerror_s(error_str, 1024, errnum);
 | 
			
		||||
#else
 | 
			
		||||
      char * error_str = strerror(errnum);
 | 
			
		||||
#endif
 | 
			
		||||
      ss << "IO Exception (" << errno_ << "): " << error_str;
 | 
			
		||||
      ss << ", file " << file_ << ", line " << line_ << ".";
 | 
			
		||||
      e_what_ = ss.str();
 | 
			
		||||
  }
 | 
			
		||||
  explicit IOException (std::string file, int line, const char * description)
 | 
			
		||||
    : file_(file), line_(line), errno_(0) {
 | 
			
		||||
      std::stringstream ss;
 | 
			
		||||
      ss << "IO Exception: " << description;
 | 
			
		||||
      ss << ", file " << file_ << ", line " << line_ << ".";
 | 
			
		||||
      e_what_ = ss.str();
 | 
			
		||||
  }
 | 
			
		||||
  virtual ~IOException() throw() {}
 | 
			
		||||
  IOException (const IOException& other) : e_what_(other.e_what_), line_(other.line_), errno_(other.errno_) {}
 | 
			
		||||
 | 
			
		||||
  int getErrorNumber () { return errno_; }
 | 
			
		||||
 | 
			
		||||
  virtual const char* what () const throw () {
 | 
			
		||||
    return e_what_.c_str();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class PortNotOpenedException : public std::exception
 | 
			
		||||
{
 | 
			
		||||
  // Disable copy constructors
 | 
			
		||||
  const PortNotOpenedException& operator=(PortNotOpenedException);
 | 
			
		||||
  std::string e_what_;
 | 
			
		||||
public:
 | 
			
		||||
  PortNotOpenedException (const char * description)  {
 | 
			
		||||
      std::stringstream ss;
 | 
			
		||||
      ss << "PortNotOpenedException " << description << " failed.";
 | 
			
		||||
      e_what_ = ss.str();
 | 
			
		||||
  }
 | 
			
		||||
  PortNotOpenedException (const PortNotOpenedException& other) : e_what_(other.e_what_) {}
 | 
			
		||||
  virtual ~PortNotOpenedException() throw() {}
 | 
			
		||||
  virtual const char* what () const throw () {
 | 
			
		||||
    return e_what_.c_str();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace serial
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										57
									
								
								dependencies/build/serial/include/serial/v8stdint.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								dependencies/build/serial/include/serial/v8stdint.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
// This header is from the v8 google project:
 | 
			
		||||
// http://code.google.com/p/v8/source/browse/trunk/include/v8stdint.h
 | 
			
		||||
 | 
			
		||||
// Copyright 2012 the V8 project authors. All rights reserved.
 | 
			
		||||
// Redistribution and use in source and binary forms, with or without
 | 
			
		||||
// modification, are permitted provided that the following conditions are
 | 
			
		||||
// met:
 | 
			
		||||
//
 | 
			
		||||
//     * Redistributions of source code must retain the above copyright
 | 
			
		||||
//       notice, this list of conditions and the following disclaimer.
 | 
			
		||||
//     * Redistributions in binary form must reproduce the above
 | 
			
		||||
//       copyright notice, this list of conditions and the following
 | 
			
		||||
//       disclaimer in the documentation and/or other materials provided
 | 
			
		||||
//       with the distribution.
 | 
			
		||||
//     * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
//       contributors may be used to endorse or promote products derived
 | 
			
		||||
//       from this software without specific prior written permission.
 | 
			
		||||
//
 | 
			
		||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 | 
			
		||||
// Load definitions of standard types.
 | 
			
		||||
 | 
			
		||||
#ifndef V8STDINT_H_
 | 
			
		||||
#define V8STDINT_H_
 | 
			
		||||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#if defined(_WIN32) && !defined(__MINGW32__)
 | 
			
		||||
 | 
			
		||||
typedef signed char int8_t;
 | 
			
		||||
typedef unsigned char uint8_t;
 | 
			
		||||
typedef short int16_t;  // NOLINT
 | 
			
		||||
typedef unsigned short uint16_t;  // NOLINT
 | 
			
		||||
typedef int int32_t;
 | 
			
		||||
typedef unsigned int uint32_t;
 | 
			
		||||
typedef __int64 int64_t;
 | 
			
		||||
typedef unsigned __int64 uint64_t;
 | 
			
		||||
// intptr_t and friends are defined in crtdefs.h through stdio.h.
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // V8STDINT_H_
 | 
			
		||||
							
								
								
									
										1022
									
								
								dependencies/build/serial/src/impl/unix.cc
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										1022
									
								
								dependencies/build/serial/src/impl/unix.cc
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										601
									
								
								dependencies/build/serial/src/impl/win.cc
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										601
									
								
								dependencies/build/serial/src/impl/win.cc
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,601 @@
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
 | 
			
		||||
/* Copyright 2012 William Woodall and John Harrison */
 | 
			
		||||
 | 
			
		||||
#include "serial/impl/win.h"
 | 
			
		||||
 | 
			
		||||
using std::string;
 | 
			
		||||
using std::wstring;
 | 
			
		||||
using std::stringstream;
 | 
			
		||||
using std::invalid_argument;
 | 
			
		||||
using serial::Serial;
 | 
			
		||||
using serial::Timeout;
 | 
			
		||||
using serial::bytesize_t;
 | 
			
		||||
using serial::parity_t;
 | 
			
		||||
using serial::stopbits_t;
 | 
			
		||||
using serial::flowcontrol_t;
 | 
			
		||||
using serial::SerialException;
 | 
			
		||||
using serial::PortNotOpenedException;
 | 
			
		||||
using serial::IOException;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Serial::SerialImpl::SerialImpl (const string &port, unsigned long baudrate,
 | 
			
		||||
                                bytesize_t bytesize,
 | 
			
		||||
                                parity_t parity, stopbits_t stopbits,
 | 
			
		||||
                                flowcontrol_t flowcontrol)
 | 
			
		||||
  : port_ (port.begin(), port.end()), fd_ (INVALID_HANDLE_VALUE), is_open_ (false),
 | 
			
		||||
    baudrate_ (baudrate), parity_ (parity),
 | 
			
		||||
    bytesize_ (bytesize), stopbits_ (stopbits), flowcontrol_ (flowcontrol)
 | 
			
		||||
{
 | 
			
		||||
  read_mutex = CreateMutex(NULL, false, NULL);
 | 
			
		||||
  write_mutex = CreateMutex(NULL, false, NULL);
 | 
			
		||||
  if (port_.empty () == false)
 | 
			
		||||
    open ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Serial::SerialImpl::~SerialImpl ()
 | 
			
		||||
{
 | 
			
		||||
  this->close();
 | 
			
		||||
  CloseHandle(read_mutex);
 | 
			
		||||
  CloseHandle(write_mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::open ()
 | 
			
		||||
{
 | 
			
		||||
  if (port_.empty ()) {
 | 
			
		||||
    throw invalid_argument ("Empty port is invalid.");
 | 
			
		||||
  }
 | 
			
		||||
  if (is_open_ == true) {
 | 
			
		||||
    throw SerialException ("Serial port already open.");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  LPCWSTR lp_port = port_.c_str();
 | 
			
		||||
  fd_ = CreateFileW(lp_port,
 | 
			
		||||
                    GENERIC_READ | GENERIC_WRITE,
 | 
			
		||||
                    0,
 | 
			
		||||
                    0,
 | 
			
		||||
                    OPEN_EXISTING,
 | 
			
		||||
                    FILE_ATTRIBUTE_NORMAL,
 | 
			
		||||
                    0);
 | 
			
		||||
 | 
			
		||||
  if (fd_ == INVALID_HANDLE_VALUE) {
 | 
			
		||||
    DWORD errno_ = GetLastError();
 | 
			
		||||
	stringstream ss;
 | 
			
		||||
    switch (errno_) {
 | 
			
		||||
    case ERROR_FILE_NOT_FOUND:
 | 
			
		||||
      // Use this->getPort to convert to a std::string
 | 
			
		||||
      ss << "Specified port, " << this->getPort() << ", does not exist.";
 | 
			
		||||
      THROW (IOException, ss.str().c_str());
 | 
			
		||||
    default:
 | 
			
		||||
      ss << "Unknown error opening the serial port: " << errno;
 | 
			
		||||
      THROW (IOException, ss.str().c_str());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  reconfigurePort();
 | 
			
		||||
  is_open_ = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::reconfigurePort ()
 | 
			
		||||
{
 | 
			
		||||
  if (fd_ == INVALID_HANDLE_VALUE) {
 | 
			
		||||
    // Can only operate on a valid file descriptor
 | 
			
		||||
    THROW (IOException, "Invalid file descriptor, is the serial port open?");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  DCB dcbSerialParams = {0};
 | 
			
		||||
 | 
			
		||||
  dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
 | 
			
		||||
 | 
			
		||||
  if (!GetCommState(fd_, &dcbSerialParams)) {
 | 
			
		||||
    //error getting state
 | 
			
		||||
    THROW (IOException, "Error getting the serial port state.");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // setup baud rate
 | 
			
		||||
  switch (baudrate_) {
 | 
			
		||||
#ifdef CBR_0
 | 
			
		||||
  case 0: dcbSerialParams.BaudRate = CBR_0; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_50
 | 
			
		||||
  case 50: dcbSerialParams.BaudRate = CBR_50; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_75
 | 
			
		||||
  case 75: dcbSerialParams.BaudRate = CBR_75; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_110
 | 
			
		||||
  case 110: dcbSerialParams.BaudRate = CBR_110; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_134
 | 
			
		||||
  case 134: dcbSerialParams.BaudRate = CBR_134; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_150
 | 
			
		||||
  case 150: dcbSerialParams.BaudRate = CBR_150; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_200
 | 
			
		||||
  case 200: dcbSerialParams.BaudRate = CBR_200; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_300
 | 
			
		||||
  case 300: dcbSerialParams.BaudRate = CBR_300; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_600
 | 
			
		||||
  case 600: dcbSerialParams.BaudRate = CBR_600; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_1200
 | 
			
		||||
  case 1200: dcbSerialParams.BaudRate = CBR_1200; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_1800
 | 
			
		||||
  case 1800: dcbSerialParams.BaudRate = CBR_1800; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_2400
 | 
			
		||||
  case 2400: dcbSerialParams.BaudRate = CBR_2400; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_4800
 | 
			
		||||
  case 4800: dcbSerialParams.BaudRate = CBR_4800; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_7200
 | 
			
		||||
  case 7200: dcbSerialParams.BaudRate = CBR_7200; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_9600
 | 
			
		||||
  case 9600: dcbSerialParams.BaudRate = CBR_9600; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_14400
 | 
			
		||||
  case 14400: dcbSerialParams.BaudRate = CBR_14400; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_19200
 | 
			
		||||
  case 19200: dcbSerialParams.BaudRate = CBR_19200; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_28800
 | 
			
		||||
  case 28800: dcbSerialParams.BaudRate = CBR_28800; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_57600
 | 
			
		||||
  case 57600: dcbSerialParams.BaudRate = CBR_57600; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_76800
 | 
			
		||||
  case 76800: dcbSerialParams.BaudRate = CBR_76800; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_38400
 | 
			
		||||
  case 38400: dcbSerialParams.BaudRate = CBR_38400; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_115200
 | 
			
		||||
  case 115200: dcbSerialParams.BaudRate = CBR_115200; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_128000
 | 
			
		||||
  case 128000: dcbSerialParams.BaudRate = CBR_128000; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_153600
 | 
			
		||||
  case 153600: dcbSerialParams.BaudRate = CBR_153600; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_230400
 | 
			
		||||
  case 230400: dcbSerialParams.BaudRate = CBR_230400; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_256000
 | 
			
		||||
  case 256000: dcbSerialParams.BaudRate = CBR_256000; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_460800
 | 
			
		||||
  case 460800: dcbSerialParams.BaudRate = CBR_460800; break;
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CBR_921600
 | 
			
		||||
  case 921600: dcbSerialParams.BaudRate = CBR_921600; break;
 | 
			
		||||
#endif
 | 
			
		||||
  default:
 | 
			
		||||
    // Try to blindly assign it
 | 
			
		||||
    dcbSerialParams.BaudRate = baudrate_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // setup char len
 | 
			
		||||
  if (bytesize_ == eightbits)
 | 
			
		||||
    dcbSerialParams.ByteSize = 8;
 | 
			
		||||
  else if (bytesize_ == sevenbits)
 | 
			
		||||
    dcbSerialParams.ByteSize = 7;
 | 
			
		||||
  else if (bytesize_ == sixbits)
 | 
			
		||||
    dcbSerialParams.ByteSize = 6;
 | 
			
		||||
  else if (bytesize_ == fivebits)
 | 
			
		||||
    dcbSerialParams.ByteSize = 5;
 | 
			
		||||
  else
 | 
			
		||||
    throw invalid_argument ("invalid char len");
 | 
			
		||||
 | 
			
		||||
  // setup stopbits
 | 
			
		||||
  if (stopbits_ == stopbits_one)
 | 
			
		||||
    dcbSerialParams.StopBits = ONESTOPBIT;
 | 
			
		||||
  else if (stopbits_ == stopbits_one_point_five)
 | 
			
		||||
    dcbSerialParams.StopBits = ONE5STOPBITS;
 | 
			
		||||
  else if (stopbits_ == stopbits_two)
 | 
			
		||||
    dcbSerialParams.StopBits = TWOSTOPBITS;
 | 
			
		||||
  else
 | 
			
		||||
    throw invalid_argument ("invalid stop bit");
 | 
			
		||||
 | 
			
		||||
  // setup parity
 | 
			
		||||
  if (parity_ == parity_none) {
 | 
			
		||||
    dcbSerialParams.Parity = NOPARITY;
 | 
			
		||||
  } else if (parity_ == parity_even) {
 | 
			
		||||
    dcbSerialParams.Parity = EVENPARITY;
 | 
			
		||||
  } else if (parity_ == parity_odd) {
 | 
			
		||||
    dcbSerialParams.Parity = ODDPARITY;
 | 
			
		||||
  } else {
 | 
			
		||||
    throw invalid_argument ("invalid parity");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // setup flowcontrol
 | 
			
		||||
  if (flowcontrol_ == flowcontrol_none) {
 | 
			
		||||
    dcbSerialParams.fOutxCtsFlow = false;
 | 
			
		||||
    dcbSerialParams.fRtsControl = 0x00;
 | 
			
		||||
    dcbSerialParams.fOutX = false;
 | 
			
		||||
    dcbSerialParams.fInX = false;
 | 
			
		||||
  }
 | 
			
		||||
  if (flowcontrol_ == flowcontrol_software) {
 | 
			
		||||
    dcbSerialParams.fOutxCtsFlow = false;
 | 
			
		||||
    dcbSerialParams.fRtsControl = 0x00;
 | 
			
		||||
    dcbSerialParams.fOutX = true;
 | 
			
		||||
    dcbSerialParams.fInX = true;
 | 
			
		||||
  }
 | 
			
		||||
  if (flowcontrol_ == flowcontrol_hardware) {
 | 
			
		||||
    dcbSerialParams.fOutxCtsFlow = true;
 | 
			
		||||
    dcbSerialParams.fRtsControl = 0x03;
 | 
			
		||||
    dcbSerialParams.fOutX = false;
 | 
			
		||||
    dcbSerialParams.fInX = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // activate settings
 | 
			
		||||
  if (!SetCommState(fd_, &dcbSerialParams)){
 | 
			
		||||
    THROW (IOException, "Error setting serial port settings.");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Setup timeouts
 | 
			
		||||
  COMMTIMEOUTS timeouts = {0};
 | 
			
		||||
  timeouts.ReadIntervalTimeout = timeout_.inter_byte_timeout;
 | 
			
		||||
  timeouts.ReadTotalTimeoutConstant = timeout_.read_timeout_constant;
 | 
			
		||||
  timeouts.ReadTotalTimeoutMultiplier = timeout_.read_timeout_multiplier;
 | 
			
		||||
  timeouts.WriteTotalTimeoutConstant = timeout_.write_timeout_constant;
 | 
			
		||||
  timeouts.WriteTotalTimeoutMultiplier = timeout_.write_timeout_multiplier;
 | 
			
		||||
  if (!SetCommTimeouts(fd_, &timeouts)) {
 | 
			
		||||
    THROW (IOException, "Error setting timeouts.");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::close ()
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == true) {
 | 
			
		||||
    if (fd_ != INVALID_HANDLE_VALUE) {
 | 
			
		||||
      CloseHandle(fd_);
 | 
			
		||||
      fd_ = INVALID_HANDLE_VALUE;
 | 
			
		||||
    }
 | 
			
		||||
    is_open_ = false;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Serial::SerialImpl::isOpen () const
 | 
			
		||||
{
 | 
			
		||||
  return is_open_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::SerialImpl::available ()
 | 
			
		||||
{
 | 
			
		||||
  if (!is_open_) {
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
  COMSTAT cs;
 | 
			
		||||
  if (!ClearCommError(fd_, NULL, &cs)) {
 | 
			
		||||
    stringstream ss;
 | 
			
		||||
    ss << "Error while checking status of the serial port: " << GetLastError();
 | 
			
		||||
    THROW (IOException, ss.str().c_str());
 | 
			
		||||
  }
 | 
			
		||||
  return static_cast<size_t>(cs.cbInQue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::SerialImpl::read (uint8_t *buf, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  if (!is_open_) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::read");
 | 
			
		||||
  }
 | 
			
		||||
  DWORD bytes_read;
 | 
			
		||||
  if (!ReadFile(fd_, buf, size, &bytes_read, NULL)) {
 | 
			
		||||
    stringstream ss;
 | 
			
		||||
    ss << "Error while reading from the serial port: " << GetLastError();
 | 
			
		||||
    THROW (IOException, ss.str().c_str());
 | 
			
		||||
  }
 | 
			
		||||
  return (size_t) (bytes_read);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::SerialImpl::write (const uint8_t *data, size_t length)
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::write");
 | 
			
		||||
  }
 | 
			
		||||
  DWORD bytes_written;
 | 
			
		||||
  if (!WriteFile(fd_, data, length, &bytes_written, NULL)) {
 | 
			
		||||
    stringstream ss;
 | 
			
		||||
    ss << "Error while writing to the serial port: " << GetLastError();
 | 
			
		||||
    THROW (IOException, ss.str().c_str());
 | 
			
		||||
  }
 | 
			
		||||
  return (size_t) (bytes_written);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setPort (const string &port)
 | 
			
		||||
{
 | 
			
		||||
  port_ = wstring(port.begin(), port.end());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
string
 | 
			
		||||
Serial::SerialImpl::getPort () const
 | 
			
		||||
{
 | 
			
		||||
  return string(port_.begin(), port_.end());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setTimeout (serial::Timeout &timeout)
 | 
			
		||||
{
 | 
			
		||||
  timeout_ = timeout;
 | 
			
		||||
  if (is_open_) {
 | 
			
		||||
    reconfigurePort ();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
serial::Timeout
 | 
			
		||||
Serial::SerialImpl::getTimeout () const
 | 
			
		||||
{
 | 
			
		||||
  return timeout_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setBaudrate (unsigned long baudrate)
 | 
			
		||||
{
 | 
			
		||||
  baudrate_ = baudrate;
 | 
			
		||||
  if (is_open_) {
 | 
			
		||||
    reconfigurePort ();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned long
 | 
			
		||||
Serial::SerialImpl::getBaudrate () const
 | 
			
		||||
{
 | 
			
		||||
  return baudrate_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setBytesize (serial::bytesize_t bytesize)
 | 
			
		||||
{
 | 
			
		||||
  bytesize_ = bytesize;
 | 
			
		||||
  if (is_open_) {
 | 
			
		||||
    reconfigurePort ();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
serial::bytesize_t
 | 
			
		||||
Serial::SerialImpl::getBytesize () const
 | 
			
		||||
{
 | 
			
		||||
  return bytesize_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setParity (serial::parity_t parity)
 | 
			
		||||
{
 | 
			
		||||
  parity_ = parity;
 | 
			
		||||
  if (is_open_) {
 | 
			
		||||
    reconfigurePort ();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
serial::parity_t
 | 
			
		||||
Serial::SerialImpl::getParity () const
 | 
			
		||||
{
 | 
			
		||||
  return parity_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setStopbits (serial::stopbits_t stopbits)
 | 
			
		||||
{
 | 
			
		||||
  stopbits_ = stopbits;
 | 
			
		||||
  if (is_open_) {
 | 
			
		||||
    reconfigurePort ();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
serial::stopbits_t
 | 
			
		||||
Serial::SerialImpl::getStopbits () const
 | 
			
		||||
{
 | 
			
		||||
  return stopbits_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setFlowcontrol (serial::flowcontrol_t flowcontrol)
 | 
			
		||||
{
 | 
			
		||||
  flowcontrol_ = flowcontrol;
 | 
			
		||||
  if (is_open_) {
 | 
			
		||||
    reconfigurePort ();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
serial::flowcontrol_t
 | 
			
		||||
Serial::SerialImpl::getFlowcontrol () const
 | 
			
		||||
{
 | 
			
		||||
  return flowcontrol_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::flush ()
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::flush");
 | 
			
		||||
  }
 | 
			
		||||
  FlushFileBuffers (fd_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::flushInput ()
 | 
			
		||||
{
 | 
			
		||||
  THROW (IOException, "flushInput is not supported on Windows.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::flushOutput ()
 | 
			
		||||
{
 | 
			
		||||
  THROW (IOException, "flushOutput is not supported on Windows.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::sendBreak (int duration)
 | 
			
		||||
{
 | 
			
		||||
  THROW (IOException, "sendBreak is not supported on Windows.");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setBreak (bool level)
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::setBreak");
 | 
			
		||||
  }
 | 
			
		||||
  if (level) {
 | 
			
		||||
    EscapeCommFunction (fd_, SETBREAK);
 | 
			
		||||
  } else {
 | 
			
		||||
    EscapeCommFunction (fd_, CLRBREAK);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setRTS (bool level)
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::setRTS");
 | 
			
		||||
  }
 | 
			
		||||
  if (level) {
 | 
			
		||||
    EscapeCommFunction (fd_, SETRTS);
 | 
			
		||||
  } else {
 | 
			
		||||
    EscapeCommFunction (fd_, CLRRTS);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::setDTR (bool level)
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::setDTR");
 | 
			
		||||
  }
 | 
			
		||||
  if (level) {
 | 
			
		||||
    EscapeCommFunction (fd_, SETDTR);
 | 
			
		||||
  } else {
 | 
			
		||||
    EscapeCommFunction (fd_, CLRDTR);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Serial::SerialImpl::waitForChange ()
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::waitForChange");
 | 
			
		||||
  }
 | 
			
		||||
  DWORD dwCommEvent;
 | 
			
		||||
 | 
			
		||||
  if (!SetCommMask(fd_, EV_CTS | EV_DSR | EV_RING | EV_RLSD)) {
 | 
			
		||||
    // Error setting communications mask
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!WaitCommEvent(fd_, &dwCommEvent, NULL)) {
 | 
			
		||||
    // An error occurred waiting for the event.
 | 
			
		||||
    return false;
 | 
			
		||||
  } else {
 | 
			
		||||
    // Event has occurred.
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Serial::SerialImpl::getCTS ()
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::getCTS");
 | 
			
		||||
  }
 | 
			
		||||
  DWORD dwModemStatus;
 | 
			
		||||
  if (!GetCommModemStatus(fd_, &dwModemStatus)) {
 | 
			
		||||
    THROW (IOException, "Error getting the status of the CTS line.");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return (MS_CTS_ON & dwModemStatus) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Serial::SerialImpl::getDSR ()
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::getDSR");
 | 
			
		||||
  }
 | 
			
		||||
  DWORD dwModemStatus;
 | 
			
		||||
  if (!GetCommModemStatus(fd_, &dwModemStatus)) {
 | 
			
		||||
    THROW (IOException, "Error getting the status of the DSR line.");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return (MS_DSR_ON & dwModemStatus) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Serial::SerialImpl::getRI()
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::getRI");
 | 
			
		||||
  }
 | 
			
		||||
  DWORD dwModemStatus;
 | 
			
		||||
  if (!GetCommModemStatus(fd_, &dwModemStatus)) {
 | 
			
		||||
    THROW (IOException, "Error getting the status of the RI line.");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return (MS_RING_ON & dwModemStatus) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Serial::SerialImpl::getCD()
 | 
			
		||||
{
 | 
			
		||||
  if (is_open_ == false) {
 | 
			
		||||
    throw PortNotOpenedException ("Serial::getCD");
 | 
			
		||||
  }
 | 
			
		||||
  DWORD dwModemStatus;
 | 
			
		||||
  if (!GetCommModemStatus(fd_, &dwModemStatus)) {
 | 
			
		||||
    // Error in GetCommModemStatus;
 | 
			
		||||
    THROW (IOException, "Error getting the status of the CD line.");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return (MS_RLSD_ON & dwModemStatus) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::readLock()
 | 
			
		||||
{
 | 
			
		||||
  if (WaitForSingleObject(read_mutex, INFINITE) != WAIT_OBJECT_0) {
 | 
			
		||||
    THROW (IOException, "Error claiming read mutex.");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::readUnlock()
 | 
			
		||||
{
 | 
			
		||||
  if (!ReleaseMutex(read_mutex)) {
 | 
			
		||||
    THROW (IOException, "Error releasing read mutex.");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::writeLock()
 | 
			
		||||
{
 | 
			
		||||
  if (WaitForSingleObject(write_mutex, INFINITE) != WAIT_OBJECT_0) {
 | 
			
		||||
    THROW (IOException, "Error claiming write mutex.");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::SerialImpl::writeUnlock()
 | 
			
		||||
{
 | 
			
		||||
  if (!ReleaseMutex(write_mutex)) {
 | 
			
		||||
    THROW (IOException, "Error releasing write mutex.");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // #if defined(_WIN32)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										397
									
								
								dependencies/build/serial/src/serial.cc
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										397
									
								
								dependencies/build/serial/src/serial.cc
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,397 @@
 | 
			
		||||
/* Copyright 2012 William Woodall and John Harrison */
 | 
			
		||||
#if !defined(_WIN32) && !defined(__OpenBSD__)
 | 
			
		||||
# include <alloca.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "serial/serial.h"
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#include "serial/impl/win.h"
 | 
			
		||||
#else
 | 
			
		||||
#include "serial/impl/unix.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
using std::invalid_argument;
 | 
			
		||||
using std::min;
 | 
			
		||||
using std::numeric_limits;
 | 
			
		||||
using std::vector;
 | 
			
		||||
using std::size_t;
 | 
			
		||||
using std::string;
 | 
			
		||||
 | 
			
		||||
using serial::Serial;
 | 
			
		||||
using serial::SerialException;
 | 
			
		||||
using serial::IOException;
 | 
			
		||||
using serial::bytesize_t;
 | 
			
		||||
using serial::parity_t;
 | 
			
		||||
using serial::stopbits_t;
 | 
			
		||||
using serial::flowcontrol_t;
 | 
			
		||||
 | 
			
		||||
class Serial::ScopedReadLock {
 | 
			
		||||
public:
 | 
			
		||||
  ScopedReadLock(SerialImpl *pimpl) : pimpl_(pimpl) {
 | 
			
		||||
    this->pimpl_->readLock();
 | 
			
		||||
  }
 | 
			
		||||
  ~ScopedReadLock() {
 | 
			
		||||
    this->pimpl_->readUnlock();
 | 
			
		||||
  }
 | 
			
		||||
private:
 | 
			
		||||
  // Disable copy constructors
 | 
			
		||||
  ScopedReadLock(const ScopedReadLock&);
 | 
			
		||||
  const ScopedReadLock& operator=(ScopedReadLock);
 | 
			
		||||
 | 
			
		||||
  SerialImpl *pimpl_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class Serial::ScopedWriteLock {
 | 
			
		||||
public:
 | 
			
		||||
  ScopedWriteLock(SerialImpl *pimpl) : pimpl_(pimpl) {
 | 
			
		||||
    this->pimpl_->writeLock();
 | 
			
		||||
  }
 | 
			
		||||
  ~ScopedWriteLock() {
 | 
			
		||||
    this->pimpl_->writeUnlock();
 | 
			
		||||
  }
 | 
			
		||||
private:
 | 
			
		||||
  // Disable copy constructors
 | 
			
		||||
  ScopedWriteLock(const ScopedWriteLock&);
 | 
			
		||||
  const ScopedWriteLock& operator=(ScopedWriteLock);
 | 
			
		||||
  SerialImpl *pimpl_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Serial::Serial (const string &port, uint32_t baudrate, serial::Timeout timeout,
 | 
			
		||||
                bytesize_t bytesize, parity_t parity, stopbits_t stopbits,
 | 
			
		||||
                flowcontrol_t flowcontrol)
 | 
			
		||||
 : read_cache_(""), pimpl_(new SerialImpl (port, baudrate, bytesize, parity,
 | 
			
		||||
                                           stopbits, flowcontrol))
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setTimeout(timeout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Serial::~Serial ()
 | 
			
		||||
{
 | 
			
		||||
  delete pimpl_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::open ()
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->open ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::close ()
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->close ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
Serial::isOpen () const
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->isOpen ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::available ()
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->available ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::read_ (uint8_t *buffer, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  return this->pimpl_->read (buffer, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::read (uint8_t *buffer, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock (this->pimpl_);
 | 
			
		||||
  return this->pimpl_->read (buffer, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::read (std::vector<uint8_t> &buffer, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock (this->pimpl_);
 | 
			
		||||
  uint8_t *buffer_ = new uint8_t[size];
 | 
			
		||||
  size_t bytes_read = this->pimpl_->read (buffer_, size);
 | 
			
		||||
  buffer.insert (buffer.end (), buffer_, buffer_+bytes_read);
 | 
			
		||||
  delete[] buffer_;
 | 
			
		||||
  return bytes_read;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::read (std::string &buffer, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock (this->pimpl_);
 | 
			
		||||
  uint8_t *buffer_ = new uint8_t[size];
 | 
			
		||||
  size_t bytes_read = this->pimpl_->read (buffer_, size);
 | 
			
		||||
  buffer.append (reinterpret_cast<const char*>(buffer_), bytes_read);
 | 
			
		||||
  delete[] buffer_;
 | 
			
		||||
  return bytes_read;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
string
 | 
			
		||||
Serial::read (size_t size)
 | 
			
		||||
{
 | 
			
		||||
  std::string buffer;
 | 
			
		||||
  this->read (buffer, size);
 | 
			
		||||
  return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::readline (string &buffer, size_t size, string eol)
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock (this->pimpl_);
 | 
			
		||||
  size_t eol_len = eol.length ();
 | 
			
		||||
  uint8_t *buffer_ = static_cast<uint8_t*>
 | 
			
		||||
                              (alloca (size * sizeof (uint8_t)));
 | 
			
		||||
  size_t read_so_far = 0;
 | 
			
		||||
  while (true)
 | 
			
		||||
  {
 | 
			
		||||
    size_t bytes_read = this->read_ (buffer_ + read_so_far, 1);
 | 
			
		||||
    read_so_far += bytes_read;
 | 
			
		||||
    if (bytes_read == 0) {
 | 
			
		||||
      break; // Timeout occured on reading 1 byte
 | 
			
		||||
    }
 | 
			
		||||
    if (string (reinterpret_cast<const char*>
 | 
			
		||||
         (buffer_ + read_so_far - eol_len), eol_len) == eol) {
 | 
			
		||||
      break; // EOL found
 | 
			
		||||
    }
 | 
			
		||||
    if (read_so_far == size) {
 | 
			
		||||
      break; // Reached the maximum read length
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  buffer.append(reinterpret_cast<const char*> (buffer_), read_so_far);
 | 
			
		||||
  return read_so_far;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
string
 | 
			
		||||
Serial::readline (size_t size, string eol)
 | 
			
		||||
{
 | 
			
		||||
  std::string buffer;
 | 
			
		||||
  this->readline (buffer, size, eol);
 | 
			
		||||
  return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
vector<string>
 | 
			
		||||
Serial::readlines (size_t size, string eol)
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock (this->pimpl_);
 | 
			
		||||
  std::vector<std::string> lines;
 | 
			
		||||
  size_t eol_len = eol.length ();
 | 
			
		||||
  uint8_t *buffer_ = static_cast<uint8_t*>
 | 
			
		||||
    (alloca (size * sizeof (uint8_t)));
 | 
			
		||||
  size_t read_so_far = 0;
 | 
			
		||||
  size_t start_of_line = 0;
 | 
			
		||||
  while (read_so_far < size) {
 | 
			
		||||
    size_t bytes_read = this->read_ (buffer_+read_so_far, 1);
 | 
			
		||||
    read_so_far += bytes_read;
 | 
			
		||||
    if (bytes_read == 0) {
 | 
			
		||||
      if (start_of_line != read_so_far) {
 | 
			
		||||
        lines.push_back (
 | 
			
		||||
          string (reinterpret_cast<const char*> (buffer_ + start_of_line),
 | 
			
		||||
            read_so_far - start_of_line));
 | 
			
		||||
      }
 | 
			
		||||
      break; // Timeout occured on reading 1 byte
 | 
			
		||||
    }
 | 
			
		||||
    if (string (reinterpret_cast<const char*>
 | 
			
		||||
         (buffer_ + read_so_far - eol_len), eol_len) == eol) {
 | 
			
		||||
      // EOL found
 | 
			
		||||
      lines.push_back(
 | 
			
		||||
        string(reinterpret_cast<const char*> (buffer_ + start_of_line),
 | 
			
		||||
          read_so_far - start_of_line));
 | 
			
		||||
      start_of_line = read_so_far;
 | 
			
		||||
    }
 | 
			
		||||
    if (read_so_far == size) {
 | 
			
		||||
      if (start_of_line != read_so_far) {
 | 
			
		||||
        lines.push_back(
 | 
			
		||||
          string(reinterpret_cast<const char*> (buffer_ + start_of_line),
 | 
			
		||||
            read_so_far - start_of_line));
 | 
			
		||||
      }
 | 
			
		||||
      break; // Reached the maximum read length
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return lines;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::write (const string &data)
 | 
			
		||||
{
 | 
			
		||||
  ScopedWriteLock(this->pimpl_);
 | 
			
		||||
  return this->write_ (reinterpret_cast<const uint8_t*>(data.c_str()),
 | 
			
		||||
                       data.length());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::write (const std::vector<uint8_t> &data)
 | 
			
		||||
{
 | 
			
		||||
  ScopedWriteLock(this->pimpl_);
 | 
			
		||||
  return this->write_ (&data[0], data.size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::write (const uint8_t *data, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  ScopedWriteLock(this->pimpl_);
 | 
			
		||||
  return this->write_(data, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t
 | 
			
		||||
Serial::write_ (const uint8_t *data, size_t length)
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->write (data, length);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::setPort (const string &port)
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock(this->pimpl_);
 | 
			
		||||
  ScopedWriteLock(this->pimpl_);
 | 
			
		||||
  bool was_open = pimpl_->isOpen ();
 | 
			
		||||
  if (was_open) close();
 | 
			
		||||
  pimpl_->setPort (port);
 | 
			
		||||
  if (was_open) open ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
string
 | 
			
		||||
Serial::getPort () const
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getPort ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::setTimeout (serial::Timeout &timeout)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setTimeout (timeout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
serial::Timeout
 | 
			
		||||
Serial::getTimeout () const {
 | 
			
		||||
  return pimpl_->getTimeout ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::setBaudrate (uint32_t baudrate)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setBaudrate (baudrate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t
 | 
			
		||||
Serial::getBaudrate () const
 | 
			
		||||
{
 | 
			
		||||
  return uint32_t(pimpl_->getBaudrate ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::setBytesize (bytesize_t bytesize)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setBytesize (bytesize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bytesize_t
 | 
			
		||||
Serial::getBytesize () const
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getBytesize ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::setParity (parity_t parity)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setParity (parity);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
parity_t
 | 
			
		||||
Serial::getParity () const
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getParity ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::setStopbits (stopbits_t stopbits)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setStopbits (stopbits);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stopbits_t
 | 
			
		||||
Serial::getStopbits () const
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getStopbits ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Serial::setFlowcontrol (flowcontrol_t flowcontrol)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setFlowcontrol (flowcontrol);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
flowcontrol_t
 | 
			
		||||
Serial::getFlowcontrol () const
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getFlowcontrol ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Serial::flush ()
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock(this->pimpl_);
 | 
			
		||||
  ScopedWriteLock(this->pimpl_);
 | 
			
		||||
  pimpl_->flush ();
 | 
			
		||||
  read_cache_.clear ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Serial::flushInput ()
 | 
			
		||||
{
 | 
			
		||||
  ScopedReadLock(this->pimpl_);
 | 
			
		||||
  pimpl_->flushInput ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Serial::flushOutput ()
 | 
			
		||||
{
 | 
			
		||||
  ScopedWriteLock(this->pimpl_);
 | 
			
		||||
  pimpl_->flushOutput ();
 | 
			
		||||
  read_cache_.clear ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Serial::sendBreak (int duration)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->sendBreak (duration);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Serial::setBreak (bool level)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setBreak (level);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Serial::setRTS (bool level)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setRTS (level);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Serial::setDTR (bool level)
 | 
			
		||||
{
 | 
			
		||||
  pimpl_->setDTR (level);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Serial::waitForChange()
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->waitForChange();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Serial::getCTS ()
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getCTS ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Serial::getDSR ()
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getDSR ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Serial::getRI ()
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getRI ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Serial::getCD ()
 | 
			
		||||
{
 | 
			
		||||
  return pimpl_->getCD ();
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user