]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/serial.cpp
Rework exceptions for IO
[libs/core.git] / source / io / serial.cpp
index ec6a198bee3ac0d6d3568a9c218bac0df0f7aa4f..dbfee955f9ae85b954daf1ff11c9c689c8476d92 100644 (file)
@@ -5,8 +5,8 @@
 #include <fcntl.h>
 #include <errno.h>
 #endif
+#include <msp/core/systemerror.h>
 #include <msp/strings/formatter.h>
-#include "except.h"
 #include "serial.h"
 
 using namespace std;
@@ -35,10 +35,10 @@ void set_state(Handle handle, DeviceState &state)
 {
 #ifdef WIN32
        if(SetCommState(handle, &state)==0)
-               throw SystemError("Cannot set serial port parameters", GetLastError());
+               throw system_error("SetCommState");
 #else
        if(tcsetattr(handle, TCSADRAIN, &state)==-1)
-               throw SystemError("Cannot set serial port parameters", errno);
+               throw system_error("tcsetattr");
 #endif
 }
 
@@ -69,7 +69,7 @@ void set_baud_rate(DeviceState &state, unsigned baud)
        case 57600:  speed = B57600; break;
        case 115200: speed = B115200; break;
        case 230400: speed = B230400; break;
-       default: throw InvalidParameterValue("Invalid baud rate");
+       default: throw invalid_argument("set_baud_rate");
        }
 
        cfsetospeed(&state, speed);
@@ -89,7 +89,7 @@ void set_data_bits(DeviceState &state, unsigned bits)
        case 6: flag = CS6; break;
        case 7: flag = CS7; break;
        case 8: flag = CS8; break;
-       default: throw InvalidParameterValue("Invalid data bit count");
+       default: throw invalid_argument("set_data_bits");
        }
 
        state.c_cflag = (state.c_cflag&~CSIZE)|flag;
@@ -104,7 +104,7 @@ void set_parity(DeviceState &state, Serial::Parity 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");
+       default: throw invalid_argument("set_parity");
        }
 #else
        tcflag_t flag;
@@ -113,7 +113,7 @@ void set_parity(DeviceState &state, Serial::Parity 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");
+       default: throw invalid_argument("set_parity");
        }
 
        state.c_cflag = (state.c_cflag&~(PARENB|PARODD))|flag;
@@ -127,7 +127,7 @@ void set_stop_bits(DeviceState &state, unsigned bits)
        {
        case 1: state.StopBits = ONESTOPBIT; break;
        case 2: state.StopBits = TWOSTOPBITS; break;
-       default: throw InvalidParameterValue("Invalid stop bit count");
+       default: throw invalid_argument("set_stop_bits");
        }
 #else
        tcflag_t flag;
@@ -135,7 +135,7 @@ void set_stop_bits(DeviceState &state, unsigned bits)
        {
        case 1: flag = 0; break;
        case 2: flag = CSTOPB; break;
-       default: throw InvalidParameterValue("Invalid stop bit count");
+       default: throw invalid_argument("set_stop_bits");
        }
 
        state.c_cflag = (state.c_cflag&~CSTOPB)|flag;
@@ -158,7 +158,7 @@ Serial::Serial(const string &descr)
 
        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());
+               throw system_error(format("CreateFile(%s)", port));
        mode = M_READ|M_WRITE;
 
        COMMTIMEOUTS timeouts;
@@ -174,7 +174,7 @@ Serial::Serial(const string &descr)
 
        handle = open(port.c_str(), O_RDWR);
        if(handle==-1)
-               throw SystemError(format("Can't open serial port '%s'", port), errno);
+               throw system_error(format("open(%s)", port));
        mode = M_READ|M_WRITE;
 
        termios t;
@@ -264,13 +264,13 @@ void Serial::set_parameters(const string &params)
        unsigned i;
        for(i=0; i<params.size() && isdigit(params[i]); ++i) ;
        if(i+4!=params.size() || params[i]!=',')
-               throw InvalidParameterValue("Invalid parameter string");
+               throw invalid_argument("Serial::set_parameters");
        if(params[i+1]<'5' || params[i+1]>'8')
-               throw InvalidParameterValue("Invalid data bit count");
+               throw invalid_argument("Serial::set_parameters data_bits");
        if(params[i+2]!='N' && params[i+2]!='E' && params[i+2]!='O')
-               throw InvalidParameterValue("Invalid parity");
+               throw invalid_argument("Serial::set_parameters parity");
        if(params[i+3]!='1' && params[i+3]!='2')
-               throw InvalidParameterValue("Invalid stop bit count");
+               throw invalid_argument("Serial::set_parameters stop_bits");
 
        DeviceState state;
        get_state(handle, state);
@@ -289,7 +289,7 @@ unsigned Serial::do_write(const char *buf, unsigned size)
 #ifdef WIN32
        DWORD ret;
        if(WriteFile(handle, buf, size, &ret, 0)==0)
-               throw SystemError("Writing to serial port failed", GetLastError());
+               throw system_error("WriteFile");
 #else
        int ret = ::write(handle, buf, size);
        if(ret==-1)
@@ -297,7 +297,7 @@ unsigned Serial::do_write(const char *buf, unsigned size)
                if(errno==EAGAIN)
                        return 0;
                else
-                       throw SystemError("Writing to serial port failed", errno);
+                       throw system_error("write");
        }
 #endif
 
@@ -312,7 +312,7 @@ unsigned Serial::do_read(char *buf, unsigned size)
 #ifdef WIN32
        DWORD ret;
        if(ReadFile(handle, buf, size, &ret, 0)==0)
-               throw SystemError("Reading from serial port failed", GetLastError());
+               throw system_error("ReadFile");
 #else
        int ret = ::read(handle, buf, size);
        if(ret==-1)
@@ -320,7 +320,7 @@ unsigned Serial::do_read(char *buf, unsigned size)
                if(errno==EAGAIN)
                        return 0;
                else
-                       throw SystemError("Reading from serial port failed", errno);
+                       throw system_error("read");
        }
 #endif
 
@@ -330,7 +330,7 @@ unsigned Serial::do_read(char *buf, unsigned size)
 Handle Serial::get_event_handle()
 {
 #ifdef WIN32
-       throw Exception("Serial port events not supported on win32 yet");
+       throw logic_error("Serial port events not supported on win32 yet");
 #else
        return handle;
 #endif