#include <sys/stat.h>
 
#include <fcntl.h>
 
#include <string.h>
 
#include <termios.h>
 
 
 
#include "rs232.h"
 
//#define DEBUG
 
 
 
const int debug=0;
 
 
 
struct termios tattr;
 
 
 
int Delay(double sec){
 
  return usleep((int) (sec*1e6) );
 
}
 
 
 
int SetComTime(int fd, double timeout_seconds){
 
 
 
  int ntenth;
 
 
 
  ntenth = (int)(timeout_seconds*10);
 
  tattr.c_cc[VTIME] = ntenth;
 
  tcsetattr(fd, TCSANOW, &tattr);
 
#ifdef DEBUG
 
  printf("SetComTime: %d\n", ntenth
);  
#endif
 
  return 0;
 
}
 
 
 
int FlushInQ(int fd){
 
  return 0;
 
}
 
 
 
int FlushOutQ(int fd){
 
  return 0;
 
}
 
 
 
int ComWrt (int fd, char* cmd, int Count ){
 
  
 
  int nwr;
 
 
 
  nwr=write(fd, cmd, Count);
 
#ifdef DEBUG
 
  printf (  "ComWrt: %d, %d, %s\n", Count
, nwr
, cmd
);  
#endif  
 
  return nwr;
 
}
 
 
 
int ComRdTerm  (int fd,  char *response, int nb, int termchar)
 
{
 
 
 
  int nread, nloop;
 
 
 
  nread=0;
 
  nloop=0;
 
 
 
#ifdef DEBUG
 
  printf (  "ComRdTerm start\n") ;  
#endif
 
//  rewind(fpr);
 
  while (1) {
 
    if (nloop++ == nb) return -1;
 
//    nread += read ( fd, response+nread, nb-nread );
 
    nread += read ( fd, response+nread, 1 );
 
#ifdef DEBUG
 
    response[nread]=0;
 
    printf ("ComRdTerm nread: %d %d %s\n", nloop
, nread
, response
) ;  
#endif
 
    if (nread>1) if(response[nread-1] == termchar) break;
 
  }
 
 
 
  nread = nread - 2;
 
  response[nread]=0;
 
#ifdef DEBUG
 
  printf("CmdRdTerm: %s\n",response
);  
#endif
 
  return nread;
 
}
 
 
 
int OpenComConfig( char *dev, char * device_name, long Baud_Rate, int Parity, int Data_Bits,
 
                      int Stop_Bits, int Input_Queue_Size, int Output_Queue_Size ){
 
 
 
  int fd;
 
 
 
  memset (&tattr
, 0, sizeof tattr
);  
 
 
  fd=open(dev, O_RDWR | O_NOCTTY | O_SYNC);
 
// see 'man tcsetattr'
 
  tcgetattr (fd, &tattr);
 
  cfmakeraw(&tattr);
 
  cfsetspeed(&tattr, B38400);
 
//  cfsetispeed(&tattr, B38400);
 
//  cfsetospeed(&tattr, B38400);
 
// input modes
 
  tattr.c_iflag&=~IGNBRK;
 
  tattr.c_iflag&=~(IGNCR | ICRNL | INLCR);
 
  tattr.c_iflag&=~(IXON | IXOFF | IXANY);
 
// output modess
 
  tattr.c_oflag=0;
 
// local modes
 
  tattr.c_lflag=0;
 
  tattr.c_lflag &= ~(ICANON|ECHO) ; // canonical mode and echo input char
 
// control modes
 
  tattr.c_cflag |= (CLOCAL | CREAD);    // ignore modem controls,
 
                                        // enable reading
 
  tattr.c_cflag &= ~(PARENB | PARODD);      // shut off parity
 
  tattr.c_cflag &= ~CSTOPB;     // set two stop bits
 
  tattr.c_cflag &= ~CRTSCTS;    // enable RTS/CTS flow control
 
 
 
  tattr.c_cc[VMIN] = 0;
 
  tattr.c_cc[VTIME] = 2;
 
  tcsetattr(fd, TCSAFLUSH, &tattr);
 
 
 
#ifdef DEBUG
 
#endif
 
  return fd;                                                                                              ;
 
}
 
 
 
 
 
int CloseCom (int fd){
 
 
 
  close(fd);
 
  return;
 
}