Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Unified Diff: extensions/browser/api/webcam_private/visca_webcam.cc

Issue 1144423004: Add support for PTZ via VISCA. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Minor cleanup. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/browser/api/webcam_private/visca_webcam.cc
diff --git a/extensions/browser/api/webcam_private/visca_webcam.cc b/extensions/browser/api/webcam_private/visca_webcam.cc
new file mode 100644
index 0000000000000000000000000000000000000000..52ba338059a95dcd50f1b625b79f1cc59a415ba0
--- /dev/null
+++ b/extensions/browser/api/webcam_private/visca_webcam.cc
@@ -0,0 +1,180 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/browser/api/webcam_private/visca_webcam.h"
+
+#include "base/bind.h"
+#include "base/message_loop/message_loop.h"
+#include "content/public/browser/browser_thread.h"
+#include "extensions/browser/api/serial/serial_connection.h"
+
+using content::BrowserThread;
+
+namespace extensions {
+
+ViscaWebcam::ViscaWebcam(const std::string& path,
+ const std::string& extension_id)
+ : path_(path),
+ extension_id_(extension_id) {}
+
+ViscaWebcam::~ViscaWebcam() {}
+
+void ViscaWebcam::Open(const OpenCallback& callback) {
+ BrowserThread::PostTask(
+ BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(&ViscaWebcam::OpenOnIOThread, AsWeakPtr(), callback));
+}
+
+void ViscaWebcam::OpenOnIOThread(const OpenCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ core_api::serial::ConnectionOptions options;
+
+ options.persistent.reset(new bool(false));
+ options.buffer_size.reset(new int(4096));
+ options.bitrate.reset(new int(9600));
+ options.cts_flow_control.reset(new bool(false));
+ options.receive_timeout.reset(new int(0));
+ options.send_timeout.reset(new int(0));
+ options.data_bits = core_api::serial::DATA_BITS_EIGHT;
+ options.parity_bit = core_api::serial::PARITY_BIT_NO;
+ options.stop_bits = core_api::serial::STOP_BITS_ONE;
+
+ serial_connection_.reset(new SerialConnection(path_, extension_id_));
+ serial_connection_->Open(options,
+ base::Bind(&ViscaWebcam::OnConnected,
+ AsWeakPtr(),
+ callback));
+}
+
+void ViscaWebcam::OnConnected(const OpenCallback& callback, bool success) {
+ if (!success) {
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(callback, false));
+ return;
+ }
+
+ std::vector<char> data;
+ // Clear All command = 0x88 0x01 0x00 0x01 0xFF
+ data.push_back(0x88);
+ data.push_back(0x01);
+ data.push_back(0x00);
+ data.push_back(0x01);
+ data.push_back(0xFF);
+
+ Send(data, base::Bind(&ViscaWebcam::OnClearAllComplete, AsWeakPtr(),
+ callback));
+ ReceiveLoop();
+
+ // TODO: Send an addressing request when Clear All is complete.
+}
+
+void ViscaWebcam::OnClearAllComplete(const OpenCallback& callback,
+ bool success,
+ const std::vector<char>& data) {
+ /* TODO: Re-add this code to check response.
+ LOG(ERROR) << "SUCCESS: " << success;
+ if (success) {
+ // Expected response = 0x88 0x01 0x00 0x01 0xFF
+ LOG(ERROR) << "size: " << data.size();
+ if (data.size() == 5) {
+ success = (data[0] == 0x88 &&
+ data[1] == 0x01 &&
+ data[2] == 0x00 &&
+ data[3] == 0x01 &&
+ data[4] == 0xFF);
+ } else {
+ success = false;
+ }
+ }
+ */
+
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(callback, success));
+}
+
+void ViscaWebcam::Send(const std::vector<char>& data,
+ const CommandCompleteCallback& callback) {
+ serial_connection_->Send(data, base::Bind(&ViscaWebcam::OnSendComplete,
+ AsWeakPtr(), callback));
+}
+
+void ViscaWebcam::OnSendComplete(const CommandCompleteCallback& callback,
+ int bytes_sent,
+ core_api::serial::SendError error) {
+ if (error == core_api::serial::SEND_ERROR_NONE) {
+ // TODO: Pull bytes from receive buffer until a 0xFF is read.
+ std::vector<char> data;
+ callback.Run(true, data);
+ } else {
+ std::vector<char> data;
+ callback.Run(false, data);
+ }
+}
+
+void ViscaWebcam::ReceiveLoop() {
+ serial_connection_->Receive(base::Bind(&ViscaWebcam::OnReceiveComplete,
+ AsWeakPtr()));
+}
+
+void ViscaWebcam::OnReceiveComplete(const std::vector<char>& data,
+ core_api::serial::ReceiveError error) {
+ // TODO: Remove
+ LOG(ERROR) << "size: " << data.size();
+ for (const auto& byte : data) {
+ LOG(ERROR) << "Data: 0x" << std::hex << (int(byte) & 0xFF);
+ }
+
+ data_buffer_.insert(data_buffer_.end(), data.begin(), data.end());
+
+ if (error == core_api::serial::RECEIVE_ERROR_NONE) {
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE, base::Bind(&ViscaWebcam::ReceiveLoop, AsWeakPtr()));
+ } else {
+ // TODO: Error handling.
+ LOG(ERROR) << "ERROR: " << error;
+ }
+}
+
+void ViscaWebcam::Reset(bool pan, bool tilt, bool zoom) {
+}
+
+bool ViscaWebcam::GetPan(int* value) {
+ return false;
+}
+
+bool ViscaWebcam::GetTilt(int* value) {
+ return false;
+}
+
+bool ViscaWebcam::GetZoom(int* value) {
+ return false;
+}
+
+bool ViscaWebcam::SetPan(int value) {
+ return false;
+}
+
+bool ViscaWebcam::SetTilt(int value) {
+ return false;
+}
+
+bool ViscaWebcam::SetZoom(int value) {
+ return false;
+}
+
+bool ViscaWebcam::SetPanDirection(PanDirection direction) {
+ return false;
+}
+
+bool ViscaWebcam::SetTiltDirection(TiltDirection direction) {
+ return false;
+}
+
+} // namespace extensions
« no previous file with comments | « extensions/browser/api/webcam_private/visca_webcam.h ('k') | extensions/browser/api/webcam_private/webcam_private_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698