Commit dff0a10c8d3b33cabd334c1566cd5abfd0ddb8e4

Authored by Peter M. Groen
0 parents

Implementation of a serial port library.

.dep.inc 0 → 100644
  1 +++ a/.dep.inc
  1 +# This code depends on make tool being used
  2 +DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES} ${TESTOBJECTFILES}))
  3 +ifneq (${DEPFILES},)
  4 +include ${DEPFILES}
  5 +endif
... ...
.gitignore 0 → 100644
  1 +++ a/.gitignore
  1 +/build/
  2 +/dist/
0 3 \ No newline at end of file
... ...
Exception.hpp 0 → 100644
  1 +++ a/Exception.hpp
  1 +#pragma once
  2 +
  3 +// System includes
  4 +#include <iostream>
  5 +#include <sstream>
  6 +#include <stdexcept>
  7 +#include <string>
  8 +
  9 +
  10 +class Exception : public std::runtime_error
  11 +{
  12 +public:
  13 + Exception(const char *file, int line, const std::string &arg)
  14 + : std::runtime_error(arg)
  15 + {
  16 + msg_ = std::string(file) + ":" + std::to_string(line) + ": " + arg;
  17 + }
  18 +
  19 + ~Exception() throw() {}
  20 +
  21 + const char *what() const throw() override
  22 + {
  23 + return msg_.c_str();
  24 + }
  25 +
  26 +private:
  27 + std::string msg_;
  28 +};
  29 +
  30 +#define THROW_EXCEPT(arg) throw Exception(__FILE__, __LINE__, arg);
... ...
Makefile 0 → 100644
  1 +++ a/Makefile
  1 +#
  2 +# There exist several targets which are by default empty and which can be
  3 +# used for execution of your targets. These targets are usually executed
  4 +# before and after some main targets. They are:
  5 +#
  6 +# .build-pre: called before 'build' target
  7 +# .build-post: called after 'build' target
  8 +# .clean-pre: called before 'clean' target
  9 +# .clean-post: called after 'clean' target
  10 +# .clobber-pre: called before 'clobber' target
  11 +# .clobber-post: called after 'clobber' target
  12 +# .all-pre: called before 'all' target
  13 +# .all-post: called after 'all' target
  14 +# .help-pre: called before 'help' target
  15 +# .help-post: called after 'help' target
  16 +#
  17 +# Targets beginning with '.' are not intended to be called on their own.
  18 +#
  19 +# Main targets can be executed directly, and they are:
  20 +#
  21 +# build build a specific configuration
  22 +# clean remove built files from a configuration
  23 +# clobber remove all built files
  24 +# all build all configurations
  25 +# help print help mesage
  26 +#
  27 +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
  28 +# .help-impl are implemented in nbproject/makefile-impl.mk.
  29 +#
  30 +# Available make variables:
  31 +#
  32 +# CND_BASEDIR base directory for relative paths
  33 +# CND_DISTDIR default top distribution directory (build artifacts)
  34 +# CND_BUILDDIR default top build directory (object files, ...)
  35 +# CONF name of current configuration
  36 +# CND_PLATFORM_${CONF} platform name (current configuration)
  37 +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
  38 +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
  39 +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
  40 +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
  41 +# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
  42 +# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
  43 +#
  44 +# NOCDDL
  45 +
  46 +
  47 +# Environment
  48 +MKDIR=mkdir
  49 +CP=cp
  50 +CCADMIN=CCadmin
  51 +
  52 +
  53 +# build
  54 +build: .build-post
  55 +
  56 +.build-pre:
  57 +# Add your pre 'build' code here...
  58 +
  59 +.build-post: .build-impl
  60 +# Add your post 'build' code here...
  61 +
  62 +
  63 +# clean
  64 +clean: .clean-post
  65 +
  66 +.clean-pre:
  67 +# Add your pre 'clean' code here...
  68 +
  69 +.clean-post: .clean-impl
  70 +# Add your post 'clean' code here...
  71 +
  72 +
  73 +# clobber
  74 +clobber: .clobber-post
  75 +
  76 +.clobber-pre:
  77 +# Add your pre 'clobber' code here...
  78 +
  79 +.clobber-post: .clobber-impl
  80 +# Add your post 'clobber' code here...
  81 +
  82 +
  83 +# all
  84 +all: .all-post
  85 +
  86 +.all-pre:
  87 +# Add your pre 'all' code here...
  88 +
  89 +.all-post: .all-impl
  90 +# Add your post 'all' code here...
  91 +
  92 +
  93 +# build tests
  94 +build-tests: .build-tests-post
  95 +
  96 +.build-tests-pre:
  97 +# Add your pre 'build-tests' code here...
  98 +
  99 +.build-tests-post: .build-tests-impl
  100 +# Add your post 'build-tests' code here...
  101 +
  102 +
  103 +# run tests
  104 +test: .test-post
  105 +
  106 +.test-pre: build-tests
  107 +# Add your pre 'test' code here...
  108 +
  109 +.test-post: .test-impl
  110 +# Add your post 'test' code here...
  111 +
  112 +
  113 +# help
  114 +help: .help-post
  115 +
  116 +.help-pre:
  117 +# Add your pre 'help' code here...
  118 +
  119 +.help-post: .help-impl
  120 +# Add your post 'help' code here...
  121 +
  122 +
  123 +
  124 +# include project implementation makefile
  125 +include nbproject/Makefile-impl.mk
  126 +
  127 +# include project make variables
  128 +include nbproject/Makefile-variables.mk
... ...
SerialPort.cpp 0 → 100644
  1 +++ a/SerialPort.cpp
  1 +// System includes
  2 +#include <iostream>
  3 +#include <sstream>
  4 +#include <stdio.h> // Standard input/output definitions
  5 +#include <string.h> // String function definitions
  6 +#include <unistd.h> // UNIX standard function definitions
  7 +#include <fcntl.h> // File control definitions
  8 +#include <errno.h> // Error number definitions
  9 +// #include <termios.h> // POSIX terminal control definitions (struct termios)
  10 +#include <system_error> // For throwing std::system_error
  11 +#include <sys/ioctl.h> // Used for TCGETS2, which is required for custom baud rates
  12 +#include <cassert>
  13 +// #include <asm/termios.h> // Terminal control definitions (struct termios)
  14 +#include <asm/ioctls.h>
  15 +#include <asm/termbits.h>
  16 +#include <algorithm>
  17 +#include <iterator>
  18 +
  19 +// User includes
  20 +#include "Exception.hpp"
  21 +#include "SerialPort.hpp"
  22 +
  23 +#define BOTHER 0010000
  24 +
  25 +SerialPort::SerialPort()
  26 +{
  27 + echo_ = false;
  28 + timeout_ms_ = defaultTimeout_ms_;
  29 + baudRateType_ = BaudRateType::STANDARD;
  30 + baudRateStandard_ = defaultBaudRate_;
  31 + readBufferSize_B_ = defaultReadBufferSize_B_;
  32 + readBuffer_.reserve(readBufferSize_B_);
  33 + state_ = State::CLOSED;
  34 +}
  35 +
  36 +SerialPort::SerialPort(const std::string& device, BaudRate baudRate)
  37 + : SerialPort()
  38 +{
  39 + device_ = device;
  40 + baudRateType_ = BaudRateType::STANDARD;
  41 + baudRateStandard_ = baudRate;
  42 +}
  43 +
  44 +SerialPort::SerialPort(const std::string& device, speed_t baudRate)
  45 + : SerialPort()
  46 +{
  47 + device_ = device;
  48 + baudRateType_ = BaudRateType::CUSTOM;
  49 + baudRateCustom_ = baudRate;
  50 +}
  51 +
  52 +SerialPort::SerialPort(
  53 + const std::string& device,
  54 + BaudRate baudRate,
  55 + NumDataBits numDataBits,
  56 + Parity parity,
  57 + NumStopBits numStopBits)
  58 + : SerialPort()
  59 +{
  60 + device_ = device;
  61 + baudRateType_ = BaudRateType::STANDARD;
  62 + baudRateStandard_ = baudRate;
  63 + numDataBits_ = numDataBits;
  64 + parity_ = parity;
  65 + numStopBits_ = numStopBits;
  66 +}
  67 +
  68 +SerialPort::~SerialPort()
  69 +{
  70 + try
  71 + {
  72 + Close();
  73 + }
  74 + catch(...)
  75 + {
  76 + // We can't do anything about this!
  77 + // But we don't want to throw within destructor, so swallow
  78 + }
  79 +}
  80 +
  81 +void SerialPort::SetDevice(const std::string& device)
  82 +{
  83 + device_ = device;
  84 + if(state_ == State::OPEN)
  85 + ConfigureTermios();
  86 +}
  87 +
  88 +void SerialPort::SetBaudRate(BaudRate baudRate)
  89 +{
  90 + baudRateType_ = BaudRateType::STANDARD;
  91 + baudRateStandard_ = baudRate;
  92 + if(state_ == State::OPEN)
  93 + ConfigureTermios();
  94 +}
  95 +
  96 +void SerialPort::SetBaudRate(speed_t baudRate)
  97 +{
  98 + baudRateType_ = BaudRateType::CUSTOM;
  99 + baudRateCustom_ = baudRate;
  100 + if(state_ == State::OPEN)
  101 + ConfigureTermios();
  102 +}
  103 +
  104 +void SerialPort::SetNumDataBits(NumDataBits numDataBits)
  105 +{
  106 + numDataBits_ = numDataBits;
  107 + if(state_ == State::OPEN)
  108 + ConfigureTermios();
  109 +}
  110 +
  111 +void SerialPort::SetParity(Parity parity)
  112 +{
  113 + parity_ = parity;
  114 + if(state_ == State::OPEN)
  115 + ConfigureTermios();
  116 +}
  117 +
  118 +void SerialPort::SetNumStopBits(NumStopBits numStopBits)
  119 +{
  120 + numStopBits_ = numStopBits;
  121 + if(state_ == State::OPEN)
  122 + ConfigureTermios();
  123 +}
  124 +
  125 +void SerialPort::Open()
  126 +{
  127 + if(device_.empty())
  128 + {
  129 + THROW_EXCEPT("Attempted to open file when file path has not been assigned to.");
  130 + }
  131 +
  132 + // Attempt to open file
  133 + //this->fileDesc = open(this->filePath, O_RDWR | O_NOCTTY | O_NDELAY);
  134 +
  135 + // O_RDONLY for read-only, O_WRONLY for write only, O_RDWR for both read/write access
  136 + // 3rd, optional parameter is mode_t mode
  137 + fileDesc_ = open(device_.c_str(), O_RDWR);
  138 +
  139 + // Check status
  140 + if(fileDesc_ == -1)
  141 + {
  142 + THROW_EXCEPT("Could not open device " + device_ + ". Is the device name correct and do you have read/write permission?");
  143 + }
  144 +
  145 + ConfigureTermios();
  146 +
  147 + // std::cout << "COM port opened successfully." << std::endl;
  148 + state_ = State::OPEN;
  149 +}
  150 +
  151 +void SerialPort::SetEcho(bool value)
  152 +{
  153 + echo_ = value;
  154 + ConfigureTermios();
  155 +}
  156 +
  157 +void SerialPort::ConfigureTermios()
  158 +{
  159 + // std::cout << "Configuring COM port \"" << device_ << "\"." << std::endl;
  160 + //================== CONFIGURE ==================//
  161 +
  162 + // termios tty = GetTermios();
  163 + termios2 tty = GetTermios2();
  164 +
  165 + //================= (.c_cflag) ===============//
  166 +
  167 + // Set num. data bits
  168 + // See https://man7.org/linux/man-pages/man3/tcflush.3.html
  169 + tty.c_cflag &= ~CSIZE; // CSIZE is a mask for the number of bits per character
  170 + switch(numDataBits_)
  171 + {
  172 + case NumDataBits::FIVE:
  173 + tty.c_cflag |= CS5;
  174 + break;
  175 + case NumDataBits::SIX:
  176 + tty.c_cflag |= CS6;
  177 + break;
  178 + case NumDataBits::SEVEN:
  179 + tty.c_cflag |= CS7;
  180 + break;
  181 + case NumDataBits::EIGHT:
  182 + tty.c_cflag |= CS8;
  183 + break;
  184 + default:
  185 + THROW_EXCEPT("numDataBits_ value not supported!");
  186 + }
  187 +
  188 + // Set parity
  189 + // See https://man7.org/linux/man-pages/man3/tcflush.3.html
  190 + switch(parity_)
  191 + {
  192 + case Parity::NONE:
  193 + tty.c_cflag &= ~PARENB;
  194 + break;
  195 + case Parity::EVEN:
  196 + tty.c_cflag |= PARENB;
  197 + tty.c_cflag &= ~PARODD; // Clearing PARODD makes the parity even
  198 + break;
  199 + case Parity::ODD:
  200 + tty.c_cflag |= PARENB;
  201 + tty.c_cflag |= PARODD;
  202 + break;
  203 + default:
  204 + THROW_EXCEPT("parity_ value not supported!");
  205 +
  206 + }
  207 +
  208 + // Set num. stop bits
  209 + switch(numStopBits_)
  210 + {
  211 + case NumStopBits::ONE:
  212 + tty.c_cflag &= ~CSTOPB;
  213 + break;
  214 + case NumStopBits::TWO:
  215 + tty.c_cflag |= CSTOPB;
  216 + break;
  217 + default:
  218 + THROW_EXCEPT("numStopBits_ value not supported!");
  219 + }
  220 +
  221 + tty.c_cflag &= ~CRTSCTS; // Disable hadrware flow control (RTS/CTS)
  222 + tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1)
  223 +
  224 +
  225 +//===================== BAUD RATE =================//
  226 +
  227 + // We used to use cfsetispeed() and cfsetospeed() with the B... macros, but this didn't allow
  228 + // us to set custom baud rates. So now to support both standard and custom baud rates lets
  229 + // just make everything "custom". This giant switch statement could be replaced with a map/lookup
  230 + // in the future
  231 + if (baudRateType_ == BaudRateType::STANDARD)
  232 + {
  233 + tty.c_cflag &= ~CBAUD;
  234 + tty.c_cflag |= CBAUDEX;
  235 + switch(baudRateStandard_)
  236 + {
  237 + case BaudRate::B_0:
  238 + // cfsetispeed(&tty, B0);
  239 + // cfsetospeed(&tty, B0);
  240 + tty.c_ispeed = 0;
  241 + tty.c_ospeed = 0;
  242 + break;
  243 + case BaudRate::B_50:
  244 + // cfsetispeed(&tty, B50);
  245 + // cfsetospeed(&tty, B50);
  246 + tty.c_ispeed = 50;
  247 + tty.c_ospeed = 50;
  248 + break;
  249 + case BaudRate::B_75:
  250 + // cfsetispeed(&tty, B75);
  251 + // cfsetospeed(&tty, B75);
  252 + tty.c_ispeed = 75;
  253 + tty.c_ospeed = 75;
  254 + break;
  255 + case BaudRate::B_110:
  256 + // cfsetispeed(&tty, B110);
  257 + // cfsetospeed(&tty, B110);
  258 + tty.c_ispeed = 110;
  259 + tty.c_ospeed = 110;
  260 + break;
  261 + case BaudRate::B_134:
  262 + // cfsetispeed(&tty, B134);
  263 + // cfsetospeed(&tty, B134);
  264 + tty.c_ispeed = 134;
  265 + tty.c_ospeed = 134;
  266 + break;
  267 + case BaudRate::B_150:
  268 + // cfsetispeed(&tty, B150);
  269 + // cfsetospeed(&tty, B150);
  270 + tty.c_ispeed = 150;
  271 + tty.c_ospeed = 150;
  272 + break;
  273 + case BaudRate::B_200:
  274 + // cfsetispeed(&tty, B200);
  275 + // cfsetospeed(&tty, B200);
  276 + tty.c_ispeed = 200;
  277 + tty.c_ospeed = 200;
  278 + break;
  279 + case BaudRate::B_300:
  280 + // cfsetispeed(&tty, B300);
  281 + // cfsetospeed(&tty, B300);
  282 + tty.c_ispeed = 300;
  283 + tty.c_ospeed = 300;
  284 + break;
  285 + case BaudRate::B_600:
  286 + // cfsetispeed(&tty, B600);
  287 + // cfsetospeed(&tty, B600);
  288 + tty.c_ispeed = 600;
  289 + tty.c_ospeed = 600;
  290 + break;
  291 + case BaudRate::B_1200:
  292 + // cfsetispeed(&tty, B1200);
  293 + // cfsetospeed(&tty, B1200);
  294 + tty.c_ispeed = 1200;
  295 + tty.c_ospeed = 1200;
  296 + break;
  297 + case BaudRate::B_1800:
  298 + // cfsetispeed(&tty, B1800);
  299 + // cfsetospeed(&tty, B1800);
  300 + tty.c_ispeed = 1800;
  301 + tty.c_ospeed = 1800;
  302 + break;
  303 + case BaudRate::B_2400:
  304 + // cfsetispeed(&tty, B2400);
  305 + // cfsetospeed(&tty, B2400);
  306 + tty.c_ispeed = 2400;
  307 + tty.c_ospeed = 2400;
  308 + break;
  309 + case BaudRate::B_4800:
  310 + // cfsetispeed(&tty, B4800);
  311 + // cfsetospeed(&tty, B4800);
  312 + tty.c_ispeed = 4800;
  313 + tty.c_ospeed = 4800;
  314 + break;
  315 + case BaudRate::B_9600:
  316 + // cfsetispeed(&tty, B9600);
  317 + // cfsetospeed(&tty, B9600);
  318 + tty.c_ispeed = 9600;
  319 + tty.c_ospeed = 9600;
  320 + break;
  321 + case BaudRate::B_19200:
  322 + // cfsetispeed(&tty, B19200);
  323 + // cfsetospeed(&tty, B19200);
  324 + tty.c_ispeed = 19200;
  325 + tty.c_ospeed = 19200;
  326 + break;
  327 + case BaudRate::B_38400:
  328 + // cfsetispeed(&tty, B38400);
  329 + // cfsetospeed(&tty, B38400);
  330 + tty.c_ispeed = 38400;
  331 + tty.c_ospeed = 38400;
  332 + break;
  333 + case BaudRate::B_57600:
  334 + // cfsetispeed(&tty, B57600);
  335 + // cfsetospeed(&tty, B57600);
  336 + tty.c_ispeed = 57600;
  337 + tty.c_ospeed = 57600;
  338 + break;
  339 + case BaudRate::B_115200:
  340 + // cfsetispeed(&tty, B115200);
  341 + // cfsetospeed(&tty, B115200);
  342 + tty.c_ispeed = 115200;
  343 + tty.c_ospeed = 115200;
  344 + break;
  345 + case BaudRate::B_230400:
  346 + // cfsetispeed(&tty, B230400);
  347 + // cfsetospeed(&tty, B230400);
  348 + tty.c_ispeed = 230400;
  349 + tty.c_ospeed = 230400;
  350 + break;
  351 + case BaudRate::B_460800:
  352 + // cfsetispeed(&tty, B460800);
  353 + // cfsetospeed(&tty, B460800);
  354 + tty.c_ispeed = 460800;
  355 + tty.c_ospeed = 460800;
  356 + break;
  357 + default:
  358 + throw std::runtime_error(std::string() + "baudRate passed to " + __PRETTY_FUNCTION__ + " unrecognized.");
  359 + }
  360 + }
  361 + // This does no different than STANDARD atm, but let's keep
  362 + // them separate for now....
  363 + else if (baudRateType_ == BaudRateType::CUSTOM)
  364 + {
  365 + tty.c_cflag &= ~CBAUD;
  366 + tty.c_cflag |= CBAUDEX;
  367 + // tty.c_cflag |= BOTHER;
  368 + tty.c_ispeed = baudRateCustom_;
  369 + tty.c_ospeed = baudRateCustom_;
  370 +
  371 +
  372 + // #include <linux/serial.h>
  373 + // // configure port to use custom speed instead of 38400
  374 + // struct serial_struct ss;
  375 + // ioctl(fileDesc_, TIOCGSERIAL, &ss);
  376 + // ss.flags = (ss.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;
  377 + // ss.custom_divisor = (ss.baud_base + (baudRateCustom_ / 2)) / baudRateCustom_;
  378 + // int closestSpeed = ss.baud_base / ss.custom_divisor;
  379 +
  380 + // if (closestSpeed < baudRateCustom_ * 98 / 100 || closestSpeed > baudRateCustom_ * 102 / 100) {
  381 + // printf("Cannot set serial port speed to %d. Closest possible is %d\n", baudRateCustom_, closestSpeed);
  382 + // }
  383 +
  384 + // ioctl(fileDesc_, TIOCSSERIAL, &ss);
  385 +
  386 + // cfsetispeed(&tty, B38400);
  387 + // cfsetospeed(&tty, B38400);
  388 + }
  389 + else
  390 + {
  391 + // Should never get here, bug in this libraries code!
  392 + assert(false);
  393 + }
  394 +
  395 + //===================== (.c_oflag) =================//
  396 +
  397 + tty.c_oflag = 0; // No remapping, no delays
  398 + tty.c_oflag &= ~OPOST; // Make raw
  399 +
  400 + //================= CONTROL CHARACTERS (.c_cc[]) ==================//
  401 +
  402 + // c_cc[VTIME] sets the inter-character timer, in units of 0.1s.
  403 + // Only meaningful when port is set to non-canonical mode
  404 + // VMIN = 0, VTIME = 0: No blocking, return immediately with what is available
  405 + // VMIN > 0, VTIME = 0: read() waits for VMIN bytes, could block indefinitely
  406 + // VMIN = 0, VTIME > 0: Block until any amount of data is available, OR timeout occurs
  407 + // VMIN > 0, VTIME > 0: Block until either VMIN characters have been received, or VTIME
  408 + // after first character has elapsed
  409 + // c_cc[WMIN] sets the number of characters to block (wait) for when read() is called.
  410 + // Set to 0 if you don't want read to block. Only meaningful when port set to non-canonical mode
  411 +
  412 + if(timeout_ms_ == -1)
  413 + {
  414 + // Always wait for at least one byte, this could
  415 + // block indefinitely
  416 + tty.c_cc[VTIME] = 0;
  417 + tty.c_cc[VMIN] = 1;
  418 + }
  419 + else if(timeout_ms_ == 0)
  420 + {
  421 + // Setting both to 0 will give a non-blocking read
  422 + tty.c_cc[VTIME] = 0;
  423 + tty.c_cc[VMIN] = 0;
  424 + }
  425 + else if(timeout_ms_ > 0)
  426 + {
  427 + tty.c_cc[VTIME] = (cc_t)(timeout_ms_/100); // 0.5 seconds read timeout
  428 + tty.c_cc[VMIN] = 0;
  429 + }
  430 +
  431 + //======================== (.c_iflag) ====================//
  432 +
  433 + tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
  434 + tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
  435 +
  436 + //=========================== LOCAL MODES (c_lflag) =======================//
  437 +
  438 + // Canonical input is when read waits for EOL or EOF characters before returning. In non-canonical mode, the rate at which
  439 + // read() returns is instead controlled by c_cc[VMIN] and c_cc[VTIME]
  440 + tty.c_lflag &= ~ICANON; // Turn off canonical input, which is suitable for pass-through
  441 + // Configure echo depending on echo_ boolean
  442 + if(echo_)
  443 + {
  444 + tty.c_lflag |= ECHO;
  445 + }
  446 + else
  447 + {
  448 + tty.c_lflag &= ~(ECHO);
  449 + }
  450 + tty.c_lflag &= ~ECHOE; // Turn off echo erase (echo erase only relevant if canonical input is active)
  451 + tty.c_lflag &= ~ECHONL; //
  452 + tty.c_lflag &= ~ISIG; // Disables recognition of INTR (interrupt), QUIT and SUSP (suspend) characters
  453 +
  454 +
  455 + // Try and use raw function call
  456 + //cfmakeraw(&tty);
  457 +
  458 + // this->SetTermios(tty);
  459 + this->SetTermios2(tty);
  460 +
  461 + /*
  462 + // Flush port, then apply attributes
  463 + tcflush(this->fileDesc, TCIFLUSH);
  464 +
  465 + if(tcsetattr(this->fileDesc, TCSANOW, &tty) != 0)
  466 + {
  467 + // Error occurred
  468 + this->sp->PrintError(SmartPrint::Ss() << "Could not apply terminal attributes for \"" << this->filePath << "\" - " << strerror(errno));
  469 + return;
  470 + }*/
  471 +}
  472 +
  473 +void SerialPort::Write(const std::string& data)
  474 +{
  475 +
  476 + if(state_ != State::OPEN)
  477 + THROW_EXCEPT(std::string() + __PRETTY_FUNCTION__ + " called but state != OPEN. Please call Open() first.");
  478 +
  479 + if(fileDesc_ < 0)
  480 + {
  481 + THROW_EXCEPT(std::string() + __PRETTY_FUNCTION__ + " called but file descriptor < 0, indicating file has not been opened.");
  482 + }
  483 +
  484 + int writeResult = write(fileDesc_, data.c_str(), data.size());
  485 +
  486 + // Check status
  487 + if (writeResult == -1)
  488 + {
  489 + throw std::system_error(EFAULT, std::system_category());
  490 + }
  491 +}
  492 +
  493 +void SerialPort::WriteBinary( const std::vector<uint8_t>& data )
  494 +{
  495 +
  496 + if(state_ != State::OPEN)
  497 + THROW_EXCEPT(std::string() + __PRETTY_FUNCTION__ + " called but state != OPEN. Please call Open() first.");
  498 +
  499 + if(fileDesc_ < 0)
  500 + {
  501 + THROW_EXCEPT(std::string() + __PRETTY_FUNCTION__ + " called but file descriptor < 0, indicating file has not been opened.");
  502 + }
  503 +
  504 + int writeResult = write(fileDesc_, data.data(), data.size());
  505 +
  506 + // Check status
  507 + if (writeResult == -1)
  508 + {
  509 + throw std::system_error(EFAULT, std::system_category());
  510 + }
  511 + }
  512 +
  513 +void SerialPort::Read(std::string& data)
  514 +{
  515 + data.clear();
  516 +
  517 + if(fileDesc_ == 0)
  518 + {
  519 + //this->sp->PrintError(SmartPrint::Ss() << "Read() was called but file descriptor (fileDesc) was 0, indicating file has not been opened.");
  520 + //return false;
  521 + THROW_EXCEPT("Read() was called but file descriptor (fileDesc) was 0, indicating file has not been opened.");
  522 + }
  523 +
  524 + // Allocate memory for read buffer
  525 + // char buf [256];
  526 + // memset (&buf, '\0', sizeof buf);
  527 +
  528 + // Read from file
  529 + // We provide the underlying raw array from the readBuffer_ vector to this C api.
  530 + // This will work because we do not delete/resize the vector while this method
  531 + // is called
  532 + ssize_t n = read( fileDesc_, &readBuffer_[0], readBufferSize_B_ );
  533 +
  534 + // Error Handling
  535 + if( n < 0 )
  536 + {
  537 + // Read was unsuccessful
  538 + throw std::system_error(EFAULT, std::system_category());
  539 + }
  540 +
  541 + if( n > 0 )
  542 + {
  543 + // buf[n] = '\0';
  544 + // printf("%s\r\n", buf);
  545 + // data.append(buf);
  546 + data = std::string( &readBuffer_[0], n );
  547 + //std::cout << *str << " and size of string =" << str->size() << "\r\n";
  548 + }
  549 +}
  550 +
  551 +void SerialPort::ReadBinary(std::vector<uint8_t>& data)
  552 +{
  553 + data.clear();
  554 +
  555 + if( fileDesc_ == 0 )
  556 + {
  557 + THROW_EXCEPT("Read() was called but file descriptor (fileDesc) was 0, indicating file has not been opened.");
  558 + }
  559 +
  560 + // Read from file
  561 + // We provide the underlying raw array from the readBuffer_ vector to this C api.
  562 + // This will work because we do not delete/resize the vector while this method
  563 + // is called
  564 + ssize_t n = read(fileDesc_, &readBuffer_[0], readBufferSize_B_);
  565 +
  566 + // Error Handling
  567 + if( n < 0 )
  568 + {
  569 + // Read was unsuccessful
  570 + throw std::system_error(EFAULT, std::system_category());
  571 + }
  572 +
  573 + if( n > 0 )
  574 + {
  575 + copy(readBuffer_.begin(), readBuffer_.begin() + n, back_inserter(data));
  576 + }
  577 +}
  578 +
  579 + // termios SerialPort::GetTermios() {
  580 +// if(fileDesc_ == -1)
  581 +// throw std::runtime_error("GetTermios() called but file descriptor was not valid.");
  582 +
  583 + // struct termios tty;
  584 + // memset(&tty, 0, sizeof(tty));
  585 +
  586 + // // Get current settings (will be stored in termios structure)
  587 + // if(tcgetattr(fileDesc_, &tty) != 0)
  588 + // {
  589 + // // Error occurred
  590 + // std::cout << "Could not get terminal attributes for \"" << device_ << "\" - " << strerror(errno) << std::endl;
  591 + // throw std::system_error(EFAULT, std::system_category());
  592 + // //return false;
  593 + // }
  594 +
  595 + // return tty;
  596 + // }
  597 +
  598 + // void SerialPort::SetTermios(termios myTermios)
  599 + // {
  600 + // // Flush port, then apply attributes
  601 + // tcflush(fileDesc_, TCIFLUSH);
  602 +
  603 + // if(tcsetattr(fileDesc_, TCSANOW, &myTermios) != 0)
  604 + // {
  605 + // // Error occurred
  606 + // std::cout << "Could not apply terminal attributes for \"" << device_ << "\" - " << strerror(errno) << std::endl;
  607 + // throw std::system_error(EFAULT, std::system_category());
  608 +
  609 + // }
  610 +
  611 + // // Successful!
  612 + // }
  613 +
  614 +termios2 SerialPort::GetTermios2()
  615 +{
  616 + struct termios2 term2;
  617 +
  618 + ioctl(fileDesc_, TCGETS2, &term2);
  619 +
  620 + return term2;
  621 +
  622 + // term2.c_cflag &= ~CBAUD; /* Remove current BAUD rate */
  623 + // term2.c_cflag |= BOTHER; /* Allow custom BAUD rate using int input */
  624 + // term2.c_ispeed = speed; /* Set the input BAUD rate */
  625 + // term2.c_ospeed = speed; /* Set the output BAUD rate */
  626 +
  627 + // ioctl(fd, TCSETS2, &term2);
  628 +}
  629 +
  630 +void SerialPort::SetTermios2(termios2 tty)
  631 +{
  632 + ioctl(fileDesc_, TCSETS2, &tty);
  633 +}
  634 +
  635 +void SerialPort::Close()
  636 +{
  637 + if(fileDesc_ != -1)
  638 + {
  639 + auto retVal = close(fileDesc_);
  640 + if(retVal != 0)
  641 + THROW_EXCEPT("Tried to close serial port " + device_ + ", but close() failed.");
  642 +
  643 + fileDesc_ = -1;
  644 + }
  645 +
  646 + state_ = State::CLOSED;
  647 +}
  648 +
  649 +void SerialPort::SetTimeout(int32_t timeout_ms)
  650 +{
  651 + if(timeout_ms < -1)
  652 + THROW_EXCEPT(std::string() + "timeout_ms provided to " + __PRETTY_FUNCTION__ + " was < -1, which is invalid.");
  653 +
  654 + if(timeout_ms > 25500)
  655 + THROW_EXCEPT(std::string() + "timeout_ms provided to " + __PRETTY_FUNCTION__ + " was > 25500, which is invalid.");
  656 +
  657 + if(state_ == State::OPEN)
  658 + THROW_EXCEPT(std::string() + __PRETTY_FUNCTION__ + " called while state == OPEN.");
  659 +
  660 + timeout_ms_ = timeout_ms;
  661 +}
  662 +
  663 +int32_t SerialPort::Available()
  664 +{
  665 + if(state_ != State::OPEN)
  666 + THROW_EXCEPT(std::string() + __PRETTY_FUNCTION__ + " called but state != OPEN. Please call Open() first.");
  667 +
  668 + int32_t ret = 0;
  669 + ioctl(fileDesc_, FIONREAD, &ret);
  670 + return ret;
  671 +
  672 +}
  673 +
  674 +State SerialPort::GetState()
  675 +{
  676 + return state_;
  677 +}
... ...
SerialPort.hpp 0 → 100644
  1 +++ a/SerialPort.hpp
  1 +#pragma once
  2 +
  3 +// System headers
  4 +#include <string>
  5 +#include <fstream> // For file I/O (reading/writing to COM port)
  6 +#include <sstream>
  7 +// #include <termios.h> // POSIX terminal control definitions (struct termios)
  8 +// #include <asm/termios.h> // Terminal control definitions (struct termios)
  9 +#include <vector>
  10 +#include <asm/ioctls.h>
  11 +#include <asm/termbits.h>
  12 +
  13 +// User headers
  14 +#include "Exception.hpp"
  15 +
  16 +/// \brief Represents the baud rate "types" that can be used with the serial port. STANDARD represents all
  17 +/// the standard baud rates as provided by UNIX, CUSTOM represents a baud rate defined by an arbitray integer.
  18 +enum class BaudRateType
  19 +{
  20 + STANDARD,
  21 + CUSTOM,
  22 +};
  23 +
  24 +/// \brief Strongly-typed enumeration of baud rates for use with the SerialPort class
  25 +/// \details Specifies all the same baud rates as UNIX, as well as B_CUSTOM to specify your
  26 +/// own. See https://linux.die.net/man/3/cfsetispeed for list of supported UNIX baud rates.
  27 +enum class BaudRate
  28 +{
  29 + B_0,
  30 + B_50,
  31 + B_75,
  32 + B_110,
  33 + B_134,
  34 + B_150,
  35 + B_200,
  36 + B_300,
  37 + B_600,
  38 + B_1200,
  39 + B_1800,
  40 + B_2400,
  41 + B_4800,
  42 + B_9600,
  43 + B_19200,
  44 + B_38400,
  45 + B_57600,
  46 + B_115200,
  47 + B_230400,
  48 + B_460800,
  49 + B_CUSTOM, // Placeholder
  50 +};
  51 +
  52 +/// \brief Enumeration of all the valid num. of data bits. Must align with the options
  53 +/// provided in termbits.h, i.e. CS5, CS6, CS7 and CS8.
  54 +enum class NumDataBits
  55 +{
  56 + FIVE,
  57 + SIX,
  58 + SEVEN,
  59 + EIGHT,
  60 +};
  61 +
  62 +enum class Parity
  63 +{
  64 + NONE,
  65 + EVEN,
  66 + ODD,
  67 +};
  68 +
  69 +enum class NumStopBits
  70 +{
  71 + ONE,
  72 + TWO,
  73 +};
  74 +
  75 +/// \brief Represents the state of the serial port.
  76 +enum class State
  77 +{
  78 + CLOSED,
  79 + OPEN,
  80 +};
  81 +
  82 +/// \brief SerialPort object is used to perform rx/tx serial communication.
  83 +class SerialPort
  84 +{
  85 +public:
  86 + /// \brief Default constructor. You must specify at least the device before calling Open().
  87 + SerialPort();
  88 +
  89 + /// \brief Constructor that sets up serial port with the basic (required) parameters.
  90 + SerialPort(const std::string &device, BaudRate baudRate);
  91 +
  92 + /// \brief Constructor that sets up serial port and allows the user to specify all the common parameters.
  93 + SerialPort(const std::string &device, BaudRate baudRate, NumDataBits numDataBits, Parity parity, NumStopBits numStopBits);
  94 +
  95 + /// \brief Constructor that sets up serial port with the basic parameters, and a custom baud rate.
  96 + SerialPort(const std::string &device, speed_t baudRate);
  97 +
  98 + /// \brief Destructor. Closes serial port if still open.
  99 + virtual ~SerialPort();
  100 +
  101 + /// \brief Sets the device to use for serial port communications.
  102 + /// \details Method can be called when serial port is in any state.
  103 + void SetDevice(const std::string &device);
  104 +
  105 + /// \brief Call this to set a standard baud rate.
  106 + void SetBaudRate(BaudRate baudRate);
  107 +
  108 + /// \brief Call this to set a custom baud rate.
  109 + void SetBaudRate(speed_t baudRate);
  110 +
  111 + /// \brief Call this to set the num. of data bits.
  112 + void SetNumDataBits(NumDataBits numDataBits);
  113 +
  114 + /// \brief Call this to set the parity.
  115 + void SetParity(Parity parity);
  116 +
  117 + void SetNumStopBits(NumStopBits numStopBits);
  118 +
  119 + /// \brief Sets the read timeout (in milliseconds)/blocking mode.
  120 + /// \details Only call when state != OPEN. This method manupulates VMIN and VTIME.
  121 + /// \param timeout_ms Set to -1 to infinite timeout, 0 to return immediately with any data (non
  122 + /// blocking, or >0 to wait for data for a specified number of milliseconds). Timeout will
  123 + /// be rounded to the nearest 100ms (a Linux API restriction). Maximum value limited to
  124 + /// 25500ms (another Linux API restriction).
  125 + void SetTimeout(int32_t timeout_ms);
  126 +
  127 + /// \brief Enables/disables echo.
  128 + /// \param value Pass in true to enable echo, false to disable echo.
  129 + void SetEcho(bool value);
  130 +
  131 + /// \brief Opens the COM port for use.
  132 + /// \throws CppLinuxSerial::Exception if device cannot be opened.
  133 + /// \note Must call this before you can configure the COM port.
  134 + void Open();
  135 +
  136 + /// \brief Closes the COM port.
  137 + void Close();
  138 +
  139 + /// \brief Sends a text message over the com port.
  140 + /// \param data The data that will be written to the COM port.
  141 + /// \throws CppLinuxSerial::Exception if state != OPEN.
  142 + void Write(const std::string& data);
  143 +
  144 + /// \brief Sends a binary message over the com port.
  145 + /// \param data The data that will be written to the COM port.
  146 + /// \throws CppLinuxSerial::Exception if state != OPEN.
  147 + void WriteBinary(const std::vector<uint8_t>& data);
  148 +
  149 + /// \brief Use to read text from the COM port.
  150 + /// \param data The object the read characters from the COM port will be saved to.
  151 + /// \param wait_ms The amount of time to wait for data. Set to 0 for non-blocking mode. Set to -1
  152 + /// to wait indefinitely for new data.
  153 + /// \throws CppLinuxSerial::Exception if state != OPEN.
  154 + void Read(std::string& data);
  155 +
  156 + /// \brief Use to read binary data from the COM port.
  157 + /// \param data The object the read uint8_t bytes from the COM port will be saved to.
  158 + /// \param wait_ms The amount of time to wait for data. Set to 0 for non-blocking mode. Set to -1
  159 + /// to wait indefinitely for new data.
  160 + /// \throws CppLinuxSerial::Exception if state != OPEN.
  161 + void ReadBinary(std::vector<uint8_t>& data);
  162 +
  163 + /// \brief Use to get number of bytes available in receive buffer.
  164 + /// \returns The number of bytes available in the receive buffer (ready to be read).
  165 + /// \throws CppLinuxSerial::Exception if state != OPEN.
  166 + int32_t Available();
  167 +
  168 + /// \brief Use to get the state of the serial port
  169 + /// \returns The state of the serial port
  170 + State GetState();
  171 +
  172 +private:
  173 +
  174 + /// \brief Configures the tty device as a serial port.
  175 + /// \warning Device must be open (valid file descriptor) when this is called.
  176 + void ConfigureTermios();
  177 +
  178 + // void SetTermios(termios myTermios);
  179 +
  180 + /// \brief Returns a populated termios2 structure for the serial port pointed to by the file descriptor.
  181 + termios2 GetTermios2();
  182 +
  183 + /// \brief Assigns the provided tty settings to the serial port pointed to by the file descriptor.
  184 + void SetTermios2(termios2 tty);
  185 +
  186 + /// \brief Keeps track of the serial port's state.
  187 + State state_;
  188 +
  189 + /// \brief The file path to the serial port device (e.g. "/dev/ttyUSB0").
  190 + std::string device_;
  191 +
  192 + /// \brief The type of baud rate that the user has specified.
  193 + BaudRateType baudRateType_;
  194 +
  195 + /// \brief The current baud rate if baudRateType_ == STANDARD.
  196 + BaudRate baudRateStandard_;
  197 +
  198 + /// \brief The current baud rate if baudRateType_ == CUSTOM.
  199 + speed_t baudRateCustom_;
  200 +
  201 + /// \brief The num. of data bits. Defaults to 8 (most common).
  202 + NumDataBits numDataBits_ = NumDataBits::EIGHT;
  203 +
  204 + /// \brief The parity. Defaults to none (most common).
  205 + Parity parity_ = Parity::NONE;
  206 +
  207 + /// \brief The num. of stop bits. Defaults to 1 (most common).
  208 + NumStopBits numStopBits_ = NumStopBits::ONE;
  209 +
  210 + /// \brief The file descriptor for the open file. This gets written to when Open() is called.
  211 + int fileDesc_;
  212 +
  213 + bool echo_;
  214 +
  215 + int32_t timeout_ms_;
  216 +
  217 + std::vector<char> readBuffer_;
  218 + unsigned char readBufferSize_B_;
  219 +
  220 + static constexpr BaudRate defaultBaudRate_ = BaudRate::B_57600;
  221 + static constexpr int32_t defaultTimeout_ms_ = -1;
  222 + static constexpr unsigned char defaultReadBufferSize_B_ = 255;
  223 +};
