26
26
struct SerialDevice::pImpl
28
string error_message_;
31
RingBuffer<char> ring_buffer_; //!< ��M�o�b�t�@
34
pImpl(void) : error_message_("no error"), baudrate_(0)
39
void updateRingBuffer(void)
41
enum { BufferSize = 2048 };
42
char buffer[BufferSize];
44
int n = raw_.receive(buffer, BufferSize, 0);
46
ring_buffer_.put(buffer, n);
51
int receive(char* data, size_t count, int timeout)
53
if (! isConnected()) {
54
error_message_ = "no connection.";
63
size_t ring_filled = ring_buffer_.size();
64
if (ring_filled < count) {
68
// �o�b�t�@�Ƀf�[�^������ꍇ�A�o�b�t�@����f�[�^���i�[����
69
size_t read_size = std::min(count, ring_buffer_.size());
70
ring_buffer_.get(data, read_size);
73
// �o�b�t�@����̏ꍇ�A�c��̃f�[�^�̓V�X�e�����璼�ړǂݍ���
74
read_size = max(0, static_cast<int>(count - filled));
76
int n = raw_.receive(&data[filled], static_cast<int>(read_size), timeout);
78
error_message_ = raw_.what();
83
return static_cast<int>(filled);
87
bool isConnected(void)
89
return raw_.isConnected();
28
string error_message_;
31
RingBuffer<char> ring_buffer_; //!< ��M�o�b�t�@
34
pImpl(void) : error_message_("no error"), baudrate_(0)
39
void updateRingBuffer(void)
41
enum { BufferSize = 2048 };
42
char buffer[BufferSize];
44
int n = raw_.receive(buffer, BufferSize, 0);
46
ring_buffer_.put(buffer, n);
51
int receive(char* data, size_t count, int timeout)
53
if (! isConnected()) {
54
error_message_ = "no connection.";
63
size_t ring_filled = ring_buffer_.size();
64
if (ring_filled < count) {
68
// �o�b�t�@�Ƀf�[�^������ꍇ�A�o�b�t�@����f�[�^���i�[����
69
size_t read_size = std::min(count, ring_buffer_.size());
70
ring_buffer_.get(data, read_size);
73
// �o�b�t�@����̏ꍇ�A�c��̃f�[�^�̓V�X�e�����璼�ړǂݍ���
74
read_size = max(0, static_cast<int>(count - filled));
76
int n = raw_.receive(&data[filled],
77
static_cast<int>(read_size), timeout);
79
error_message_ = raw_.what();
84
return static_cast<int>(filled);
88
bool isConnected(void)
90
return raw_.isConnected();
99
100
SerialDevice::~SerialDevice(void)
105
106
const char* SerialDevice::what(void) const
107
return pimpl->error_message_.c_str();
108
return pimpl->error_message_.c_str();
111
112
bool SerialDevice::connect(const char* device, long baudrate)
115
if (! pimpl->raw_.connect(device, baudrate)) {
116
pimpl->error_message_ = pimpl->raw_.what();
116
if (! pimpl->raw_.connect(device, baudrate)) {
117
pimpl->error_message_ = pimpl->raw_.what();
124
125
void SerialDevice::disconnect(void)
126
return pimpl->raw_.disconnect();
127
return pimpl->raw_.disconnect();
130
131
bool SerialDevice::setBaudrate(long baudrate)
132
if (! pimpl->raw_.setBaudrate(baudrate)) {
133
pimpl->error_message_ = pimpl->raw_.what();
134
pimpl->baudrate_ = 0;
137
pimpl->baudrate_ = baudrate;
133
if (! pimpl->raw_.setBaudrate(baudrate)) {
134
pimpl->error_message_ = pimpl->raw_.what();
135
pimpl->baudrate_ = 0;
138
pimpl->baudrate_ = baudrate;
142
143
long SerialDevice::baudrate(void) const
144
return pimpl->baudrate_;
145
return pimpl->baudrate_;
148
149
bool SerialDevice::isConnected(void) const
150
return pimpl->isConnected();
151
return pimpl->isConnected();
154
155
int SerialDevice::send(const char* data, size_t count)
156
if (! isConnected()) {
157
pimpl->error_message_ = "no connection.";
157
if (! isConnected()) {
158
pimpl->error_message_ = "no connection.";
161
int n = pimpl->raw_.send(data, static_cast<int>(count));
163
pimpl->error_message_ = pimpl->raw_.what();
162
int n = pimpl->raw_.send(data, static_cast<int>(count));
164
pimpl->error_message_ = pimpl->raw_.what();
169
170
int SerialDevice::receive(char* data, size_t count, int timeout)
171
if (! isConnected()) {
172
pimpl->error_message_ = "no connection.";
172
if (! isConnected()) {
173
pimpl->error_message_ = "no connection.";
176
return pimpl->receive(data, count, timeout);
177
return pimpl->receive(data, count, timeout);
180
181
size_t SerialDevice::size(void) const
182
pimpl->updateRingBuffer();
183
return pimpl->ring_buffer_.size();
183
pimpl->updateRingBuffer();
184
return pimpl->ring_buffer_.size();
187
188
void SerialDevice::flush(void)
189
if (! isConnected()) {
190
pimpl->error_message_ = "no connection.";
190
if (! isConnected()) {
191
pimpl->error_message_ = "no connection.";
194
return pimpl->raw_.flush();
195
return pimpl->raw_.flush();
198
199
void SerialDevice::clear(void)
201
pimpl->ring_buffer_.clear();
202
pimpl->ring_buffer_.clear();
205
206
void SerialDevice::ungetc(const char ch)
207
if (! isConnected()) {
208
pimpl->error_message_ = "no connection.";
208
if (! isConnected()) {
209
pimpl->error_message_ = "no connection.";
212
pimpl->ring_buffer_.ungetc(ch);
213
pimpl->ring_buffer_.ungetc(ch);