miniterm.cpp
Conexus::TTY example reimplementing miniterm
#include <conexus.h>
#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <sys/wait.h>
#define BAUDRATE 4000000
#define ENDMINITERM 2
#define _POSIX_SOURCE 1
using namespace std;
volatile bool STOP = false;
void child_handler( int s )
{
STOP = true;
}
void print_data( const Conexus::Data d );
int main( int argc, char** argv )
{
Conexus::init();
int c;
Conexus::TTY::pointer tty = Conexus::TTY::create();
struct termios oldstdio, newstdio;
struct sigaction sa;
char default_device[] = "/dev/ttyS0";
char* device = default_device;
if ( argc == 2 )
device = argv[ 1 ];
tty->open( device );
tty->set_speed( BAUDRATE );
tcgetattr( 1, &oldstdio );
newstdio = tty->attributes();
tcsetattr( 1, TCSANOW, &newstdio );
switch ( fork() ) {
case 0:
close( 1 );
for ( c = getchar(); c != ENDMINITERM ; c = getchar() )
tty->write( &c, 1 );
tty->close();
tcsetattr( 1, TCSANOW, &oldstdio );
exit( 0 );
break;
case - 1:
perror( "fork" );
tty->close();
tcsetattr( 1, TCSANOW, &oldstdio );
exit( -1 );
default:
close( 0 );
sa.sa_handler = child_handler;
sa.sa_flags = 0;
sigaction( SIGCHLD, &sa, NULL );
tty->signal_data().connect( sigc::ptr_fun( &print_data ) );
tty->start();
while ( !STOP )
;
tty->stop();
wait( NULL );
break;
}
return 0;
}
void print_data( const Conexus::Data d )
{
for ( unsigned i = 0; i < d.size(); i++ )
cout << ( char ) ( d.data() [ i ] );
cout << flush;
}