aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Lohr <lohr85@gmail.com>2016-12-10 21:26:16 -0500
committerCharles Lohr <lohr85@gmail.com>2016-12-10 21:26:16 -0500
commit0b602f523e2a759848b67c8177ff8070feb39ec1 (patch)
treeb9c6be04b42ba666b78c3a431df2d723b3a41db9
parent74662206d2031c6dcbdb1a1969985defb71adf21 (diff)
downloadlibsurvive-0b602f523e2a759848b67c8177ff8070feb39ec1.tar.gz
libsurvive-0b602f523e2a759848b67c8177ff8070feb39ec1.tar.bz2
Update redist with an example config, and jsmn.
-rw-r--r--redist/Makefile8
-rw-r--r--redist/jsmn.c315
-rw-r--r--redist/jsmn.h77
-rw-r--r--redist/jsmntest.c75
-rw-r--r--redist/test.config633
5 files changed, 1108 insertions, 0 deletions
diff --git a/redist/Makefile b/redist/Makefile
new file mode 100644
index 0000000..5ba30dc
--- /dev/null
+++ b/redist/Makefile
@@ -0,0 +1,8 @@
+all : jsmntest
+
+jsmntest : jsmntest.c jsmn.c
+ gcc -o $@ $^
+
+clean :
+ rm -rf *.o *~ jsmntest
+
diff --git a/redist/jsmn.c b/redist/jsmn.c
new file mode 100644
index 0000000..10ba0b3
--- /dev/null
+++ b/redist/jsmn.c
@@ -0,0 +1,315 @@
+#include "jsmn.h"
+
+/**
+ * Allocates a fresh unused token from the token pull.
+ */
+static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser,
+ jsmntok_t *tokens, size_t num_tokens) {
+ jsmntok_t *tok;
+ if (parser->toknext >= num_tokens) {
+ return NULL;
+ }
+ tok = &tokens[parser->toknext++];
+ tok->start = tok->end = -1;
+ tok->size = 0;
+#ifdef JSMN_PARENT_LINKS
+ tok->parent = -1;
+#endif
+ return tok;
+}
+
+/**
+ * Fills token type and boundaries.
+ */
+static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type,
+ int start, int end) {
+ token->type = type;
+ token->start = start;
+ token->end = end;
+ token->size = 0;
+}
+
+/**
+ * Fills next available token with JSON primitive.
+ */
+static int jsmn_parse_primitive(jsmn_parser *parser, const char *js,
+ size_t len, jsmntok_t *tokens, size_t num_tokens) {
+ jsmntok_t *token;
+ int start;
+
+ start = parser->pos;
+
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
+ switch (js[parser->pos]) {
+#ifndef JSMN_STRICT
+ /* In strict mode primitive must be followed by "," or "}" or "]" */
+ case ':':
+#endif
+ case '\t' : case '\r' : case '\n' : case ' ' :
+ case ',' : case ']' : case '}' :
+ goto found;
+ }
+ if (js[parser->pos] < 32 || js[parser->pos] >= 127) {
+ parser->pos = start;
+ return JSMN_ERROR_INVAL;
+ }
+ }
+#ifdef JSMN_STRICT
+ /* In strict mode primitive must be followed by a comma/object/array */
+ parser->pos = start;
+ return JSMN_ERROR_PART;
+#endif
+
+found:
+ if (tokens == NULL) {
+ parser->pos--;
+ return 0;
+ }
+ token = jsmn_alloc_token(parser, tokens, num_tokens);
+ if (token == NULL) {
+ parser->pos = start;
+ return JSMN_ERROR_NOMEM;
+ }
+ jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos);
+#ifdef JSMN_PARENT_LINKS
+ token->parent = parser->toksuper;
+#endif
+ parser->pos--;
+ return 0;
+}
+
+/**
+ * Fills next token with JSON string.
+ */
+static int jsmn_parse_string(jsmn_parser *parser, const char *js,
+ size_t len, jsmntok_t *tokens, size_t num_tokens) {
+ jsmntok_t *token;
+
+ int start = parser->pos;
+
+ parser->pos++;
+
+ /* Skip starting quote */
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
+ char c = js[parser->pos];
+
+ /* Quote: end of string */
+ if (c == '\"') {
+ if (tokens == NULL) {
+ return 0;
+ }
+ token = jsmn_alloc_token(parser, tokens, num_tokens);
+ if (token == NULL) {
+ parser->pos = start;
+ return JSMN_ERROR_NOMEM;
+ }
+ jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos);
+#ifdef JSMN_PARENT_LINKS
+ token->parent = parser->toksuper;
+#endif
+ return 0;
+ }
+
+ /* Backslash: Quoted symbol expected */
+ if (c == '\\' && parser->pos + 1 < len) {
+ int i;
+ parser->pos++;
+ switch (js[parser->pos]) {
+ /* Allowed escaped symbols */
+ case '\"': case '/' : case '\\' : case 'b' :
+ case 'f' : case 'r' : case 'n' : case 't' :
+ break;
+ /* Allows escaped symbol \uXXXX */
+ case 'u':
+ parser->pos++;
+ for(i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) {
+ /* If it isn't a hex character we have an error */
+ if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */
+ (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */
+ (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */
+ parser->pos = start;
+ return JSMN_ERROR_INVAL;
+ }
+ parser->pos++;
+ }
+ parser->pos--;
+ break;
+ /* Unexpected symbol */
+ default:
+ parser->pos = start;
+ return JSMN_ERROR_INVAL;
+ }
+ }
+ }
+ parser->pos = start;
+ return JSMN_ERROR_PART;
+}
+
+/**
+ * Parse JSON string and fill tokens.
+ */
+int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
+ jsmntok_t *tokens, unsigned int num_tokens) {
+ int r;
+ int i;
+ jsmntok_t *token;
+ int count = parser->toknext;
+
+ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) {
+ char c;
+ jsmntype_t type;
+
+ c = js[parser->pos];
+ switch (c) {
+ case '{': case '[':
+ count++;
+ if (tokens == NULL) {
+ break;
+ }
+ token = jsmn_alloc_token(parser, tokens, num_tokens);
+ if (token == NULL)
+ return JSMN_ERROR_NOMEM;
+ if (parser->toksuper != -1) {
+ tokens[parser->toksuper].size++;
+#ifdef JSMN_PARENT_LINKS
+ token->parent = parser->toksuper;
+#endif
+ }
+ token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY);
+ token->start = parser->pos;
+ parser->toksuper = parser->toknext - 1;
+ break;
+ case '}': case ']':
+ if (tokens == NULL)
+ break;
+ type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY);
+#ifdef JSMN_PARENT_LINKS
+ if (parser->toknext < 1) {
+ return JSMN_ERROR_INVAL;
+ }
+ token = &tokens[parser->toknext - 1];
+ for (;;) {
+ if (token->start != -1 && token->end == -1) {
+ if (token->type != type) {
+ return JSMN_ERROR_INVAL;
+ }
+ token->end = parser->pos + 1;
+ parser->toksuper = token->parent;
+ break;
+ }
+ if (token->parent == -1) {
+ if(token->type != type || parser->toksuper == -1) {
+ return JSMN_ERROR_INVAL;
+ }
+ break;
+ }
+ token = &tokens[token->parent];
+ }
+#else
+ for (i = parser->toknext - 1; i >= 0; i--) {
+ token = &tokens[i];
+ if (token->start != -1 && token->end == -1) {
+ if (token->type != type) {
+ return JSMN_ERROR_INVAL;
+ }
+ parser->toksuper = -1;
+ token->end = parser->pos + 1;
+ break;
+ }
+ }
+ /* Error if unmatched closing bracket */
+ if (i == -1) return JSMN_ERROR_INVAL;
+ for (; i >= 0; i--) {
+ token = &tokens[i];
+ if (token->start != -1 && token->end == -1) {
+ parser->toksuper = i;
+ break;
+ }
+ }
+#endif
+ break;
+ case '\"':
+ r = jsmn_parse_string(parser, js, len, tokens, num_tokens);
+ if (r < 0) return r;
+ count++;
+ if (parser->toksuper != -1 && tokens != NULL)
+ tokens[parser->toksuper].size++;
+ break;
+ case '\t' : case '\r' : case '\n' : case ' ':
+ break;
+ case ':':
+ parser->toksuper = parser->toknext - 1;
+ break;
+ case ',':
+ if (tokens != NULL && parser->toksuper != -1 &&
+ tokens[parser->toksuper].type != JSMN_ARRAY &&
+ tokens[parser->toksuper].type != JSMN_OBJECT) {
+#ifdef JSMN_PARENT_LINKS
+ parser->toksuper = tokens[parser->toksuper].parent;
+#else
+ for (i = parser->toknext - 1; i >= 0; i--) {
+ if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) {
+ if (tokens[i].start != -1 && tokens[i].end == -1) {
+ parser->toksuper = i;
+ break;
+ }
+ }
+ }
+#endif
+ }
+ break;
+#ifdef JSMN_STRICT
+ /* In strict mode primitives are: numbers and booleans */
+ case '-': case '0': case '1' : case '2': case '3' : case '4':
+ case '5': case '6': case '7' : case '8': case '9':
+ case 't': case 'f': case 'n' :
+ /* And they must not be keys of the object */
+ if (tokens != NULL && parser->toksuper != -1) {
+ jsmntok_t *t = &tokens[parser->toksuper];
+ if (t->type == JSMN_OBJECT ||
+ (t->type == JSMN_STRING && t->size != 0)) {
+ return JSMN_ERROR_INVAL;
+ }
+ }
+#else
+ /* In non-strict mode every unquoted value is a primitive */
+ default:
+#endif
+ r = jsmn_parse_primitive(parser, js, len, tokens, num_tokens);
+ if (r < 0) return r;
+ count++;
+ if (parser->toksuper != -1 && tokens != NULL)
+ tokens[parser->toksuper].size++;
+ break;
+
+#ifdef JSMN_STRICT
+ /* Unexpected char in strict mode */
+ default:
+ return JSMN_ERROR_INVAL;
+#endif
+ }
+ }
+
+ if (tokens != NULL) {
+ for (i = parser->toknext - 1; i >= 0; i--) {
+ /* Unmatched opened object or array */
+ if (tokens[i].start != -1 && tokens[i].end == -1) {
+ return JSMN_ERROR_PART;
+ }
+ }
+ }
+
+ return count;
+}
+
+/**
+ * Creates a new parser based over a given buffer with an array of tokens
+ * available.
+ */
+void jsmn_init(jsmn_parser *parser) {
+ parser->pos = 0;
+ parser->toknext = 0;
+ parser->toksuper = -1;
+}
+
+
diff --git a/redist/jsmn.h b/redist/jsmn.h
new file mode 100644
index 0000000..de9ac17
--- /dev/null
+++ b/redist/jsmn.h
@@ -0,0 +1,77 @@
+#ifndef __JSMN_H_
+#define __JSMN_H_
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * JSON type identifier. Basic types are:
+ * o Object
+ * o Array
+ * o String
+ * o Other primitive: number, boolean (true/false) or null
+ */
+typedef enum {
+ JSMN_UNDEFINED = 0,
+ JSMN_OBJECT = 1,
+ JSMN_ARRAY = 2,
+ JSMN_STRING = 3,
+ JSMN_PRIMITIVE = 4
+} jsmntype_t;
+
+enum jsmnerr {
+ /* Not enough tokens were provided */
+ JSMN_ERROR_NOMEM = -1,
+ /* Invalid character inside JSON string */
+ JSMN_ERROR_INVAL = -2,
+ /* The string is not a full JSON packet, more bytes expected */
+ JSMN_ERROR_PART = -3
+};
+
+/**
+ * JSON token description.
+ * type type (object, array, string etc.)
+ * start start position in JSON data string
+ * end end position in JSON data string
+ */
+typedef struct {
+ jsmntype_t type;
+ int start;
+ int end;
+ int size;
+#ifdef JSMN_PARENT_LINKS
+ int parent;
+#endif
+} jsmntok_t;
+
+/**
+ * JSON parser. Contains an array of token blocks available. Also stores
+ * the string being parsed now and current position in that string
+ */
+typedef struct {
+ unsigned int pos; /* offset in the JSON string */
+ unsigned int toknext; /* next token to allocate */
+ int toksuper; /* superior token node, e.g parent object or array */
+} jsmn_parser;
+
+/**
+ * Create JSON parser over an array of tokens
+ */
+void jsmn_init(jsmn_parser *parser);
+
+/**
+ * Run JSON parser. It parses a JSON data string into and array of tokens, each describing
+ * a single JSON object.
+ */
+int jsmn_parse(jsmn_parser *parser, const char *js, size_t len,
+ jsmntok_t *tokens, unsigned int num_tokens);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __JSMN_H_ */
+
diff --git a/redist/jsmntest.c b/redist/jsmntest.c
new file mode 100644
index 0000000..715bd1f
--- /dev/null
+++ b/redist/jsmntest.c
@@ -0,0 +1,75 @@
+#include "jsmn.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+static int jsoneq(const char *json, jsmntok_t *tok, const char *s) {
+ if (tok->type == JSMN_STRING && (int) strlen(s) == tok->end - tok->start &&
+ strncmp(json + tok->start, s, tok->end - tok->start) == 0) {
+ return 0;
+ }
+ return -1;
+}
+
+int main()
+{
+ int i;
+ FILE * f = fopen( "test.config", "r" );
+ fseek( f, 0, SEEK_END );
+ int len = ftell( f );
+ fseek( f, 0, SEEK_SET );
+ char * JSON_STRING = malloc( len );
+ fread( JSON_STRING, len, 1, f );
+ fclose( f );
+
+ jsmn_parser p;
+ jsmntok_t t[4096];
+ jsmn_init(&p);
+ int r = jsmn_parse(&p, JSON_STRING, len, t, sizeof(t)/sizeof(t[0]));
+ if (r < 0) {
+ printf("Failed to parse JSON: %d\n", r);
+ return 1;
+ }
+ if (r < 1 || t[0].type != JSMN_OBJECT) {
+ printf("Object expected\n");
+ return 1;
+ }
+
+ /* Loop over all keys of the root object */
+ for (i = 1; i < r; i++) {
+// if (jsoneq(JSON_STRING, &t[i], "acc_bias") == 0) {
+ /* We may use strndup() to fetch string value */
+// printf("ACC_BIAS: %.*s\n", t[i+1].end-t[i+1].start, JSON_STRING + t[i+1].start);
+// }
+ if (jsoneq(JSON_STRING, &t[i], "modelPoints") == 0) {
+ int k;
+ jsmntok_t * tk = &t[i+1];
+ printf( "%d / %d / %d / %d\n", tk->type, tk->start, tk->end, tk->size );
+ int pts = tk->size;
+ for( k = 0; k < pts; k++ )
+ {
+ tk = &t[i+2+k*4];
+ printf( "++%d / %d / %d / %d\n", tk->type, tk->start, tk->end, tk->size );
+
+ float vals[3];
+ int m;
+ for( m = 0; m < 3; m++ )
+ {
+ tk++;
+ if( tk->type != 4 )
+ {
+ fprintf( stderr, "Parse error.\n" );
+ break;
+ }
+ printf( "%d\n", tk->type );
+ }
+ }
+ /* We may additionally check if the value is either "true" or "false" */
+// printf("- CMap: %.*s\n", t[i+1].end-t[i+1].start,
+// JSON_STRING + t[i+1].start);
+ }
+ }
+ return EXIT_SUCCESS;
+
+
+}
diff --git a/redist/test.config b/redist/test.config
new file mode 100644
index 0000000..1c3108a
--- /dev/null
+++ b/redist/test.config
@@ -0,0 +1,633 @@
+{
+ "acc_bias": [
+ 0.1572,
+ -0.02771,
+ -0.1465
+ ],
+ "acc_scale": [
+ 0.9991,
+ 0.9995,
+ 0.9959
+ ],
+ "device": {
+ "eye_target_height_in_pixels": 1200,
+ "eye_target_width_in_pixels": 1080,
+ "first_eye": "eEYE_LEFT",
+ "last_eye": "eEYE_RIGHT",
+ "num_windows": 1,
+ "persistence": 0.011110999621450901,
+ "physical_aspect_x_over_y": 0.8999999761581421
+ },
+ "device_class": "hmd",
+ "device_pid": 8192,
+ "device_serial_number": "LHR-B4AB18B0",
+ "device_vid": 10462,
+ "display_edid": [
+ "",
+ ""
+ ],
+ "display_gc": {
+ "black_clamp": 0.0117647061124444
+ },
+ "display_mc": {
+ "left": "Green_46GA16AL014122_mura_analyzes.mc",
+ "offset": -0.49803921580314636,
+ "right": "Green_46HA16AL015390_mura_analyzes.mc",
+ "scale": 0.125,
+ "type": 1
+ },
+ "gyro_bias": [
+ -0.01786,
+ 0.01065,
+ -0.009912
+ ],
+ "gyro_scale": [
+ 1.0,
+ 1.0,
+ 1.0
+ ],
+ "htcComposeTime": "2016-08-08 10:51:02.008000",
+ "l_revision": 12164,
+ "lens_separation": 0.06219471991062164,
+ "lighthouse_config": {
+ "channelMap": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31
+ ],
+ "modelNormals": [
+ [
+ 0.6565292477607727,
+ 0.08003702759742737,
+ 0.7500423192977905
+ ],
+ [
+ 1,
+ 0,
+ 0
+ ],
+ [
+ 0.9510334134101868,
+ 0.1922958791255951,
+ -0.24198685586452484
+ ],
+ [
+ 0.8633409738540649,
+ 0.26114100217819214,
+ -0.43179601430892944
+ ],
+ [
+ 0.5620832443237305,
+ 0.8270804286003113,
+ -0.0007020003395155072
+ ],
+ [
+ 0.5567418932914734,
+ 0.8186168074607849,
+ -0.1410849690437317
+ ],
+ [
+ 0.12751400470733643,
+ 0.36096900701522827,
+ 0.9238190054893494
+ ],
+ [
+ 0.19732795655727386,
+ 0.7212077975273132,
+ 0.6640188097953796
+ ],
+ [
+ 0.19732792675495148,
+ -0.7205037474632263,
+ 0.6647827625274658
+ ],
+ [
+ 0.4602000117301941,
+ 0.003066000062972307,
+ 0.8878099918365479
+ ],
+ [
+ 0.025263000279664993,
+ -0.7483329772949219,
+ 0.6628419756889343
+ ],
+ [
+ 0.5567419528961182,
+ -0.8187658786773682,
+ -0.14021699130535126
+ ],
+ [
+ 0.5620829463005066,
+ -0.8270809054374695,
+ 0.00017499997920822352
+ ],
+ [
+ 0.8633410930633545,
+ -0.26159802079200745,
+ -0.4315190613269806
+ ],
+ [
+ 0.9510335326194763,
+ -0.19255191087722778,
+ -0.24178287386894226
+ ],
+ [
+ 0.6565289497375488,
+ -0.07924199104309082,
+ 0.7501268982887268
+ ],
+ [
+ -0.19732795655727386,
+ 0.7212077975273132,
+ 0.6640188097953796
+ ],
+ [
+ -0.12751400470733643,
+ 0.36096900701522827,
+ 0.9238190054893494
+ ],
+ [
+ -0.5567418932914734,
+ 0.8186168074607849,
+ -0.1410849690437317
+ ],
+ [
+ -0.5620832443237305,
+ 0.8270804286003113,
+ -0.0007020003395155072
+ ],
+ [
+ -0.8633409738540649,
+ 0.26114100217819214,
+ -0.43179601430892944
+ ],
+ [
+ -0.9510334134101868,
+ 0.1922958791255951,
+ -0.24198685586452484
+ ],
+ [
+ -1,
+ 0,
+ 0
+ ],
+ [
+ -0.6565292477607727,
+ 0.08003702759742737,
+ 0.7500423192977905
+ ],
+ [
+ -0.6565289497375488,
+ -0.07924199104309082,
+ 0.7501268982887268
+ ],
+ [
+ -0.9510335326194763,
+ -0.19255191087722778,
+ -0.24178287386894226
+ ],
+ [
+ -0.8633410930633545,
+ -0.26159802079200745,
+ -0.4315190613269806
+ ],
+ [
+ -0.5620829463005066,
+ -0.8270809054374695,
+ 0.00017499997920822352
+ ],
+ [
+ -0.5567419528961182,
+ -0.8187658786773682,
+ -0.14021699130535126
+ ],
+ [
+ -0.025263000279664993,
+ -0.7483329772949219,
+ 0.6628419756889343
+ ],
+ [
+ -0.4602000117301941,
+ 0.003066000062972307,
+ 0.8878099918365479
+ ],
+ [
+ -0.19732792675495148,
+ -0.7205037474632263,
+ 0.6647827625274658
+ ]
+ ],
+ "modelPoints": [
+ [
+ 0.08529596030712128,
+ 0.016987130045890808,
+ 0.04625450819730759
+ ],
+ [
+ 0.09297396242618561,
+ -3.816593380179256e-05,
+ 0.03481875732541084
+ ],
+ [
+ 0.0865984782576561,
+ 0.01662817783653736,
+ 0.02058056741952896
+ ],
+ [
+ 0.0896914079785347,
+ 0.029333578422665596,
+ 0.02945086732506752
+ ],
+ [
+ 0.08003243058919907,
+ 0.04517722502350807,
+ 0.03477787971496582
+ ],
+ [
+ 0.051041457802057266,
+ 0.05250432714819908,
+ 0.033407505601644516
+ ],
+ [
+ 0.024352610111236572,
+ 0.019936595112085342,
+ 0.05934930220246315
+ ],
+ [
+ 0.04747076332569122,
+ 0.03348296880722046,
+ 0.05359809845685959
+ ],
+ [
+ 0.047707222402095795,
+ -0.03385186195373535,
+ 0.053591083735227585
+ ],
+ [
+ 0.057869475334882736,
+ -4.537412223726278e-06,
+ 0.056632302701473236
+ ],
+ [
+ 0.027427678927779198,
+ -0.05159146338701248,
+ 0.046743810176849365
+ ],
+ [
+ 0.05123027041554451,
+ -0.0528465174138546,
+ 0.03318343684077263
+ ],
+ [
+ 0.08045556396245956,
+ -0.04523739218711853,
+ 0.0347951278090477
+ ],
+ [
+ 0.0898326113820076,
+ -0.02926996909081936,
+ 0.029674140736460686
+ ],
+ [
+ 0.08679713308811188,
+ -0.016559496521949768,
+ 0.020654011517763138
+ ],
+ [
+ 0.08523146063089371,
+ -0.01709103211760521,
+ 0.046357400715351105
+ ],
+ [
+ -0.04777093604207039,
+ 0.03356654942035675,
+ 0.05359058827161789
+ ],
+ [
+ -0.02444354072213173,
+ 0.020076606422662735,
+ 0.05938776582479477
+ ],
+ [
+ -0.05102699249982834,
+ 0.0527305006980896,
+ 0.03319358080625534
+ ],
+ [
+ -0.08019497245550156,
+ 0.045236989855766296,
+ 0.03484406694769859
+ ],
+ [
+ -0.08976184576749802,
+ 0.02929999679327011,
+ 0.02958585135638714
+ ],
+ [
+ -0.08683834969997406,
+ 0.016578538343310356,
+ 0.020787812769412994
+ ],
+ [
+ -0.09312481433153152,
+ 0.0001750048977555707,
+ 0.03493703529238701
+ ],
+ [
+ -0.08524972200393677,
+ 0.017301730811595917,
+ 0.04634993150830269
+ ],
+ [
+ -0.08523391932249069,
+ -0.017099885269999504,
+ 0.04617205262184143
+ ],
+ [
+ -0.08670197427272797,
+ -0.016478901728987694,
+ 0.020614536479115486
+ ],
+ [
+ -0.08971264213323593,
+ -0.029298966750502586,
+ 0.029743636026978493
+ ],
+ [
+ -0.0803159773349762,
+ -0.04519243538379669,
+ 0.03466309234499931
+ ],
+ [
+ -0.050936102867126465,
+ -0.05280544236302376,
+ 0.033123407512903214
+ ],
+ [
+ -0.02723855897784233,
+ -0.051664549857378006,
+ 0.046714965254068375
+ ],
+ [
+ -0.05789601430296898,
+ -4.577871732180938e-05,
+ 0.0564543791115284
+ ],
+ [
+ -0.04756224900484085,
+ -0.03390718251466751,
+ 0.053489863872528076
+ ]
+ ]
+ },
+ "manufacturer": "HTC",
+ "mb_serial_number": "42JB167X03076",
+ "model_number": "Vive MV",
+ "render_model": "",
+ "revision": 1,
+ "tracking_to_eye_transform": [
+ {
+ "distortion": {
+ "center_x": 0.09128676972995323,
+ "center_y": -0.003985467152131782,
+ "coeffs": [
+ -0.2218608508704322,
+ -0.0314973006170816,
+ -0.03811043372221242,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "type": "DISTORT_DPOLY3"
+ },
+ "distortion_blue": {
+ "center_x": 0.09128676972995323,
+ "center_y": -0.003985467152131782,
+ "coeffs": [
+ -0.2596104389948281,
+ 0.0245967965162329,
+ -0.06998774577973522,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "type": "DISTORT_DPOLY3"
+ },
+ "distortion_red": {
+ "center_x": 0.09128676972995323,
+ "center_y": -0.003985467152131782,
+ "coeffs": [
+ -0.1857388028229403,
+ -0.08608016110632045,
+ -0.009303358857686194,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "type": "DISTORT_DPOLY3"
+ },
+ "extrinsics": [
+ [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.03109734132885933
+ ],
+ [
+ 0.0,
+ 1.0,
+ 0.0,
+ -2.235174179077148e-08
+ ],
+ [
+ 0.0,
+ 0.0,
+ 1.0,
+ -7.450580596923828e-09
+ ]
+ ],
+ "grow_for_undistort": 0.6000000238418579,
+ "intrinsics": [
+ [
+ 1.211890697479248,
+ 0.0,
+ -0.09128677099943161
+ ],
+ [
+ 0.0,
+ 1.09042501449585,
+ -0.003586920443922281
+ ],
+ [
+ 0.0,
+ 0.0,
+ -1.0
+ ]
+ ],
+ "undistort_r2_cutoff": 1.140712738037109
+ },
+ {
+ "distortion": {
+ "center_x": -0.09042773927717189,
+ "center_y": -0.003588825103610428,
+ "coeffs": [
+ -0.2167052617934642,
+ -0.03437283577629435,
+ -0.03870793318124786,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "type": "DISTORT_DPOLY3"
+ },
+ "distortion_blue": {
+ "center_x": -0.09042773927717189,
+ "center_y": -0.003588825103610428,
+ "coeffs": [
+ -0.2627621480864886,
+ 0.04275673251679024,
+ -0.08325460213609286,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "type": "DISTORT_DPOLY3"
+ },
+ "distortion_red": {
+ "center_x": -0.09042773927717189,
+ "center_y": -0.003588825103610428,
+ "coeffs": [
+ -0.1837002073444821,
+ -0.08437626940236018,
+ -0.01178900538780535,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "type": "DISTORT_DPOLY3"
+ },
+ "extrinsics": [
+ [
+ 1.0,
+ 0.0,
+ 0.0,
+ -0.03109737858176231
+ ],
+ [
+ 0.0,
+ 1.0,
+ 0.0,
+ -2.235174179077148e-08
+ ],
+ [
+ 0.0,
+ 0.0,
+ 1.0,
+ -7.450580596923828e-09
+ ]
+ ],
+ "grow_for_undistort": 0.6000000238418579,
+ "intrinsics": [
+ [
+ 1.208148002624512,
+ 0.0,
+ 0.09042774140834808
+ ],
+ [
+ 0.0,
+ 1.087613344192505,
+ -0.003229942638427019
+ ],
+ [
+ 0.0,
+ 0.0,
+ -1.0
+ ]
+ ],
+ "undistort_r2_cutoff": 1.125258326530457
+ }
+ ],
+ "trackref_from_head": [
+ 0,
+ -1,
+ 0,
+ 0,
+ 0,
+ 0,
+ -0.021630236878991127
+ ],
+ "trackref_from_imu": [
+ 0,
+ 0,
+ -1,
+ 0,
+ -0.008495164103806019,
+ -0.004968234803527594,
+ 0.04987109825015068
+ ],
+ "tracked_camera":
+{
+"version":"1.0.6.0.4",
+"pitch":0.021727,
+"yaw":0.003637,
+"roll":-0.002253,
+"intrinsics":
+{
+"width" :612,
+"height" :460,
+"center_x" :309.600128,
+"center_y" :242.239990,
+"focal_x" :283.000214,
+"focal_y" :283.000214,
+"distort":
+{
+"center_x" :0.000000,
+"center_y" :0.000000,
+"coeffs" :[0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000],
+"type" :"DISTORT_FTHETA"
+}
+}
+},
+"type": "Lighthouse_HMD"
+}