... ...
main.cpp 0 → 100644
  1 +++ a/main.cpp
  1 +#include "SerialPort.hpp"
  2 +
  3 +#include <iostream>
  4 +#include <string>
  5 +#include <vector>
  6 +
  7 +int main(int argc, char** argv)
  8 +{
  9 + SerialPort oPort;
  10 +
  11 + oPort.SetDevice( "/dev/ttyUSB0" );
  12 + oPort.SetNumDataBits(NumDataBits::EIGHT);
  13 + oPort.SetParity(Parity::NONE);
  14 + oPort.SetNumStopBits(NumStopBits::ONE);
  15 + oPort.SetBaudRate( BaudRate::B_2400 );
  16 +
  17 + oPort.Open();
  18 +
  19 + // Create data package.
  20 + std::vector<uint8_t> data_binair;
  21 + std::string data_string;
  22 +
  23 + for( uint8_t nCount = 0; nCount < 255; nCount++ )
  24 + {
  25 + data_binair.push_back( nCount );
  26 + data_string += std::to_string(nCount);
  27 + }
  28 + while( 1 )
  29 + {
  30 + oPort.WriteBinary( data_binair );
  31 + oPort.Write( data_string );
  32 + }
  33 +
  34 + return 0;
  35 +}
  36 +
... ...
nbproject/Makefile-Debug.mk 0 → 100644
  1 +++ a/nbproject/Makefile-Debug.mk
  1 +#
  2 +# Generated Makefile - do not edit!
  3 +#
  4 +# Edit the Makefile in the project folder instead (../Makefile). Each target
  5 +# has a -pre and a -post target defined where you can add customized code.
  6 +#
  7 +# This makefile implements configuration specific macros and targets.
  8 +
  9 +
  10 +# Environment
  11 +MKDIR=mkdir
  12 +CP=cp
  13 +GREP=grep
  14 +NM=nm
  15 +CCADMIN=CCadmin
  16 +RANLIB=ranlib
  17 +CC=gcc
  18 +CCC=g++
  19 +CXX=g++
  20 +FC=gfortran
  21 +AS=as
  22 +
  23 +# Macros
  24 +CND_PLATFORM=GNU-Linux
  25 +CND_DLIB_EXT=so
  26 +CND_CONF=Debug
  27 +CND_DISTDIR=dist
  28 +CND_BUILDDIR=build
  29 +
  30 +# Include project Makefile
  31 +include Makefile
  32 +
  33 +# Object Directory
  34 +OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
  35 +
  36 +# Object Files
  37 +OBJECTFILES= \
  38 + ${OBJECTDIR}/SerialPort.o \
  39 + ${OBJECTDIR}/main.o
  40 +
  41 +
  42 +# C Compiler Flags
  43 +CFLAGS=
  44 +
  45 +# CC Compiler Flags
  46 +CCFLAGS=-m64
  47 +CXXFLAGS=-m64
  48 +
  49 +# Fortran Compiler Flags
  50 +FFLAGS=
  51 +
  52 +# Assembler Flags
  53 +ASFLAGS=
  54 +
  55 +# Link Libraries and Options
  56 +LDLIBSOPTIONS=
  57 +
  58 +# Build Targets
  59 +.build-conf: ${BUILD_SUBPROJECTS}
  60 + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport
  61 +
  62 +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport: ${OBJECTFILES}
  63 + ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
  64 + ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport ${OBJECTFILES} ${LDLIBSOPTIONS}
  65 +
  66 +${OBJECTDIR}/SerialPort.o: SerialPort.cpp
  67 + ${MKDIR} -p ${OBJECTDIR}
  68 + ${RM} "$@.d"
  69 + $(COMPILE.cc) -g -std=c++14 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/SerialPort.o SerialPort.cpp
  70 +
  71 +${OBJECTDIR}/main.o: main.cpp
  72 + ${MKDIR} -p ${OBJECTDIR}
  73 + ${RM} "$@.d"
  74 + $(COMPILE.cc) -g -std=c++14 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
  75 +
  76 +# Subprojects
  77 +.build-subprojects:
  78 +
  79 +# Clean Targets
  80 +.clean-conf: ${CLEAN_SUBPROJECTS}
  81 + ${RM} -r ${CND_BUILDDIR}/${CND_CONF}
  82 +
  83 +# Subprojects
  84 +.clean-subprojects:
  85 +
  86 +# Enable dependency checking
  87 +.dep.inc: .depcheck-impl
  88 +
  89 +include .dep.inc
