X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fserial.cpp;fp=source%2Fserial.cpp;h=0000000000000000000000000000000000000000;hp=ec6a198bee3ac0d6d3568a9c218bac0df0f7aa4f;hb=6e0fd758970bcb5bad5e3f2454b694cc4d7b4b66;hpb=b97d4e9f86e90254ab9edef7ee62a910f6333c78 diff --git a/source/serial.cpp b/source/serial.cpp deleted file mode 100644 index ec6a198..0000000 --- a/source/serial.cpp +++ /dev/null @@ -1,340 +0,0 @@ -#ifdef WIN32 -#include -#else -#include -#include -#include -#endif -#include -#include "except.h" -#include "serial.h" - -using namespace std; - -namespace { - -using namespace Msp; -using namespace Msp::IO; - -#ifdef WIN32 -typedef DCB DeviceState; -#else -typedef termios DeviceState; -#endif - -void get_state(Handle handle, DeviceState &state) -{ -#ifdef WIN32 - GetCommState(handle, &state); -#else - tcgetattr(handle, &state); -#endif -} - -void set_state(Handle handle, DeviceState &state) -{ -#ifdef WIN32 - if(SetCommState(handle, &state)==0) - throw SystemError("Cannot set serial port parameters", GetLastError()); -#else - if(tcsetattr(handle, TCSADRAIN, &state)==-1) - throw SystemError("Cannot set serial port parameters", errno); -#endif -} - -void set_baud_rate(DeviceState &state, unsigned baud) -{ -#ifdef WIN32 - state.BaudRate = baud; -#else - speed_t speed; - switch(baud) - { - case 0: speed = B0; break; - case 50: speed = B50; break; - case 75: speed = B75; break; - case 110: speed = B110; break; - case 134: speed = B134; break; - case 150: speed = B150; break; - case 200: speed = B200; break; - case 300: speed = B300; break; - case 600: speed = B600; break; - case 1200: speed = B1200; break; - case 1800: speed = B1800; break; - case 2400: speed = B2400; break; - case 4800: speed = B4800; break; - case 9600: speed = B9600; break; - case 19200: speed = B19200; break; - case 38400: speed = B38400; break; - case 57600: speed = B57600; break; - case 115200: speed = B115200; break; - case 230400: speed = B230400; break; - default: throw InvalidParameterValue("Invalid baud rate"); - } - - cfsetospeed(&state, speed); - cfsetispeed(&state, speed); -#endif -} - -void set_data_bits(DeviceState &state, unsigned bits) -{ -#ifdef WIN32 - state.ByteSize = bits; -#else - tcflag_t flag; - switch(bits) - { - case 5: flag = CS5; break; - case 6: flag = CS6; break; - case 7: flag = CS7; break; - case 8: flag = CS8; break; - default: throw InvalidParameterValue("Invalid data bit count"); - } - - state.c_cflag = (state.c_cflag&~CSIZE)|flag; -#endif -} - -void set_parity(DeviceState &state, Serial::Parity par) -{ -#ifdef WIN32 - switch(par) - { - case Serial::NONE: state.Parity = NOPARITY; break; - case Serial::EVEN: state.Parity = EVENPARITY; break; - case Serial::ODD: state.Parity = ODDPARITY; break; - default: throw InvalidParameterValue("Invalid parity"); - } -#else - tcflag_t flag; - switch(par) - { - case Serial::NONE: flag = 0; break; - case Serial::EVEN: flag = PARENB; break; - case Serial::ODD: flag = PARENB|PARODD; break; - default: throw InvalidParameterValue("Invalid parity"); - } - - state.c_cflag = (state.c_cflag&~(PARENB|PARODD))|flag; -#endif -} - -void set_stop_bits(DeviceState &state, unsigned bits) -{ -#ifdef WIN32 - switch(bits) - { - case 1: state.StopBits = ONESTOPBIT; break; - case 2: state.StopBits = TWOSTOPBITS; break; - default: throw InvalidParameterValue("Invalid stop bit count"); - } -#else - tcflag_t flag; - switch(bits) - { - case 1: flag = 0; break; - case 2: flag = CSTOPB; break; - default: throw InvalidParameterValue("Invalid stop bit count"); - } - - state.c_cflag = (state.c_cflag&~CSTOPB)|flag; -#endif -} - -} - - -namespace Msp { -namespace IO { - -Serial::Serial(const string &descr) -{ - string::size_type comma = descr.find(','); - string port = descr.substr(0, comma); - -#ifdef WIN32 - port = "\\\\.\\"+port; - - handle = CreateFile(port.c_str(), GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if(handle==INVALID_HANDLE_VALUE) - throw SystemError(format("Can't open serial port '%s'", port), GetLastError()); - mode = M_READ|M_WRITE; - - COMMTIMEOUTS timeouts; - timeouts.ReadIntervalTimeout = MAXDWORD; - timeouts.ReadTotalTimeoutMultiplier = MAXDWORD; - timeouts.ReadTotalTimeoutConstant = MAXDWORD-1; - timeouts.WriteTotalTimeoutMultiplier = 0; - timeouts.WriteTotalTimeoutConstant = 0; - SetCommTimeouts(handle, &timeouts); -#else - if(port.compare(0, 5, "/dev/")) - port = "/dev/"+port; - - handle = open(port.c_str(), O_RDWR); - if(handle==-1) - throw SystemError(format("Can't open serial port '%s'", port), errno); - mode = M_READ|M_WRITE; - - termios t; - tcgetattr(handle, &t); - t.c_lflag &= ~(ECHO|ICANON); - t.c_oflag &= ~OPOST; - tcsetattr(handle, TCSADRAIN, &t); -#endif - - if(comma!=string::npos) - { - try - { - set_parameters(descr.substr(comma+1)); - } - catch(...) - { - close(); - throw; - } - } - - set_events(P_INPUT); -} - -Serial::~Serial() -{ - close(); -} - -void Serial::close() -{ -#ifdef WIN32 - CloseHandle(handle); -#else - ::close(handle); -#endif -} - -void Serial::set_block(bool b) -{ - if(b) - mode = mode|M_NONBLOCK; - else - mode = mode&~M_NONBLOCK; - -#ifndef WIN32 - int flags = fcntl(handle, F_GETFD); - fcntl(handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK)); -#endif -} - -void Serial::set_baud_rate(unsigned rate) -{ - DeviceState state; - get_state(handle, state); - ::set_baud_rate(state, rate); - set_state(handle, state); -} - -void Serial::set_data_bits(unsigned bits) -{ - DeviceState state; - get_state(handle, state); - ::set_data_bits(state, bits); - set_state(handle, state); -} - -void Serial::set_parity(Parity par) -{ - DeviceState state; - get_state(handle, state); - ::set_parity(state, par); - set_state(handle, state); -} - -void Serial::set_stop_bits(unsigned bits) -{ - DeviceState state; - get_state(handle, state); - ::set_stop_bits(state, bits); - set_state(handle, state); -} - -void Serial::set_parameters(const string ¶ms) -{ - unsigned i; - for(i=0; i'8') - throw InvalidParameterValue("Invalid data bit count"); - if(params[i+2]!='N' && params[i+2]!='E' && params[i+2]!='O') - throw InvalidParameterValue("Invalid parity"); - if(params[i+3]!='1' && params[i+3]!='2') - throw InvalidParameterValue("Invalid stop bit count"); - - DeviceState state; - get_state(handle, state); - ::set_baud_rate(state, lexical_cast(params.substr(0, i))); - ::set_data_bits(state, params[i+1]-'0'); - ::set_parity(state, (params[i+2]=='E' ? EVEN : params[i+2]=='O' ? ODD : NONE)); - ::set_stop_bits(state, params[i+3]-'0'); - set_state(handle, state); -} - -unsigned Serial::do_write(const char *buf, unsigned size) -{ - if(size==0) - return 0; - -#ifdef WIN32 - DWORD ret; - if(WriteFile(handle, buf, size, &ret, 0)==0) - throw SystemError("Writing to serial port failed", GetLastError()); -#else - int ret = ::write(handle, buf, size); - if(ret==-1) - { - if(errno==EAGAIN) - return 0; - else - throw SystemError("Writing to serial port failed", errno); - } -#endif - - return ret; -} - -unsigned Serial::do_read(char *buf, unsigned size) -{ - if(size==0) - return 0; - -#ifdef WIN32 - DWORD ret; - if(ReadFile(handle, buf, size, &ret, 0)==0) - throw SystemError("Reading from serial port failed", GetLastError()); -#else - int ret = ::read(handle, buf, size); - if(ret==-1) - { - if(errno==EAGAIN) - return 0; - else - throw SystemError("Reading from serial port failed", errno); - } -#endif - - return ret; -} - -Handle Serial::get_event_handle() -{ -#ifdef WIN32 - throw Exception("Serial port events not supported on win32 yet"); -#else - return handle; -#endif -} - -} // namespace IO -} // namespace Msp