//
// included from /usr/include/linux/serial.h
//
//  struct serial_icounter_struct {
//  	int cts, dsr, rng, dcd;
//  	int rx, tx;
//  	int frame, overrun, parity, brk;
//  	int buf_overrun;
//  	int reserved[9];
//  };
//
    int SerialPort::Ioctl(int cmd, void* args)
    {
	   int count = 0;
	   int err = 0;
	   struct serial_icounter_struct info;
	   SerialPort_EINFO einfo;

	   switch(cmd) {
	   case CTB_RESET:
		  return SendBreak(0);
	   case CTB_SER_GETEINFO:
		  err = ioctl(fd,TIOCGICOUNT,&info);
		  if(err) return err;
		  einfo.brk = info.brk - save_info.brk;
		  einfo.frame = info.frame - save_info.frame;
		  einfo.overrun = info.overrun - save_info.overrun;
		  einfo.parity = info.parity - save_info.parity;
		  *(SerialPort_EINFO*)args = einfo;
		  break;
	   case CTB_SER_GETBRK:
		  err = ioctl(fd,TIOCGICOUNT,&info);
		  if(err) return err;
		  if(last_info.brk != info.brk) count = 1;
		  break;
	   case CTB_SER_GETFRM:
		  err = ioctl(fd,TIOCGICOUNT,&info);
		  if(err) return err;
		  if(last_info.frame != info.frame) count = 1;
		  break;
	   case CTB_SER_GETOVR:
		  err = ioctl(fd,TIOCGICOUNT,&info);
		  if(err) return err;
		  if(last_info.overrun != info.overrun) count = 1;
		  break;
	   case CTB_SER_GETPAR:
		  err = ioctl(fd,TIOCGICOUNT,&info);
		  if(err) return err;
		  if(last_info.parity != info.parity) count = 1;
		  break;
	   case CTB_SER_GETINQUE:
		  err = ioctl(fd,TIOCINQ,&count);
		  if(err) return err;
		  *(int*)args = count;
		  return 0;
	   case CTB_SER_SETPAR:
		  return SetParityBit( *(int*)args == 1 ); 
	   default:
		  return -1;
	   }
	   last_info = info;
	   return 0;
    };
Exemple #2
0
    int SerialPort::Ioctl(int cmd,void* args)
    {
	   COMSTAT comstat;
	   DWORD errors;
	   int result = 0;
	   //bool brk;
	   switch(cmd) {
	   case CTB_RESET:
		  return SendBreak(0);
	   case CTB_SER_GETEINFO:
		  if(ClearCommError(fd,&errors,&comstat)) {
			 // actualize the last events
			 if(errors & CE_BREAK) einfo.brk++;
			 if(errors & CE_FRAME) einfo.frame++;
			 if(errors & CE_OVERRUN) einfo.overrun++;
			 if(errors & CE_RXPARITY) einfo.parity++;
			 *(SerialPort_EINFO*)args = einfo;
			 return 0;
		  }
	   case CTB_SER_GETBRK:
		  if(ClearCommError(fd,&errors,&comstat)) {
			 if(errors & CE_BREAK) result = 1;
			 einfo.brk += result;
			 *(int*)args = result;
			 return 0;
		  }
		  break;
	   case CTB_SER_GETFRM:
		  if(ClearCommError(fd,&errors,&comstat)) {
			 if(errors & CE_FRAME) result = 1;
			 einfo.frame += result;
			 *(int*)args = result;
			 return 0;
		  }
	   case CTB_SER_GETOVR:
		  if(ClearCommError(fd,&errors,&comstat)) {
			 if(errors & CE_OVERRUN) result = 1;
			 einfo.overrun += result;
			 *(int*)args = result;
			 return 0;
		  }
		  break;
	   case CTB_SER_GETPAR:
		  if(ClearCommError(fd,&errors,&comstat)) {
			 if(errors & CE_RXPARITY) result = 1;
			 einfo.parity += result;
			 *(int*)args = result;
			 return 0;
		  }
		  break;
	   case CTB_SER_GETINQUE:
		  if(ClearCommError(fd,&errors,&comstat)) {
			 *(int*)args = (int)comstat.cbInQue;
			 return 0;
		  }
		  break;
	   case CTB_SER_SETPAR:
		  return SetParityBit( *(int*)args == 1 );
	   }
	   // error or unknown command
	   return -1;
    };