... ...
nbproject/Makefile-Release.mk 0 → 100644
  1 +++ a/nbproject/Makefile-Release.mk
  1 +#
  2 +# Generated Makefile - do not edit!
  3 +#
  4 +# Edit the Makefile in the project folder instead (../Makefile). Each target
  5 +# has a -pre and a -post target defined where you can add customized code.
  6 +#
  7 +# This makefile implements configuration specific macros and targets.
  8 +
  9 +
  10 +# Environment
  11 +MKDIR=mkdir
  12 +CP=cp
  13 +GREP=grep
  14 +NM=nm
  15 +CCADMIN=CCadmin
  16 +RANLIB=ranlib
  17 +CC=gcc
  18 +CCC=g++
  19 +CXX=g++
  20 +FC=gfortran
  21 +AS=as
  22 +
  23 +# Macros
  24 +CND_PLATFORM=GNU-Linux
  25 +CND_DLIB_EXT=so
  26 +CND_CONF=Release
  27 +CND_DISTDIR=dist
  28 +CND_BUILDDIR=build
  29 +
  30 +# Include project Makefile
  31 +include Makefile
  32 +
  33 +# Object Directory
  34 +OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
  35 +
  36 +# Object Files
  37 +OBJECTFILES= \
  38 + ${OBJECTDIR}/SerialPort.o \
  39 + ${OBJECTDIR}/main.o
  40 +
  41 +
  42 +# C Compiler Flags
  43 +CFLAGS=
  44 +
  45 +# CC Compiler Flags
  46 +CCFLAGS=
  47 +CXXFLAGS=
  48 +
  49 +# Fortran Compiler Flags
  50 +FFLAGS=
  51 +
  52 +# Assembler Flags
  53 +ASFLAGS=
  54 +
  55 +# Link Libraries and Options
  56 +LDLIBSOPTIONS=
  57 +
  58 +# Build Targets
  59 +.build-conf: ${BUILD_SUBPROJECTS}
  60 + "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport
  61 +
  62 +${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport: ${OBJECTFILES}
  63 + ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
  64 + ${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport ${OBJECTFILES} ${LDLIBSOPTIONS}
  65 +
  66 +${OBJECTDIR}/SerialPort.o: SerialPort.cpp
  67 + ${MKDIR} -p ${OBJECTDIR}
  68 + ${RM} "$@.d"
  69 + $(COMPILE.cc) -O2 -std=c++14 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/SerialPort.o SerialPort.cpp
  70 +
  71 +${OBJECTDIR}/main.o: main.cpp
  72 + ${MKDIR} -p ${OBJECTDIR}
  73 + ${RM} "$@.d"
  74 + $(COMPILE.cc) -O2 -std=c++14 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
  75 +
  76 +# Subprojects
  77 +.build-subprojects:
  78 +
  79 +# Clean Targets
  80 +.clean-conf: ${CLEAN_SUBPROJECTS}
  81 + ${RM} -r ${CND_BUILDDIR}/${CND_CONF}
  82 +
  83 +# Subprojects
  84 +.clean-subprojects:
  85 +
  86 +# Enable dependency checking
  87 +.dep.inc: .depcheck-impl
  88 +
  89 +include .dep.inc
... ...
nbproject/Makefile-impl.mk 0 → 100644
  1 +++ a/nbproject/Makefile-impl.mk
  1 +#
  2 +# Generated Makefile - do not edit!
  3 +#
  4 +# Edit the Makefile in the project folder instead (../Makefile). Each target
  5 +# has a pre- and a post- target defined where you can add customization code.
  6 +#
  7 +# This makefile implements macros and targets common to all configurations.
  8 +#
  9 +# NOCDDL
  10 +
  11 +
  12 +# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
  13 +# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
  14 +# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
  15 +# and .clean-reqprojects-conf unless SUB has the value 'no'
  16 +SUB_no=NO
  17 +SUBPROJECTS=${SUB_${SUB}}
  18 +BUILD_SUBPROJECTS_=.build-subprojects
  19 +BUILD_SUBPROJECTS_NO=
  20 +BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
  21 +CLEAN_SUBPROJECTS_=.clean-subprojects
  22 +CLEAN_SUBPROJECTS_NO=
  23 +CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
  24 +
  25 +
  26 +# Project Name
  27 +PROJECTNAME=serialport
  28 +
  29 +# Active Configuration
  30 +DEFAULTCONF=Debug
  31 +CONF=${DEFAULTCONF}
  32 +
  33 +# All Configurations
  34 +ALLCONFS=Debug Release
  35 +
  36 +
  37 +# build
  38 +.build-impl: .build-pre .validate-impl .depcheck-impl
  39 + @#echo "=> Running $@... Configuration=$(CONF)"
  40 + "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf
  41 +
  42 +
  43 +# clean
  44 +.clean-impl: .clean-pre .validate-impl .depcheck-impl
  45 + @#echo "=> Running $@... Configuration=$(CONF)"
  46 + "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf
  47 +
  48 +
  49 +# clobber
  50 +.clobber-impl: .clobber-pre .depcheck-impl
  51 + @#echo "=> Running $@..."
  52 + for CONF in ${ALLCONFS}; \
  53 + do \
  54 + "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
  55 + done
  56 +
  57 +# all
  58 +.all-impl: .all-pre .depcheck-impl
  59 + @#echo "=> Running $@..."
  60 + for CONF in ${ALLCONFS}; \
  61 + do \
  62 + "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \
  63 + done
  64 +
  65 +# build tests
  66 +.build-tests-impl: .build-impl .build-tests-pre
  67 + @#echo "=> Running $@... Configuration=$(CONF)"
  68 + "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf
  69 +
  70 +# run tests
  71 +.test-impl: .build-tests-impl .test-pre
  72 + @#echo "=> Running $@... Configuration=$(CONF)"
  73 + "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf
  74 +
  75 +# dependency checking support
  76 +.depcheck-impl:
  77 + @echo "# This code depends on make tool being used" >.dep.inc
  78 + @if [ -n "${MAKE_VERSION}" ]; then \
  79 + echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES} \$${TESTOBJECTFILES}))" >>.dep.inc; \
  80 + echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
  81 + echo "include \$${DEPFILES}" >>.dep.inc; \
  82 + echo "endif" >>.dep.inc; \
  83 + else \
  84 + echo ".KEEP_STATE:" >>.dep.inc; \
  85 + echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
  86 + fi
  87 +
  88 +# configuration validation
  89 +.validate-impl:
  90 + @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
  91 + then \
  92 + echo ""; \
  93 + echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
  94 + echo "See 'make help' for details."; \
  95 + echo "Current directory: " `pwd`; \
  96 + echo ""; \
  97 + fi
  98 + @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
  99 + then \
  100 + exit 1; \
  101 + fi
  102 +
  103 +
  104 +# help
  105 +.help-impl: .help-pre
  106 + @echo "This makefile supports the following configurations:"
  107 + @echo " ${ALLCONFS}"
  108 + @echo ""
  109 + @echo "and the following targets:"
  110 + @echo " build (default target)"
  111 + @echo " clean"
  112 + @echo " clobber"
  113 + @echo " all"
  114 + @echo " help"
  115 + @echo ""
  116 + @echo "Makefile Usage:"
  117 + @echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
  118 + @echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
  119 + @echo " make [SUB=no] clobber"
  120 + @echo " make [SUB=no] all"
  121 + @echo " make help"
  122 + @echo ""
  123 + @echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
  124 + @echo " also build subprojects."
  125 + @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
  126 + @echo " also clean subprojects."
  127 + @echo "Target 'clobber' will remove all built files from all configurations and,"
  128 + @echo " unless 'SUB=no', also from subprojects."
  129 + @echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
  130 + @echo " also build subprojects."
  131 + @echo "Target 'help' prints this message."
  132 + @echo ""
  133 +
