15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_CONNECTION_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_CONNECTION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/api_resource.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/api_resource_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kSerialConnectionNotFoundError[];
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates an open serial port. Platform-specific implementations are in
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// _win and _posix versions of the the .cc file.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SerialConnection : public ApiResource {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SerialConnection(const std::string& port,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int bitrate,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const std::string& owner_extension_id);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SerialConnection();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Open();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Close();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Flush();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Read(scoped_refptr<net::IOBufferWithSize> io_buffer);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Write(scoped_refptr<net::IOBuffer> io_buffer, int byte_count);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ControlSignals {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Sent from workstation to device. The should_set_ values indicate whether
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SetControlSignals should change the given signal (true) or else leave it
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as-is (false).
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_set_dtr;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool dtr;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_set_rts;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool rts;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Received by workstation from device. DCD (Data Carrier Detect) is
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // equivalent to RLSD (Receive Line Signal Detect) on some platforms.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool dcd;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool cts;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetControlSignals(ControlSignals &control_signals);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SetControlSignals(const ControlSignals &control_signals);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static const BrowserThread::ID kThreadId = BrowserThread::FILE;
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do platform-specific work after a successful Open().
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool PostOpen();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Platform-specific port name adapter
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static std::string MaybeFixUpPortName(const std::string &port_name);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class ApiResourceManager<SerialConnection>;
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static const char* service_name() {
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return "SerialConnectionManager";
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string port_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bitrate_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformFile file_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_CONNECTION_H_
80