1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "device/serial/test_serial_io_handler.h" 6 7#include <algorithm> 8 9#include "base/bind.h" 10#include "device/serial/serial.mojom.h" 11 12namespace device { 13 14TestSerialIoHandler::TestSerialIoHandler() 15 : SerialIoHandler(NULL), 16 opened_(false), 17 dtr_(false), 18 rts_(false), 19 flushes_(0) { 20} 21 22scoped_refptr<SerialIoHandler> TestSerialIoHandler::Create() { 23 return scoped_refptr<SerialIoHandler>(new TestSerialIoHandler); 24} 25 26void TestSerialIoHandler::Open(const std::string& port, 27 const OpenCompleteCallback& callback) { 28 DCHECK(!opened_); 29 opened_ = true; 30 callback.Run(true); 31} 32 33bool TestSerialIoHandler::ConfigurePort( 34 const serial::ConnectionOptions& options) { 35 if (options.bitrate) 36 info_.bitrate = options.bitrate; 37 if (options.data_bits != serial::DATA_BITS_NONE) 38 info_.data_bits = options.data_bits; 39 if (options.parity_bit != serial::PARITY_BIT_NONE) 40 info_.parity_bit = options.parity_bit; 41 if (options.stop_bits != serial::STOP_BITS_NONE) 42 info_.stop_bits = options.stop_bits; 43 if (options.has_cts_flow_control) 44 info_.cts_flow_control = options.cts_flow_control; 45 return true; 46} 47 48void TestSerialIoHandler::ReadImpl() { 49 if (!pending_read_buffer()) 50 return; 51 if (buffer_.empty()) 52 return; 53 54 size_t num_bytes = 55 std::min(buffer_.size(), static_cast<size_t>(pending_read_buffer_len())); 56 memcpy(pending_read_buffer(), buffer_.c_str(), num_bytes); 57 buffer_ = buffer_.substr(num_bytes); 58 ReadCompleted(static_cast<uint32_t>(num_bytes), serial::RECEIVE_ERROR_NONE); 59} 60 61void TestSerialIoHandler::CancelReadImpl() { 62 ReadCompleted(0, read_cancel_reason()); 63} 64 65void TestSerialIoHandler::WriteImpl() { 66 if (!send_callback_.is_null()) { 67 base::Closure callback = send_callback_; 68 send_callback_.Reset(); 69 callback.Run(); 70 return; 71 } 72 buffer_ += std::string(pending_write_buffer(), pending_write_buffer_len()); 73 WriteCompleted(pending_write_buffer_len(), serial::SEND_ERROR_NONE); 74 if (pending_read_buffer()) 75 ReadImpl(); 76} 77 78void TestSerialIoHandler::CancelWriteImpl() { 79 WriteCompleted(0, write_cancel_reason()); 80} 81 82serial::DeviceControlSignalsPtr TestSerialIoHandler::GetControlSignals() const { 83 serial::DeviceControlSignalsPtr signals(serial::DeviceControlSignals::New()); 84 *signals = device_control_signals_; 85 return signals.Pass(); 86} 87 88serial::ConnectionInfoPtr TestSerialIoHandler::GetPortInfo() const { 89 serial::ConnectionInfoPtr info(serial::ConnectionInfo::New()); 90 *info = info_; 91 return info.Pass(); 92} 93 94bool TestSerialIoHandler::Flush() const { 95 flushes_++; 96 return true; 97} 98 99bool TestSerialIoHandler::SetControlSignals( 100 const serial::HostControlSignals& signals) { 101 if (signals.has_dtr) 102 dtr_ = signals.dtr; 103 if (signals.has_rts) 104 rts_ = signals.rts; 105 return true; 106} 107 108TestSerialIoHandler::~TestSerialIoHandler() { 109} 110 111} // namespace device 112