... ...
nbproject/Makefile-variables.mk 0 → 100644
  1 +++ a/nbproject/Makefile-variables.mk
  1 +#
  2 +# Generated - do not edit!
  3 +#
  4 +# NOCDDL
  5 +#
  6 +CND_BASEDIR=`pwd`
  7 +CND_BUILDDIR=build
  8 +CND_DISTDIR=dist
  9 +# Debug configuration
  10 +CND_PLATFORM_Debug=GNU-Linux
  11 +CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux
  12 +CND_ARTIFACT_NAME_Debug=serialport
  13 +CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux/serialport
  14 +CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux/package
  15 +CND_PACKAGE_NAME_Debug=serialport.tar
  16 +CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux/package/serialport.tar
  17 +# Release configuration
  18 +CND_PLATFORM_Release=GNU-Linux
  19 +CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux
  20 +CND_ARTIFACT_NAME_Release=serialport
  21 +CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux/serialport
  22 +CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux/package
  23 +CND_PACKAGE_NAME_Release=serialport.tar
  24 +CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux/package/serialport.tar
  25 +#
  26 +# include compiler specific variables
  27 +#
  28 +# dmake command
  29 +ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \
  30 + (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)
  31 +#
  32 +# gmake command
  33 +.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk))
  34 +#
  35 +include nbproject/private/Makefile-variables.mk
... ...
nbproject/Package-Debug.bash 0 → 100644
  1 +++ a/nbproject/Package-Debug.bash
  1 +#!/bin/bash -x
  2 +
  3 +#
  4 +# Generated - do not edit!
  5 +#
  6 +
  7 +# Macros
  8 +TOP=`pwd`
  9 +CND_PLATFORM=GNU-Linux
  10 +CND_CONF=Debug
  11 +CND_DISTDIR=dist
  12 +CND_BUILDDIR=build
  13 +CND_DLIB_EXT=so
  14 +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
  15 +TMPDIRNAME=tmp-packaging
  16 +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport
  17 +OUTPUT_BASENAME=serialport
  18 +PACKAGE_TOP_DIR=serialport/
  19 +
  20 +# Functions
  21 +function checkReturnCode
  22 +{
  23 + rc=$?
  24 + if [ $rc != 0 ]
  25 + then
  26 + exit $rc
  27 + fi
  28 +}
  29 +function makeDirectory
  30 +# $1 directory path
  31 +# $2 permission (optional)
  32 +{
  33 + mkdir -p "$1"
  34 + checkReturnCode
  35 + if [ "$2" != "" ]
  36 + then
  37 + chmod $2 "$1"
  38 + checkReturnCode
  39 + fi
  40 +}
  41 +function copyFileToTmpDir
  42 +# $1 from-file path
  43 +# $2 to-file path
  44 +# $3 permission
  45 +{
  46 + cp "$1" "$2"
  47 + checkReturnCode
  48 + if [ "$3" != "" ]
  49 + then
  50 + chmod $3 "$2"
  51 + checkReturnCode
  52 + fi
  53 +}
  54 +
  55 +# Setup
  56 +cd "${TOP}"
  57 +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
  58 +rm -rf ${NBTMPDIR}
  59 +mkdir -p ${NBTMPDIR}
  60 +
  61 +# Copy files and create directories and links
  62 +cd "${TOP}"
  63 +makeDirectory "${NBTMPDIR}/serialport/bin"
  64 +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
  65 +
  66 +
  67 +# Generate tar file
  68 +cd "${TOP}"
  69 +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serialport.tar
  70 +cd ${NBTMPDIR}
  71 +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serialport.tar *
  72 +checkReturnCode
  73 +
  74 +# Cleanup
  75 +cd "${TOP}"
  76 +rm -rf ${NBTMPDIR}
... ...
nbproject/Package-Release.bash 0 → 100644
  1 +++ a/nbproject/Package-Release.bash
  1 +#!/bin/bash -x
  2 +
  3 +#
  4 +# Generated - do not edit!
  5 +#
  6 +
  7 +# Macros
  8 +TOP=`pwd`
  9 +CND_PLATFORM=GNU-Linux
  10 +CND_CONF=Release
  11 +CND_DISTDIR=dist
  12 +CND_BUILDDIR=build
  13 +CND_DLIB_EXT=so
  14 +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
  15 +TMPDIRNAME=tmp-packaging
  16 +OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/serialport
  17 +OUTPUT_BASENAME=serialport
  18 +PACKAGE_TOP_DIR=serialport/
  19 +
  20 +# Functions
  21 +function checkReturnCode
  22 +{
  23 + rc=$?
  24 + if [ $rc != 0 ]
  25 + then
  26 + exit $rc
  27 + fi
  28 +}
  29 +function makeDirectory
  30 +# $1 directory path
  31 +# $2 permission (optional)
  32 +{
  33 + mkdir -p "$1"
  34 + checkReturnCode
  35 + if [ "$2" != "" ]
  36 + then
  37 + chmod $2 "$1"
  38 + checkReturnCode
  39 + fi
  40 +}
  41 +function copyFileToTmpDir
  42 +# $1 from-file path
  43 +# $2 to-file path
  44 +# $3 permission
  45 +{
  46 + cp "$1" "$2"
  47 + checkReturnCode
  48 + if [ "$3" != "" ]
  49 + then
  50 + chmod $3 "$2"
  51 + checkReturnCode
  52 + fi
  53 +}
  54 +
  55 +# Setup
  56 +cd "${TOP}"
  57 +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
  58 +rm -rf ${NBTMPDIR}
  59 +mkdir -p ${NBTMPDIR}
  60 +
  61 +# Copy files and create directories and links
  62 +cd "${TOP}"
  63 +makeDirectory "${NBTMPDIR}/serialport/bin"
  64 +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
  65 +
  66 +
  67 +# Generate tar file
  68 +cd "${TOP}"
  69 +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serialport.tar
  70 +cd ${NBTMPDIR}
  71 +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/serialport.tar *
  72 +checkReturnCode
  73 +
  74 +# Cleanup
  75 +cd "${TOP}"
  76 +rm -rf ${NBTMPDIR}
... ...
nbproject/configurations.xml 0 → 100644
  1 +++ a/nbproject/configurations.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<configurationDescriptor version="100">
  3 + <logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
  4 + <logicalFolder name="HeaderFiles"
  5 + displayName="Header Files"
  6 + projectFiles="true">
  7 + <itemPath>Exception.hpp</itemPath>
  8 + <itemPath>SerialPort.hpp</itemPath>
  9 + </logicalFolder>
  10 + <logicalFolder name="ResourceFiles"
  11 + displayName="Resource Files"
  12 + projectFiles="true">
  13 + </logicalFolder>
  14 + <logicalFolder name="SourceFiles"
  15 + displayName="Source Files"
  16 + projectFiles="true">
  17 + <itemPath>SerialPort.cpp</itemPath>
  18 + <itemPath>main.cpp</itemPath>
  19 + </logicalFolder>
  20 + <logicalFolder name="TestFiles"
  21 + displayName="Test Files"
  22 + projectFiles="false"
  23 + kind="TEST_LOGICAL_FOLDER">
  24 + </logicalFolder>
  25 + <logicalFolder name="ExternalFiles"
  26 + displayName="Important Files"
  27 + projectFiles="false"
  28 + kind="IMPORTANT_FILES_FOLDER">
  29 + <itemPath>Makefile</itemPath>
  30 + </logicalFolder>
  31 + </logicalFolder>
  32 + <projectmakefile>Makefile</projectmakefile>
  33 + <confs>
  34 + <conf name="Debug" type="1">
  35 + <toolsSet>
  36 + <compilerSet>default</compilerSet>
  37 + <dependencyChecking>true</dependencyChecking>
  38 + <rebuildPropChanged>false</rebuildPropChanged>
  39 + </toolsSet>
  40 + <compileType>
  41 + <ccTool>
  42 + <architecture>2</architecture>
  43 + <standard>11</standard>
  44 + </ccTool>
  45 + </compileType>
  46 + <item path="Exception.hpp" ex="false" tool="3" flavor2="0">
  47 + </item>
  48 + <item path="SerialPort.cpp" ex="false" tool="1" flavor2="0">
  49 + </item>
  50 + <item path="SerialPort.hpp" ex="false" tool="3" flavor2="0">
  51 + </item>
  52 + <item path="main.cpp" ex="false" tool="1" flavor2="0">
  53 + </item>
  54 + </conf>
  55 + <conf name="Release" type="1">
  56 + <toolsSet>
  57 + <compilerSet>default</compilerSet>
  58 + <dependencyChecking>true</dependencyChecking>
  59 + <rebuildPropChanged>false</rebuildPropChanged>
  60 + </toolsSet>
  61 + <compileType>
  62 + <cTool>
  63 + <developmentMode>5</developmentMode>
  64 + </cTool>
  65 + <ccTool>
  66 + <developmentMode>5</developmentMode>
  67 + <standard>11</standard>
  68 + </ccTool>
  69 + <fortranCompilerTool>
  70 + <developmentMode>5</developmentMode>
  71 + </fortranCompilerTool>
  72 + <asmTool>
  73 + <developmentMode>5</developmentMode>
  74 + </asmTool>
  75 + </compileType>
  76 + <item path="Exception.hpp" ex="false" tool="3" flavor2="0">
  77 + </item>
  78 + <item path="SerialPort.cpp" ex="false" tool="1" flavor2="0">
  79 + </item>
  80 + <item path="SerialPort.hpp" ex="false" tool="3" flavor2="0">
  81 + </item>
  82 + <item path="main.cpp" ex="false" tool="1" flavor2="0">
  83 + </item>
  84 + </conf>
  85 + </confs>
  86 +</configurationDescriptor>
