Add channels & control query
This commit is contained in:
parent
1f9a7ac318
commit
84bcf15e11
|
@ -92,6 +92,7 @@ endif()
|
||||||
|
|
||||||
set(MYNTEYE_SRCS
|
set(MYNTEYE_SRCS
|
||||||
${UVC_SRC}
|
${UVC_SRC}
|
||||||
|
src/internal/channels.cc
|
||||||
src/internal/config.cc
|
src/internal/config.cc
|
||||||
src/internal/streams.cc
|
src/internal/streams.cc
|
||||||
src/internal/strings.cc
|
src/internal/strings.cc
|
||||||
|
|
44
src/internal/channels.cc
Normal file
44
src/internal/channels.cc
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#include "internal/channels.h"
|
||||||
|
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "uvc/uvc.h"
|
||||||
|
|
||||||
|
MYNTEYE_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
Channels::Channels(std::shared_ptr<uvc::device> device) : device_(device) {
|
||||||
|
VLOG(2) << __func__;
|
||||||
|
}
|
||||||
|
|
||||||
|
Channels::~Channels() {
|
||||||
|
VLOG(2) << __func__;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Channels::ControlQuery(
|
||||||
|
const uvc::xu &xu, uint8_t selector, const query_t &query, uint16_t size,
|
||||||
|
uint8_t *data) {
|
||||||
|
CHECK_NOTNULL(device_);
|
||||||
|
uvc::xu_query code;
|
||||||
|
switch (query) {
|
||||||
|
case SET_CUR:
|
||||||
|
code = uvc::XU_SET_CUR;
|
||||||
|
break;
|
||||||
|
case GET_CUR:
|
||||||
|
code = uvc::XU_GET_CUR;
|
||||||
|
break;
|
||||||
|
case GET_MIN:
|
||||||
|
code = uvc::XU_GET_MIN;
|
||||||
|
break;
|
||||||
|
case GET_MAX:
|
||||||
|
code = uvc::XU_GET_MAX;
|
||||||
|
break;
|
||||||
|
case GET_DEF:
|
||||||
|
code = uvc::XU_GET_DEF;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG(FATAL) << "ControlQuery query code is unaccepted";
|
||||||
|
}
|
||||||
|
return uvc::xu_control_query(*device_, xu, selector, code, size, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
MYNTEYE_END_NAMESPACE
|
42
src/internal/channels.h
Normal file
42
src/internal/channels.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#ifndef MYNTEYE_INTERNAL_CHANNELS_H_ // NOLINT
|
||||||
|
#define MYNTEYE_INTERNAL_CHANNELS_H_
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "mynteye/mynteye.h"
|
||||||
|
|
||||||
|
MYNTEYE_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
namespace uvc {
|
||||||
|
|
||||||
|
struct device;
|
||||||
|
struct xu;
|
||||||
|
|
||||||
|
} // namespace uvc
|
||||||
|
|
||||||
|
class Channels {
|
||||||
|
public:
|
||||||
|
typedef enum Query {
|
||||||
|
SET_CUR,
|
||||||
|
GET_CUR,
|
||||||
|
GET_MIN,
|
||||||
|
GET_MAX,
|
||||||
|
GET_DEF,
|
||||||
|
LAST
|
||||||
|
} query_t;
|
||||||
|
|
||||||
|
explicit Channels(std::shared_ptr<uvc::device> device);
|
||||||
|
~Channels();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool ControlQuery(
|
||||||
|
const uvc::xu &xu, uint8_t selector, const query_t &query, uint16_t size,
|
||||||
|
uint8_t *data);
|
||||||
|
|
||||||
|
std::shared_ptr<uvc::device> device_;
|
||||||
|
};
|
||||||
|
|
||||||
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
||||||
|
#endif // MYNTEYE_INTERNAL_CHANNELS_H_ NOLINT
|
|
@ -109,26 +109,17 @@ std::string get_video_name(const device &device) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_control(
|
bool xu_control_query(
|
||||||
const device &device, const extension_unit &xu, uint8_t ctrl, void *data,
|
const device &device, const xu &xu, uint8_t selector, xu_query query,
|
||||||
int len) {
|
uint16_t size, uint8_t *data) {
|
||||||
// TODO(JohnZhao)
|
// TODO(JohnZhao)
|
||||||
UNUSED(device)
|
UNUSED(device)
|
||||||
UNUSED(xu)
|
UNUSED(xu)
|
||||||
UNUSED(ctrl)
|
UNUSED(selector)
|
||||||
|
UNUSED(query)
|
||||||
|
UNUSED(size)
|
||||||
UNUSED(data)
|
UNUSED(data)
|
||||||
UNUSED(len)
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
void set_control(
|
|
||||||
const device &device, const extension_unit &xu, uint8_t ctrl, void *data,
|
|
||||||
int len) {
|
|
||||||
// TODO(JohnZhao)
|
|
||||||
UNUSED(device)
|
|
||||||
UNUSED(xu)
|
|
||||||
UNUSED(ctrl)
|
|
||||||
UNUSED(data)
|
|
||||||
UNUSED(len)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_device_mode(
|
void set_device_mode(
|
||||||
|
|
|
@ -192,26 +192,15 @@ struct device {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_control(
|
bool xu_control_query(
|
||||||
const extension_unit &xu, uint8_t control, void *data,
|
const xu &xu, uint8_t selector, uint8_t query, uint16_t size,
|
||||||
size_t size) const {
|
uint8_t *data) const {
|
||||||
uvc_xu_control_query q = {static_cast<uint8_t>(xu.unit), control,
|
uvc_xu_control_query q = {xu.unit, selector, query, size, data};
|
||||||
UVC_GET_CUR, static_cast<uint16_t>(size),
|
|
||||||
reinterpret_cast<uint8_t *>(data)};
|
|
||||||
if (xioctl(fd, UVCIOC_CTRL_QUERY, &q) < 0) {
|
if (xioctl(fd, UVCIOC_CTRL_QUERY, &q) < 0) {
|
||||||
LOG_ERROR(FATAL, "UVCIOC_CTRL_QUERY:UVC_GET_CUR");
|
LOG_ERROR(WARNING, "UVCIOC_CTRL_QUERY failed");
|
||||||
}
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
void set_control(
|
|
||||||
const extension_unit &xu, uint8_t control, void *data,
|
|
||||||
size_t size) const {
|
|
||||||
uvc_xu_control_query q = {static_cast<uint8_t>(xu.unit), control,
|
|
||||||
UVC_SET_CUR, static_cast<uint16_t>(size),
|
|
||||||
reinterpret_cast<uint8_t *>(data)};
|
|
||||||
if (xioctl(fd, UVCIOC_CTRL_QUERY, &q) < 0) {
|
|
||||||
LOG_ERROR(FATAL, "UVCIOC_CTRL_QUERY:UVC_SET_CUR");
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_format(
|
void set_format(
|
||||||
|
@ -444,16 +433,31 @@ std::string get_video_name(const device &device) {
|
||||||
return device.dev_name;
|
return device.dev_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_control(
|
bool xu_control_query(
|
||||||
const device &device, const extension_unit &xu, uint8_t ctrl, void *data,
|
const device &device, const xu &xu, uint8_t selector, xu_query query,
|
||||||
int len) {
|
uint16_t size, uint8_t *data) {
|
||||||
device.get_control(xu, ctrl, data, len);
|
uint8_t code;
|
||||||
}
|
switch (query) {
|
||||||
|
case XU_SET_CUR:
|
||||||
void set_control(
|
code = UVC_SET_CUR;
|
||||||
const device &device, const extension_unit &xu, uint8_t ctrl, void *data,
|
break;
|
||||||
int len) {
|
case XU_GET_CUR:
|
||||||
device.set_control(xu, ctrl, data, len);
|
code = UVC_GET_CUR;
|
||||||
|
break;
|
||||||
|
case XU_GET_MIN:
|
||||||
|
code = UVC_GET_MIN;
|
||||||
|
break;
|
||||||
|
case XU_GET_MAX:
|
||||||
|
code = UVC_GET_MAX;
|
||||||
|
break;
|
||||||
|
case XU_GET_DEF:
|
||||||
|
code = UVC_GET_DEF;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG(ERROR) << "xu_control_query request code is unaccepted";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return device.xu_control_query(xu, selector, code, size, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_device_mode(
|
void set_device_mode(
|
||||||
|
|
|
@ -16,10 +16,30 @@ MYNTEYE_BEGIN_NAMESPACE
|
||||||
|
|
||||||
namespace uvc {
|
namespace uvc {
|
||||||
|
|
||||||
struct extension_unit {
|
/*
|
||||||
int unit;
|
struct uvc_xu_control_query
|
||||||
|
|
||||||
|
__u8 unit Extension unit ID
|
||||||
|
__u8 selector Control selector
|
||||||
|
__u8 query Request code to send to the device
|
||||||
|
__u16 size Control data size (in bytes)
|
||||||
|
__u8 *data Control value
|
||||||
|
*/
|
||||||
|
|
||||||
|
// extension unit
|
||||||
|
struct xu {
|
||||||
|
uint8_t unit = 3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum xu_query {
|
||||||
|
XU_SET_CUR, // Set current value of the control
|
||||||
|
XU_GET_CUR, // Get current value of the control
|
||||||
|
XU_GET_MIN, // Get min value of the control
|
||||||
|
XU_GET_MAX, // Get max value of the control
|
||||||
|
XU_GET_DEF, // Get default value of the control
|
||||||
|
XU_LAST
|
||||||
|
} xu_query;
|
||||||
|
|
||||||
struct context; // Opaque type representing access to the underlying UVC
|
struct context; // Opaque type representing access to the underlying UVC
|
||||||
// implementation
|
// implementation
|
||||||
struct device; // Opaque type representing access to a specific UVC device
|
struct device; // Opaque type representing access to a specific UVC device
|
||||||
|
@ -37,12 +57,9 @@ int get_product_id(const device &device);
|
||||||
std::string get_video_name(const device &device);
|
std::string get_video_name(const device &device);
|
||||||
|
|
||||||
// Access XU controls
|
// Access XU controls
|
||||||
void get_control(
|
bool xu_control_query(
|
||||||
const device &device, const extension_unit &xu, uint8_t ctrl, void *data,
|
const device &device, const xu &xu, uint8_t selector, xu_query query,
|
||||||
int len);
|
uint16_t size, uint8_t *data);
|
||||||
void set_control(
|
|
||||||
const device &device, const extension_unit &xu, uint8_t ctrl, void *data,
|
|
||||||
int len);
|
|
||||||
|
|
||||||
// Control streaming
|
// Control streaming
|
||||||
typedef std::function<void(const void *frame)> video_channel_callback;
|
typedef std::function<void(const void *frame)> video_channel_callback;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user