// (Log is kept at end of this file)
+#include <errno.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
}
fgSERIAL::~fgSERIAL() {
- close(fd);
+ // closing the port here screws us up because if we would even so
+ // much as make a copy of an fgSERIAL object and then delete it,
+ // the file descriptor gets closed. Doh!!!
+
+ // close(fd);
}
bool fgSERIAL::open_port(const string& device) {
- if ( (fd = open(device.c_str(), O_RDWR | O_NONBLOCK)) == -1 ) {
+ struct termios config;
+
+ fd = open(device.c_str(), O_RDWR | O_NONBLOCK);
+ cout << "Serial fd created = " << fd << endl;
+
+ if ( fd == -1 ) {
FG_LOG( FG_SERIAL, FG_ALERT, "Cannot open " << device
<< " for serial I/O" );
return false;
} else {
dev_open = true;
- return true;
}
+
+ // set required port parameters
+ if ( tcgetattr( fd, &config ) != 0 ) {
+ FG_LOG( FG_SERIAL, FG_ALERT, "Unable to poll port settings" );
+ return false;
+ }
+
+ // cfmakeraw( &config );
+
+ // cout << "config.c_iflag = " << config.c_iflag << endl;
+
+ // software flow control on
+ config.c_iflag |= IXON;
+ // config.c_iflag |= IXOFF;
+
+ // config.c_cflag |= CLOCAL;
+
+#if ! defined( sgi )
+ // disable hardware flow control
+ config.c_cflag &= ~(CRTSCTS);
+#endif
+
+ // cout << "config.c_iflag = " << config.c_iflag << endl;
+
+ if ( tcsetattr( fd, TCSANOW, &config ) != 0 ) {
+ FG_LOG( FG_SERIAL, FG_ALERT, "Unable to update port settings" );
+ return false;
+ }
+
+ return true;
+}
+
+
+bool fgSERIAL::close_port() {
+ close(fd);
+ return true;
}
+
bool fgSERIAL::set_baud(int baud) {
struct termios config;
- speed_t speed;
-
- cout << "attempting to set baud rate to: " << baud << endl;
+ speed_t speed = B9600;
if ( tcgetattr( fd, &config ) != 0 ) {
FG_LOG( FG_SERIAL, FG_ALERT, "Unable to poll port settings" );
speed = B57600;
} else if ( baud == 115200 ) {
speed = B115200;
+#if defined( linux ) || defined( __FreeBSD__ )
} else if ( baud == 230400 ) {
speed = B230400;
+#endif
} else {
FG_LOG( FG_SERIAL, FG_ALERT, "Unsupported baud rate " << baud );
return false;
return false;
}
- cout << "successfully set baud to " << baud << endl;
-
return true;
}
// cout << "write '" << value << "' " << count << " bytes" << endl;
if ( (int)count != (int)value.length() ) {
- FG_LOG( FG_SERIAL, FG_ALERT,
- "Serial I/O on write, error number = " << errno );
+ if ( errno == EAGAIN ) {
+ // ok ... in our context we don't really care if we can't
+ // write a string, we'll just get it the next time around
+ } else {
+ FG_LOG( FG_SERIAL, FG_ALERT,
+ "Serial I/O on write, error number = " << errno );
+ }
}
return count;
// $Log$
+// Revision 1.7 1998/12/04 01:24:35 curt
+// Tweak for SGI portability.
+//
+// Revision 1.6 1998/11/30 17:15:29 curt
+// Having the class destructor close the fd was a bad idea ... especially if you
+// ever make a copy of the instance and then subsequently destroy either.
+// close_port() is now a separate member function.
+//
+// Revision 1.5 1998/11/25 01:33:23 curt
+// Remove call to cfmakeraw()
+//
+// Revision 1.4 1998/11/23 21:47:00 curt
+// Cygnus tools compatibility tweaks.
+//
+// Revision 1.3 1998/11/19 13:52:54 curt
+// port configuration tweaks & experiments.
+//
+// Revision 1.2 1998/11/19 03:35:43 curt
+// Updates ...
+//
// Revision 1.1 1998/11/16 13:53:02 curt
// Initial revision.
//