... ...
nbproject/private/Makefile-variables.mk 0 → 100644
  1 +++ a/nbproject/private/Makefile-variables.mk
  1 +#
  2 +# Generated - do not edit!
  3 +#
  4 +# NOCDDL
  5 +#
  6 +# Debug configuration
  7 +# Release configuration
... ...
nbproject/private/c_standard_headers_indexer.c 0 → 100644
  1 +++ a/nbproject/private/c_standard_headers_indexer.c
  1 +/*
  2 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  3 + *
  4 + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
  5 + *
  6 + * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
  7 + * Other names may be trademarks of their respective owners.
  8 + *
  9 + * The contents of this file are subject to the terms of either the GNU
  10 + * General Public License Version 2 only ("GPL") or the Common
  11 + * Development and Distribution License("CDDL") (collectively, the
  12 + * "License"). You may not use this file except in compliance with the
  13 + * License. You can obtain a copy of the License at
  14 + * http://www.netbeans.org/cddl-gplv2.html
  15 + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  16 + * specific language governing permissions and limitations under the
  17 + * License. When distributing the software, include this License Header
  18 + * Notice in each file and include the License file at
  19 + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
  20 + * particular file as subject to the "Classpath" exception as provided
  21 + * by Oracle in the GPL Version 2 section of the License file that
  22 + * accompanied this code. If applicable, add the following below the
  23 + * License Header, with the fields enclosed by brackets [] replaced by
  24 + * your own identifying information:
  25 + * "Portions Copyrighted [year] [name of copyright owner]"
  26 + *
  27 + * If you wish your version of this file to be governed by only the CDDL
  28 + * or only the GPL Version 2, indicate your decision by adding
  29 + * "[Contributor] elects to include this software in this distribution
  30 + * under the [CDDL or GPL Version 2] license." If you do not indicate a
  31 + * single choice of license, a recipient has the option to distribute
  32 + * your version of this file under either the CDDL, the GPL Version 2 or
  33 + * to extend the choice of license to its licensees as provided above.
  34 + * However, if you add GPL Version 2 code and therefore, elected the GPL
  35 + * Version 2 license, then the option applies only if the new code is
  36 + * made subject to such option by the copyright holder.
  37 + *
  38 + * Contributor(s):
  39 + */
  40 +
  41 +// List of standard headers was taken in http://en.cppreference.com/w/c/header
  42 +
  43 +#include <assert.h> // Conditionally compiled macro that compares its argument to zero
  44 +#include <ctype.h> // Functions to determine the type contained in character data
  45 +#include <errno.h> // Macros reporting error conditions
  46 +#include <float.h> // Limits of float types
  47 +#include <limits.h> // Sizes of basic types
  48 +#include <locale.h> // Localization utilities
  49 +#include <math.h> // Common mathematics functions
  50 +#include <setjmp.h> // Nonlocal jumps
  51 +#include <signal.h> // Signal handling
  52 +#include <stdarg.h> // Variable arguments
  53 +#include <stddef.h> // Common macro definitions
  54 +#include <stdio.h> // Input/output
  55 +#include <string.h> // String handling
  56 +#include <stdlib.h> // General utilities: memory management, program utilities, string conversions, random numbers
  57 +#include <time.h> // Time/date utilities
  58 +#include <iso646.h> // (since C95) Alternative operator spellings
  59 +#include <wchar.h> // (since C95) Extended multibyte and wide character utilities
  60 +#include <wctype.h> // (since C95) Wide character classification and mapping utilities
  61 +#ifdef _STDC_C99
  62 +#include <complex.h> // (since C99) Complex number arithmetic
  63 +#include <fenv.h> // (since C99) Floating-point environment
  64 +#include <inttypes.h> // (since C99) Format conversion of integer types
  65 +#include <stdbool.h> // (since C99) Boolean type
  66 +#include <stdint.h> // (since C99) Fixed-width integer types
  67 +#include <tgmath.h> // (since C99) Type-generic math (macros wrapping math.h and complex.h)
  68 +#endif
  69 +#ifdef _STDC_C11
  70 +#include <stdalign.h> // (since C11) alignas and alignof convenience macros
  71 +#include <stdatomic.h> // (since C11) Atomic types
  72 +#include <stdnoreturn.h> // (since C11) noreturn convenience macros
  73 +#include <threads.h> // (since C11) Thread library
  74 +#include <uchar.h> // (since C11) UTF-16 and UTF-32 character utilities
  75 +#endif
... ...
nbproject/private/configurations.xml 0 → 100644
  1 +++ a/nbproject/private/configurations.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<configurationDescriptor version="100">
  3 + <projectmakefile>Makefile</projectmakefile>
  4 + <confs>
  5 + <conf name="Debug" type="1">
  6 + <toolsSet>
  7 + <developmentServer>localhost</developmentServer>
  8 + <platform>2</platform>
  9 + </toolsSet>
  10 + <dbx_gdbdebugger version="1">
  11 + <gdb_pathmaps>
  12 + </gdb_pathmaps>
  13 + <gdb_interceptlist>
  14 + <gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
  15 + </gdb_interceptlist>
  16 + <gdb_options>
  17 + <DebugOptions>
  18 + </DebugOptions>
  19 + </gdb_options>
  20 + <gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
  21 + </dbx_gdbdebugger>
  22 + <nativedebugger version="1">
  23 + <engine>gdb</engine>
  24 + </nativedebugger>
  25 + <runprofile version="9">
  26 + <runcommandpicklist>
  27 + <runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
  28 + </runcommandpicklist>
  29 + <runcommand>"${OUTPUT_PATH}"</runcommand>
  30 + <rundir></rundir>
  31 + <buildfirst>true</buildfirst>
  32 + <terminal-type>0</terminal-type>
  33 + <remove-instrumentation>0</remove-instrumentation>
  34 + <environment>
  35 + </environment>
  36 + </runprofile>
  37 + </conf>
  38 + <conf name="Release" type="1">
  39 + <toolsSet>
  40 + <developmentServer>localhost</developmentServer>
  41 + <platform>2</platform>
  42 + </toolsSet>
  43 + <dbx_gdbdebugger version="1">
  44 + <gdb_pathmaps>
  45 + </gdb_pathmaps>
  46 + <gdb_interceptlist>
  47 + <gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
  48 + </gdb_interceptlist>
  49 + <gdb_options>
  50 + <DebugOptions>
  51 + </DebugOptions>
  52 + </gdb_options>
  53 + <gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
  54 + </dbx_gdbdebugger>
  55 + <nativedebugger version="1">
  56 + <engine>gdb</engine>
  57 + </nativedebugger>
  58 + <runprofile version="9">
  59 + <runcommandpicklist>
  60 + <runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
  61 + </runcommandpicklist>
  62 + <runcommand>"${OUTPUT_PATH}"</runcommand>
  63 + <rundir></rundir>
  64 + <buildfirst>true</buildfirst>
  65 + <terminal-type>0</terminal-type>
  66 + <remove-instrumentation>0</remove-instrumentation>
  67 + <environment>
  68 + </environment>
  69 + </runprofile>
  70 + </conf>
  71 + </confs>
  72 +</configurationDescriptor>
