2020-12-04 16:43:46 +00:00
|
|
|
// Copyright 2018, Philipp Zabel.
|
|
|
|
// Copyright 2020-2021, N Madsen.
|
|
|
|
// Copyright 2020-2021, Collabora, Ltd.
|
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
|
|
/*!
|
|
|
|
* @file
|
|
|
|
* @brief WMR and MS HoloLens protocol constants, structures and helpers header
|
|
|
|
* @author Philipp Zabel <philipp.zabel@gmail.com>
|
|
|
|
* @author nima01 <nima_zero_one@protonmail.com>
|
|
|
|
* @ingroup drv_wmr
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "math/m_vec2.h"
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* WMR and MS HoloLens Sensors protocol constants and structures
|
|
|
|
*
|
|
|
|
* @ingroup drv_wmr
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define WMR_FEATURE_BUFFER_SIZE 497
|
|
|
|
#define WMR_MS_HOLOLENS_NS_PER_TICK 100
|
|
|
|
|
2021-11-15 01:05:19 +00:00
|
|
|
// Messages types specific to WMR Hololens Sensors devices
|
2020-12-04 16:43:46 +00:00
|
|
|
#define WMR_MS_HOLOLENS_MSG_SENSORS 0x01
|
2021-11-15 01:05:19 +00:00
|
|
|
#define WMR_MS_HOLOLENS_MSG_CONTROL 0x02 // Integrated motion controller messages?
|
2020-12-04 16:43:46 +00:00
|
|
|
#define WMR_MS_HOLOLENS_MSG_DEBUG 0x03
|
|
|
|
#define WMR_MS_HOLOLENS_MSG_UNKNOWN_05 0x05
|
|
|
|
#define WMR_MS_HOLOLENS_MSG_UNKNOWN_06 0x06
|
|
|
|
#define WMR_MS_HOLOLENS_MSG_UNKNOWN_0E 0x0E
|
|
|
|
#define WMR_MS_HOLOLENS_MSG_UNKNOWN_17 0x17
|
|
|
|
|
2021-11-15 01:05:19 +00:00
|
|
|
// Messages types specific to WMR Hololens Sensors' companion devices
|
2020-12-04 16:43:46 +00:00
|
|
|
#define WMR_CONTROL_MSG_IPD_VALUE 0x01
|
|
|
|
#define WMR_CONTROL_MSG_UNKNOWN_05 0x05
|
|
|
|
|
2021-11-13 16:01:24 +00:00
|
|
|
#define STR_TO_U32(s) ((uint32_t)(((s)[0]) | ((s)[1] << 8) | ((s)[2] << 16) | ((s)[3] << 24)))
|
|
|
|
#define WMR_MAGIC STR_TO_U32("Dlo+")
|
2021-04-23 21:48:08 +00:00
|
|
|
|
2020-12-04 16:43:46 +00:00
|
|
|
static const unsigned char hololens_sensors_imu_on[64] = {0x02, 0x07};
|
|
|
|
|
2021-04-23 21:48:08 +00:00
|
|
|
|
2020-12-04 16:43:46 +00:00
|
|
|
struct hololens_sensors_packet
|
|
|
|
{
|
|
|
|
uint8_t id;
|
|
|
|
uint16_t temperature[4];
|
|
|
|
uint64_t gyro_timestamp[4];
|
2021-04-23 21:48:08 +00:00
|
|
|
int16_t gyro[3][4 * 8];
|
2020-12-04 16:43:46 +00:00
|
|
|
uint64_t accel_timestamp[4];
|
|
|
|
int32_t accel[3][4];
|
|
|
|
uint64_t video_timestamp[4];
|
|
|
|
};
|
|
|
|
|
2021-06-20 15:13:22 +00:00
|
|
|
struct wmr_config_header
|
|
|
|
{
|
|
|
|
uint32_t json_start;
|
|
|
|
uint32_t json_size;
|
|
|
|
char manufacturer[0x40];
|
|
|
|
char device[0x40];
|
|
|
|
char serial[0x40];
|
|
|
|
char uid[0x26];
|
|
|
|
char unk[0xd5];
|
|
|
|
char name[0x40];
|
|
|
|
char revision[0x20];
|
|
|
|
char revision_date[0x20];
|
|
|
|
};
|
|
|
|
|
2020-12-04 16:43:46 +00:00
|
|
|
/*!
|
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* WMR and MS HoloLens Sensors protocol helpers
|
|
|
|
*
|
|
|
|
* @ingroup drv_wmr
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
void
|
|
|
|
vec3_from_hololens_accel(int32_t sample[3][4], int i, struct xrt_vec3 *out_vec);
|
|
|
|
|
|
|
|
void
|
|
|
|
vec3_from_hololens_gyro(int16_t sample[3][32], int i, struct xrt_vec3 *out_vec);
|
|
|
|
|
|
|
|
|
|
|
|
static inline uint8_t
|
|
|
|
read8(const unsigned char **buffer)
|
|
|
|
{
|
|
|
|
uint8_t ret = **buffer;
|
|
|
|
*buffer += 1;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int16_t
|
|
|
|
read16(const unsigned char **buffer)
|
|
|
|
{
|
|
|
|
int16_t ret = (*(*buffer + 0) << 0) | //
|
|
|
|
(*(*buffer + 1) << 8);
|
|
|
|
*buffer += 2;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-11-13 02:35:13 +00:00
|
|
|
static inline int32_t
|
|
|
|
read24(const unsigned char **buffer)
|
|
|
|
{
|
|
|
|
// Note: Preserve sign by shifting up to write MSB
|
|
|
|
int32_t ret = (*(*buffer + 0) << 8) | (*(*buffer + 1) << 16) | (*(*buffer + 2) << 24);
|
|
|
|
*buffer += 3;
|
|
|
|
|
|
|
|
// restore 24 bit scale again
|
|
|
|
return ret >> 8;
|
|
|
|
}
|
|
|
|
|
2020-12-04 16:43:46 +00:00
|
|
|
static inline int32_t
|
|
|
|
read32(const unsigned char **buffer)
|
|
|
|
{
|
|
|
|
int32_t ret = (*(*buffer + 0) << 0) | //
|
|
|
|
(*(*buffer + 1) << 8) | //
|
|
|
|
(*(*buffer + 2) << 16) | //
|
|
|
|
(*(*buffer + 3) << 24);
|
|
|
|
*buffer += 4;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint64_t
|
|
|
|
read64(const unsigned char **buffer)
|
|
|
|
{
|
|
|
|
uint64_t ret = ((uint64_t) * (*buffer + 0) << 0) | //
|
|
|
|
((uint64_t) * (*buffer + 1) << 8) | //
|
|
|
|
((uint64_t) * (*buffer + 2) << 16) | //
|
|
|
|
((uint64_t) * (*buffer + 3) << 24) | //
|
|
|
|
((uint64_t) * (*buffer + 4) << 32) | //
|
|
|
|
((uint64_t) * (*buffer + 5) << 40) | //
|
|
|
|
((uint64_t) * (*buffer + 6) << 48) | //
|
|
|
|
((uint64_t) * (*buffer + 7) << 56);
|
|
|
|
*buffer += 8;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|