27 #include <opencv2/imgproc/imgproc.hpp>
30 using namespace oculus_dk2;
32 static const vrpn_uint16 OCULUS_VENDOR = 0x2833;
33 static const vrpn_uint16 DK2_PRODUCT = 0x0021;
35 Oculus_DK2_HID::Oculus_DK2_HID(
double keepAliveSeconds)
37 m_filter = new vrpn_HidProductAcceptor(OCULUS_VENDOR, DK2_PRODUCT)) {
39 m_keepAliveSeconds = keepAliveSeconds;
44 vrpn_gettimeofday(&m_lastKeepAlive, NULL);
47 Oculus_DK2_HID::~Oculus_DK2_HID() {
49 writeLEDControl(
false);
55 std::vector<OCULUS_IMU_REPORT> Oculus_DK2_HID::poll() {
59 vrpn_gettimeofday(&now, NULL);
60 if (vrpn_TimevalDurationSeconds(now, m_lastKeepAlive) >=
63 m_lastKeepAlive = now;
77 void Oculus_DK2_HID::writeLEDControl(
78 bool enable, vrpn_uint16 exposureLength, vrpn_uint16 frameInterval,
79 vrpn_uint16 vSyncOffset, vrpn_uint8 dutyCycle, vrpn_uint8 pattern,
80 bool autoIncrement,
bool useCarrier,
bool syncInput,
bool vSyncLock,
81 bool customPattern, vrpn_uint16 commandId) {
83 vrpn_uint8 pktBuffer[13];
86 vrpn_uint8 *bufptr = pktBuffer;
87 vrpn_int32 buflen =
sizeof(pktBuffer);
88 vrpn_buffer_to_little_endian(&bufptr, &buflen, vrpn_uint8(0x0cU));
89 vrpn_buffer_to_little_endian(&bufptr, &buflen, commandId);
90 vrpn_buffer_to_little_endian(&bufptr, &buflen, pattern);
91 vrpn_uint8 flags = 0x00U;
110 vrpn_buffer_to_little_endian(&bufptr, &buflen, flags);
111 vrpn_buffer_to_little_endian(&bufptr, &buflen,
113 vrpn_buffer_to_little_endian(&bufptr, &buflen, exposureLength);
114 vrpn_buffer_to_little_endian(&bufptr, &buflen, frameInterval);
115 vrpn_buffer_to_little_endian(&bufptr, &buflen, vSyncOffset);
116 vrpn_buffer_to_little_endian(&bufptr, &buflen, dutyCycle);
119 send_feature_report(
sizeof(pktBuffer), pktBuffer);
124 void Oculus_DK2_HID::writeKeepAlive(
bool keepLEDs, vrpn_uint16 interval,
125 vrpn_uint16 commandId) {
127 vrpn_uint8 pktBuffer[6];
130 vrpn_uint8 *bufptr = pktBuffer;
131 vrpn_int32 buflen =
sizeof(pktBuffer);
132 vrpn_buffer_to_little_endian(&bufptr, &buflen, vrpn_uint8(0x11U));
133 vrpn_buffer_to_little_endian(&bufptr, &buflen, commandId);
134 vrpn_uint8 flags = keepLEDs ? 0x0bU : 0x01U;
135 vrpn_buffer_to_little_endian(&bufptr, &buflen, flags);
136 vrpn_buffer_to_little_endian(&bufptr, &buflen, interval);
139 send_feature_report(
sizeof(pktBuffer), pktBuffer);
142 void Oculus_DK2_HID::on_data_received(
size_t bytes, vrpn_uint8 *buffer) {
150 cv::Mat osvr::oculus_dk2::unscramble_image(
const cv::Mat &image) {
216 cv::cvtColor(image, yuvImage, cv::COLOR_BGR2YCrCb);
229 cv::Mat outImage(yuvImage.rows, yuvImage.cols * 2, CV_8UC1,
cv::Scalar(0));
230 for (
int r = 0; r < yuvImage.rows; r++) {
231 for (
int c = 0; c < yuvImage.cols; c++) {
232 outImage.at<
unsigned char>(r, c * 2) =
233 yuvImage.at<cv::Vec3b>(r, c)[0];
234 outImage.at<
unsigned char>(r, c * 2 + 1) =
235 yuvImage.at<cv::Vec3b>(r, c)[0];
Header file describing interface for an Oculus DK2 device.
double Scalar
Common scalar type.