From: <ean...@us...> - 2012-08-13 02:06:26
|
Revision: 10859 http://octave.svn.sourceforge.net/octave/?rev=10859&view=rev Author: eandrius Date: 2012-08-13 02:06:19 +0000 (Mon, 13 Aug 2012) Log Message: ----------- serial: implemented srl_timeout Modified Paths: -------------- trunk/octave-forge/main/serial/INDEX trunk/octave-forge/main/serial/NEWS trunk/octave-forge/main/serial/src/Makefile trunk/octave-forge/main/serial/src/serial.cc trunk/octave-forge/main/serial/src/serial.h trunk/octave-forge/main/serial/src/srl_flush.cc trunk/octave-forge/main/serial/src/srl_read.cc Added Paths: ----------- trunk/octave-forge/main/serial/src/srl_timeout.cc Modified: trunk/octave-forge/main/serial/INDEX =================================================================== --- trunk/octave-forge/main/serial/INDEX 2012-08-13 00:54:33 UTC (rev 10858) +++ trunk/octave-forge/main/serial/INDEX 2012-08-13 02:06:19 UTC (rev 10859) @@ -8,4 +8,5 @@ srl_parity srl_stopbits srl_close - srl_read \ No newline at end of file + srl_read + srl_timeout Modified: trunk/octave-forge/main/serial/NEWS =================================================================== --- trunk/octave-forge/main/serial/NEWS 2012-08-13 00:54:33 UTC (rev 10858) +++ trunk/octave-forge/main/serial/NEWS 2012-08-13 02:06:19 UTC (rev 10859) @@ -13,3 +13,4 @@ srl_stopbits srl_close srl_read + srl_timeout Modified: trunk/octave-forge/main/serial/src/Makefile =================================================================== --- trunk/octave-forge/main/serial/src/Makefile 2012-08-13 00:54:33 UTC (rev 10858) +++ trunk/octave-forge/main/serial/src/Makefile 2012-08-13 02:06:19 UTC (rev 10859) @@ -1,5 +1,6 @@ OCT = serial.oct -OBJ := serial.o srl_baudrate.o srl_bytesize.o srl_flush.o srl_parity.o srl_stopbits.o srl_write.o srl_close.o srl_read.o +OBJ := serial.o srl_baudrate.o srl_timeout.o srl_bytesize.o srl_flush.o \ + srl_parity.o srl_stopbits.o srl_write.o srl_close.o srl_read.o MKOCTFILE ?= mkoctfile @@ -14,4 +15,5 @@ clean: rm -f *.oct *.o + .PHONY: all clean Modified: trunk/octave-forge/main/serial/src/serial.cc =================================================================== --- trunk/octave-forge/main/serial/src/serial.cc 2012-08-13 00:54:33 UTC (rev 10858) +++ trunk/octave-forge/main/serial/src/serial.cc 2012-08-13 02:06:19 UTC (rev 10859) @@ -13,9 +13,11 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, see <http://www.gnu.org/licenses/>. -// TODO: Include more detailed error messages +// TODO: Include more detailed error messages (perror?) // TODO: Implement Flow Control +// TODO: Implement H/W handshaking // TODO: Implement read timeout +// TODO: Check if interface is opened first #include <octave/oct.h> #include <octave/ov-int32.h> @@ -53,6 +55,7 @@ { this->fd = open(path.c_str(), flags, 0); tcgetattr(this->fd, &this->config); + this->blocking_read = true; } octave_serial::~octave_serial() @@ -67,8 +70,8 @@ void octave_serial::print (std::ostream& os, bool pr_as_read_syntax ) const { - print_raw (os, pr_as_read_syntax); - newline (os); + print_raw(os, pr_as_read_syntax); + newline(os); } void octave_serial::print_raw (std::ostream& os, bool pr_as_read_syntax) const @@ -97,6 +100,8 @@ // Default values string path("/dev/ttyUSB0"); unsigned int baud_rate = 115200; + short timeout = -1; + unsigned short bytesize = 8; string parity("N"); unsigned short stopbits = 1; @@ -143,11 +148,11 @@ { if (args(2).is_integer_type() || args(2).is_float_type()) { - oflags = args(2).int_value(); + timeout = args(2).int_value(); } else { - error("serial: 3rd argument must be an interface flags of type integer..."); + error("serial: 3rd argument must be an timeout of type integer..."); return octave_value(); } } @@ -162,9 +167,14 @@ } retval->srl_baudrate(baud_rate); + + if (timeout >= 0) { + retval->srl_timeout(timeout); + } + retval->srl_parity(parity); retval->srl_bytesize(bytesize); retval->srl_stopbits(stopbits); - + return octave_value(retval); } Modified: trunk/octave-forge/main/serial/src/serial.h =================================================================== --- trunk/octave-forge/main/serial/src/serial.h 2012-08-13 00:54:33 UTC (rev 10858) +++ trunk/octave-forge/main/serial/src/serial.h 2012-08-13 02:06:19 UTC (rev 10859) @@ -49,6 +49,7 @@ int srl_flush(unsigned short); + int srl_timeout(short); int srl_baudrate(unsigned int); int srl_bytesize(unsigned short); int srl_parity(string); @@ -77,6 +78,8 @@ private: int fd; struct termios config; + + bool blocking_read; DECLARE_OCTAVE_ALLOCATOR DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA Modified: trunk/octave-forge/main/serial/src/srl_flush.cc =================================================================== --- trunk/octave-forge/main/serial/src/srl_flush.cc 2012-08-13 00:54:33 UTC (rev 10858) +++ trunk/octave-forge/main/serial/src/srl_flush.cc 2012-08-13 02:06:19 UTC (rev 10859) @@ -38,19 +38,19 @@ // PKG_ADD: autoload ("srl_flush", "serial.oct"); int octave_serial::srl_flush(unsigned short queue_selector) { + /* + * TCIOFLUSH Flush both pending input and untransmitted output. + * TCOFLUSH Flush untransmitted output. + * TCIFLUSH Flush pending input. + */ - // TCIFLUSH Flush pending input. - // TCIOFLUSH Flush both pending input and untransmitted output. - // TCOFLUSH Flush untransmitted output. - - int flag; switch (queue_selector) { - case 0: flag = TCIFLUSH; break; - case 1: flag = TCIOFLUSH; break; - case 2: flag = TCOFLUSH; break; + case 0: flag = TCOFLUSH; break; + case 1: flag = TCIFLUSH; break; + case 2: flag = TCIOFLUSH; break; default: error("srl_flush: only [0..2] values are accepted..."); return false; @@ -62,7 +62,7 @@ // PKG_ADD: autoload ("srl_flush", "serial.oct"); DEFUN_DLD (srl_flush, args, nargout, "Hello World Help String") { - int queue_selector = 1; + int queue_selector = 2; // Input and Output if (args.length() < 1 || args.length() > 2) { Modified: trunk/octave-forge/main/serial/src/srl_read.cc =================================================================== --- trunk/octave-forge/main/serial/src/srl_read.cc 2012-08-13 00:54:33 UTC (rev 10858) +++ trunk/octave-forge/main/serial/src/srl_read.cc 2012-08-13 02:06:19 UTC (rev 10859) @@ -78,26 +78,26 @@ const octave_base_value& rep = args(0).get_rep(); serial = &((octave_serial &)rep); - int retval = 0; + int buffer_read = 0, read_retval = -1; - while (retval < buffer_len) + // While buffer not full and not timeout + while (buffer_read < buffer_len && read_retval != 0) { - retval += serial->srl_read(buffer + retval, buffer_len - retval); + read_retval = serial->srl_read(buffer + buffer_read, buffer_len - buffer_read); + buffer_read += read_retval; } - - //buffer[retval] = '\0'; - + octave_value_list return_list; uint8NDArray data; - data.resize(retval); + data.resize(buffer_read); // TODO: clean this up - for (int i = 0; i < retval; i++) + for (int i = 0; i < buffer_read; i++) { data(i) = buffer[i]; } - return_list(1) = retval; + return_list(1) = buffer_read; return_list(0) = data; delete[] buffer; Added: trunk/octave-forge/main/serial/src/srl_timeout.cc =================================================================== --- trunk/octave-forge/main/serial/src/srl_timeout.cc (rev 0) +++ trunk/octave-forge/main/serial/src/srl_timeout.cc 2012-08-13 02:06:19 UTC (rev 10859) @@ -0,0 +1,110 @@ +// Copyright (C) 2012 Andrius Sutas <and...@gm...> +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, see <http://www.gnu.org/licenses/>. + +#include <octave/oct.h> +#include <octave/ov-int32.h> +//#include <octave/ops.h> +//#include <octave/ov-typeinfo.h> + +#include <iostream> +#include <string> +#include <algorithm> + +#ifndef __WIN32__ +#include <stdio.h> +#include <string.h> +#include <fcntl.h> +#include <errno.h> +#include <termios.h> +#include <unistd.h> +#endif + +using std::string; + +#include "serial.h" + +// PKG_ADD: autoload ("srl_timeout", "serial.oct"); +DEFUN_DLD (srl_timeout, args, nargout, "Hello World Help String") +{ + if (args.length() < 1 || args.length() > 2) + { + error("srl_timeout: expecting one or two arguments..."); + return octave_value(-1); + } + + if (args(0).type_id() != octave_serial::static_type_id()) + { + error("srl_timeout: expecting first argument of type octave_serial..."); + return octave_value(-1); + } + + // Setting new timeout + if (args.length() > 1) + { + if ( !(args(1).is_integer_type() || args(1).is_float_type()) ) + { + error("srl_timeout: expecting second argument of type integer..."); + return octave_value(-1); + } + + octave_serial* serial = NULL; + + const octave_base_value& rep = args(0).get_rep(); + serial = &((octave_serial &)rep); + + serial->srl_timeout(args(1).int_value()); + + return octave_value(); + } + + // Returning current timeout + + // TODO: return current timeout + + return octave_value(0); +} + +int octave_serial::srl_timeout(short timeout) +{ + if (timeout < 0 || timeout > 255) + { + error("srl_timeout: timeout value must be between [0..255]..."); + return false; + } + + /* + // Disable timeout, enable blocking read + if (timeout < 0) + { + this->blocking_read = true; + BITMASK_SET(this->config.c_lflag, ICANON); // Set canonical mode + this->config.c_cc[VMIN] = 1; + this->config.c_cc[VTIME] = 0; + } + */ + + // Enable timeout, disable blocking read + this->blocking_read = false; + BITMASK_CLEAR(this->config.c_lflag, ICANON); // Set non-canonical mode + this->config.c_cc[VMIN] = 0; + this->config.c_cc[VTIME] = (unsigned) timeout; // Set timeout of 'timeout * 10' seconds + + if (tcsetattr(this->srl_get_fd(), TCSANOW, &this->config) < 0) { + error("srl_timeout: error setting stop bits..."); + return false; + } + + return true; +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |