void MavlinkSerial::async_write_end(const boost::system::error_code &error, std::size_t bytes_transferred) { if (error) { close(); return; } mutex_lock lock(mutex_); if (write_queue_.empty()) { write_in_progress_ = false; return; } WriteBuffer *buffer = write_queue_.front(); buffer->pos += bytes_transferred; if (buffer->nbytes() == 0) { write_queue_.pop_front(); delete buffer; } if (write_queue_.empty()) write_in_progress_ = false; else do_async_write(false); }
void MavlinkSerial::do_async_write(bool check_write_state) { if (check_write_state && write_in_progress_) return; mutex_lock lock(mutex_); if (write_queue_.empty()) return; write_in_progress_ = true; WriteBuffer *buffer = write_queue_.front(); serial_port_.async_write_some( boost::asio::buffer(buffer->dpos(), buffer->nbytes()), boost::bind( &MavlinkSerial::async_write_end, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }