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;
}