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