From c6b0e934857170f786eebb740db666005ab00aa0 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 20 Apr 2013 17:18:23 +0300 Subject: [PATCH] Encapsulate serial device state into a struct --- source/io/serial.cpp | 73 +++++++++++++++++++++++--------------------- source/io/serial.h | 2 ++ 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/source/io/serial.cpp b/source/io/serial.cpp index 26ef92e..dc623e2 100644 --- a/source/io/serial.cpp +++ b/source/io/serial.cpp @@ -12,18 +12,26 @@ using namespace std; -namespace { - -using namespace Msp; -using namespace Msp::IO; +namespace Msp { +namespace IO { +struct Serial::DeviceState +{ #ifdef WIN32 -typedef DCB DeviceState; + DCB state; #else -typedef termios DeviceState; + termios state; #endif -void get_state(const Handle &handle, DeviceState &state) + void get_from(const Handle &); + void apply_to(const Handle &); + void set_baud_rate(unsigned); + void set_data_bits(unsigned); + void set_parity(Parity); + void set_stop_bits(unsigned); +}; + +void Serial::DeviceState::get_from(const Handle &handle) { #ifdef WIN32 GetCommState(*handle, &state); @@ -32,7 +40,7 @@ void get_state(const Handle &handle, DeviceState &state) #endif } -void set_state(const Handle &handle, DeviceState &state) +void Serial::DeviceState::apply_to(const Handle &handle) { #ifdef WIN32 if(SetCommState(*handle, &state)==0) @@ -43,7 +51,7 @@ void set_state(const Handle &handle, DeviceState &state) #endif } -void set_baud_rate(DeviceState &state, unsigned baud) +void Serial::DeviceState::set_baud_rate(unsigned baud) { #ifdef WIN32 state.BaudRate = baud; @@ -78,7 +86,7 @@ void set_baud_rate(DeviceState &state, unsigned baud) #endif } -void set_data_bits(DeviceState &state, unsigned bits) +void Serial::DeviceState::set_data_bits(unsigned bits) { #ifdef WIN32 state.ByteSize = bits; @@ -97,7 +105,7 @@ void set_data_bits(DeviceState &state, unsigned bits) #endif } -void set_parity(DeviceState &state, Serial::Parity par) +void Serial::DeviceState::set_parity(Serial::Parity par) { #ifdef WIN32 switch(par) @@ -121,7 +129,7 @@ void set_parity(DeviceState &state, Serial::Parity par) #endif } -void set_stop_bits(DeviceState &state, unsigned bits) +void Serial::DeviceState::set_stop_bits(unsigned bits) { #ifdef WIN32 switch(bits) @@ -143,11 +151,6 @@ void set_stop_bits(DeviceState &state, unsigned bits) #endif } -} - - -namespace Msp { -namespace IO { Serial::Serial(const string &descr): reader(handle, 1024) @@ -231,33 +234,33 @@ void Serial::set_block(bool b) void Serial::set_baud_rate(unsigned rate) { DeviceState state; - get_state(handle, state); - ::set_baud_rate(state, rate); - set_state(handle, state); + state.get_from(handle); + state.set_baud_rate(rate); + state.apply_to(handle); } void Serial::set_data_bits(unsigned bits) { DeviceState state; - get_state(handle, state); - ::set_data_bits(state, bits); - set_state(handle, state); + state.get_from(handle); + state.set_data_bits(bits); + state.apply_to(handle); } void Serial::set_parity(Parity par) { DeviceState state; - get_state(handle, state); - ::set_parity(state, par); - set_state(handle, state); + state.get_from(handle); + state.set_parity(par); + state.apply_to(handle); } void Serial::set_stop_bits(unsigned bits) { DeviceState state; - get_state(handle, state); - ::set_stop_bits(state, bits); - set_state(handle, state); + state.get_from(handle); + state.set_stop_bits(bits); + state.apply_to(handle); } void Serial::set_parameters(const string ¶ms) @@ -274,12 +277,12 @@ void Serial::set_parameters(const string ¶ms) throw invalid_argument("Serial::set_parameters stop_bits"); 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); + state.get_from(handle); + state.set_baud_rate(lexical_cast(params.substr(0, i))); + state.set_data_bits(params[i+1]-'0'); + state.set_parity((params[i+2]=='E' ? EVEN : params[i+2]=='O' ? ODD : NONE)); + state.set_stop_bits(params[i+3]-'0'); + state.apply_to(handle); } unsigned Serial::do_write(const char *buf, unsigned size) diff --git a/source/io/serial.h b/source/io/serial.h index 39ca27a..49ecefb 100644 --- a/source/io/serial.h +++ b/source/io/serial.h @@ -19,6 +19,8 @@ public: }; private: + struct DeviceState; + Handle handle; EventReader reader; -- 2.43.0