... ...
nbproject/private/cpp_standard_headers_indexer.cpp 0 → 100644
  1 +++ a/nbproject/private/cpp_standard_headers_indexer.cpp
  1 +/*
  2 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
  3 + *
  4 + * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
  5 + *
  6 + * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
  7 + * Other names may be trademarks of their respective owners.
  8 + *
  9 + * The contents of this file are subject to the terms of either the GNU
  10 + * General Public License Version 2 only ("GPL") or the Common
  11 + * Development and Distribution License("CDDL") (collectively, the
  12 + * "License"). You may not use this file except in compliance with the
  13 + * License. You can obtain a copy of the License at
  14 + * http://www.netbeans.org/cddl-gplv2.html
  15 + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  16 + * specific language governing permissions and limitations under the
  17 + * License. When distributing the software, include this License Header
  18 + * Notice in each file and include the License file at
  19 + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
  20 + * particular file as subject to the "Classpath" exception as provided
  21 + * by Oracle in the GPL Version 2 section of the License file that
  22 + * accompanied this code. If applicable, add the following below the
  23 + * License Header, with the fields enclosed by brackets [] replaced by
  24 + * your own identifying information:
  25 + * "Portions Copyrighted [year] [name of copyright owner]"
  26 + *
  27 + * If you wish your version of this file to be governed by only the CDDL
  28 + * or only the GPL Version 2, indicate your decision by adding
  29 + * "[Contributor] elects to include this software in this distribution
  30 + * under the [CDDL or GPL Version 2] license." If you do not indicate a
  31 + * single choice of license, a recipient has the option to distribute
  32 + * your version of this file under either the CDDL, the GPL Version 2 or
  33 + * to extend the choice of license to its licensees as provided above.
  34 + * However, if you add GPL Version 2 code and therefore, elected the GPL
  35 + * Version 2 license, then the option applies only if the new code is
  36 + * made subject to such option by the copyright holder.
  37 + *
  38 + * Contributor(s):
  39 + */
  40 +
  41 +// List of standard headers was taken in http://en.cppreference.com/w/cpp/header
  42 +
  43 +#include <cstdlib> // General purpose utilities: program control, dynamic memory allocation, random numbers, sort and search
  44 +#include <csignal> // Functions and macro constants for signal management
  45 +#include <csetjmp> // Macro (and function) that saves (and jumps) to an execution context
  46 +#include <cstdarg> // Handling of variable length argument lists
  47 +#include <typeinfo> // Runtime type information utilities
  48 +#include <bitset> // std::bitset class template
  49 +#include <functional> // Function objects, designed for use with the standard algorithms
  50 +#include <utility> // Various utility components
  51 +#include <ctime> // C-style time/date utilites
  52 +#include <cstddef> // typedefs for types such as size_t, NULL and others
  53 +#include <new> // Low-level memory management utilities
  54 +#include <memory> // Higher level memory management utilities
  55 +#include <climits> // limits of integral types
  56 +#include <cfloat> // limits of float types
  57 +#include <limits> // standardized way to query properties of arithmetic types
  58 +#include <exception> // Exception handling utilities
  59 +#include <stdexcept> // Standard exception objects
  60 +#include <cassert> // Conditionally compiled macro that compares its argument to zero
  61 +#include <cerrno> // Macro containing the last error number
  62 +#include <cctype> // functions to determine the type contained in character data
  63 +#include <cwctype> // functions for determining the type of wide character data
  64 +#include <cstring> // various narrow character string handling functions
  65 +#include <cwchar> // various wide and multibyte string handling functions
  66 +#include <string> // std::basic_string class template
  67 +#include <vector> // std::vector container
  68 +#include <deque> // std::deque container
  69 +#include <list> // std::list container
  70 +#include <set> // std::set and std::multiset associative containers
  71 +#include <map> // std::map and std::multimap associative containers
  72 +#include <stack> // std::stack container adaptor
  73 +#include <queue> // std::queue and std::priority_queue container adaptors
  74 +#include <algorithm> // Algorithms that operate on containers
  75 +#include <iterator> // Container iterators
  76 +#include <cmath> // Common mathematics functions
  77 +#include <complex> // Complex number type
  78 +#include <valarray> // Class for representing and manipulating arrays of values
  79 +#include <numeric> // Numeric operations on values in containers
  80 +#include <iosfwd> // forward declarations of all classes in the input/output library
  81 +#include <ios> // std::ios_base class, std::basic_ios class template and several typedefs
  82 +#include <istream> // std::basic_istream class template and several typedefs
  83 +#include <ostream> // std::basic_ostream, std::basic_iostream class templates and several typedefs
  84 +#include <iostream> // several standard stream objects
  85 +#include <fstream> // std::basic_fstream, std::basic_ifstream, std::basic_ofstream class templates and several typedefs
  86 +#include <sstream> // std::basic_stringstream, std::basic_istringstream, std::basic_ostringstream class templates and several typedefs
  87 +#include <strstream> // std::strstream, std::istrstream, std::ostrstream(deprecated)
  88 +#include <iomanip> // Helper functions to control the format or input and output
  89 +#include <streambuf> // std::basic_streambuf class template
  90 +#include <cstdio> // C-style input-output functions
  91 +#include <locale> // Localization utilities
  92 +#include <clocale> // C localization utilities
  93 +#include <ciso646> // empty header. The macros that appear in iso646.h in C are keywords in C++
  94 +#if __cplusplus >= 201103L
  95 +#include <typeindex> // (since C++11) std::type_index
  96 +#include <type_traits> // (since C++11) Compile-time type information
  97 +#include <chrono> // (since C++11) C++ time utilites
  98 +#include <initializer_list> // (since C++11) std::initializer_list class template
  99 +#include <tuple> // (since C++11) std::tuple class template
  100 +#include <scoped_allocator> // (since C++11) Nested allocator class
  101 +#include <cstdint> // (since C++11) fixed-size types and limits of other types
  102 +#include <cinttypes> // (since C++11) formatting macros , intmax_t and uintmax_t math and conversions
  103 +#include <system_error> // (since C++11) defines std::error_code, a platform-dependent error code
  104 +#include <cuchar> // (since C++11) C-style Unicode character conversion functions
  105 +#include <array> // (since C++11) std::array container
  106 +#include <forward_list> // (since C++11) std::forward_list container
  107 +#include <unordered_set> // (since C++11) std::unordered_set and std::unordered_multiset unordered associative containers
  108 +#include <unordered_map> // (since C++11) std::unordered_map and std::unordered_multimap unordered associative containers
  109 +#include <random> // (since C++11) Random number generators and distributions
  110 +#include <ratio> // (since C++11) Compile-time rational arithmetic
  111 +#include <cfenv> // (since C++11) Floating-point environment access functions
  112 +#include <codecvt> // (since C++11) Unicode conversion facilities
  113 +#include <regex> // (since C++11) Classes, algorithms and iterators to support regular expression processing
  114 +#include <atomic> // (since C++11) Atomic operations library
  115 +#include <ccomplex> // (since C++11)(deprecated in C++17) simply includes the header <complex>
  116 +#include <ctgmath> // (since C++11)(deprecated in C++17) simply includes the headers <ccomplex> (until C++17)<complex> (since C++17) and <cmath>: the overloads equivalent to the contents of the C header tgmath.h are already provided by those headers
  117 +#include <cstdalign> // (since C++11)(deprecated in C++17) defines one compatibility macro constant
  118 +#include <cstdbool> // (since C++11)(deprecated in C++17) defines one compatibility macro constant
  119 +#include <thread> // (since C++11) std::thread class and supporting functions
  120 +#include <mutex> // (since C++11) mutual exclusion primitives
  121 +#include <future> // (since C++11) primitives for asynchronous computations
  122 +#include <condition_variable> // (since C++11) thread waiting conditions
  123 +#endif
  124 +#if __cplusplus >= 201300L
  125 +#include <shared_mutex> // (since C++14) shared mutual exclusion primitives
  126 +#endif
  127 +#if __cplusplus >= 201500L
  128 +#include <any> // (since C++17) std::any class template
  129 +#include <optional> // (since C++17) std::optional class template
  130 +#include <variant> // (since C++17) std::variant class template
  131 +#include <memory_resource> // (since C++17) Polymorphic allocators and memory resources
  132 +#include <string_view> // (since C++17) std::basic_string_view class template
  133 +#include <execution> // (since C++17) Predefined execution policies for parallel versions of the algorithms
  134 +#include <filesystem> // (since C++17) std::path class and supporting functions
  135 +#endif
... ...
nbproject/private/launcher.properties 0 → 100644
  1 +++ a/nbproject/private/launcher.properties
  1 +# Launchers File syntax:
  2 +#
  3 +# [Must-have property line]
  4 +# launcher1.runCommand=<Run Command>
  5 +# [Optional extra properties]
  6 +# launcher1.displayName=<Display Name, runCommand by default>
  7 +# launcher1.hide=<true if lancher is not visible in menu, false by default>
  8 +# launcher1.buildCommand=<Build Command, Build Command specified in project properties by default>
  9 +# launcher1.runDir=<Run Directory, ${PROJECT_DIR} by default>
  10 +# launcher1.runInOwnTab=<false if launcher reuse common "Run" output tab, true by default>
  11 +# launcher1.symbolFiles=<Symbol Files loaded by debugger, ${OUTPUT_PATH} by default>
  12 +# launcher1.env.<Environment variable KEY>=<Environment variable VALUE>
  13 +# (If this value is quoted with ` it is handled as a native command which execution result will become the value)
  14 +# [Common launcher properties]
  15 +# common.runDir=<Run Directory>
  16 +# (This value is overwritten by a launcher specific runDir value if the latter exists)
  17 +# common.env.<Environment variable KEY>=<Environment variable VALUE>
  18 +# (Environment variables from common launcher are merged with launcher specific variables)
  19 +# common.symbolFiles=<Symbol Files loaded by debugger>
  20 +# (This value is overwritten by a launcher specific symbolFiles value if the latter exists)
  21 +#
  22 +# In runDir, symbolFiles and env fields you can use these macroses:
  23 +# ${PROJECT_DIR} - project directory absolute path
  24 +# ${OUTPUT_PATH} - linker output path (relative to project directory path)
  25 +# ${OUTPUT_BASENAME}- linker output filename
  26 +# ${TESTDIR} - test files directory (relative to project directory path)
  27 +# ${OBJECTDIR} - object files directory (relative to project directory path)
  28 +# ${CND_DISTDIR} - distribution directory (relative to project directory path)
  29 +# ${CND_BUILDDIR} - build directory (relative to project directory path)
  30 +# ${CND_PLATFORM} - platform name
  31 +# ${CND_CONF} - configuration name
  32 +# ${CND_DLIB_EXT} - dynamic library extension
  33 +#
  34 +# All the project launchers must be listed in the file!
  35 +#
  36 +# launcher1.runCommand=...
  37 +# launcher2.runCommand=...
  38 +# ...
  39 +# common.runDir=...
  40 +# common.env.KEY=VALUE
  41 +
  42 +# launcher1.runCommand=<type your run command here>
0 43 \ No newline at end of file
... ...
nbproject/private/private.xml 0 → 100644
  1 +++ a/nbproject/private/private.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
  3 + <data xmlns="http://www.netbeans.org/ns/make-project-private/1">
  4 + <activeConfTypeElem>1</activeConfTypeElem>
  5 + <activeConfIndexElem>0</activeConfIndexElem>
  6 + </data>
  7 + <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
  8 + <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
  9 + <group>
  10 + <file>file:/home/pgroen/projects/serialport/Exception.hpp</file>
  11 + <file>file:/home/pgroen/projects/serialport/SerialPort.cpp</file>
  12 + <file>file:/home/pgroen/projects/serialport/main.cpp</file>
  13 + </group>
  14 + </open-files>
  15 +</project-private>
... ...
nbproject/project.properties 0 → 100644
  1 +++ a/nbproject/project.properties
  1 +#Tue May 24 23:09:12 CEST 2022
... ...
nbproject/project.xml 0 → 100644
  1 +++ a/nbproject/project.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://www.netbeans.org/ns/project/1">
  3 + <type>org.netbeans.modules.cnd.makeproject</type>
  4 + <configuration>
  5 + <data xmlns="http://www.netbeans.org/ns/make-project/1">
  6 + <name>SerPortTest</name>
  7 + <c-extensions/>
  8 + <cpp-extensions>cpp</cpp-extensions>
  9 + <header-extensions>hpp</header-extensions>
  10 + <sourceEncoding>UTF-8</sourceEncoding>
  11 + <make-dep-projects/>
  12 + <sourceRootList/>
  13 + <confList>
  14 + <confElem>
  15 + <name>Debug</name>
  16 + <type>1</type>
  17 + </confElem>
  18 + <confElem>
  19 + <name>Release</name>
  20 + <type>1</type>
  21 + </confElem>
  22 + </confList>
  23 + <formatting>
  24 + <project-formatting-style>false</project-formatting-style>
  25 + </formatting>
  26 + </data>
  27 + </configuration>
  28 +</project>
... ...